import os import streamlit as st from groq import Groq from transformers import AutoTokenizer import faiss import numpy as np # Set the Hugging Face API Key GrOQ_API_KEY = "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" client = Groq(api_key=GrOQ_API_KEY) # Supported Microcontrollers/Processors devices = { "Arduino": { "template": """ // Arduino Syntax Template (for Arduino Uno) void setup() { // Setup code here, to run once: pinMode(13, OUTPUT); } void loop() { // Main code here, to run repeatedly: digitalWrite(13, HIGH); // Turn on LED delay(1000); // Wait for a second digitalWrite(13, LOW); // Turn off LED delay(1000); // Wait for a second } """, }, "PIC18": { "template": """ // PIC18 Syntax Template // C Language: #include void main() { TRISB = 0; // Set PORTB as output while(1) { LATB = 0xFF; // Turn on all LEDs on PORTB __delay_ms(500); // Delay for 500ms LATB = 0x00; // Turn off all LEDs __delay_ms(500); // Delay for 500ms } } // Assembly Language: ; PIC18 Assembly Language Template ORG 0x00 START: BCF STATUS, RP0 ; Select Bank 0 MOVLW 0xFF ; Load 0xFF into WREG (all LEDs on) MOVWF PORTB ; Move WREG value to PORTB CALL Delay ; Call delay subroutine CLRF PORTB ; Clear PORTB (turn off LEDs) CALL Delay ; Call delay subroutine GOTO START ; Repeat Delay: MOVLW 0xFF ; Load WREG with delay value MOVWF 0x30 ; Store in memory location DELAY_LOOP: DECFSZ 0x30, F ; Decrement and check if zero GOTO DELAY_LOOP ; Repeat until zero RETURN """, }, "8085": { "template": """ ; 8085 Assembly Language Template START: MVI A, 00H ; Load Accumulator with 0 OUT PORT1 ; Output data to port HLT ; Halt program """, }, } # Function to Generate Code using Groq API def generate_code(prompt, model="llama-3.3-70b-versatile"): chat_completion = client.chat.completions.create( messages=[{"role": "user", "content": prompt}], model=model, ) return chat_completion.choices[0].message.content # Function to Chunk and Tokenize Code def tokenize_and_chunk_code(code, model_name="gpt2", max_length=512): tokenizer = AutoTokenizer.from_pretrained(model_name) tokens = tokenizer(code, truncation=True, return_tensors="pt") chunks = [ tokens.input_ids[0][i: i + max_length] for i in range(0, len(tokens.input_ids[0]), max_length) ] return chunks # Function to Store Code in FAISS def store_code_in_faiss(chunks): dimension = 512 embeddings = [np.random.rand(dimension) for _ in chunks] # Replace with actual embeddings faiss_index = faiss.IndexFlatL2(dimension) faiss_index.add(np.array(embeddings, dtype=np.float32)) return faiss_index # Streamlit App def main(): # Custom styling for the app using markdown st.markdown(""" """, unsafe_allow_html=True) st.title("Microcontroller Code Generator", anchor="title") # Step 1: Display Custom Image # Use the image URL from Imgur image_url = "https://imgur.com/CBm5exE.png" st.image(image_url, caption="Custom Image", use_container_width=True) st.write("Select a microcontroller and provide your code requirements to generate code.") # Sidebar with different selection options for users with st.sidebar: st.header("Microcontroller Selection") device = st.selectbox("Select a microcontroller/processor", options=["Arduino", "PIC18", "8085"]) st.write("Your selected microcontroller: ", device) # Step 1: Show Syntax Template based on selected device st.subheader("Coding Syntax Template", anchor="subheader") st.code(devices[device]["template"], language="c" if device != "8085" else "asm") # Step 2: Get User Prompt and Generate Code prompt = st.text_area("Enter your code requirements:", height=100) if prompt: if st.button("Generate Code"): st.write("Generating code, please wait...") code = generate_code(f"Write {device} code for: {prompt}") # Step 3: Chunk, Tokenize, and Store Code in FAISS chunks = tokenize_and_chunk_code(code) store_code_in_faiss(chunks) # Step 4: Display Generated Code st.subheader("Generated Code", anchor="generated-code") st.code(code) # Run the Streamlit App if __name__ == "__main__": main()