From 88e7923ed2ecd747b65f72c5955016c6a1b80b9f Mon Sep 17 00:00:00 2001 From: Cody Gunton Date: Thu, 25 Jan 2024 19:01:16 -0500 Subject: [PATCH] feat: Produce graph of internal Barretenberg dependencies (#4225) 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. --- barretenberg/cpp/.gitignore | 2 ++ .../scripts/barretenberg_module_digraph.sh | 24 +++++++++++++ .../barretenberg_module_digraph_edges.awk | 35 +++++++++++++++++++ 3 files changed, 61 insertions(+) create mode 100755 barretenberg/cpp/scripts/barretenberg_module_digraph.sh create mode 100644 barretenberg/cpp/scripts/barretenberg_module_digraph_edges.awk diff --git a/barretenberg/cpp/.gitignore b/barretenberg/cpp/.gitignore index 73dd72cd074..860dfe85cf9 100644 --- a/barretenberg/cpp/.gitignore +++ b/barretenberg/cpp/.gitignore @@ -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 \ No newline at end of file diff --git a/barretenberg/cpp/scripts/barretenberg_module_digraph.sh b/barretenberg/cpp/scripts/barretenberg_module_digraph.sh new file mode 100755 index 00000000000..f02b6a01aac --- /dev/null +++ b/barretenberg/cpp/scripts/barretenberg_module_digraph.sh @@ -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 \ No newline at end of file diff --git a/barretenberg/cpp/scripts/barretenberg_module_digraph_edges.awk b/barretenberg/cpp/scripts/barretenberg_module_digraph_edges.awk new file mode 100644 index 00000000000..c5d4c4c2e35 --- /dev/null +++ b/barretenberg/cpp/scripts/barretenberg_module_digraph_edges.awk @@ -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); + } +}