import gradio as gr import pandas as pd import circuit_transformer as ct circuit_transformer = ct.CircuitTransformer() aiger_str = """aag 33 8 0 2 25 2\n4\n6\n8\n10\n12\n14\n16\n58\n67 18 13 16\n20 19 7\n22 21 15\n24 3 9\n26 25 11 28 27 17\n30 3 6\n32 29 31\n34 29 32\n36 23 35 38 7 36\n40 10 29\n42 41 32\n44 13 15\n46 42 45 48 47 21\n50 39 49\n52 4 45\n54 25 53\n56 54 5 58 51 57\n60 45 12\n62 18 61\n64 63 19\n66 48 64 """ def predict(input_text, mcts_playouts): if input_text[-1] != '\n': input_text += '\n' try: aig, info = ct.read_aiger(aiger_str=input_text) except Exception as e: raise gr.Error("Aiger format error!") num_inputs, num_outputs = info[1], info[3] if not isinstance(aig, list): aig = [aig] if num_inputs > 8: raise gr.Error("Number of inputs should <= 8") if num_outputs > 2: raise gr.Error("Number of outputs should <= 2") mcts_playouts = int(mcts_playouts) optimized_aigs = circuit_transformer.optimize( aigs=[aig], num_mcts_steps=1 if mcts_playouts > 0 else 0, num_mcts_playouts_per_step=mcts_playouts ) optimized_aig = optimized_aigs[0] input_tt = ct.compute_input_tt(num_inputs) aig_tts = ct.compute_tts(aig, input_tt=input_tt) aig_tts_str = "\n".join([tt.to01() for tt in aig_tts]) optimized_aig_tts = ct.compute_tts(optimized_aig, input_tt=input_tt) optimized_aig_tts_str = "\n".join([tt.to01() for tt in optimized_aig_tts]) num_ands = pd.DataFrame(data={ "circuit": ["Original", "Optimized"], "size": [ct.count_num_ands(aig), ct.count_num_ands(optimized_aig)] }) ct.plot_network(aig, view=False, filename="aig.png") ct.plot_network(optimized_aig, view=False, filename="optimized_aig.png") return ct.write_aiger(optimized_aig), num_ands, "aig.png", "optimized_aig.png", aig_tts_str, optimized_aig_tts_str, str(ct.cec(aig, optimized_aig)) gradio_app = gr.Interface( predict, inputs=[gr.Code(value=aiger_str, label="Input logic circuit (in Aiger format, #(inputs) <= 8, #(outputs) <= 2)"), gr.Slider(minimum=0, maximum=8, value=0, step=1, label="Monte-Carlo tree search steps")], outputs=[gr.Code(label="Output logic circuit (size-optimized, in Aiger format)"), gr.BarPlot(label="Circuit size comparison", x="circuit", y="size", sort="-x"), gr.Image(label="Original logic circuit (And-Inverter Graph)"), gr.Image(label="Optimized logic circuit (And-Inverter Graph)"), gr.Text(label="Truth table of the original circuit"), gr.Text(label="Truth table of the optimized circuit"), gr.Text(label="Equivalence"),], title="Circuit Transformer for Size Minimization of Logic Circuits", description="""This is a demo to show how a [Circuit Transformer](https://openreview.net/forum?id=kpnW12Lm9p) minimize the size of a logic circuit by next token prediction, while strictly preserving logical equivalence. [[GitHub Repo]](https://github.com/snowkylin/circuit-transformer)""" ) if __name__ == "__main__": gradio_app.launch()