Está en la página 1de 60

Manual del Usuario de Logisim

Logisim es una herramienta de libre distribucin (free-ware!) de diseo y simulacin de circuitos


lgicos digitales. Su intuitiva interfaz y su sencillo simulador permiten aprender con facilidad los
conceptos bsicos relacionados con la lgica de los circuitos digitales. Con la capacidad de construir
grandes circuitos a partir de otros ms simples, Logisim puede ser utilizado para el diseo completo de
CPUs con propsitos educativos.
Logisim es utilizado en universidades a lo largo y ancho del mundo con diferentes propsitos, entre los
que se incluyen:

Un mdulo de educacin general de introduccin a la informtica.

Una unidad en cursos de nivel de segundo ao en organizacin de ordenadores.

Un semestre completo en cursos de alto nivel de arquitectura de ordenadores.

El Manual Del Usuario de Logisim, que ests leyendo ahora, es la referencia oficial para las
caractersticas de Logisim. En primer lugar estn unas secciones encaminadas a introducir las partes ms
importantes de Logsim. Estas secciones han sido escritas, leyndolas de principio a fin, especialmente
para aprender acerca de las caractersticas ms importantes de Logisim.
Tutorial: primeros pasos con Logisim
Libreras y atributos
Subcircuitos
Haces de cables
Anlisis combinacional
Las secciones restantes son un grupo ms diverso de explicaciones y materiales de referencia acerca de
algunos recovecos de Logisim.
Referencia del Men
Componentes de memoria
Registro
Preferencias de aplicacin
Opciones de proyecto
Propagacin de valores
Libreras JAR
Acerca del programa

Tutorial: Primeros pasos con Logisim


http://www.cburch.com/logisim/es/docs.html

Bienvenidos a Losgisim!
Logisim permite disear y simular circuitos digitales. Est pensado como una herramienta educativa
que ayuda a entender cmo 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 disear 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. Adems como utilidad aadida tendremos un circuito que seguramente
tendr mejor aspecto que el dibujado a mano.
Disfruta la construccin del circuito!

Paso 0: Orientndose
Cuando empieces con Logisim vers una ventana similar a la siguiente. Si usas un sistema diferente
algunos detalles podran 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 estn 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. Adems, la barra de men es muy intuitiva.
Eso deja la barra de herramientas y el lienzo. El lienzo es dnde dibujars tu circuito y la barra de
herramientas contiene todo lo necesario para llevar a cabo esta tarea.

Paso 1: Aadiendo puertas


Recordemos el circuito que bamos a dibujar con Logisim.

Construir un circuito es ms fcil insertando las puertas primero a modo de esqueleto para ms tarde
aadir el cableado al circuito. Lo primero que vamos a hacer es aadir dos puertas AND. Pincha sobre el
botn AND en la barra de herramientas ( , el penltimo botn de la barra de herramientas). Despus
pincha en el rea de edicin, lienzo, justo donde quieras que vayan las puertas AND. Asegrate 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 slo utilizaremos dos entradas para nuestro circuito XOR, pero
para otros circuitos, tener ms de dos entradas en las puertas AND puede resultar muy til.

Ahora aade las otras puertas. Primero pincha sobre el botn OR (


Luego selecciona la puerta NOT (

); despus pincha dnde quieras.

) y pon dos de ellas en el lienzo.

Se puede dejar un pequeo espacio entre las puertas NOT y AND aunque tambin es posible dejarlas
pegadas, algo que ms tarde nos ahorrar el tener que pintar una lnea de cable para unirlas.
Ahora queremos aadir dos entradas x e y al esquema. Selecciona el pin de entrada (

), y sita los

pins abajo. Tambin deberas emplazar un pin de salida ( ) cerca de las salidas de la puerta OR. (Otra
vez, aunque se deja algo de espacio entre la salida de la puerta OR y los pines de salida, t podras elegir
pegarlos directamente).

Si decides que no te gusta el lugar en el que has puesto alguno de los elementos, entonces puedes
pulsar el botn derecho del ratn, o el izquierdo mientras pulsas la tecla Ctrl, sobre uno de los elementos
para ver un men desplegable. Elige Borrar para deshacerte del elemento. Tambin puedes reordenar las
cosas utilizando la herramienta (

).

Paso 2: Aadiendo cables


Una vez que tengas todos los componentes necesarios en el lienzo, ests listo para para empezar a
aadir el cableado. Selecciona la herramienta para aadir cable ( ). Entonces comienza a arrastrar el
ratn, con el botn izquierdo pulsado, desde un punto a otro del lienzo y aparecer un cable uniendo los
dos puntos.
Los cables en Logisim deben ser horizontales o verticales. En el ejemplo para conectar el pin de
entrada superior con las puertas NOT y AND se aaden tres cables diferentes.

Logisim conecta los cables a las puertas y entre ellos automticamente. Estos incluye la sealizacin
de la conexin entre cables con un crculo justo sobre la interseccin de los mismos.
A medida que vayas dibujando cables, podras encontrarte con algunos de color azul o gris. El azul en
Logisim indica que el valor en ese punto es desconocido, y el gris indica que el cable no est conectado a
nada. Esto no es un problema por el momento. Pero una vez que tu circuito est acabado, ningn cable
podr estar ni azul ni gris. (Las patas desconectadas, que no se utilizan, de las puertas OR y AND
permanecern azules, y as debe ser.)
Si an tienes algn cable azul o gris cuando creas que ya todo debera estar conectado, entonces algo
va mal. Es importante que se conecten los cables en los lugares adecuados. Logisim dibuja pequeos
puntos en los componentes para indicar dnde deberan conectarse los cables. A medida que vayas
haciendo conexiones vers que los puntos van cambiando del azul al verde claro u oscuro.
Una vez que tengas todos los cables conectados, todos los cables insertados deberan mostrarse verde
clarito u oscuro (casi negro).

Paso 3: Aadiendo texto


No es necesario aadir comentarios al circuito para que funcione; pero si quieres ensear tu circuito a
alguien (como un profesor), en ese caso poner algunas etiquetas ayudar a entender el propsito de las
diferentes partes de tu circuito.
Selecciona la herramienta de texto ( ). Puedes pulsar en un pin de entrada y escribir algo para
asociarle una etiqueta. (Es mejor que pulsar directamente sobre el componente, en este caso el pin de
entrada, que pulsar dnde quieres que vaya el texto. As la etiqueta se mover con el componente.)
Puedes hacer lo mismo con el pin de salida. O tambin puedes simplemente pulsar y escribir en cualquier
otro lado para aadir una etiqueta all.

Paso 4: Testeando el circuito


El paso final es probar el circuito para asegurarnos de que realmente hace lo que queramos. Logisim
ya est simulando el circuito. Echemos un vistazo donde estbamos.

Hay que fijarse en que los pines de entrada contienen 0s al igual que el pin de salida. Esto significa
que el circuito tiene como salida un 0 cuando ambas entradas estn a 0.
Ahora para seleccionar otra combinacin de entrada, selecciona la herramienta de cambio ( ) y
empieza a cambiar los pines de entrada pulsando sobre ellos. Cada vez que pulses sobre un pin de
entrada, su valor conmutar. Por ejemplo, podemos cambiar el valor del pin de entrada inferior.

Cuando cambies el valor de entrada, Logisim te mostrar que valor viaja a travs de un cable
pintndolo de verde muy claro para indicar un 1 o verde oscuro (casi negro) para indicar un 0. Adems
puedes ver que el valor de salida ha cambiado a 1.

Hasta aqu, se han probado las dos primeras filas de la tabla de verdad, y las salidas (0 y 1) son
concuerdan con lo deseado.

Cambiando los valores de entrada, se pueden verificar las otras dos filas. Si todas concuerdan,
entonces esto est listo: El circuito funciona!
Para guardar el trabajo realizado, puedes salvar o imprimir el circuito. Esto se puede llevar a cabo
desde el men Archivo, donde tambin se puede salir del programa, pero Por qu dejarlo ahora?
Ahora que has acabado con el tutorial puedes practicar con Logisim creando tus propios circuitos. Si
quieres crear circuitos con caractersticas ms sofisticadas, entonces deberas navegar por el resto de la
ayuda para ver todo lo que puedes hacer. Logisim es un programa poderoso que te permite crear y
probar circuitos de gran tamao, este tutorial paso a paso muestra lo ms simple.

Libreras y Atributos
En esta seccin, se examinar como utilizar dos zonas de la consola de Logisim: el panel
explorador y la tabla de atributos.

El panel explorador
La tabla de atributos
Atributos de herramienta

El panel explorador
Las Libreras contienen componentes que se pueden usar en los circuitos. Se muestran como
carpetas en el panel explorador; para tener acceso a los componentes de una librera, tienes que hacer
doble clic sobre la carpeta correspondiente. Debajo, se ha abierto la librera de Puertas y se ha
seleccionado la herramienta NAND en ella. Puedes ver que ahora que Logisim est preparado para aadir
puertas NAND en el circuito.

Si te fijas entre los elementos seleccionables en la librera de puertas, te dars cuenta de que no haba
necesidad de desarrollar el circuito XOR que se cre en el tutorial.
Cuando creas un proyecto, se incluyen automticamente las libreras de Base y de Puertas. Pero Logisim
incluye otras libreras: Para cargar una, vete al men de Proyecto, al submen Cargar Librera, y elige
Librera Incorporada.... Aparecer una ventana de dilogo que te permitir elegir las libreras que quieras
aadir. Se eliges, por ejemplo, Plexores entonces podrs aadir a tus circuitos multiplexores,
demultiplexores y decodificadores. Puedes cargar tantas libreras como necesites.
En el submen de Cargar Librera, puedes ver que Logisim tiene tres categoras de libreras.

Libreras incorporadas Built-in libraries son libreras que son distribuidas con Logisim. stas estn

documentadas en la Referencia de las Libreras.


Libreras Logisim son proyectos hechos con Logisim y guardados en el disco. Puedes desarrollar un

conjunto de circuitos en un proyecto (algo que se explica en la seccin de Subcircuitos de esta gua) y
despus utilizar ese grupo de circuitos como una librera para otros proyectos.
Libreras JAR son libreras que han sido desarrolladas en Java pero que no se distribuyen con
Logisim. Puedes descargarte libreras que otros hayan escrito o puedes crear las tuyas propias tal y
como se describe en la seccin Libreras JAR de esta gua. Desarrollar una Librera JAR es mucho ms
complejo que desarrollar una librera Logisim, pero los componentes puenden ser mucho ms
elegantes, incluyendo los atributos y la interaccin con los usuarios. Las libreras incorporadas
(excepto la librera Base) fueron escritas utilizando la misma API que las libreras JAR pueden utilizar,
as ellas demuestran el nivel de funcionalidad que se puede conseguir con las libreras JAR.

Cuando se cargue una librera JAR, Logisim te pedir que selecciones el archivo JAR correspondiente,
y luego te pedir que escribas un nombre de clase. Este nombre de clase debera ser proporcionado por
el que te hiciera llegar el archivo JAR.
Para eliminar una librera, selecciona Descargar Librera... desde el men de Proyecto. Logisim te
proteger de un intento de eliminacin de una librera que contenga componentes utilizados en algn
circuito, que aparezcan la barra de herramientas o que estn asociados a algn botn del ratn.
Una librera tcnicamente contiene herramientas no componentes. As, en la librera Base encontrars
la Herramienta de Cambio ( ), la Herramienta de Seleccin ( ), y otras herramientas que no se
corresponden directamente con componentes individuales. La mayor parte de las libreras, sin embargo,
contienen slo herramientas para aadir componentes individuales: todas las libreras incorporadas
excepto la librera de Base son de este tipo.

La tabla de atributos
Muchos de componentes tienen atributos, que no son ms que propiedades para configurar el
comportamiento o la forma en la que aparece el componente. La tabla de atributos sirve para ver y
mostrar los valores de los atributos de un componente.

Para seleccionar los atributos del componente que se quiere ver, haz click sobre el componente
utilizando la herramienta de Seleccin ( ). (Tambin puedes pulsar el botn derecho del ratn, o el
izquierdo mientras pulsas Ctrl, y elegir Mostrar Atributos en el men desplegable. Adems, manipulando
el componente con la herramienta de Cambio (
mostrarn los atributos de ese componente.)

) o con la herramienta de Texto (

) tambin se

La captura de pantalla de abajo muestra cmo 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.

Fjate en el la lnea oval azul claro que rodea al pin de entrada, se llama aureola y incica de que
componente son los atributos que se estn mostrando.
Para modificar el valor de un atributo, haz clic simplemente en el valor. La interfaz para modificar el
atributo depender del tipo de atributo que ests cambiando; en el caso del atributo de la Fuente del
Etiquetado, aparecer un cuadro de dilogo para seleccionar el nuevo tipo de fuente; pero algunos
atributos (como la Etiqueta) te permitirn editar su valor como un campo de texto, mientras que otros
(como la Posicin de la Etiqueta) un men desplegable en el que seleccionar el valor correspondiente.
Cada componente tiene un conjunto de atributos diferentes; para saber lo que significan, puedes
consultar la documentacin adecuada en la Referencia de las Libreras.
Algn valor de los atributos de algn componente no se puede modificar. Un ejemplo es el atributo
Tamao de Puerta de la puerta AND: Al crear una puerta AND, su tamao est prefijado. Si quieres crear
una puerta AND de un tamao diferente, entonces necesitars cambiar los atributos de la herramienta
(del elemento de la librera), algo que comentaremos en el siguiente paso.

Atributos de herramienta
Toda herramienta que permita aadir componentes al circuito tiene tambin un conjunto de atributos,
que son aplicados a los componentes que crea la herramienta, aunque los atributos de los componentes
puedan cambiar ms tarde sin que esto afecte a los atributos de la herramienta. Cuando se selecciona
una herramienta, Logisim cambiar la tabla de atributos para mostrar los atributos de la herramienta.
Por ejemplo, supongamos que se quiere crear una puerta AND ms pequea. Ya hemos visto que el
atributo de Tamao de Puerta de una puerta AND no es editable. Pero el atributo de Tamao de Puerta es
editable para la herramienta de puerta AND: Para ver y editar este atributo, haz clic en el icono
correspondiente de la barra de herramientas (o en el panel explorador), y cambia su atributo Tamao de
Puerta.

Ahora se pueden borrar las puertas AND existentes y sustituirlas por dos nuevas puertas AND, ms
estrechas, en su lugar. En esta ocasin las puertas sern estrechas. (Si eliges sustituir el nmero de
entradas a 3, la puerta AND no tendra prolongacin vertical en el lado izquierdo de la puerta. Pero en ese
caso tambin tendras que recablear el circuito para que los cables hiciesen conexin en el sitio adecuado
de la parte izquierda de la puerta.)

Para algunas herramientas, el icono representa alguno de sus atributos. Un ejemplo es la herramienta
del Pin, cuyo icono est orientado de la misma forma que seala su atributo.
Las herramientas de la barra de herramientas tienen un conjunto de atributos guardado aparte del
que tienen las correspondientes herramientas en el panel explorador. As, aunque se cambie la
herramienta AND de la barra de herramientas para crear puertas AND estrechas, la herramienta AND del
panel explorador continuar creando puertas AND anchas a no ser que cambies tambin sus atributos.
De hecho, el pin de entrada y el pin de salida en la barra de herramientas por defecto son instancias
de la herramienta Pin, de la librera Base, pero sus tres atributos son diferentes. El icono para la
herramienta Pin est dibujado como un crculo o un cuadrado dependiendo del valor del su atributo
Salida?
Logisim adems proporciona una forma sencilla de cambiar el atributo de Orientacin que controla la
direccin en la que los componentes se orientan: Pulsando las teclas de las flechas mientras una
herramienta est seleccionada cambia automticamente la direccin del componente.

Subcircuitos

A medida que construyas circuitos ms y ms complejos, querrs desarrollar circuitos ms sencillos que a
su vez puedan ser utilizados en circuitos de mayor tamao. En Logisim este tipo de circuitos, que pueden
ser utilizados en otros de mayor tamao, reciben el nombre de subcircuitos.
Si ests familiarizado con la programacin informtica, entiendes lo que es el concepto de subprograma
(algo que recibe el nombre de subrutina, funcin, mtodo o procedimiento segn el programa) . El
concepto de subcircuito es anlogo al concepto en la programacin informtica, y es utilizado con los
mismos propsitos: Para separar un gran trabajo en pequeas partes ms abordables por separado, para
ahorrarse el esfuerzo de definir la misma cosa varias veces, y para facilitar la bsqueda de errores.
Creando circuitos
Usando subcircuitos
Depuracin de subcircuitos
Libreras de Logisim

Creando circuitos
Cualquier proyecto de Logisim es tambin una librera de circuitos. En su forma ms simple, cada
proyecto solamente posee un circuito (llamado "main", principal, por defecto), pero es sencillo aadir
ms: Seleccionar Aadir Circuito... en el men de Proyecto, y escribir un nombre para el nuevo circuito
que quieres crear.
Supngase que se quiere construir un multiplexor 1x2 con el nombre "1x2 MUX." Despus de aadir el
circuito, Logisim tendr este aspecto.

En el panel explorador, ahora puedes ver que el proyecto contiene dos circuitos, "main", y "1x2 MUX."
Logisim dibuja una lupa sobre el circuito que est siendo mostrado; el nombre del circuito en uso tambin
aparece en la barra superior que contiene el ttulo de la ventana.
Despus de editar el circuito para obtener un multiplexor 1x2, se puede utilizar el siguiente circuito.

Usando subcircuitos
Ahora supongamos que queremos construir un multiplexor 2x4 a partir del multiplexor 1x2. Por
supuesto, se creara primero un nuevo circuito, el cual se llamara "2x4 MUX." Para aadir los
multiplexores 1x2 in el circuito, se hace un slo clic sobre el circuito 1x2 MUX en el panel explorador para
seleccionarlo como una herramienta, y posteriormente se pueden aadir copias del mismo, representadas
como cajas, haciendo clic sobre el lienzo.

Si haces doble clic sobre el circuito 1x2 MUX en el panel explorador, entonces el lienzo cambiar su
contenido para pasar a editar el circuito 1x2 MUX.
Despus de crear el circuito, estaremos en una situacin como la siguiente.

Para el multiplexor 2x4 se usan tres copias del multiplexor 1x2, cada una dibujada como una caja con
sus pines de entrada/salida a lo largo de su borde. 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. Los dos pines en el
lado izquierdo (oeste) de la caja se corresponden con los dos pines que estn orientados al este (atributo
de orientacin en la tabla de atributos de los pines de entrada); 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); 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. El orden de los dos pines en la parte izquierda de la caja se corresponde
con la misma disposicin de arriba a abajo que se aparece en el subcircuito. (Si hubiese varios pines en la
parte superior (norte) o inferior (sur) de la caja, su orden se correspondera con el mismo que est
presente en el subcircuito de izquierda a derecha.)
Si los pines del subcircuito tienen etiquetas asociadas, entonces Logisim mostrar esas etiquetas en
un texto de aclaracin (tip) que no es ms que una caja de texto temporal que se muestra cuando el
puntero del ratn se detiene lo suficiente sobre el elemento que interese, en este caso sobre el uno de los
pines (Si encuentras molestos estos mensajes de aclaracin, de ayuda, puedes deshabilitarlos desde
la Pestaa del Lienzo en la ventana de las opciones de proyecto.)

Otros componentes tambin mostrarn las aclaraciones (tips): Por ejemplo, para algunos de los pines
de la librera biestables, si se detiene el ratn un rato sobre alguno de los pines se explicar para que
sirve.

Todos los pines de un circuito tienen que ser de entrada o de salida. Algunos de los chips
manufacturados tienen pines que pueden ser de entrada o de salida dependiendo de la situacin, no
podrs utilizar ese tipo de chips con Logisim.
Logisim mantendr una informacin de estado diferente para todos los subcircuitos que aparezcan en
un circuito. Por ejemplo, si un circuito contiene un biestable, y ese circuito est siendo usado como
subcircuito varias veces, entonces cada biestable del subcircuito tendr su propio valor cuando se simule
el circuito de mayor tamao.
Ahora que se ha definido el multiplexor 2x4, una vez ms es posible utilizarlo en otros circuitos.
Logisim no impone lmites a la anidacin de circuitos - aunque no permitir anidar un circuito en s
mismo!
Nota: No existe ningn problema en editar un circuito que est siendo utilizado como
subcircuito, de hecho, esto es algo bastante comn. Sin embargo, hay que ser
conscientes de que cualquier cambio a los pines de un circuito (aadiendo, eliminando,
o movindolos) tambin modificar los pines en los circuitos que lo contengan. As, si
cambias algn pin en un circuito, tambin tendrs que editar todos los circuitos que lo
usen como subcircuito.

Depurando subcircuitos
A medida que vayas probando circuitos de mayor tamao, probablemente encontrars errores. Para
concretar cul es el problema, echar un vistazo a lo que est ocurriendo con los subcircuitos puede
ayudar. Puedes hacer esto desde la vista del circuito total si haces saltar el men desplegable del
subcircuito (recuerda: haz clic con el botn derecho del ratn sobre el componente o clic con el botn
izquierdo mientras pulsas la tecla Ctrl). Luego selecciona la opcin Vista.

Despus de seleccionar esto, la vista de la pizarra, lienzo, se cambiar por la del subcircuito.

Fjate en que los valores de los pines del subcircuito concuerdan con los valores que le estn llegando
desde el circuito que lo contiene.
Mientras que en el subcircuito puedes cambiarlo como quieras; cualquier cambio a los valores de los
pins ser propagado al circuito contenedor. (Si intentas modificar el valor de un pin utilizando la
Herramienta de Cambio, Logisim lanzar un cuadro de dilogo para preguntarte si quieres crear un nuevo
estado o no; responder que S (Aceptar) separar el estado visto en el subcircuito del visto desde el
circuito contenedor, mientras que responder que No (Cancelar) no permitir el cambio de valor del pin.)

Libreras de Logisim
Todo proyecto de Logisim es de forma automtica una librera que puede ser cargada en otros
proyectos de Logisim. Lo nico que tienes que hacer es salvar el proyecto en un archivo y cargar la
librera desde otro proyecto. Todos los circuitos definidos en el primer proyecto estarn entonces
disponibles como subcircuitos para el segundo proyecto. Esta caracterstica te permite reutilizar
componentes en varios proyectos y compartir tus componentes favoritos con tus amigos (o estudiantes).
Cada proyecto tiene un circuito "main" (principal) asignado, algo que puede cambiar seleccionando el
circuito que est abierto como principal utilizando la opcin Seleccionar Como Circuito Principal en el
men de Proyecto. El circuito principal es el primero que se muestra cuando abres el proyecto. El nombre
por defecto del circuito principal ("main") no tiene importancia y puedes cambiarle el nombre o borrar
dicho circuito si as lo deseas.
Con una Librera de Logisim que est cargada, puedes ver circuitos y modificar sus estados, pero
Logisim no te dejar modificarlos.
Si quieres modificar un circuito que est en una librera de Logisim que est cargada, tendrs que
abrirlo de forma separada con Logisim. Tan pronto como lo salves, el otro proyecto debera cargar
automticamente la versin modificada de inmediato, pero si esto no ocurre, puedes hacer clic con el
botn derecho sobre la carpeta de la librera correspondiente en el panel explorador y seleccionar
Recargar Librera.

Haces de cables
En los circuitos simples de Logisim, la mayora de los cables llevan slo un bit; pero Logisim tambin
te permite crear cables que contienen varios bits.
Creando haces
Separadores
Colores de los cables

Creando cables
Los pines de entrada y salida de los componentes tienen un nmero de bits asociado. Muchos de los
componentes incorporados en Logisim poseen atributos que permiten la eleccin del nmero 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; cada pin de entrada tiene su atributo llamado Nmero De Bits configurado para recibir
tres bits, como se indica en los atributos de la puerta AND mostrada.

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 lgico de sus correspondientes en los pines de entrada.
En los componentes todos las entradas y las salidas deben de tener definidos su nmero de bits. Sin
embargo, el nmero de bits de los cables no tiene que estar definido, se adapta al nmero de bits del pin
al que es conectado. Si un cable conecta dos componentes que estn utilizando un nmero de bits
diferente, Logisim mostrar un error de "Ancho incompatible" e indicar los puntos donde se ocasiona el
problema en naranja. Debajo, se ha cambiado el atributo Nmero 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.

Los cables que conectan puntos incompatibles (pintados de color naranja) no tienen ningn valor.
Es fcil ver el valor que contiene un cable de un slo bits porque Logisim pinta el cable verde claro u
oscuro dependiendo de su valor. Logisim no muestra los valores en el caso de cables multibit. stos sern
simplemente negros. Sin embargo podrs consultar el valor de un cable utilizando la herramienta de
Cambio (

) sobre l.

Este mtodo de consulta es muy til cuando se depuran circuitos que utilicen haces de circuitos.

Separadores
Cuando trabajes con valores multibit, con frecuencia querrs dirigir algunos de esos bits a sitios
diferentes. La herramienta Separador (

) te lo permite.

Por ejemplo, supn que se quiere construir un circuito con un pin de entrada de cuatro bits y se
pretende obtener el producto lgico de sus dos bits ms 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 tambin pueden realizar la operacin contraria, juntar varios valores en uno slo. De hecho,
no son direccionales: Pueden ser utilizados en un sentido y ms 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
trmino extremo separado har referencia a uno de los mltiples cables de un lado, mientras que el
trmino extremo combinado har referencia al cable simple del lado contrario.

El atributo de Orientacin indica la posicin de la parte mltiple con respeto a la simple. Cuando el
separador est en el lienzo ya no podr cambiarse.

El atributo Fan Out especifica el nmero de bifurcaciones de la parte mltiple. Esto tampoco podr
cambiarse.

El atributo del Nmero de Bits indica el nmero de bits del extremo simple.

El atributo Bit x asocia cada uno de los bits con una bifurcacin. Si varios bits se corresponden con la
misma bifurcacin, 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 ms de una bifurcacin.

Hay que fijarse en que cualquier cambio a los atributos Fan Out o Nmero de Bits resetear todos
los atributos Bit x de tal forma que los bits del extremo simple del separador quedarn 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 nmero de bits del cable es desconocido. Esto ocurre porque el cable an no est asociado
con la entrada o salida de ningn componente. (Todas las entradas o salidas de todos los
componentes tienen un nmero de bits definido.)

Azul: El cable es de un slo 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 slo contiene un bit y su valor es 0.

Verde claro: El cable slo contiene un bit y su valor es 1.

Negro: El cable contiene varios bits. Puede que todos o algunos de los bits no estn especificados.

Rojo: El cable contiene un valor errneo. Esto normalmente pasa porque hay valores conflictivos en el
cable. (La otra posibilidad sera que el componente de una librera estuviese programado para dar un
valor errneo por algn motivo; en las libreras incorporadas de Logisim los valores de error slo 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 ms de un bit se mostrarn rojos en cuanto uno de sus bits tenga un valor errneo.

Naranja: Los componentes asociados al cable no concuerdan en el nmero de bits. Un cable naranja
es como si estuviese cortado: No lleva transmite valor alguno entre los componentes que conecta.

Anlisis combinacional

Todo circuito pertenece a una de las siguientes dos categoras: En un circuito combinacional, todas
las salidas del circuito son combinacin de valores actualizados de las entradas, mientras que en
un circuito secuencial, algunas de las salidas dependern de valores pasados de las entradas
(secuencia de las entradas a travs del tiempo).
La categora de los circuitos combinacionales es la ms simple de las dos. Hay tres tcnicas que son
las ms comnmente utilizadas para representar el comportamiento de estos circuitos.

circuitos lgicos

expresiones booleanas, que permiten hacer una representacin algebraica de cmo funciona el
circuito

tablas de verdad, que muestran las salidas para todas las combinaciones de entrada

El mdulo del Anlisis Combinacional de Logisim te permite ir de cualquiera de estas representaciones a


las otras. Es una forma cmoda de crear circuitos a partir de un puado de bits de entrada y salida.
Empezando el Anlisis Combinacional
Editando la tabla de verdad
Creando expresiones
Generando un circuito

Empezando el Anlisis Combinacional


A la mayor parte del mdulo del Anlisis Combinacional se accede a travs de una ventana simple con
ese nombre que te permite ver tablas de verdad y expresiones booleanas. La ventana se puede abrir de
dos maneras.

A travs del men de Ventana


Selecciona Anlisis combinacional, y la ventana de Anlisis Combinacional aparecer. Si no has
accedido a la ventana antes, la ventana que has abierto no representar ningn circuito.
Slo un anlisis combinacional existe en Logisim, no importa cuntos proyectos estn abiertos. No hay
forma de tener abiertas ms de una ventana de anlisis al mismo tiempo.

A travs del men de Proyecto


Desde una ventana en la que tengas ests editando un circuito, puedes indicar a Logisim que analice
el circuito en uso seleccionando la opcin Analizar Circuito en el men de Proyecto. Antes de abrir la
ventana, Logisim calcula las expresiones Booleanas y la tabla de verdad correspondientes al circuito para
que las veas.
Para que el anlisis vaya bien, cada entrada debe estar ligada a un pin de entrada, y cada salida con
un pin de salida. Logisim solamente analizar circuitos con 8 bits de cada tipo (de entrada y salida) como
mximo. En caso contrario se mostrar un mensaje de error y la ventana no se abrir.
Al calcular las expresiones booleanas correspondientes a un circuito, Logisim intentar en primer lugar
determinar las expresiones booleanas correspondientes a las puertas del circuito. Pero si el circuito utiliza
algn circuito que no sea una puerta (como un multiplexor), o si el circuito tiene ms de 100 niveles de
profundidad (algo improbable), entonces saltar un cuadro de dilogo dicindote que no ha sido posible
derivar las expresiones booleanas, y Logisim derivar las expresiones basndose en la tabla de verdad, lo
que tendr lugar leyendo las salidas para todas las combinaciones de entradas.
Despus de analizar un circuito, no hay relacin entre la ventana de Anlisis Combinacional y el
circuito. As, los cambios que se le hagan al circuito no estarn reflejados en el circuito, ni tampoco la
operacin contraria. Naturalmente, puedes analizar un circuito otra vez; y, como veremos ms tarde, se
puede sobrescribir un circuito con otro circuito que corresponda con lo que aparezca en la ventana de
Anlisis Combinacional.

Limitaciones
Logisim no intentar la deteccin de circuitos secuenciales: Si intentas analizar un circuito secuencial,
se calcular la tabla de verdad y las expresiones booleanas correspondientes, aunque no determinarn el
comportamiento del circuito con exactitud. (De hecho, detectar circuitos secuenciales es probablemente
imposible, ya que se tendra que abordar el Problema Halting. Naturalmente, podras esperar que
Logisim hiciese algn intento, como buscar biestables o ciclos en los cables, pero no lo hace.) As, el
sistema de Anlisis Combinacional no debera usarse siempre: salo slo cuando el circuito que ests
analizando sea combinacional de forma unvoca!
Logisim har un cambio, tal vez inesperado, al circuito original: El sistema de Anlisis Combinacional
necesita que todas las entradas y salidas tengan nombre nico de acuerdo con las reglas para los
identificadores en Java. (Ms o menos, cada carcter debe ser una letra o un dgito, y el primer caracter
tiene que ser una letra. Los espacios no estarn permitidos!) Logisim intentar utilizar las etiquetas que
tengan los pines, y luego usar nombres de una lista por defecto si las etiquetas no existen. Si alguna de
las etiquetas no cumple la regla de los identificadores en Java, entonces Logisim intentar sacar un
nombre vlido a partir de la etiqueta siempre que sea posible.
El orden de las entradas en la tabla de verdad concordar con el orden en el circuito original de arriba
a abajo, rompiendo los nudos de izquierda a derecha. (Lo mismo ocurrir para las salidas.)

Editando la tabla de verdad

Al abrir la ventana de Anlisis Combinacional, te encontrars que contiene cinco pestaas.

Esta pgina describe las tres primeras pestaas, Entradas, Salidas y Tabla. La prxima pgina de la
gua describe las otras dos pestaas, Expresin y Minimizado.

Las pestaas Entradas y Salidas


La pestaa de Entradas te permite ver y editar la lista de entradas. Para aadir nuevas entradas,
escribe un nombre en el campo situado en la parte baja del panel y haz clic en Aadir. Tambin puedes
darle otro nombre a una entrada que ya exista, seleccionndola en la lista, para despus escribir el nuevo
nombre y luego hacer clic en Cambiar Nombre.
Para eliminar una entrada, selecciona la entrada en la lista y simplemente pulsa Eliminar. Tambin
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.
Todas las acciones afectan inmediatamente a la tabla de verdad.
La pestaa de Salidas funciona exactamente de la misma forma que la pestaa de Entradas, excepto que
naturalmente la lista utilizada ser la de las salidas.

La pestaa Tabla
El nico elemento de la pestaa Tabla es la tabla de verdad, 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. Los valores cambiarn entre 0, 1 y x (que representa "no importa", es decir, que esa
variable puede tomar cualquier valor). Como veremos en el siguiente apartado, los valores que no
importan aportarn algo de flexibilidad a la hora de calcular las expresiones minimizadas.
Tambin se puede navegar y editar la tabla de verdad usando el teclado. Y puedes copiar y pegar
valores usando el portapapeles. El portapapeles se puede transferir a cualquier aplicacin que soporte
texto delimitado por tabulacin (como por ejemplo una hoja de clculo).
Si la tabla de verdad est basada en un circuito existente, puede que veas cuadrados rosas en las
columnas de las salidas con el smbolo "!!" en ellas. stas corresponden a errores ocurridos al calcular el
valor de salida para esa fila - o el circuito pareca estar oscilando, o el valor de salida era errneo (lo que
sera marcado por Logisim en el circuito con un cable rojo). Al sostener el ratn sobre la salida con el
problema se debera mostrar un texto de aclaracin comentando el tipo de error. Una vez que hagas clic
sobre la salida con el error (sobre el smbolo "!!"), entrars en el ciclo 0-1-x; y ya no habr forma de
volver a la situacin anterior.

Creando expresiones

Para cada variable de salida, la ventana de Anlisis Combinacional mantiene dos estructuras - la
columna relevante de la tabla de verdad y una expresin booleana - especificando la relacin de cada
salida con su entrada. Puedes editar tanto la tabla de verdad como la expresin; la que no hayas tocado
ser modificada automticamente de forma que no se pierda la consistencia entre ambas.
Como se ver en el siguiente apartado, las expresiones booleanas son especialmente tiles porque la
ventana de Anlisis Combinacional las utilizar cuando se le demande la construccin de un circuito
correspondiente con el estado actual.
Puedes ver y editar las expresiones utilizando las dos ltimas pestaas de la ventana, la pestaa de
Expresin y la pestaa de Minimizado.

La pestaa de Expresin

La pestaa de Expresin te permite ver y editar la expresin actualizada que est asociada con cada
variable de salida. Puedes seleccionar la expresin de la salida que quieres ver y editar usando el selector
"Salida".
Justo debajo el selector aparecer la expresin definida en una particular notacin, donde un OR est
representado como una suma, un AND est representado por un producto, y un NOT est representado
por una barra horizontal encima de la parte a la que afecta.
Debajo estar la misma expresin pero definida con caracteres ASCII. Aqu, un NOT est representado
con el gurruito ('~').
Puedes editar la expresin en el panel de texto y hacer click en el botn de Intro para que el cambio
tenga efecto; haciendo esto tambin actualizars la tabla de verdad en funcin de la nueva expresin. El
botn de Limpiar vaca el panel de texto, y el botn de Recargar restaura en el panel la expresin actual.
Hay que fijarse en que la expresin que hayas editado se perder si ms tarde modificas la tabla de
verdad.
Adems de la multiplicacin y la suma que representan al AND y al OR, una expresin puede contener
cualquiera de los operadores lgicos de Java, as como las palabras que las representan.

highest precedence

lowest precedence

~ !

NOT

(none) & &&

AND

XOR

+ | ||

OR

Los siguientes ejemplos son todas representaciones vlidas de la misma expresin. Tambin podras
mezclar los operadores.

~a (b + c)
!a && (b || c)
NOT a AND (b OR c)
En general, colocar parntesis en una secuencia de ANDs (o ORs o XORs) no sirve para nada. (De
hecho, cuando Logisim cree un circuito a partir de una expresin ignorar dichos parntesis).

La pestaa Minimizado

La ltima pestaa muestra una expresin de suma de productos que se corresponde con una columna
de la tabla de verdad. Se puede seleccionar cual es la expresin minimizada de salida que se quiere
consultar con el selector de arriba ("Salida").
Si hay cuatro entradas o menos, 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. La tabla de Karnaugh tambin mostrar los trminos
seleccionados para la expresin minimizada con unos rectngulos redondeados de colores.
Debajo estar la expresin minimizada que se corresponda con la tabla, con el mismo formato que en
la pestaa de expresiones. Si hay ms de cuatro entradas, la tabla de Karnaugh no aparecer, pero aun
as se calcular la expresin minimizada. (Logisim utiliza el algoritmo de Quine-Mc Cluskey para calcular
la expresin minimizada. Esto es equivalente a la tabla de Karnaugh, pero se puede aplicar
independientemente de nmero de variables de entrada.)
El botn de Fijar Como Expresin te permite seleccionar la expresin minimizada como la expresin
que le corresponde a la variable. Esto generalmente no ser necesario, ya que editar la tabla de verdad
lleva consigo utilizar la expresin para la columna modificada; pero si lo que has introducido una
expresin a travs de la pestaa de Expresin, esta puede ser una buena opcin para encontrar y
cambiarse a la expresin minimizada.

Generando un circuito
El botn de Crear Circuito construir un circuito cuyas puertas se correspondan con las ltimas
expresiones escogidas para cada salida. Las entradas y salidas del circuito se mostrarn en el mismo
orden de arriba a abajo tal y como aparezcan en las pestaas de Entradas y Salidas. El circuito definido
por Logisim tendr un buen aspecto; y, de hecho, una de las aplicaciones del Anlisis Combinacional de
Logisim es mejorar los dibujos de los circuitos que hayan sido definidos de una forma, digamos,

desordenada. Aun as, con el formato automtico no se mostrarn los detalles estructurales que
mostrara un circuito dibujado manualmente.
Cuando haces clic en el botn de Crear Circuito, aparecer un cuadro de dilogo que te preguntar
para qu proyecto es el circuito y que nombre quieres que reciba. Si escribes el nombre de un circuito
que ya exista, entonces ese circuito ser reemplazado (aunque antes de que esto ocurra Logisim te
preguntar si realmente quieres que esto suceda.)
El cuadro de dilogo que salta al pulsar Crear Circuito incluye dos opciones: Slo Puertas De Dos
Entradas, opcin que especifica que todas las puertas utilizadas sean de nicamente dos entradas (por
supuesto, las puertas NOT constituirn una excepcin); y Slo Puertas NAND, opcin que todas las
puertas que se utilicen sean NAND. Puedes seleccionar ambas opciones si lo que quieres es que slo de
usen puertas NAND con dos entradas.
Logisim no puede construir un circuito con slo puertas NAND a partir de una expresin que contenga
operadores XOR. Esta opcin estar desactivada en el caso de que alguna de las salidas contenga XORs.

Referencia del Men


Esta seccin explica los seis mens que acompaan a cualquier ventana principal de Logisim.
El men Archivo
El men Editar
El men Proyecto
El men Simular
Los mens Ventana y Ayuda

Muchos elementos de los mens estn relacionados con un proyecto que est abierto. Pero algunas
ventanas de Logisim (en concreto la ventana de Anlisis Combinacional y la ventana de Preferencias de
Aplicacin) no estn asociadas con proyectos. Para estas ventanas el men de Proyecto estar
desactivado.

El men Archivo
Nuevo
Abre un nuevo proyecto en una ventana nueva. El proyecto ser inicialmente una copia de
la plantilla seleccionada por defecto.

Abrir...
Abre un archivo existente como un proyecto en una ventana nueva.
Puedes abrir archivos salvados en una Versin 1.0X de Logisim, pero aunque podra haber
algunos problemas de conversin para circuitos complejos. Logisim 1.0X calcula las posiciones de
los subcircuitos de una forma distinta; y, en consecuencia, tendrs recorrer todos los circuitos y
colocar los subcircuitos en sus posiciones adecuadas.

Cerrar
Cierra todas las ventanas asociadas con el proyecto que se est viendo.

Guardar
Guarda el proyecto que se est viendo, sobrescribiendo lo que estaba en el archivo
correspondiente con anterioridad.

Guardar Como...
Guarda el proyecto que se est viendo, preguntando al usuario en qu archivo lo quiere guardar.

Exportar Como GIF...


Crea una imagen o unas imgenes GIF que se correspondan con los circuitos. Abajo se describe
el cuadro de dilogo para la configuracin.

Imprimir...
Manda el circuito o los circuitos a una impresora. Abajo se describe el cuadro de dilogo para la
configuracin.

Preferencias...
Muestra la ventana con las preferencias de aplicacin. (En sistemas Mac OS, esto aparecer en el
men Logisim.)

Salir
Cierra todos los proyectos abiertos y sale de Logisim. (En sistemas Mac OS, esto aparecer en el
men Logisim.)

Configurando Exportar
Cuando seleccionas Exportar Como GIF..., Logisim muestra un cuadro de dilogo con tres opciones.

Circuitos: Una lista en la que puedes seleccionar los circuitos (uno o ms) que deberan ser

exportados a achivos GIF. (Los circuitos vacos no se mostrarn para elegir.)


Factor de Escala: Puedes escalar las imgenes con esta barra de desplazamiento.

Vista de Impresin: Si utilizar la " vista de impresin" al exportar los circuitos.

Despus de hacer clic en OK, Logisim mostrar un cuadro de dilogo para la seleccin de archivo. Si
has seleccionado un circuito, selecciona el archivo en donde quieres guardar el GIF. Si seleccionaste
varios circuitos, selecciona un directorio en el que guardar los archivos; Logisim nombrar las imgenes
en funcin del nombre de los circuitos (por ejemplo: main.gif).
Configurando Imprimir
Cuando seleccionas Imprimir..., Logisim muestra un cuadro de dilogo para configurar lo que va a ser
imprimido.

Circuitos: Una lista en la que se pueden seleccionar los circuitos (uno o ms) que se van a imprimir.

(Los circuitos vacos no se mostrarn.) Logisim imprimir un circuito por pgina. Si el circuito es
demasiado grande, la imagen ser escalada para que quepa.
Cabecera: El texto centrado que debera aparecer en la parte superior de cada pgina. Se harn las
siguientes sustituciones en el texto.

%n

Nombre del circuito

%p

Nmero de pgina

%P

Total pginas

%%

Tanto por ciento ('%')

Rotar Para Encajar: Si est seleccionado, Logisim girar 90 grados los circuitos que no entren en
una pgina, as no ser necesario escalarlos cuando entren en una pgina al haberlos girado 90
grados.

Vista De La Impresora: Si utilizar la "vista de impresin'' al imprimir los circuitos.

Despus de hacer clic en Aceptar, Logisim mostrar la pgina de configuracin estndar antes de
imprimir los circuitos.

El men Editar
Deshacer XX
Deshace los cambios ms recientes. 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 (

)).

Cortar
Lleva los componentes seleccionados del circuito al portapapeles de Logsim.
Nota: El portapapeles de Logisim es administrado de forma
independiente del portapapeles del sistema operativo; as,
cortar/copiar/pegar no funcionarn con otras aplicaciones, incluyendo
otras copias lanzadas de Logisim. Sin embargo, si tienes varios
proyectos abiertos bajo el control del mismo proceso de Logisim,
entonces deberas ser capaz de cortar/copiar/pegar entre ellos.

Copiar
Copia los componentes seleccionados en el portapapeles de Logisim. (Consultar la nota debajo
del elemento de men Cortar)

Pegar
Pega los componentes del portapales de Logisim en el lugar seleccionado. (Consultar la nota
debajo del elemento de men Cortar)
Cuando pegues los componentes se representarn en gris claro. No pasarn a formar parte del
circuito de una forma definitiva hasta que cambies o muevas la seleccin de forma que los
componentes ya no estn en ella.
La razn de este extrao comportamiento es sta: Para que haya consistencia con su otro
comportamiento, Logisim debe empalmar inmediatamente cualquier cable tan pronto como est
en el circuito; este proceso de empalme cambia los cables que ya estn en el circuito. Sin
embargo, cuando pasas cables del portapapeles puede interesarte situarlos en una posicin
diferente a la inicial, y el cambio inherente al proceso de empalme podra estar en contra de tus
deseos.

Eliminar
Elimina del circuito los componentes seleccionados.

Seleccionar Todo
Selecciona todos los componentes del circuito que est siendo visualizado.

El men Proyecto
Aadir Circuito...
Aade un nuevo circuito al proyecto que se est utilizando. Logisim pedir un nombre para el
circuito, que no podr coincidir con otros nombres de los circuitos que pertenezcan a ese mismo
proyecto.

Cargar Librera
Carga una librera en el proyecto. Puedes cargar tres tipos distintos de libreras, como se
explica en otro lugar de la Gua de Usuario.

Descargar Librera...
Descarga librera del circuito. Logisim no te permitir descargar libreras que estn siendo
utilizadas, incluyendo libreras que contengan componentes que aparezcan en otros circuitos del

proyecto, as como aquellas con herramientas que estn asociadas al ratn o que aparezcan en la
barra de herramientas.

Analizar Circuito
Calcula la tabla de verdad y las expresiones booleanas correspondientes al circuito visualizado,
mostrando los resultados en la ventana de Anlisis Combinacional. El proceso de anlisis ser
vlido slo para circuitos combinacionales. Existe una descripcin del proceso de anlisis en la
seccin de Anlisis Combinacional.

Renombrar Circuito...
Cambia el nombre del circuito que se est visualizando.

Seleccionar Como Circuito Principal


Selecciona el circuito visualizado como "circuito principal" del proyecto. (Est elemento del men
no estar disponible si el circuito en uso ya es el circuito principal del proyecto.) El circuito
principal es el que se muestra cuando se abre un archivo de proyecto.

Eliminar Circuito...
Elimina del proyecto el circuito que est siendo visualizado. Logisim te prevendr de eliminar un
circuito que est siendo utilizado como subcircuito o de eliminar el nico circuito de un proyecto.

Opciones...
Abre la ventana de Opciones de Proyecto.

El men Simular
Simulacin Conectada
Si esta opcin est activada, los circuitos visualizados estarn "vivos", es decir, que los valores de
todo el circuito se actualizarn con la modificacin de cualquiera de sus variables o con cada
cambio a la configuracin del circuito.
Esta opcin del men ser deseleccionada si se detecta oscilacin en el circuito.

Resetear Simulacin
Inicializa todas las variables de entrada de forma que te encuentres como si hubieses vuelto a
abrir el archivo. En el caso en el que ests visualizando el estado de un subcircuito la jerarqua al
completo ser inicializada.

Volver A
Cuando profundices en un estado de un subcircuito, este men lista los circuitos que estn por
encima del ltimo estado visualizado del circuito. Al seleccionar uno de ellos se mostrar el
circuito correspondiente.

Ir A
Si profundizas en el estado de un subcircuito y luego vuelves para atrs, este men lista los
subcircuitos que estn por debajo del circuito que se est consultando. Al seleccionar uno de ellos
se mostrar el circuito correspondiente.

Conmutar Reloj
Cambia el estado del reloj en la simulacin. 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 ests visualizando.

Activar Reloj
Automticamente activa el reloj. Esta opcin de men slo tendr efecto si en el circuito se
encuentra reloj (en la librera Base). Esta opcin est desactivada por defecto.

Seleccionar Frecuencia De Reloj


Permite seleccionar la frecuencia del reloj. Por ejemplo, 8 Hz significan que el cambio del nivel del
reloj se producir 8 veces cada segundo.
Hay que fijarse en que la velocidad del ciclo de reloj ser ms lenta que el cambio de nivel del
reloj, as para el caso de un ciclo de reloj con frecuencia de 4 Hz los cambios de nivel de reloj
sern a 8 Hz.

Registro...
Entra en el mdulo de registro, que permite tomar nota de los valores de un circuito a medida
que el estado del circuito progresa.

El men Ventana
Minimizar
Minimiza la ventana correspondiente.

Zoom
Redimensiona la ventana correspondiente a su tamao preferido.

Anlisis Combinacional
Muestra la ltima ventana de Anlisis Combinacional, sin cambiar su contenido.

ttulos de ventana individuales


Muestra la ventana correspondiente en primer plano.

El men Ayuda
Tutorial
Abre el sistema de ayuda on-line en la seccin de Tutorial: Primeros pasos con Logisim de la Gua
del Usuario de Logisim.

Manual Del Usuario


Abre el sistema de ayuda on-line en la Gua del Usuario de Logisim.

Referencia De Las Libreras


Abre el sistema de ayuda en la en la Referencia de las Libreras.

Acerca De...
Muestra una ventana con la versin de Logisim. (En los Mac esta opcin de men aparecer en el
men Logisim.)

Componentes de memoria
Los componentes RAM y ROM son dos de los ms tiles en las libreras que trae incorporadas Logisim.
Sin embargo, tambin son de los componentes ms difciles de utilizar a causa del gran volumen de
informacin que puede almacenar.
Se puede encontrar documentacin acerca del funcionamiento de estos componentes dentro del
circuito en las pginas RAM y ROM en la Referencia a las Libreras. Esta seccin del Manual del
Usuario explica la interfaz a la vez que permite al usuario ver y editar contenidos de memoria.
Cambiando valores en la memoria
Mens 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, 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 edicin muy simple, seguramente encontrars el editor hexadecimal
integrado mucho ms conveniente.
De todas formas, la Herramienta de Cambio se puede utilizar de dos formas distintas, para editar y
consultar valores en el circuito: Puedes editar la direccin que se visualiza, y puedes editar un valor
individual.
Para editar la direccin que se visualiza, haz clic fuera del rectngulo de visualizacin (aunque dentro
de la memoria en s). Logisim dibujar un rectngulo de color rojo alrededor de la direccin que
corresponda al inicio del bloque que se est visualizando.

En cuanto se teclee algn dgito hexadecimal cambiar la direccin de inicio del bloque.

Al pulsar Enter la memoria se mover una lnea hacia abajo.

Al pulsar Backspace (tecla de retroceso) la memoria se mover una lnea hacia arriba.

Al pulsar la barra espaciadora la memoria se mover una pgina (cuatro lneas) hacia abajo.

Para la edicin de un valor en concreto, haz clic sobre el valor que quieras modificar dentro del
rectngulo de visualizacin. Logisim colocar un rectngulo de color rojo alrededor del valor seleccionado.

En cuanto se teclee algn dgito hexadecimal se cambiar el valor de la posicin de memoria

seleccionada.
Al pulsar Enter se posicionar el rectngulo de edicin justo debajo de la posicin en la que se

encuentre.
Al pulsar Backspace (tecla de retroceso) el rectngulo de edicin pasar a la posicin anterior a la que

se encuentre.
Al pulsar la barra espaciadora el rectngulo de edicin pasar a la posicin siguiente a la que se
encuentre.

Mens desplegables y archivos


El men desplegable de la memoria incluye cuatro opciones ms que el de los dems componentes:

Editar Contenidos: Abre un editor hexadecimal para determinar los contenidos de la memoria.

Borrar Contenidos: Resetea (pone a cero) todos los valores de la memoria.

Cargar Imagen...: Pone en memoria los valores que se encuentran en el archivo utilizado, el cual

tendr el formato que se indica abajo.


Salvar Imagen...: Guarda los valores que se encuentren en la memoria en un archivo con el formato
que se indica debajo.

El formato utilizado para las imgenes es intencionadamente simple; esto te permite crear un
programa, como un ensamblador, que genere imgenes de memoria que puedan despus ser cargadas
en memoria. Veamos un ejemplo para entender el formato; si se tiene una memoria de 256 bytes cuyos
cinco primeros bytes fueran 2, 3, 0, 20 y -1, y todos los dems valores fuesen cero, entonces la imagen
sera el siguiente fichero de texto.

v2.0 raw
02
03
00
14
ff
La primera lnea identifica el tipo de formato utilizado (por el momento slo hay un formato
reconocido). Los valores se muestran en hexadecimal, empezando por la direccin cero; puedes poner
varios valores en la misma lnea. Logisim pondr el valor cero en todas aquellas posiciones de memoria
que no vengan especificadas en el archivo.
La imagen puede utilizar abreviaturas en la codificacin, por ejemplo, en lugar de escribir en una fila
diecisis veces seguidas el valor 00 se podr escribir 16*00. Hay que fijarse en que el nmero de
repeticiones de un valor viene dado en base 10. Las imgenes creadas por Logisim utilizarn estas
abreviaturas en cuanto los valores se repitan cuatro veces o ms.

Editor hexadecimal
Logisim tiene un editor hexadecimal integrado para ver y alterar contenidos de memoria. Para acceder
a l, abre un men desplegable para el componente de memoria correspondiente y selecciona Editar
Contenidos... Para componentes ROM, que presentan un atributo para los contenidos de mermoria,
puedes acceder tambin al editor hexadecimal haciendo clic sobre el atributo correspondiente.

Los nmeros a la izquierda, en itlicas, muestran las direcciones de memoria en hexadecimal. Los
otros nmeros se corresponden con los valores a partir de la direccin de memoria especificada; el editor
hexadecimal puede mostrar cuatro, ocho, o diecisis valores por lnea, dependiendo de lo que quepa en la
ventana. Para facilitar la lectura, hay un espacio despus de cada grupo de cuatro valores.
Puedes navegar por la memoria utilizando la barra de desplazamiento (scroll bar) o con el teclado (con
las teclas de la flechas, inicio, fin, avanzar/retroceder pgina). Y cuando se pulsen caracteres
hexadecimales se modificar la posicin de memoria seleccionada.
Tambin puedes seleccionar un grupo de valores arrastrando el ratn, haciendo clic con el ratn y
pulsando la tecla shift, o puedes navegar por la memoria con el teclado mientras pulsas la tecla shift. Los
valores se pueden copiar y pegar utilizando el men de edicin; y adems, ahora s, el portapapeles se
puede utilizar desde otras aplicaciones.

Registro
Para verificar el correcto funcionamiento de un gran circuito, y para tener una referencia del
comportamiento del circuito se puede utilizar el mdulo de registro de Logisim. ste mdulo te permite
seleccionar los componentes cuyos valores deberan quedar registrados; de forma opcional podras
especificar un archivo en el que quedara almacenado el registro.
Nota: El mdulo de registro est en fase alfa; puede contener errores, y est sujeto a
cambios significativos en un futuro. De hecho, y sabiendo que informacin acerca de
errores as como sugerencias para Logisim son siempre bienvenidos, lo sern
especialmente los que hagan referencia a este mdulo. Si vosotros los usuarios no
enviis comentarios, entonces es muy probable que este mdulo no cambie.
Puedes acceder al mdulo de registro a travs de la opcin de Registro... en el men de Simulacin.
Aparecer una ventana con tres pestaas.

Comentaremos cada una de estas pestaas por separado.


La pestaa de Seleccin
La pestaa de Tabla
La pestaa de Archivo
Hay una sola ventana de registro por proyecto, cuando cambias de circuito dentro de un mismo
proyecto, la ventana de registro cambiar para registrar los cambios efectuados al circuito que se est
visualizando. Esto es as a no ser que te ests moviendo niveles arriba o abajo dentro de la misma
simulacin, en cuyo caso el mdulo de registro no cambia.
Hay que fijarse en que el mdulo de registro "dejar de tomar nota" en un archivo cuando pase a
registrar otra simulacin. Y cuando vuelvas a la otra simulacin, el mdulo de registro recordar la
configuracin correspondiente, pero necesitars reactivar el registro en archivo manualmente.

La pestaa de Seleccin
La pestaa de seleccin te permite seleccionar cuales son los valores que se deberan registrar. La
ventana que se muestra abajo se corresponde con el siguiente circuito.

La pestaa est en tres zonas verticales. La primera (la que est ms a la izquierda) es una lista de
todos los valores del circuito que podran ser registrados. Estos son los componentes de las libreras
incorporadas que soportan el registro:
Librera Base: Los componentes Pin, Ver, y Reloj
Librera de Memorias: Todos los componentes
Los componentes vendrn identificados por su etiqueta, y para los componentes que no tengan
etiqueta se les asignar un nombre que especifique su tipo y su situacin dentro del circuito. Los
subcircuitos tambin aparecern en la lista, stos no podrn registrarse, pero s ser posible registrar sus
componentes. Hay que fijarse en que el la RAM necesita que elijas cuales son las direcciones de memoria
que quieres registrar; como mximo permite el registro de las primeras 256 posiciones de memoria.
La ltima zona vertical (la que est ms a la derecha) muestra los componentes que han sido
seleccionados. En ella tambin se indicar la base con la que se almacenarn los valores de aquellas
variables que posean ms de un bit.
La columna del medio permite manipular los elementos que estn seleccionados.

Aadir aade en la zona de la derecha el elemento u elementos que estn seleccionados en la zona

de la izquierda.
Cambiar Base cambia la base del componente seleccionado entre 2 (binaria), 10 (decimal), y 16

(hexadecimal).
Mover Arriba mueve el componente seleccionado un lugar hacia arriba.

Mover Abajo mueve el componente seleccionado un lugar hacia abajo.

Eliminar elimina el componente seleccionado.

La pestaa de Tabla
La pestaa de Tabla muestra grficamente el registro ms reciente.

En la tabla hay una columna para cada componente que se haya seleccionado. En cada fila se muestra
un estado de la simulacin una vez que haya tenido lugar un cambio en los valores. No se aadirn filas
que estn duplicadas. Hay que fijarse en que slo se mostrarn las ltimas 400 filas de valores y en que
algunas de las filas podran no tener un valor asignado en el caso de que los valores de la fila fuesen
calculados cuando alguno de los componentes an no hubiese sido seleccionado.
La tabla es slo de consulta, no es modificable u interactiva

La pestaa de Archivo
La pestaa de Archivo te permite seleccionar un archivo en que se pueda almacenar el registro.

En la parte superior se indica si el registro est en funcionamiento o no, y hay un botn que permite
habilitar o deshabilitarlo. (No se podr activar hasta que se haya seleccionado un archivo de salida.) El
botn te permite pausar y continuar almacenando la informacin en el archivo. En el momento en el que
visualices otra simulacin, se dejar de registrar la informacin en el archivo; y si vuelves a la simulacin
en la que habas seleccionado el registro en archivo y quieres que ste contine, entonces tendrs que
volver a activarlo manualmente utilizando el botn de habilitacin.
A media altura se indica el archivo que est siendo utilizado para almacenar los datos del registro.
Para seleccionar otro, hay que utilizar el botn Seleccionar... El registro comenzar automticamente al
seleccionar un archivo, Logisim te preguntar si quieres sobrescribir el archivo o si quieres aadir nuevos
datos al final.
En la parte de abajo se puede elegir aadir una cabecera indicando los elementos que estn
seleccionados. En el caso de que se seleccione esta opcin, se aadir una cabecera al archivo cada vez
que se modifiquen los componentes seleccionados.

Formato del archivo


Las entradas se mostrarn tabuladas de forma semejante a lo que puede verse en la pestaa de
Tabla. (Aunque, por ejemplo, en el fichero las cabeceras indicarn el camino completo de los
componentes que pertenezcan a un subcircuito.) El formato es simple de forma intencionada para que
sea posible procesarlo con algn script en Perl/Python o un programa de hojas de clculo.
As un script podra procesar el archivo al mismo tiempo que Logisim est funcionando, en concreto
Logisim meter los nuevos valores en disco cada 500 ms. Hay que fijarse en que Logisim podra cerrar y
abrir el fichero varias veces durante la simulacin, sobre todo si pasan varios segundos sin que haya
nuevos valores para introducir.

Preferencias de aplicacin
Logisim admite dos categoras de opciones de configuracin: las preferencias de aplicacin y las
opciones de proyecto. Las preferencias de la aplicacin se refieren a las preferencias de la aplicacin que
se extienden a todos los proyectos abiertos, mientras que las opciones de proyecto son especficas para
el proyecto que est siendo utilizado en ese momento. En esta seccin se comentarn las preferencias de
la aplicacin, mientras que las opciones de proyecto se describirn ms adelante.
Puedes ver y editar las preferencias de la aplicacin a travs de la opcin de Preferencias... del men
Archivo (o bien, en un Mac, desde el men Logisim), una vez seleccionada la opcin, se mostrar una
ventana con dos pestaas. Se describirn cada una de las pestaas por separado, y luego veremos cmo
se configuran las preferencias desde la lnea de comandos.
La pestaa Plantilla
La pestaa Internacional
La lnea de comandos

La pestaa de Plantilla

Una plantilla es un archivo de Logisim que se utiliza como punto de partida cuando Logisim crea un
nuevo proyecto. Tambin, si tienes un archivo de Logisim cuyo entorno est configurado de una forma
extraa, puedes "resetear" el entorno usando el botn Restablecer Plantilla desde la ventana de edicin
de las Opciones de Proyecto.
Aunque las plantillas son tiles en muchos casos, son particularmente adecuadas para utilizar en
clase, si por ejemplo un profesor quisiera proporcionar una plantilla como punto de partida a sus
alumnos. Esto es especialmente probable si la clase utiliza todo el potencial de Logisim, incluyendo las
caractersticas ms avanzadas, en cuyo caso la configuracin por defecto podra ser demasiado simple.
Las plantillas tambin pueden ser tiles en el escenario pedaggico cuando, por ejemplo, un profesor
abre el archivo de un alumno que ha configurado su entorno de trabajo de forma significativa.
La opcin "Plantilla Por Defecto", que est seleccionada por defecto, utiliza una plantilla que se
proporciona junto con Logisim. Si prefieres una configuracin completamente desnuda selecciona
"Plantilla Vaca". Pero si quieres especificar otro archivo que se use como plantilla, puedes utilizar el
botn "Seleccionar...", y luego elegir la opcin "Especificar Plantilla".

La pestaa Internacional
Gracias a este apartado Logisim puede ser utilizado en varios pases utilizando el idioma
correspondiente en cada caso.

Esta pestaa tiene tres opciones.

Idioma: Cambia el idioma. La ltima versin est disponible en ingls y espaol. La traduccin ha
sido proporcionada por Pablo Leal Ramos, natural de Espaa.

Posibles traducciones de Logisim a otros idiomas son bienvenidas! Si ests interesado, ponte en
contacto conmigo, Carl Burch. Esto no ser un compromiso: Estar contento de enterarme de t
inters, y te dejar saber si conozco a alguien que ya est trabajando en ello, preparar una versin
para que trabajes con ella, y te enviar instrucciones. El proceso de traduccin no requiere ningn
conocimiento de programacin.

Reemplazar Caracteres Acentuados: Algunas plataformas soportan mal los caracteres (tales como

o ) que no aparecen en el conjunto de caracteres ASCII de 7 bits. Cuando esta opcin est
seleccionada, Logisim reemplazar cualquier carcter fuera del conjunto de caracteres ASCII de 7 bits
con el correspondiente ms parecido. El checkbox estar deshabilitado para su uso cuando el idioma
seleccionado no tenga equivalencias disponibles para estos "caracteres especiales".
Puertas Moldeadas: Hay dos estndares para la representacin de puertas lgicas: puertas
moldeadas (shaped gates) y puertas rectangulares (rectangular gates). En la siguiente tabla se
pueden ver las diferencias.

(Algunas fuentes se refieren a stos como los estilos americano y europeo; yo no hago referencia a esta
terminologa ya que sugiere que en cada parte del mundo existe un estndar diferente, y esto creara
problemas para Logisim).
Logisim no se ajusta a ninguno de los dos estndares exactamente, ms bien se coloca en una
posicin intermedia permitiendo elegir entre ellos. En concreto, las puertas moldeadas estn ms

linealizadas que las definidas por el estndar del IEEE. Y, aunque las puertas XOR y XNOR deberan ser
igual de anchas que las puertas OR y NOR en el estilo rectangular, no lo son a causa de algunas
dificultades comprimiendo la puerta moldeada XOR.
Actualmente, la puerta rectangular OR se representa con el smbolo ">0" en lugar del smbolo que se
muestra arriba, porque muchas plataformas an no soportan el conjunto de caracteres Unicode al
completo.

La lnea de comandos
Puedes configurar las preferencias de aplicacin de Logisim a travs de la lnea de comandos. Esto se
probar especialmente til en un laboratorio con ordenadores para cada alumno en el que se pretenda
comenzar siempre de la misma forma, independientemente de cmo hayan configurado el programa los
alumnos que hayan utilizado el ordenador con anterioridad.
La sintaxis completa de la lnea de comandos es como se muestra a continuacin.

java -jar jarFileName [options] [filenames]


Los archivos opcionales que aadan al comando se abrirn con Logisim en ventanas adicionales.
El siguiente ejemplo inicializa Logisim con su configuracin bsica.

java -jar jarFileName -plain -gates shaped -locale en


Las que siguen son las opciones soportadas.

-plain
-empty
-template templateFile
Determina la plantilla que debe utilizar Logisim.

-gates [shaped|rectangular]
Determina qu tipo de puerta ha de utilizarse.

-locale localeIdentifier
Determina cual es la traduccin que ha de utilizarse. Por el momento, los idiomas que se soportan
son:

en English
es Spanish
-accents [yes|no]
Esta opcin slo es relevante para aquellos idiomas que utilicen caracteres que no pertenezcan al
conjunto de caracteres ASCII de 7 bits; as, estaran incluidos idiomas que utilizasen caracteres
acentuados, y no incluira al ingls. Si se selecciona no, los caracteres que no pertenezcan al
conjunto de caracteres ASCII de 7 bits sern reemplazados con los ms apropiados dentro de
este conjunto; esto ser til para los casos en que la combinacin de Java/Sistema Operativo no
soporte estos caracteres de forma adecuada.

-nosplash
No muestra la pantalla de inicio (carga) de Logisim.

-help
Muestra un resumen de las opciones de la lnea de comandos.

-version
Muestra el nmero de la versin de Logisim.

Opciones de proyecto
Logisim soporta dos categoras de opciones de configuracin: las preferencias de aplicacin y las
opciones de proyecto. Las preferencias de aplicacin se refieren a las preferencias de aplicacin que se

extienden a todos los proyectos abiertos, mientras que las opciones de proyecto son especficas para el
proyecto que est siendo utilizado en ese momento. En esta seccin se comentarn las opciones de
proyecto; las preferencias de aplicacin se describen en otra seccin.
Las opciones de proyecto se pueden ver y editar a travs la opcin Opciones... del men de Proyecto.
As se mostrar la ventana de Opciones, que tiene cuatro pestaas.

Comentaremos cada una de las pestaas por separado.


La
La
La
La

pestaa
pestaa
pestaa
pestaa

Pizarra De Trabajo
Simulacin
Barra De Herramientas
Ratn

En la parte de abajo de la ventana est el botn Restablecer Plantilla. Al pulsarlo, 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 aplicacin).

La pestaa Pizarra De Trabajo


La pestaa Pizarra De Trabajo te permite configurar la apariencia del rea donde se dibujan los circuitos.

Hay seis opciones.

El checkbox Vista De Impresin determina si se muestra el circuito en la pantalla de la misma forma


en que aparece cuando se imprime. Por lo general, Logisim indica sobre el circuito el ltimo estado del
mismo y muestra algunas caractersticas de la interfaz de los componentes (en concreto, sealiza las
patas de las puertas OR dnde se conectaran). La vista de impresin, sin embargo, no indica nada
acerca del ltimo estado del circuito y omite tales caractersticas.

El checkbox Mostrar Parrilla determina si la parrilla de puntos ha de mostrarse o no.

El checkbox Mostrar Aureola determina si ha de dibujarse un valo verde claro azulado alrededor del
atributo o herramienta cuyos atributos estn siendo mostrados en la tabla de atributos.

El checkbox Mostar Sombras determina si cuando se haya seleccionado algn componente ha de


mostrarse un esbozo del mismo a medida que el ratn se mueva sobre la pizarra de trabajo. Por
ejemplo, si seleccionas la puerta herramienta AND y mueves el ratn sobre la pizarra de trabajo (sin
pulsar el botn), podrs ver una muestra esquemtica de color gris de como quedara situada la
puerta AND si pulsases el botn del ratn. Si se deja el checkbox sin seleccionar, este comportamiento
quedar desactivado.

El checkbox Mostrar Aclaraciones Para Los Componentes determina si se deben mostrar las
aclaraciones que aparecen temporalmente cuando se mantiene el cursor del ratn sobre un
componente. As por ejemplo, si mantienes el ratn sobre un punto de conexin (pin) de un
componente que se corresponda a un subcircuito, se mostrar la etiqueta asociada a ese pin dentro
del subcircuito - o se mostrar el nombre del subcircuito si ese pin no tiene etiqueta -. Manteniendo el
cursor sobre una de las salidas de un separador se dar a conocer, a travs de una aclaracin, que bits
se corresponden a esa salida. Adems todos los componentes de las libreras de Plexores y Memorias
proporcionarn informacin acerca de sus entradas y salidas por medio de las aclaraciones.

El Factor Del Zoom permite aumentar la imagen en la proporcin seleccionada. Esta opcin est
concebida principalmente para demostraciones en clases en donde la resolucin de la pantalla sea
demasiado pequea para ver el circuito desde el fondo de la sala.

La pestaa Simulacin
La pestaa Simulacin permite configurar los algoritmos que se utilizan para simular los circuitos.
Estos parmetros se aplican sobre todos los circuitos que se simulen desde la misma ventana, incluso
sobre circuitos que existan en libreras cargadas en el proyecto.

El checkbox Aadir Ruido A Los Retardos De Los Componentes permite activar o desactivar el
ruido aleatorio que se aade los retardos de los componentes. La simulacin interna utiliza un reloj
oculto para su simulacin, y proporciona de alguna forma una simulacin ms realista, cada
componente (excepto los cables y los separadores) introducen un retardo entre la recepcin de una
entrada y la emisin de una salida. Si esta opcin est seleccionada, Logisim ocasionalmente
(alrededor de una vez por cada 16 reacciones del componente) har que uno de esos retardos sea
ms largo de lo normal. Esta aleatoriedad se introduce especficamente para tratar cerrojos en los
circuitos (como debajo): Sin el ruido aleatorio, el circuito oscila, ya que la dos puertas trabajarn al
mismo ritmo; pero introduciendo ruido aleatorio, eventualmente una de las puertas dejar atrs a lo
otra.

Es aconsejable dejar activada esta opcin que existe por si se busca el comportamiento determinista de
algn circuito. (Adems, esta opcin es relativamente nueva en Logisim y podra conducir a errores
inesperados en la simulacin).

La opcin Iteraciones Hasta Oscilacin especfica durante cunto tiempo se ha de simular un


circuito antes de decidir que est oscilando. El nmero representa la cantidad de ciclos del reloj
interno (una puerta simple slo necesita un ciclo). La cifra por defecto de 1,000 es buena para casi
todos los propsitos, incluso para grandes circuitos. Pero podras estar interesado en aumentar el
nmero de iteraciones si ests trabajando con un circuito para el que Logisim informa de falsas
oscilaciones; es posible imaginarse problemas con un circuito que incorpore muchas formaciones como
la comentada encima de estas lneas. Tambin podras estar interesado en rebajar el nmero de
iteraciones si ests trabajando con un circuito propenso a oscilar y utilizas un procesador muy lento.

La pestaa Barra De Herramientas

La pestaa Barra De Herramientas permite configurar las herramientas que aparecen en la barra de
herramientas.

En el lado izquierdo hay un explorador que permite ver todas las herramientas disponibles, y en el lado
derecho hay una lista con los elementos de la barra de herramientas. (El smbolo "---" es un separador
que no es ms que un pequeo espacio en blanco). Entre el explorador y la lista hay cinco botones:

Aadir Herramienta aade la herramienta seleccionada en el explorador al final de la barra de


herramientas.

Aadir Separador aade un separador al final de la barra de herramientas.

Mover Arriba mueve el elemento seleccionado una posicin hacia arriba/izquierda en la barra de
herramientas.

Mover Abajo mueve el elemento seleccionado una posicin hacia abajo/derecha en la barra de
herramientas.

Eliminar elimina el elemento seleccionado de la barra de herramientas.

Los atributos de las herramientas no se muestran en esta ventana; pero puedes verlos y editarlos
desde la ventana principal.

La pestaa Ratn
Por defecto, al hacer clic sobre el rea de dibujo de Logisim se utilizar la ltima herramienta
seleccionada. Si haces clic con el botn derecho o haces control-clic sobre un componente saltar un
men desplegable.
Logisim te permite modificar este comportamiento, librndote de la necesidad de ir continuamente a la
barra de herramientas o al explorador. (Esto puede tambin ser prctico si eres zurdo). Cada combinacin
botn del ratn - tecla especial (shift y o control) puede ser asociada a una herramienta diferente. La
pestaa Ratn permite especificar estas asociaciones.

En la parte izquierda hay un panel explorador en el que se pueden seleccionar las herramientas de
inters.

En la parte de arriba del lado derecho hay un recuadro dentro del cual ha de utilizarse la combinacin
de teclas que queremos asociar a la herramienta seleccionada. Por ejemplo, si quieres que se pinten
nuevos cables cuando uses la combinacin tecla shift y botn derecho del ratn, entonces deberas
seleccionar la Herramienta De Cableado en el panel explorador y luego hacer click con el botn
derecho del ratn mientras pulsas la tecla shift dentro del recuadro, donde dice "Utiliza aqu la
combinacin, botn del ratn - tecla especial, a la que asociar: Herramienta De Cableado". Si la
combinacin utilizada ya estaba en uso, entonces la asociacin correspondiente ser remplazada con
la nueva herramienta.

Debajo del recuadro aparece una lista de las asociaciones existentes. Hay que fijarse en que cualquier
combinacin que no se muestre en esta lista simplemente utilizar la herramienta seleccionada.

Ms abajo se encuentra el botn Eliminar, con el que se pueden borrar de la lista de asociaciones
aquellas que estn seleccionadas en dicha lista. Cuando se elimina una asociacin, la combinacin
botn del ratn - tecla especial utilizada pasar a estar asociada a la herramienta que est
seleccionada en la barra de herramientas o en el panel explorador.

En la parte ms baja aparece la lista de atributos de la herramienta correspondiente al elemento que


est seleccionado en la lista de asociaciones. As, las herramientas que se asocien a las
combinaciones, botn del ratn - tecla especial, podrn tener sus atributos con valores propios,
diferentes de los utilizados en el panel explorador y en la barra de herramientas. Aqu es donde podrs
editar esos valores de los atributos.

Propagacin de valores
El algoritmo que utiliza Logisim para simular la propagacin de valores a travs de los circuitos, no es
algo de lo que preocuparse. Por otra parte, cabe comentar que el algoritmo es lo suficientemente
sofisticado como para tener en cuenta los retardos de las puertas, pero no lo suficientemente realista
para implementar comportamientos ms complicados como la variacin de voltajes o las condiciones del
entorno.
Quieres saber ms?

Retardos en puertas
Errores de oscilacin
Deficiencias

Retardos en puertas
Como ejemplo del nivel de sofisticacin del algoritmo de Logisim, considera el siguiente circuito.

Obviamente la salida ser siempre 0. Pero realmente las puertas NOT no reaccionan instantneamente
a sus entradas y tampoco lo hacen en Logisim. As, cuando la entrada de este circuito cambia de 0 a 1, 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. El efecto slo ser observable si se utiliza la salida del
circuito como entrada de reloj de un biestable D.

El cambiar la entrada de 0 a 1 conduce instantneamente un 1 al biestable D y de esta manera el


biestable conmutar cada vez que la entrada del circuito cambie de 0 a 1.
Todos los componentes tienen asociado un retardo. Los componentes ms complejos tienden a tener
retardos mayores, pero estos retardos son arbitrarios de alguna forma y puede que no reflejen la
realidad.
De vez en cuando, con frecuencia irregular, Logisim aadir un retardo a la propagacin de un
componente. Esto pretende simular la irregularidad de los circuitos reales. En concreto, un R-S que utilice
dos puertas NOR oscilara sin esta aleatoriedad en los retardos, ya que las dos puertas procesaran sus
entradas a la vez. Esta aleatoriedad se puede desactivar a travs de la ventana de Opciones de
Proyecto en La pestaa Simulacin.
Desde un punto de vista tcnico, es relativamente fcil tratar con este nivel de sofisticacin en un
circuito simple. Por otro lado, y aunque tratar bien los retardos a travs de los subcircuitos es ms
complicado, Logisim tambin intenta abordar este asunto de forma correcta.
Hay que fijarse en que no estoy diciendo que Logisim siempre se ocupe de los retardos de las puertas
satisfactoriamente. Pero por lo menos lo intenta.

Errores de Oscilacin
El algoritmo de propagacin, que normalmente es transparente, ser visible cuando construyas un
circuito que oscile.

Este circuito se encuentra en una situacin estable, pero si pones la entrada a 1, el circuito entrar en
un bucle infinito. Al cabo de un tiempo, Logisim se dar por vencido y lanzar un mensaje comentando
que en su opinin el circuito oscila.

Logisim dar a conocer los valores que existen cuando se da por vencido. Estos valores podrn
parecer incorrectos - en esta captura de pantalla, la puerta AND enva un 1 a su salida aunque una de
sus entradas es un 0, pero podra ser que la puerta NOT tenga un 1 a la entrada y un 1 a la salida.
Logisim rodea con una lnea roja los puntos que parecen estar implicados en la oscilacin. Si alguno de
los puntos involucrados se encuentra dentro de un subcircuito, Logisim marcar el contorno del
subcircuito en rojo.
Cuando Logisim detecta una oscilacin, se para cualquier tipo de simulacin. Podrs restablecer la
simulacin en el men Simulacin a travs de la opcin Simulacin Conectada.
Logisim detecta una oscilacin con una tcnica bastante simple. Si la simulacin del circuito necesita
demasiadas iteraciones entonces simplemente se dejar de simular y se dar a conocer que el circuito
oscila. (Los puntos que se identifican como causantes de la oscilacin son aquellos modificados en el
ltimo 25% de las iteraciones) De esta manera, Logisim podra concluir errneamente que existe una
oscilacin, en concreto si trabajas con un circuito excepcionalmente grande, pero que tendra que ser uno
ms grande que cualquiera que yo haya construido con Logisim. En cualquier caso, si ests seguro de que
el informe de oscilacin es errneo, puedes configurar el nmero de iteraciones completadas antes de
determinar oscilacin a travs de la ventana de Opciones de proyecto en La pestaa Simulacin.

Deficiencias
El algoritmo de propagacin de Logisim es lo suficientemente inteligente para casi todos los fines
didcticos, pero no lo es para el diseo industrial. Ordenndolas desde la ms a la menos crtica, las
deficiencias que presenta el algoritmo de propagacin de Logisim incluyen:

Logisim no puede no puede simular subcircuitos cuyos pines se comporten algunas veces como
entradas y otras como salidas, es decir, que tengan puertos/patas bidireccionales. Componentes que
se hayan desarrollado con Java podran tener este tipo de puertos, aunque: dentro de las libreras
incorporadas, el circuito de la RAM de la librera de Memorias contiene un pin D que acta como
entrada y como salida.

Logisim para la simulacin despus de un nmero preestablecido de iteraciones asumiendo que existe
un error de oscilacin. Podra ser que un gran circuito que no oscile diese problemas.

Aparte del caso de los retardos de las puertas, Logisim no se preocupa de cuestiones temporales. La
introduccin de aleatoriedad en los retardos de los componentes hace que el anlisis sea ms realista,
pero aun as es una versin muy idealizada de la realidad.

Logisim no hace nada al respecto de discriminar entre niveles de voltaje: el valor de un bit slo puede
ser activo, inactivo, sin especificar o errneo.

Hay deficiencias adicionales que no me molesto en comentar porque son tan especficas que si
estuvieseis al tanto de las mismas ya os resultara obvio que Logisim no llega ni remotamente a ese
nivel. Como un ejemplo exagerado puedo comentar que tengo un amigo que trabaja para un
productor de chips y su ocupacin es preocuparse de la aparicin de burbujas en el cableado del chip
que pudiesen crecer creando desconexiones aleatorias.

Incluso ms all de esto, no soy un especialista en el diseo de circuitos. As, podra haber algn error
en la tcnica de propagacin del que no sea consciente. Comentarios de expertos son siempre
bienvenidos.

Libreras JAR
Utilizando libreras JAR
Logisim tiene dos tipos de componentes: los que son diseados como circuitos de Logisim y los que se
definen en Java. Los circuitos de Logisim son ms fciles de disear, pero no soportan una interaccin con
el usuario muy sofisticada, adems de ser ms ineficientes.
Logisim contiene un conjunto bastante amplio de libreras incorporadas con componentes definidos en
Java, pero tambin puede cargar libreras escritas por terceras personas. Cuando te hayas descargado
una librera, puedes importarla desde tu proyecto haciendo clic con el botn derecho sobre la carpeta de
proyecto, en el panel explorador, y seleccionando Cargar Librera JAR...
Entonces Logisim te har seleccionar el archivo JAR y te pedir el nombre de la clase, lo que ser
proporcionado por la tercera persona - la que cre la librera -. A partir de ese momento los componentes
de la librera estarn disponibles.

Creando libreras JAR


Los puntos de esta seccin estn dedicados a una serie de ejemplos minuciosamente comentados que
muestran cmo es posible desarrollar libreras de Logisim por ti mismo. Slo deberas intentarlo si eres
un programador con experiencia en Java. Encontrars la informacin ms all de estos ejemplos bastante
exigua.
Puedes descargarte un archivo JAR que te permita importar estos ejemplos en Logisim a travs de la
seccin de enlaces de la web de Logisim. Ese archivo JAR tambin contiene el cdigo fuente de estos
ejemplos; este cdigo fuente es de dominio pblico. (Sin embargo, el cdigo fuente de Logisim est
disponible bajo la Licencia Pblica de GNU).

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
ms uno.

Clase de la Librera
Muestra cmo definir una librera. Este es el punto de entrada para cualquier librera JAR - la
clase cuyo nombre tendr que introducir el usuario cuando cargue una librera JAR.

Incrementador General
Muestra cmo crear componentes que puedan ser modificables a travs de sus atributos,
generalizando el caso del incrementador de 8 bits de tal forma que pueda trabajar con cualquier
nmero de bits a la entrada y a la salida.

Contador Bsico
Muestra cmo crear un componente que tenga estados internos. En concreto, 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.

Contador
Muestra un componente completo y bastante sofisticado con el que puede interactuar el usuario.
Implementa un contador (en el que se puede configurar el nmero de bits) donde el usuario
puede editar el valor de contaje haciendo clic sobre el componente con la Herramienta de
Cambio.

Directrices
Informacin general para las libreras desarrolladas por terceras partes.

Incrementador de 8 bits

Cada componente incluido en una librera requiere que se definan dos clases: Una clase,
implementando la interfaz del componente (de ahora en adelante Component), define el
comportamiento de un nico componente; la otra, implementando la interfaz de fabricacin del
componente (de ahora en adelante ComponentFactory), define el comportamiento global del
componente y fabrica los componentes. La relacin entre los objetos de estas dos clases se asemeja a la
relacin entre un objeto y su clase en Java.
Implementar directamente todos los mtodos en las interfaces Component y ComponentFactory es
ms

bien

tedioso

repetitivo.

En

la

prctica

es

mucho

ms

conveniente

extender

de

las

clases ManagedComponent y AbstractComponentFactory.


La mayor parte de las clases relevantes para definir libreras de componentes se encuentran en tres
libreras.

com.cburch.logisim.comp
Contiene clases especialmente relacionadas con la definicin de componentes incluyendo los tipos
que han sido descritos arriba:

Component, ComponentFactory, ManagedComponent

AbstractComponentFactory.

com.cburch.logisim.data
Contiene clases relacionadas con elementos de datos asociados con componentes, 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.

com.cburch.logisim.tools
Contiene clases relacionadas con la definicin de herramientas y con la especificacin de la
interaccin entre componentes y herramientas. (Esto slo es necesario para los componentes
ms especializados)

ByteIncrementer
Este es un ejemplo muy simple que muestra cuales son los componentes esenciales para la definicin
de un componente. 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 ms uno.
Este ejemplo por s mismo no es suficiente para crear un archivo JAR que funcione; tambin ser
necesario que proporciones la clase de la Librera, algo que se muestra en el siguiente apartado de esta
gua.

package com.cburch.incr;
import
import
import
import
import
import
import
import
import

com.cburch.logisim.circuit.CircuitState;
com.cburch.logisim.comp.ComponentDrawContext;
com.cburch.logisim.comp.ComponentFactory;
com.cburch.logisim.comp.EndData;
com.cburch.logisim.comp.ManagedComponent;
com.cburch.logisim.data.AttributeSet;
com.cburch.logisim.data.BitWidth;
com.cburch.logisim.data.Location;
com.cburch.logisim.data.Value;

/** Implements a bare-bones custom Logisim component, whose single


* input is 8 bits wide, and whose output value is one more than
* the input value, also 8 bits wide. */
class ByteIncrementer extends ManagedComponent {
// The ManagedComponent class conveniently implements just about
// all of the required methods. All we have to do is to tell it
// about the different "ends" (i.e., inputs and outputs to the

// component) in the constructor, and we need to implement the


// getFactory, propagate, and draw.
/** The width of a byte. */
private static final BitWidth BIT_WIDTH = BitWidth.create(8);
/** Constructs a component at the given location, with the given
* attributes. */
ByteIncrementer(Location loc, AttributeSet attrs) {
super(loc, attrs, 2);
// The third parameter (2) to the parent's constructor indicates how
// many ends the component has. It's not important that this be
// precisely right: The ManagedComponent uses an ArrayList to manage
// the ends.

// Now we tell the ManagedComponent superclass about the ends. We


// assign each end a distinct index, which is used also below in
// the propagate method.
setEnd(0, loc.translate(-30, 0), BIT_WIDTH, EndData.INPUT_ONLY);
setEnd(1, loc,
BIT_WIDTH, EndData.OUTPUT_ONLY);

/** Returns the class that generated this component. */


public ComponentFactory getFactory() {
return ByteIncrementerFactory.instance;
}
/** Recomputes the outputs of this component. The circuitState
* parameter maintains information about the current state of the
* circuit. */
public void propagate(CircuitState circuitState) {
// Retrieve the current value coming into this component.
Value in = circuitState.getValue(getEndLocation(0));
// Compute the output.
Value out;
if(in.isFullyDefined()) {
// If all input bits are 0 or 1, our input is a valid number, and
// so can be our output.
out = Value.createKnown(BIT_WIDTH, in.toIntValue() + 1);
} else if(in.isErrorValue()) {
// If any input bits are "errors" (which usually arise from
// conflicting values on a wire), then we send out all error bits.
out = Value.createError(BIT_WIDTH);
} else {
// Otherwise, some input bits are unspecified. To keep things
// simple, we'll indicate that all output bits are also unspecified.
out = Value.createUnknown(BIT_WIDTH);
}
// Now propagate the output into the circuit state. The parameters
// here indicate the location affected, the value sent there, the
// originating component, and the delay. The delay needs to be positive,
// and it should bear some resemblance to the component's depth, but
// the exact value isn't too important. The incrementing component
// would probably be nine levels deep, so I use that value here.
circuitState.setValue(getEndLocation(1), out, this, 9);
}
/** Draws this component using the data contained in the parameter. */
public void draw(ComponentDrawContext context) {
// The ComponentDrawContext class contains several convenience
// methods for common operations. I've kept the drawing simple
// by just sticking to these operations.
context.drawRectangle(this, "+1");
context.drawPins(this);
}

}
ByteIncrementerFactory
package com.cburch.incr;
import
import
import
import
import

com.cburch.logisim.comp.AbstractComponentFactory;
com.cburch.logisim.comp.Component;
com.cburch.logisim.data.AttributeSet;
com.cburch.logisim.data.Bounds;
com.cburch.logisim.data.Location;

/** The object that manufactures ByteIncrementers. */


class ByteIncrementerFactory extends AbstractComponentFactory {
// The AbstractComponentFactory parent class conveniently implements
// just about all the methods we need for ComponentFactory. All we really
// need are the getName, createComponent, and getOffsetBounds methods
// here.
/** The sole instance of this class. */
static final ByteIncrementerFactory instance = new ByteIncrementerFactory();
/** Constructs an instance. There is no reason to have multiple instances
* of this class, so I make the constructor method private to restrict
creation
* to within this class only. */
private ByteIncrementerFactory() { }
/** Returns the name of this component class, as it is stored in a file. */
public String getName() {
return "Byte Incrementer";
}
/** Returns the name of this component class as the user should see it. */
public String getDisplayName() {
// This may well be different from what is returned by getName.
// 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), or that we want to adapt to the user's
// chosen language. (Logisim doesn't support internationalization
// right now, but it is capable of doing so.)
return "Incrementer (8-Bit)";
}
/** Manufactures and returns a component of this component class. */
public Component createComponent(Location loc, AttributeSet attrs) {
return new ByteIncrementer(loc, attrs);
}
/** Returns a rectangle indicating where the component would appear
* if it were dropped at the origin. */
public Bounds getOffsetBounds(AttributeSet attrs) {
// In this case, the component is a 30x30 rectangle, with the
// origin on the midpoint of the east side. So the x-coordinate
// of the top left corner is -30, the y-coordinate is -15, and
// of course the width and height are both 30.
return Bounds.create(-30, -15, 30, 30);
}
// We could customize the icon associated with the tool by overriding
// the paintIcon method here.
//
//
//
//
}

We could also override the drawGhost method to customize the appearance


of the "ghost" drawn as the user moves the tool across the canvas. By
default, the ghost is a rectangle corresponding to getOffsetBounds. A
ByteIncrementer is just such a rectangle, so there's no need to override.

Clase de la Librera
El punto de acceso a la librera JAR es una clase que extiende de Library. La funcin principal de la
librera es mostrar las herramientas que estn disponibles en la misma; en la mayora de los casos, las
herramientas son todas las herramientas que aaden los diferentes componentes que han sido definidos,
es decir, instancias de la clase AddTool que trabaja con diferentes factoras de componentes.

Components
package com.cburch.incr;
import java.util.Arrays;
import java.util.List;
import com.cburch.logisim.tools.AddTool;
import com.cburch.logisim.tools.Library;
import com.cburch.logisim.tools.Tool;
/** The library of components that the user can access. */
public class Components extends Library {
/** The list of all tools contained in this library. Technically,
* libraries contain tools, which is a slightly more general concept
* than component classes; practically speaking, though, there
* shouldn't be much reason to invent tools beyond new instances of
* AddTool.
*/
private List tools;
/** Constructs an instance of this library. 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.
*/
public Components() {
tools = Arrays.asList(new Tool[] {
new AddTool(ByteIncrementerFactory.instance),
new AddTool(IncrementerFactory.instance),
new AddTool(SimpleCounterFactory.instance),
new AddTool(Counter.factory),
});
}
/** Returns the standard name of the library. Actually, this string
* won't be used by Logisim. */
public String getName() {
return Components.class.getName();
}
/** Returns the name of the library that the user will see. */
public String getDisplayName() {
return "Increment";
}

/** Returns a list of all the tools available in this library. */


public List getTools() {
return tools;
}

Incrementador General
Una de las mayores ventajas de definir componentes en Java es la posibilidad de que sean
configurables a travs de sus atributos. Como ejemplo, podramos necesitar que el incrementador

trabajase con cualquier nmero de bits; las dos clases que vienen a continuacin muestran cmo es
posible conseguirlo.

Incrementer
package com.cburch.incr;
import
import
import
import
import
import
import
import
import
import
import
import
import

com.cburch.logisim.circuit.CircuitState;
com.cburch.logisim.comp.ComponentDrawContext;
com.cburch.logisim.comp.ComponentFactory;
com.cburch.logisim.comp.EndData;
com.cburch.logisim.comp.ManagedComponent;
com.cburch.logisim.data.Attribute;
com.cburch.logisim.data.AttributeEvent;
com.cburch.logisim.data.AttributeListener;
com.cburch.logisim.data.AttributeSet;
com.cburch.logisim.data.Attributes;
com.cburch.logisim.data.BitWidth;
com.cburch.logisim.data.Location;
com.cburch.logisim.data.Value;

/** Represents an incrementer that can work with any bit width. This component
* is designed to illustrate how to use attributes. */
class Incrementer extends ManagedComponent {
/** The attribute representing the bit width of the input and output. */
static final Attribute WIDTH_ATTRIBUTE = Attributes.forBitWidth("Bit
Width");
/** The default value of the width attribute. */
static final BitWidth WIDTH_DEFAULT = BitWidth.create(8);
/** Listens for changes to the width attributes, because we need such
* changes to be reflected in the information about ends managed by the
* ManagedComponent superclass. */
private class MyListener implements AttributeListener {
public void attributeListChanged(AttributeEvent e) { }
public void attributeValueChanged(AttributeEvent e) {
if(e.getAttribute() == WIDTH_ATTRIBUTE) computeEnds();
}
}
/** Represents the sole instance of MyListener. (The more common
* idioms for dealing with listeners do not involve such a
* local variable, but I strongly prefer this idiom, 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. A side effect of
* this is that the listener would die immediately if the listening
* object doesn't maintain its own strong reference; hence the
* instance variable. [It happens that the AttributeSet used here
* uses strong references, but that's no guarantee that a future
* version will not.])
*/
private MyListener myListener = new MyListener();
/** Constructs an incrementer at the given location with the given
* attributes. */
Incrementer(Location loc, AttributeSet attrs) {
super(loc, attrs, 2);
attrs.addAttributeListener(myListener);
computeEnds();
}
/** Sets up the ends of this component. */
private void computeEnds() {
// Retrieve information needed for setting the ends - notice the

// access to the attribute set to retrieve the width.


Location loc = getLocation();
BitWidth width = (BitWidth) getAttributeSet().getValue(WIDTH_ATTRIBUTE);
// Now set up the ends.
setEnd(0, loc.translate(-30, 0), width, EndData.INPUT_ONLY);
setEnd(1, loc,
width, EndData.OUTPUT_ONLY);
}
public ComponentFactory getFactory() {
return IncrementerFactory.instance;
}
public void propagate(CircuitState circuitState) {
Value in = circuitState.getValue(getEndLocation(0));
Value out;
if(in.isFullyDefined()) {
out = Value.createKnown(in.getBitWidth(), in.toIntValue() + 1);
} else if(in.isErrorValue()) {
out = Value.createError(in.getBitWidth());
} else {
out = Value.createUnknown(in.getBitWidth());
}
circuitState.setValue(getEndLocation(1), out, this,
in.getBitWidth().getWidth() + 1);
}
public void draw(ComponentDrawContext context) {
context.drawRectangle(this, "+1");
context.drawPins(this);
}
}

IncrementerFactory
package com.cburch.incr;
import
import
import
import
import
import

com.cburch.logisim.comp.AbstractComponentFactory;
com.cburch.logisim.comp.Component;
com.cburch.logisim.data.AttributeSet;
com.cburch.logisim.data.AttributeSets;
com.cburch.logisim.data.Bounds;
com.cburch.logisim.data.Location;

/** Manufactures Incrementer components. */


class IncrementerFactory extends AbstractComponentFactory {
static final IncrementerFactory instance = new IncrementerFactory();
private IncrementerFactory() { }
public String getName() {
return "Incrementer";
}
public String getDisplayName() {
return "Incrementer (General)";
}
/** Creates an attribute set holding all the initial default values. This
* is the only change from the ByteIncrementerClass class, where
* we simply kept the definition implemented in the parent class. Here,
though,
* we want to insert the attribute. */
public AttributeSet createAttributeSet() {
return AttributeSets.fixedSet(Incrementer.WIDTH_ATTRIBUTE,
Incrementer.WIDTH_DEFAULT);
}

public Component createComponent(Location loc, AttributeSet attrs) {


return new Incrementer(loc, attrs);
}
public Bounds getOffsetBounds(AttributeSet attrs) {
return Bounds.create(-30, -15, 30, 30);
}
}

Contador Bsico
En ocasiones necesitamos componentes que no sean de naturaleza totalmente combinacional, es decir,
componentes que tengan cierta memoria. 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. No puede aparecer varias veces directamente, pero s
puede aparecer varias veces si forma parte de un subcircuito que se usa en ms de una ocasin.
La solucin es crear una clase nueva que represente el estado del objeto y asociar instancias de sta
con el componente a travs del estado del circuito padre. En este ejemplo, que implementa un contador
de 8 bits de flanco de subida, podemos definir la clase CounterState para que lleve esta tarea a cabo,
adems de las implementaciones de Component

y ComponentFactory que

han ilustrado los ltimos

ejemplos. 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).

SimpleCounter
package com.cburch.incr;
import
import
import
import
import
import
import
import
import
import
import
import
import

com.cburch.logisim.circuit.CircuitState;
com.cburch.logisim.comp.ComponentDrawContext;
com.cburch.logisim.comp.ComponentFactory;
com.cburch.logisim.comp.EndData;
com.cburch.logisim.comp.ManagedComponent;
com.cburch.logisim.data.AttributeSet;
com.cburch.logisim.data.BitWidth;
com.cburch.logisim.data.Bounds;
com.cburch.logisim.data.Direction;
com.cburch.logisim.data.Location;
com.cburch.logisim.data.Value;
com.cburch.logisim.util.GraphicsUtil;
com.cburch.logisim.util.StringUtil;

/** Represents a simple 8-bit counter. This example illustrates how a


* component can maintain its own internal state. */
class SimpleCounter extends ManagedComponent {
/** The width of input and output. */
private static final BitWidth BIT_WIDTH = BitWidth.create(8);
//
//
//
//
//
//
//
//

Note what's not here: We don't have any instance variables referring
to the counter's state. Using instance variables to refer to state
would be a major bug, because this component may appear in a circuit
that is used several times as a subcircuit to another circuit. Thus,
this single component would actually appear many times in the overall
circuit. Any instance variables storing state would lead to weird
interactions among the states. Instead, we need to store all state
information in an object stashed into a CircuitState.

SimpleCounter(Location loc, AttributeSet attrs) {


super(loc, attrs, 2);
setEnd(0, loc.translate(-30, 0), BitWidth.ONE, EndData.INPUT_ONLY);
setEnd(1, loc,
BIT_WIDTH,
EndData.OUTPUT_ONLY);
}

public ComponentFactory getFactory() {


return SimpleCounterFactory.instance;
}
public void propagate(CircuitState circuitState) {
// Here I retrieve the state associated with this component via
// a helper method. In this case, the state is in a CounterState
// object.
CounterState state = getCounterState(circuitState);
Value clk = circuitState.getValue(getEndLocation(0));
if(state.getLastClock() == null ||
(state.getLastClock() == Value.FALSE && clk == Value.TRUE)) {
// Either the state was just created, or else we're on a rising edge
// for the clock input; in either case, increment the counter.
Value newValue = Value.createKnown(BIT_WIDTH,
state.getValue().toIntValue() + 1);
circuitState.setValue(getEndLocation(1), newValue, this, 9);
state.setValue(newValue);
}
state.setLastClock(clk);

//
//
//
//
//

(You might be tempted to determine the counter's current value


via circuitState.getValue(getEndLocation(1)). This is erroneous,
though, because another component may be pushing a value onto
the same wire, which could lead to conflicts that don't really
represent the value the counter is emitting.)

public void draw(ComponentDrawContext context) {


context.drawRectangle(this);
context.drawClock(this, 0, Direction.EAST);
context.drawPin(this, 1);
// I'd like to display the current counter value centered within the
// rectangle. However, if the context says not to show state (as
// when generating printer output), then I shouldn't do this.
if(context.getShowState()) {
CounterState state = getCounterState(context.getCircuitState());
Bounds bds = getBounds();
GraphicsUtil.drawCenteredText(context.getGraphics(),
StringUtil.toHexString(BIT_WIDTH.getWidth(),
state.getValue().toIntValue()),
bds.getX() + bds.getWidth() / 2,
bds.getY() + bds.getHeight() / 2);
}
}
/** Retrieves the state associated with this counter in the circuit state,
* generating the state if necessary.
*/
protected CounterState getCounterState(CircuitState circuitState) {
CounterState state = (CounterState) circuitState.getData(this);
if(state == null) {
// If it doesn't yet exist, 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.
state = new CounterState(null, Value.createKnown(BIT_WIDTH, -1));
circuitState.setData(this, state);
}
return state;
}
}

CounterState
package com.cburch.incr;
import com.cburch.logisim.comp.ComponentState;
import com.cburch.logisim.data.Value;
/** Represents the state of a counter. */
class CounterState implements ComponentState, Cloneable {
/** The last clock input value observed. */
private Value lastClock;
/** The current value emitted by the counter. */
private Value value;
/** Constructs a state with the given values. */
public CounterState(Value lastClock, Value value) {
this.lastClock = lastClock;
this.value = value;
}
/** Returns a copy of this object. */
public Object clone() {
// We can just use what super.clone() returns: The only instance
variables are
// Value objects, which are immutable, so we don't care that both the
copy
// and the copied refer to the same Value objects. If we had mutable
instance
// variables, then of course we would need to clone them.
try { return super.clone(); }
catch(CloneNotSupportedException e) { return null; }
}
/** Returns the last clock observed. */
public Value getLastClock() {
return lastClock;
}
/** Updates the last clock observed. */
public void setLastClock(Value value) {
lastClock = value;
}
/** Returns the current value emitted by the counter. */
public Value getValue() {
return value;
}
/** Updates the current value emitted by the counter. */
public void setValue(Value value) {
this.value = value;
}
}

SimpleCounterFactory
package com.cburch.incr;
import
import
import
import
import

com.cburch.logisim.comp.AbstractComponentFactory;
com.cburch.logisim.comp.Component;
com.cburch.logisim.data.AttributeSet;
com.cburch.logisim.data.Bounds;
com.cburch.logisim.data.Location;

/** Manufactures simple 8-bit counters. This example illustrates how a


* component can maintain its own internal state. All of the code relevant
* to state, though, appears in the SimpleCounter and

* CounterState classes. */
class SimpleCounterFactory extends AbstractComponentFactory {
static final SimpleCounterFactory instance = new SimpleCounterFactory();
private SimpleCounterFactory() { }
public String getName() {
return "Simple Counter";
}
public String getDisplayName() {
return "Counter (Simple)";
}
public Component createComponent(Location loc, AttributeSet attrs) {
return new SimpleCounter(loc, attrs);
}
public Bounds getOffsetBounds(AttributeSet arg0) {
return Bounds.create(-30, -15, 30, 30);
}
}

Contador
Esta introduccin a las libreras de Logisim concluye con un contador bastante sofisticado que permite
al usuario modificar el valor actual utilizando la Herramienta De Cambio. Esto hace necesario
implementar el mtodo getFeature de Component de manera que devuelva una implementacin

Pokable; la implementacin Pokable proporciona acceso a una implementacin Caret que puede
hacerse cargo de los eventos de teclado y ratn de forma apropiada.
Este ejemplo tambin muestra la que considero la mejor forma de estructurar una librera de
componentes: Tener una simple clase por cada componente, con la clase factora anidada de forma
privada junto con cualquier clase soportada.

Counter
package com.cburch.incr;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import

com.cburch.logisim.circuit.CircuitState;
com.cburch.logisim.comp.AbstractComponentFactory;
com.cburch.logisim.comp.Component;
com.cburch.logisim.comp.ComponentFactory;
com.cburch.logisim.comp.ComponentUserEvent;
com.cburch.logisim.comp.EndData;
com.cburch.logisim.data.Attribute;
com.cburch.logisim.data.AttributeEvent;
com.cburch.logisim.data.AttributeListener;
com.cburch.logisim.data.AttributeSet;
com.cburch.logisim.data.AttributeSets;
com.cburch.logisim.data.Attributes;
com.cburch.logisim.data.BitWidth;
com.cburch.logisim.data.Bounds;
com.cburch.logisim.data.Location;
com.cburch.logisim.data.Value;
com.cburch.logisim.tools.AbstractCaret;
com.cburch.logisim.tools.Caret;
com.cburch.logisim.tools.Pokable;

/** Implements a counter for an arbitrary number of bits, whose value can be
* modified interactively by the user. The primary purpose of this example is
* to illustrate the addition of user interaction; the entry point for this
* interaction is via the getFeature method.
*/
class Counter extends SimpleCounter {
// Note that I've extended SimpleCounter to inherit all of its logic
// for propagation and drawing.
// The previous examples have included two separate classes for each
// component. In practice, though, I personally prefer having just
// one file per component type. The most convenient technique for this
// is to make a private nested class for the factory, and to include
// a constant referring to the factory.
public static final ComponentFactory factory = new Factory();
// I'll restrict the maximum width to 12, since the rectangle drawn doesn't
// have room to display more than 12 bits.
static final Attribute WIDTH_ATTRIBUTE = Attributes.forBitWidth("Bit Width",
1, 12);
static final BitWidth WIDTH_DEFAULT = BitWidth.create(8);
private static class Factory extends AbstractComponentFactory {
private Factory() { }
public String getName() {
return "Counter";
}
public String getDisplayName() {
return "Counter";
}
public Component createComponent(Location loc, AttributeSet attrs) {
return new Counter(loc, attrs);
}
public Bounds getOffsetBounds(AttributeSet arg0) {
return Bounds.create(-30, -15, 30, 30);
}
public AttributeSet createAttributeSet() {
return AttributeSets.fixedSet(Counter.WIDTH_ATTRIBUTE,
Counter.WIDTH_DEFAULT);
}
}
/** In addition to listening for changes to the width attribute (as with
* the Incrementer example), this also serves for manufacturing
* the "caret" for interacting with the user. */
private class MyListener implements AttributeListener, Pokable {
public void attributeListChanged(AttributeEvent e) { }
public void attributeValueChanged(AttributeEvent e) {
if(e.getAttribute() == WIDTH_ATTRIBUTE) computeEnds();
}
/** Manufactures the caret for interacting with the user. */
public Caret getPokeCaret(ComponentUserEvent event) {
return new PokeCaret(event.getCircuitState());
}
}
/** Implements all the functionality that interacts with the user when
* poking this component. */
private class PokeCaret extends AbstractCaret {
/** The circuit state the user is poking with. */

CircuitState circuitState;
/** The initial value. We use this in case the user cancels the editing
* to return to the initial value. (Canceling an edit is not currently
* supported in Logisim, but it may be in a future version.) */
Value initValue;
PokeCaret(CircuitState circuitState) {
this.circuitState = circuitState;
CounterState initial = Counter.this.getCounterState(circuitState);
initValue = initial.getValue();
setBounds(Counter.this.getBounds());
}
/** Draws an indicator that the caret is being selected. Here, we'll

draw

* a red rectangle around the value. */


public void draw(Graphics g) {
Bounds bds = Counter.this.getBounds();
BitWidth width = (BitWidth)
Counter.this.getAttributeSet().getValue(WIDTH_ATTRIBUTE);
int len = (width.getWidth() + 3) / 4;

g.setColor(Color.RED);
int wid = 7 * len + 2; // width of caret rectangle
int ht = 16; // height of caret rectangle
g.drawRect(bds.getX() + (bds.getWidth() - wid) / 2,
bds.getY() + (bds.getHeight() - ht) / 2, wid, ht);
g.setColor(Color.BLACK);

/** Processes a key by just adding it onto the end of the current value.
*/

public void keyTyped(KeyEvent e) {


// convert it to a hex digit; if it isn't a hex digit, abort.
int val = Character.digit(e.getKeyChar(), 16);
if(val < 0) return;

// compute the next value.


BitWidth width = (BitWidth)
Counter.this.getAttributeSet().getValue(WIDTH_ATTRIBUTE);
CounterState state = Counter.this.getCounterState(circuitState);
Value newValue = Value.createKnown(width,
(state.getValue().toIntValue() * 16 + val) &
width.getMask());
propagate

// change the value immediately in the component's state, and


// it immediately.
state.setValue(newValue);
circuitState.setValue(Counter.this.getEndLocation(1), newValue,
Counter.this, 1);

}
edits,

/** Commit the editing. Since this caret modifies the state as the user
* there is nothing to do here. */
public void stopEditing() { }

/** Cancel the editing. */


public void cancelEditing() {
Counter.this.getCounterState(circuitState).setValue(initValue);
}

// The listener instance variable, the constructor, and computeEnds all

// proceeds just as in the Incrementer class.


private MyListener myListener = new MyListener();
private Counter(Location loc, AttributeSet attrs) {
super(loc, attrs);
attrs.addAttributeListener(myListener);
computeEnds();
}
private void computeEnds() {
Location loc = getLocation();
BitWidth width = (BitWidth) getAttributeSet().getValue(WIDTH_ATTRIBUTE);
setEnd(0, loc.translate(-30, 0), BitWidth.ONE, EndData.INPUT_ONLY);
setEnd(1, loc,
width,
EndData.OUTPUT_ONLY);
}
/** Retrieves a "special feature" associated with this component. Poke
support
* is considered a special feature. When a user clicks on the component with
* the poke tool, Logisim will call this method with the key being the
Pokable
* class. We should return a Pokable object in response, which it can use to
* access the caret for interaction.
*/
public Object getFeature(Object key) {
if(key == Pokable.class) return myListener;
return super.getFeature(key);
}

public ComponentFactory getFactory() {


return factory;
}

Directrices
Aprendiendo ms
Ms all de la serie de ejemplos que se proporcionan aqu, el cdigo fuente de Logisim proporciona
una copiosa cantidad de ejemplos aadidos, aunque no siempre muestren tanta atencin a su legibilidad
y buen diseo.
Para una mxima portabilidad de las futuras versiones, deberas amoldarte lo ms posible a las clases
de los paquetes. Naturalmente puedes utilizar otros paquetes, pero siempre sabiendo que son ms
vulnerables a cambios en futuras versiones de Logisim.
En general estoy ms que dispuesto a responder cualquier peticin de ayuda. Adems, informacin
acerca de errores y sugerencias para posibles mejoras son, naturalmente, bien recibidas.

Distribucin
Eres libre de distribuir cualquiera de las libreras JAR que desarrolles sin restriccin alguna. La
restricciones de GPL se aplican, sin embargo, si algn trozo de tu cdigo se deriva de algn trozo del
cdigo fuente de Logisim (que se hace pblico bajo GPL). Derivar a partir del cdigo proporcionado en
la Gua del Usuario no infringe tales restricciones; estos ejemplos son de dominio pblico.
Si quieres compartir tu librera con otros usuarios de Logisim, me encantar proporcionar un link a
una pgina Web anfitriona o el mismo archivo JAR desde el sitio web de Logisim. Si crees que tu librera
debera estar incluida en la publicacin bsica de Logisim, entonces tu sugerencia ser bienvenida y
estar contento de agradecer tu contribucin en versiones de Logisim que incluyan tu trabajo.

Acerca del programa


Logisim es software de cdigo abierto. El cdigo fuente est incluido en el directorio src del archivo
JAR que se distribuye.
Si encuentras til Logisim, por favor hzmelo saber. Comunicdmelo especialmente si sois una
institucin educativa; esta informacin me permitir ganar ms apoyo para el trabajo.

Ser bienvenido cualquier mail acerca de Logisim, incluyendo informes de errores y sugerencias.
Cuando me escribas, por favor recuerda que he trabajado duro para desarrollar Logisim sin recibir
retribucin alguna por tu parte. Si quieres tener el derecho a quejarte del software, entonces te sugerira
que te gastases el dinero en un programa que compita con Logisim. (No conozco ningn competidor de
cdigo abierto que se acerque al conjunto de caractersticas que ofrece Logisim). Sin embargo, sigo
interesado en mejorar Logisim, y tus sugerencias seran ms que bienvenidas.

Aviso del copyright


Copyright (c) 2005, Carl Burch.
Logisim es software libre; puedes redistribuirlo y/o modificarlo bajo los trminos de la Licencia Pblica
General GNU como se publica en la Free Software Foundation; igualmente en la versin 2 de la Licencia o
(a tu eleccin) cualquier versin posterior.
Logisim se distribuye con la esperanza de ser til, pero SIN NINGUNA GARANTA; incluso sin la garanta
implcita de COMERCIABILIDAD o BUEN ESTADO PARA UN USO PARTICULAR. Para ms informacin
consultar la Licencia Pblica General GNU.

Agradecimientos
El cdigo fuente de Logisim es principalmente fruto de mi propio trabajo; debo agradecer a las
instituciones que financian mi trabajo como profesor, incluyendo este programa: Comenc este programa
en la Universidad de Saint John (Collegeville, Minnesota, USA) en 2000 - 2004 y lo he continuado en
Hendrix College (Conway, Arkansas, USA) desde el 2004 hasta el da de hoy. Le estoy muy agradecido a
estas instituciones por haberme proporcionado el tiempo y los recursos para trabajar en este proyecto.
Ojal todos los colegios y universidades se preocuparan tanto por una excelente enseanza como lo
hacen estas instituciones!
En segundo lugar est Pablo Leal Ramos que desarroll la traduccin al castellano para la versin 2.1.0
mientras estudiaba en Hendrix como alumno de intercambio de Espaa.
Finalmente y tambin significante estn 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, que utilizaron las versiones ms rudimentarias cuando Logisim estaba
siendo desarrollado; y tambin en la primavera de 2005 en las clases de CS61C en la Universidad de
California, Berkeley, que beta-testearon las primeras iteraciones de la versin 2.0. 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; algunas
de estas piezas se distribuyen como parte de Logisim.

API Sun's Java (obviamente)


Proyecto Sun's Javahelp

Sistemas de ayuda.

JDOM, de www.jdom.org
Lee y salva datos XML.

Adaptador MRJ, de Steve Roy


Integracin con la plataforma Macintosh OS X.

launch4j, de Grzegorz Kowalt


Proporciona el ejecutable de Windows para la distribucin de Logisim.

Codificador GIF, de Adam Doppelt


Salva imgenes como archivos GIF. Esto estaba basado en el cdigo en C escrito por
Sverre H. Huseby.
Y por ltimo, quiero agradecer a todos los usuarios que se han puesto en contacto conmigo - lo mismo
que haya sido a travs de informes de errores, sugerencias o simplemente para hacerme saber que
utilizan Logisim en sus clases -. Tengo que mantener en el anonimato la identidad de estos participantes
porque no tengo su permiso para incluirlos aqu pero: Gracias!

También podría gustarte