From 5f9074a6c7013e847fcec0fdc609f0e1ef040315 Mon Sep 17 00:00:00 2001 From: codygunton Date: Thu, 25 Jan 2024 22:37:53 +0000 Subject: [PATCH 1/4] First working draft --- barretenberg/cpp/.gitignore | 2 ++ .../scripts/barretenberg_module_digraph.sh | 24 +++++++++++++++ .../barretenberg_module_digraph_edges.awk | 30 +++++++++++++++++++ 3 files changed, 56 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..c0b90ba09ad --- /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 satisfied 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..5756abeb5ab --- /dev/null +++ b/barretenberg/cpp/scripts/barretenberg_module_digraph_edges.awk @@ -0,0 +1,30 @@ +# 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, " "); + + # Print each element in the array + for (i = 2; i <= length(modules); i++) { + print modules[1]" -> "modules[i]; + } +} + +# Main AWK script +{ + # Concatenate lines if the opening parentheses 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); + } +} From cec4ea3aac9f7150ed64d7f2c62399f943af2492 Mon Sep 17 00:00:00 2001 From: codygunton Date: Thu, 25 Jan 2024 23:13:46 +0000 Subject: [PATCH 2/4] Handle isolated node case --- .../cpp/scripts/barretenberg_module_digraph_edges.awk | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/barretenberg/cpp/scripts/barretenberg_module_digraph_edges.awk b/barretenberg/cpp/scripts/barretenberg_module_digraph_edges.awk index 5756abeb5ab..ad9151cc41d 100644 --- a/barretenberg/cpp/scripts/barretenberg_module_digraph_edges.awk +++ b/barretenberg/cpp/scripts/barretenberg_module_digraph_edges.awk @@ -7,9 +7,14 @@ function extract_edges(line) { gsub(/[ ]+/, " ", line); # Sub multiple spaces for a single space split(line, modules, " "); - # Print each element in the array - for (i = 2; i <= length(modules); i++) { - print modules[1]" -> "modules[i]; + # 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]; + } } } From 4e0135f316f47ed98f939c3fe5559f170d34e7e4 Mon Sep 17 00:00:00 2001 From: codygunton Date: Thu, 25 Jan 2024 23:27:45 +0000 Subject: [PATCH 3/4] Typos --- barretenberg/cpp/scripts/barretenberg_module_digraph.sh | 2 +- .../cpp/scripts/barretenberg_module_digraph_edges.awk | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/barretenberg/cpp/scripts/barretenberg_module_digraph.sh b/barretenberg/cpp/scripts/barretenberg_module_digraph.sh index c0b90ba09ad..8d91028a0c3 100755 --- a/barretenberg/cpp/scripts/barretenberg_module_digraph.sh +++ b/barretenberg/cpp/scripts/barretenberg_module_digraph.sh @@ -16,7 +16,7 @@ for file in $(find ./src/barretenberg/ -iname CMakeLists.txt); do done; echo } >> $TMP; -# apply transitive reduction to remove dependcies that are implied by satisfied by other dependencies +# apply transitive reduction to remove dependcies that are implied by other dependencies cat $TMP | tred > $RESULT_DOT; rm $TMP; diff --git a/barretenberg/cpp/scripts/barretenberg_module_digraph_edges.awk b/barretenberg/cpp/scripts/barretenberg_module_digraph_edges.awk index ad9151cc41d..c5d4c4c2e35 100644 --- a/barretenberg/cpp/scripts/barretenberg_module_digraph_edges.awk +++ b/barretenberg/cpp/scripts/barretenberg_module_digraph_edges.awk @@ -5,7 +5,7 @@ function extract_edges(line) { 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(line, modules, " "); # Split into an array of words # If node has no dependencies, just add the node if (length(modules)==1) { @@ -20,7 +20,7 @@ function extract_edges(line) { # Main AWK script { - # Concatenate lines if the opening parentheses is not closed + # Concatenate lines if the opening parenthesis is not closed while (!/\)/) { current_line = $0; getline; From 65d79740fc91d0d3cfcf8432b70d8edc37ad6983 Mon Sep 17 00:00:00 2001 From: codygunton Date: Thu, 25 Jan 2024 23:33:09 +0000 Subject: [PATCH 4/4] Desemicolonize --- .../scripts/barretenberg_module_digraph.sh | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/barretenberg/cpp/scripts/barretenberg_module_digraph.sh b/barretenberg/cpp/scripts/barretenberg_module_digraph.sh index 8d91028a0c3..f02b6a01aac 100755 --- a/barretenberg/cpp/scripts/barretenberg_module_digraph.sh +++ b/barretenberg/cpp/scripts/barretenberg_module_digraph.sh @@ -1,24 +1,24 @@ #!/usr/bin/env bash set -eu -TMP=tmp.dot; -RESULT_DOT=barretenberg_modules.dot; -RESULT_PNG=barretenberg_modules.png; +TMP=tmp.dot +RESULT_DOT=barretenberg_modules.dot +RESULT_PNG=barretenberg_modules.png # initialize a directed graph for graphviz -echo digraph BarretenbergModules { > $TMP; +echo digraph BarretenbergModules { > $TMP # populate the directed graph for file in $(find ./src/barretenberg/ -iname CMakeLists.txt); do - opening_chars=$(head -c 19 "$file"); + 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; + fi +done +echo } >> $TMP # apply transitive reduction to remove dependcies that are implied by other dependencies -cat $TMP | tred > $RESULT_DOT; -rm $TMP; +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