From 4c60dd73eca635a1f6cc7eabf2d43a9f4de63921 Mon Sep 17 00:00:00 2001 From: MTlls <matheustellestab8@gmail.com> Date: Wed, 21 May 2025 11:23:48 -0300 Subject: [PATCH] add: gera grafos, entradas e testa --- src/formata_input.gvpr | 15 +++++ src/formatador.sh | 34 +++++++++++ src/testa_isomorfismo.sh | 52 +++++++++++++++++ src/tira_style.gvpr | 121 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 222 insertions(+) create mode 100644 src/formata_input.gvpr create mode 100755 src/formatador.sh create mode 100755 src/testa_isomorfismo.sh create mode 100755 src/tira_style.gvpr diff --git a/src/formata_input.gvpr b/src/formata_input.gvpr new file mode 100644 index 0000000..fa90f71 --- /dev/null +++ b/src/formata_input.gvpr @@ -0,0 +1,15 @@ +BEGIN { + int count = 0; + node_t n; +} + +BEG_G { + print(nNodes($G)); +} + +E { + // Para cada aresta, imprime origem e destino + int origem = atoi($.tail.label)-1; + int destino = atoi($.head.label)-1; + printf("%s %s\n", origem, destino); +} diff --git a/src/formatador.sh b/src/formatador.sh new file mode 100755 index 0000000..c8b748a --- /dev/null +++ b/src/formatador.sh @@ -0,0 +1,34 @@ +#!/bin/bash + +# Verifica se um argumento foi fornecido +if [ -z "$1" ]; then + echo "Uso: $0 <nome_arquivo>" + exit 1 +fi + +# Define variáveis com base no nome do arquivo +BASENAME="$(basename "$1")" +DIRNAME="$(dirname "$1")" +INPUT="$1" +OUTPUT="$DIRNAME/limpo_$BASENAME" +OUTPUT_IN="$DIRNAME/$BASENAME.in" +OUTPUT_IMG="$DIRNAME/limpo_$BASENAME.png" + +echo "Output: $OUTPUT" +echo "Output in:$OUTPUT_IN" +echo "Output img: $OUTPUT_IMG" +echo "input: $INPUT" + +# # Executa o gvpr com o script de formatação +# gvpr -f tira_style.gvpr "$INPUT" -o "$OUTPUT" + +# # Remove o prefixo dos blocos básicos +# perl -pe 's/fn_0_basic_block_(\d+)/$1-1/ge' "$OUTPUT" > tmp && mv tmp "$OUTPUT" + +# # gera uma entrada valida para isomorfismo.cpp +# gvpr -f formata_input.gvpr "$OUTPUT" > "$OUTPUT_IN" + +# # Gera a imagem PNG do grafo +# dot -Tpng "$OUTPUT" -o "$OUTPUT_IMG" + +# echo "Processamento concluído: $OUTPUT e $OUTPUT_IMG gerados." diff --git a/src/testa_isomorfismo.sh b/src/testa_isomorfismo.sh new file mode 100755 index 0000000..64929f7 --- /dev/null +++ b/src/testa_isomorfismo.sh @@ -0,0 +1,52 @@ +#!/bin/bash + +# Verifica se os dois arquivos de código foram fornecidos +if [ "$#" -ne 2 ]; then + echo "Uso: $0 <código1.c> <código2.c>" + exit 1 +fi + +# Diretório temporário +TEMPDIR="./temp" +mkdir -p "$TEMPDIR" + +# Recebe os arquivos de código como argumentos +CODE1="$1" +CODE2="$2" + + +BASENAME1="$(basename "$CODE1")" +BASENAME2="$(basename "$CODE2")" + + +# Gera os arquivos .dot usando gcc no diretório temporário +gcc -fdump-tree-cfg-graph "$CODE1" -o /dev/null +gcc -fdump-tree-cfg-graph "$CODE2" -o /dev/null + +DOT1="a-${BASENAME1}.015t.cfg.dot" +DOT2="a-${BASENAME2}.015t.cfg.dot" + +# Remove arquivos .cfg intermediários +rm "a-${BASENAME1}.015t.cfg" +rm "a-${BASENAME2}.015t.cfg" + +# Move os .dot para nomes mais simples +mv "$DOT1" "$TEMPDIR/${BASENAME1}.dot" +mv "$DOT2" "$TEMPDIR/${BASENAME2}.dot" + +DOT1="$TEMPDIR/${BASENAME1}.dot" +DOT2="$TEMPDIR/${BASENAME2}.dot" + +gvpr -c -f src/tira_style.gvpr $DOT1 > $DOT1.tmp && mv $DOT1.tmp $DOT1 +gvpr -c -f src/tira_style.gvpr $DOT2 > $DOT2.tmp && mv $DOT2.tmp $DOT2 + +dot -Tpng $DOT1 > $DOT1.png +dot -Tpng $DOT2 > $DOT2.png + +gvpr -f src/formata_input.gvpr $DOT1 > input_isomorfismo/$BASENAME1 +gvpr -f src/formata_input.gvpr $DOT2 > input_isomorfismo/$BASENAME2 + +src/isomorfismo < input_isomorfismo/$BASENAME1 > $DOT1.out +src/isomorfismo < input_isomorfismo/$BASENAME2 > $DOT2.out + +diff -s $DOT1.out $DOT2.out \ No newline at end of file diff --git a/src/tira_style.gvpr b/src/tira_style.gvpr new file mode 100755 index 0000000..e0f6481 --- /dev/null +++ b/src/tira_style.gvpr @@ -0,0 +1,121 @@ +BEGIN { + void print_attr_node(graph_t g, node_t n) { + string first = fstAttr(g, "N"); + int i = 0; + while(strcmp(first, "") != 0) { + // printf("%s: %s\n", first, aget(n, first)); + first = nxtAttr(g, "N", first); + } + } + void print_attr_graph(graph_t g) { + string first = fstAttr(g, "G"); + int i = 0; + while(strcmp(first, "") != 0) { + // printf("%s: %s\n", first, aget(g, first)); + first = nxtAttr(g, "G", first); + } + } + void delete_style_node(graph_t g, node_t n) { + string first = fstAttr(g, "N"); + int i = 0; + while(strcmp(first, "") != 0) { + if(isAttr(g, "N", first)) { + aset(n, first, ""); + // printf("Setado %s para %s\n", first, aget(n, first)); + } else { + // printf("Não ta achando atributo\n"); + } + + first = nxtAttr(g, "N", first); + } + } + + void print_attr_edge(graph_t g, edge_t e) { + string first = fstAttr(g, "E"); + int i = 0; + while(strcmp(first, "") != 0) { + // printf("%s: %s\n", first, aget(e, first)); + first = nxtAttr(g, "E", first); + } + } + graph_t delete_style_graph(graph_t g) { + string first = fstAttr(g, "G"); + int i = 0; + while(strcmp(first, "") != 0) { + if(isAttr(g, "G", first)) { + aset(g, first, ""); + // printf("Setado %s para %s\n", first, aget(g, first)); + } else { + // printf("Não ta achando atributo\n"); + } + + first = nxtAttr(g, "G", first); + } + return g; + } +} + +BEG_G { + graph_t g = cloneG($G, ""); + int it = 0; + int i = 0; + delete_style_graph(fstsubg($G)); +} + +N { + if(hasAttr($, "label") && (strcmp(aget($, "label"), "ENTRY") == 0 || strcmp(aget($, "label"), "EXIT") == 0)){ + // printf("deletando começo ou final: %s\n", aget($, "label")); + delete($G, $); + return; + } + + // printf("Nodo: %d\n", it++); + string firstN = fstAttr($G, "N"); + + while(strcmp(firstN, "") != 0) { + if(isAttr($G, "N", firstN)) { + aset($, firstN, ""); + // printf("Setado %s para %s\n", firstN, aget($, firstN)); + } else { + // printf("Não achou atributo\n"); + } + + firstN = nxtAttr($G, "N", firstN); + } + + string id = $.name; + string clean = gsub(id, "fn_0_basic_block_", ""); + aset($, "label", clean); + + // print_attr_node($G, $); +} + +E { + + // printf("Aresta: %d\n", it++); + if(hasAttr($, "style")){ + if(strcmp(aget($, "style"), "invis") == 0 ){ + // printf("deletando começo ou final: %s\n", aget($, "style")); + delete($T, $); + } + } + print_attr_edge($G, $); + // printf("label: %s\n", label); + // printf("ultimo caraactere: %c\n", (label + size)); + print_attr_edge($G, $); + string firstE = fstAttr($G, "E"); + i = 0; + while(strcmp(firstE, "") != 0) { + if(isAttr($G, "E", firstE)) { + aset($, firstE, ""); + // printf("Setado %s para %s\n", firstE, aget($, firstE)); + } else { + // printf("Não ta achando atributo\n"); + } + + firstE = nxtAttr($G, "E", firstE); + } +} +END_G { + $O = $G; +} -- GitLab