| | import os |
| | import gradio as gr |
| | from huggingface_hub import hf_hub_download |
| | import importlib.util |
| | import base64 |
| |
|
| | |
| | PRIVATE_DATASET_ID = os.getenv("PRIVATE_DATASET_ID") |
| | HF_TOKEN = os.getenv("HF_TOKEN") |
| | INDEX_SUBDIR = os.getenv("INDEX_SUBDIR", ".") |
| |
|
| | |
| | try: |
| | AGENT_CODE_PATH = hf_hub_download( |
| | repo_id=PRIVATE_DATASET_ID, |
| | filename="deepv_core.py", |
| | repo_type="dataset", |
| | token=HF_TOKEN |
| | ) |
| | spec = importlib.util.spec_from_file_location("deepv_core_module", AGENT_CODE_PATH) |
| | agent_module = importlib.util.module_from_spec(spec) |
| | spec.loader.exec_module(agent_module) |
| | run_generation = agent_module.run_generation |
| | |
| | except Exception as e: |
| | def show_error(*args): |
| | return f"// ERROR: Failed to load core agent code. Details: {e}", "", "" |
| |
|
| | |
| | def get_logo_base64(): |
| | try: |
| | with open("DeepV_logo.png", "rb") as image_file: |
| | return base64.b64encode(image_file.read()).decode("utf-8") |
| | except FileNotFoundError: |
| | print("Logo file not found. Ensure DeepV_logo.png is in the correct directory.") |
| | return "" |
| |
|
| | logo_base64 = get_logo_base64() |
| |
|
| | |
| | with gr.Blocks(title="DeepV for RTL (Model-Agnostic)", theme=gr.themes.Soft()) as demo: |
| | |
| | if logo_base64: |
| | gr.HTML(f""" |
| | <div id="deepv-logo-container"> |
| | <img id="deepv-logo" src="data:image/png;base64,{logo_base64}" alt="DeepV Logo"> |
| | </div> |
| | """) |
| | else: |
| | gr.Markdown("Logo not found.") |
| |
|
| | with gr.Row(): |
| | with gr.Column(scale=2): |
| | with gr.Row(): |
| | model_choice = gr.Dropdown( |
| | choices=["gpt-4o", "gpt-4.1", "gpt-5-chat-latest"], |
| | value="gpt-4o", |
| | label="Model" |
| | ) |
| | api_key = gr.Textbox(label="OpenAI API Key", type="password", placeholder="sk-...") |
| |
|
| | gr.Markdown( |
| | """ |
| | **Note:** Your API key is used for the current session only and is not saved or stored. |
| | """ |
| | ) |
| |
|
| | spec = gr.Textbox( |
| | label="Design Specification (natural language or I/O contract)", |
| | placeholder="e.g., 8-bit UART transmitter with baud rate generator ...", |
| | lines=10, |
| | elem_id="spec-input" |
| | ) |
| | with gr.Row(): |
| | use_rag = gr.Checkbox(value=True, label="Use RAG") |
| | top_k = gr.Slider(1, 5, value=3, step=1, label="Top-K retrieved examples") |
| |
|
| | |
| | with gr.Row(): |
| | temperature_tb = gr.Textbox(label="Temperature", value="0.2", scale=1) |
| | top_p_tb = gr.Textbox(label="Top-p", value="0.9", scale=1) |
| | max_new_tokens_tb = gr.Textbox(label="Max tokens", value="768", scale=1) |
| |
|
| | |
| | with gr.Row(): |
| | run_btn = gr.Button("Generate Verilog", variant="primary", elem_id="generate-button") |
| | loading_state = gr.Markdown( |
| | value="Generating...", |
| | visible=False, |
| | elem_id="loading-state" |
| | ) |
| | |
| | with gr.Column(scale=3): |
| | out_code = gr.Textbox( |
| | label="Generated Verilog", |
| | lines=28, |
| | interactive=False, |
| | placeholder="// Your Verilog code will appear here", |
| | elem_id="verilog-output" |
| | ) |
| |
|
| | copy_button = gr.Button("๐", variant="secondary", elem_id="copy-button") |
| | |
| | with gr.Row(): |
| | clear_btn = gr.ClearButton( |
| | value="Clear All", |
| | components=[spec, out_code] |
| | ) |
| |
|
| | |
| | def generate_only( |
| | spec, use_rag, top_k, model_choice, api_key, temperature, top_p, max_new_tokens |
| | ): |
| | verilog_code, _, _ = run_generation( |
| | spec, use_rag, top_k, model_choice, api_key, temperature, top_p, max_new_tokens |
| | ) |
| | return verilog_code |
| | |
| | def copy_to_clipboard_fn(text): |
| | return text |
| |
|
| | def show_loading_no_anim(): |
| | return [gr.update(visible=False), gr.update(visible=True)] |
| |
|
| | def hide_loading_no_anim(): |
| | return [gr.update(visible=True), gr.update(visible=False)] |
| |
|
| | run_btn.click( |
| | fn=show_loading_no_anim, |
| | inputs=[], |
| | outputs=[run_btn, loading_state], |
| | show_progress=False, |
| | ).then( |
| | fn=generate_only, |
| | inputs=[spec, use_rag, top_k, model_choice, api_key, temperature_tb, top_p_tb, max_new_tokens_tb], |
| | outputs=[out_code], |
| | ).then( |
| | fn=hide_loading_no_anim, |
| | inputs=[], |
| | outputs=[run_btn, loading_state], |
| | ) |
| |
|
| | clear_btn.click(fn=lambda: "Ready", outputs=[]) |
| | spec.submit(fn=lambda: "Ready", outputs=[]) |
| |
|
| | copy_button.click( |
| | fn=copy_to_clipboard_fn, |
| | inputs=[out_code], |
| | outputs=[], |
| | js=""" |
| | (text) => { |
| | const el = document.createElement('textarea'); |
| | el.value = text; |
| | document.body.appendChild(el); |
| | el.select(); |
| | document.execCommand('copy'); |
| | document.body.removeChild(el); |
| | } |
| | """ |
| | ) |
| |
|
| | demo.css = """ |
| | @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@600&display=swap'); |
| | |
| | /* New CSS to make the layout more compact */ |
| | .gradio-container { |
| | margin-top: 0 !important; |
| | } |
| | |
| | #deepv-logo-container { |
| | display: flex; |
| | justify-content: center; |
| | align-items: center; |
| | padding: 0; |
| | margin-bottom: 0px; |
| | margin-top: -35px; /* Pull the logo up */ |
| | } |
| | |
| | #deepv-logo { |
| | width: 450px; |
| | height: 125px; |
| | object-fit: contain; |
| | } |
| | |
| | #verilog-output { |
| | position: relative; |
| | } |
| | |
| | #copy-button { |
| | position: absolute; |
| | top: 50px; |
| | right: 20px; |
| | z-index: 1000; |
| | background-color: #F0F0F0; |
| | color: #333; |
| | border-radius: 5px; |
| | border: none; |
| | box-shadow: 0 2px 4px rgba(0,0,0,0.1); |
| | width: 30px; |
| | height: 30px; |
| | padding: 0; |
| | } |
| | |
| | #loading-state { |
| | padding: 14px; |
| | text-align: center; |
| | font-size: 1.2em; |
| | font-weight: 800; |
| | color: #1E3A8A; |
| | background-color: #e6f2ff; |
| | border-radius: 8px; |
| | box-shadow: 0 2px 4px rgba(0,0,0,0.1); |
| | animation: pulse 1s infinite; |
| | } |
| | |
| | @keyframes pulse { |
| | 0% { background-color: #e6f2ff; } |
| | 50% { background-color: #d2e4f7; } |
| | 100% { background-color: #e6f2ff; } |
| | } |
| | """ |
| |
|
| |
|
| | if __name__ == "__main__": |
| | if 'agent_module' in locals(): |
| | demo.launch() |
| | else: |
| | with gr.Blocks() as error_demo: |
| | gr.Markdown("# Initialization Error") |
| | gr.Markdown(f"An error occurred while loading the application code. Please check your configuration.") |
| | gr.Textbox(label="Error Details", value=str(e), lines=5) |
| | error_demo.launch() |