Sintetizador y visualizador de circuitos digitales en tiempo real parte 1

Universidad de Costa Rica Facultad de Ingenier´ıa Escuela de Ingenier´ıa El´ ectrica Sintetizador y visualizador de circuitos digitales en tiempo real parte 1 Por: Luis Enrique Araya Carballo Ciudad Universitaria “Rodrigo Facio”, Costa Rica Diciembre 2014 Sintetizador y visualizador de circuitos digitales en tiempo real parte 1 Por: Luis Enrique Araya Carballo IE-0499 Proyecto el´ ectrico Aprobado por el Tribunal: Ph.D. Lucky Lochi Yu Lo Profesor gu´ıa Ing. Juli´an Gutierrez Monge Profesor lector Ing. Diego Valverde Garro Profesor lector Resumen El presente proyecto consisti´o en crear una herramienta did´ actica basada en la plataforma Linux utilizando el lenguaje de programaci´ on C++, la cual permite sintetizar y visualizar en tiempo real circuitos digitales dise˜ nados en el lenguaje de descripci´ on de hardware Verilog. La herramienta cuenta con una interfaz gr´ afica compuesta por dos partes: la primera contiene un editor de texto en el cual se puede programar en el lenguaje Verilog, la segunda un visualizador de circuitos digitales mediante esquem´ aticos. A la interfaz gr´ afica se adapt´ o un sintetizador de c´odigo abierto, cuyo objetivo es sintetizar el texto insertado cada vez que sea compilable. En este punto se obtiene un archivo que describe por medio de compuertas lo dise˜ nado en el lenguaje de descripci´ on de hardware Verilog. A la hora de llevar a cabo la s´ıntesis, el usuario tiene la posibilidad de escoger cuales compuertas desea utilizar, esto con el fin de adaptar el resultado final a las necesidades del usuario. v ´Indice general ´ Indice de figuras ix ´ Indice de cuadros ix Nomenclatura xi 1 Introducci´ on 1.1 Justificaci´ on 1.2 Alcance . . 1.3 Objetivos . 1.4 Metodolog´ıa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Antecedentes 2.1 S´ıntesis . . . . . . . . . . . . . . . . . . . . . 2.2 Sintetizadores de c´odigo libre . . . . . . . . . 2.3 Herramientas de c´odigo libre disponibles para manejo de interfaces gr´ aficas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . la creaci´ on y . . . . . . . . . . . . . . . . . . . . el . . 1 1 1 1 2 3 3 4 6 3 Desarrollo 3.1 Elecci´on de las herramientas a utilizar . . . . . . . . . . . . . . 3.2 Desarrollo de la herramienta . . . . . . . . . . . . . . . . . . . . 9 9 10 4 Resultados 25 5 Conclusiones y recomendaciones 27 Bibliograf´ıa 29 A C´ odigo 31 A.1 Programa Principal . . . . . . . . . . . . . . . . . . . . . . . . . 31 A.2 Funci´on para cargar un archivo . . . . . . . . . . . . . . . . . . 33 A.3 Funci´on para guardar un archivo . . . . . . . . . . . . . . . . . 36 A.4 Funci´on para guardar un archivo si se modific´o . . . . . . . . . 38 A.5 Funciones para realizar b´ usquedas de cierto patr´on en el editor de texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 A.6 Funciones para realizar b´ usqueda y reemplazo de cierto patr´on en el editor de texto . . . . . . . . . . . . . . . . . . . . . . . . 41 vii B Netlist 45 B.1 Netlist de un contador de 4 bits . . . . . . . . . . . . . . . . . . 45 viii ´Indice de figuras 2.1 2.2 Diagrama Y: Dominios conductual, estructural y f´ısico del dise˜ no de circuitos. Tomado de Neil y Harris (2011). . . . . . . . . . . . . Pasos para convertir Verilog a “netlist” en Odin II. Tomado de Jamieson (2010). . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 4 5 Glade: Creaci´on de la ventana principal. . . . . . . . . . . . . . . . Glade: Divisi´ on de la ventana principal. . . . . . . . . . . . . . . . Glade: Contenido de las divisiones de la ventana principal. . . . . . Glade: Contenido del editor de texto y visualizador gr´ afico parte. . Men´ u, submen´ u y sus funciones. . . . . . . . . . . . . . . . . . . . Edici´ on del men´ u. . . . . . . . . . . . . . . . . . . . . . . . . . . . Jerarqu´ıa del men´ u . . . . . . . . . . . . . . . . . . . . . . . . . . . Funciones y teclas de acceso r´apido . . . . . . . . . . . . . . . . . . Men´ u, submen´ u y sus funciones. . . . . . . . . . . . . . . . . . . . Ventana para buscar cierto patr´on en el editor de texto . . . . . . Ventana para buscar y reemplazar cierto patr´on por otro en el editor de texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.12 Ventana para modificar las celdas con las que se desea sintetizar . 3.13 Ventana que muestra informaci´ on acerca del programa . . . . . . . 20 20 21 4.1 4.2 26 26 Interfaz gr´ afica final . . . . . . . . . . . . . . . . . . . . . . . . . . Prueba de interfaz gr´ afica final . . . . . . . . . . . . . . . . . . . . 11 11 12 12 13 14 15 16 17 20 ´Indice de cuadros 3.1 3.2 3.3 3.4 3.5 3.6 3.7 Pasos para la instalaci´ on de Yosys en Linux . . . . . Pasos para la instalaci´ on de GTK+ 2 en Linux . . . Funci´on para crear un archivo nuevo . . . . . . . . . Funci´on para abrir un archivo . . . . . . . . . . . . . Funci´on para guardar un archivo . . . . . . . . . . . Funci´on para guardar un archivo con cierto nombre Funci´on para cerrar el programa . . . . . . . . . . . ix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 10 15 16 17 18 18 3.8 Funci´on para cortar la selecci´ on actual de texto . . . . . . . . . . . 3.9 Funci´on para cortar la selecci´ on actual de texto . . . . . . . . . . . 3.10 Funci´on para pegar el contenido almacenado por las funciones copiar o cortar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.11 Hilo encargado de llamar a la funci´on que realiza la s´ıntesis . . . . 3.12 Comandos necesarios en el programa principal para llamar el hilo . 3.13 Funci´on encargada de realizar la s´ıntesis . . . . . . . . . . . . . . . x 19 19 19 22 22 23 Nomenclatura ALU Unidad L´ ogico Aritm´etica, del ingl´es Arithmetic Logical Unit. CAD Dise˜ no Asistido por Computadora, del ingl´es Computer Aided Design. CM OS ´ Semiconductor Complementario de Oxido Met´alico ,del ingl´es Complementary Metal Oxide Semiconductor. F P GA ´ Area de Arreglo de Compuertas Programables, del ingl´es Field Programmable Gate Array. HDL Lenguaje de Descripci´ on de Hardware, del ingl´es Hardware Description Language. RT L Nivel de Transferencia de Registros, del ingl´es Register Transfer Level. V HDL Lenguaje Descripci´ on de Hardware, del ingl´es VHSIC Hardware Description Language. V LSI Escala de Integraci´on muy grande, del ingl´es Very Large Scale of Integration. XST Tecnolog´ıa de S´ıntesis de Xilinx , del ingl´es Xilinx Synthesis Technology. xi 1 Introducci´ on 1.1 Justificaci´ on El presente proyecto surge de la necesidad de la Escuela de Ingenier´ıa El´ectrica de la Universidad de Costa Rica de contar con una herramienta did´ actica de c´odigo libre que permita sintetizar y visualizar circuitos digitales en tiempo real. La utilidad de esta herramienta radica en disminuir la dificultad que se experimenta al momento de aprender un lenguaje de descripci´on de Hardware (en este caso Verilog), debido a que el paradigma a utilizar es muy distinto al utilizado en los lenguajes de programaci´ on de alto nivel; como por ejemplo C++, Java, Python, etc. 1.2 Alcance El proyecto est´a desarrollado en la plataforma Linux, adem´ as todos los complementos utilizadas son de c´odigo libre, por lo cual cualquier usuario puede acceder a estos y hacer uso de la herramienta. Todo usuario que desee involucrarse en el aprendizaje de Verilog como lenguaje de descripci´ on de hardware puede hacer uso de este proyecto para facilitar y agilizar su proceso, ya que permite obtener de una manera r´apida y precisa una representaci´ on visual de lo que se est´a programando. 1.3 Objetivos Objetivo general Desarrollar una herramienta did´ actica en el lenguaje de programaci´ on C++ que permita sintetizar y visualizar circuitos digitales dise˜ nados en el lenguaje de descripci´ on de hardware Verilog. Objetivos espec´ıficos • Crear una interfaz gr´ afica compuesta de un editor de texto y un visualizador de circuitos digitales mediante esquem´ aticos. 1 2 1 Introducci´ on • Desarrollar un editor de texto que permita la descripci´ on de un circuito digital mediante la programaci´ on utilizando el lenguaje Verilog. • Adaptar un sintetizador de c´odigo abierto al programa creado. • Crear una extensi´ on al programa que permita al usuario escoger las compuertas que desea utilizar para realizar la s´ıntesis. 1.4 Metodolog´ıa El desarrollo del trabajo incluy´o los siguientes pasos y procedimientos, listados en secuencia: 1. Se realiz´ o la b´ usqueda e investigaci´on de las herramientas disponibles para realizar el proyecto en Clifford (2013), Xilinx (2014), Williams (2014), Jamieson (2010), GTK-Team (2014), OpenGL-Team (2014), Qt-Team (2014), Ugarte (2014), entre otros. 2. Se seleccionaron las herramientas con base en las necesidades del proyecto, tales como la compatibilidad entre ellas y la adaptaci´ on al sistema de desarrollo. 3. Se instalaron y adecuaron las herramientas necesarias para llevar a cabo el proyecto, entre ellas el sintetizador Yosys, el dise˜ nador de interfaces gr´ aficas Glade y el kit de herramientas para crear interfaces gr´ aficas GTK. 4. Se procedi´o a la codificaci´ on y desarrollo de la aplicaci´on. Esta parte del proceso fue la tom´ o m´ as tiempo ya se realiz´ o una unificaci´ on entre las herramientas citadas anteriormente con el fin de obtener el producto final. 5. Se document´o el proceso de aprendizaje: la elecci´ on de las herramientas, instalaci´ on de las mismas, descripci´ on de los principales problemas de programaci´ on y descripci´ on de las principales funciones utilizadas. El lector encontrar´ a en este informe una parte te´ orica en el Cap´ıtulo II que abarca una descripci´ on de los lenguajes de programaci´ on presentes en el proyecto, as´ı como un estudio de las herramientas disponibles, el porqu´e de la elecci´ on de las mismas y una introducci´ on al proceso de s´ıntesis y su utilidad. En el Cap´ıtulo III se muestra el proceso de dise˜ no de la herramienta, las dificultades que present´o, explicaci´on de las principales funciones utilizadas y las opciones con las que cuenta. 2 Antecedentes Este cap´ıtulo presenta la descripci´ on del proceso de s´ıntesis, la introducci´ on del lenguaje Verilog, la exposici´on de sintetizadores de c´odigo libre y las herramientas de c´odigo libre presentes en el mercado para crear interfaces gr´ aficas. 2.1 S´ıntesis El proceso de fabricaci´ on de circuitos integrados se puede modular en tres grandes ´ areas: el modelo conductual, el modelo estructural y el modelo f´ısico (Neil y Harris, 2011). El modelo conductual consiste en el dise˜ no de las funcionalidades del futuro chip. En esta etapa lo importante es lo que el circuito hace, sin importar alg´ un otro aspecto, tomando como u ´nicas variables las entradas y las salidas. El siguiente modelo es el estructural, el cual especifica la interconexi´on necesaria entre los bloques que conforman el circuito para lograr un comportamiento particular. En esta etapa se toma en cuenta tanto la complejidad como el desempe˜ no del circuito. Por u ´ltimo, el dominio f´ısico involucra el aspecto de como los componentes e interconexiones ser´an acomodados en el espacio disponible. En la figura 2.1 se observan los tres niveles de abstracci´on en el dise˜ no de circuitos integrados. La s´ıntesis es el paso para trasladarse del modelo conductual al modelo estructural. Tambi´en como lo denota Gajski (1994), la s´ıntesis es la secuencia de tareas que transforman una representaci´ on conductual a un dise˜ no de RTL, donde este dise˜ no puede estar compuesto por unidades funcionales como ALUs y multiplicadores, unidades de almacenamiento como memorias y registros, e interconexi´on de las unidades como multiplexadores y buses (tambi´en conocido como “netlist”). Seg´ un se detall´o anteriormente, el “netlist” es la salida del proceso de s´ıntesis, mientras que la entrada es una representaci´ on conductual del circuito, normalmente expresada en los lenguajes VHDL o Verilog (Wakerly, 2000). Tanto VHDL como Verilog son lenguajes de simulaci´on y descripci´on de hardware. como lo denota Wakerly (2000), ambos cuentan de un uso generalizado y comparten el mercado de la s´ıntesis l´ ogica en partes muy similares. Verilog tiene sus ra´ıces sint´acticas en C mientras que VHDL es m´ as parecido a Ada (lenguaje de programaci´ on orientado a objetos dise˜ nado por el Departamento de Defensa de los Estados Unidos). 3 4 2 Antecedentes Figura 2.1: Diagrama Y: Dominios conductual, estructural y f´ısico del dise˜ no de circuitos. Tomado de Neil y Harris (2011). Usualmente la descripci´ on conductual del circuito no contiene informaci´ on estructural, por ejemplo los tipos de componentes y sus interconexiones, n´ umero de etapas de pipeline o fases de reloj, sin embargo los lenguajes de descripci´ on de hardware permiten tanto dise˜ no conductual como dise˜ no estructural (Gajski, 1994). Para llevar a cabo el proceso de s´ıntesis se necesita un archivo de entrada (generado por un lenguaje de descripci´ on de hardware) y una herramienta que permita llevar a cabo la s´ıntesis, llamado sintetizador. Con estos dos elementos se puede generar la salida o “netlist”. En la siguiente secci´ on se pretende mostrar algunos sintetizadores de c´odigo abierto disponibles en el mercado. 2.2 Sintetizadores de c´ odigo libre El sintetizador es la herramienta encargada de generar un “netlist” a partir de un archivo de entrada generado por un lenguaje de descrici´on de hardware. Actualmente en el mercado existen tanto sintetizadores privativos como de c´odigo abierto, esta secci´ on se enfoca a la presentaci´ on y descripci´ on de aquellos que pertenecen a la categor´ıa de c´odigo abierto. 2.2. Sintetizadores de c´odigo libre 5 Odin Odin II se presenta como un sintetizador de c´odigo abierto para el lenguaje de descripci´ on de hardware Verilog. Este software complementa los flujos de c´odigo libre orientados al dise˜ no asistido por computadora (Jamieson, 2010). El objetivo primordial de Odin II, tal como lo denota su autor en Jamieson (2010), es presentar una herramienta acad´emica para soportar flujos CAD de c´odigo abierto enfocados a FPGAs. En la figura 2.2 se muestran los principales pasos llevados a cabo en el sintetizador Odin II para convertir el Verilog en “netlist”. Figura 2.2: Pasos para convertir Verilog a “netlist” en Odin II. Tomado de Jamieson (2010). Icarus Verilog Icarus Verilog es un sintetizador y simulador de Verilog. Esta herramienta funciona como compilador y abarca los c´odigos fuentes escrito en el est´andar IEEE Std 1364-2005 (Williams, 2014). Debido a que el est´andar es complejo y extenso, el desarrollo de Icarus Verilog se encuentra en progreso, sin embargo se realizan lanzamientos de versiones estables cada cierto tiempo. Como lo denota Williams (2014), el mercado principal de Icarus Verilog es Linux, sin embargo la herramienta funciona en distintos sistemas operativos. 6 2 Antecedentes S´ıntesis XST Xilinx es un empresa dedicada a la investigaci´on y desarrollo de chips conocidos como FPGAs. Una de sus herramientas, llamada S´ıntesis XST, permite la s´ıntesis de proyectos HDL con el objetivo de crear archivos “netlist” espec´ıficos para la l´ınea Xilinx (Xilinx, 2014). Los algoritmos que utiliza el sintetizador XST est´an enfocados a maximizar la utilizaci´ on de las tarjetas FPGA de Xilinx. Se permite tanto el uso de Verilog como VHDL como lenguajes de programaci´ on y la mezcla de los mismos (Xilinx, 2014). El sintetizador XST soporta los est´andares IEEE Std 1364-2001 y IEEE 1076-1993 de Verilog y VHDL respectivamente (Xilinx, 2014). Yosys Yosys es una herramienta de c´odigo libre para sintetizar Verilog el cual posee una versi´ on estable para ser instalado en Linux (Clifford, 2013). Posee dos modos de uso, uno en el cual se pasan los par´ ametros a trav´es de la l´ınea de comandos de Linux y otro en el cual se ejecuta el programa y se introduce paso a paso los comandos para lograr una s´ıntesis completa (Yosys, 2014). 2.3 Herramientas de c´ odigo libre disponibles para la creaci´ on y el manejo de interfaces gr´ aficas GTK+ GTK+ es un conjunto de herramientas de c´odigo abierto para crear interfaces gr´ aficas. Ofrece una gran cantidad de widgets, est´a escrito en el lenguaje de programaci´ on C y se puede utilizar como complemento en lenguajes de programaci´ on como C, C++, Java, Python, Perl, Ruby y m´ as (GTK-Team, 2014). Esta herramienta puede ser utilizada en los sistemas operativos Linux, Windows y Mac OSX (GTK-Team, 2014). OpenGL OpenGL es una librer´ıa multilenguaje y multiplaforma para crear aplicaciones gr´ aficas en 2D y 3D. Se puede utilizar tanto en ambientes con Windows, Linux y Mac OSX. (OpenGL-Team, 2014). 2.3. Herramientas de c´odigo libre disponibles para la creaci´ on y el manejo de interfaces gr´ aficas 7 Qt Qt es un conjunto de herramientas de c´odigo abierto para crear interfaces gr´ aficas. Ofrece una gran cantidad de widgets, est´a escrito en el lenguaje de programaci´ on C++ y su programaci´ on es orientada a objetos (Qt-Team, 2014). Esta herramienta puede ser utilizada en distintos dispositivos y sistemas operativos, tales como Windows, Mac OSX, Linux, Symbian, Android, BlackBerry, iOS, WebOS, entre otros (Qt-Team, 2014). 3 Desarrollo Este cap´ıtulo explica la elecci´ on de las herramientas a utilizar as´ı como la instalaci´ on de las mismas. Tambi´en se describen los pasos que se llevaron a cabo para lograr el producto final y las principales funciones que se utilizaron. 3.1 Elecci´ on de las herramientas a utilizar Para llevar a cabo el proceso de s´ıntesis se escogi´ o la herramienta Yosys, debido a que est´a enfocada a su uso en Linux, posee una gu´ıa de instalaci´ on detallada, la documentaci´ on disponible es necesaria para sacar el m´ aximo provecho y posee la versatilidad de indicarle al sintetizador cuales compuertas se desean utilizar para llevar a cabo el proceso de s´ıntesis. GTK+2 se escogi´ o como herramienta para manejar la interfaz gr´ afica, esto debido a su compatibilidad con Linux y con el lenguaje de programaci´ on C, adem´ as por la amplia variedad de widgets que utiliza. Para complementar el uso de GTK+2 se utiliz´o la herramienta Glade, el cual es un entorno gr´ afico para la creaci´ on de interfaces gr´ aficas de una manera f´acil y r´apida. A continuaci´ on se presentan los pasos para llevar a cabo la instalaci´ on de las herramientas antes mencionadas (Yosys, GTK+2 y Glade) en el sistema operativo Linux, espec´ıficamente en Ubuntu 14.04. Instalaci´ on de Yosys Como lo denota Yosys (2014), se deben llevar los pasos mostrados en el cuadro 3.1 para completar la instalaci´ on en Linux. Estos fueron utilizados en el ambiente Ubuntu 14.04. Cuadro 3.1: Pasos para la instalaci´ on de Yosys en Linux sudo add-apt-repository ppa:saltmakrell/ppa sudo apt-get update sudo apt-get install yosys yosys-abc 9 10 3 Desarrollo Cuadro 3.2: Pasos para la instalaci´ on de GTK+ 2 en Linux sudo apt-get install libgtk2.0-dev Instalaci´ on de Glade La versi´ on instalada de Glade fue la 3.8.5, la cual es compatible con GTK+ 2. Esta versi´ on se encuentra disponible en el centro de software de Ubuntu, la cual se puede encontrar como “Glade Interface Designer (glade-gtk2)”. Una instalaci´ on alternativa es descargar el paquete y seguir los pasos que se detallan en la p´agina web del fabricante. (Ugarte, 2014). Instalaci´ on de GTK+ 2 En el cuadro 3.2 se encuentran los pasos necesarios para llevar a cabo la instalaci´on de GTK+ 2 en Linux. Estos fueron utilizados en el ambiente Ubuntu 14.04. En la siguiente secci´ on se detallan los pasos necesarios para llevar a cabo el dise˜ no gr´ afico de la herramienta, as´ı como las funciones creadas para llevar a cabo funciones espec´ıficas del programa principal o del editor de texto. 3.2 Desarrollo de la herramienta Para llevar a cabo el desarrollo del entorno gr´ afico se hizo uso de la herramienta Glade, la cual permite la creaci´ on de interfaces gr´ aficas de una manera f´acil y r´apida. A continuaci´ on se presenta una gu´ıa r´apida del uso de Glade para la creaci´ on de la interfaz r´ apida utilizada en el programa principal. Glade: creaci´ on de la interfaz gr´ afica El primer paso al tener abierto el programa Glade es crear una ventana principal que contendr´ a todos los widgets necesarios, para lograrlo se selecciona el primer elemento de la subventana “Toplevels” llamado “Window”. En la figura 3.1 se observa el resultado obtenido al realizar este paso. El siguiente paso es dividir la ventana principal seg´ un las necesidades de la herramienta. Glade cuenta con varios tipos de contenedores, entre ellos cajas verticales, cajas horizontales o tablas. Para el programa en desarrollo se determin´o que la ventana principal debe contener 3 cajas verticales, para a˜ nadirlo, en la subventana “Containers” se 3.2. Desarrollo de la herramienta 11 Figura 3.1: Glade: Creaci´on de la ventana principal. escogi´ o el widget “Vertical Box” y se determin´o el tama˜ no en tres. En la figura 3.2 se observa el resultado obtenido al realizar este paso. Figura 3.2: Glade: Divisi´ on de la ventana principal. El siguiente paso es definir el contenido de cada subdivisi´ on de la ventana principal. En la primera se coloc´o un men´ u (en la subventana “Containers” el widget “Menu Bar”), en la segunda se coloc´o un divisor horizontal (en la subventana “Containers” el widget “Horizontal Box” de tama˜ no dos) y en la tercera una barra de estado (en la subventana “Control and Display” el widget “Status Bar” de tama˜ no tres). El men´ u se cre´ o con el objetivo de contener una serie de pesta˜ nas modificables en las cuales se pueden a˜ nadir todas las funciones necesarias del programa, el contenedor horizontal tiene el objetivo de albergar el editor de texto y el visualizador gr´ afico, por u ´ltimo, la barra de estado funciona como 12 3 Desarrollo visualizador de se˜ nales. En la figura 3.3 se observa el resultado obtenido al realizar este paso. Figura 3.3: Glade: Contenido de las divisiones de la ventana principal. Tanto el editor de texto como el visualizador gr´ afico deben contener opci´on de desplazamiento vertical y horizontal, para lograrlo se a˜ nadi´o una ventana de desplazamiento (en la subventana “Containers” el widget “Scrolled Window”) a ambos. Para completar el dise˜ no del editor de texto se a˜ nadi´o el widget visualizador de texto al campo correspondiente (en la subventana “Control and Display” el widget “Text View”). Para completar el visualizador gr´ afico se a˜ nadieron dos widgets: el primero habilita la visualizaci´ on de una imagen en una ventana de desplazamiento y el siguiente contiene la imagen (en la subventana “Containers” el widget “Viewport” y en la subventana “Control and Display” el widget “Image”). En la figura 3.4 se observa el resultado obtenido al realizar este paso. Figura 3.4: Glade: Contenido del editor de texto y visualizador gr´ afico parte. 3.2. Desarrollo de la herramienta 13 En este punto se tiene el dise˜ no completo de la interfaz gr´ afica, el u ´ltimo paso es guardar con formato .glade la interfaz creada. Programa principal Es necesaria la creaci´ on de un programa principal el cual integre todas las partes necesarias del programa. Para lograrlo se cre´ o un programa en el lenguaje de programaci´ on C, el cual permite el manejo de la librer´ıa GTK y la inclusi´on de archivos generados en Glade. Este programa principal contiene la inclusi´on de las librer´ıas necesarias (entre ellas la que permite el uso de GTK, la que permite el uso de las funciones b´asicas de C, la que permite el uso del manejo de errores y la que permite el uso de hilos de ejecuci´ on), el llamado a archivos que contienen funciones varias, la definici´on de variables, la inclusi´on de los archivos generados en Glade, la relaci´ on entre las variables declaradas en el programa principal y los widgets generados en Glade, y por u ´ltimo la definici´on del ciclo del principal. En el ap´endice A se encuentra el programa principal completo con todos los comandos necesarios para lograr lo que se describi´ o anteriormente. Adem´ as cada comando se encuentra debidamente comentado. Una vez que se comprob´ o el funcionamiento del programa principal y su interacci´ on con la interfaz creada en Glade, fue necesario definir las funciones que debe contener el men´ u de la interfaz gr´ afica. En la figura 3.5 se muestra el conjunto de opciones disponibles en el men´ u y sus respectivas funciones. Figura 3.5: Men´ u, submen´ u y sus funciones. Para lograr lo mostrado en la figura 3.5 es necesario editar el men´ u que trae por defecto el widget en Glade. Como se muestra en la figura 3.6, se debe seleccionar el widget “menubar1”, presionar click derecho, seleccionar editar e ir a la pesta˜ na jerarqu´ıa. En la ventana mostrada en la figura 3.6 se puede modificar la jerarqu´ıa del men´ u, ya sea a˜ nadiendo m´ as pesta˜ nas o m´ as botones dentro de las pesta˜ nas existentes. En la figura 3.7 se muestra el producto final de la edici´on necesaria para llevar a cabo el proyecto. 14 3 Desarrollo Figura 3.6: Edici´ on del men´ u. Hasta el momento los botones dentro de las pesta˜ nas del men´ u son de poca ayuda debido a que no tienen se˜ nales asignadas. Para lograrlo es necesario a˜ nadir una funci´on que se llame una vez que se presione el bot´ on. En la figura 3.8 se muestran los pasos para lograrlo, primero se selecciona el bot´ on a conectar, en este caso “gtk-new”, luego en el campo de “activate” se coloca el nombre de la funci´on que se quiere llamar en el programa principal una vez que el bot´ on “gtk-new” sea presionado. Para facilitar la llamada a funciones es posible a˜ nadir atajos en el teclado para llamarlas en el programa principal. Al seleccionar un bot´on de alguna pesta˜ na, seleccionando la pesta˜ na “Common” y la opci´ on “Accelarators” se pueden a˜ nadir atajos a cualquier bot´ on, as´ı como se muestra en la figura 3.9. A continuaci´ on se muestra la descripci´ on de las funciones que realiza cada bot´ on incluido en el men´ u. Funciones de los botones 1. Nuevo: Esta funci´on se encarga de limpiar el editor de texto y crear un archivo en blanco. Para lograrlo se realizan tres pasos, el primero es revisar si el archivo que se encuentra en el editor de texto est´a guardado o no, si lo est´a la funci´on procede sin solicitar nada al usuario, en cambio si el archivo no est´a guardado se brinda la posibilidad al usuario de escoger si desea guardarlo o no. El segundo paso es limpiar el contenido del editor de texto y por u ´ltimo se elimina el nombre del archivo, esto para no conservar los datos del archivo anterior. En el anexo A se muestra el c´odigo completo de la funci´on “save if modified”. 3.2. Desarrollo de la herramienta 15 Figura 3.7: Jerarqu´ıa del men´ u Cuadro 3.3: Funci´on para crear un archivo nuevo void n e w f i l e ( char ∗ fname ) { save if modified () ; g t k t e x t b u f f e r s e t t e x t ( b u f f e r , ” ” , −1) ; f i l e n a m e = NULL; } En el cuadro 3.3 se muestran los comandos que se utilizaron para lograr lo que se describi´ o anteriormente. 2. Abrir: Esta funci´on se encarga de cargar al editor de texto un archivo guardado en cualquier directorio. Para lograrlo se realizan dos pasos, el primero es revisar si el archivo que se encuentra en el editor de texto est´a guardado o no, si lo est´a la funci´on procede sin solicitar nada al usuario, en cambio si 16 3 Desarrollo Figura 3.8: Funciones y teclas de acceso r´apido Cuadro 3.4: Funci´on para abrir un archivo void f i l e o p e n ( GtkWindow ∗window , g p o i n t e r u s e r d a t a ) { save if modified () ; l o a d f i l e (NULL) ; } el archivo no est´a guardado se brinda la posibilidad al usuario de escoger si desea guardarlo o no. El segundo paso es escoger el archivo a abrir, para lograrlo se despliega una ventana que le permite al usuario explorar los directorios y escoger el archivo deseado. En el anexo A se muestran los c´odigos completos de las funciones “save if modified” y “load file”. En el cuadro 3.4 se muestran los comandos que se utilizaron para lograr lo que se describi´ o anteriormente. 3. Guardar: 3.2. Desarrollo de la herramienta 17 Figura 3.9: Men´ u, submen´ u y sus funciones. Cuadro 3.5: Funci´on para guardar un archivo void f i l e s a v e ( GtkWindow ∗window , g p o i n t e r u s e r d a t a ) { s a v e t o f i l e ( filename ) ; } Esta funci´on se encarga de guardar en un archivo el contenido actual del editor de texto. Su algoritmo es el siguiente: si el archivo ha sido guardado en alg´ un punto del programa se almacena con el nombre utilizado anteriormente; si es la primera vez, se solicita al usuario un nombre para guardarlo. En el cuadro 3.5 se muestran los comandos que se utilizaron para lograr lo que se describi´ o anteriormente. La funci´on “save to file” se encarga de realizar la l´ ogica de solicitar o no al usuario un nombre para guardar el archivo, esto lo hace dependiendo del contenido de la variable “filename”. En el anexo A se muestra el c´odigo completo de la funci´on “save to file”. 4. Guardar como: 18 3 Desarrollo Cuadro 3.6: Funci´on para guardar un archivo con cierto nombre void f i l e s a v e a s ( GtkWindow ∗window , g p o i n t e r u s e r d a t a ) { s a v e t o f i l e (NULL) ; } Cuadro 3.7: Funci´on para cerrar el programa void o n w i n d o w 1 d e s t r o y ( GtkObject ∗ o b j e c t , g p o i n t e r u s e r d a t a ) { save if modified () ; e n d p r o c e s s=FALSE ; gtk main quit () ; } Esta funci´on se encarga de guardar en un archivo el contenido actual del editor de texto. Es importante recalcar que al seleccionar esta opci´on siempre se solicita al usuario el nombre que se utilizar´a para guardar. En el cuadro 3.6 se muestran los comandos que se utilizaron para lograr lo que se describi´ o anteriormente. 5. Cerrar: Esta funci´on se encarga de verificar si el contenido actual del editor de texto est´a guardada o no antes de cerrar el programa. Si est´ a guardada se cierra el programa, si no lo est´a se da la posibilidad al usuario de guardar o no el contenido actual del editor de texto. En el cuadro 3.7 se muestran los comandos que se utilizaron para lograr lo que se describi´ o anteriormente. 6. Cortar: Esta funci´on se encarga de cortar la selecci´ on actual en el editor de texto. En el cuadro 3.8 se muestran los comandos que se utilizaron para lograr lo que se describi´ o anteriormente. 7. Copiar: Esta funci´on se encarga de copiar la selecci´ on actual en el editor de texto. En el cuadro 3.9 se muestran los comandos que se utilizaron para lograr lo que se describi´ o anteriormente. 3.2. Desarrollo de la herramienta 19 Cuadro 3.8: Funci´on para cortar la selecci´ on actual de texto void c u t ( GtkObject ∗ o b j e c t , g p o i n t e r u s e r d a t a ) { gtk text buffer cut clipboard ( buffer , gtk clipboard get ( s e l a t o m ) , TRUE) ; } Cuadro 3.9: Funci´on para cortar la selecci´ on actual de texto void copy ( GtkObject ∗ o b j e c t , g p o i n t e r u s e r d a t a ) { gtk text buffer copy clipboard ( buffer , gtk clipboard get ( sel atom ) ) ; } Cuadro 3.10: Funci´on para pegar el contenido almacenado por las funciones copiar o cortar void p a s t e ( GtkObject ∗ o b j e c t , g p o i n t e r u s e r d a t a ) { gtk text buffer paste clipboard ( buffer , gtk clipboard get ( s e l a t o m ) , NULL, TRUE) ; } 8. Pegar: Esta funci´on se encarga de pegar en la posici´on escogida el contenido almacenado por las funciones copiar o cortar. En el cuadro 3.10 se muestran los comandos que se utilizaron para lograr lo que se describi´o anteriormente. 9. Buscar: Esta funci´on se encarga de buscar cierto patr´on ingresado por el usuario en el editor. Para lograrlo se crea una subventana con tres elementos: un almacenador de texto donde el usuario ingresa lo que desea buscar, un bot´ on para buscar y un bot´ on para encontrar la siguiente aparici´on del patr´ on. Al seleccionar la funci´on buscar se llama a la funci´on “textfind”, la cual es la encargada de crear la nueva subventana y relacionar las se˜ nales de los 20 3 Desarrollo botones con las funciones“search button clicked”y“next button clicked”. El c´odigo completo de estas funciones se encuentra en el anexo A. Figura 3.10: Ventana para buscar cierto patr´on en el editor de texto 10. Buscar y reemplazar: Esta funci´on se encarga de buscar y reemplazar cierto patr´ on ingresado por el usuario en el editor. Para lograrlo se crea una subventana con cuatro elementos: un almacenador de texto donde el usuario ingresa lo que desea reemplazar, un almacenador de texto donde el usuario ingresa por lo que quiere reemplazar,un bot´ on para buscar y un bot´ on para reemplazar. Al seleccionar la funci´on buscar se llama a la funci´on “text find replace”, la cual es la encargada de crear la nueva subventana y relacionar las sen ˜ales de los botones con las funciones “search button clicked” y “replace button clicked”. El c´odigo completo de estas funciones se encuentra en el anexo A. Figura 3.11: Ventana para buscar y reemplazar cierto patr´on por otro en el editor de texto 11. Editar celdas: Esta funci´on se encarga de desplegar una subventana permitiendo al usuario agregar o eliminar celdas que se utilizar´an en el proceso de s´ıntesis de su dise˜ no. La ventana a desplegar es la que se muestra en la figura 3.12. Figura 3.12: Ventana para modificar las celdas con las que se desea sintetizar 3.2. Desarrollo de la herramienta 21 El proceso de s´ıntesis utilizado por Yosys permite utilizar un archivo con las celdas deseables para crear el netlist. Al marcar o desmarcar las casillas mostradas, se a˜ nade o elimina el c´odigo de la compuerta en el archivo proporcionado a Yosys, permitiendo as´ı, llevar a cabo la s´ıntesis con las celdas que el usuario desee. 12. Acerca de: Esta funci´on se encarga de desplegar una subventana con la informaci´ on de la aplicaci´on. La ventana mostrada se muestra en la figura 3.13. Figura 3.13: Ventana que muestra informaci´ on acerca del programa Integraci´ on de Yosys al programa principal Para llevar a cabo la s´ıntesis en tiempo real, se utiliz´o un hilo que se llama cada cinco segundos. Este hilo es encargado de llamar la funci´on que realiza la s´ıntesis por medio de Yosys siempre y cuando el texto en el editor sea compilable. La funci´on del hilo se puede observar en el cuadro 3.11. En el cuadro 3.12 se muestran los comandos necesarios que se deben colocar en el programa principal para poder llamar el hilo. La funci´on “mostrar esquematico” se encarga de generar el comando que se env´ıa a Yosys para llevar a cabo la s´ıntesis del dise˜ no. El proceso consiste de los siguientes pasos: primero se crea un archivo temporal con lo que existe en el editor de texto, luego se genera el archivo con las celdas que el usuario desea utilizar para la s´ıntesis, a continuaci´ on se ejecuta el comando para realizar la s´ıntesis y por u ´ltimo se eval´ ua si la s´ıntesis se llev´ o a cabo de forma exitosa o no. En el cuadro 3.13 se observan los comandos para llevar a cabo los pasos antes descritos. 22 3 Desarrollo Cuadro 3.11: Hilo encargado de llamar a la funci´on que realiza la s´ıntesis void ∗ f u n c i o n h i l o ( void ∗ arguments ) { while ( e n d p r o c e s s ) { mostrar esquematico () ; sleep (5) ; } return NULL; } Cuadro 3.12: Comandos necesarios en el programa principal para llamar el hilo // Se d e f i n e h i l o pthread t simulacion ; g b o o l e a n e n d p r o c e s s = TRUE; // Se i n i c i o e l h i l o p t h r e a d c r e a t e (& s i m u l a c i o n , NULL, f u n c i o n h i l o , NULL) ; 3.2. Desarrollo de la herramienta 23 Cuadro 3.13: Funci´on encargada de realizar la s´ıntesis void m o s t r a r e s q u e m a t i c o ( ) { // Se c r e a a r c h i v o t e m p o r a l para g u a r d a r l o que c o n t i e n e e l e d i t o r de t e x t o s t r i n g fname = ”temp . v ” ; s a v e t o f i l e t e m p ( fname ) ; // Se g e n e r a comando para l l e v a r a cabo l a s i n t e s i s s t r i n g command ; command = ” y o s y s −s l i b f i l e s / y o s y s s c r i p t ” ; const char ∗ command final = command . c s t r ( ) ; // Se g e n e r a e l a r c h i v o con l a s c e l d a s que e l u s u a r i o d e s e a u t i l i z a r para l a s i n t e s i s c r e a t e l i b f i l e () ; // Se l l e v a a cabo l a s i n t e s i s i n t t e s t = system ( command final ) ; // Se e v a l u a l a s i n t e s i s i f ( t e s t !=0) { c o u t message ) ; } i f ( 0 == g t k b u i l d e r a d d f r o m f i l e ( b u i l d e r , ” r a d i o . g l a d e ” , &e r r ) ) { f p r i n t f ( s t d e r r , ” E r r o r adding b u i l d from f i l e . E r r o r : %s \n ” , e r r −>message ) ; } // Se e x t r a e l a v a r i a b l e window window = GTK WIDGET ( g t k b u i l d e r g e t o b j e c t ( b u i l d e r , ” window1 ”) ) ; childWindow = GTK WIDGET ( g t k b u i l d e r g e t o b j e c t ( b u i l d e r , ”c h ild w in d o w ”) ) ; // Se e x t r a e l a v a r i a b l e t e x t t e x t = GTK WIDGET ( g t k b u i l d e r g e t o b j e c t ( b u i l d e r , ” t e x t v i e w 1 ”) ) ; // Se e x t r a e l a v a r i a b l e image image = GTK WIDGET ( g t k b u i l d e r g e t o b j e c t ( b u i l d e r , ” image1 ”) ) ; // Se e x t r a e l a v a r i a b l e e v e n t b o x eventbox = GTK WIDGET ( g t k b u i l d e r g e t o b j e c t ( b u i l d e r , ” eventbox1 ”) ) ; // Se e x t r a e l a v a r i a b l e b u f f e r A.2. Funci´on para cargar un archivo 82 83 84 85 86 87 88 89 90 91 9

0 downloads 45 Views 926KB Size

Recommend Stories


Sistemas Digitales. Circuitos Codificadores
Sistemas Digitales Circuitos Codificadores Se definen como tal, a circuitos combinacionales que tienen 2 n entradas y n salidas, aunque en algunos cas

Unidad 3: Circuitos digitales
Appendix A - Digital Logic A-1 Unidad 3: Circuitos digitales. Diapositivas traducidas del libro Principles of Computer Architecture Miles Murdocca

Circuitos Digitales Combinacionales
Universidad de Alcalá Departamento de Electrónica Electrónica Informática de Gestión Problemas Tema III Circuitos Digitales Combinacionales Elect

SISTEMAS EN TIEMPO REAL
SISTEMAS EN TIEMPO REAL Manuel Agustín Ortiz López Área de Arquitectura y Tecnología de Computadores Departamento de Arquitectura de Computadores, El

Story Transcript

Universidad de Costa Rica Facultad de Ingenier´ıa Escuela de Ingenier´ıa El´ ectrica

Sintetizador y visualizador de circuitos digitales en tiempo real parte 1

Por: Luis Enrique Araya Carballo

Ciudad Universitaria “Rodrigo Facio”, Costa Rica Diciembre 2014

Sintetizador y visualizador de circuitos digitales en tiempo real parte 1

Por: Luis Enrique Araya Carballo

IE-0499 Proyecto el´ ectrico Aprobado por el Tribunal:

Ph.D. Lucky Lochi Yu Lo Profesor gu´ıa

Ing. Juli´an Gutierrez Monge Profesor lector

Ing. Diego Valverde Garro Profesor lector

Resumen El presente proyecto consisti´o en crear una herramienta did´ actica basada en la plataforma Linux utilizando el lenguaje de programaci´ on C++, la cual permite sintetizar y visualizar en tiempo real circuitos digitales dise˜ nados en el lenguaje de descripci´ on de hardware Verilog. La herramienta cuenta con una interfaz gr´ afica compuesta por dos partes: la primera contiene un editor de texto en el cual se puede programar en el lenguaje Verilog, la segunda un visualizador de circuitos digitales mediante esquem´ aticos. A la interfaz gr´ afica se adapt´ o un sintetizador de c´odigo abierto, cuyo objetivo es sintetizar el texto insertado cada vez que sea compilable. En este punto se obtiene un archivo que describe por medio de compuertas lo dise˜ nado en el lenguaje de descripci´ on de hardware Verilog. A la hora de llevar a cabo la s´ıntesis, el usuario tiene la posibilidad de escoger cuales compuertas desea utilizar, esto con el fin de adaptar el resultado final a las necesidades del usuario.

v

´Indice general ´ Indice de figuras

ix

´ Indice de cuadros

ix

Nomenclatura

xi

1 Introducci´ on 1.1 Justificaci´ on 1.2 Alcance . . 1.3 Objetivos . 1.4 Metodolog´ıa

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

2 Antecedentes 2.1 S´ıntesis . . . . . . . . . . . . . . . . . . . . . 2.2 Sintetizadores de c´odigo libre . . . . . . . . . 2.3 Herramientas de c´odigo libre disponibles para manejo de interfaces gr´ aficas . . . . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . . . . . . . . . . . . . . la creaci´ on y . . . . . . . .

. . . .

. . . .

. . . . el . .

1 1 1 1 2 3 3 4 6

3 Desarrollo 3.1 Elecci´on de las herramientas a utilizar . . . . . . . . . . . . . . 3.2 Desarrollo de la herramienta . . . . . . . . . . . . . . . . . . . .

9 9 10

4 Resultados

25

5 Conclusiones y recomendaciones

27

Bibliograf´ıa

29

A C´ odigo 31 A.1 Programa Principal . . . . . . . . . . . . . . . . . . . . . . . . . 31 A.2 Funci´on para cargar un archivo . . . . . . . . . . . . . . . . . . 33 A.3 Funci´on para guardar un archivo . . . . . . . . . . . . . . . . . 36 A.4 Funci´on para guardar un archivo si se modific´o . . . . . . . . . 38 A.5 Funciones para realizar b´ usquedas de cierto patr´on en el editor de texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 A.6 Funciones para realizar b´ usqueda y reemplazo de cierto patr´on en el editor de texto . . . . . . . . . . . . . . . . . . . . . . . . 41 vii

B Netlist 45 B.1 Netlist de un contador de 4 bits . . . . . . . . . . . . . . . . . . 45

viii

´Indice de figuras 2.1 2.2

Diagrama Y: Dominios conductual, estructural y f´ısico del dise˜ no de circuitos. Tomado de Neil y Harris (2011). . . . . . . . . . . . . Pasos para convertir Verilog a “netlist” en Odin II. Tomado de Jamieson (2010). . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11

4 5

Glade: Creaci´on de la ventana principal. . . . . . . . . . . . . . . . Glade: Divisi´ on de la ventana principal. . . . . . . . . . . . . . . . Glade: Contenido de las divisiones de la ventana principal. . . . . . Glade: Contenido del editor de texto y visualizador gr´ afico parte. . Men´ u, submen´ u y sus funciones. . . . . . . . . . . . . . . . . . . . Edici´ on del men´ u. . . . . . . . . . . . . . . . . . . . . . . . . . . . Jerarqu´ıa del men´ u . . . . . . . . . . . . . . . . . . . . . . . . . . . Funciones y teclas de acceso r´apido . . . . . . . . . . . . . . . . . . Men´ u, submen´ u y sus funciones. . . . . . . . . . . . . . . . . . . . Ventana para buscar cierto patr´on en el editor de texto . . . . . . Ventana para buscar y reemplazar cierto patr´on por otro en el editor de texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.12 Ventana para modificar las celdas con las que se desea sintetizar . 3.13 Ventana que muestra informaci´ on acerca del programa . . . . . . .

20 20 21

4.1 4.2

26 26

Interfaz gr´ afica final . . . . . . . . . . . . . . . . . . . . . . . . . . Prueba de interfaz gr´ afica final . . . . . . . . . . . . . . . . . . . .

11 11 12 12 13 14 15 16 17 20

´Indice de cuadros 3.1 3.2 3.3 3.4 3.5 3.6 3.7

Pasos para la instalaci´ on de Yosys en Linux . . . . . Pasos para la instalaci´ on de GTK+ 2 en Linux . . . Funci´on para crear un archivo nuevo . . . . . . . . . Funci´on para abrir un archivo . . . . . . . . . . . . . Funci´on para guardar un archivo . . . . . . . . . . . Funci´on para guardar un archivo con cierto nombre Funci´on para cerrar el programa . . . . . . . . . . . ix

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

9 10 15 16 17 18 18

3.8 Funci´on para cortar la selecci´ on actual de texto . . . . . . . . . . . 3.9 Funci´on para cortar la selecci´ on actual de texto . . . . . . . . . . . 3.10 Funci´on para pegar el contenido almacenado por las funciones copiar o cortar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.11 Hilo encargado de llamar a la funci´on que realiza la s´ıntesis . . . . 3.12 Comandos necesarios en el programa principal para llamar el hilo . 3.13 Funci´on encargada de realizar la s´ıntesis . . . . . . . . . . . . . . .

x

19 19 19 22 22 23

Nomenclatura ALU

Unidad L´ ogico Aritm´etica, del ingl´es Arithmetic Logical Unit.

CAD

Dise˜ no Asistido por Computadora, del ingl´es Computer Aided Design.

CM OS

´ Semiconductor Complementario de Oxido Met´alico ,del ingl´es Complementary Metal Oxide Semiconductor.

F P GA

´ Area de Arreglo de Compuertas Programables, del ingl´es Field Programmable Gate Array.

HDL

Lenguaje de Descripci´ on de Hardware, del ingl´es Hardware Description Language.

RT L

Nivel de Transferencia de Registros, del ingl´es Register Transfer Level.

V HDL

Lenguaje Descripci´ on de Hardware, del ingl´es VHSIC Hardware Description Language.

V LSI

Escala de Integraci´on muy grande, del ingl´es Very Large Scale of Integration.

XST

Tecnolog´ıa de S´ıntesis de Xilinx , del ingl´es Xilinx Synthesis Technology.

xi

1

Introducci´ on

1.1

Justificaci´ on

El presente proyecto surge de la necesidad de la Escuela de Ingenier´ıa El´ectrica de la Universidad de Costa Rica de contar con una herramienta did´ actica de c´odigo libre que permita sintetizar y visualizar circuitos digitales en tiempo real. La utilidad de esta herramienta radica en disminuir la dificultad que se experimenta al momento de aprender un lenguaje de descripci´on de Hardware (en este caso Verilog), debido a que el paradigma a utilizar es muy distinto al utilizado en los lenguajes de programaci´ on de alto nivel; como por ejemplo C++, Java, Python, etc.

1.2

Alcance

El proyecto est´a desarrollado en la plataforma Linux, adem´ as todos los complementos utilizadas son de c´odigo libre, por lo cual cualquier usuario puede acceder a estos y hacer uso de la herramienta. Todo usuario que desee involucrarse en el aprendizaje de Verilog como lenguaje de descripci´ on de hardware puede hacer uso de este proyecto para facilitar y agilizar su proceso, ya que permite obtener de una manera r´apida y precisa una representaci´ on visual de lo que se est´a programando.

1.3

Objetivos

Objetivo general Desarrollar una herramienta did´ actica en el lenguaje de programaci´ on C++ que permita sintetizar y visualizar circuitos digitales dise˜ nados en el lenguaje de descripci´ on de hardware Verilog.

Objetivos espec´ıficos • Crear una interfaz gr´ afica compuesta de un editor de texto y un visualizador de circuitos digitales mediante esquem´ aticos. 1

2

1 Introducci´ on • Desarrollar un editor de texto que permita la descripci´ on de un circuito digital mediante la programaci´ on utilizando el lenguaje Verilog. • Adaptar un sintetizador de c´odigo abierto al programa creado. • Crear una extensi´ on al programa que permita al usuario escoger las compuertas que desea utilizar para realizar la s´ıntesis.

1.4

Metodolog´ıa

El desarrollo del trabajo incluy´o los siguientes pasos y procedimientos, listados en secuencia: 1. Se realiz´ o la b´ usqueda e investigaci´on de las herramientas disponibles para realizar el proyecto en Clifford (2013), Xilinx (2014), Williams (2014), Jamieson (2010), GTK-Team (2014), OpenGL-Team (2014), Qt-Team (2014), Ugarte (2014), entre otros. 2. Se seleccionaron las herramientas con base en las necesidades del proyecto, tales como la compatibilidad entre ellas y la adaptaci´ on al sistema de desarrollo. 3. Se instalaron y adecuaron las herramientas necesarias para llevar a cabo el proyecto, entre ellas el sintetizador Yosys, el dise˜ nador de interfaces gr´ aficas Glade y el kit de herramientas para crear interfaces gr´ aficas GTK. 4. Se procedi´o a la codificaci´ on y desarrollo de la aplicaci´on. Esta parte del proceso fue la tom´ o m´ as tiempo ya se realiz´ o una unificaci´ on entre las herramientas citadas anteriormente con el fin de obtener el producto final. 5. Se document´o el proceso de aprendizaje: la elecci´ on de las herramientas, instalaci´ on de las mismas, descripci´ on de los principales problemas de programaci´ on y descripci´ on de las principales funciones utilizadas. El lector encontrar´ a en este informe una parte te´ orica en el Cap´ıtulo II que abarca una descripci´ on de los lenguajes de programaci´ on presentes en el proyecto, as´ı como un estudio de las herramientas disponibles, el porqu´e de la elecci´ on de las mismas y una introducci´ on al proceso de s´ıntesis y su utilidad. En el Cap´ıtulo III se muestra el proceso de dise˜ no de la herramienta, las dificultades que present´o, explicaci´on de las principales funciones utilizadas y las opciones con las que cuenta.

2

Antecedentes

Este cap´ıtulo presenta la descripci´ on del proceso de s´ıntesis, la introducci´ on del lenguaje Verilog, la exposici´on de sintetizadores de c´odigo libre y las herramientas de c´odigo libre presentes en el mercado para crear interfaces gr´ aficas.

2.1

S´ıntesis

El proceso de fabricaci´ on de circuitos integrados se puede modular en tres grandes ´ areas: el modelo conductual, el modelo estructural y el modelo f´ısico (Neil y Harris, 2011). El modelo conductual consiste en el dise˜ no de las funcionalidades del futuro chip. En esta etapa lo importante es lo que el circuito hace, sin importar alg´ un otro aspecto, tomando como u ´nicas variables las entradas y las salidas. El siguiente modelo es el estructural, el cual especifica la interconexi´on necesaria entre los bloques que conforman el circuito para lograr un comportamiento particular. En esta etapa se toma en cuenta tanto la complejidad como el desempe˜ no del circuito. Por u ´ltimo, el dominio f´ısico involucra el aspecto de como los componentes e interconexiones ser´an acomodados en el espacio disponible. En la figura 2.1 se observan los tres niveles de abstracci´on en el dise˜ no de circuitos integrados. La s´ıntesis es el paso para trasladarse del modelo conductual al modelo estructural. Tambi´en como lo denota Gajski (1994), la s´ıntesis es la secuencia de tareas que transforman una representaci´ on conductual a un dise˜ no de RTL, donde este dise˜ no puede estar compuesto por unidades funcionales como ALUs y multiplicadores, unidades de almacenamiento como memorias y registros, e interconexi´on de las unidades como multiplexadores y buses (tambi´en conocido como “netlist”). Seg´ un se detall´o anteriormente, el “netlist” es la salida del proceso de s´ıntesis, mientras que la entrada es una representaci´ on conductual del circuito, normalmente expresada en los lenguajes VHDL o Verilog (Wakerly, 2000). Tanto VHDL como Verilog son lenguajes de simulaci´on y descripci´on de hardware. como lo denota Wakerly (2000), ambos cuentan de un uso generalizado y comparten el mercado de la s´ıntesis l´ ogica en partes muy similares. Verilog tiene sus ra´ıces sint´acticas en C mientras que VHDL es m´ as parecido a Ada (lenguaje de programaci´ on orientado a objetos dise˜ nado por el Departamento de Defensa de los Estados Unidos). 3

4

2 Antecedentes

Figura 2.1: Diagrama Y: Dominios conductual, estructural y f´ısico del dise˜ no de circuitos. Tomado de Neil y Harris (2011).

Usualmente la descripci´ on conductual del circuito no contiene informaci´ on estructural, por ejemplo los tipos de componentes y sus interconexiones, n´ umero de etapas de pipeline o fases de reloj, sin embargo los lenguajes de descripci´ on de hardware permiten tanto dise˜ no conductual como dise˜ no estructural (Gajski, 1994). Para llevar a cabo el proceso de s´ıntesis se necesita un archivo de entrada (generado por un lenguaje de descripci´ on de hardware) y una herramienta que permita llevar a cabo la s´ıntesis, llamado sintetizador. Con estos dos elementos se puede generar la salida o “netlist”. En la siguiente secci´ on se pretende mostrar algunos sintetizadores de c´odigo abierto disponibles en el mercado.

2.2

Sintetizadores de c´ odigo libre

El sintetizador es la herramienta encargada de generar un “netlist” a partir de un archivo de entrada generado por un lenguaje de descrici´on de hardware. Actualmente en el mercado existen tanto sintetizadores privativos como de c´odigo abierto, esta secci´ on se enfoca a la presentaci´ on y descripci´ on de aquellos que pertenecen a la categor´ıa de c´odigo abierto.

2.2. Sintetizadores de c´odigo libre

5

Odin Odin II se presenta como un sintetizador de c´odigo abierto para el lenguaje de descripci´ on de hardware Verilog. Este software complementa los flujos de c´odigo libre orientados al dise˜ no asistido por computadora (Jamieson, 2010). El objetivo primordial de Odin II, tal como lo denota su autor en Jamieson (2010), es presentar una herramienta acad´emica para soportar flujos CAD de c´odigo abierto enfocados a FPGAs. En la figura 2.2 se muestran los principales pasos llevados a cabo en el sintetizador Odin II para convertir el Verilog en “netlist”.

Figura 2.2: Pasos para convertir Verilog a “netlist” en Odin II. Tomado de Jamieson (2010).

Icarus Verilog Icarus Verilog es un sintetizador y simulador de Verilog. Esta herramienta funciona como compilador y abarca los c´odigos fuentes escrito en el est´andar IEEE Std 1364-2005 (Williams, 2014). Debido a que el est´andar es complejo y extenso, el desarrollo de Icarus Verilog se encuentra en progreso, sin embargo se realizan lanzamientos de versiones estables cada cierto tiempo. Como lo denota Williams (2014), el mercado principal de Icarus Verilog es Linux, sin embargo la herramienta funciona en distintos sistemas operativos.

6

2 Antecedentes

S´ıntesis XST Xilinx es un empresa dedicada a la investigaci´on y desarrollo de chips conocidos como FPGAs. Una de sus herramientas, llamada S´ıntesis XST, permite la s´ıntesis de proyectos HDL con el objetivo de crear archivos “netlist” espec´ıficos para la l´ınea Xilinx (Xilinx, 2014). Los algoritmos que utiliza el sintetizador XST est´an enfocados a maximizar la utilizaci´ on de las tarjetas FPGA de Xilinx. Se permite tanto el uso de Verilog como VHDL como lenguajes de programaci´ on y la mezcla de los mismos (Xilinx, 2014). El sintetizador XST soporta los est´andares IEEE Std 1364-2001 y IEEE 1076-1993 de Verilog y VHDL respectivamente (Xilinx, 2014).

Yosys Yosys es una herramienta de c´odigo libre para sintetizar Verilog el cual posee una versi´ on estable para ser instalado en Linux (Clifford, 2013). Posee dos modos de uso, uno en el cual se pasan los par´ ametros a trav´es de la l´ınea de comandos de Linux y otro en el cual se ejecuta el programa y se introduce paso a paso los comandos para lograr una s´ıntesis completa (Yosys, 2014).

2.3

Herramientas de c´ odigo libre disponibles para la creaci´ on y el manejo de interfaces gr´ aficas

GTK+ GTK+ es un conjunto de herramientas de c´odigo abierto para crear interfaces gr´ aficas. Ofrece una gran cantidad de widgets, est´a escrito en el lenguaje de programaci´ on C y se puede utilizar como complemento en lenguajes de programaci´ on como C, C++, Java, Python, Perl, Ruby y m´ as (GTK-Team, 2014). Esta herramienta puede ser utilizada en los sistemas operativos Linux, Windows y Mac OSX (GTK-Team, 2014).

OpenGL OpenGL es una librer´ıa multilenguaje y multiplaforma para crear aplicaciones gr´ aficas en 2D y 3D. Se puede utilizar tanto en ambientes con Windows, Linux y Mac OSX. (OpenGL-Team, 2014).

2.3. Herramientas de c´odigo libre disponibles para la creaci´ on y el manejo de interfaces gr´ aficas 7

Qt Qt es un conjunto de herramientas de c´odigo abierto para crear interfaces gr´ aficas. Ofrece una gran cantidad de widgets, est´a escrito en el lenguaje de programaci´ on C++ y su programaci´ on es orientada a objetos (Qt-Team, 2014). Esta herramienta puede ser utilizada en distintos dispositivos y sistemas operativos, tales como Windows, Mac OSX, Linux, Symbian, Android, BlackBerry, iOS, WebOS, entre otros (Qt-Team, 2014).

3

Desarrollo

Este cap´ıtulo explica la elecci´ on de las herramientas a utilizar as´ı como la instalaci´ on de las mismas. Tambi´en se describen los pasos que se llevaron a cabo para lograr el producto final y las principales funciones que se utilizaron.

3.1

Elecci´ on de las herramientas a utilizar

Para llevar a cabo el proceso de s´ıntesis se escogi´ o la herramienta Yosys, debido a que est´a enfocada a su uso en Linux, posee una gu´ıa de instalaci´ on detallada, la documentaci´ on disponible es necesaria para sacar el m´ aximo provecho y posee la versatilidad de indicarle al sintetizador cuales compuertas se desean utilizar para llevar a cabo el proceso de s´ıntesis. GTK+2 se escogi´ o como herramienta para manejar la interfaz gr´ afica, esto debido a su compatibilidad con Linux y con el lenguaje de programaci´ on C, adem´ as por la amplia variedad de widgets que utiliza. Para complementar el uso de GTK+2 se utiliz´o la herramienta Glade, el cual es un entorno gr´ afico para la creaci´ on de interfaces gr´ aficas de una manera f´acil y r´apida. A continuaci´ on se presentan los pasos para llevar a cabo la instalaci´ on de las herramientas antes mencionadas (Yosys, GTK+2 y Glade) en el sistema operativo Linux, espec´ıficamente en Ubuntu 14.04.

Instalaci´ on de Yosys Como lo denota Yosys (2014), se deben llevar los pasos mostrados en el cuadro 3.1 para completar la instalaci´ on en Linux. Estos fueron utilizados en el ambiente Ubuntu 14.04. Cuadro 3.1: Pasos para la instalaci´ on de Yosys en Linux

sudo add-apt-repository ppa:saltmakrell/ppa sudo apt-get update sudo apt-get install yosys yosys-abc

9

10

3 Desarrollo Cuadro 3.2: Pasos para la instalaci´ on de GTK+ 2 en Linux

sudo apt-get install libgtk2.0-dev

Instalaci´ on de Glade La versi´ on instalada de Glade fue la 3.8.5, la cual es compatible con GTK+ 2. Esta versi´ on se encuentra disponible en el centro de software de Ubuntu, la cual se puede encontrar como “Glade Interface Designer (glade-gtk2)”. Una instalaci´ on alternativa es descargar el paquete y seguir los pasos que se detallan en la p´agina web del fabricante. (Ugarte, 2014).

Instalaci´ on de GTK+ 2 En el cuadro 3.2 se encuentran los pasos necesarios para llevar a cabo la instalaci´on de GTK+ 2 en Linux. Estos fueron utilizados en el ambiente Ubuntu 14.04. En la siguiente secci´ on se detallan los pasos necesarios para llevar a cabo el dise˜ no gr´ afico de la herramienta, as´ı como las funciones creadas para llevar a cabo funciones espec´ıficas del programa principal o del editor de texto.

3.2

Desarrollo de la herramienta

Para llevar a cabo el desarrollo del entorno gr´ afico se hizo uso de la herramienta Glade, la cual permite la creaci´ on de interfaces gr´ aficas de una manera f´acil y r´apida. A continuaci´ on se presenta una gu´ıa r´apida del uso de Glade para la creaci´ on de la interfaz r´ apida utilizada en el programa principal.

Glade: creaci´ on de la interfaz gr´ afica El primer paso al tener abierto el programa Glade es crear una ventana principal que contendr´ a todos los widgets necesarios, para lograrlo se selecciona el primer elemento de la subventana “Toplevels” llamado “Window”. En la figura 3.1 se observa el resultado obtenido al realizar este paso. El siguiente paso es dividir la ventana principal seg´ un las necesidades de la herramienta. Glade cuenta con varios tipos de contenedores, entre ellos cajas verticales, cajas horizontales o tablas. Para el programa en desarrollo se determin´o que la ventana principal debe contener 3 cajas verticales, para a˜ nadirlo, en la subventana “Containers” se

3.2. Desarrollo de la herramienta

11

Figura 3.1: Glade: Creaci´on de la ventana principal.

escogi´ o el widget “Vertical Box” y se determin´o el tama˜ no en tres. En la figura 3.2 se observa el resultado obtenido al realizar este paso.

Figura 3.2: Glade: Divisi´ on de la ventana principal. El siguiente paso es definir el contenido de cada subdivisi´ on de la ventana principal. En la primera se coloc´o un men´ u (en la subventana “Containers” el widget “Menu Bar”), en la segunda se coloc´o un divisor horizontal (en la subventana “Containers” el widget “Horizontal Box” de tama˜ no dos) y en la tercera una barra de estado (en la subventana “Control and Display” el widget “Status Bar” de tama˜ no tres). El men´ u se cre´ o con el objetivo de contener una serie de pesta˜ nas modificables en las cuales se pueden a˜ nadir todas las funciones necesarias del programa, el contenedor horizontal tiene el objetivo de albergar el editor de texto y el visualizador gr´ afico, por u ´ltimo, la barra de estado funciona como

12

3 Desarrollo

visualizador de se˜ nales. En la figura 3.3 se observa el resultado obtenido al realizar este paso.

Figura 3.3: Glade: Contenido de las divisiones de la ventana principal. Tanto el editor de texto como el visualizador gr´ afico deben contener opci´on de desplazamiento vertical y horizontal, para lograrlo se a˜ nadi´o una ventana de desplazamiento (en la subventana “Containers” el widget “Scrolled Window”) a ambos. Para completar el dise˜ no del editor de texto se a˜ nadi´o el widget visualizador de texto al campo correspondiente (en la subventana “Control and Display” el widget “Text View”). Para completar el visualizador gr´ afico se a˜ nadieron dos widgets: el primero habilita la visualizaci´ on de una imagen en una ventana de desplazamiento y el siguiente contiene la imagen (en la subventana “Containers” el widget “Viewport” y en la subventana “Control and Display” el widget “Image”). En la figura 3.4 se observa el resultado obtenido al realizar este paso.

Figura 3.4: Glade: Contenido del editor de texto y visualizador gr´ afico parte.

3.2. Desarrollo de la herramienta

13

En este punto se tiene el dise˜ no completo de la interfaz gr´ afica, el u ´ltimo paso es guardar con formato .glade la interfaz creada.

Programa principal Es necesaria la creaci´ on de un programa principal el cual integre todas las partes necesarias del programa. Para lograrlo se cre´ o un programa en el lenguaje de programaci´ on C, el cual permite el manejo de la librer´ıa GTK y la inclusi´on de archivos generados en Glade. Este programa principal contiene la inclusi´on de las librer´ıas necesarias (entre ellas la que permite el uso de GTK, la que permite el uso de las funciones b´asicas de C, la que permite el uso del manejo de errores y la que permite el uso de hilos de ejecuci´ on), el llamado a archivos que contienen funciones varias, la definici´on de variables, la inclusi´on de los archivos generados en Glade, la relaci´ on entre las variables declaradas en el programa principal y los widgets generados en Glade, y por u ´ltimo la definici´on del ciclo del principal. En el ap´endice A se encuentra el programa principal completo con todos los comandos necesarios para lograr lo que se describi´ o anteriormente. Adem´ as cada comando se encuentra debidamente comentado. Una vez que se comprob´ o el funcionamiento del programa principal y su interacci´ on con la interfaz creada en Glade, fue necesario definir las funciones que debe contener el men´ u de la interfaz gr´ afica. En la figura 3.5 se muestra el conjunto de opciones disponibles en el men´ u y sus respectivas funciones.

Figura 3.5: Men´ u, submen´ u y sus funciones. Para lograr lo mostrado en la figura 3.5 es necesario editar el men´ u que trae por defecto el widget en Glade. Como se muestra en la figura 3.6, se debe seleccionar el widget “menubar1”, presionar click derecho, seleccionar editar e ir a la pesta˜ na jerarqu´ıa. En la ventana mostrada en la figura 3.6 se puede modificar la jerarqu´ıa del men´ u, ya sea a˜ nadiendo m´ as pesta˜ nas o m´ as botones dentro de las pesta˜ nas existentes. En la figura 3.7 se muestra el producto final de la edici´on necesaria para llevar a cabo el proyecto.

14

3 Desarrollo

Figura 3.6: Edici´ on del men´ u.

Hasta el momento los botones dentro de las pesta˜ nas del men´ u son de poca ayuda debido a que no tienen se˜ nales asignadas. Para lograrlo es necesario a˜ nadir una funci´on que se llame una vez que se presione el bot´ on. En la figura 3.8 se muestran los pasos para lograrlo, primero se selecciona el bot´ on a conectar, en este caso “gtk-new”, luego en el campo de “activate” se coloca el nombre de la funci´on que se quiere llamar en el programa principal una vez que el bot´ on “gtk-new” sea presionado. Para facilitar la llamada a funciones es posible a˜ nadir atajos en el teclado para llamarlas en el programa principal. Al seleccionar un bot´on de alguna pesta˜ na, seleccionando la pesta˜ na “Common” y la opci´ on “Accelarators” se pueden a˜ nadir atajos a cualquier bot´ on, as´ı como se muestra en la figura 3.9. A continuaci´ on se muestra la descripci´ on de las funciones que realiza cada bot´ on incluido en el men´ u.

Funciones de los botones 1. Nuevo: Esta funci´on se encarga de limpiar el editor de texto y crear un archivo en blanco. Para lograrlo se realizan tres pasos, el primero es revisar si el archivo que se encuentra en el editor de texto est´a guardado o no, si lo est´a la funci´on procede sin solicitar nada al usuario, en cambio si el archivo no est´a guardado se brinda la posibilidad al usuario de escoger si desea guardarlo o no. El segundo paso es limpiar el contenido del editor de texto y por u ´ltimo se elimina el nombre del archivo, esto para no conservar los datos del archivo anterior. En el anexo A se muestra el c´odigo completo de la funci´on “save if modified”.

3.2. Desarrollo de la herramienta

15

Figura 3.7: Jerarqu´ıa del men´ u Cuadro 3.3: Funci´on para crear un archivo nuevo void n e w f i l e ( char ∗ fname ) { save if modified () ; g t k t e x t b u f f e r s e t t e x t ( b u f f e r , ” ” , −1) ; f i l e n a m e = NULL; }

En el cuadro 3.3 se muestran los comandos que se utilizaron para lograr lo que se describi´ o anteriormente. 2. Abrir: Esta funci´on se encarga de cargar al editor de texto un archivo guardado en cualquier directorio. Para lograrlo se realizan dos pasos, el primero es revisar si el archivo que se encuentra en el editor de texto est´a guardado o no, si lo est´a la funci´on procede sin solicitar nada al usuario, en cambio si

16

3 Desarrollo

Figura 3.8: Funciones y teclas de acceso r´apido Cuadro 3.4: Funci´on para abrir un archivo

void

f i l e o p e n ( GtkWindow ∗window , g p o i n t e r u s e r d a t a ) { save if modified () ; l o a d f i l e (NULL) ;

}

el archivo no est´a guardado se brinda la posibilidad al usuario de escoger si desea guardarlo o no. El segundo paso es escoger el archivo a abrir, para lograrlo se despliega una ventana que le permite al usuario explorar los directorios y escoger el archivo deseado. En el anexo A se muestran los c´odigos completos de las funciones “save if modified” y “load file”. En el cuadro 3.4 se muestran los comandos que se utilizaron para lograr lo que se describi´ o anteriormente. 3. Guardar:

3.2. Desarrollo de la herramienta

17

Figura 3.9: Men´ u, submen´ u y sus funciones. Cuadro 3.5: Funci´on para guardar un archivo void f i l e s a v e ( GtkWindow ∗window , g p o i n t e r u s e r d a t a ) { s a v e t o f i l e ( filename ) ; }

Esta funci´on se encarga de guardar en un archivo el contenido actual del editor de texto. Su algoritmo es el siguiente: si el archivo ha sido guardado en alg´ un punto del programa se almacena con el nombre utilizado anteriormente; si es la primera vez, se solicita al usuario un nombre para guardarlo. En el cuadro 3.5 se muestran los comandos que se utilizaron para lograr lo que se describi´ o anteriormente. La funci´on “save to file” se encarga de realizar la l´ ogica de solicitar o no al usuario un nombre para guardar el archivo, esto lo hace dependiendo del contenido de la variable “filename”. En el anexo A se muestra el c´odigo completo de la funci´on “save to file”. 4. Guardar como:

18

3 Desarrollo Cuadro 3.6: Funci´on para guardar un archivo con cierto nombre

void f i l e s a v e a s ( GtkWindow ∗window , g p o i n t e r u s e r d a t a ) { s a v e t o f i l e (NULL) ; }

Cuadro 3.7: Funci´on para cerrar el programa void o n w i n d o w 1 d e s t r o y ( GtkObject ∗ o b j e c t , g p o i n t e r u s e r d a t a ) { save if modified () ; e n d p r o c e s s=FALSE ; gtk main quit () ; }

Esta funci´on se encarga de guardar en un archivo el contenido actual del editor de texto. Es importante recalcar que al seleccionar esta opci´on siempre se solicita al usuario el nombre que se utilizar´a para guardar. En el cuadro 3.6 se muestran los comandos que se utilizaron para lograr lo que se describi´ o anteriormente. 5. Cerrar: Esta funci´on se encarga de verificar si el contenido actual del editor de texto est´a guardada o no antes de cerrar el programa. Si est´ a guardada se cierra el programa, si no lo est´a se da la posibilidad al usuario de guardar o no el contenido actual del editor de texto. En el cuadro 3.7 se muestran los comandos que se utilizaron para lograr lo que se describi´ o anteriormente. 6. Cortar: Esta funci´on se encarga de cortar la selecci´ on actual en el editor de texto. En el cuadro 3.8 se muestran los comandos que se utilizaron para lograr lo que se describi´ o anteriormente. 7. Copiar: Esta funci´on se encarga de copiar la selecci´ on actual en el editor de texto. En el cuadro 3.9 se muestran los comandos que se utilizaron para lograr lo que se describi´ o anteriormente.

3.2. Desarrollo de la herramienta

19

Cuadro 3.8: Funci´on para cortar la selecci´ on actual de texto void c u t ( GtkObject ∗ o b j e c t , g p o i n t e r u s e r d a t a ) { gtk text buffer cut clipboard ( buffer , gtk clipboard get ( s e l a t o m ) , TRUE) ; }

Cuadro 3.9: Funci´on para cortar la selecci´ on actual de texto void copy ( GtkObject ∗ o b j e c t , g p o i n t e r u s e r d a t a ) { gtk text buffer copy clipboard ( buffer , gtk clipboard get ( sel atom ) ) ; }

Cuadro 3.10: Funci´on para pegar el contenido almacenado por las funciones copiar o cortar void p a s t e ( GtkObject ∗ o b j e c t , g p o i n t e r u s e r d a t a ) { gtk text buffer paste clipboard ( buffer , gtk clipboard get ( s e l a t o m ) , NULL, TRUE) ; }

8. Pegar: Esta funci´on se encarga de pegar en la posici´on escogida el contenido almacenado por las funciones copiar o cortar. En el cuadro 3.10 se muestran los comandos que se utilizaron para lograr lo que se describi´o anteriormente. 9. Buscar: Esta funci´on se encarga de buscar cierto patr´on ingresado por el usuario en el editor. Para lograrlo se crea una subventana con tres elementos: un almacenador de texto donde el usuario ingresa lo que desea buscar, un bot´ on para buscar y un bot´ on para encontrar la siguiente aparici´on del patr´ on. Al seleccionar la funci´on buscar se llama a la funci´on “textfind”, la cual es la encargada de crear la nueva subventana y relacionar las se˜ nales de los

20

3 Desarrollo botones con las funciones“search button clicked”y“next button clicked”. El c´odigo completo de estas funciones se encuentra en el anexo A.

Figura 3.10: Ventana para buscar cierto patr´on en el editor de texto

10. Buscar y reemplazar: Esta funci´on se encarga de buscar y reemplazar cierto patr´ on ingresado por el usuario en el editor. Para lograrlo se crea una subventana con cuatro elementos: un almacenador de texto donde el usuario ingresa lo que desea reemplazar, un almacenador de texto donde el usuario ingresa por lo que quiere reemplazar,un bot´ on para buscar y un bot´ on para reemplazar. Al seleccionar la funci´on buscar se llama a la funci´on “text find replace”, la cual es la encargada de crear la nueva subventana y relacionar las sen ˜ales de los botones con las funciones “search button clicked” y “replace button clicked”. El c´odigo completo de estas funciones se encuentra en el anexo A.

Figura 3.11: Ventana para buscar y reemplazar cierto patr´on por otro en el editor de texto

11. Editar celdas: Esta funci´on se encarga de desplegar una subventana permitiendo al usuario agregar o eliminar celdas que se utilizar´an en el proceso de s´ıntesis de su dise˜ no. La ventana a desplegar es la que se muestra en la figura 3.12.

Figura 3.12: Ventana para modificar las celdas con las que se desea sintetizar

3.2. Desarrollo de la herramienta

21

El proceso de s´ıntesis utilizado por Yosys permite utilizar un archivo con las celdas deseables para crear el netlist. Al marcar o desmarcar las casillas mostradas, se a˜ nade o elimina el c´odigo de la compuerta en el archivo proporcionado a Yosys, permitiendo as´ı, llevar a cabo la s´ıntesis con las celdas que el usuario desee. 12. Acerca de: Esta funci´on se encarga de desplegar una subventana con la informaci´ on de la aplicaci´on. La ventana mostrada se muestra en la figura 3.13.

Figura 3.13: Ventana que muestra informaci´ on acerca del programa

Integraci´ on de Yosys al programa principal Para llevar a cabo la s´ıntesis en tiempo real, se utiliz´o un hilo que se llama cada cinco segundos. Este hilo es encargado de llamar la funci´on que realiza la s´ıntesis por medio de Yosys siempre y cuando el texto en el editor sea compilable. La funci´on del hilo se puede observar en el cuadro 3.11. En el cuadro 3.12 se muestran los comandos necesarios que se deben colocar en el programa principal para poder llamar el hilo. La funci´on “mostrar esquematico” se encarga de generar el comando que se env´ıa a Yosys para llevar a cabo la s´ıntesis del dise˜ no. El proceso consiste de los siguientes pasos: primero se crea un archivo temporal con lo que existe en el editor de texto, luego se genera el archivo con las celdas que el usuario desea utilizar para la s´ıntesis, a continuaci´ on se ejecuta el comando para realizar la s´ıntesis y por u ´ltimo se eval´ ua si la s´ıntesis se llev´ o a cabo de forma exitosa o no. En el cuadro 3.13 se observan los comandos para llevar a cabo los pasos antes descritos.

22

3 Desarrollo

Cuadro 3.11: Hilo encargado de llamar a la funci´on que realiza la s´ıntesis void ∗ f u n c i o n h i l o ( void ∗ arguments ) { while ( e n d p r o c e s s ) { mostrar esquematico () ; sleep (5) ; } return NULL; }

Cuadro 3.12: Comandos necesarios en el programa principal para llamar el hilo // Se d e f i n e h i l o pthread t simulacion ; g b o o l e a n e n d p r o c e s s = TRUE; // Se i n i c i o e l h i l o p t h r e a d c r e a t e (& s i m u l a c i o n , NULL, f u n c i o n h i l o , NULL) ;

3.2. Desarrollo de la herramienta

23

Cuadro 3.13: Funci´on encargada de realizar la s´ıntesis void m o s t r a r e s q u e m a t i c o ( ) { // Se c r e a a r c h i v o t e m p o r a l para g u a r d a r l o que c o n t i e n e e l e d i t o r de t e x t o s t r i n g fname = ”temp . v ” ; s a v e t o f i l e t e m p ( fname ) ; // Se g e n e r a comando para l l e v a r a cabo l a s i n t e s i s s t r i n g command ; command = ” y o s y s −s l i b f i l e s / y o s y s s c r i p t ” ; const char ∗ command final = command . c s t r ( ) ; // Se g e n e r a e l a r c h i v o con l a s c e l d a s que e l u s u a r i o d e s e a u t i l i z a r para l a s i n t e s i s c r e a t e l i b f i l e () ; // Se l l e v a a cabo l a s i n t e s i s i n t t e s t = system ( command final ) ; // Se e v a l u a l a s i n t e s i s i f ( t e s t !=0) { c o u t message ) ; } i f ( 0 == g t k b u i l d e r a d d f r o m f i l e ( b u i l d e r , ” r a d i o . g l a d e ” , &e r r ) ) { f p r i n t f ( s t d e r r , ” E r r o r adding b u i l d from f i l e . E r r o r : %s \n ” , e r r −>message ) ; } // Se e x t r a e l a v a r i a b l e window window = GTK WIDGET ( g t k b u i l d e r g e t o b j e c t ( b u i l d e r , ” window1 ”) ) ; childWindow = GTK WIDGET ( g t k b u i l d e r g e t o b j e c t ( b u i l d e r , ”c h ild w in d o w ”) ) ; // Se e x t r a e l a v a r i a b l e t e x t t e x t = GTK WIDGET ( g t k b u i l d e r g e t o b j e c t ( b u i l d e r , ” t e x t v i e w 1 ”) ) ; // Se e x t r a e l a v a r i a b l e image image = GTK WIDGET ( g t k b u i l d e r g e t o b j e c t ( b u i l d e r , ” image1 ”) ) ; // Se e x t r a e l a v a r i a b l e e v e n t b o x eventbox = GTK WIDGET ( g t k b u i l d e r g e t o b j e c t ( b u i l d e r , ” eventbox1 ”) ) ; // Se e x t r a e l a v a r i a b l e b u f f e r

A.2. Funci´on para cargar un archivo 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101

33

b u f f e r = g t k t e x t v i e w g e t b u f f e r (GTK TEXT VIEW ( t e x t ) ) ; // Se c o n e c t a n l a s s e n a l e s e n t r e b u i l d e r y b u f f e r gtk builder connect signals ( builder , buffer ) ; g t k b u i l d e r c o n n e c t s i g n a l s ( b u i l d e r , image ) ; g o b j e c t u n r e f (G OBJECT ( b u i l d e r ) ) ; g t k t e x t b u f f e r s e t t e x t ( b u f f e r , ” ” , −1) ; //En c a s o de que l a v e n t a n a s e ” d e s t r u y a ” s e s a l e de l a ventana g s i g n a l c o n n e c t ( window , ” d e s t r o y ” , G CALLBACK ( g t k m a i n q u i t ) , NULL) ;

// Conecto l a s e n a l de l a imagen con OpenCV // Imagen en b l a n c o i n i c i a l para e l e s q u e m a t i c o lienzo = Scalar (255 ,255 ,255) ; l i e n z o i p l = IplImage ( l i e n z o ) ; e s q u e m a t i c o = &l i e n z o i p l ;

// Conecto l a s s e n a l e s de d e t e c c i o n de mouse y muestra d e l esquematico 102 g s i g n a l c o n n e c t (G OBJECT ( eventbox ) , ” b u t t o n p r e s s e v e n t ” , G CALLBACK ( mouseClick ) , NULL) ; 103 g s i g n a l c o n n e c t (G OBJECT ( image ) , ” e x p o s e e v e n t ” , G CALLBACK ( e x p o s e e v e n t c a l l b a c k ) , NULL) ; 104 105 // Se muestra l a v e n t a n a 106 g t k w i d g e t s h o w ( window ) ; 107 108 // Limpio p o s i b l e s a r c h i v o s v i e j o s con e r r o r e s 109 // s y s t e m ( ”rm ˜ / . y o s y s s h o w . j p g y o s y s s h o w . j p g t e s t . v ”) ; 110 111 // I n i c i o e l t h r e a d de s i m u l a c i o n . 112 p t h r e a d c r e a t e (& s i m u l a c i o n , NULL, f u n c i o n p r u e b a h i l o , NULL) ; 113 114 // Se i n i c i a e l l o o p p r i n c i p a l 115 gtk main ( ) ; 116 117 return 0 ; 118 }

A.2

Funci´ on para cargar un archivo

1 // Funcion para c a r g a r un a r c h i v o en p a n t a l l a , e s t a f u n c i o n e s l l a m a d a por f i l e o p e n 2 void l o a d f i l e ( s t r i n g fname ) {

34 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41

A C´odigo // Puntero para manejar e l a r c h i v o que s e a b r i r a FILE ∗ f ; // I t e r a d o r e s para r e c o r r e r l o s a r c h i v o s a a b r i r GtkTextIter p ; GtkTextIter f i n a l ; // Se d e f i n e b u f f e r char f b u f [CHAR BUF ] ; // V a r i a b l e para almacenar e l tamano d e l a r c h i v o size t l ; // S i no e x i s t e nombre de a r c h i v o a a b r i r s e a b r e v e n t a n a para que e l u s u a r i o e s c o j a e l a r c h i v o a a b r i r i f ( fname==” ”) { // Se muestra v e n t a n a para i n t e r a c t u a r con u s u a r i o GtkWidget ∗ d i a l o g = g t k f i l e s e l e c t i o n n e w ( ”Open F i l e . . . ”) ; i n t r e s p = g t k d i a l o g r u n (GTK DIALOG( d i a l o g ) ) ; i f ( r e s p == GTK RESPONSE OK) { // Se i n g r e s a s i s e s e l e c c i o n a a r c h i v o a a b r i r fname = g s t r d u p ( g t k f i l e s e l e c t i o n g e t f i l e n a m e ( GTK FILE SELECTION( d i a l o g ) ) ) ; // fname c o n t i e n e e l a r c h i v o s e l e c c i o n a d o por e l usuario //A c o n t i n u a c i o n s e muestra en l a v e n t a n a p r i n c i p a l e l nombre d e l a r c h i v o que s e a b r i r a f i l e n a m e = fname ; g c h a r ∗wt = g s t r d u p p r i n t f ( ”TextView ( %s ) ” , fname . c str () ) ; g t k w i n d o w s e t t i t l e (GTK WINDOW( window ) , wt ) ; g f r e e ( wt ) ; //Ya s e e s c o g i o a r c h i v o por l o que s e c i e r r a d i a l o g o con e l u s u a r i o gtk widget destroy ( dialog ) ; } else { // S i e l u s u a r i o e s c o g e c a n c e l a r s e c i e r r a e l d i a l o g o y no s e cambia de nombre l a v e n t a n a p r i n c i p a l gtk widget destroy ( dialog ) ; return ; } } // Se i n c l u y e e x c e p c i o n s i e l a r c h i v o no s e puede a b r i r para lectura i f ( ! ( f = f o p e n ( fname . c s t r ( ) , ”r ”) ) ) { g p r i n t e r r ( ” %s : %s \n ” , fname . c s t r ( ) , g s t r e r r o r ( e r r n o ) )

42 43 ;

A.2. Funci´on para cargar un archivo 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64

35

return ; } // Se d e f i n e i n i c i o y f i n a l d e l b u f f e r , c o l o c a n d o l o s i t e r a d o r e s de p r i n c i p i o y t e r m i n o d e l b u f f e r a c t u a l g t k t e x t b u f f e r g e t s t a r t i t e r ( b u f f e r , &p ) ; g t k t e x t b u f f e r g e t e n d i t e r ( b u f f e r , &f i n a l ) ; // Se b o r r a c o n t e n i d o a c t u a l d e l b u f f e r g t k t e x t b u f f e r d e l e t e ( b u f f e r ,&p,& f i n a l ) ; // Se c o l o c a e l p u n t e r o o en l a primera p o s i c i o n d e l b u f f e r g t k t e x t b u f f e r g e t s t a r t i t e r ( b u f f e r , &p ) ; // Simpre que e l tamano d e l a r c h i v o s e a mayor que c e r o while ( ( l = f r e a d ( f b u f , 1 , s i z e o f ( f b u f ) , f ) ) > 0 ) { GError ∗ e r r = NULL; g s i z e br , bw ; gchar ∗ text ; // Se comprueba s i e l a r c h i v o e s t a en f o r m a t o UTF−8 i f ( ! ( t e x t = g l o c a l e t o u t f 8 ( f b u f , l , &br , &bw , &e r r ) ) ) {

65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84

g p r i n t e r r ( ” F i l e i s not i n UTF−8 f o r m a t : %s \n ” , e r r −>message ) ; g c l e a r e r r o r (& e r r ) ; filename = ”” ; g t k w i n d o w s e t t i t l e (GTK WINDOW( window ) , ”Text E d i t o r ( I n s e r t f i l e name ) ”) ; fclose ( f ) ; return ; } // S i e l a r c h i v o e s t a en f o r m a t o UTF−8 s e a s i g n a e l contenido al b u f f e r g t k t e x t b u f f e r i n s e r t ( b u f f e r , &p , t e x t , bw) ; g free ( text ) ; } // Se m o d i f i c a n a t r i b u t o s d e l b u f f e r g t k t e x t b u f f e r s e t m o d i f i e d ( b u f f e r , FALSE) ; g t k t e x t b u f f e r g e t s t a r t i t e r ( b u f f e r , &p ) ; g t k t e x t b u f f e r p l a c e c u r s o r ( b u f f e r , &p ) ; // Se v e r i f i c a n c o n d i c i o n e s de e r r o r if ( ferror ( f )) { g p r i n t e r r ( ” %s : %s \n ” , fname . c s t r ( ) , g s t r e r r o r ( e r r n o ) ) ;

85 86 87 88

fclose ( f ) ; return ; } i f ( f c l o s e ( f ) == EOF) {

36

A C´odigo

89

g p r i n t e r r ( ” %s : %s \n ” , fname . c s t r ( ) , g s t r e r r o r ( e r r n o ) ) ;

90 91 }

A.3

}

Funci´ on para guardar un archivo

1 // Funcion para g u a r d a r un a r c h i v o m o d i f i c a d o , e s t a f u n c i o n e s l l a m a d a por f i l e s a v e a s y f i l e s a v e 2 b o o l s a v e t o f i l e ( s t r i n g fname ) { 3 // Puntero para manejar e l a r c h i v o que s e g u a r d a r a 4 FILE ∗ f ; 5 i n t ok = TRUE; 6 7 // S i no e x i s t e nombre de a r c h i v o a g u a r d a r s e a b r e v e n t a n a para que e l u s u a r i o e s c o j a e l nombre d e l a r c h i v o para guardar 8 i f ( fname == ” ”) { 9 // Se muestra v e n t a n a para i n t e r a c c i o n con u s u a r i o 10 GtkWidget ∗ d i a l o g = g t k f i l e s e l e c t i o n n e w ( ”Save F i l e As . . . ”) ; 11 i n t r e s p = g t k d i a l o g r u n (GTK DIALOG( d i a l o g ) ) ; 12 i f ( r e s p == GTK RESPONSE OK) { 13 // Se i n g r e s a s i s e s e l e c c i o n a nombre d e l a r c h i v o a guardar 14 // Se c o l o c a en fname nombre e l e g i d o por e l u s u a r i o 15 fname = g s t r d u p ( g t k f i l e s e l e c t i o n g e t f i l e n a m e ( GTK FILE SELECTION( d i a l o g ) ) ) ; 16 17 //Ya s e e s c o g i o nombre de a r c h i v o a g u a r d a r por l o que s e c i e r r a d i a l o g o con e l u s u a r i o 18 gtk widget destroy ( dialog ) ; 19 } 20 else { 21 // S i e l u s u a r i o e s c o g e c a n c e l a r s e c i e r r a e l d i a l o g o y no s e cambia de nombre l a v e n t a n a p r i n c i p a l 22 gtk widget destroy ( dialog ) ; 23 return FALSE ; 24 } 25 } 26 27 // Se i n c l u y e e x c e p c i o n s i e l a r c h i v o no s e puede a b r i r para escritura 28 i f ( ! ( f = f o p e n ( fname . c s t r ( ) , ”w”) ) ) { // Error o p e n i n g file 29 g p r i n t e r r ( ” %s : %s \n ” , fname . c s t r ( ) , g s t r e r r o r ( e r r n o ) ) ; 30 ok = FALSE ; 31 }

A.3. Funci´on para guardar un archivo 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76

37

// S i s e puede g u a r d a r con e s e nombre s e hace l o s i g u i e n t e else { // I t e r a d o r e s para r e c o r r e r e l a r c h i v o a g u a r d a r G t k T e x t I t e r s t a r t , end , p ; // Se e x t r a e n l o s e x t r e m o s d e l b u f f e r g t k t e x t b u f f e r g e t b o u n d s (GTK TEXT BUFFER( b u f f e r ) , & s t a r t , &end ) ; // Se d e f i n e p u n t e r o que r e c o r r e r a e l b u f f e r en e l i n i c i o p = start ; // M i e n t r a s que l o s p u n t e r o s s t a r t y end no sean i g u a l e s while ( ! g t k t e x t i t e r e q u a l (& s t a r t , &end ) ) { // Se d e f i n e n v a r i a b l e s a u t i l i z a r g c h a r ∗ buf , ∗ f b u f ; g s i z e br , bw ; GError ∗ e r r = NULL; // Se r e c o r r e n CHAR BUF p o s i c i o n e s en e l b u f f e r , s e c o l o c a en e l p u n t e r o p l a p o s i c i o n en l a que queda g t k t e x t i t e r f o r w a r d c h a r s (&p , CHAR BUF) ; // Se c o l o c a en b u f e l c o n t e n i d o d e s d e s t a r t h a s t a p buf = g t k t e x t i t e r g e t s l i c e (& s t a r t , &p ) ; // Se c o n v i e r t e d e s d e u t f 8 f b u f = g l o c a l e f r o m u t f 8 ( buf , −1, &br , &bw , &e r r ) ; g f r e e ( buf ) ; // S i no hay nada en f b u f if ( ! fbuf ) { // Se imprime e r r o r , s e c o l o c a bandera en e r r o r y se s a l e d el while g p r i n t e r r ( ” F a i l e d UTF−8 t o l o c a l e c o n v e r s i o n : %s \ n ” , e r r −>message ) ; g c l e a r e r r o r (& e r r ) ; ok = FALSE ; break ; } // Se c o l o c a c o n t e n i d o de f b u f en f f w r i t e ( f b u f , bw , 1 , f ) ; g free ( fbuf ) ; // S i e x i s t e e r r o r con f s e imprime e r r o r , s e c o l o c a bandera de e r r o r y s e s a l e d e l w h i l e if ( ferror ( f )) { g p r i n t e r r ( ” %s : %s \n ” , fname . c s t r ( ) , g s t r e r r o r ( errno ) ) ; ok = FALSE ;

38

A C´odigo

77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105

break ; } // Se c o l o c a s t a r t en l a p o s i c i o n a c t u a l de p start = p; } // Se i n c l u y e e x c e p c i o n y s e c o l o c a bandera en e r r o r i f ( f c l o s e ( f ) == EOF) { g p r i n t e r r ( ” %s : %s \n ” , fname . c s t r ( ) , g s t r e r r o r ( errno ) ) ; ok = FALSE ; } } // t e r m i n a w h i l e // S i no e x i s t e e r r o r i f ( ok ) { g t k t e x t b u f f e r s e t m o d i f i e d ( b u f f e r , FALSE) ; // Se comprueba s i e l nombre a n t e r i o r e s i g u a l a l a c t u a l i f ( fname != f i l e n a m e ) { // S i e s d i s t i n t o s e cambia nombre en l a p a n t a l l a principal g c h a r ∗wt = g s t r d u p p r i n t f ( ”TextView ( %s ) ” , fname . c str () ) ; f i l e n a m e = fname ; g t k w i n d o w s e t t i t l e (GTK WINDOW( window ) , wt ) ; g f r e e ( wt ) ; } } return ok ; }

A.4

Funci´ on para guardar un archivo si se modific´ o

1 // Funcion que muestra en p a n t a l l a l a o p c i o n de g u a r d a r e l a r c h i v o a c t u a l s i e s t a m o d i f i c a d o con r e s p e c t o a l o r i g i n a l 2 b o o l s a v e i f m o d i f i e d ( void ) { 3 // Se d e f i n e n v a r i a b l e s 4 int resp ; 5 GtkWidget ∗ d i a l o g ; 6 7 // S i no hay d i f e r e n c i a e n t r e e l a r c h i v o a c t u a l y e l o r i g i n a l no s e hace nada 8 i f ( ! g t k t e x t b u f f e r g e t m o d i f i e d (GTK TEXT BUFFER( b u f f e r ) ) ) { 9 return TRUE;

A.5. Funciones para realizar b´ usquedas de cierto patr´on en el editor de texto 39 10 11 12 13 14

}

// S i e x i s t e d i f e r e n c i a s e hace l o s i g u i e n t e // Se muestra mensaje d i a l o g = g t k m e s s a g e d i a l o g n e w (GTK WINDOW( window ) , GTK DIALOG DESTROY WITH PARENT, GTK MESSAGE QUESTION, GTK BUTTONS NONE, ”El a r c h i v o que e s t a i n t e n t a n do c e r r a r o s i m u l a r no e s t a guardado . ¿Desea g u a r d a r l o ahora ? ”) ; 15 g t k d i a l o g a d d b u t t o n s (GTK DIALOG( d i a l o g ) , GTK STOCK YES, GTK RESPONSE YES, GTK STOCK NO, GTK RESPONSE NO, GTK STOCK CANCEL, GTK RESPONSE CANCEL, NULL) ; 16 17 // Se e x t r a e r e s p u e s t a d e l u s u a r i o 18 r e s p = g t k d i a l o g r u n (GTK DIALOG( d i a l o g ) ) ; 19 20 // Se e l i m i n a e l d i a l o g o y s e a n a l i z a r e s p u e s t a 21 gtk widget destroy ( dialog ) ; 22 switch ( r e s p ) { 23 case GTK RESPONSE YES : 24 return s a v e t o f i l e ( f i l e n a m e ) ; 25 case GTK RESPONSE NO: 26 return TRUE; 27 case GTK RESPONSE CANCEL: 28 case GTK RESPONSE DELETE EVENT: 29 return FALSE ; 30 default : 31 g p r i n t e r r ( ”E r r o r r e s p o n s e %d from d i a l o g \n ” , r e s p ) ; 32 return FALSE ; 33 } 34 }

A.5

Funciones para realizar b´ usquedas de cierto patr´ on en el editor de texto

1 // Funcion que b u s c a e l p a t r o n en c i e r t o t e x t o 2 void f i n d ( GtkTextView ∗ t e x t v i e w , const g c h a r ∗ t e x t , GtkTextIter ∗ i t e r ) { 3 // Se d e f i n e n l a s v a r i a b l e s a u t i l i z a r 4 G t k T e x t I t e r mstart , mend ; 5 GtkTextBuffer ∗ b u f f e r ; 6 b o o l found ; 7 8 // Se d e f i n e e l b u f f e r 9 b u f f e r = g t k t e x t v i e w g e t b u f f e r (GTK TEXT VIEW( t e x t v i e w ) ); 10 // Se r e a l i z a l a b u s q u e d a 11 found = g t k t e x t i t e r f o r w a r d s e a r c h ( i t e r , t e x t , f l a g s , & mstart , &mend , NULL) ;

40 12 13 14 15 16

A C´odigo

// Se a n a l i z a s i s e e n c o n t r o i f ( found ) { g t k t e x t b u f f e r s e l e c t r a n g e ( b u f f e r , &mstart , &mend ) ; g t k t e x t b u f f e r c r e a t e m a r k ( b u f f e r , ” l a s t p o s ” , &mend , FALSE) ; 17 } 18 } 19 20 // Funcion que s e l l a m a a l p r e s i o n a r e l b o t o n de b u s c a r siguiente aparicion 21 void n e x t b u t t o n c l i c k e d ( GtkWidget ∗ n e x t b u t t o n ) { 22 // Se d e f i n e n v a r i a b l e s a u t i l i z a r 23 GtkTextBuffer ∗ b u f f e r ; 24 GtkTextMark ∗ l a s t p o s ; 25 GtkTextIter i t e r ; 26 27 // Se c r e a b u f f e r d e l t e x t o d i s p o n i b l e en e l e d i t o r de t e x t o 28 b u f f e r = g t k t e x t v i e w g e t b u f f e r (GTK TEXT VIEW ( t e x t v i e w )); 29 // Se e x t r a e l a marca de l a u l t i m a b u s q u e d a 30 l a s t p o s = g t k t e x t b u f f e r g e t m a r k ( b u f f e r , ” l a s t p o s ”) ; 31 // Se i n i c i a l i z a i t e r con l a p o s i c i o n de l a s t p o s 32 g t k t e x t b u f f e r g e t i t e r a t m a r k ( b u f f e r , &i t e r , l a s t p o s ) ; 33 // Se r e a l i z a l a b u s q u e d a 34 f i n d (GTK TEXT VIEW ( t e x t v i e w ) , ( g c h a r ∗ ) g t k e n t r y g e t t e x t ( ( GtkEntry ∗ ) s e a r c h e n t r y ) , &i t e r ) ; 35 } 36 37 // Funcion que s e l l a m a a l p r e s i o n a r e l b o t o n de b u s c a r 38 void s e a r c h b u t t o n c l i c k e d ( GtkWidget ∗ s e a r c h b u t t o n ) { 39 // Se d e f i n e n v a r i a b l e s a u t i l i z a r 40 GtkTextBuffer ∗ b u f f e r ; 41 GtkTextIter i t e r ; 42 43 // Se c r e a e l b u f f e r con e l t e x t o p r e s e n t e 44 b u f f e r = g t k t e x t v i e w g e t b u f f e r (GTK TEXT VIEW( t e x t v i e w ) ) ; 45 g t k t e x t b u f f e r g e t s t a r t i t e r ( b u f f e r , &i t e r ) ; 46 // Se r e a l i z a l a b u s q u e d a 47 f i n d (GTK TEXT VIEW( t e x t v i e w ) , ( g c h a r ∗ ) g t k e n t r y g e t t e x t ( ( GtkEntry ∗ ) s e a r c h e n t r y ) ,& i t e r ) ; 48 } 49 50 // Funcion que s e l l a m a a l p r e s i o n a r e l b o t o n f i n d 51 extern ”C” void t e x t f i n d ( void ) { 52 // Se d e f i n e n v a r i a b l e s a u t i l i z a r 53 GtkWidget ∗ win ; 54 GtkWidget ∗ vbox ; 55 GtkWidget ∗ hbox ; 56 GtkWidget ∗ s e a r c h b u t t o n ;

A.6. Funciones para realizar b´ usqueda y reemplazo de cierto patr´on en el editor de texto 41 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73

GtkWidget ∗ n e x t b u t t o n ; // Se c r e a l a v e n t a n a win = gtk window new (GTK WINDOW TOPLEVEL) ; // Se d e f i n e n p a r a m e t r o s de l a nueva v e n t a n a vbox = gtk vbox new (FALSE, 2 ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( win ) , vbox ) ; hbox = gtk hbox new (FALSE, 2 ) ; g t k b o x p a c k s t a r t (GTK BOX ( vbox ) , hbox , FALSE, FALSE, 0 ) ; // Se d e f i n e l o que s e e n c u e n t r a d i s p o n i b l e en e l e d i t o r de texto text view = text ; // Se a g r e g a c a s i l l a para que e l u s u a r i o i n g r e s e l a b u s q u e d a deseada search entry = gtk entry new () ; g t k b o x p a c k s t a r t (GTK BOX ( hbox ) , s e a r c h e n t r y , TRUE, TRUE , 0) ;

74 75 76 77

// Se a g r e g a b o t o n para r e a l i z a r b u s q u e d a s e a r c h b u t t o n = g t k b u t t o n n e w w i t h l a b e l ( ”S e a r c h ”) ; g t k b o x p a c k s t a r t (GTK BOX ( hbox ) , s e a r c h b u t t o n , FALSE, FALSE, 0 ) ; 78 //Cada v e z que s e p r e s i o n e e s t e b o t o n s e l l a m a a l a f u n c i o n search button clicked 79 g s i g n a l c o n n e c t (G OBJECT ( s e a r c h b u t t o n ) , ” c l i c k e d ” , G CALLBACK ( s e a r c h b u t t o n c l i c k e d ) , NULL) ; 80 81 // Se a g r e g a b o t o n para r e a l i z a r l a s i g u i e n t e b u s q u e d a 82 n e x t b u t t o n = g t k b u t t o n n e w w i t h l a b e l ( ”Next ”) ; 83 g t k b o x p a c k s t a r t (GTK BOX ( hbox ) , n e x t b u t t o n , FALSE, FALSE, 0 ) ; 84 //Cada v e z que s e p r e s i o n e e s t e b o t o n s e l l a m a a l a f u n c i o n next button clicked 85 g s i g n a l c o n n e c t (G OBJECT ( n e x t b u t t o n ) , ” c l i c k e d ” , G CALLBACK ( n e x t b u t t o n c l i c k e d ) , NULL) ; 86 87 // Se muestra l a v e n t a n a c r e a d a 88 g t k w i d g e t s h o w a l l ( win ) ; 89 }

A.6

Funciones para realizar b´ usqueda y reemplazo de cierto patr´ on en el editor de texto

1 // Funcion para r e e m p l a z a r c i e r t o t e x t o por o t r o

42

A C´odigo

2 void r e p l a c e ( GtkTextView ∗ t e x t v i e w , const g c h a r ∗ t e x t , const gchar ∗ text1 , GtkTextIter ∗ i t e r ) { 3 // Se d e f i n e n l a s v a r i a b l e s a u t i l i z a r 4 G t k T e x t I t e r mstart , mend ; 5 GtkTextBuffer ∗ b u f f e r ; 6 g b o o l e a n found ; 7 8 // Se c r e a e l b u f f e r con e l t e x t o p r e s e n t e 9 b u f f e r = g t k t e x t v i e w g e t b u f f e r (GTK TEXT VIEW( t e x t v i e w ) ); 10 found = g t k t e x t i t e r f o r w a r d s e a r c h ( i t e r , t e x t , f l a g s , & mstart , &mend , NULL) ; 11 12 // Se a n a l i z a s i s e e n c o n t r o 13 i f ( found ) { 14 g t k t e x t b u f f e r s e l e c t r a n g e ( b u f f e r , &mstart , &mend ) ; 15 g t k t e x t b u f f e r c r e a t e m a r k ( b u f f e r , ” l a s t p o s ” , &mend , FALSE) ; 16 i n t l e n=s t r l e n ( t e x t 1 ) ; 17 g t k t e x t b u f f e r d e l e t e ( b u f f e r ,& mstart ,&mend ) ; 18 g t k t e x t b u f f e r i n s e r t ( b u f f e r ,& mstart , t e x t 1 , l e n ) ; 19 } 20 } 21 22 // Funcion que s e l l a m a a l p r e s i o n a r e l b o t o n r e p l a c e b u t t o n 23 void r e p l a c e b u t t o n c l i c k e d ( GtkWidget ∗ r e p l a c e b u t t o n ) { 24 // Se d e f i n e n v a r i a b l e s a u t i l i z a r 25 GtkTextBuffer ∗ b u f f e r ; 26 GtkTextIter i t e r ; 27 28 // Se c r e a e l b u f f e r con e l t e x t o p r e s e n t e 29 b u f f e r = g t k t e x t v i e w g e t b u f f e r (GTK TEXT VIEW( t e x t v i e w ) ) ; 30 g t k t e x t b u f f e r g e t s t a r t i t e r ( b u f f e r , &i t e r ) ; 31 32 // Se r e a l i z a e l r e e m p l a z o 33 r e p l a c e (GTK TEXT VIEW( t e x t v i e w ) , ( g c h a r ∗ ) g t k e n t r y g e t t e x t ( ( GtkEntry ∗ ) s e a r c h e n t r y ) , ( g c h a r ∗ ) g t k e n t r y g e t t e x t ( ( GtkEntry ∗ ) r e p l a c e e n t r y ) ,& i t e r ) ; 34 } 35 36 // Funcion que s e l l a m a a l a p r e t a r e l b o t o n b u s c a r y r e e m p l a z a r 37 extern ”C” void t e x t f i n d r e p l a c e ( void ) { 38 // Se d e f i n e n l a s v a r i a b l e s a u t i l i z a r 39 GtkWidget ∗ win ; 40 GtkWidget ∗ vbox ; 41 GtkWidget ∗ hbox ; 42 GtkWidget ∗ s e a r c h b u t t o n ; 43 GtkWidget ∗ r e p l a c e b u t t o n ; 44 45 // Se c r e a l a v e n t a n a

A.6. Funciones para realizar b´ usqueda y reemplazo de cierto patr´on en el editor de texto 43 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

win = gtk window new (GTK WINDOW TOPLEVEL) ; // Se d e f i n e n p a r a m e t r o s de l a nueva v e n t a n a vbox = gtk vbox new (FALSE, 2 ) ; g t k c o n t a i n e r a d d (GTK CONTAINER ( win ) , vbox ) ; hbox = gtk hbox new (FALSE, 2 ) ; g t k b o x p a c k s t a r t (GTK BOX ( vbox ) , hbox , FALSE, FALSE, 0 ) ; // Se d e f i n e l o que s e e n c u e n t r a d i s p o n i b l e en e l e d i t o r de texto text view = text ; // Se a g r e g a c a s i l l a para que e l u s u a r i o i n g r e s e l a b u s q u e d a deseada search entry = gtk entry new () ; g t k b o x p a c k s t a r t (GTK BOX ( hbox ) , s e a r c h e n t r y , TRUE, TRUE , 0) ;

// Se a g r e g a c a s i l l a para que e l u s u a r i o i n g r e s e por l o que se quiere reemplazar 62 r ep la c e en t r y = gtk entry new () ; 63 g t k b o x p a c k s t a r t (GTK BOX ( hbox ) , r e p l a c e e n t r y , TRUE, TRUE, 0 ) ; 64 65 // Se a g r e g a b o t o n para r e a l i z a r b u s q u e d a 66 s e a r c h b u t t o n = g t k b u t t o n n e w w i t h l a b e l ( ”S e a r c h ”) ; 67 g t k b o x p a c k s t a r t (GTK BOX ( hbox ) , s e a r c h b u t t o n , FALSE, FALSE, 0 ) ; 68 //Cada v e z que s e p r e s i o n e e s t e b o t o n s e l l a m a a l a f u n c i o n search button clicked 69 g s i g n a l c o n n e c t (G OBJECT ( s e a r c h b u t t o n ) , ” c l i c k e d ” , G CALLBACK ( s e a r c h b u t t o n c l i c k e d ) , NULL) ; 70 71 // Se a g r e g a b o t o n para r e a l i z a r e l r e e m p l a z o 72 r e p l a c e b u t t o n = g t k b u t t o n n e w w i t h l a b e l ( ”R e p l a c e ”) ; 73 g t k b o x p a c k s t a r t (GTK BOX ( hbox ) , r e p l a c e b u t t o n , FALSE, FALSE, 0 ) ; 74 //Cada v e z que s e p r e s i o n e e s t e b o t o n s e l l a m a a l a f u n c i o n replace button clicked 75 g s i g n a l c o n n e c t (G OBJECT ( r e p l a c e b u t t o n ) , ” c l i c k e d ” , G CALLBACK ( r e p l a c e b u t t o n c l i c k e d ) , NULL) ; 76 77 // Se muestra l a v e n t a n a c r e a d a 78 g t k w i d g e t s h o w a l l ( win ) ; 79 }

B

Netlist

B.1

Netlist de un contador de 4 bits

/∗ Generated by Yosys 0 . 4 ( g i t sha1 d5aa0ee , g c c 4.8.2 −19 ubuntu1 − O2 −f s t a c k −p r o t e c t o r −fPIC −Os ) ∗/ ( ∗ s r c = ”temp . v : 1 ” ∗ ) module c o u n t e r ( c l k , r s t , en , count ) ; ( ∗ s r c = ”temp . v : 3 ” ∗ ) input c l k ; ( ∗ s r c = ”temp . v : 3 ” ∗ ) input r s t ; ( ∗ s r c = ”temp . v : 3 ” ∗ ) input en ; ( ∗ s r c = ”temp . v : 4 ” ∗ ) output [ 3 : 0 ] count ; reg [ 3 : 0 ] count ; ( ∗ s r c = ”temp . v : 6 ” ∗ ) wire [ 3 : 0 ] 0 0 ; wire 0 1 ; wire 0 2 ; wire 0 3 ; wire 0 4 ; wire 0 5 ; wire 0 6 ; wire 0 7 ; wire 0 8 ; wire 0 9 ; wire 1 0 ; wire 1 1 ; wire 1 2 ; wire 1 3 ; wire 1 4 ; wire 1 5 ; wire 1 6 ; wire 1 7 ; wire 1 8 ; wire 1 9 ; wire 2 0 ; wire 2 1 ; wire 2 2 ; wire 2 3 ; wire 2 4 ; wire 2 5 ;

45

46 NOT 2 6 ( .A( en ) , .Y( 0 3 ) ); NOT 2 7 ( .A( count [ 0 ] ) , .Y( 0 1 ) ); NOT 2 8 ( .A( count [ 2 ] ) , .Y( 0 2 ) ); NOR 2 9 ( .A( 0 5 ) , .Y( 0 6 ) , . B( 0 1 ) ); NOR 3 0 ( .A( 0 4 ) , .Y( 0 5 ) , . B( c l k ) ); NOR 3 1 ( .A( 0 3 ) , .Y( 0 4 ) , . B( 0 2 ) ); NOT 3 2 ( .A( r s t ) , .Y( 0 7 ) ); NAND 3 3 ( .A( 0 5 ) , .Y( 0 8 ) , . B( 0 1 ) ); NAND 3 4 ( .A( 0 8 ) , .Y( 0 9 ) , . B( 0 7 ) ); NOR 3 5 ( .A( 0 9 ) , .Y( 0 0 [ 0 ] ) , . B( 0 6 ) ); NOR 3 6 ( .A( 0 6 ) , .Y( 1 0 ) , . B( count [ 1 ] ) );

B Netlist

B.1. Netlist de un contador de 4 bits NOT 3 7 ( .A( c l k ) , .Y( 1 1 ) ); NAND 3 8 ( .A( en ) , .Y( 1 2 ) , . B( count [ 2 ] ) ); NAND 3 9 ( .A( 1 2 ) , .Y( 1 3 ) , . B( 1 1 ) ); NOT 4 0 ( .A( count [ 1 ] ) , .Y( 1 4 ) ); NOR 4 1 ( .A( 1 4 ) , .Y( 1 5 ) , . B( 0 1 ) ); NAND 4 2 ( .A( 1 5 ) , .Y( 1 6 ) , . B( 1 3 ) ); NOR 4 3 ( .A( 2 0 ) , .Y( 2 3 ) , . B( count [ 3 ] ) ); NAND 4 4 ( .A( 2 5 ) , .Y( 2 4 ) , . B( 0 7 ) ); always @( posedge count [ 0 ]

Get in touch

Social

© Copyright 2013 - 2024 MYDOKUMENT.COM - All rights reserved.