Manual del Usuario de LogisimLogisim es una herramienta de libre distribución (¡free-ware!) de diseño y simulación de circuitos lógicos digitales. Su intuitiva interfaz y su sencillo simulador permiten aprender con facilidad los conceptos básicos relacionados con la lógica de los circuitos digitales. Con la capacidad de construir grandes circuitos a partir de otros más simples, Logisim puede ser utilizado para el diseño completo de CPUs con propósitos educativos. Logisim es utilizado en universidades a lo largo y ancho del mundo con diferentes propósitos, entre los que se incluyen: Un módulo de educación general de introducción a la informática. Una unidad en cursos de nivel de segundo año en organización de ordenadores. Un semestre completo en cursos de alto nivel de arquitectura de ordenadores. El Manual Del Usuario de Logisim, que estás leyendo ahora, es la referencia oficial para las características de Logisim. En primer lugar están unas secciones encaminadas a introducir las partes más importantes de Logsim. Estas secciones han sido escritas, leyéndolas de principio a fin, especialmente para aprender acerca de las características más importantes de Logisim. Tutorial: primeros pasos con Logisim Librerías y atributos Subcircuitos Haces de cables Análisis combinacional Las secciones restantes son un grupo más diverso de explicaciones y materiales de referencia acerca de algunos recovecos de Logisim. Referencia del Menú Componentes de memoria Registro Preferencias de aplicación Opciones de proyecto Propagación de valores Librerías JAR Acerca del programa Tutorial: Primeros pasos con Logisim http://www.cburch.com/logisim/es/docs.html ¡Bienvenidos a Losgisim! Logisim permite diseñar y simular circuitos digitales. Está pensado como una herramienta educativa que ayuda a entender cómo funcionan los circuitos digitales. Para practicar un poco usando Logisim, construiremos un circuito XOR - un circuito que toma dos entradas (que llamaremos x e y) y que tiene como salida 0 si las dos entradas son iguales y 1 si son distintas. La siguiente tabla de verdad lo ilustra. Se puede diseñar tal circuito sobre el papel. Pero no por estar en el papel significa que esté bien. Para verificar el nuestro trabajo, lo dibujaremos en Logisim y lo testearemos. Además como utilidad añadida tendremos un circuito que seguramente tendrá mejor aspecto que el dibujado a mano. ¡Disfruta la construcción del circuito! Paso 0: Orientándose Cuando empieces con Logisim verás una ventana similar a la siguiente. Si usas un sistema diferente algunos detalles podrían ser estrechamente diferentes. Logisim está dividido en tres partes: el panel del explorador, la tabla de atributos y el lienzo o la pizarra. Sobre estas partes están la barra de herramientas y la barra de menú. Podemos prescindir del panel del explorador y de la tabla de atributos por el momento. No las usaremos en este tutorial, y puedes ignorarlas simplemente. Además, la barra de menú es muy intuitiva. Eso deja la barra de herramientas y el lienzo. El lienzo es dónde dibujarás tu circuito y la barra de herramientas contiene todo lo necesario para llevar a cabo esta tarea. Paso 1: Añadiendo puertas Recordemos el circuito que íbamos a dibujar con Logisim. Construir un circuito es más fácil insertando las puertas primero a modo de esqueleto para más tarde añadir el cableado al circuito. Lo primero que vamos a hacer es añadir dos puertas AND. Pincha sobre el botón AND en la barra de herramientas ( , el penúltimo botón de la barra de herramientas). Después pincha en el área de edición, lienzo, justo donde quieras que vayan las puertas AND. Asegúrate de dejar espacio de sobra para lo que habrá que incluir a la izquierda. Hay que fijarse que los cinco puntos a la izquierda de la puerta AND son los lugares en donde se pueden conectar los cables. Para el caso sólo utilizaremos dos entradas para nuestro circuito XOR, pero para otros circuitos, tener más de dos entradas en las puertas AND puede resultar muy útil. También deberías emplazar un pin de salida ( ) cerca de las salidas de la puerta OR. (Otra vez. o el izquierdo mientras pulsas la tecla Ctrl. En el ejemplo para conectar el pin de entrada superior con las puertas NOT y AND se añaden tres cables diferentes. Entonces comienza a arrastrar el ratón. Paso 2: Añadiendo cables Una vez que tengas todos los componentes necesarios en el lienzo. y sitúa los pins abajo. . Los cables en Logisim deben ser horizontales o verticales. También puedes reordenar las cosas utilizando la herramienta ( ). entonces puedes pulsar el botón derecho del ratón. Elige Borrar para deshacerte del elemento. Ahora queremos añadir dos entradas x e y al esquema. Primero pincha sobre el botón OR ( Luego selecciona la puerta NOT ( ). algo que más tarde nos ahorrará el tener que pintar una línea de cable para unirlas. con el botón izquierdo pulsado. después pincha dónde quieras. Selecciona la herramienta para añadir cable ( ).Ahora añade las otras puertas. estás listo para para empezar a añadir el cableado. aunque se deja algo de espacio entre la salida de la puerta OR y los pines de salida. Selecciona el pin de entrada ( ). sobre uno de los elementos para ver un menú desplegable. desde un punto a otro del lienzo y aparecerá un cable uniendo los dos puntos. Si decides que no te gusta el lugar en el que has puesto alguno de los elementos. Se puede dejar un pequeño espacio entre las puertas NOT y AND aunque también es posible dejarlas pegadas. ) y pon dos de ellas en el lienzo. tú podrías elegir pegarlos directamente). El azul en Logisim indica que el valor en ese punto es desconocido. Estos incluye la señalización de la conexión entre cables con un círculo justo sobre la intersección de los mismos. Esto no es un problema por el momento. y así debe ser. en este caso el pin de entrada. ningún cable podrá estar ni azul ni gris. A medida que vayas haciendo conexiones verás que los puntos van cambiando del azul al verde claro u oscuro. pero si quieres enseñar tu circuito a alguien (como un profesor). y el gris indica que el cable no está conectado a nada. Logisim dibuja pequeños puntos en los componentes para indicar dónde deberían conectarse los cables. Pero una vez que tu circuito esté acabado. . que pulsar dónde quieres que vaya el texto. (Las patas desconectadas. Así la etiqueta se moverá con el componente.Logisim conecta los cables a las puertas y entre ellos automáticamente.) Puedes hacer lo mismo con el pin de salida. O también puedes simplemente pulsar y escribir en cualquier otro lado para añadir una etiqueta allí. entonces algo va mal. Selecciona la herramienta de texto ( ). (Es mejor que pulsar directamente sobre el componente.) Si aún tienes algún cable azul o gris cuando creas que ya todo debería estar conectado. Es importante que se conecten los cables en los lugares adecuados. todos los cables insertados deberían mostrarse verde clarito u oscuro (casi negro). A medida que vayas dibujando cables. de las puertas OR y AND permanecerán azules. Puedes pulsar en un pin de entrada y escribir algo para asociarle una etiqueta. en ese caso poner algunas etiquetas ayudará a entender el propósito de las diferentes partes de tu circuito. que no se utilizan. Una vez que tengas todos los cables conectados. podrías encontrarte con algunos de color azul o gris. Paso 3: Añadiendo texto No es necesario añadir comentarios al circuito para que funcione. su valor conmutará. . Cuando cambies el valor de entrada. podemos cambiar el valor del pin de entrada inferior. Echemos un vistazo donde estábamos. Además puedes ver que el valor de salida ha cambiado a 1.Paso 4: Testeando el circuito El paso final es probar el circuito para asegurarnos de que realmente hace lo que queríamos. selecciona la herramienta de cambio ( ) y empieza a cambiar los pines de entrada pulsando sobre ellos. Esto significa que el circuito tiene como salida un 0 cuando ambas entradas están a 0. Logisim te mostrará que valor viaja a través de un cable pintándolo de verde muy claro para indicar un 1 o verde oscuro (casi negro) para indicar un 0. Cada vez que pulses sobre un pin de entrada. Hay que fijarse en que los pines de entrada contienen 0s al igual que el pin de salida. Logisim ya está simulando el circuito. Ahora para seleccionar otra combinación de entrada. Por ejemplo. se pueden verificar las otras dos filas. . tienes que hacer doble clic sobre la carpeta correspondiente. entonces deberías navegar por el resto de la ayuda para ver todo lo que puedes hacer. Si quieres crear circuitos con características más sofisticadas. Logisim es un programa poderoso que te permite crear y probar circuitos de gran tamaño. Cambiando los valores de entrada. se examinará como utilizar dos zonas de la consola de Logisim: el panel explorador y la tabla de atributos. Debajo. puedes salvar o imprimir el circuito. Si todas concuerdan. se ha abierto la librería de Puertas y se ha seleccionado la herramienta NAND en ella.Hasta aquí. El panel explorador La tabla de atributos Atributos de herramienta El panel explorador Las Librerías contienen componentes que se pueden usar en los circuitos. entonces esto está listo: ¡El circuito funciona! Para guardar el trabajo realizado. este tutorial paso a paso muestra lo más simple. Puedes ver que ahora que Logisim está preparado para añadir puertas NAND en el circuito. donde también se puede salir del programa. y las salidas (0 y 1) son concuerdan con lo deseado. Se muestran como carpetas en el panel explorador. para tener acceso a los componentes de una librería. Esto se puede llevar a cabo desde el menú Archivo. se han probado las dos primeras filas de la tabla de verdad. pero ¿Por qué dejarlo ahora? Ahora que has acabado con el tutorial puedes practicar con Logisim creando tus propios circuitos. Librerías y Atributos En esta sección. Aparecerá una ventana de diálogo que te permitirá elegir las librerías que quieras añadir. Puedes descargarte librerías que otros hayan escrito o puedes crear las tuyas propias tal y como se describe en la sección Librerías JAR de esta guía. pero los componentes puenden ser mucho más elegantes. incluyendo los atributos y la interacción con los usuarios. La mayor parte de las librerías. Puedes cargar tantas librerías como necesites. Plexores entonces podrás añadir a tus circuitos multiplexores. y luego te pedirá que escribas un nombre de clase. por ejemplo. Para eliminar una librería. La tabla de atributos Muchos de componentes tienen atributos.. desde el menú de Proyecto. Una librería técnicamente contiene herramientas no componentes. selecciona Descargar Librería.. . contienen sólo herramientas para añadir componentes individuales: todas las librerías incorporadas excepto la librería de Base son de este tipo. al submenú Cargar Librería. Desarrollar una Librería JAR es mucho más complejo que desarrollar una librería Logisim. Cuando se cargue una librería JAR. vete al menú de Proyecto. se incluyen automáticamente las librerías de Base y de Puertas. y otras herramientas que no se corresponden directamente con componentes individuales. la Herramienta de Selección ( ). puedes ver que Logisim tiene tres categorías de librerías. que aparezcan la barra de herramientas o que estén asociados a algún botón del ratón. Éstas están documentadas en la Referencia de las Librerías... sin embargo. Las librerías incorporadas (excepto la librería Base) fueron escritas utilizando la misma API que las librerías JAR pueden utilizar. en la librería Base encontrarás la Herramienta de Cambio ( ). así ellas demuestran el nivel de funcionalidad que se puede conseguir con las librerías JAR. y elige Librería Incorporada. Cuando creas un proyecto. Librerías incorporadas Built-in libraries son librerías que son distribuidas con Logisim. Logisim te protegerá de un intento de eliminación de una librería que contenga componentes utilizados en algún circuito. Puedes desarrollar un conjunto de circuitos en un proyecto (algo que se explica en la sección de Subcircuitos de esta guía) y después utilizar ese grupo de circuitos como una librería para otros proyectos. Librerías JAR son librerías que han sido desarrolladas en Java pero que no se distribuyen con Logisim. Se eliges. Este nombre de clase debería ser proporcionado por el que te hiciera llegar el archivo JAR. que no son más que propiedades para configurar el comportamiento o la forma en la que aparece el componente. Librerías Logisim son proyectos hechos con Logisim y guardados en el disco.. te darás cuenta de que no había necesidad de desarrollar el circuito XOR que se creó en el tutorial. Así.Si te fijas entre los elementos seleccionables en la librería de puertas. En el submenú de Cargar Librería. La tabla de atributos sirve para ver y mostrar los valores de los atributos de un componente. Logisim te pedirá que selecciones el archivo JAR correspondiente. Pero Logisim incluye otras librerías: Para cargar una. demultiplexores y decodificadores. Para seleccionar los atributos del componente que se quiere ver. Cuando se selecciona una herramienta. en el caso del atributo de la Fuente del Etiquetado. Algún valor de los atributos de algún componente no se puede modificar. Fíjate en el la línea oval azul claro que rodea al pin de entrada. manipulando el componente con la herramienta de Cambio ( mostrarán los atributos de ese componente. y elegir Mostrar Atributos en el menú desplegable. Para modificar el valor de un atributo. aparecerá un cuadro de diálogo para seleccionar el nuevo tipo de fuente.) ) o con la herramienta de Texto ( ) también se La captura de pantalla de abajo muestra cómo aparecen las cosas al seleccionar el input superior del circuito XOR y desplazar el cuadro de los atributos hacia abajo para ver el atributo de la Fuente del Etiquetado. o el izquierdo mientras pulsas Ctrl. pero algunos atributos (como la Etiqueta) te permitirán editar su valor como un campo de texto. La interfaz para modificar el atributo dependerá del tipo de atributo que estés cambiando. haz click sobre el componente utilizando la herramienta de Selección ( ). Cada componente tiene un conjunto de atributos diferentes. . Además. Atributos de herramienta Toda herramienta que permita añadir componentes al circuito tiene también un conjunto de atributos. haz clic en el icono correspondiente de la barra de herramientas (o en el panel explorador). Ya hemos visto que el atributo de Tamaño de Puerta de una puerta AND no es editable. Si quieres crear una puerta AND de un tamaño diferente. Logisim cambiará la tabla de atributos para mostrar los atributos de la herramienta. puedes consultar la documentación adecuada en la Referencia de las Librerías. que son aplicados a los componentes que crea la herramienta. entonces necesitarás cambiar los atributos de la herramienta (del elemento de la librería). Por ejemplo. y cambia su atributo Tamaño de Puerta. supongamos que se quiere crear una puerta AND más pequeña. Pero el atributo de Tamaño de Puerta es editable para la herramienta de puerta AND: Para ver y editar este atributo. para saber lo que significan. mientras que otros (como la Posición de la Etiqueta) un menú desplegable en el que seleccionar el valor correspondiente. haz clic simplemente en el valor. Un ejemplo es el atributo Tamaño de Puerta de la puerta AND: Al crear una puerta AND. aunque los atributos de los componentes puedan cambiar más tarde sin que esto afecte a los atributos de la herramienta. algo que comentaremos en el siguiente paso. se llama aureola y incica de que componente son los atributos que se están mostrando. (También puedes pulsar el botón derecho del ratón. su tamaño está prefijado. Las herramientas de la barra de herramientas tienen un conjunto de atributos guardado aparte del que tienen las correspondientes herramientas en el panel explorador. (Si eliges sustituir el número de entradas a 3. el pin de entrada y el pin de salida en la barra de herramientas por defecto son instancias de la herramienta Pin.Ahora se pueden borrar las puertas AND existentes y sustituirlas por dos nuevas puertas AND. la puerta AND no tendría prolongación vertical en el lado izquierdo de la puerta. Así. cuyo icono está orientado de la misma forma que señala su atributo. más estrechas. Pero en ese caso también tendrías que recablear el circuito para que los cables hiciesen conexión en el sitio adecuado de la parte izquierda de la puerta. de la librería Base. la herramienta AND del panel explorador continuará creando puertas AND anchas a no ser que cambies también sus atributos. aunque se cambie la herramienta AND de la barra de herramientas para crear puertas AND estrechas. en su lugar. Un ejemplo es la herramienta del Pin. En esta ocasión las puertas serán estrechas. pero sus tres atributos son diferentes.) Para algunas herramientas. el icono representa alguno de sus atributos. Subcircuitos . De hecho. El icono para la herramienta Pin está dibujado como un círculo o un cuadrado dependiendo del valor del su atributo ¿Salida? Logisim además proporciona una forma sencilla de cambiar el atributo de Orientación que controla la dirección en la que los componentes se orientan: Pulsando las teclas de las flechas mientras una herramienta está seleccionada cambia automáticamente la dirección del componente. el nombre del circuito en uso también aparece en la barra superior que contiene el título de la ventana. "main".A medida que construyas circuitos más y más complejos." Después de añadir el circuito. por defecto). método o procedimiento según el programa) . función. querrás desarrollar circuitos más sencillos que a su vez puedan ser utilizados en circuitos de mayor tamaño. En Logisim este tipo de circuitos. El concepto de subcircuito es análogo al concepto en la programación informática. En el panel explorador. pero es sencillo añadir más: Seleccionar Añadir Circuito. Supóngase que se quiere construir un multiplexor 1x2 con el nombre "1x2 MUX. Después de editar el circuito para obtener un multiplexor 1x2. Si estás familiarizado con la programación informática.. En su forma más simple. y escribir un nombre para el nuevo circuito que quieres crear. y para facilitar la búsqueda de errores. Creando circuitos Usando subcircuitos Depuración de subcircuitos Librerías de Logisim Creando circuitos Cualquier proyecto de Logisim es también una librería de circuitos. . Logisim tendrá este aspecto. cada proyecto solamente posee un circuito (llamado "main". para ahorrarse el esfuerzo de definir la misma cosa varias veces. principal. reciben el nombre de subcircuitos. ahora puedes ver que el proyecto contiene dos circuitos. y "1x2 MUX." Logisim dibuja una lupa sobre el circuito que está siendo mostrado. entiendes lo que es el concepto de subprograma (algo que recibe el nombre de subrutina. y es utilizado con los mismos propósitos: Para separar un gran trabajo en pequeñas partes más abordables por separado. que pueden ser utilizados en otros de mayor tamaño. se puede utilizar el siguiente circuito. en el menú de Proyecto.. " Para añadir los multiplexores 1x2 in el circuito. y posteriormente se pueden añadir copias del mismo. se hace un sólo clic sobre el circuito 1x2 MUX en el panel explorador para seleccionarlo como una herramienta. . Si haces doble clic sobre el circuito 1x2 MUX en el panel explorador. el cual se llamaría "2x4 MUX.Usando subcircuitos Ahora supongamos que queremos construir un multiplexor 2x4 a partir del multiplexor 1x2. estaremos en una situación como la siguiente. entonces el lienzo cambiará su contenido para pasar a editar el circuito 1x2 MUX. Después de crear el circuito. Por supuesto. se crearía primero un nuevo circuito. haciendo clic sobre el lienzo. representadas como cajas. puedes deshabilitarlos desde la Pestaña del Lienzo en la ventana de las opciones de proyecto.) Otros componentes también mostrarán las aclaraciones (tips): Por ejemplo. cada una dibujada como una caja con sus pines de entrada/salida a lo largo de su borde. . Los dos pines en el lado izquierdo (oeste) de la caja se corresponden con los dos pines que están orientados al este (atributo de orientación en la tabla de atributos de los pines de entrada). en este caso sobre el uno de los pines (Si encuentras molestos estos mensajes de aclaración. para algunos de los pines de la librería biestables. de ayuda. si se detiene el ratón un rato sobre alguno de los pines se explicará para que sirve. su orden se correspondería con el mismo que esté presente en el subcircuito de izquierda a derecha. y el pin de la parte de abajo (sur) de la caja se corresponde con el pin que está orientado al norte en el circuito 1x2 MUX. (Si hubiese varios pines en la parte superior (norte) o inferior (sur) de la caja. entonces Logisim mostrará esas etiquetas en un texto de aclaración (tip) que no es más que una caja de texto temporal que se muestra cuando el puntero del ratón se detiene lo suficiente sobre el elemento que interese.Para el multiplexor 2x4 se usan tres copias del multiplexor 1x2. Los pines de la caja se corresponden con los pines de entrada (inputs) y con los pines de salida (outputs) en el circuito del multiplexor 1x2. el pin de la parte derecha (este) de la caja se corresponde con el pin que está orientado al oeste en el circuito 1x2 MUX (que en este caso es un pin de salida).) Si los pines del subcircuito tienen etiquetas asociadas. El orden de los dos pines en la parte izquierda de la caja se corresponde con la misma disposición de arriba a abajo que se aparece en el subcircuito. Algunos de los chips manufacturados tienen pines que pueden ser de entrada o de salida dependiendo de la situación. Logisim mantendrá una información de estado diferente para todos los subcircuitos que aparezcan en un circuito. Ahora que se ha definido el multiplexor 2x4.aunque ¡no permitirá anidar un circuito en sí mismo! Nota: No existe ningún problema en editar un circuito que esté siendo utilizado como subcircuito. . probablemente encontrarás errores. Para concretar cuál es el problema. echar un vistazo a lo que está ocurriendo con los subcircuitos puede ayudar. o moviéndolos) también modificará los pines en los circuitos que lo contengan. no podrás utilizar ese tipo de chips con Logisim. lienzo. si cambias algún pin en un circuito. Después de seleccionar esto. Luego selecciona la opción Vista.Todos los pines de un circuito tienen que ser de entrada o de salida. Sin embargo. Por ejemplo. eliminando. de hecho. Logisim no impone límites a la anidación de circuitos . hay que ser conscientes de que cualquier cambio a los pines de un circuito (añadiendo. Depurando subcircuitos A medida que vayas probando circuitos de mayor tamaño. entonces cada biestable del subcircuito tendrá su propio valor cuando se simule el circuito de mayor tamaño. esto es algo bastante común. también tendrás que editar todos los circuitos que lo usen como subcircuito. una vez más es posible utilizarlo en otros circuitos. Así. si un circuito contiene un biestable. y ese circuito está siendo usado como subcircuito varias veces. Puedes hacer esto desde la vista del circuito total si haces saltar el menú desplegable del subcircuito (recuerda: haz clic con el botón derecho del ratón sobre el componente o clic con el botón izquierdo mientras pulsas la tecla Ctrl). la vista de la pizarra. se cambiará por la del subcircuito. la mayoría de los cables llevan sólo un bit. (Si intentas modificar el valor de un pin utilizando la Herramienta de Cambio. puedes ver circuitos y modificar sus estados. Lo único que tienes que hacer es salvar el proyecto en un archivo y cargar la librería desde otro proyecto. El circuito principal es el primero que se muestra cuando abres el proyecto. el otro proyecto debería cargar automáticamente la versión modificada de inmediato. pero si esto no ocurre. Con una Librería de Logisim que esté cargada. tendrás que abrirlo de forma separada con Logisim. Mientras que en el subcircuito puedes cambiarlo como quieras.Fíjate en que los valores de los pines del subcircuito concuerdan con los valores que le están llegando desde el circuito que lo contiene. El nombre por defecto del circuito principal ("main") no tiene importancia y puedes cambiarle el nombre o borrar dicho circuito si así lo deseas. responder que Sí (Aceptar) separará el estado visto en el subcircuito del visto desde el circuito contenedor. Logisim lanzará un cuadro de diálogo para preguntarte si quieres crear un nuevo estado o no. Todos los circuitos definidos en el primer proyecto estarán entonces disponibles como subcircuitos para el segundo proyecto. Cada proyecto tiene un circuito "main" (principal) asignado. mientras que responder que No (Cancelar) no permitirá el cambio de valor del pin. pero Logisim también te permite crear cables que contienen varios bits. puedes hacer clic con el botón derecho sobre la carpeta de la librería correspondiente en el panel explorador y seleccionar Recargar Librería. Si quieres modificar un circuito que esté en una librería de Logisim que esté cargada. Creando haces Separadores Colores de los cables . pero Logisim no te dejará modificarlos. Haces de cables En los circuitos simples de Logisim. Esta característica te permite reutilizar componentes en varios proyectos y compartir tus componentes favoritos con tus amigos (o estudiantes). cualquier cambio a los valores de los pins será propagado al circuito contenedor.) Librerías de Logisim Todo proyecto de Logisim es de forma automática una librería que puede ser cargada en otros proyectos de Logisim. Tan pronto como lo salves. algo que puede cambiar seleccionando el circuito que esté abierto como principal utilizando la opción Seleccionar Como Circuito Principal en el menú de Proyecto. Es fácil ver el valor que contiene un cable de un sólo bits porque Logisim pinta el cable verde claro u oscuro dependiendo de su valor. como se indica en los atributos de la puerta AND mostrada. Logisim no muestra los valores en el caso de cables multibit.Creando cables Los pines de entrada y salida de los componentes tienen un número de bits asociado. se adapta al número de bits del pin al que es conectado. . se ha cambiado el atributo Número de Bits del pin de salida a 1 y Logisim muestra un error indicando que no puede conectar un punto de un bit con uno de tres. cada pin de entrada tiene su atributo llamado Número De Bits configurado para recibir tres bits. Hay que fijarse en que los pines de entrada y de salida tienen tres bits y en que los bits del pin de salida son el AND lógico de sus correspondientes en los pines de entrada. Si un cable conecta dos componentes que están utilizando un número de bits diferente. el número de bits de los cables no tiene que estar definido. Sin embargo. Éstos serán simplemente negros. Muchos de los componentes incorporados en Logisim poseen atributos que permiten la elección del número de bits de los pines de entrada y salida. La captura de pantalla de abajo muestra un circuito que realiza el AND de dos cables de entrada que tienen tres bits. Sin embargo podrás consultar el valor de un cable utilizando la herramienta de Cambio ( ) sobre él. En los componentes todos las entradas y las salidas deben de tener definidos su número de bits. Debajo. Logisim mostrará un error de "Ancho incompatible" e indicará los puntos donde se ocasiona el problema en naranja. Los cables que conectan puntos incompatibles (pintados de color naranja) no tienen ningún valor. Este método de consulta es muy útil cuando se depuran circuitos que utilicen haces de circuitos. Separadores Cuando trabajes con valores multibit, con frecuencia querrás dirigir algunos de esos bits a sitios diferentes. La herramienta Separador ( ) te lo permite. Por ejemplo, supón que se quiere construir un circuito con un pin de entrada de cuatro bits y se pretende obtener el producto lógico de sus dos bits más significativos con sus dos bits menos significativos. Habrá un valor de entrada de cuatro bits el cual será necesario dividir en dos valores de dos bits cada uno. Para hacer esto en el circuito de abajo, se ha utilizado un Separador. En este ejemplo, el separador divide un valor de entrada en varios valores de salida. Pero los separadores también pueden realizar la operación contraria, juntar varios valores en uno sólo. De hecho, no son direccionales: Pueden ser utilizados en un sentido y más tarde en otro, e incluso en ambos sentidos al mismo tiempo, como en el ejemplo de abajo en el que dos de los valores tienen su pin de entrada a la derecha mientras que el valor del medio lo tiene a la izquierda. La clave para entender los separadores está en sus atributos. De ahora en adelante, el término extremo separado hará referencia a uno de los múltiples cables de un lado, mientras que el término extremo combinado hará referencia al cable simple del lado contrario. El atributo de Orientación indica la posición de la parte múltiple con respeto a la simple. Cuando el separador esté en el lienzo ya no podrá cambiarse. El atributo Fan Out especifica el número de bifurcaciones de la parte múltiple. Esto tampoco podrá cambiarse. El atributo del Número de Bits indica el número de bits del extremo simple. El atributo Bit x asocia cada uno de los bits con una bifurcación. Si varios bits se corresponden con la misma bifurcación, entonces su orden relativo será el mismo que el orden relativo que tengan en el extremo simple del separador. Los separadores de Logisim no pueden tener un bit del extremo simple en más de una bifurcación. Hay que fijarse en que cualquier cambio a los atributos Fan Out o Número de Bits reseteará todos los atributos Bit x de tal forma que los bits del extremo simple del separador quedarán repartidos equitativamente entre las bifurcaciones. Colores de los cables En este punto se explicará el significado los colores que puede adoptar un cable en Logisim. El siguiente circuito los muestra todos a la vez. Gris: El número de bits del cable es desconocido. Esto ocurre porque el cable aún no está asociado con la entrada o salida de ningún componente. (Todas las entradas o salidas de todos los componentes tienen un número de bits definido.) Azul: El cable es de un sólo bit pero su valor es desconocido. En el ejemplo de arriba, esto ocurre porque la entrada de la puerta NOT no está determinada y así tampoco lo estará su salida. Verde oscuro: El cable sólo contiene un bit y su valor es 0. Verde claro: El cable sólo contiene un bit y su valor es 1. Negro: El cable contiene varios bits. Puede que todos o algunos de los bits no estén especificados. Rojo: El cable contiene un valor erróneo. Esto normalmente pasa porque hay valores conflictivos en el cable. (La otra posibilidad sería que el componente de una librería estuviese programado para dar un valor erróneo por algún motivo; en las librerías incorporadas de Logisim los valores de error sólo se dan cuando propagan otros valores de error) En el ejemplo de arriba, se tiene una pin de entrada plantando un 0 en el cable y otro pin de entrada plantando un 1 lo que causa un conflicto. Los cables de más de un bit se mostrarán rojos en cuanto uno de sus bits tenga un valor erróneo. Naranja: Los componentes asociados al cable no concuerdan en el número de bits. Un cable naranja es como si estuviese cortado: No lleva transmite valor alguno entre los componentes que conecta. Análisis combinacional Todo circuito pertenece a una de las siguientes dos categorías: En un circuito combinacional, todas las salidas del circuito son combinación de valores actualizados de las entradas, mientras que en un circuito secuencial, algunas de las salidas dependerán de valores pasados de las entradas (secuencia de las entradas a través del tiempo). La categoría de los circuitos combinacionales es la más simple de las dos. Hay tres técnicas que son las más comúnmente utilizadas para representar el comportamiento de estos circuitos. circuitos lógicos expresiones booleanas, que permiten hacer una representación algebraica de cómo funciona el circuito y cada salida con un pin de salida. rompiendo los nudos de izquierda a derecha. cada carácter debe ser una letra o un dígito. tablas de verdad. lo que tendrá lugar leyendo las salidas para todas las combinaciones de entradas. ya que se tendría que abordar el Problema Halting. aunque no determinarán el comportamiento del circuito con exactitud. ¡Los espacios no estarán permitidos!) Logisim intentará utilizar las etiquetas que tengan los pines. y. Si no has accedido a la ventana antes. Para que el análisis vaya bien. tal vez inesperado. pero no lo hace.) Editando la tabla de verdad . entonces Logisim intentará sacar un nombre válido a partir de la etiqueta siempre que sea posible. el sistema de Análisis Combinacional no debería usarse siempre: ¡Úsalo sólo cuando el circuito que estés analizando sea combinacional de forma unívoca! Logisim hará un cambio. Empezando el Análisis Combinacional Editando la tabla de verdad Creando expresiones Generando un circuito Empezando el Análisis Combinacional A la mayor parte del módulo del Análisis Combinacional se accede a través de una ventana simple con ese nombre que te permite ver tablas de verdad y expresiones booleanas. Así. A través del menú de Proyecto Desde una ventana en la que tengas estés editando un circuito. los cambios que se le hagan al circuito no estarán reflejados en el circuito. Logisim intentará en primer lugar determinar las expresiones booleanas correspondientes a las puertas del circuito. (Lo mismo ocurrirá para las salidas. como veremos más tarde. al circuito original: El sistema de Análisis Combinacional necesita que todas las entradas y salidas tengan nombre único de acuerdo con las reglas para los identificadores en Java. Limitaciones Logisim no intentará la detección de circuitos secuenciales: Si intentas analizar un circuito secuencial. podrías esperar que Logisim hiciese algún intento. que muestran las salidas para todas las combinaciones de entrada El módulo del Análisis Combinacional de Logisim te permite ir de cualquiera de estas representaciones a las otras. y Logisim derivará las expresiones basándose en la tabla de verdad. como buscar biestables o ciclos en los cables. Antes de abrir la ventana. Pero si el circuito utiliza algún circuito que no sea una puerta (como un multiplexor). ni tampoco la operación contraria. se calculará la tabla de verdad y las expresiones booleanas correspondientes. se puede sobrescribir un circuito con otro circuito que corresponda con lo que aparezca en la ventana de Análisis Combinacional. puedes indicar a Logisim que analice el circuito en uso seleccionando la opción Analizar Circuito en el menú de Proyecto. detectar circuitos secuenciales es probablemente imposible. y el primer caracter tiene que ser una letra. y luego usará nombres de una lista por defecto si las etiquetas no existen. Sólo un análisis combinacional existe en Logisim. o si el circuito tiene más de 100 niveles de profundidad (algo improbable). Naturalmente. (Más o menos. la ventana que has abierto no representará ningún circuito. Si alguna de las etiquetas no cumple la regla de los identificadores en Java. cada entrada debe estar ligada a un pin de entrada. puedes analizar un circuito otra vez. y la ventana de Análisis Combinacional aparecerá.) Así. Logisim calcula las expresiones Booleanas y la tabla de verdad correspondientes al circuito para que las veas. El orden de las entradas en la tabla de verdad concordará con el orden en el circuito original de arriba a abajo. Logisim solamente analizará circuitos con 8 bits de cada tipo (de entrada y salida) como máximo. En caso contrario se mostrará un mensaje de error y la ventana no se abrirá. no hay relación entre la ventana de Análisis Combinacional y el circuito. Es una forma cómoda de crear circuitos a partir de un puñado de bits de entrada y salida. La ventana se puede abrir de dos maneras. Después de analizar un circuito. no importa cuántos proyectos estén abiertos. entonces saltará un cuadro de diálogo diciéndote que no ha sido posible derivar las expresiones booleanas. Al calcular las expresiones booleanas correspondientes a un circuito. No hay forma de tener abiertas más de una ventana de análisis al mismo tiempo. (De hecho. A través del menú de Ventana Selecciona Análisis combinacional. Naturalmente. También puedes reordenar las entradas (algo que afecta al orden de las columnas en la tabla de verdad y en el circuito generado) seleccionando una entrada y usando los botones Mover Arriba y Mover Abajo. y ya no habrá forma de volver a la situación anterior. Salidas y Tabla. Las pestañas Entradas y Salidas La pestaña de Entradas te permite ver y editar la lista de entradas. Como veremos en el siguiente apartado. Si la tabla de verdad está basada en un circuito existente.o el circuito parecía estar oscilando. También se puede navegar y editar la tabla de verdad usando el teclado. Para eliminar una entrada. Creando expresiones . Al sostener el ratón sobre la salida con el problema se debería mostrar un texto de aclaración comentando el tipo de error. es decir. te encontrarás que contiene cinco pestañas. Entradas. La próxima página de la guía describe las otras dos pestañas. 1 y x (que representa "no importa". El portapapeles se puede transferir a cualquier aplicación que soporte texto delimitado por tabulación (como por ejemplo una hoja de cálculo). Esta página describe las tres primeras pestañas. los valores que no importan aportarán algo de flexibilidad a la hora de calcular las expresiones minimizadas. La pestaña de Salidas funciona exactamente de la misma forma que la pestaña de Entradas. o el valor de salida era erróneo (lo que sería marcado por Logisim en el circuito con un cable rojo). puede que veas cuadrados rosas en las columnas de las salidas con el símbolo "!!" en ellas. selecciona la entrada en la lista y simplemente pulsa Eliminar. Los valores cambiarán entre 0. seleccionándola en la lista. entrarás en el ciclo 0-1-x. Todas las acciones afectan inmediatamente a la tabla de verdad. La pestaña Tabla El único elemento de la pestaña Tabla es la tabla de verdad. También puedes darle otro nombre a una entrada que ya exista. que esa variable puede tomar cualquier valor). escribe un nombre en el campo situado en la parte baja del panel y haz clic en Añadir.Al abrir la ventana de Análisis Combinacional. para después escribir el nuevo nombre y luego hacer clic en Cambiar Nombre. Y puedes copiar y pegar valores usando el portapapeles. Una vez que hagas clic sobre la salida con el error (sobre el símbolo "!!"). un diagrama en el orden convencional. con las entradas en las columnas de la izquierda y las salidas en las columnas de la derecha. Puedes editar los valores que aparecen en las columnas de salida haciendo clic en los valores correspondientes. Expresión y Minimizado. Éstas corresponden a errores ocurridos al calcular el valor de salida para esa fila . excepto que naturalmente la lista utilizada será la de las salidas. Para añadir nuevas entradas. especificando la relación de cada salida con su entrada. una expresión puede contener cualquiera de los operadores lógicos de Java. Hay que fijarse en que la expresión que hayas editado se perderá si más tarde modificas la tabla de verdad. Además de la multiplicación y la suma que representan al AND y al OR. Puedes ver y editar las expresiones utilizando las dos últimas pestañas de la ventana. La pestaña de Expresión La pestaña de Expresión te permite ver y editar la expresión actualizada que esté asociada con cada variable de salida.Para cada variable de salida. Justo debajo el selector aparecerá la expresión definida en una particular notación. y un NOT está representado por una barra horizontal encima de la parte a la que afecta. las expresiones booleanas son especialmente útiles porque la ventana de Análisis Combinacional las utilizará cuando se le demande la construcción de un circuito correspondiente con el estado actual. Puedes seleccionar la expresión de la salida que quieres ver y editar usando el selector "Salida". la pestaña de Expresión y la pestaña de Minimizado. . y el botón de Recargar restaura en el panel la expresión actual. Debajo estará la misma expresión pero definida con caracteres ASCII. Puedes editar la expresión en el panel de texto y hacer click en el botón de Intro para que el cambio tenga efecto. un NOT está representado con el gurruñito ('~').la columna relevante de la tabla de verdad y una expresión booleana . Aquí. Puedes editar tanto la tabla de verdad como la expresión. así como las palabras que las representan. Como se verá en el siguiente apartado. highest precedence lowest precedence ~ ! NOT (none) & && AND ^ XOR + | || OR Los siguientes ejemplos son todas representaciones válidas de la misma expresión. un AND está representado por un producto. El botón de Limpiar vacía el panel de texto. haciendo esto también actualizarás la tabla de verdad en función de la nueva expresión. donde un OR está representado como una suma. También podrías mezclar los operadores. la que no hayas tocado será modificada automáticamente de forma que no se pierda la consistencia entre ambas. la ventana de Análisis Combinacional mantiene dos estructuras . digamos. pero se puede aplicar independientemente de número de variables de entrada. ya que editar la tabla de verdad lleva consigo utilizar la expresión para la columna modificada. pero aun así se calculará la expresión minimizada. La pestaña Minimizado La última pestaña muestra una expresión de suma de productos que se corresponde con una columna de la tabla de verdad. Esto generalmente no será necesario. Se puede seleccionar cual es la expresión minimizada de salida que se quiere consultar con el selector de arriba ("Salida"). esta puede ser una buena opción para encontrar y cambiarse a la expresión minimizada. la tabla de Karnaugh no aparecerá. (De hecho. Debajo estará la expresión minimizada que se corresponda con la tabla. y.) El botón de Fijar Como Expresión te permite seleccionar la expresión minimizada como la expresión que le corresponde a la variable. con el mismo formato que en la pestaña de expresiones. colocar paréntesis en una secuencia de ANDs (o ORs o XORs) no sirve para nada. Si hay más de cuatro entradas. Generando un circuito El botón de Crear Circuito construirá un circuito cuyas puertas se correspondan con las últimas expresiones escogidas para cada salida. Si hay cuatro entradas o menos. Las entradas y salidas del circuito se mostrarán en el mismo orden de arriba a abajo tal y como aparezcan en las pestañas de Entradas y Salidas. . se mostrará debajo del selector la tabla de Karnaugh correspondiente a la variable seleccionada. Puedes hacer clic en la tabla de karnaugh para cambiar los valores correspondientes de la tabla de verdad. pero si lo que has introducido una expresión a través de la pestaña de Expresión. (Logisim utiliza el algoritmo de Quine-Mc Cluskey para calcular la expresión minimizada. La tabla de Karnaugh también mostrará los términos seleccionados para la expresión minimizada con unos rectángulos redondeados de colores. de hecho. cuando Logisim cree un circuito a partir de una expresión ignorará dichos paréntesis). Esto es equivalente a la tabla de Karnaugh.~a (b + c) !a && (b || c) NOT a AND (b OR c) En general. una de las aplicaciones del Análisis Combinacional de Logisim es mejorar los dibujos de los circuitos que hayan sido definidos de una forma. El circuito definido por Logisim tendrá un buen aspecto. preguntando al usuario en qué archivo lo quiere guardar. Esta opción estará desactivada en el caso de que alguna de las salidas contenga XORs. y. aparecerá un cuadro de diálogo que te preguntará para qué proyecto es el circuito y que nombre quieres que reciba. Para estas ventanas el menú de Proyecto estará desactivado. opción que especifica que todas las puertas utilizadas sean de únicamente dos entradas (por supuesto. Guarda el proyecto que se está viendo. Cerrar Cierra todas las ventanas asociadas con el proyecto que se está viendo. Guardar Como. opción que todas las puertas que se utilicen sean NAND. El proyecto será inicialmente una copia de la plantilla seleccionada por defecto. Abrir. Guardar Guarda el proyecto que se está viendo. El menú Archivo El menú Editar El menú Proyecto El menú Simular Los menús Ventana y Ayuda Muchos elementos de los menús están relacionados con un proyecto que esté abierto.. sobrescribiendo lo que estaba en el archivo correspondiente con anterioridad.. Puedes seleccionar ambas opciones si lo que quieres es que sólo de usen puertas NAND con dos entradas. Si escribes el nombre de un circuito que ya exista.. Abre un archivo existente como un proyecto en una ventana nueva. Pero algunas ventanas de Logisim (en concreto la ventana de Análisis Combinacional y la ventana de Preferencias de Aplicación) no están asociadas con proyectos. Aun así. pero aunque podría haber algunos problemas de conversión para circuitos complejos.0X calcula las posiciones de los subcircuitos de una forma distinta.0X de Logisim.. Puedes abrir archivos salvados en una Versión 1. en consecuencia. entonces ese circuito será reemplazado (aunque antes de que esto ocurra Logisim te preguntará si realmente quieres que esto suceda. . Cuando haces clic en el botón de Crear Circuito.desordenada. Referencia del Menú Esta sección explica los seis menús que acompañan a cualquier ventana principal de Logisim. las puertas NOT constituirán una excepción).) El cuadro de diálogo que salta al pulsar Crear Circuito incluye dos opciones: Sólo Puertas De Dos Entradas. El menú Archivo Nuevo Abre un nuevo proyecto en una ventana nueva. tendrás recorrer todos los circuitos y colocar los subcircuitos en sus posiciones adecuadas. con el formato automático no se mostrarán los detalles estructurales que mostraría un circuito dibujado manualmente. y Sólo Puertas NAND. Logisim 1. Logisim no puede construir un circuito con sólo puertas NAND a partir de una expresión que contenga operadores XOR. ) Logisim imprimirá un circuito por página. .) Factor de Escala: Puedes escalar las imágenes con esta barra de desplazamiento.. (En sistemas Mac OS. Manda el circuito o los circuitos a una impresora. Circuitos: Una lista en la que se pueden seleccionar los circuitos (uno o más) que se van a imprimir. Cabecera: El texto centrado que debería aparecer en la parte superior de cada página. así no será necesario escalarlos cuando entren en una página al haberlos girado 90 grados... Abajo se describe el cuadro de diálogo para la configuración. Logisim mostrará un cuadro de diálogo para la selección de archivo. Si has seleccionado un circuito. Si el circuito es demasiado grande. Si seleccionaste varios circuitos. Vista de Impresión: Si utilizar la " vista de impresión" al exportar los circuitos. (Los circuitos vacíos no se mostrarán. Muestra la ventana con las preferencias de aplicación. Logisim nombrará las imágenes en función del nombre de los circuitos (por ejemplo: main. Logisim girará 90 grados los circuitos que no entren en una página..) Configurando Exportar Cuando seleccionas Exportar Como GIF. Crea una imagen o unas imágenes GIF que se correspondan con los circuitos. Después de hacer clic en OK. Vista De La Impresora: Si utilizar la "vista de impresión'' al imprimir los circuitos. Circuitos: Una lista en la que puedes seleccionar los circuitos (uno o más) que deberían ser exportados a achivos GIF.. (En sistemas Mac OS..gif). selecciona el archivo en donde quieres guardar el GIF. (Los circuitos vacíos no se mostrarán para elegir.. Logisim muestra un cuadro de diálogo para configurar lo que va a ser imprimido. esto aparecerá en el menú Logisim. Abajo se describe el cuadro de diálogo para la configuración. Se harán las siguientes sustituciones en el texto.Exportar Como GIF.. esto aparecerá en el menú Logisim. Configurando Imprimir Cuando seleccionas Imprimir. la imagen será escalada para que quepa.) Salir Cierra todos los proyectos abiertos y sale de Logisim.. Logisim muestra un cuadro de diálogo con tres opciones.. %n Nombre del circuito %p Número de página %P Total páginas %% Tanto por ciento ('%') Rotar Para Encajar: Si está seleccionado... selecciona un directorio en el que guardar los archivos. Imprimir. Preferencias. incluyendo otras copias lanzadas de Logisim. El menú Editar Deshacer XX Deshace los cambios más recientes. Logisim debe empalmar inmediatamente cualquier cable tan pronto como esté en el circuito. Sin embargo. Descarga librería del circuito. así.. Seleccionar Todo Selecciona todos los componentes del circuito que esté siendo visualizado. cortar/copiar/pegar no funcionarán con otras aplicaciones. Eliminar Elimina del circuito los componentes seleccionados. Hay que fijarse en que esto no incluye cambios relativos a las modificaciones de los estados del circuito (como las modificaciones llevadas a cabo por la Herramienta de Cambio ( )). Añade un nuevo circuito al proyecto que se esté utilizando.. Logisim pedirá un nombre para el circuito.Después de hacer clic en Aceptar. si tienes varios proyectos abiertos bajo el control del mismo proceso de Logisim. No pasarán a formar parte del circuito de una forma definitiva hasta que cambies o muevas la selección de forma que los componentes ya no estén en ella. y el cambio inherente al proceso de empalme podría estar en contra de tus deseos. que no podrá coincidir con otros nombres de los circuitos que pertenezcan a ese mismo proyecto. Descargar Librería. Logisim mostrará la página de configuración estándar antes de imprimir los circuitos. este proceso de empalme cambia los cables que ya están en el circuito. La razón de este extraño comportamiento es ésta: Para que haya consistencia con su otro comportamiento.. incluyendo librerías que contengan componentes que aparezcan en otros circuitos del . Puedes cargar tres tipos distintos de librerías. entonces deberías ser capaz de cortar/copiar/pegar entre ellos. como se explica en otro lugar de la Guía de Usuario. El menú Proyecto Añadir Circuito. cuando pasas cables del portapapeles puede interesarte situarlos en una posición diferente a la inicial. Logisim no te permitirá descargar librerías que estén siendo utilizadas. Sin embargo.. Nota: El portapapeles de Logisim es administrado de forma independiente del portapapeles del sistema operativo. Copiar Copia los componentes seleccionados en el portapapeles de Logisim. Cortar Lleva los componentes seleccionados del circuito al portapapeles de Logsim. Cargar Librería Carga una librería en el proyecto. (Consultar la nota debajo del elemento de menú Cortar) Cuando pegues los componentes se representarán en gris claro. (Consultar la nota debajo del elemento de menú Cortar) Pegar Pega los componentes del portapales de Logisim en el lugar seleccionado. Volver A Cuando profundices en un estado de un subcircuito. los circuitos visualizados estarán "vivos". Abre la ventana de Opciones de Proyecto.. Cambia el nombre del circuito que se esté visualizando. Opciones. . Renombrar Circuito. Logisim te prevendrá de eliminar un circuito que esté siendo utilizado como subcircuito o de eliminar el único circuito de un proyecto. Esto puede ser útil cuando quieras ir viendo paso a paso los cambios en el circuito de una forma manual. especialmente cuando el reloj no esté en el mismo circuito que estés visualizando.. Resetear Simulación Inicializa todas las variables de entrada de forma que te encuentres como si hubieses vuelto a abrir el archivo. El proceso de análisis será válido sólo para circuitos combinacionales.. mostrando los resultados en la ventana de Análisis Combinacional.proyecto. Seleccionar Como Circuito Principal Selecciona el circuito visualizado como "circuito principal" del proyecto.. Hay que fijarse en que la velocidad del ciclo de reloj será más lenta que el cambio de nivel del reloj. este menú lista los subcircuitos que estén por debajo del circuito que se esté consultando. así como aquellas con herramientas que estén asociadas al ratón o que aparezcan en la barra de herramientas. El menú Simular Simulación Conectada Si esta opción está activada.. Esta opción está desactivada por defecto. Esta opción de menú sólo tendrá efecto si en el circuito se encuentra reloj (en la librería Base). Esta opción del menú será deseleccionada si se detecta oscilación en el circuito. que los valores de todo el circuito se actualizarán con la modificación de cualquiera de sus variables o con cada cambio a la configuración del circuito. 8 Hz significan que el cambio del nivel del reloj se producirá 8 veces cada segundo. Existe una descripción del proceso de análisis en la sección de Análisis Combinacional. Conmutar Reloj Cambia el estado del reloj en la simulación. Activar Reloj Automáticamente activa el reloj. Elimina del proyecto el circuito que esté siendo visualizado. Al seleccionar uno de ellos se mostrará el circuito correspondiente. Eliminar Circuito. así para el caso de un ciclo de reloj con frecuencia de 4 Hz los cambios de nivel de reloj serán a 8 Hz. este menú lista los circuitos que estén por encima del último estado visualizado del circuito.) El circuito principal es el que se muestra cuando se abre un archivo de proyecto.. Por ejemplo. es decir. Al seleccionar uno de ellos se mostrará el circuito correspondiente. Ir A Si profundizas en el estado de un subcircuito y luego vuelves para atrás. Analizar Circuito Calcula la tabla de verdad y las expresiones booleanas correspondientes al circuito visualizado. Seleccionar Frecuencia De Reloj Permite seleccionar la frecuencia del reloj. (Esté elemento del menú no estará disponible si el circuito en uso ya es el circuito principal del proyecto. En el caso en el que estés visualizando el estado de un subcircuito la jerarquía al completo será inicializada. . Zoom Redimensiona la ventana correspondiente a su tamaño preferido.. Análisis Combinacional Muestra la última ventana de Análisis Combinacional.. Entra en el módulo de registro. . para editar y consultar valores en el circuito: Puedes editar la dirección que se visualiza. Muestra una ventana con la versión de Logisim. El menú Ayuda Tutorial Abre el sistema de ayuda on-line en la sección de Tutorial: Primeros pasos con Logisim de la Guía del Usuario de Logisim. Sin embargo. títulos de ventana individuales Muestra la ventana correspondiente en primer plano.Registro.. Referencia De Las Librerías Abre el sistema de ayuda en la en la Referencia de las Librerías. seguramente encontrarás el editor hexadecimal integrado mucho más conveniente. Para editar la dirección que se visualiza. sin cambiar su contenido. Manual Del Usuario Abre el sistema de ayuda on-line en la Guía del Usuario de Logisim. haz clic fuera del rectángulo de visualización (aunque dentro de la memoria en sí).) Componentes de memoria Los componentes RAM y ROM son dos de los más útiles en las librerías que trae incorporadas Logisim. Cambiando valores en la memoria Menús desplegables y archivos Editor hexadecimal integrado de Logisim Cambiando valores en la memoria Es posible modificar los contenidos de memoria utilizando la Herramienta de Cambio. Logisim dibujará un rectángulo de color rojo alrededor de la dirección que corresponda al inicio del bloque que se esté visualizando. también son de los componentes más difíciles de utilizar a causa del gran volumen de información que puede almacenar. De todas formas. Acerca De. Se puede encontrar documentación acerca del funcionamiento de estos componentes dentro del circuito en las páginas RAM y ROM en la Referencia a las Librerías. Esta sección del Manual del Usuario explica la interfaz a la vez que permite al usuario ver y editar contenidos de memoria. que permite tomar nota de los valores de un circuito a medida que el estado del circuito progresa. la Herramienta de Cambio se puede utilizar de dos formas distintas. (En los Mac esta opción de menú aparecerá en el menú Logisim. El menú Ventana Minimizar Minimiza la ventana correspondiente. y puedes editar un valor individual. pero la interfaz que se ocupa de esto está limitada de diversa forma a causa de restricciones de espacio: Para cualquier otra cosa que no sea una edición muy simple. Salvar Imagen.. por ejemplo. esto te permite crear un programa. Para la edición de un valor en concreto. Al pulsar Backspace (tecla de retroceso) la memoria se moverá una línea hacia arriba. Los valores se muestran en hexadecimal. entonces la imagen sería el siguiente fichero de texto. Logisim colocará un rectángulo de color rojo alrededor del valor seleccionado. y todos los demás valores fuesen cero. En cuanto se teclee algún dígito hexadecimal se cambiará el valor de la posición de memoria seleccionada. En cuanto se teclee algún dígito hexadecimal cambiará la dirección de inicio del bloque..0 raw 02 03 00 14 ff La primera línea identifica el tipo de formato utilizado (por el momento sólo hay un formato reconocido).: Pone en memoria los valores que se encuentran en el archivo utilizado. que genere imágenes de memoria que puedan después ser cargadas en memoria. Borrar Contenidos: Resetea (pone a cero) todos los valores de la memoria. Para acceder a él. Al pulsar Enter la memoria se moverá una línea hacia abajo. puedes acceder también al editor hexadecimal haciendo clic sobre el atributo correspondiente. Editor hexadecimal Logisim tiene un editor hexadecimal integrado para ver y alterar contenidos de memoria. si se tiene una memoria de 256 bytes cuyos cinco primeros bytes fueran 2. 20 y -1. puedes poner varios valores en la misma línea. Logisim pondrá el valor cero en todas aquellas posiciones de memoria que no vengan especificadas en el archivo.. Al pulsar Backspace (tecla de retroceso) el rectángulo de edición pasará a la posición anterior a la que se encuentre. como un ensamblador. Para componentes ROM. La imagen puede utilizar abreviaturas en la codificación. que presentan un atributo para los contenidos de mermoria.. Al pulsar la barra espaciadora la memoria se moverá una página (cuatro líneas) hacia abajo. Al pulsar Enter se posicionará el rectángulo de edición justo debajo de la posición en la que se encuentre. Al pulsar la barra espaciadora el rectángulo de edición pasará a la posición siguiente a la que se encuentre. empezando por la dirección cero.. Veamos un ejemplo para entender el formato. Cargar Imagen. 3. haz clic sobre el valor que quieras modificar dentro del rectángulo de visualización.. 0. El formato utilizado para las imágenes es intencionadamente simple. abre un menú desplegable para el componente de memoria correspondiente y selecciona Editar Contenidos. . v2. en lugar de escribir en una fila dieciséis veces seguidas el valor 00 se podrá escribir 16*00.: Guarda los valores que se encuentren en la memoria en un archivo con el formato que se indica debajo. Hay que fijarse en que el número de repeticiones de un valor viene dado en base 10. el cual tendrá el formato que se indica abajo. Menús desplegables y archivos El menú desplegable de la memoria incluye cuatro opciones más que el de los demás componentes: Editar Contenidos: Abre un editor hexadecimal para determinar los contenidos de la memoria. Las imágenes creadas por Logisim utilizarán estas abreviaturas en cuanto los valores se repitan cuatro veces o más. Para facilitar la lectura. Puedes acceder al módulo de registro a través de la opción de Registro. Puedes navegar por la memoria utilizando la barra de desplazamiento (scroll bar) o con el teclado (con las teclas de la flechas. También puedes seleccionar un grupo de valores arrastrando el ratón. o dieciséis valores por línea. inicio.Los números a la izquierda. Nota: El módulo de registro está en fase alfa. el portapapeles se puede utilizar desde otras aplicaciones. en itálicas. en el menú de Simulación. Los otros números se corresponden con los valores a partir de la dirección de memoria especificada. ocho. Si vosotros los usuarios no enviáis comentarios. y sabiendo que información acerca de errores así como sugerencias para Logisim son siempre bienvenidos. y para tener una referencia del comportamiento del circuito se puede utilizar el módulo de registro de Logisim. haciendo clic con el ratón y pulsando la tecla shift. entonces es muy probable que este módulo no cambie. ahora sí. muestran las direcciones de memoria en hexadecimal. o puedes navegar por la memoria con el teclado mientras pulsas la tecla shift. Registro Para verificar el correcto funcionamiento de un gran circuito. y además. Éste módulo te permite seleccionar los componentes cuyos valores deberían quedar registrados. Y cuando se pulsen caracteres hexadecimales se modificará la posición de memoria seleccionada. puede contener errores. de forma opcional podrías especificar un archivo en el que quedaría almacenado el registro. hay un espacio después de cada grupo de cuatro valores. el editor hexadecimal puede mostrar cuatro. y está sujeto a cambios significativos en un futuro. fin... avanzar/retroceder página). lo serán especialmente los que hagan referencia a este módulo. . De hecho. dependiendo de lo que quepa en la ventana. Los valores se pueden copiar y pegar utilizando el menú de edición. Aparecerá una ventana con tres pestañas. pero necesitarás reactivar el registro en archivo manualmente. La pestaña de Selección La pestaña de Tabla La pestaña de Archivo Hay una sola ventana de registro por proyecto.Comentaremos cada una de estas pestañas por separado. . Y cuando vuelvas a la otra simulación. Esto es así a no ser que te estés moviendo niveles arriba o abajo dentro de la misma simulación. el módulo de registro recordará la configuración correspondiente. la ventana de registro cambiará para registrar los cambios efectuados al circuito que se esté visualizando. cuando cambias de circuito dentro de un mismo proyecto. La pestaña de Selección La pestaña de selección te permite seleccionar cuales son los valores que se deberían registrar. en cuyo caso el módulo de registro no cambia. La ventana que se muestra abajo se corresponde con el siguiente circuito. Hay que fijarse en que el módulo de registro "dejará de tomar nota" en un archivo cuando pase a registrar otra simulación. Mover Arriba mueve el componente seleccionado un lugar hacia arriba. Los subcircuitos también aparecerán en la lista.La pestaña está en tres zonas verticales. Ver. y para los componentes que no tengan etiqueta se les asignará un nombre que especifique su tipo y su situación dentro del circuito. Eliminar elimina el componente seleccionado. Mover Abajo mueve el componente seleccionado un lugar hacia abajo. En ella también se indicará la base con la que se almacenarán los valores de aquellas variables que posean más de un bit. Cambiar Base cambia la base del componente seleccionado entre 2 (binaria). Añadir añade en la zona de la derecha el elemento u elementos que estén seleccionados en la zona de la izquierda. La última zona vertical (la que está más a la derecha) muestra los componentes que han sido seleccionados. y 16 (hexadecimal). La primera (la que está más a la izquierda) es una lista de todos los valores del circuito que podrían ser registrados. La columna del medio permite manipular los elementos que estén seleccionados. Estos son los componentes de las librerías incorporadas que soportan el registro: Librería Base: Los componentes Pin. como máximo permite el registro de las primeras 256 posiciones de memoria. éstos no podrán registrarse. 10 (decimal). pero sí será posible registrar sus componentes. La pestaña de Tabla La pestaña de Tabla muestra gráficamente el registro más reciente. y Reloj Librería de Memorias: Todos los componentes Los componentes vendrán identificados por su etiqueta. Hay que fijarse en que el la RAM necesita que elijas cuales son las direcciones de memoria que quieres registrar. . En la tabla hay una columna para cada componente que se haya seleccionado. En cada fila se muestra un estado de la simulación una vez que haya tenido lugar un cambio en los valores. La tabla es sólo de consulta. Hay que fijarse en que sólo se mostrarán las últimas 400 filas de valores y en que algunas de las filas podrían no tener un valor asignado en el caso de que los valores de la fila fuesen calculados cuando alguno de los componentes aún no hubiese sido seleccionado. . no es modificable u interactiva La pestaña de Archivo La pestaña de Archivo te permite seleccionar un archivo en que se pueda almacenar el registro. No se añadirán filas que estén duplicadas. Así un script podría procesar el archivo al mismo tiempo que Logisim está funcionando. Logisim te preguntará si quieres sobrescribir el archivo o si quieres añadir nuevos datos al final. Hay que fijarse en que Logisim podría cerrar y abrir el fichero varias veces durante la simulación. La pestaña Plantilla La pestaña Internacional La línea de comandos La pestaña de Plantilla .. del menú Archivo (o bien. se dejará de registrar la información en el archivo. El registro comenzará automáticamente al seleccionar un archivo.En la parte superior se indica si el registro está en funcionamiento o no. (Aunque. Las preferencias de la aplicación se refieren a las preferencias de la aplicación que se extienden a todos los proyectos abiertos. mientras que las opciones de proyecto se describirán más adelante.. por ejemplo. mientras que las opciones de proyecto son específicas para el proyecto que esté siendo utilizado en ese momento.. una vez seleccionada la opción.. En el momento en el que visualices otra simulación. En el caso de que se seleccione esta opción. en el fichero las cabeceras indicarán el camino completo de los componentes que pertenezcan a un subcircuito. hay que utilizar el botón Seleccionar. (No se podrá activar hasta que se haya seleccionado un archivo de salida. A media altura se indica el archivo que está siendo utilizado para almacenar los datos del registro. se mostrará una ventana con dos pestañas. y si vuelves a la simulación en la que habías seleccionado el registro en archivo y quieres que éste continúe. Puedes ver y editar las preferencias de la aplicación a través de la opción de Preferencias. y hay un botón que permite habilitar o deshabilitarlo. se añadirá una cabecera al archivo cada vez que se modifiquen los componentes seleccionados. Formato del archivo Las entradas se mostrarán tabuladas de forma semejante a lo que puede verse en la pestaña de Tabla.) El botón te permite pausar y continuar almacenando la información en el archivo. Para seleccionar otro. en concreto Logisim meterá los nuevos valores en disco cada 500 ms. En la parte de abajo se puede elegir añadir una cabecera indicando los elementos que están seleccionados. en un Mac. y luego veremos cómo se configuran las preferencias desde la línea de comandos. Preferencias de aplicación Logisim admite dos categorías de opciones de configuración: las preferencias de aplicación y las opciones de proyecto. sobre todo si pasan varios segundos sin que haya nuevos valores para introducir. desde el menú Logisim). Se describirán cada una de las pestañas por separado.) El formato es simple de forma intencionada para que sea posible procesarlo con algún script en Perl/Python o un programa de hojas de cálculo. En esta sección se comentarán las preferencias de la aplicación. entonces tendrás que volver a activarlo manualmente utilizando el botón de habilitación. si tienes un archivo de Logisim cuyo entorno está configurado de una forma extraña. por ejemplo. utiliza una plantilla que se proporciona junto con Logisim. La opción "Plantilla Por Defecto".. Las plantillas también pueden ser útiles en el escenario pedagógico cuando. en cuyo caso la configuración por defecto podría ser demasiado simple.".. Si prefieres una configuración completamente desnuda selecciona "Plantilla Vacía". que está seleccionada por defecto. puedes utilizar el botón "Seleccionar. puedes "resetear" el entorno usando el botón Restablecer Plantilla desde la ventana de edición de las Opciones de Proyecto. son particularmente adecuadas para utilizar en clase. un profesor abre el archivo de un alumno que ha configurado su entorno de trabajo de forma significativa. Esto es especialmente probable si la clase utiliza todo el potencial de Logisim. Aunque las plantillas son útiles en muchos casos. y luego elegir la opción "Especificar Plantilla". incluyendo las características más avanzadas. si por ejemplo un profesor quisiera proporcionar una plantilla como punto de partida a sus alumnos. También. Pero si quieres especificar otro archivo que se use como plantilla. La pestaña Internacional Gracias a este apartado Logisim puede ser utilizado en varios países utilizando el idioma correspondiente en cada caso.Una plantilla es un archivo de Logisim que se utiliza como punto de partida cuando Logisim crea un nuevo proyecto. . En la siguiente tabla se pueden ver las diferencias. Logisim no se ajusta a ninguno de los dos estándares exactamente. las puertas moldeadas están más . prepararé una versión para que trabajes con ella. El proceso de traducción no requiere ningún conocimiento de programación. Esto no será un compromiso: Estaré contento de enterarme de tú interés. más bien se coloca en una posición intermedia permitiendo elegir entre ellos. La última versión está disponible en inglés y español. natural de España. Carl Burch. La traducción ha sido proporcionada por Pablo Leal Ramos. ¡Posibles traducciones de Logisim a otros idiomas son bienvenidas! Si estás interesado. El checkbox estará deshabilitado para su uso cuando el idioma seleccionado no tenga equivalencias disponibles para estos "caracteres especiales". y te enviaré instrucciones. yo no hago referencia a esta terminología ya que sugiere que en cada parte del mundo existe un estándar diferente. Reemplazar Caracteres Acentuados: Algunas plataformas soportan mal los caracteres (tales como ñ o ö) que no aparecen en el conjunto de caracteres ASCII de 7 bits. Puertas Moldeadas: Hay dos estándares para la representación de puertas lógicas: puertas moldeadas (shaped gates) y puertas rectangulares (rectangular gates). y esto crearía problemas para Logisim). Logisim reemplazará cualquier carácter fuera del conjunto de caracteres ASCII de 7 bits con el correspondiente más parecido. Cuando esta opción está seleccionada. ponte en contacto conmigo.Esta pestaña tiene tres opciones. (Algunas fuentes se refieren a éstos como los estilos americano y europeo. En concreto. y te dejaré saber si conozco a alguien que ya está trabajando en ello. Idioma: Cambia el idioma. Si se selecciona no. así. -version Muestra el número de la versión de Logisim. Actualmente. El siguiente ejemplo inicializa Logisim con su configuración básica. Las preferencias de aplicación se refieren a las preferencias de aplicación que se . java -jar jarFileName [options] [filenames] Los archivos opcionales que añadan al comando se abrirán con Logisim en ventanas adicionales. -gates [shaped|rectangular] Determina qué tipo de puerta ha de utilizarse. java -jar jarFileName -plain -gates shaped -locale en Las que siguen son las opciones soportadas. y no incluiría al inglés. -help Muestra un resumen de las opciones de la línea de comandos.linealizadas que las definidas por el estándar del IEEE. los idiomas que se soportan son: en English es Spanish -accents [yes|no] Esta opción sólo es relevante para aquellos idiomas que utilicen caracteres que no pertenezcan al conjunto de caracteres ASCII de 7 bits. Y. Esto se probará especialmente útil en un laboratorio con ordenadores para cada alumno en el que se pretenda comenzar siempre de la misma forma. la puerta rectangular OR se representa con el símbolo ">0" en lugar del símbolo que se muestra arriba. aunque las puertas XOR y XNOR deberían ser igual de anchas que las puertas OR y NOR en el estilo rectangular. La sintaxis completa de la línea de comandos es como se muestra a continuación. -plain -empty -template templateFile Determina la plantilla que debe utilizar Logisim. independientemente de cómo hayan configurado el programa los alumnos que hayan utilizado el ordenador con anterioridad. La línea de comandos Puedes configurar las preferencias de aplicación de Logisim a través de la línea de comandos. estarían incluidos idiomas que utilizasen caracteres acentuados. -nosplash No muestra la pantalla de inicio (carga) de Logisim. Por el momento. los caracteres que no pertenezcan al conjunto de caracteres ASCII de 7 bits serán reemplazados con los más apropiados dentro de este conjunto. no lo son a causa de algunas dificultades comprimiendo la puerta moldeada XOR. Opciones de proyecto Logisim soporta dos categorías de opciones de configuración: las preferencias de aplicación y las opciones de proyecto. porque muchas plataformas aún no soportan el conjunto de caracteres Unicode al completo. esto será útil para los casos en que la combinación de Java/Sistema Operativo no soporte estos caracteres de forma adecuada. -locale localeIdentifier Determina cual es la traducción que ha de utilizarse. mientras que las opciones de proyecto son específicas para el proyecto que esté siendo utilizado en ese momento. las preferencias de aplicación se describen en otra sección. todas las opciones y los atributos de las herramientas pasan a ser los definidos en la plantilla que esté en uso (que se selecciona en preferencias de aplicación).extienden a todos los proyectos abiertos. que tiene cuatro pestañas. . Al pulsarlo.. del menú de Proyecto.. La La La La pestaña pestaña pestaña pestaña Pizarra De Trabajo Simulación Barra De Herramientas Ratón En la parte de abajo de la ventana está el botón Restablecer Plantilla. Las opciones de proyecto se pueden ver y editar a través la opción Opciones. La pestaña Pizarra De Trabajo La pestaña Pizarra De Trabajo te permite configurar la apariencia del área donde se dibujan los circuitos. En esta sección se comentarán las opciones de proyecto. Así se mostrará la ventana de Opciones. Comentaremos cada una de las pestañas por separado. podrás ver una muestra esquemática de color gris de como quedaría situada la puerta AND si pulsases el botón del ratón. Esta opción está concebida principalmente para demostraciones en clases en donde la resolución de la pantalla sea demasiado pequeña para ver el circuito desde el fondo de la sala.Hay seis opciones. El Factor Del Zoom permite aumentar la imagen en la proporción seleccionada. Por ejemplo. Estos parámetros se aplican sobre todos los circuitos que se simulen desde la misma ventana. Así por ejemplo. si mantienes el ratón sobre un punto de conexión (pin) de un componente que se corresponda a un subcircuito.o se mostrará el nombre del subcircuito si ese pin no tiene etiqueta -. sin embargo. El checkbox Mostar Sombras determina si cuando se haya seleccionado algún componente ha de mostrarse un esbozo del mismo a medida que el ratón se mueva sobre la pizarra de trabajo. incluso sobre circuitos que existan en librerías cargadas en el proyecto. a través de una aclaración. Logisim indica sobre el circuito el último estado del mismo y muestra algunas características de la interfaz de los componentes (en concreto. si seleccionas la puerta herramienta AND y mueves el ratón sobre la pizarra de trabajo (sin pulsar el botón). El checkbox Mostrar Parrilla determina si la parrilla de puntos ha de mostrarse o no. La vista de impresión. Por lo general. Si se deja el checkbox sin seleccionar. señaliza las patas de las puertas OR dónde se conectarían). Además todos los componentes de las librerías de Plexores y Memorias proporcionarán información acerca de sus entradas y salidas por medio de las aclaraciones. que bits se corresponden a esa salida. La pestaña Simulación La pestaña Simulación permite configurar los algoritmos que se utilizan para simular los circuitos. Manteniendo el cursor sobre una de las salidas de un separador se dará a conocer. El checkbox Mostrar Aureola determina si ha de dibujarse un óvalo verde claro azulado alrededor del atributo o herramienta cuyos atributos estén siendo mostrados en la tabla de atributos. se mostrará la etiqueta asociada a ese pin dentro del subcircuito . El checkbox Mostrar Aclaraciones Para Los Componentes determina si se deben mostrar las aclaraciones que aparecen temporalmente cuando se mantiene el cursor del ratón sobre un componente. este comportamiento quedará desactivado. no indica nada acerca del último estado del circuito y omite tales características. El checkbox Vista De Impresión determina si se muestra el circuito en la pantalla de la misma forma en que aparece cuando se imprime. . El número representa la cantidad de ciclos del reloj interno (una puerta simple sólo necesita un ciclo). pero introduciendo ruido aleatorio. Si esta opción está seleccionada. Es aconsejable dejar activada esta opción que existe por si se busca el comportamiento determinista de algún circuito. Pero podrías estar interesado en aumentar el número de iteraciones si estás trabajando con un circuito para el que Logisim informa de falsas oscilaciones. Esta aleatoriedad se introduce específicamente para tratar cerrojos en los circuitos (como debajo): Sin el ruido aleatorio. La opción Iteraciones Hasta Oscilación específica durante cuánto tiempo se ha de simular un circuito antes de decidir que está oscilando. es posible imaginarse problemas con un circuito que incorpore muchas formaciones como la comentada encima de estas líneas. incluso para grandes circuitos. La pestaña Barra De Herramientas . El checkbox Añadir Ruido A Los Retardos De Los Componentes permite activar o desactivar el ruido aleatorio que se añade los retardos de los componentes. ya que la dos puertas trabajarán al mismo ritmo. Logisim ocasionalmente (alrededor de una vez por cada 16 reacciones del componente) hará que uno de esos retardos sea más largo de lo normal.000 es buena para casi todos los propósitos. La simulación interna utiliza un reloj oculto para su simulación. el circuito oscila. (Además. También podrías estar interesado en rebajar el número de iteraciones si estás trabajando con un circuito propenso a oscilar y utilizas un procesador muy lento. cada componente (excepto los cables y los separadores) introducen un retardo entre la recepción de una entrada y la emisión de una salida. esta opción es relativamente nueva en Logisim y podría conducir a errores inesperados en la simulación). eventualmente una de las puertas dejará atrás a lo otra. La cifra por defecto de 1. y proporciona de alguna forma una simulación más realista. (El símbolo "---" es un separador que no es más que un pequeño espacio en blanco). . y en el lado derecho hay una lista con los elementos de la barra de herramientas. Logisim te permite modificar este comportamiento. Los atributos de las herramientas no se muestran en esta ventana.La pestaña Barra De Herramientas permite configurar las herramientas que aparecen en la barra de herramientas. pero puedes verlos y editarlos desde la ventana principal. La pestaña Ratón permite especificar estas asociaciones. Mover Arriba mueve el elemento seleccionado una posición hacia arriba/izquierda en la barra de herramientas. librándote de la necesidad de ir continuamente a la barra de herramientas o al explorador. Eliminar elimina el elemento seleccionado de la barra de herramientas.tecla especial (shift y o control) puede ser asociada a una herramienta diferente. La pestaña Ratón Por defecto. Entre el explorador y la lista hay cinco botones: Añadir Herramienta añade la herramienta seleccionada en el explorador al final de la barra de herramientas. al hacer clic sobre el área de dibujo de Logisim se utilizará la última herramienta seleccionada. Mover Abajo mueve el elemento seleccionado una posición hacia abajo/derecha en la barra de herramientas. (Esto puede también ser práctico si eres zurdo). Si haces clic con el botón derecho o haces control-clic sobre un componente saltará un menú desplegable. En el lado izquierdo hay un explorador que permite ver todas las herramientas disponibles. Añadir Separador añade un separador al final de la barra de herramientas. Cada combinación botón del ratón . En la parte más baja aparece la lista de atributos de la herramienta correspondiente al elemento que esté seleccionado en la lista de asociaciones. En la parte izquierda hay un panel explorador en el que se pueden seleccionar las herramientas de interés. Hay que fijarse en que cualquier combinación que no se muestre en esta lista simplemente utilizará la herramienta seleccionada. no es algo de lo que preocuparse. Cuando se elimina una asociación. Debajo del recuadro aparece una lista de las asociaciones existentes. botón del ratón . las herramientas que se asocien a las combinaciones. Más abajo se encuentra el botón Eliminar. Si la combinación utilizada ya estaba en uso. a la que asociar: Herramienta De Cableado". En la parte de arriba del lado derecho hay un recuadro dentro del cual ha de utilizarse la combinación de teclas que queremos asociar a la herramienta seleccionada.tecla especial. entonces deberías seleccionar la Herramienta De Cableado en el panel explorador y luego hacer click con el botón derecho del ratón mientras pulsas la tecla shift dentro del recuadro. entonces la asociación correspondiente será remplazada con la nueva herramienta. botón del ratón . ¿Quieres saber más? . diferentes de los utilizados en el panel explorador y en la barra de herramientas. podrán tener sus atributos con valores propios.tecla especial. Por ejemplo. cabe comentar que el algoritmo es lo suficientemente sofisticado como para tener en cuenta los retardos de las puertas.tecla especial utilizada pasará a estar asociada a la herramienta que esté seleccionada en la barra de herramientas o en el panel explorador. Propagación de valores El algoritmo que utiliza Logisim para simular la propagación de valores a través de los circuitos. la combinación botón del ratón . Por otra parte. donde dice "Utiliza aquí la combinación. si quieres que se pinten nuevos cables cuando uses la combinación tecla shift y botón derecho del ratón. Así. con el que se pueden borrar de la lista de asociaciones aquellas que estén seleccionadas en dicha lista. pero no lo suficientemente realista para implementar comportamientos más complicados como la variación de voltajes o las condiciones del entorno. Aquí es donde podrás editar esos valores de los atributos. que normalmente es transparente. y aunque tratar bien los retardos a través de los subcircuitos es más complicado. Logisim también intenta abordar este asunto de forma correcta. El cambiar la entrada de 0 a 1 conduce instantáneamente un 1 al biestable D y de esta manera el biestable conmutará cada vez que la entrada del circuito cambie de 0 a 1. De vez en cuando. Todos los componentes tienen asociado un retardo. Obviamente la salida será siempre 0. Pero realmente las puertas NOT no reaccionan instantáneamente a sus entradas y tampoco lo hacen en Logisim. Así. considera el siguiente circuito. Esta aleatoriedad se puede desactivar a través de la ventana de Opciones de Proyecto en La pestaña Simulación. será visible cuando construyas un circuito que oscile. Logisim añadirá un retardo a la propagación de un componente. Por otro lado. El efecto sólo será observable si se utiliza la salida del circuito como entrada de reloj de un biestable D. es relativamente fácil tratar con este nivel de sofisticación en un circuito simple. En concreto. cuando la entrada de este circuito cambia de 0 a 1. pero estos retardos son arbitrarios de alguna forma y puede que no reflejen la realidad. un R-S que utilice dos puertas NOR oscilaría sin esta aleatoriedad en los retardos. Esto pretende simular la irregularidad de los circuitos reales. con frecuencia irregular. Los componentes más complejos tienden a tener retardos mayores. .Retardos en puertas Errores de oscilación Deficiencias Retardos en puertas Como ejemplo del nivel de sofisticación del algoritmo de Logisim. ya que las dos puertas procesarían sus entradas a la vez. la puerta AND tendrá brevemente a su entrada un 1 en cada una de sus patas y en consecuencia habrá un 1 a su salida durante un corto espacio de tiempo. Errores de Oscilación El algoritmo de propagación. Pero por lo menos lo intenta. Desde un punto de vista técnico. Hay que fijarse en que no estoy diciendo que Logisim siempre se ocupe de los retardos de las puertas satisfactoriamente. se para cualquier tipo de simulación. que tengan puertos/patas bidireccionales. Logisim para la simulación después de un número preestablecido de iteraciones asumiendo que existe un error de oscilación. si estás seguro de que el informe de oscilación es erróneo. pero aun así es una versión muy idealizada de la realidad. Logisim detecta una oscilación con una técnica bastante simple. Logisim se dará por vencido y lanzará un mensaje comentando que en su opinión el circuito oscila. Al cabo de un tiempo. Si alguno de los puntos involucrados se encuentra dentro de un subcircuito. Hay deficiencias adicionales que no me molesto en comentar porque son tan específicas que si estuvieseis al tanto de las mismas ya os resultaría obvio que Logisim no llega ni remotamente a ese nivel. el circuito de la RAM de la librería de Memorias contiene un pin D que actúa como entrada y como salida. Aparte del caso de los retardos de las puertas. es decir. Logisim rodea con una línea roja los puntos que parecen estar implicados en la oscilación.Este circuito se encuentra en una situación estable.en esta captura de pantalla. pero que tendría que ser uno más grande que cualquiera que yo haya construido con Logisim. . Como un ejemplo exagerado puedo comentar que tengo un amigo que trabaja para un productor de chips y su ocupación es preocuparse de la aparición de burbujas en el cableado del chip que pudiesen crecer creando desconexiones aleatorias. (Los puntos que se identifican como causantes de la oscilación son aquellos modificados en el último 25% de las iteraciones) De esta manera. Logisim dará a conocer los valores que existen cuando se da por vencido. aunque: dentro de las librerías incorporadas. La introducción de aleatoriedad en los retardos de los componentes hace que el análisis sea más realista. pero no lo es para el diseño industrial. Estos valores podrán parecer incorrectos . la puerta AND envía un 1 a su salida aunque una de sus entradas es un 0. Logisim no hace nada al respecto de discriminar entre niveles de voltaje: el valor de un bit sólo puede ser activo. Logisim no se preocupa de cuestiones temporales. en concreto si trabajas con un circuito excepcionalmente grande. Podría ser que un gran circuito que no oscile diese problemas. Deficiencias El algoritmo de propagación de Logisim es lo suficientemente inteligente para casi todos los fines didácticos. puedes configurar el número de iteraciones completadas antes de determinar oscilación a través de la ventana de Opciones de proyecto en La pestaña Simulación. Componentes que se hayan desarrollado con Java podrían tener este tipo de puertos. En cualquier caso. sin especificar o erróneo. Logisim marcará el contorno del subcircuito en rojo. Podrás restablecer la simulación en el menú Simulación a través de la opción Simulación Conectada. inactivo. pero podría ser que la puerta NOT tenga un 1 a la entrada y un 1 a la salida. Cuando Logisim detecta una oscilación. el circuito entrará en un bucle infinito. las deficiencias que presenta el algoritmo de propagación de Logisim incluyen: Logisim no puede no puede simular subcircuitos cuyos pines se comporten algunas veces como entradas y otras como salidas. Logisim podría concluir erróneamente que existe una oscilación. Si la simulación del circuito necesita demasiadas iteraciones entonces simplemente se dejará de simular y se dará a conocer que el circuito oscila. Ordenándolas desde la más a la menos crítica. pero si pones la entrada a 1. A partir de ese momento los componentes de la librería estarán disponibles. además de ser más ineficientes. Contador Básico Muestra cómo crear un componente que tenga estados internos. Directrices Información general para las librerías desarrolladas por terceras partes. Logisim contiene un conjunto bastante amplio de librerías incorporadas con componentes definidos en Java. este código fuente es de dominio público.. en el panel explorador. Incrementador General Muestra cómo crear componentes que puedan ser modificables a través de sus atributos. Librerías JAR Utilizando librerías JAR Logisim tiene dos tipos de componentes: los que son diseñados como circuitos de Logisim y los que se definen en Java. Comentarios de expertos son siempre bienvenidos. Así. Puedes descargarte un archivo JAR que te permita importar estos ejemplos en Logisim a través de la sección de enlaces de la web de Logisim. el código fuente de Logisim está disponible bajo la Licencia Pública de GNU). Ese archivo JAR también contiene el código fuente de estos ejemplos. Contador Muestra un componente completo y bastante sofisticado con el que puede interactuar el usuario.. pero no soportan una interacción con el usuario muy sofisticada. pero también puede cargar librerías escritas por terceras personas. En concreto. Encontrarás la información más allá de estos ejemplos bastante exigua. Entonces Logisim te hará seleccionar el archivo JAR y te pedirá el nombre de la clase. Sólo deberías intentarlo si eres un programador con experiencia en Java.la clase cuyo nombre tendrá que introducir el usuario cuando cargue una librería JAR. y seleccionando Cargar Librería JAR. (Sin embargo. Incluso más allá de esto. Este es el punto de entrada para cualquier librería JAR .la que creó la librería -. no soy un especialista en el diseño de circuitos. Clase de la Librería Muestra cómo definir una librería. Incrementador de 8 bits Muestra las partes esenciales cualquier tipo de componente utilizando un simple ejemplo de un componente que tiene una entrada de 8 bits y a su salida se proporciona el valor de esos 8 bits más uno. generalizando el caso del incrementador de 8 bits de tal forma que pueda trabajar con cualquier número de bits a la entrada y a la salida. Implementa un contador (en el que se puede configurar el número de bits) donde el usuario puede editar el valor de contaje haciendo clic sobre el componente con la Herramienta de Cambio. puedes importarla desde tu proyecto haciendo clic con el botón derecho sobre la carpeta de proyecto. Incrementador de 8 bits . podría haber algún error en la técnica de propagación del que no sea consciente. Creando librerías JAR Los puntos de esta sección están dedicados a una serie de ejemplos minuciosamente comentados que muestran cómo es posible desarrollar librerías de Logisim por ti mismo. lo que será proporcionado por la tercera persona . Cuando te hayas descargado una librería. un contador de 8 bits que recuerda su último estado y lo incrementa cada vez que en su entrada de reloj se encuentra con un flanco de subida. Los circuitos de Logisim son más fáciles de diseñar. com.cburch.logisim. como la clase Location que representa puntos sobre el lienzo (pizarra de trabajo) o la clase Value que representa los valores que pueden existir en un cable.cburch.cburch. also 8 bits wide.logisim.cburch. whose single * input is 8 bits wide.cburch.ComponentDrawContext. inputs and outputs to the .e.data.logisim. define el comportamiento global del componente y fabrica los componentes.cburch. import import import import import import import import import com.. com.circuit.logisim. com. com.data. com. and whose output value is one more than * the input value.cburch.cburch. com. En la práctica es mucho más conveniente extender de las clases ManagedComponent y AbstractComponentFactory.cburch. implementando la interfaz de fabricación del componente (de ahora en adelante ComponentFactory).incr.data Contiene clases relacionadas con elementos de datos asociados con componentes. también será necesario que proporciones la clase de la Librería. package com.cburch.Value.comp.logisim.logisim.logisim.Cada componente incluido en una librería requiere que se definan dos clases: Una clase.EndData. Este ejemplo por sí mismo no es suficiente para crear un archivo JAR que funcione.logisim. com. /** Implements a bare-bones custom Logisim component.tools Contiene clases relacionadas con la definición de herramientas y con la especificación de la interacción entre componentes y herramientas. com. La mayor parte de las clases relevantes para definir librerías de componentes se encuentran en tres librerías. define el comportamiento de un único componente.data. implementando la interfaz del componente (de ahora en adelante Component). la otra.cburch.comp.comp Contiene clases especialmente relacionadas con la definición de componentes incluyendo los tipos que han sido descritos arriba: Component.comp.data. All we have to do is to tell it // about the different "ends" (i.comp. ComponentFactory. Para el caso se definirá un incrementador que tiene una entrada de 8 bits y que proporciona a la salida 8 bits cuyo valor será el que se encuentre a la entrada más uno.logisim.AttributeSet. ManagedComponent y AbstractComponentFactory.ManagedComponent.BitWidth. La relación entre los objetos de estas dos clases se asemeja a la relación entre un objeto y su clase en Java. com.Location.logisim. com.cburch.logisim. Implementar directamente todos los métodos en las interfaces Component y ComponentFactory es más bien tedioso y repetitivo. */ class ByteIncrementer extends ManagedComponent { // The ManagedComponent class conveniently implements just about // all of the required methods.cburch.CircuitState.ComponentFactory. (Esto sólo es necesario para los componentes más especializados) ByteIncrementer Este es un ejemplo muy simple que muestra cuales son los componentes esenciales para la definición de un componente. algo que se muestra en el siguiente apartado de esta guía.logisim. com. */ public void draw(ComponentDrawContext context) { // The ComponentDrawContext class contains several convenience // methods for common operations.drawRectangle(this. */ ByteIncrementer(Location loc. BIT_WIDTH.createKnown(BIT_WIDTH. attrs. // and it should bear some resemblance to the component's depth.INPUT_ONLY). in. /** Returns the class that generated this component. context. out. with the given * attributes. EndData. if(in. some input bits are unspecified. out = Value.getValue(getEndLocation(0)). the value sent there.OUTPUT_ONLY).isFullyDefined()) { // If all input bits are 0 or 1. "+1"). } // Now we tell the ManagedComponent superclass about the ends.createUnknown(BIT_WIDTH). The parameters // here indicate the location affected. } else { // Otherwise. Value in = circuitState. and draw. but // the exact value isn't too important. } /** Draws this component using the data contained in the parameter. so I use that value here.setValue(getEndLocation(1). // The third parameter (2) to the parent's constructor indicates how // many ends the component has. 9). and we need to implement the // getFactory.create(8). circuitState. the // originating component. EndData. /** Constructs a component at the given location. */ public void propagate(CircuitState circuitState) { // Retrieve the current value coming into this component. I've kept the drawing simple // by just sticking to these operations.isErrorValue()) { // If any input bits are "errors" (which usually arise from // conflicting values on a wire). The incrementing component // would probably be nine levels deep. this. The circuitState * parameter maintains information about the current state of the * circuit.instance. loc. out = Value. out = Value. and // so can be our output. BIT_WIDTH. It's not important that this be // precisely right: The ManagedComponent uses an ArrayList to manage // the ends. The delay needs to be positive. */ private static final BitWidth BIT_WIDTH = BitWidth. } .translate(-30. } /** Recomputes the outputs of this component. } // Now propagate the output into the circuit state. propagate.drawPins(this).// component) in the constructor. Value out. */ public ComponentFactory getFactory() { return ByteIncrementerFactory. // Compute the output. setEnd(0. setEnd(1. To keep things // simple. and the delay. 2). context. /** The width of a byte. our input is a valid number. loc. AttributeSet attrs) { super(loc. We // assign each end a distinct index. which is used also below in // the propagate method.createError(BIT_WIDTH).toIntValue() + 1). 0). then we send out all error bits. we'll indicate that all output bits are also unspecified. } else if(in. so there's no need to override.comp.cburch. /** The sole instance of this class.data. // // // // } We could also override the drawGhost method to customize the appearance of the "ghost" drawn as the user moves the tool across the canvas. } /** Returns a rectangle indicating where the component would appear * if it were dropped at the origin.logisim.logisim. // The two most likely reasons for having different strings are // that we decide on a more user-friendly name in a future version // but we don't want to change the representation within files (for // backwards compatibility).Bounds. or that we want to adapt to the user's // chosen language. */ public Component createComponent(Location loc. */ private ByteIncrementerFactory() { } /** Returns the name of this component class.} ByteIncrementerFactory package com. } /** Returns the name of this component class as the user should see it. } /** Manufactures and returns a component of this component class.data.cburch. the y-coordinate is -15. the component is a 30x30 rectangle.Location. com. (Logisim doesn't support internationalization // right now. By default. as it is stored in a file. createComponent. All we really // need are the getName.logisim. but it is capable of doing so.create(-30. So the x-coordinate // of the top left corner is -30.cburch.AbstractComponentFactory.cburch.cburch.AttributeSet.incr.Component. */ public String getDisplayName() { // This may well be different from what is returned by getName. There is no reason to have multiple instances * of this class. -15. com. import import import import import com.data. /** The object that manufactures ByteIncrementers.) return "Incrementer (8-Bit)". */ public String getName() { return "Byte Incrementer". . com. com. with the // origin on the midpoint of the east side. */ class ByteIncrementerFactory extends AbstractComponentFactory { // The AbstractComponentFactory parent class conveniently implements // just about all the methods we need for ComponentFactory.comp. 30). } // We could customize the icon associated with the tool by overriding // the paintIcon method here. and getOffsetBounds methods // here. return Bounds. */ public Bounds getOffsetBounds(AttributeSet attrs) { // In this case. */ static final ByteIncrementerFactory instance = new ByteIncrementerFactory(). so I make the constructor method private to restrict creation * to within this class only. 30.logisim. and // of course the width and height are both 30.logisim. A ByteIncrementer is just such a rectangle. AttributeSet attrs) { return new ByteIncrementer(loc. attrs).cburch. the ghost is a rectangle corresponding to getOffsetBounds. /** Constructs an instance. which is a slightly more general concept * than component classes.getName(). there * shouldn't be much reason to invent tools beyond new instances of * AddTool. import java. */ public Components() { tools = Arrays. Components package com.tools.cburch. import com.util.asList(new Tool[] { new AddTool(ByteIncrementerFactory.class. es decir. Actually. */ public List getTools() { return tools. instancias de la clase AddTool que trabaja con diferentes factorías de componentes. */ public String getDisplayName() { return "Increment".Tool.logisim.AddTool. new AddTool(Counter. /** Constructs an instance of this library.tools. } /** Returns the standard name of the library.cburch. though.List.incr.tools.logisim. */ public class Components extends Library { /** The list of all tools contained in this library. */ public String getName() { return Components. } /** Returns the name of the library that the user will see. import com.instance).Clase de la Librería El punto de acceso a la librería JAR es una clase que extiende de Library. practically speaking. this string * won't be used by Logisim.cburch. podríamos necesitar que el incrementador . new AddTool(IncrementerFactory. /** The library of components that the user can access.Arrays. import java.util. * libraries contain tools. las herramientas son todas las herramientas que añaden los diferentes componentes que han sido definidos.logisim. } } /** Returns a list of all the tools available in this library. Como ejemplo.Library.factory). new AddTool(SimpleCounterFactory.cburch. This constructor is how * Logisim accesses first when it opens the JAR file: It looks for * a no-arguments constructor method of the user-designated class. } Incrementador General Una de las mayores ventajas de definir componentes en Java es la posibilidad de que sean configurables a través de sus atributos. }).instance). Technically. en la mayoría de los casos. La función principal de la librería es mostrar las herramientas que están disponibles en la misma. import com.instance). */ private List tools. logisim.logisim.data. attrs.data. */ static final Attribute WIDTH_ATTRIBUTE = Attributes.CircuitState.comp.cburch.addAttributeListener(myListener).Location. because we need such * changes to be reflected in the information about ends managed by the * ManagedComponent superclass.logisim.logisim.trabajase con cualquier número de bits.BitWidth.incr. com.comp. [It happens that the AttributeSet used here * uses strong references.logisim. /** Constructs an incrementer at the given location with the given * attributes.data.AttributeSet. /** The default value of the width attribute. com.]) */ private MyListener myListener = new MyListener(). 2).logisim.data.cburch.data.circuit.ComponentFactory.cburch. com. */ class Incrementer extends ManagedComponent { /** The attribute representing the bit width of the input and output.data.logisim.ManagedComponent.ComponentDrawContext.cburch.logisim. (The more common * idioms for dealing with listeners do not involve such a * local variable.comp.cburch. com.logisim. */ private class MyListener implements AttributeListener { public void attributeListChanged(AttributeEvent e) { } public void attributeValueChanged(AttributeEvent e) { if(e.comp. AttributeSet attrs) { super(loc. las dos clases que vienen a continuación muestran cómo es posible conseguirlo.logisim. */ static final BitWidth WIDTH_DEFAULT = BitWidth. but I strongly prefer this idiom. com.cburch. com. hence the * instance variable. com. com. attrs.cburch.cburch. A side effect of * this is that the listener would die immediately if the listening * object doesn't maintain its own strong reference. */ Incrementer(Location loc.notice the . } /** Sets up the ends of this component.AttributeListener. } } /** Represents the sole instance of MyListener.create(8).cburch.logisim. This component * is designed to illustrate how to use attributes.cburch. but that's no guarantee that a future * version will not.Attribute. com.Attributes. /** Listens for changes to the width attributes.getAttribute() == WIDTH_ATTRIBUTE) computeEnds(). because * I often find it useful to store listeners in the listened-to * object using weak references to avoid situations analogous * to memory leaks when the listened-to object persists beyond * the intended life of the listening object.cburch.Value. com. com.AttributeEvent.logisim.data.cburch. */ private void computeEnds() { // Retrieve information needed for setting the ends .logisim.EndData. com.forBitWidth("Bit Width"). /** Represents an incrementer that can work with any bit width. Incrementer package com.data.cburch.cburch. import import import import import import import import import import import import import com. computeEnds(). cburch.toIntValue() + 1). Incrementer.translate(-30. import import import import import import com. This * is the only change from the ByteIncrementerClass class.drawPins(this).data. context.cburch. } /** Creates an attribute set holding all the initial default values.fixedSet(Incrementer. this. */ public AttributeSet createAttributeSet() { return AttributeSets.createError(in. setEnd(1. com.cburch. EndData. though.getBitWidth(). com. setEnd(0. } else { out = Value.data. in. 0).WIDTH_ATTRIBUTE. // Now set up the ends. in. } public String getDisplayName() { return "Incrementer (General)".logisim.cburch. width.isErrorValue()) { out = Value. } } IncrementerFactory package com.Bounds.comp.OUTPUT_ONLY). BitWidth width = (BitWidth) getAttributeSet().AbstractComponentFactory.AttributeSet. if(in. EndData. } public void propagate(CircuitState circuitState) { Value in = circuitState.INPUT_ONLY). /** Manufactures Incrementer components.drawRectangle(this. * we want to insert the attribute.comp.instance.Location.Component. Location loc = getLocation().getWidth() + 1).logisim.getBitWidth()).logisim. loc.WIDTH_DEFAULT).getBitWidth(). } public void draw(ComponentDrawContext context) { context.getBitWidth()).cburch. private IncrementerFactory() { } public String getName() { return "Incrementer".data.createKnown(in. com. loc.createUnknown(in.data. } circuitState. */ class IncrementerFactory extends AbstractComponentFactory { static final IncrementerFactory instance = new IncrementerFactory(). width.incr. com.getValue(getEndLocation(0)). } else if(in. } .logisim.cburch.logisim. com. } public ComponentFactory getFactory() { return IncrementerFactory. Here.cburch. where * we simply kept the definition implemented in the parent class.AttributeSets. "+1").getValue(WIDTH_ATTRIBUTE).logisim.isFullyDefined()) { out = Value. out. Value out.// access to the attribute set to retrieve the width.setValue(getEndLocation(1). cburch. 30). La solución es crear una clase nueva que represente el estado del objeto y asociar instancias de ésta con el componente a través del estado del circuito padre.AttributeSet.logisim. SimpleCounter package com. we need to store all state information in an object stashed into a CircuitState.logisim.util. import import import import import import import import import import import import import com. A la hora de definir tales componentes existe una importante sutileza: No es posible que el mismo componente almacene el estado. porque un componente individual puede aparecer varias veces en el mismo circuito. 2). attrs. */ private static final BitWidth BIT_WIDTH = BitWidth. que implementa un contador de 8 bits de flanco de subida. com. com. com.Bounds. además de las implementaciones de Component y ComponentFactory que han ilustrado los últimos ejemplos.data. SimpleCounter(Location loc.data. EndData. com.logisim.logisim.OUTPUT_ONLY).Value. com.StringUtil.GraphicsUtil.translate(-30.data.logisim.cburch. com.CircuitState.Direction. this single component would actually appear many times in the overall circuit.cburch.incr.cburch.cburch.cburch. */ class SimpleCounter extends ManagedComponent { /** The width of input and output. com. AttributeSet attrs) { return new Incrementer(loc. com.logisim. El objeto CounterState nos recuerda el estado actual del contador y la última entrada de reloj que ha visto (para detectar los flancos de subida). } } Contador Básico En ocasiones necesitamos componentes que no sean de naturaleza totalmente combinacional. com.BitWidth. 30.logisim. En este ejemplo.logisim.circuit. com. loc. BIT_WIDTH.comp.logisim. setEnd(0.logisim.ONE. Instead.comp.logisim.public Component createComponent(Location loc. -15. es decir.data.INPUT_ONLY).comp.cburch. pero sí puede aparecer varias veces si forma parte de un subcircuito que se usa en más de una ocasión.cburch. } public Bounds getOffsetBounds(AttributeSet attrs) { return Bounds. AttributeSet attrs) { super(loc.cburch. com. attrs).data.cburch. 0).ManagedComponent.logisim.cburch.ComponentFactory. // // // // // // // // Note what's not here: We don't have any instance variables referring to the counter's state.cburch.create(8). podemos definir la clase CounterState para que lleve esta tarea a cabo.EndData.Location. Any instance variables storing state would lead to weird interactions among the states. setEnd(1.logisim. componentes que tengan cierta memoria.data. No puede aparecer varias veces directamente.cburch.create(-30. Thus.ComponentDrawContext.cburch. } . because this component may appear in a circuit that is used several times as a subcircuit to another circuit.util. BitWidth. This example illustrates how a * component can maintain its own internal state. com. /** Represents a simple 8-bit counter.comp. Using instance variables to refer to state would be a major bug. EndData. loc. getValue(getEndLocation(1)). state. CounterState state = getCounterState(circuitState). Bounds bds = getBounds().getCircuitState()).TRUE)) { // Either the state was just created.drawClock(this.getLastClock() == null || (state. this. * generating the state if necessary. circuitState. if the context says not to show state (as // when generating printer output). context.setLastClock(clk). StringUtil.getLastClock() == Value.getX() + bds. bds. then we'll set it up with our default // values and put it into the circuit state so it can be retrieved // in future propagations.instance. if(state == null) { // If it doesn't yet exist. then I shouldn't do this. } return state.public ComponentFactory getFactory() { return SimpleCounterFactory.drawCenteredText(context. state.createKnown(BIT_WIDTH. which could lead to conflicts that don't really represent the value the counter is emitting.drawPin(this. 0.setValue(getEndLocation(1).drawRectangle(this). the state is in a CounterState // object. in either case.getValue(getEndLocation(0)). or else we're on a rising edge // for the clock input. because another component may be pushing a value onto the same wire. However.getY() + bds.EAST).toIntValue() + 1).getValue(). Value newValue = Value. } state. } // // // // // (You might be tempted to determine the counter's current value via circuitState. In this case. Value. bds. Direction.) public void draw(ComponentDrawContext context) { context. 9). } } .createKnown(BIT_WIDTH. } public void propagate(CircuitState circuitState) { // Here I retrieve the state associated with this component via // a helper method.toIntValue()). state). state.setValue(newValue). } } /** Retrieves the state associated with this counter in the circuit state. GraphicsUtil. */ protected CounterState getCounterState(CircuitState circuitState) { CounterState state = (CounterState) circuitState. 1). newValue.getGraphics(). increment the counter. This is erroneous. Value clk = circuitState. though. // I'd like to display the current counter value centered within the // rectangle.toHexString(BIT_WIDTH.getValue().getHeight() / 2). state = new CounterState(null.FALSE && clk == Value. circuitState.getData(this). -1)).getWidth() / 2.setData(this. if(context.getWidth(). if(state. context.getShowState()) { CounterState state = getCounterState(context. } /** Returns the current value emitted by the counter. */ public Object clone() { // We can just use what super.data. This example illustrates how a * component can maintain its own internal state.cburch.logisim.data. this.incr. /** Manufactures simple 8-bit counters. /** The current value emitted by the counter. } } /** Returns the last clock observed.logisim.cburch. import com.cburch.cburch. */ public Value getLastClock() { return lastClock.incr.logisim. */ public void setValue(Value value) { this.logisim.comp.cburch.logisim.cburch.Component. */ public Value getValue() { return value. so we don't care that both the copy // and the copied refer to the same Value objects. then of course we would need to clone them.clone() returns: The only instance variables are // Value objects.clone(). */ class CounterState implements ComponentState. } catch(CloneNotSupportedException e) { return null. */ public void setLastClock(Value value) { lastClock = value.value = value. */ public CounterState(Value lastClock.AbstractComponentFactory.Value. appears in the SimpleCounter and . com.Location.logisim.data. } /** Returns a copy of this object. try { return super. com.data. which are immutable. import com.lastClock = lastClock.AttributeSet. } /** Updates the last clock observed. import import import import import com.value = value.comp.cburch.logisim.ComponentState. */ private Value value. com. } /** Updates the current value emitted by the counter.comp.Bounds. /** Represents the state of a counter. Value value) { this. } } SimpleCounterFactory package com.cburch.CounterState package com. com. Cloneable { /** The last clock input value observed. /** Constructs a state with the given values. though. If we had mutable instance // variables. All of the code relevant * to state. */ private Value lastClock.cburch. logisim.AttributeEvent.AttributeSet. com.cburch. con la clase factoría anidada de forma privada junto con cualquier clase soportada.cburch. Este ejemplo también muestra la que considero la mejor forma de estructurar una librería de componentes: Tener una simple clase por cada componente.cburch.cburch.cburch. import import import import import import import import import import import import import import import import import import import com.data.Bounds.logisim.cburch.data. Esto hace necesario implementar el método getFeature de Component de manera que devuelva una implementación Pokable.data. com.Attributes.logisim.cburch.logisim. import java. com. com. attrs). com.cburch.logisim.AbstractComponentFactory.* CounterState classes.cburch.cburch.cburch. com. private SimpleCounterFactory() { } public String getName() { return "Simple Counter". com.Value. } } Contador Esta introducción a las librerías de Logisim concluye con un contador bastante sofisticado que permite al usuario modificar el valor actual utilizando la Herramienta De Cambio.awt. Counter package com.logisim.tools. com.incr. AttributeSet attrs) { return new SimpleCounter(loc.Pokable.tools. -15.ComponentFactory.data.AbstractCaret. import java. 30. .logisim.awt.logisim.create(-30. com.logisim.logisim.EndData.Graphics.comp.Attribute. com.data.cburch.Caret.Color. com.cburch.Component.BitWidth.comp. com. } public String getDisplayName() { return "Counter (Simple)".logisim.AttributeListener.circuit.CircuitState. com.logisim.tools. com. com.KeyEvent.logisim. } public Component createComponent(Location loc. 30).comp.data.cburch.Location.cburch.logisim.data.data. com. com.cburch.ComponentUserEvent.data.cburch.logisim.cburch.logisim.comp.event.awt. } public Bounds getOffsetBounds(AttributeSet arg0) { return Bounds.cburch. com. */ class SimpleCounterFactory extends AbstractComponentFactory { static final SimpleCounterFactory instance = new SimpleCounterFactory().cburch. la implementación Pokable proporciona acceso a una implementación Caret que puede hacerse cargo de los eventos de teclado y ratón de forma apropiada. import java.logisim.data.logisim.comp.AttributeSets.logisim. */ private class MyListener implements AttributeListener. } /** Manufactures the caret for interacting with the user. static final Attribute WIDTH_ATTRIBUTE = Attributes.fixedSet(Counter. AttributeSet attrs) { return new Counter(loc. since the rectangle drawn doesn't // have room to display more than 12 bits. // The previous examples have included two separate classes for each // component. */ private class PokeCaret extends AbstractCaret { /** The circuit state the user is poking with. */ class Counter extends SimpleCounter { // Note that I've extended SimpleCounter to inherit all of its logic // for propagation and drawing.WIDTH_ATTRIBUTE. Pokable { public void attributeListChanged(AttributeEvent e) { } public void attributeValueChanged(AttributeEvent e) { if(e.forBitWidth("Bit Width". whose value can be * modified interactively by the user.create(-30. } } /** Implements all the functionality that interacts with the user when * poking this component. 30). private static class Factory extends AbstractComponentFactory { private Factory() { } public String getName() { return "Counter". 12). public static final ComponentFactory factory = new Factory(). attrs). though. Counter.getCircuitState()). the entry point for this * interaction is via the getFeature method. 1.WIDTH_DEFAULT). } } /** In addition to listening for changes to the width attribute (as with * the Incrementer example). } public Component createComponent(Location loc. static final BitWidth WIDTH_DEFAULT = BitWidth. } public AttributeSet createAttributeSet() { return AttributeSets. and to include // a constant referring to the factory. // I'll restrict the maximum width to 12. } public String getDisplayName() { return "Counter". -15.getAttribute() == WIDTH_ATTRIBUTE) computeEnds(). In practice. } public Bounds getOffsetBounds(AttributeSet arg0) { return Bounds. 30. The most convenient technique for this // is to make a private nested class for the factory. I personally prefer having just // one file per component type. */ . The primary purpose of this example is * to illustrate the addition of user interaction. */ public Caret getPokeCaret(ComponentUserEvent event) { return new PokeCaret(event.create(8)./** Implements a counter for an arbitrary number of bits. this also serves for manufacturing * the "caret" for interacting with the user. and // it immediately.setValue(newValue).getAttributeSet(). initValue = initial. Since this caret modifies the state as the user * there is nothing to do here.getKeyChar(). /** Commit the editing. g. Value newValue = Value.digit(e.getCounterState(circuitState). /** The initial value. int val = Character.getEndLocation(1). newValue. Here.ht) / 2. propagate // change the value immediately in the component's state.this. abort. // height of caret rectangle g.getValue(). // width of caret rectangle int ht = 16. /** Processes a key by just adding it onto the end of the current value. ht).getWidth() . setBounds(Counter. bds. */ public void keyTyped(KeyEvent e) { // convert it to a hex digit.createKnown(width.RED). */ public void cancelEditing() { Counter.getHeight() .getCounterState(circuitState). but it may be in a future version. (state. } g. the constructor.setValue(Counter. if(val < 0) return. state.getValue(WIDTH_ATTRIBUTE).this. BitWidth width = (BitWidth) Counter.getBounds().this.this. wid.this. (Canceling an edit is not currently * supported in Logisim.getY() + (bds.) */ Value initValue. int wid = 7 * len + 2. CounterState state = Counter.getBounds()).toIntValue() * 16 + val) & width. int len = (width.setColor(Color.this.drawRect(bds. circuitState. BitWidth width = (BitWidth) Counter. CounterState initial = Counter.getCounterState(circuitState).this. */ public void draw(Graphics g) { Bounds bds = Counter.getX() + (bds. PokeCaret(CircuitState circuitState) { this.getWidth() + 3) / 4.BLACK).circuitState = circuitState.getValue(). */ public void stopEditing() { } } /** Cancel the editing.getMask()).setColor(Color.getAttributeSet(). 16).this.CircuitState circuitState. 1). } /** Draws an indicator that the caret is being selected. if it isn't a hex digit. we'll draw * a red rectangle around the value. } edits. } // The listener instance variable.wid) / 2. Counter. // compute the next value. We use this in case the user cancels the editing * to return to the initial value.this.getValue(WIDTH_ATTRIBUTE).setValue(initValue). and computeEnds all . } } public ComponentFactory getFactory() { return factory. EndData. 0). Naturalmente puedes utilizar otros paquetes. } Directrices Aprendiendo más Más allá de la serie de ejemplos que se proporcionan aquí. computeEnds(). el código fuente de Logisim proporciona una copiosa cantidad de ejemplos añadidos. BitWidth width = (BitWidth) getAttributeSet(). bien recibidas. . entonces tu sugerencia será bienvenida y estaré contento de agradecer tu contribución en versiones de Logisim que incluyan tu trabajo. En general estoy más que dispuesto a responder cualquier petición de ayuda. AttributeSet attrs) { super(loc. setEnd(1. loc.getValue(WIDTH_ATTRIBUTE). */ public Object getFeature(Object key) { if(key == Pokable. Si crees que tu librería debería estar incluida en la publicación básica de Logisim. private Counter(Location loc.translate(-30. me encantará proporcionar un link a una página Web anfitriona o el mismo archivo JAR desde el sitio web de Logisim. Derivar a partir del código proporcionado en la Guía del Usuario no infringe tales restricciones. private MyListener myListener = new MyListener(). loc. which it can use to * access the caret for interaction.class) return myListener.// proceeds just as in the Incrementer class. EndData. estos ejemplos son de dominio público.OUTPUT_ONLY). attrs.INPUT_ONLY). BitWidth. naturalmente. pero siempre sabiendo que son más vulnerables a cambios en futuras versiones de Logisim. attrs). Logisim will call this method with the key being the Pokable * class. Si quieres compartir tu librería con otros usuarios de Logisim. Para una máxima portabilidad de las futuras versiones. When a user clicks on the component with * the poke tool. Distribución Eres libre de distribuir cualquiera de las librerías JAR que desarrolles sin restricción alguna. Además. aunque no siempre muestren tanta atención a su legibilidad y buen diseño. Poke support * is considered a special feature. return super. deberías amoldarte lo más posible a las clases de los paquetes. } private void computeEnds() { Location loc = getLocation(). width. sin embargo.addAttributeListener(myListener).getFeature(key). La restricciones de GPL se aplican. } /** Retrieves a "special feature" associated with this component. setEnd(0. We should return a Pokable object in response. información acerca de errores y sugerencias para posibles mejoras son.ONE. si algún trozo de tu código se deriva de algún trozo del código fuente de Logisim (que se hace público bajo GPL). esta información me permitirá ganar más apoyo para el trabajo. incluso sin la garantía implícita de COMERCIABILIDAD o BUEN ESTADO PARA UN USO PARTICULAR. Agradecimientos El código fuente de Logisim es principalmente fruto de mi propio trabajo. y tus sugerencias serían más que bienvenidas. pero SIN NINGUNA GARANTÍA. Logisim es software libre. por favor recuerda que he trabajado duro para desarrollar Logisim sin recibir retribución alguna por tu parte. Le estoy muy agradecido a estas instituciones por haberme proporcionado el tiempo y los recursos para trabajar en este proyecto. que utilizaron las versiones más rudimentarias cuando Logisim estaba siendo desarrollado. Sin embargo. sigo interesado en mejorar Logisim. ¡Estos alumnos dieron con muchos errores y les estoy muy agradecido por su paciencia y por sus sugerencias! Algunas de las piezas de Logisim provienen de paquetes de otros que son utilizados por Logisim.2004 y lo he continuado en Hendrix College (Conway. Comunicádmelo especialmente si sois una institución educativa. USA) desde el 2004 hasta el día de hoy. ¡Ojalá todos los colegios y universidades se preocuparan tanto por una excelente enseñanza como lo hacen estas instituciones! En segundo lugar está Pablo Leal Ramos que desarrolló la traducción al castellano para la versión 2. y también en la primavera de 2005 en las clases de CS61C en la Universidad de California. incluyendo informes de errores y sugerencias. que beta-testearon las primeras iteraciones de la versión 2. algunas de estas piezas se distribuyen como parte de Logisim. incluyendo este programa: Comencé este programa en la Universidad de Saint John (Collegeville. (No conozco ningún competidor de código abierto que se acerque al conjunto de características que ofrece Logisim). Arkansas. debo agradecer a las instituciones que financian mi trabajo como profesor. Será bienvenido cualquier mail acerca de Logisim. por favor házmelo saber. puedes redistribuirlo y/o modificarlo bajo los términos de la Licencia Pública General GNU como se publica en la Free Software Foundation.1. Minnesota. Si quieres tener el derecho a quejarte del software. Finalmente y también significante están dos grupos de estudiantes que han trabajado con las primeras versiones de Logsim: En la primavera del 2001 en las clases de CSCI 150 en el Colegio de Saint Benedict y en la Universidad de Saint John. Para más información consultar la Licencia Pública General GNU. El código fuente está incluido en el directorio src del archivo JAR que se distribuye. Aviso del copyright Copyright (c) 2005. Carl Burch. igualmente en la versión 2 de la Licencia o (a tu elección) cualquier versión posterior. Si encuentras útil Logisim.Acerca del programa Logisim es software de código abierto. Berkeley.0 mientras estudiaba en Hendrix como alumno de intercambio de España.0. entonces te sugeriría que te gastases el dinero en un programa que compita con Logisim. API Sun's Java (obviamente) Proyecto Sun's Javahelp . USA) en 2000 . Cuando me escribas. Logisim se distribuye con la esperanza de ser útil. de www. Adaptador MRJ. de Grzegorz Kowalt Proporciona el ejecutable de Windows para la distribución de Logisim. JDOM. Esto estaba basado en el código en C escrito por Sverre H. launch4j. Y por último.org Lee y salva datos XML. de Steve Roy Integración con la plataforma Macintosh OS X. Codificador GIF. quiero agradecer a todos los usuarios que se han puesto en contacto conmigo . Huseby. de Adam Doppelt Salva imágenes como archivos GIF.Sistemas de ayuda.jdom. sugerencias o simplemente para hacerme saber que utilizan Logisim en sus clases -.lo mismo que haya sido a través de informes de errores. Tengo que mantener en el anonimato la identidad de estos participantes porque no tengo su permiso para incluirlos aquí pero: ¡Gracias! .