logisim-2.7.1/0000755000175000017500000000000011751441134013063 5ustar vincentvincentlogisim-2.7.1/src/0000755000175000017500000000000011541757100013652 5ustar vincentvincentlogisim-2.7.1/src/com/0000755000175000017500000000000011446034506014432 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/0000755000175000017500000000000011446034572015703 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/logisim/0000755000175000017500000000000011535206214017337 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/logisim/util/0000755000175000017500000000000011541661306020320 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/logisim/util/ZipClassLoader.java0000644000175000017500000001745211447117150024051 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.util; import java.io.BufferedInputStream; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.HashMap; import java.util.LinkedList; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; public class ZipClassLoader extends ClassLoader { // This code was posted on a forum by "leukbr" on March 30, 2001. // http://forums.sun.com/thread.jspa?threadID=360060&forumID=31 // I've modified it substantially to include a thread that keeps the file // open for OPEN_TIME milliseconds so time isn't wasted continually // opening and closing the file. private static final int OPEN_TIME = 5000; private static final int DEBUG = 0; // 0 = no debug messages // 1 = open/close ZIP file only // 2 = also each resource request // 3 = all messages while retrieving resource private static final int REQUEST_FIND = 0; private static final int REQUEST_LOAD = 1; private static class Request { int action; String resource; boolean responseSent; Object response; Request(int action, String resource) { this.action = action; this.resource = resource; this.responseSent = false; } @Override public String toString() { String act = action == REQUEST_LOAD ? "load" : action == REQUEST_FIND ? "find" : "act" + action; return act + ":" + resource; } void setResponse(Object value) { synchronized(this) { response = value; responseSent = true; notifyAll(); } } void ensureDone() { boolean aborted = false; synchronized(this) { if (!responseSent) { aborted = true; responseSent = true; response = null; notifyAll(); } } if (aborted && DEBUG >= 1) { System.err.println("request not handled successfully"); //OK } } Object getResponse() { synchronized(this) { while (!responseSent) { try { this.wait(1000); } catch (InterruptedException e) { } } return response; } } } private class WorkThread extends Thread { private LinkedList requests = new LinkedList(); private ZipFile zipFile = null; @Override public void run() { try { while (true) { Request request = waitForNextRequest(); if (request == null) return; if (DEBUG >= 2) System.err.println("processing " + request); //OK try { switch (request.action) { case REQUEST_LOAD: performLoad(request); break; case REQUEST_FIND: performFind(request); break; } } finally { request.ensureDone(); } if (DEBUG >= 2) System.err.println("processed: " + request.getResponse()); //OK } } catch (Throwable t) { if (DEBUG >= 3) { System.err.print("uncaught: "); t.printStackTrace(); } //OK } finally { if (zipFile != null) { try { zipFile.close(); zipFile = null; if (DEBUG >= 1) System.err.println(" ZIP closed"); //OK } catch (IOException e) { if (DEBUG >= 1) System.err.println("Error closing ZIP file"); //OK } } } } private Request waitForNextRequest() { synchronized(bgLock) { long start = System.currentTimeMillis(); while (requests.isEmpty()) { long elapse = System.currentTimeMillis() - start; if (elapse >= OPEN_TIME) { bgThread = null; return null; } try { bgLock.wait(OPEN_TIME); } catch (InterruptedException e) { } } return requests.removeFirst(); } } private void performFind(Request req) { ensureZipOpen(); Object ret = null; try { if (zipFile != null) { if (DEBUG >= 3) System.err.println(" retrieve ZIP entry"); //OK String res = req.resource; ZipEntry zipEntry = zipFile.getEntry(res); if (zipEntry != null) { String url = "jar:" + zipPath.toURI() + "!/" + res; ret = new URL(url); if (DEBUG >= 3) System.err.println(" found: " + url); //OK } } } catch (Throwable ex) { if (DEBUG >= 3) System.err.println(" error retrieving data"); //OK ex.printStackTrace(); } req.setResponse(ret); } private void performLoad(Request req) { BufferedInputStream bis = null; ensureZipOpen(); Object ret = null; try { if (zipFile != null) { if (DEBUG >= 3) System.err.println(" retrieve ZIP entry"); //OK ZipEntry zipEntry = zipFile.getEntry(req.resource); if (zipEntry != null) { if (DEBUG >= 3) System.err.println(" load file"); //OK byte[] result = new byte[(int) zipEntry.getSize()]; bis = new BufferedInputStream(zipFile.getInputStream(zipEntry)); try { bis.read(result, 0, result.length); ret = result; } catch (IOException e) { if (DEBUG >= 3) System.err.println(" error loading file"); //OK } } } } catch (Throwable ex) { if (DEBUG >= 3) System.err.println(" error retrieving data"); //OK ex.printStackTrace(); } finally { if (bis!=null) { try { if (DEBUG >= 3) System.err.println(" close file"); //OK bis.close(); } catch (IOException ioex) { if (DEBUG >= 3) System.err.println(" error closing data"); //OK } } } req.setResponse(ret); } private void ensureZipOpen() { if (zipFile == null) { try { if (DEBUG >= 3) System.err.println(" open ZIP file"); //OK zipFile = new ZipFile(zipPath); if (DEBUG >= 1) System.err.println(" ZIP opened"); //OK } catch (IOException e) { if (DEBUG >= 1) System.err.println(" error opening ZIP file"); //OK } } } } private File zipPath; private HashMap classes = new HashMap(); private Object bgLock = new Object(); private WorkThread bgThread = null; public ZipClassLoader(String zipFileName) { this(new File(zipFileName)); } public ZipClassLoader(File zipFile) { zipPath = zipFile; } @Override public URL findResource(String resourceName) { if (DEBUG >= 3) System.err.println("findResource " + resourceName); //OK Object ret = request(REQUEST_FIND, resourceName); if (ret instanceof URL) { return (URL) ret; } else { return super.findResource(resourceName); } } @Override public Class findClass(String className) throws ClassNotFoundException { boolean found = false; Object result = null; // check whether we have loaded this class before synchronized(classes) { found = classes.containsKey(className); if (found) result = classes.get(className); } // try loading it from the ZIP file if we haven't if (!found) { String resourceName = className.replace('.', '/') + ".class"; result = request(REQUEST_LOAD, resourceName); if (result instanceof byte[]) { if (DEBUG >= 3) System.err.println(" define class"); //OK byte[] data = (byte[]) result; result = defineClass(className, data, 0, data.length); if (result != null) { if (DEBUG >= 3) System.err.println(" class defined"); //OK } else { if (DEBUG >= 3) System.err.println(" format error"); //OK result = new ClassFormatError(className); } } synchronized(classes) { classes.put(className, result); } } if (result instanceof Class) { return (Class) result; } else if (result instanceof ClassNotFoundException) { throw (ClassNotFoundException) result; } else if (result instanceof Error) { throw (Error) result; } else { return super.findClass(className); } } private Object request(int action, String resourceName) { Request request; synchronized(bgLock) { if (bgThread == null) { // start the thread if it isn't working bgThread = new WorkThread(); bgThread.start(); } request = new Request(action, resourceName); bgThread.requests.addLast(request); bgLock.notifyAll(); } return request.getResponse(); } } logisim-2.7.1/src/com/cburch/logisim/util/WindowMenuManager.java0000644000175000017500000000373611446034570024564 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.util; import java.util.ArrayList; import java.util.List; class WindowMenuManager { private WindowMenuManager() { } private static ArrayList menus = new ArrayList(); private static ArrayList managers = new ArrayList(); private static WindowMenuItemManager currentManager = null; public static void addMenu(WindowMenu menu) { for (WindowMenuItemManager manager : managers) { manager.createMenuItem(menu); } menus.add(menu); } // TODO frames should call removeMenu when they're destroyed public static void addManager(WindowMenuItemManager manager) { for (WindowMenu menu : menus) { manager.createMenuItem(menu); } managers.add(manager); } public static void removeManager(WindowMenuItemManager manager) { for (WindowMenu menu : menus) { manager.removeMenuItem(menu); } managers.remove(manager); } static List getMenus() { return menus; } static WindowMenuItemManager getCurrentManager() { return currentManager; } static void setCurrentManager(WindowMenuItemManager value) { if (value == currentManager) return; boolean doEnable = (currentManager == null) != (value == null); if (currentManager == null) setNullItems(false); else currentManager.setSelected(false); currentManager = value; if (currentManager == null) setNullItems(true); else currentManager.setSelected(true); if (doEnable) enableAll(); } static void unsetCurrentManager(WindowMenuItemManager value) { if (value != currentManager) return; setCurrentManager(null); } private static void setNullItems(boolean value) { for (WindowMenu menu : menus) { menu.setNullItemSelected(value); } } private static void enableAll() { for (WindowMenu menu : menus) { menu.computeEnabled(); } } } logisim-2.7.1/src/com/cburch/logisim/util/WindowMenuItemManager.java0000644000175000017500000000641611446034570025401 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.util; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.util.HashMap; import javax.swing.JFrame; import javax.swing.JRadioButtonMenuItem; public abstract class WindowMenuItemManager { private class MyListener implements WindowListener { public void windowOpened(WindowEvent event) { } public void windowClosing(WindowEvent event) { JFrame frame = getJFrame(false); if (frame.getDefaultCloseOperation() == JFrame.HIDE_ON_CLOSE) { removeFromManager(); } } public void windowClosed(WindowEvent event) { removeFromManager(); } public void windowDeiconified(WindowEvent event) { } public void windowIconified(WindowEvent event) { addToManager(); WindowMenuManager.setCurrentManager(WindowMenuItemManager.this); } public void windowActivated(WindowEvent event) { addToManager(); WindowMenuManager.setCurrentManager(WindowMenuItemManager.this); } public void windowDeactivated(WindowEvent event) { WindowMenuManager.unsetCurrentManager(WindowMenuItemManager.this); } } private MyListener myListener = new MyListener(); private String text; private boolean persistent; private boolean listenerAdded = false; private boolean inManager = false; private HashMap menuItems = new HashMap(); public WindowMenuItemManager(String text, boolean persistent) { this.text = text; this.persistent = persistent; if (persistent) { WindowMenuManager.addManager(this); } } public abstract JFrame getJFrame(boolean create); public void frameOpened(JFrame frame) { if (!listenerAdded) { frame.addWindowListener(myListener); listenerAdded = true; } addToManager(); WindowMenuManager.setCurrentManager(this); } public void frameClosed(JFrame frame) { if (!persistent) { if (listenerAdded) { frame.removeWindowListener(myListener); listenerAdded = false; } removeFromManager(); } } private void addToManager() { if (!persistent && !inManager) { WindowMenuManager.addManager(this); inManager = true; } } private void removeFromManager() { if (!persistent && inManager) { inManager = false; for (WindowMenu menu : WindowMenuManager.getMenus()) { JRadioButtonMenuItem menuItem = menuItems.get(menu); menu.removeMenuItem(this, menuItem); } WindowMenuManager.removeManager(this); } } public String getText() { return text; } public void setText(String value) { text = value; for (JRadioButtonMenuItem menuItem : menuItems.values()) { menuItem.setText(text); } } JRadioButtonMenuItem getMenuItem(WindowMenu key) { return menuItems.get(key); } void createMenuItem(WindowMenu menu) { WindowMenuItem ret = new WindowMenuItem(this); menuItems.put(menu, ret); menu.addMenuItem(this, ret, persistent); } void removeMenuItem(WindowMenu menu) { JRadioButtonMenuItem item = menuItems.remove(menu); if (item != null) menu.removeMenuItem(this, item); } void setSelected(boolean selected) { for (JRadioButtonMenuItem item : menuItems.values()) { item.setSelected(selected); } } } logisim-2.7.1/src/com/cburch/logisim/util/WindowMenuItem.java0000644000175000017500000000146111446034570024101 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.util; import java.awt.Frame; import java.awt.event.ActionEvent; import javax.swing.JFrame; import javax.swing.JRadioButtonMenuItem; class WindowMenuItem extends JRadioButtonMenuItem { private WindowMenuItemManager manager; WindowMenuItem(WindowMenuItemManager manager) { this.manager = manager; setText(manager.getText()); setSelected(WindowMenuManager.getCurrentManager() == manager); } public JFrame getJFrame() { return manager.getJFrame(true); } public void actionPerformed(ActionEvent event) { JFrame frame = getJFrame(); frame.setExtendedState(Frame.NORMAL); frame.setVisible(true); frame.toFront(); } } logisim-2.7.1/src/com/cburch/logisim/util/WindowMenu.java0000644000175000017500000001327211535206230023256 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.util; import java.awt.Dimension; import java.awt.Frame; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.util.ArrayList; import javax.swing.ButtonGroup; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JRadioButtonMenuItem; import javax.swing.KeyStroke; public class WindowMenu extends JMenu { private class MyListener implements LocaleListener, ActionListener { public void localeChanged() { WindowMenu.this.setText(Strings.get("windowMenu")); minimize.setText(Strings.get("windowMinimizeItem")); close.setText(Strings.get("windowCloseItem")); zoom.setText(MacCompatibility.isQuitAutomaticallyPresent() ? Strings.get("windowZoomItemMac") : Strings.get("windowZoomItem")); } public void actionPerformed(ActionEvent e) { Object src = e.getSource(); if (src == minimize) { doMinimize(); } else if (src == zoom) { doZoom(); } else if (src == close) { doClose(); } else if (src instanceof WindowMenuItem) { WindowMenuItem choice = (WindowMenuItem) src; if (choice.isSelected()) { WindowMenuItem item = findOwnerItem(); if (item != null) { item.setSelected(true); } choice.actionPerformed(e); } } } private WindowMenuItem findOwnerItem() { for (WindowMenuItem i : persistentItems) { if (i.getJFrame() == owner) return i; } for (WindowMenuItem i : transientItems) { if (i.getJFrame() == owner) return i; } return null; } } private JFrame owner; private MyListener myListener = new MyListener(); private JMenuItem minimize = new JMenuItem(); private JMenuItem zoom = new JMenuItem(); private JMenuItem close = new JMenuItem(); private JRadioButtonMenuItem nullItem = new JRadioButtonMenuItem(); private ArrayList persistentItems = new ArrayList(); private ArrayList transientItems = new ArrayList(); public WindowMenu(JFrame owner) { this.owner = owner; WindowMenuManager.addMenu(this); int menuMask = getToolkit().getMenuShortcutKeyMask(); minimize.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M, menuMask)); close.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W, menuMask)); if (owner == null) { minimize.setEnabled(false); zoom.setEnabled(false); close.setEnabled(false); } else { minimize.addActionListener(myListener); zoom.addActionListener(myListener); close.addActionListener(myListener); } computeEnabled(); computeContents(); LocaleManager.addLocaleListener(myListener); myListener.localeChanged(); } void addMenuItem(Object source, WindowMenuItem item, boolean persistent) { if (persistent) persistentItems.add(item); else transientItems.add(item); item.addActionListener(myListener); computeContents(); } void removeMenuItem(Object source, JRadioButtonMenuItem item) { if (transientItems.remove(item)) { item.removeActionListener(myListener); } computeContents(); } void computeEnabled() { WindowMenuItemManager currentManager = WindowMenuManager.getCurrentManager(); minimize.setEnabled(currentManager != null); zoom.setEnabled(currentManager != null); close.setEnabled(currentManager != null); } void setNullItemSelected(boolean value) { nullItem.setSelected(value); } private void computeContents() { ButtonGroup bgroup = new ButtonGroup(); bgroup.add(nullItem); removeAll(); add(minimize); add(zoom); add(close); if (!persistentItems.isEmpty()) { addSeparator(); for (JRadioButtonMenuItem item : persistentItems) { bgroup.add(item); add(item); } } if (!transientItems.isEmpty()) { addSeparator(); for (JRadioButtonMenuItem item : transientItems) { bgroup.add(item); add(item); } } WindowMenuItemManager currentManager = WindowMenuManager.getCurrentManager(); if (currentManager != null) { JRadioButtonMenuItem item = currentManager.getMenuItem(this); if (item != null) { item.setSelected(true); } } } void doMinimize() { if (owner != null) { owner.setExtendedState(Frame.ICONIFIED); } } void doClose() { if (owner instanceof WindowClosable) { ((WindowClosable) owner).requestClose(); } else if (owner != null) { int action = owner.getDefaultCloseOperation(); if (action == JFrame.EXIT_ON_CLOSE) { System.exit(0); } else if (action == JFrame.HIDE_ON_CLOSE) { owner.setVisible(false); } else if (action == JFrame.DISPOSE_ON_CLOSE) { owner.dispose(); } } } void doZoom() { if (owner == null) return; owner.pack(); Dimension screenSize = owner.getToolkit().getScreenSize(); Dimension windowSize = owner.getPreferredSize(); Point windowLoc = owner.getLocation(); boolean locChanged = false; boolean sizeChanged = false; if (windowLoc.x + windowSize.width > screenSize.width) { windowLoc.x = Math.max(0, screenSize.width - windowSize.width); locChanged = true; if (windowLoc.x + windowSize.width > screenSize.width) { windowSize.width = screenSize.width - windowLoc.x; sizeChanged = true; } } if (windowLoc.y + windowSize.height > screenSize.height) { windowLoc.y = Math.max(0, screenSize.height - windowSize.height); locChanged = true; if (windowLoc.y + windowSize.height > screenSize.height) { windowSize.height = screenSize.height - windowLoc.y; sizeChanged = true; } } if (locChanged) owner.setLocation(windowLoc); if (sizeChanged) owner.setSize(windowSize); } } logisim-2.7.1/src/com/cburch/logisim/util/WindowClosable.java0000644000175000017500000000037711524651324024106 0ustar vincentvincent/* Copyright (c) 2011, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.util; public interface WindowClosable { public void requestClose(); } logisim-2.7.1/src/com/cburch/logisim/util/VerticalSplitPane.java0000644000175000017500000000675011446034570024565 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.util; import java.awt.Component; import java.awt.Container; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Insets; import java.awt.LayoutManager; import java.awt.event.MouseEvent; import javax.swing.JComponent; import javax.swing.JPanel; public class VerticalSplitPane extends JPanel { private class MyLayout implements LayoutManager { public void addLayoutComponent(String name, Component comp) { } public void removeLayoutComponent(Component comp) { } public Dimension preferredLayoutSize(Container parent) { if (fraction <= 0.0) return comp1.getPreferredSize(); if (fraction >= 1.0) return comp0.getPreferredSize(); Insets in = parent.getInsets(); Dimension d0 = comp0.getPreferredSize(); Dimension d1 = comp1.getPreferredSize(); return new Dimension(in.left + d0.width + d1.width + in.right, in.top + Math.max(d0.height, d1.height) + in.bottom); } public Dimension minimumLayoutSize(Container parent) { if (fraction <= 0.0) return comp1.getMinimumSize(); if (fraction >= 1.0) return comp0.getMinimumSize(); Insets in = parent.getInsets(); Dimension d0 = comp0.getMinimumSize(); Dimension d1 = comp1.getMinimumSize(); return new Dimension(in.left + d0.width + d1.width + in.right, in.top + Math.max(d0.height, d1.height) + in.bottom); } public void layoutContainer(Container parent) { Insets in = parent.getInsets(); int maxWidth = parent.getWidth() - (in.left + in.right); int maxHeight = parent.getHeight() - (in.top + in.bottom); int split; if (fraction <= 0.0) { split = 0; } else if (fraction >= 1.0) { split = maxWidth; } else { split = (int) Math.round(maxWidth * fraction); split = Math.min(split, maxWidth - comp1.getMinimumSize().width); split = Math.max(split, comp0.getMinimumSize().width); } comp0.setBounds(in.left, in.top, split, maxHeight); comp1.setBounds(in.left + split, in.top, maxWidth - split, maxHeight); dragbar.setBounds(in.left + split - HorizontalSplitPane.DRAG_TOLERANCE, in.top, 2 * HorizontalSplitPane.DRAG_TOLERANCE, maxHeight); } } private class MyDragbar extends HorizontalSplitPane.Dragbar { MyDragbar() { setCursor(Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR)); } @Override int getDragValue(MouseEvent e) { return getX() + e.getX() - VerticalSplitPane.this.getInsets().left; } @Override void setDragValue(int value) { Insets in = VerticalSplitPane.this.getInsets(); setFraction((double) value / (VerticalSplitPane.this.getWidth() - in.left - in.right)); revalidate(); } } private JComponent comp0; private JComponent comp1; private MyDragbar dragbar; private double fraction; public VerticalSplitPane(JComponent comp0, JComponent comp1) { this(comp0, comp1, 0.5); } public VerticalSplitPane(JComponent comp0, JComponent comp1, double fraction) { this.comp0 = comp0; this.comp1 = comp1; this.dragbar = new MyDragbar(); // above the other components this.fraction = fraction; setLayout(new MyLayout()); add(dragbar); // above the other components add(comp0); add(comp1); } public double getFraction() { return fraction; } public void setFraction(double value) { if (value < 0.0) value = 0.0; if (value > 1.0) value = 1.0; if (fraction != value) { fraction = value; revalidate(); } } } logisim-2.7.1/src/com/cburch/logisim/util/UnmodifiableList.java0000644000175000017500000000127311446034570024421 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.util; import java.util.AbstractList; import java.util.Collections; import java.util.List; public class UnmodifiableList extends AbstractList { public static List create(E[] data) { if (data.length == 0) { return Collections.emptyList(); } else { return new UnmodifiableList(data); } } private E[] data; public UnmodifiableList(E[] data) { this.data = data; } @Override public E get(int index) { return data[index]; } @Override public int size() { return data.length; } } logisim-2.7.1/src/com/cburch/logisim/util/TableSorter.java0000644000175000017500000003713611450405530023415 0ustar vincentvincent// retrieved from http://ouroborus.org/java/2.1/TableSorter.java package com.cburch.logisim.util; import java.awt.*; import java.awt.event.*; import java.util.*; import java.util.List; import javax.swing.*; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.*; import java.lang.reflect.Method; import java.lang.reflect.InvocationTargetException; /** * TableSorter is a decorator for TableModels; adding sorting * functionality to a supplied TableModel. TableSorter does * not store or copy the data in its TableModel; instead it maintains * a map from the row indexes of the view to the row indexes of the * model. As requests are made of the sorter (like getValueAt(row, col)) * they are passed to the underlying model after the row numbers * have been translated via the internal mapping array. This way, * the TableSorter appears to hold another copy of the table * with the rows in a different order. *

* TableSorter registers itself as a listener to the underlying model, * just as the JTable itself would. Events recieved from the model * are examined, sometimes manipulated (typically widened), and then * passed on to the TableSorter's listeners (typically the JTable). * If a change to the model has invalidated the order of TableSorter's * rows, a note of this is made and the sorter will resort the * rows the next time a value is requested. *

* When the tableHeader property is set, either by using the * setTableHeader() method or the two argument constructor, the * table header may be used as a complete UI for TableSorter. * The default renderer of the tableHeader is decorated with a renderer * that indicates the sorting status of each column. In addition, * a mouse listener is installed with the following behavior: *

    *
  • * Mouse-click: Clears the sorting status of all other columns * and advances the sorting status of that column through three * values: {NOT_SORTED, ASCENDING, DESCENDING} (then back to * NOT_SORTED again). *
  • * SHIFT-mouse-click: Clears the sorting status of all other columns * and cycles the sorting status of the column through the same * three values, in the opposite order: {NOT_SORTED, DESCENDING, ASCENDING}. *
  • * CONTROL-mouse-click and CONTROL-SHIFT-mouse-click: as above except * that the changes to the column do not cancel the statuses of columns * that are already sorting - giving a way to initiate a compound * sort. *
*

* This class first appeared in the swing table demos in 1997 (v1.5) and then * had a major rewrite in 2004 (v2.0) to make it compatible with Java 1.4. *

* This rewrite makes the class compile cleanly with Java 1.5 while * maintaining backward compatibility with TableSorter v2.0. * * @author Philip Milne * @author Brendon McLean * @author Dan van Enckevort * @author Parwinder Sekhon * @author ouroborus@ouroborus.org * @version 2.1 04/29/06 */ public class TableSorter extends AbstractTableModel { protected TableModel tableModel; public static final int DESCENDING = -1; public static final int NOT_SORTED = 0; public static final int ASCENDING = 1; private static Directive EMPTY_DIRECTIVE = new Directive(-1, NOT_SORTED); public static final Comparator COMPARABLE_COMPARATOR = new Comparator() { public int compare(Object o1, Object o2) { Method m; try { // See if o1 is capable of comparing itself to o2 m = o1.getClass().getDeclaredMethod("compareTo",o2.getClass()); } catch (NoSuchMethodException e) { throw new ClassCastException(); } Object retVal; try { // make the comparison retVal = m.invoke(o1,o2); } catch (IllegalAccessException e) { throw new ClassCastException(); } catch (InvocationTargetException e) { throw new ClassCastException(); } // Comparable.compareTo() is supposed to return int but invoke() // returns Object. We can't cast an Object to an int but we can // cast it to an Integer and then extract the int from the Integer. // But first, make sure it can be done. Integer i = new Integer(0); if (!i.getClass().isInstance(retVal)) { throw new ClassCastException(); } return i.getClass().cast(retVal).intValue(); } }; public static final Comparator LEXICAL_COMPARATOR = new Comparator() { public int compare(Object o1, Object o2) { return o1.toString().compareTo(o2.toString()); } }; private Row[] viewToModel; private int[] modelToView; private JTableHeader tableHeader; private MouseListener mouseListener; private TableModelListener tableModelListener; private Map,Comparator> columnComparators = new HashMap,Comparator>(); private List sortingColumns = new ArrayList(); public TableSorter() { this.mouseListener = new MouseHandler(); this.tableModelListener = new TableModelHandler(); } public TableSorter(TableModel tableModel) { this(); setTableModel(tableModel); } public TableSorter(TableModel tableModel, JTableHeader tableHeader) { this(); setTableHeader(tableHeader); setTableModel(tableModel); } private void clearSortingState() { viewToModel = null; modelToView = null; } public TableModel getTableModel() { return tableModel; } public void setTableModel(TableModel tableModel) { if (this.tableModel != null) { this.tableModel.removeTableModelListener(tableModelListener); } this.tableModel = tableModel; if (this.tableModel != null) { this.tableModel.addTableModelListener(tableModelListener); } clearSortingState(); fireTableStructureChanged(); } public JTableHeader getTableHeader() { return tableHeader; } public void setTableHeader(JTableHeader tableHeader) { if (this.tableHeader != null) { this.tableHeader.removeMouseListener(mouseListener); TableCellRenderer defaultRenderer = this.tableHeader.getDefaultRenderer(); if (defaultRenderer instanceof SortableHeaderRenderer) { this.tableHeader.setDefaultRenderer(((SortableHeaderRenderer) defaultRenderer).tableCellRenderer); } } this.tableHeader = tableHeader; if (this.tableHeader != null) { this.tableHeader.addMouseListener(mouseListener); this.tableHeader.setDefaultRenderer( new SortableHeaderRenderer(this.tableHeader.getDefaultRenderer())); } } public boolean isSorting() { return sortingColumns.size() != 0; } private Directive getDirective(int column) { for (int i = 0; i < sortingColumns.size(); i++) { Directive directive = sortingColumns.get(i); if (directive.column == column) { return directive; } } return EMPTY_DIRECTIVE; } public int getSortingStatus(int column) { return getDirective(column).direction; } private void sortingStatusChanged() { clearSortingState(); fireTableDataChanged(); if (tableHeader != null) { tableHeader.repaint(); } } public void setSortingStatus(int column, int status) { Directive directive = getDirective(column); if (directive != EMPTY_DIRECTIVE) { sortingColumns.remove(directive); } if (status != NOT_SORTED) { sortingColumns.add(new Directive(column, status)); } sortingStatusChanged(); } protected Icon getHeaderRendererIcon(int column, int size) { Directive directive = getDirective(column); if (directive == EMPTY_DIRECTIVE) { return null; } return new Arrow(directive.direction == DESCENDING, size, sortingColumns.indexOf(directive)); } private void cancelSorting() { sortingColumns.clear(); sortingStatusChanged(); } public void setColumnComparator(Class type, Comparator comparator) { if (comparator == null) { columnComparators.remove(type); } else { @SuppressWarnings("unchecked") Comparator castComparator = (Comparator) comparator; columnComparators.put(type, castComparator); } } protected Comparator getComparator(int column) { Class columnType = tableModel.getColumnClass(column); Comparator comparator = columnComparators.get(columnType); if (comparator != null) { return comparator; } if (Comparable.class.isAssignableFrom(columnType)) { return COMPARABLE_COMPARATOR; } return LEXICAL_COMPARATOR; } private Row[] getViewToModel() { if (viewToModel == null) { int tableModelRowCount = tableModel.getRowCount(); viewToModel = new Row[tableModelRowCount]; for (int row = 0; row < tableModelRowCount; row++) { viewToModel[row] = new Row(row); } if (isSorting()) { Arrays.sort(viewToModel); } } return viewToModel; } public int modelIndex(int viewIndex) { return getViewToModel()[viewIndex].modelIndex; } private int[] getModelToView() { if (modelToView == null) { int n = getViewToModel().length; modelToView = new int[n]; for (int i = 0; i < n; i++) { modelToView[modelIndex(i)] = i; } } return modelToView; } // TableModel interface methods public int getRowCount() { return (tableModel == null) ? 0 : tableModel.getRowCount(); } public int getColumnCount() { return (tableModel == null) ? 0 : tableModel.getColumnCount(); } public String getColumnName(int column) { return tableModel.getColumnName(column); } public Class getColumnClass(int column) { return tableModel.getColumnClass(column); } public boolean isCellEditable(int row, int column) { return tableModel.isCellEditable(modelIndex(row), column); } public Object getValueAt(int row, int column) { return tableModel.getValueAt(modelIndex(row), column); } public void setValueAt(Object aValue, int row, int column) { tableModel.setValueAt(aValue, modelIndex(row), column); } // Helper classes private class Row implements Comparable { private int modelIndex; public Row(int index) { this.modelIndex = index; } public int compareTo(Row o) { int row1 = modelIndex; int row2 = o.modelIndex; for (Iterator it = sortingColumns.iterator(); it.hasNext();) { Directive directive = it.next(); int column = directive.column; Object o1 = tableModel.getValueAt(row1, column); Object o2 = tableModel.getValueAt(row2, column); int comparison = 0; // Define null less than everything, except null. if (o1 == null && o2 == null) { comparison = 0; } else if (o1 == null) { comparison = -1; } else if (o2 == null) { comparison = 1; } else { comparison = getComparator(column).compare(o1, o2); } if (comparison != 0) { return directive.direction == DESCENDING ? -comparison : comparison; } } return 0; } } private class TableModelHandler implements TableModelListener { public void tableChanged(TableModelEvent e) { // If we're not sorting by anything, just pass the event along. if (!isSorting()) { clearSortingState(); fireTableChanged(e); return; } // If the table structure has changed, cancel the sorting; the // sorting columns may have been either moved or deleted from // the model. if (e.getFirstRow() == TableModelEvent.HEADER_ROW) { cancelSorting(); fireTableChanged(e); return; } // We can map a cell event through to the view without widening // when the following conditions apply: // // a) all the changes are on one row (e.getFirstRow() == e.getLastRow()) and, // b) all the changes are in one column (column != TableModelEvent.ALL_COLUMNS) and, // c) we are not sorting on that column (getSortingStatus(column) == NOT_SORTED) and, // d) a reverse lookup will not trigger a sort (modelToView != null) // // Note: INSERT and DELETE events fail this test as they have column == ALL_COLUMNS. // // The last check, for (modelToView != null) is to see if modelToView // is already allocated. If we don't do this check; sorting can become // a performance bottleneck for applications where cells // change rapidly in different parts of the table. If cells // change alternately in the sorting column and then outside of // it this class can end up re-sorting on alternate cell updates - // which can be a performance problem for large tables. The last // clause avoids this problem. int column = e.getColumn(); if (e.getFirstRow() == e.getLastRow() && column != TableModelEvent.ALL_COLUMNS && getSortingStatus(column) == NOT_SORTED && modelToView != null) { int viewIndex = getModelToView()[e.getFirstRow()]; fireTableChanged(new TableModelEvent(TableSorter.this, viewIndex, viewIndex, column, e.getType())); return; } // Something has happened to the data that may have invalidated the row order. clearSortingState(); fireTableDataChanged(); return; } } private class MouseHandler extends MouseAdapter { public void mouseClicked(MouseEvent e) { JTableHeader h = (JTableHeader) e.getSource(); TableColumnModel columnModel = h.getColumnModel(); int viewColumn = columnModel.getColumnIndexAtX(e.getX()); int column = columnModel.getColumn(viewColumn).getModelIndex(); if (column != -1) { int status = getSortingStatus(column); if (!e.isControlDown()) { cancelSorting(); } // Cycle the sorting states through {NOT_SORTED, ASCENDING, DESCENDING} or // {NOT_SORTED, DESCENDING, ASCENDING} depending on whether shift is pressed. status = status + (e.isShiftDown() ? -1 : 1); status = (status + 4) % 3 - 1; // signed mod, returning {-1, 0, 1} setSortingStatus(column, status); } } } private static class Arrow implements Icon { private boolean descending; private int size; private int priority; public Arrow(boolean descending, int size, int priority) { this.descending = descending; this.size = size; this.priority = priority; } public void paintIcon(Component c, Graphics g, int x, int y) { Color color = c == null ? Color.GRAY : c.getBackground(); // In a compound sort, make each succesive triangle 20% // smaller than the previous one. int dx = (int)(size/2*Math.pow(0.8, priority)); int dy = descending ? dx : -dx; // Align icon (roughly) with font baseline. y = y + 5*size/6 + (descending ? -dy : 0); int shift = descending ? 1 : -1; g.translate(x, y); // Right diagonal. g.setColor(color.darker()); g.drawLine(dx / 2, dy, 0, 0); g.drawLine(dx / 2, dy + shift, 0, shift); // Left diagonal. g.setColor(color.brighter()); g.drawLine(dx / 2, dy, dx, 0); g.drawLine(dx / 2, dy + shift, dx, shift); // Horizontal line. if (descending) { g.setColor(color.darker().darker()); } else { g.setColor(color.brighter().brighter()); } g.drawLine(dx, 0, 0, 0); g.setColor(color); g.translate(-x, -y); } public int getIconWidth() { return size; } public int getIconHeight() { return size; } } private class SortableHeaderRenderer implements TableCellRenderer { private TableCellRenderer tableCellRenderer; public SortableHeaderRenderer(TableCellRenderer tableCellRenderer) { this.tableCellRenderer = tableCellRenderer; } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Component c = tableCellRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); if (c instanceof JLabel) { JLabel l = (JLabel) c; l.setHorizontalTextPosition(JLabel.LEFT); int modelColumn = table.convertColumnIndexToModel(column); l.setIcon(getHeaderRendererIcon(modelColumn, l.getFont().getSize())); } return c; } } private static class Directive { private int column; private int direction; public Directive(int column, int direction) { this.column = column; this.direction = direction; } } }logisim-2.7.1/src/com/cburch/logisim/util/TableLayout.java0000644000175000017500000001063711446034570023420 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.util; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.LayoutManager2; import java.util.ArrayList; public class TableLayout implements LayoutManager2 { private int colCount; private ArrayList contents; private int curRow; private int curCol; private Dimension prefs; private int[] prefRow; private int[] prefCol; private double[] rowWeight; public TableLayout(int colCount) { this.colCount = colCount; this.contents = new ArrayList(); this.curRow = 0; this.curCol = 0; } public void setRowWeight(int rowIndex, double weight) { if (weight < 0) { throw new IllegalArgumentException("weight must be nonnegative"); } if (rowIndex < 0) { throw new IllegalArgumentException("row index must be nonnegative"); } if ((rowWeight == null || rowIndex >= rowWeight.length) && weight != 0.0) { double[] a = new double[rowIndex + 10]; if (rowWeight != null) System.arraycopy(rowWeight, 0, a, 0, rowWeight.length); rowWeight = a; } rowWeight[rowIndex] = weight; } public void addLayoutComponent(String name, Component comp) { while (curRow >= contents.size()) { contents.add(new Component[colCount]); } Component[] rowContents = contents.get(curRow); rowContents[curCol] = comp; ++curCol; if (curCol == colCount) { ++curRow; curCol = 0; } prefs = null; } public void addLayoutComponent(Component comp, Object constraints) { if (constraints instanceof TableConstraints) { TableConstraints con = (TableConstraints) constraints; if (con.getRow() >= 0) curRow = con.getRow(); if (con.getCol() >= 0) curCol = con.getCol(); } addLayoutComponent("", comp); } public void removeLayoutComponent(Component comp) { for (int i = 0, n = contents.size(); i < n; i++) { Component[] row = contents.get(i); for (int j = 0; j < row.length; j++) { if (row[j] == comp) { row[j] = null; return; } } } prefs = null; } public Dimension preferredLayoutSize(Container parent) { if (prefs == null) { int[] prefCol = new int[colCount]; int[] prefRow = new int[contents.size()]; int height = 0; for (int i = 0; i < prefRow.length; i++) { Component[] row = contents.get(i); int rowHeight = 0; for (int j = 0; j < row.length; j++) { if (row[j] != null) { Dimension dim = row[j].getPreferredSize(); if (dim.height > rowHeight) rowHeight = dim.height; if (dim.width > prefCol[j]) prefCol[j] = dim.width; } } prefRow[i] = rowHeight; height += rowHeight; } int width = 0; for (int i = 0; i < prefCol.length; i++) { width += prefCol[i]; } this.prefs = new Dimension(width, height); this.prefRow = prefRow; this.prefCol = prefCol; } return new Dimension(prefs); } public Dimension minimumLayoutSize(Container parent) { return preferredLayoutSize(parent); } public Dimension maximumLayoutSize(Container parent) { return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE); } public float getLayoutAlignmentX(Container parent) { return 0.5f; } public float getLayoutAlignmentY(Container parent) { return 0.5f; } public void layoutContainer(Container parent) { Dimension pref = preferredLayoutSize(parent); int[] prefRow = this.prefRow; int[] prefCol = this.prefCol; Dimension size = parent.getSize(); double y0; int yRemaining = size.height - pref.height; double rowWeightTotal = 0.0; if (yRemaining != 0 && rowWeight != null) { for (double weight : rowWeight) { rowWeightTotal += weight; } } if (rowWeightTotal == 0.0 && yRemaining > 0) { y0 = yRemaining / 2.0; } else { y0 = 0; } int x0 = (size.width - pref.width) / 2; if (x0 < 0) x0 = 0; double y = y0; int i = -1; for (Component[] row : contents) { i++; int yRound = (int) (y + 0.5); int x = x0; for (int j = 0; j < row.length; j++) { Component comp = row[j]; if (comp != null) { row[j].setBounds(x, yRound, prefCol[j], prefRow[i]); } x += prefCol[j]; } y += prefRow[i]; if (rowWeightTotal > 0 && i < rowWeight.length) { y += yRemaining * rowWeight[i] / rowWeightTotal; } } // TODO Auto-generated method stub } public void invalidateLayout(Container parent) { prefs = null; } } logisim-2.7.1/src/com/cburch/logisim/util/TableConstraints.java0000644000175000017500000000077611446034570024455 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.util; public class TableConstraints { public static TableConstraints at(int row, int col) { return new TableConstraints(row, col); } private int col; private int row; private TableConstraints(int row, int col) { this.col = col; this.row = row; } int getRow() { return row; } int getCol() { return col; } } logisim-2.7.1/src/com/cburch/logisim/util/StringUtil.java0000644000175000017500000000463311446034570023276 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.util; public class StringUtil { private StringUtil() { } public static String capitalize(String a) { return Character.toTitleCase(a.charAt(0)) + a.substring(1); } public static String format(String fmt, String a1) { return format(fmt, a1, null, null); } public static String format(String fmt, String a1, String a2) { return format(fmt, a1, a2, null); } public static String format(String fmt, String a1, String a2, String a3) { StringBuilder ret = new StringBuilder(); if (a1 == null) a1 = "(null)"; if (a2 == null) a2 = "(null)"; if (a3 == null) a3 = "(null)"; int arg = 0; int pos = 0; int next = fmt.indexOf('%'); while (next >= 0) { ret.append(fmt.substring(pos, next)); char c = fmt.charAt(next + 1); if (c == 's') { pos = next + 2; switch (arg) { case 0: ret.append(a1); break; case 1: ret.append(a2); break; default: ret.append(a3); } ++arg; } else if (c == '$') { switch (fmt.charAt(next + 2)) { case '1': ret.append(a1); pos = next + 3; break; case '2': ret.append(a2); pos = next + 3; break; case '3': ret.append(a3); pos = next + 3; break; default: ret.append("%$"); pos = next + 2; } } else if (c == '%') { ret.append('%'); pos = next + 2; } else { ret.append('%'); pos = next + 1; } next = fmt.indexOf('%', pos); } ret.append(fmt.substring(pos)); return ret.toString(); } public static StringGetter formatter(final StringGetter base, final String arg) { return new StringGetter() { public String get() { return format(base.get(), arg); } }; } public static StringGetter formatter(final StringGetter base, final StringGetter arg) { return new StringGetter() { public String get() { return format(base.get(), arg.get()); } }; } public static StringGetter constantGetter(final String value) { return new StringGetter() { public String get() { return value; } }; } public static String toHexString(int bits, int value) { if (bits < 32) value &= (1 << bits) - 1; String ret = Integer.toHexString(value); int len = (bits + 3) / 4; while (ret.length() < len) ret = "0" + ret; if (ret.length() > len) ret = ret.substring(ret.length() - len); return ret; } } logisim-2.7.1/src/com/cburch/logisim/util/Strings.java0000644000175000017500000000112211451540110022575 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.util; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.StringGetter; class Strings { static LocaleManager source = new LocaleManager("resources/logisim", "util"); public static LocaleManager getLocaleManager() { return source; } public static String get(String key) { return source.get(key); } public static StringGetter getter(String key) { return source.getter(key); } } logisim-2.7.1/src/com/cburch/logisim/util/StringGetter.java0000644000175000017500000000035611446034570023611 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.util; public interface StringGetter { public String get(); } logisim-2.7.1/src/com/cburch/logisim/util/SmallSet.java0000644000175000017500000001424711541661306022717 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.util; import java.util.AbstractSet; import java.util.ConcurrentModificationException; import java.util.HashSet; import java.util.Iterator; import java.util.NoSuchElementException; public class SmallSet extends AbstractSet { private static final int HASH_POINT = 4; private class ArrayIterator implements Iterator { int itVersion = version; Object myValues; int pos = 0; // position of next item to return boolean hasNext = true; boolean removeOk = false; private ArrayIterator() { myValues = values; } public boolean hasNext() { return hasNext; } public E next() { if (itVersion != version) { throw new ConcurrentModificationException(); } else if (!hasNext) { throw new NoSuchElementException(); } else if (size == 1) { pos = 1; hasNext = false; removeOk = true; @SuppressWarnings("unchecked") E ret = (E) myValues; return ret; } else { @SuppressWarnings("unchecked") E ret = ((E[]) myValues)[pos]; ++pos; hasNext = pos < size; removeOk = true; return ret; } } public void remove() { if (itVersion != version) { throw new ConcurrentModificationException(); } else if (!removeOk) { throw new IllegalStateException(); } else if (size == 1) { values = null; size = 0; ++version; itVersion = version; removeOk = false; } else { Object[] vals = (Object[]) values; if (size == 2) { myValues = (pos == 2 ? vals[0] : vals[1]); values = myValues; size = 1; } else { for (int i = pos; i < size; i++) { vals[i - 1] = vals[i]; } --pos; --size; vals[size] = null; } ++version; itVersion = version; removeOk = false; } } } private int size = 0; private int version = 0; private Object values = null; public SmallSet() { } @Override public SmallSet clone() { SmallSet ret = new SmallSet(); ret.size = this.size; if (size == 1) { ret.values = this.values; } else if (size <= HASH_POINT) { Object[] oldVals = (Object[]) this.values; Object[] retVals = new Object[size]; for (int i = size - 1; i >= 0; i--) retVals[i] = oldVals[i]; } else { @SuppressWarnings("unchecked") HashSet oldVals = (HashSet) this.values; values = oldVals.clone(); } return ret; } @Override public Object[] toArray() { Object vals = values; int sz = size; if (sz == 1) { return new Object[] { vals }; } else if (sz <= HASH_POINT) { Object[] ret = new Object[sz]; System.arraycopy(vals, 0, ret, 0, sz); return ret; } else { HashSet hash = (HashSet) vals; return hash.toArray(); } } @Override public void clear() { size = 0; values = null; ++version; } @Override public boolean isEmpty() { if (size <= HASH_POINT) { return size == 0; } else { return ((HashSet) values).isEmpty(); } } @Override public int size() { if (size <= HASH_POINT) { return size; } else { return ((HashSet) values).size(); } } @Override public boolean add(E value) { int oldSize = size; Object oldValues = values; int newVersion = version + 1; if (oldSize < 2) { if (oldSize == 0) { values = value; size = 1; version = newVersion; return true; } else { Object curValue = oldValues; if (curValue.equals(value)) { return false; } else { Object[] newValues = new Object[HASH_POINT]; newValues[0] = values; newValues[1] = value; values = newValues; size = 2; version = newVersion; return true; } } } else if (oldSize <= HASH_POINT) { @SuppressWarnings("unchecked") E[] vals = (E[]) oldValues; for (int i = 0; i < oldSize; i++) { Object val = vals[i]; boolean same = val == null ? value == null : val.equals(value); if (same) return false; } if (oldSize < HASH_POINT) { vals[oldSize] = value; size = oldSize + 1; version = newVersion; return true; } else { HashSet newValues = new HashSet(); for (int i = 0; i < oldSize; i++) newValues.add(vals[i]); newValues.add(value); values = newValues; size = oldSize + 1; version = newVersion; return true; } } else { @SuppressWarnings("unchecked") HashSet vals = (HashSet) oldValues; if (vals.add(value)) { version = newVersion; return true; } else { return false; } } } @Override public boolean contains(Object value) { if (size <= 2) { if (size == 0) { return false; } else { return values.equals(value); } } else if (size <= HASH_POINT) { Object[] vals = (Object[]) values; for (int i = 0; i < size; i++) { if (vals[i].equals(value)) return true; } return false; } else { @SuppressWarnings("unchecked") HashSet vals = (HashSet) values; return vals.contains(value); } } @Override public Iterator iterator() { if (size <= HASH_POINT) { if (size == 0) { return IteratorUtil.emptyIterator(); } else { return new ArrayIterator(); } } else { @SuppressWarnings("unchecked") HashSet set = (HashSet) values; return set.iterator(); } } public static void main(String[] args) throws java.io.IOException { SmallSet set = new SmallSet(); java.io.BufferedReader in = new java.io.BufferedReader( new java.io.InputStreamReader(System.in)); while (true) { System.out.print(set.size() + ":"); //OK for (Iterator it = set.iterator(); it.hasNext(); ) { System.out.print(" " + it.next()); //OK } System.out.println(); //OK System.out.print("> "); //OK String cmd = in.readLine(); if (cmd == null) break; cmd = cmd.trim(); if (cmd.equals("")) { ; } else if (cmd.startsWith("+")) { set.add(cmd.substring(1)); } else if (cmd.startsWith("-")) { set.remove(cmd.substring(1)); } else if (cmd.startsWith("?")) { boolean ret = set.contains(cmd.substring(1)); System.out.println(" " + ret); //OK } else { System.out.println("unrecognized command"); //OK } } } } logisim-2.7.1/src/com/cburch/logisim/util/PropertyChangeWeakSupport.java0000644000175000017500000000665511455255504026341 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.util; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.lang.ref.WeakReference; import java.util.Iterator; import java.util.concurrent.ConcurrentLinkedQueue; public class PropertyChangeWeakSupport { private static final String ALL_PROPERTIES = "ALL PROPERTIES"; private static class ListenerData { String property; WeakReference listener; ListenerData(String property, PropertyChangeListener listener) { this.property = property; this.listener = new WeakReference(listener); } } private Object source; private ConcurrentLinkedQueue listeners; public PropertyChangeWeakSupport(Object source) { this.source = source; this.listeners = new ConcurrentLinkedQueue(); } public void addPropertyChangeListener(PropertyChangeListener listener) { addPropertyChangeListener(ALL_PROPERTIES, listener); } public void addPropertyChangeListener(String property, PropertyChangeListener listener) { listeners.add(new ListenerData(property, listener)); } public void removePropertyChangeListener(PropertyChangeListener listener) { removePropertyChangeListener(ALL_PROPERTIES, listener); } public void removePropertyChangeListener(String property, PropertyChangeListener listener) { for (Iterator it = listeners.iterator(); it.hasNext(); ) { ListenerData data = it.next(); PropertyChangeListener l = data.listener.get(); if (l == null) { it.remove(); } else if (data.property.equals(property) && l == listener) { it.remove(); } } } public void firePropertyChange(String property, Object oldValue, Object newValue) { PropertyChangeEvent e = null; for (Iterator it = listeners.iterator(); it.hasNext(); ) { ListenerData data = it.next(); PropertyChangeListener l = data.listener.get(); if (l == null) { it.remove(); } else if (data.property == ALL_PROPERTIES || data.property.equals(property)) { if (e == null) { e = new PropertyChangeEvent(source, property, oldValue, newValue); } l.propertyChange(e); } } } public void firePropertyChange(String property, int oldValue, int newValue) { PropertyChangeEvent e = null; for (Iterator it = listeners.iterator(); it.hasNext(); ) { ListenerData data = it.next(); PropertyChangeListener l = data.listener.get(); if (l == null) { it.remove(); } else if (data.property == ALL_PROPERTIES || data.property.equals(property)) { if (e == null) { e = new PropertyChangeEvent(source, property, Integer.valueOf(oldValue), Integer.valueOf(newValue)); } l.propertyChange(e); } } } public void firePropertyChange(String property, boolean oldValue, boolean newValue) { PropertyChangeEvent e = null; for (Iterator it = listeners.iterator(); it.hasNext(); ) { ListenerData data = it.next(); PropertyChangeListener l = data.listener.get(); if (l == null) { it.remove(); } else if (data.property == ALL_PROPERTIES || data.property.equals(property)) { if (e == null) { e = new PropertyChangeEvent(source, property, Boolean.valueOf(oldValue), Boolean.valueOf(newValue)); } l.propertyChange(e); } } } } logisim-2.7.1/src/com/cburch/logisim/util/MacCompatibility.java0000644000175000017500000000330011446034570024412 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.util; import java.io.File; import java.io.IOException; import javax.swing.JMenuBar; import net.roydesign.mac.MRJAdapter; public class MacCompatibility { private MacCompatibility() { } public static final double mrjVersion; static { double versionValue; try { versionValue = MRJAdapter.mrjVersion; } catch (Throwable t) { versionValue = 0.0; } mrjVersion = versionValue; } public static boolean isAboutAutomaticallyPresent() { try { return MRJAdapter.isAboutAutomaticallyPresent(); } catch (Throwable t) { return false; } } public static boolean isPreferencesAutomaticallyPresent() { try { return MRJAdapter.isPreferencesAutomaticallyPresent(); } catch (Throwable t) { return false; } } public static boolean isQuitAutomaticallyPresent() { try { return MRJAdapter.isQuitAutomaticallyPresent(); } catch (Throwable t) { return false; } } public static boolean isSwingUsingScreenMenuBar() { try { return MRJAdapter.isSwingUsingScreenMenuBar(); } catch (Throwable t) { return false; } } public static void setFramelessJMenuBar(JMenuBar menubar) { try { MRJAdapter.setFramelessJMenuBar(menubar); } catch (Throwable t) { } } public static void setFileCreatorAndType(File dest, String app, String type) throws IOException { IOException ioExcept = null; try { try { MRJAdapter.setFileCreatorAndType(dest, app, type); } catch (IOException e) { ioExcept = e; } } catch (Throwable t) { } if (ioExcept != null) throw ioExcept; } } logisim-2.7.1/src/com/cburch/logisim/util/LocaleSelector.java0000644000175000017500000000426111455470130024063 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.util; import java.util.Locale; import javax.swing.DefaultListModel; import javax.swing.JList; import javax.swing.ListSelectionModel; import javax.swing.SwingUtilities; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import com.cburch.logisim.prefs.AppPreferences; class LocaleSelector extends JList implements LocaleListener, ListSelectionListener { private static class LocaleOption implements Runnable { private Locale locale; private String text; LocaleOption(Locale locale) { this.locale = locale; update(locale); } @Override public String toString() { return text; } void update(Locale current) { if (current != null && current.equals(locale)) { text = locale.getDisplayName(locale); } else { text = locale.getDisplayName(locale) + " / " + locale.getDisplayName(current); } } public void run() { if (!LocaleManager.getLocale().equals(locale)) { LocaleManager.setLocale(locale); AppPreferences.LOCALE.set(locale.getLanguage()); } } } private LocaleOption[] items; LocaleSelector(Locale[] locales) { setSelectionMode(ListSelectionModel.SINGLE_SELECTION); DefaultListModel model = new DefaultListModel(); items = new LocaleOption[locales.length]; for (int i = 0; i < locales.length; i++) { items[i] = new LocaleOption(locales[i]); model.addElement(items[i]); } setModel(model); setVisibleRowCount(Math.min(items.length, 8)); LocaleManager.addLocaleListener(this); localeChanged(); addListSelectionListener(this); } public void localeChanged() { Locale current = LocaleManager.getLocale(); LocaleOption sel = null; for (int i = 0; i < items.length; i++) { items[i].update(current); if (current.equals(items[i].locale)) sel = items[i]; } if (sel != null) { setSelectedValue(sel, true); } } public void valueChanged(ListSelectionEvent e) { LocaleOption opt = (LocaleOption) getSelectedValue(); if (opt != null) { SwingUtilities.invokeLater(opt); } } } logisim-2.7.1/src/com/cburch/logisim/util/LocaleManager.java0000644000175000017500000001641411451540110023650 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.util; import java.util.ArrayList; import java.util.HashMap; import java.util.Locale; import java.util.MissingResourceException; import java.util.ResourceBundle; import java.util.StringTokenizer; import javax.swing.JComponent; import javax.swing.JScrollPane; public class LocaleManager { // static members private static final String SETTINGS_NAME = "settings"; private static ArrayList managers = new ArrayList(); private static class LocaleGetter implements StringGetter { private LocaleManager source; private String key; LocaleGetter(LocaleManager source, String key) { this.source = source; this.key = key; } public String get() { return source.get(key); } @Override public String toString() { return get(); } } private static ArrayList listeners = new ArrayList(); private static boolean replaceAccents = false; private static HashMap repl = null; private static Locale curLocale = null; public static Locale getLocale() { Locale ret = curLocale; if (ret == null) { ret = Locale.getDefault(); curLocale = ret; } return ret; } public static void setLocale(Locale loc) { Locale cur = getLocale(); if (!loc.equals(cur)) { Locale[] opts = Strings.getLocaleManager().getLocaleOptions(); Locale select = null; Locale backup = null; String locLang = loc.getLanguage(); for (Locale opt : opts) { if (select == null && opt.equals(loc)) { select = opt; } if (backup == null && opt.getLanguage().equals(locLang)) { backup = opt; } } if (select == null) { if (backup == null) { select = new Locale("en"); } else { select = backup; } } curLocale = select; Locale.setDefault(select); for (LocaleManager man : managers) { man.loadDefault(); } repl = replaceAccents ? fetchReplaceAccents() : null; fireLocaleChanged(); } } public static boolean canReplaceAccents() { return fetchReplaceAccents() != null; } public static void setReplaceAccents(boolean value) { HashMap newRepl = value ? fetchReplaceAccents() : null; replaceAccents = value; repl = newRepl; fireLocaleChanged(); } private static HashMap fetchReplaceAccents() { HashMap ret = null; String val; try { val = Strings.source.locale.getString("accentReplacements"); } catch (MissingResourceException e) { return null; } StringTokenizer toks = new StringTokenizer(val, "/"); while (toks.hasMoreTokens()) { String tok = toks.nextToken().trim(); char c = '\0'; String s = null; if (tok.length() == 1) { c = tok.charAt(0); s = ""; } else if (tok.length() >= 2 && tok.charAt(1) == ' ') { c = tok.charAt(0); s = tok.substring(2).trim(); } if (s != null) { if (ret == null) ret = new HashMap(); ret.put(new Character(c), s); } } return ret; } public static void addLocaleListener(LocaleListener l) { listeners.add(l); } public static void removeLocaleListener(LocaleListener l) { listeners.remove(l); } private static void fireLocaleChanged() { for (LocaleListener l : listeners) { l.localeChanged(); } } // instance members private String dir_name; private String file_start; private ResourceBundle settings = null; private ResourceBundle locale = null; private ResourceBundle dflt_locale = null; public LocaleManager(String dir_name, String file_start) { this.dir_name = dir_name; this.file_start = file_start; loadDefault(); managers.add(this); } private void loadDefault() { if (settings == null) { try { settings = ResourceBundle.getBundle(dir_name + "/" + SETTINGS_NAME); } catch (java.util.MissingResourceException e) { } } try { loadLocale(Locale.getDefault()); if (locale != null) return; } catch (java.util.MissingResourceException e) { } try { loadLocale(Locale.ENGLISH); if (locale != null) return; } catch (java.util.MissingResourceException e) { } Locale[] choices = getLocaleOptions(); if (choices != null && choices.length > 0) loadLocale(choices[0]); if (locale != null) return; throw new RuntimeException("No locale bundles are available"); } private void loadLocale(Locale loc) { String bundleName = dir_name + "/" + loc.getLanguage() + "/" + file_start; locale = ResourceBundle.getBundle(bundleName, loc); } public String get(String key) { String ret; try { ret = locale.getString(key); } catch (MissingResourceException e) { ResourceBundle backup = dflt_locale; if (backup == null) { Locale backup_loc = Locale.US; backup = ResourceBundle.getBundle(dir_name + "/en/" + file_start, backup_loc); dflt_locale = backup; } try { ret = backup.getString(key); } catch (MissingResourceException e2) { ret = key; } } HashMap repl = LocaleManager.repl; if (repl != null) ret = replaceAccents(ret, repl); return ret; } public StringGetter getter(String key) { return new LocaleGetter(this, key); } public StringGetter getter(String key, String arg) { return StringUtil.formatter(getter(key), arg); } public StringGetter getter(String key, StringGetter arg) { return StringUtil.formatter(getter(key), arg); } public Locale[] getLocaleOptions() { String locs = null; try { if (settings != null) locs = settings.getString("locales"); } catch (java.util.MissingResourceException e) { } if (locs == null) return new Locale[] { }; ArrayList retl = new ArrayList(); StringTokenizer toks = new StringTokenizer(locs); while (toks.hasMoreTokens()) { String f = toks.nextToken(); String language; String country; if (f.length() >= 2) { language = f.substring(0, 2); country = (f.length() >= 5 ? f.substring(3, 5) : null); } else { language = null; country = null; } if (language != null) { Locale loc = country == null ? new Locale(language) : new Locale(language, country); retl.add(loc); } } return retl.toArray(new Locale[retl.size()]); } public JComponent createLocaleSelector() { Locale[] locales = getLocaleOptions(); if (locales == null || locales.length == 0) { Locale cur = getLocale(); if (cur == null) cur = new Locale("en"); locales = new Locale[] { cur }; } return new JScrollPane(new LocaleSelector(locales)); } private static String replaceAccents(String src, HashMap repl) { // find first non-standard character - so we can avoid the // replacement process if possible int i = 0; int n = src.length(); for (; i < n; i++) { char ci = src.charAt(i); if (ci < 32 || ci >= 127) break; } if (i == n) return src; // ok, we'll have to consider replacing accents char[] cs = src.toCharArray(); StringBuilder ret = new StringBuilder(src.substring(0, i)); for (int j = i; j < cs.length; j++) { char cj = cs[j]; if (cj < 32 || cj >= 127) { String out = repl.get(Character.valueOf(cj)); if (out != null) { ret.append(out); } else { ret.append(cj); } } else { ret.append(cj); } } return ret.toString(); } } logisim-2.7.1/src/com/cburch/logisim/util/LocaleListener.java0000644000175000017500000000037011446034570024071 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.util; public interface LocaleListener { public void localeChanged(); } logisim-2.7.1/src/com/cburch/logisim/util/ListUtil.java0000644000175000017500000000175411446034570022744 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.util; import java.util.AbstractList; import java.util.Iterator; import java.util.List; public class ListUtil { private static class JoinedList extends AbstractList { List a; List b; JoinedList(List a, List b) { this.a = a; this.b = b; } @Override public int size() { return a.size() + b.size(); } @Override public E get(int index) { if (index < a.size()) return a.get(index); else return b.get(index - a.size()); } @Override public Iterator iterator() { return IteratorUtil.createJoinedIterator(a.iterator(), b.iterator()); } } private ListUtil() { } public static List joinImmutableLists(List a, List b) { return new JoinedList(a, b); } } logisim-2.7.1/src/com/cburch/logisim/util/JTreeUtil.java0000644000175000017500000002525311447117150023037 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.util; import java.awt.AlphaComposite; import java.awt.Graphics2D; import java.awt.Insets; import java.awt.Point; import java.awt.Rectangle; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.dnd.DnDConstants; import java.awt.dnd.DragGestureEvent; import java.awt.dnd.DragGestureListener; import java.awt.dnd.DragSource; import java.awt.dnd.DragSourceDragEvent; import java.awt.dnd.DragSourceDropEvent; import java.awt.dnd.DragSourceEvent; import java.awt.dnd.DragSourceListener; import java.awt.dnd.DropTargetDragEvent; import java.awt.dnd.DropTargetDropEvent; import java.awt.dnd.DropTargetEvent; import java.awt.dnd.DropTargetListener; import java.awt.image.BufferedImage; import java.util.Arrays; import javax.swing.JComponent; import javax.swing.JTree; import javax.swing.tree.TreePath; /* This comes from "Denis" at http://forum.java.sun.com/thread.jspa?forumID=57&threadID=296255 */ /* * My program use 4 classes. The application displays two trees. * You can drag (move by default or copy with ctrl pressed) a node from the left tree to the right one, from the right to the left and inside the same tree. * The rules for moving are : * - you can't move the root * - you can't move the selected node to its subtree (in the same tree). * - you can't move the selected node to itself (in the same tree). * - you can't move the selected node to its parent (in the same tree). * - you can move a node to anywhere you want according to the 4 previous rules. * The rules for copying are : * - you can copy a node to anywhere you want. * * In the implementation I used DnD version of Java 1.3 because in 1.4 the DnD is too restrictive : * you can't do what you want (displaying the image of the node while dragging, changing the cursor * according to where you are dragging, etc...). In 1.4, the DnD is based on the 1.3 version but * it is too encapsulated. */ public class JTreeUtil { private static final Insets DEFAULT_INSETS = new Insets(20, 20, 20, 20); private static final DataFlavor NODE_FLAVOR = new DataFlavor( DataFlavor.javaJVMLocalObjectMimeType, "Node"); private static Object draggedNode; private static BufferedImage image = null; // buff image private static class TransferableNode implements Transferable { private Object node; private DataFlavor[] flavors = { NODE_FLAVOR }; public TransferableNode(Object nd) { node = nd; } public synchronized Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException { if (flavor == NODE_FLAVOR) { return node; } else { throw new UnsupportedFlavorException(flavor); } } public DataFlavor[] getTransferDataFlavors() { return flavors; } public boolean isDataFlavorSupported(DataFlavor flavor) { return Arrays.asList(flavors).contains(flavor); } } /* * This class is the most important. It manages all the DnD behavior. It is * abstract because it contains two abstract methods: * public abstract boolean canPerformAction(JTree target, * Object draggedNode, int action, Point location); * public abstract boolean executeDrop(DNDTree tree, * Object draggedNode, Object newParentNode, int action); * we have to override to give the required behavior of DnD in your tree. */ private static class TreeTransferHandler implements DragGestureListener, DragSourceListener, DropTargetListener { private JTree tree; private JTreeDragController controller; private DragSource dragSource; // dragsource private Rectangle rect2D = new Rectangle(); private boolean drawImage; protected TreeTransferHandler(JTree tree, JTreeDragController controller, int action, boolean drawIcon) { this.tree = tree; this.controller = controller; drawImage = drawIcon; dragSource = new DragSource(); dragSource.createDefaultDragGestureRecognizer(tree, action, this); } /* Methods for DragSourceListener */ public void dragDropEnd(DragSourceDropEvent dsde) { /* if (dsde.getDropSuccess() && dsde.getDropAction() == DnDConstants.ACTION_MOVE && draggedNodeParent != null) { ((DefaultTreeModel) tree.getModel()) .nodeStructureChanged(draggedNodeParent); } */ } public final void dragEnter(DragSourceDragEvent dsde) { int action = dsde.getDropAction(); if (action == DnDConstants.ACTION_COPY) { dsde.getDragSourceContext().setCursor( DragSource.DefaultCopyDrop); } else { if (action == DnDConstants.ACTION_MOVE) { dsde.getDragSourceContext().setCursor( DragSource.DefaultMoveDrop); } else { dsde.getDragSourceContext().setCursor( DragSource.DefaultMoveNoDrop); } } } public final void dragOver(DragSourceDragEvent dsde) { int action = dsde.getDropAction(); if (action == DnDConstants.ACTION_COPY) { dsde.getDragSourceContext().setCursor( DragSource.DefaultCopyDrop); } else { if (action == DnDConstants.ACTION_MOVE) { dsde.getDragSourceContext().setCursor( DragSource.DefaultMoveDrop); } else { dsde.getDragSourceContext().setCursor( DragSource.DefaultMoveNoDrop); } } } public final void dropActionChanged(DragSourceDragEvent dsde) { int action = dsde.getDropAction(); if (action == DnDConstants.ACTION_COPY) { dsde.getDragSourceContext().setCursor( DragSource.DefaultCopyDrop); } else { if (action == DnDConstants.ACTION_MOVE) { dsde.getDragSourceContext().setCursor( DragSource.DefaultMoveDrop); } else { dsde.getDragSourceContext().setCursor( DragSource.DefaultMoveNoDrop); } } } public final void dragExit(DragSourceEvent dse) { dse.getDragSourceContext().setCursor(DragSource.DefaultMoveNoDrop); } /* Methods for DragGestureListener */ public final void dragGestureRecognized(DragGestureEvent dge) { TreePath path = tree.getSelectionPath(); if (path != null) { draggedNode = path.getLastPathComponent(); if (drawImage) { Rectangle pathBounds = tree.getPathBounds(path); // getpathbounds // of // selectionpath JComponent lbl = (JComponent) tree .getCellRenderer() .getTreeCellRendererComponent( tree, draggedNode, false, tree.isExpanded(path), tree.getModel() .isLeaf(path.getLastPathComponent()), 0, false);// returning the label lbl.setBounds(pathBounds);// setting bounds to lbl image = new BufferedImage(lbl.getWidth(), lbl.getHeight(), java.awt.image.BufferedImage.TYPE_INT_ARGB_PRE);// buffered // image // reference // passing // the // label's // ht // and // width Graphics2D graphics = image.createGraphics();// creating // the // graphics // for // buffered // image graphics.setComposite(AlphaComposite.getInstance( AlphaComposite.SRC_OVER, 0.5f)); // Sets the // Composite for // the // Graphics2D // context lbl.setOpaque(false); lbl.paint(graphics); // painting the graphics to label graphics.dispose(); } dragSource.startDrag(dge, DragSource.DefaultMoveNoDrop, image, new Point(0, 0), new TransferableNode(draggedNode), this); } } /* Methods for DropTargetListener */ public final void dragEnter(DropTargetDragEvent dtde) { Point pt = dtde.getLocation(); int action = dtde.getDropAction(); if (drawImage) { paintImage(pt); } if (controller.canPerformAction(tree, draggedNode, action, pt)) { dtde.acceptDrag(action); } else { dtde.rejectDrag(); } } public final void dragExit(DropTargetEvent dte) { if (drawImage) { clearImage(); } } public final void dragOver(DropTargetDragEvent dtde) { Point pt = dtde.getLocation(); int action = dtde.getDropAction(); autoscroll(tree, pt); if (drawImage) { paintImage(pt); } if (controller.canPerformAction(tree, draggedNode, action, pt)) { dtde.acceptDrag(action); } else { dtde.rejectDrag(); } } public final void dropActionChanged(DropTargetDragEvent dtde) { Point pt = dtde.getLocation(); int action = dtde.getDropAction(); if (drawImage) { paintImage(pt); } if (controller.canPerformAction(tree, draggedNode, action, pt)) { dtde.acceptDrag(action); } else { dtde.rejectDrag(); } } public final void drop(DropTargetDropEvent dtde) { try { if (drawImage) { clearImage(); } int action = dtde.getDropAction(); Transferable transferable = dtde.getTransferable(); Point pt = dtde.getLocation(); if (transferable .isDataFlavorSupported(NODE_FLAVOR) && controller.canPerformAction(tree, draggedNode, action, pt)) { TreePath pathTarget = tree.getPathForLocation(pt.x, pt.y); Object node = transferable.getTransferData(NODE_FLAVOR); Object newParentNode = pathTarget.getLastPathComponent(); if (controller.executeDrop(tree, node, newParentNode, action)) { dtde.acceptDrop(action); dtde.dropComplete(true); return; } } dtde.rejectDrop(); dtde.dropComplete(false); } catch (Exception e) { dtde.rejectDrop(); dtde.dropComplete(false); } } private final void paintImage(Point pt) { tree.paintImmediately(rect2D.getBounds()); rect2D.setRect((int) pt.getX(), (int) pt.getY(), image.getWidth(), image.getHeight()); tree.getGraphics().drawImage(image, (int) pt.getX(), (int) pt.getY(), tree); } private final void clearImage() { tree.paintImmediately(rect2D.getBounds()); } } public static void configureDragAndDrop(JTree tree, JTreeDragController controller) { tree.setAutoscrolls(true); new TreeTransferHandler(tree, controller, DnDConstants.ACTION_COPY_OR_MOVE, true); } private static void autoscroll(JTree tree, Point cursorLocation) { Insets insets = DEFAULT_INSETS; Rectangle outer = tree.getVisibleRect(); Rectangle inner = new Rectangle(outer.x + insets.left, outer.y + insets.top, outer.width - (insets.left + insets.right), outer.height - (insets.top + insets.bottom)); if (!inner.contains(cursorLocation)) { Rectangle scrollRect = new Rectangle(cursorLocation.x - insets.left, cursorLocation.y - insets.top, insets.left + insets.right, insets.top + insets.bottom); tree.scrollRectToVisible(scrollRect); } } } logisim-2.7.1/src/com/cburch/logisim/util/JTreeDragController.java0000644000175000017500000000304411446034570025040 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.util; import java.awt.Point; import javax.swing.JTree; /* This comes from "Denis" at http://forum.java.sun.com/thread.jspa?forumID=57&threadID=296255 */ /* * My program use 4 classes. The application displays two trees. * You can drag (move by default or copy with ctrl pressed) a node from the left tree to the right one, from the right to the left and inside the same tree. * The rules for moving are : * - you can't move the root * - you can't move the selected node to its subtree (in the same tree). * - you can't move the selected node to itself (in the same tree). * - you can't move the selected node to its parent (in the same tree). * - you can move a node to anywhere you want according to the 4 previous rules. * The rules for copying are : * - you can copy a node to anywhere you want. * * In the implementation I used DnD version of Java 1.3 because in 1.4 the DnD is too restrictive : * you can't do what you want (displaying the image of the node while dragging, changing the cursor * according to where you are dragging, etc...). In 1.4, the DnD is based on the 1.3 version but * it is too encapsulated. */ public interface JTreeDragController { public boolean canPerformAction(JTree target, Object draggedNode, int action, Point location); public boolean executeDrop(JTree tree, Object draggedNode, Object newParentNode, int action); } logisim-2.7.1/src/com/cburch/logisim/util/JInputComponent.java0000644000175000017500000000043311446034570024260 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.util; public interface JInputComponent { public Object getValue(); public void setValue(Object value); } logisim-2.7.1/src/com/cburch/logisim/util/JFileChoosers.java0000644000175000017500000000520411535206220023654 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.util; import java.io.File; import java.io.IOException; import javax.swing.JFileChooser; import com.cburch.logisim.prefs.AppPreferences; public class JFileChoosers { /* A user reported that JFileChooser's constructor sometimes resulted in * IOExceptions when Logisim is installed under a system administrator * account and then is attempted to run as a regular user. This class is * an attempt to be a bit more robust about which directory the JFileChooser * opens up under. (23 Feb 2010) */ private static class LogisimFileChooser extends JFileChooser { LogisimFileChooser() { super(); } LogisimFileChooser(File initSelected) { super(initSelected); } @Override public File getSelectedFile() { File dir = getCurrentDirectory(); if (dir != null) { JFileChoosers.currentDirectory = dir.toString(); } return super.getSelectedFile(); } } private static final String[] PROP_NAMES = { null, "user.home", "user.dir", "java.home", "java.io.tmpdir" }; private static String currentDirectory = ""; private JFileChoosers() { } public static String getCurrentDirectory() { return currentDirectory; } public static JFileChooser create() { RuntimeException first = null; for (int i = 0; i < PROP_NAMES.length; i++) { String prop = PROP_NAMES[i]; try { String dirname; if (prop == null) { dirname = currentDirectory; if (dirname.equals("")) { dirname = AppPreferences.DIALOG_DIRECTORY.get(); } } else { dirname = System.getProperty(prop); } if (dirname.equals("")) { return new LogisimFileChooser(); } else { File dir = new File(dirname); if (dir.canRead()) { return new LogisimFileChooser(dir); } } } catch (RuntimeException t) { if (first == null) first = t; Throwable u = t.getCause(); if (!(u instanceof IOException)) throw t; } } throw first; } public static JFileChooser createAt(File openDirectory) { if (openDirectory == null) { return create(); } else { try { return new LogisimFileChooser(openDirectory); } catch (RuntimeException t) { if (t.getCause() instanceof IOException) { try { return create(); } catch (RuntimeException u) {} } throw t; } } } public static JFileChooser createSelected(File selected) { if (selected == null) { return create(); } else { JFileChooser ret = createAt(selected.getParentFile()); ret.setSelectedFile(selected); return ret; } } } logisim-2.7.1/src/com/cburch/logisim/util/JDialogOk.java0000644000175000017500000000425111446034570022771 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.util; import java.awt.BorderLayout; import java.awt.Container; import java.awt.Frame; import java.awt.Dialog; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.Box; import javax.swing.BorderFactory; import javax.swing.JDialog; import javax.swing.JPanel; import javax.swing.JButton; public abstract class JDialogOk extends JDialog { private class MyListener extends WindowAdapter implements ActionListener { public void actionPerformed(ActionEvent e) { Object src = e.getSource(); if (src == ok) { okClicked(); dispose(); } else if (src == cancel) { cancelClicked(); dispose(); } } @Override public void windowClosing(WindowEvent e) { JDialogOk.this.removeWindowListener(this); cancelClicked(); dispose(); } } private JPanel contents = new JPanel(new BorderLayout()); protected JButton ok = new JButton(Strings.get("dlogOkButton")); protected JButton cancel = new JButton(Strings.get("dlogCancelButton")); public JDialogOk(Dialog parent, String title, boolean model) { super(parent, title, true); configure(); } public JDialogOk(Frame parent, String title, boolean model) { super(parent, title, true); configure(); } private void configure() { MyListener listener = new MyListener(); this.addWindowListener(listener); ok.addActionListener(listener); cancel.addActionListener(listener); Box buttons = Box.createHorizontalBox(); buttons.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); buttons.add(Box.createHorizontalGlue()); buttons.add(ok); buttons.add(Box.createHorizontalStrut(10)); buttons.add(cancel); buttons.add(Box.createHorizontalGlue()); Container pane = super.getContentPane(); pane.add(contents, BorderLayout.CENTER); pane.add(buttons, BorderLayout.SOUTH); } @Override public Container getContentPane() { return contents; } public abstract void okClicked(); public void cancelClicked() { } } logisim-2.7.1/src/com/cburch/logisim/util/IteratorUtil.java0000644000175000017500000000537511446034570023625 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.util; import java.util.Iterator; import java.util.NoSuchElementException; public class IteratorUtil { public static Iterator EMPTY_ITERATOR = new EmptyIterator(); public static Iterator emptyIterator() { return new EmptyIterator(); } private static class EmptyIterator implements Iterator { private EmptyIterator() { } public E next() { throw new NoSuchElementException(); } public boolean hasNext() { return false; } public void remove() { throw new UnsupportedOperationException("EmptyIterator.remove"); } } private static class UnitIterator implements Iterator { private E data; private boolean taken = false; private UnitIterator(E data) { this.data = data; } public E next() { if (taken) throw new NoSuchElementException(); taken = true; return data; } public boolean hasNext() { return !taken; } public void remove() { throw new UnsupportedOperationException("UnitIterator.remove"); } } private static class ArrayIterator implements Iterator { private E[] data; private int i = -1; private ArrayIterator(E[] data) { this.data = data; } public E next() { if (!hasNext()) throw new NoSuchElementException(); i++; return data[i]; } public boolean hasNext() { return i + 1 < data.length; } public void remove() { throw new UnsupportedOperationException("ArrayIterator.remove"); } } private static class IteratorUnion implements Iterator { Iterator cur; Iterator next; private IteratorUnion(Iterator cur, Iterator next) { this.cur = cur; this.next = next; } public E next() { if (!cur.hasNext()) { if (next == null) throw new NoSuchElementException(); cur = next; if (!cur.hasNext()) throw new NoSuchElementException(); } return cur.next(); } public boolean hasNext() { return cur.hasNext() || (next != null && next.hasNext()); } public void remove() { cur.remove(); } } public static Iterator createUnitIterator(E data) { return new UnitIterator(data); } public static Iterator createArrayIterator(E[] data) { return new ArrayIterator(data); } public static Iterator createJoinedIterator(Iterator i0, Iterator i1) { if (!i0.hasNext()) { @SuppressWarnings("unchecked") Iterator ret = (Iterator) i1; return ret; } else if (!i1.hasNext()) { @SuppressWarnings("unchecked") Iterator ret = (Iterator) i0; return ret; } else { return new IteratorUnion(i0, i1); } } } logisim-2.7.1/src/com/cburch/logisim/util/InputEventUtil.java0000644000175000017500000001047511446034570024132 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.util; import java.awt.Event; import java.awt.event.InputEvent; import java.util.ArrayList; import java.util.StringTokenizer; import java.util.Iterator; public class InputEventUtil { public static String CTRL = "Ctrl"; public static String SHIFT = "Shift"; public static String ALT = "Alt"; public static String BUTTON1 = "Button1"; public static String BUTTON2 = "Button2"; public static String BUTTON3 = "Button3"; private InputEventUtil() { } public static int fromString(String str) { int ret = 0; StringTokenizer toks = new StringTokenizer(str); while (toks.hasMoreTokens()) { String s = toks.nextToken(); if (s.equals(CTRL)) ret |= InputEvent.CTRL_DOWN_MASK; else if (s.equals(SHIFT)) ret |= InputEvent.SHIFT_DOWN_MASK; else if (s.equals(ALT)) ret |= InputEvent.ALT_DOWN_MASK; else if (s.equals(BUTTON1)) ret |= InputEvent.BUTTON1_DOWN_MASK; else if (s.equals(BUTTON2)) ret |= InputEvent.BUTTON2_DOWN_MASK; else if (s.equals(BUTTON3)) ret |= InputEvent.BUTTON3_DOWN_MASK; else throw new NumberFormatException("InputEventUtil"); } return ret; } public static String toString(int mods) { ArrayList arr = new ArrayList(); if ((mods & InputEvent.CTRL_DOWN_MASK) != 0) arr.add(CTRL); if ((mods & InputEvent.ALT_DOWN_MASK) != 0) arr.add(ALT); if ((mods & InputEvent.SHIFT_DOWN_MASK) != 0) arr.add(SHIFT); if ((mods & InputEvent.BUTTON1_DOWN_MASK) != 0) arr.add(BUTTON1); if ((mods & InputEvent.BUTTON2_DOWN_MASK) != 0) arr.add(BUTTON2); if ((mods & InputEvent.BUTTON3_DOWN_MASK) != 0) arr.add(BUTTON3); Iterator it = arr.iterator(); if (it.hasNext()) { StringBuilder ret = new StringBuilder(); ret.append(it.next()); while (it.hasNext()) { ret.append(" "); ret.append(it.next()); } return ret.toString(); } else { return ""; } } public static int fromDisplayString(String str) { int ret = 0; StringTokenizer toks = new StringTokenizer(str); while (toks.hasMoreTokens()) { String s = toks.nextToken(); if (s.equals(Strings.get("ctrlMod"))) ret |= InputEvent.CTRL_DOWN_MASK; else if (s.equals(Strings.get("altMod"))) ret |= InputEvent.ALT_DOWN_MASK; else if (s.equals(Strings.get("shiftMod"))) ret |= InputEvent.SHIFT_DOWN_MASK; else if (s.equals(Strings.get("button1Mod"))) ret |= InputEvent.BUTTON1_DOWN_MASK; else if (s.equals(Strings.get("button2Mod"))) ret |= InputEvent.BUTTON2_DOWN_MASK; else if (s.equals(Strings.get("button3Mod"))) ret |= InputEvent.BUTTON3_DOWN_MASK; else throw new NumberFormatException("InputEventUtil"); } return ret; } public static String toDisplayString(int mods) { ArrayList arr = new ArrayList(); if ((mods & InputEvent.CTRL_DOWN_MASK) != 0) arr.add(Strings.get("ctrlMod")); if ((mods & InputEvent.ALT_DOWN_MASK) != 0) arr.add(Strings.get("altMod")); if ((mods & InputEvent.SHIFT_DOWN_MASK) != 0) arr.add(Strings.get("shiftMod")); if ((mods & InputEvent.BUTTON1_DOWN_MASK) != 0) arr.add(Strings.get("button1Mod")); if ((mods & InputEvent.BUTTON2_DOWN_MASK) != 0) arr.add(Strings.get("button2Mod")); if ((mods & InputEvent.BUTTON3_DOWN_MASK) != 0) arr.add(Strings.get("button3Mod")); if (arr.isEmpty()) return ""; Iterator it = arr.iterator(); if (it.hasNext()) { StringBuilder ret = new StringBuilder(); ret.append(it.next()); while (it.hasNext()) { ret.append(" "); ret.append(it.next()); } return ret.toString(); } else { return ""; } } public static String toKeyDisplayString(int mods) { ArrayList arr = new ArrayList(); if ((mods & Event.META_MASK) != 0) arr.add(Strings.get("metaMod")); if ((mods & Event.CTRL_MASK) != 0) arr.add(Strings.get("ctrlMod")); if ((mods & Event.ALT_MASK) != 0) arr.add(Strings.get("altMod")); if ((mods & Event.SHIFT_MASK) != 0) arr.add(Strings.get("shiftMod")); Iterator it = arr.iterator(); if (it.hasNext()) { StringBuilder ret = new StringBuilder(); ret.append(it.next()); while (it.hasNext()) { ret.append(" "); ret.append(it.next()); } return ret.toString(); } else { return ""; } } } logisim-2.7.1/src/com/cburch/logisim/util/Icons.java0000644000175000017500000000245011446034570022240 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.util; import java.awt.Component; import java.awt.Graphics; import java.awt.Graphics2D; import javax.swing.Icon; import javax.swing.ImageIcon; import com.cburch.logisim.data.Direction; public class Icons { private static final String path = "resources/logisim/icons"; private Icons() { } public static Icon getIcon(String name) { java.net.URL url = Icons.class.getClassLoader().getResource(path + "/" + name); if (url == null) return null; return new ImageIcon(url); } public static void paintRotated(Graphics g, int x, int y, Direction dir, Icon icon, Component dest) { if (!(g instanceof Graphics2D) || dir == Direction.EAST) { icon.paintIcon(dest, g, x, y); return; } Graphics2D g2 = (Graphics2D) g.create(); double cx = x + icon.getIconWidth() / 2.0; double cy = y + icon.getIconHeight() / 2.0; if (dir == Direction.WEST) { g2.rotate( Math.PI, cx, cy); } else if (dir == Direction.NORTH) { g2.rotate(-Math.PI / 2.0, cx, cy); } else if (dir == Direction.SOUTH) { g2.rotate( Math.PI / 2.0, cx, cy); } else { g2.translate(-x, -y); } icon.paintIcon(dest, g2, x, y); g2.dispose(); } } logisim-2.7.1/src/com/cburch/logisim/util/HorizontalSplitPane.java0000644000175000017500000001151511446034570025140 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.util; import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Insets; import java.awt.LayoutManager; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import javax.swing.JComponent; import javax.swing.JPanel; public class HorizontalSplitPane extends JPanel { static final int DRAG_TOLERANCE = 3; private static final Color DRAG_COLOR = new Color(0, 0, 0, 128); abstract static class Dragbar extends JComponent implements MouseListener, MouseMotionListener { private boolean dragging = false; private int curValue; Dragbar() { addMouseListener(this); addMouseMotionListener(this); } abstract int getDragValue(MouseEvent e); abstract void setDragValue(int value); @Override public void paintComponent(Graphics g) { if (dragging) { g.setColor(DRAG_COLOR); g.fillRect(0, 0, getWidth(), getHeight()); } } public void mouseClicked(MouseEvent e) { } public void mousePressed(MouseEvent e) { if (!dragging) { curValue = getDragValue(e); dragging = true; repaint(); } } public void mouseReleased(MouseEvent e) { if (dragging) { dragging = false; int newValue = getDragValue(e); if (newValue != curValue) setDragValue(newValue); repaint(); } } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mouseDragged(MouseEvent e) { if (dragging) { int newValue = getDragValue(e); if (newValue != curValue) setDragValue(newValue); } } public void mouseMoved(MouseEvent e) { } } private class MyLayout implements LayoutManager { public void addLayoutComponent(String name, Component comp) { } public void removeLayoutComponent(Component comp) { } public Dimension preferredLayoutSize(Container parent) { if (fraction <= 0.0) return comp1.getPreferredSize(); if (fraction >= 1.0) return comp0.getPreferredSize(); Insets in = parent.getInsets(); Dimension d0 = comp0.getPreferredSize(); Dimension d1 = comp1.getPreferredSize(); return new Dimension(in.left + Math.max(d0.width, d1.width) + in.right, in.top + d0.height + d1.height + in.bottom); } public Dimension minimumLayoutSize(Container parent) { if (fraction <= 0.0) return comp1.getMinimumSize(); if (fraction >= 1.0) return comp0.getMinimumSize(); Insets in = parent.getInsets(); Dimension d0 = comp0.getMinimumSize(); Dimension d1 = comp1.getMinimumSize(); return new Dimension(in.left + Math.max(d0.width, d1.width) + in.right, in.top + d0.height + d1.height + in.bottom); } public void layoutContainer(Container parent) { Insets in = parent.getInsets(); int maxWidth = parent.getWidth() - (in.left + in.right); int maxHeight = parent.getHeight() - (in.top + in.bottom); int split; if (fraction <= 0.0) { split = 0; } else if (fraction >= 1.0) { split = maxWidth; } else { split = (int) Math.round(maxHeight * fraction); split = Math.min(split, maxHeight - comp1.getMinimumSize().height); split = Math.max(split, comp0.getMinimumSize().height); } comp0.setBounds(in.left, in.top, maxWidth, split); comp1.setBounds(in.left, in.top + split, maxWidth, maxHeight - split); dragbar.setBounds(in.left, in.top + split - DRAG_TOLERANCE, maxWidth, 2 * DRAG_TOLERANCE); } } private class MyDragbar extends Dragbar { MyDragbar() { setCursor(Cursor.getPredefinedCursor(Cursor.S_RESIZE_CURSOR)); } @Override int getDragValue(MouseEvent e) { return getY() + e.getY() - HorizontalSplitPane.this.getInsets().top; } @Override void setDragValue(int value) { Insets in = HorizontalSplitPane.this.getInsets(); setFraction((double) value / (HorizontalSplitPane.this.getHeight() - in.bottom - in.top)); revalidate(); } } private JComponent comp0; private JComponent comp1; private MyDragbar dragbar; private double fraction; public HorizontalSplitPane(JComponent comp0, JComponent comp1) { this(comp0, comp1, 0.5); } public HorizontalSplitPane(JComponent comp0, JComponent comp1, double fraction) { this.comp0 = comp0; this.comp1 = comp1; this.dragbar = new MyDragbar(); // above the other components this.fraction = fraction; setLayout(new MyLayout()); add(dragbar); // above the other components add(comp0); add(comp1); } public double getFraction() { return fraction; } public void setFraction(double value) { if (value < 0.0) value = 0.0; if (value > 1.0) value = 1.0; if (fraction != value) { fraction = value; revalidate(); } } } logisim-2.7.1/src/com/cburch/logisim/util/GraphicsUtil.java0000644000175000017500000000652611446034570023573 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.util; import java.awt.BasicStroke; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; public class GraphicsUtil { public static final int H_LEFT = -1; public static final int H_CENTER = 0; public static final int H_RIGHT = 1; public static final int V_TOP = -1; public static final int V_CENTER = 0; public static final int V_BASELINE = 1; public static final int V_BOTTOM = 2; public static final int V_CENTER_OVERALL = 3; static public void switchToWidth(Graphics g, int width) { if (g instanceof Graphics2D) { Graphics2D g2 = (Graphics2D) g; g2.setStroke(new BasicStroke((float) width)); } } static public void drawCenteredArc(Graphics g, int x, int y, int r, int start, int dist) { g.drawArc(x - r, y - r, 2 * r, 2 * r, start, dist); } static public Rectangle getTextBounds(Graphics g, Font font, String text, int x, int y, int halign, int valign) { if (g == null) return new Rectangle(x, y, 0, 0); Font oldfont = g.getFont(); if (font != null) g.setFont(font); Rectangle ret = getTextBounds(g, text, x, y, halign, valign); if (font != null) g.setFont(oldfont); return ret; } static public Rectangle getTextBounds(Graphics g, String text, int x, int y, int halign, int valign) { if (g == null) return new Rectangle(x, y, 0, 0); FontMetrics mets = g.getFontMetrics(); int width = mets.stringWidth(text); int ascent = mets.getAscent(); int descent = mets.getDescent(); int height = ascent + descent; Rectangle ret = new Rectangle(x, y, width, height); switch (halign) { case H_CENTER: ret.translate(-(width / 2), 0); break; case H_RIGHT: ret.translate(-width, 0); break; default: ; } switch (valign) { case V_TOP: break; case V_CENTER: ret.translate(0, -(ascent / 2)); break; case V_CENTER_OVERALL: ret.translate(0, -(height / 2)); break; case V_BASELINE: ret.translate(0, -ascent); break; case V_BOTTOM: ret.translate(0, -height); break; default: ; } return ret; } static public void drawText(Graphics g, Font font, String text, int x, int y, int halign, int valign) { Font oldfont = g.getFont(); if (font != null) g.setFont(font); drawText(g, text, x, y, halign, valign); if (font != null) g.setFont(oldfont); } static public void drawText(Graphics g, String text, int x, int y, int halign, int valign) { if (text.length() == 0) return; Rectangle bd = getTextBounds(g, text, x, y, halign, valign); g.drawString(text, bd.x, bd.y + g.getFontMetrics().getAscent()); } static public void drawCenteredText(Graphics g, String text, int x, int y) { drawText(g, text, x, y, H_CENTER, V_CENTER); } static public void drawArrow(Graphics g, int x0, int y0, int x1, int y1, int headLength, int headAngle) { double offs = headAngle * Math.PI / 180.0; double angle = Math.atan2(y0 - y1, x0 - x1); int[] xs = { x1 + (int) (headLength * Math.cos(angle + offs)), x1, x1 + (int) (headLength * Math.cos(angle - offs)) }; int[] ys = { y1 + (int) (headLength * Math.sin(angle + offs)), y1, y1 + (int) (headLength * Math.sin(angle - offs)) }; g.drawLine(x0, y0, x1, y1); g.drawPolyline(xs, ys, 3); } } logisim-2.7.1/src/com/cburch/logisim/util/GifEncoder.java0000644000175000017500000003503511447117150023174 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ /* * @(#)GIFEncoder.java 0.90 4/21/96 Adam Doppelt */ package com.cburch.logisim.util; import java.awt.AWTException; import java.awt.Image; import java.awt.image.ColorModel; import java.awt.image.PixelGrabber; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import javax.swing.ProgressMonitor; /** * GIFEncoder is a class which takes an image and saves it to a stream * using the GIF file format (Graphics Interchange * Format). A GIFEncoder * is constructed with either an AWT Image (which must be fully * loaded) or a set of RGB arrays. The image can be written out with a * call to Write.

* * Three caveats: *

    *
  • GIFEncoder will convert the image to indexed color upon * construction. This will take some time, depending on the size of * the image. Also, actually writing the image out (Write) will take * time.

    * *

  • The image cannot have more than 256 colors, since GIF is an 8 * bit format. For a 24 bit to 8 bit quantization algorithm, see * Graphics Gems II III.2 by Xialoin Wu. Or check out his C source.

    * *

  • Since the image must be completely loaded into memory, * GIFEncoder may have problems with large images. Attempting to * encode an image which will not fit into memory will probably * result in the following exception:

    * java.awt.AWTException: Grabber returned false: 192

    *

* * GIFEncoder is based upon gifsave.c, which was written and released * by:

*

* Sverre H. Huseby
* Bjoelsengt. 17
* N-0468 Oslo
* Norway

* * Phone: +47 2 230539
* sverrehu@ifi.uio.no

*

* @version 0.90 21 Apr 1996 * @author Adam Doppelt */ public class GifEncoder { private static class BitFile { OutputStream output_; byte buffer_[]; int index_, bitsLeft_; BitFile(OutputStream output) { output_ = output; buffer_ = new byte[256]; index_ = 0; bitsLeft_ = 8; } void Flush() throws IOException { int numBytes = index_ + (bitsLeft_ == 8 ? 0 : 1); if (numBytes > 0) { output_.write(numBytes); output_.write(buffer_, 0, numBytes); buffer_[0] = 0; index_ = 0; bitsLeft_ = 8; } } void WriteBits(int bits, int numbits) throws IOException { int bitsWritten = 0; int numBytes = 255; do { if ((index_ == 254 && bitsLeft_ == 0) || index_ > 254) { output_.write(numBytes); output_.write(buffer_, 0, numBytes); buffer_[0] = 0; index_ = 0; bitsLeft_ = 8; } if (numbits <= bitsLeft_) { buffer_[index_] |= (bits & ((1 << numbits) - 1)) << (8 - bitsLeft_); bitsWritten += numbits; bitsLeft_ -= numbits; numbits = 0; } else { buffer_[index_] |= (bits & ((1 << bitsLeft_) - 1)) << (8 - bitsLeft_); bitsWritten += bitsLeft_; bits >>= bitsLeft_; numbits -= bitsLeft_; buffer_[++index_] = 0; bitsLeft_ = 8; } } while (numbits != 0); } } private static class LZWStringTable { private final static int RES_CODES = 2; private final static short HASH_FREE = (short)0xFFFF; private final static short NEXT_FIRST = (short)0xFFFF; private final static int MAXBITS = 12; private final static int MAXSTR = (1 << MAXBITS); private final static short HASHSIZE = 9973; private final static short HASHSTEP = 2039; byte strChr_[]; short strNxt_[]; short strHsh_[]; short numStrings_; LZWStringTable() { strChr_ = new byte[MAXSTR]; strNxt_ = new short[MAXSTR]; strHsh_ = new short[HASHSIZE]; } int AddCharString(short index, byte b) { int hshidx; if (numStrings_ >= MAXSTR) return 0xFFFF; hshidx = Hash(index, b); while (strHsh_[hshidx] != HASH_FREE) hshidx = (hshidx + HASHSTEP) % HASHSIZE; strHsh_[hshidx] = numStrings_; strChr_[numStrings_] = b; strNxt_[numStrings_] = (index != HASH_FREE) ? index : NEXT_FIRST; return numStrings_++; } short FindCharString(short index, byte b) { int hshidx, nxtidx; if (index == HASH_FREE) return b; hshidx = Hash(index, b); while ((nxtidx = strHsh_[hshidx]) != HASH_FREE) { if (strNxt_[nxtidx] == index && strChr_[nxtidx] == b) return (short)nxtidx; hshidx = (hshidx + HASHSTEP) % HASHSIZE; } return (short)0xFFFF; } void ClearTable(int codesize) { numStrings_ = 0; for (int q = 0; q < HASHSIZE; q++) { strHsh_[q] = HASH_FREE; } int w = (1 << codesize) + RES_CODES; for (int q = 0; q < w; q++) AddCharString((short)0xFFFF, (byte)q); } static int Hash(short index, byte lastbyte) { return ((int)((short)(lastbyte << 8) ^ index) & 0xFFFF) % HASHSIZE; } } private static class LZWCompressor { static void LZWCompress(OutputStream output, int codesize, byte toCompress[]) throws IOException { byte c; short index; int clearcode, endofinfo, numbits, limit; short prefix = (short)0xFFFF; BitFile bitFile = new BitFile(output); LZWStringTable strings = new LZWStringTable(); clearcode = 1 << codesize; endofinfo = clearcode + 1; numbits = codesize + 1; limit = (1 << numbits) - 1; strings.ClearTable(codesize); bitFile.WriteBits(clearcode, numbits); for (int loop = 0; loop < toCompress.length; ++loop) { c = toCompress[loop]; if ((index = strings.FindCharString(prefix, c)) != -1) prefix = index; else { bitFile.WriteBits(prefix, numbits); if (strings.AddCharString(prefix, c) > limit) { if (++numbits > 12) { bitFile.WriteBits(clearcode, numbits - 1); strings.ClearTable(codesize); numbits = codesize + 1; } limit = (1 << numbits) - 1; } prefix = (short)((short)c & 0xFF); } } if (prefix != -1) bitFile.WriteBits(prefix, numbits); bitFile.WriteBits(endofinfo, numbits); bitFile.Flush(); } } private static class ScreenDescriptor { short localScreenWidth_, localScreenHeight_; private byte byte_; byte backgroundColorIndex_, pixelAspectRatio_; ScreenDescriptor(short width, short height, int numColors) { localScreenWidth_ = width; localScreenHeight_ = height; SetGlobalColorTableSize((byte)(BitUtils.BitsNeeded(numColors) - 1)); SetGlobalColorTableFlag((byte)1); SetSortFlag((byte)0); SetColorResolution((byte)7); backgroundColorIndex_ = 0; pixelAspectRatio_ = 0; } void Write(OutputStream output) throws IOException { BitUtils.WriteWord(output, localScreenWidth_); BitUtils.WriteWord(output, localScreenHeight_); output.write(byte_); output.write(backgroundColorIndex_); output.write(pixelAspectRatio_); } void SetGlobalColorTableSize(byte num) { byte_ |= (num & 7); } void SetSortFlag(byte num) { byte_ |= (num & 1) << 3; } void SetColorResolution(byte num) { byte_ |= (num & 7) << 4; } void SetGlobalColorTableFlag(byte num) { byte_ |= (num & 1) << 7; } } private static class ImageDescriptor { byte separator_; short leftPosition_, topPosition_, width_, height_; private byte byte_; ImageDescriptor(short width, short height, char separator) { separator_ = (byte)separator; leftPosition_ = 0; topPosition_ = 0; width_ = width; height_ = height; SetLocalColorTableSize((byte)0); SetReserved((byte)0); SetSortFlag((byte)0); SetInterlaceFlag((byte)0); SetLocalColorTableFlag((byte)0); } void Write(OutputStream output) throws IOException { output.write(separator_); BitUtils.WriteWord(output, leftPosition_); BitUtils.WriteWord(output, topPosition_); BitUtils.WriteWord(output, width_); BitUtils.WriteWord(output, height_); output.write(byte_); } void SetLocalColorTableSize(byte num) { byte_ |= (num & 7); } void SetReserved(byte num) { byte_ |= (num & 3) << 3; } void SetSortFlag(byte num) { byte_ |= (num & 1) << 5; } void SetInterlaceFlag(byte num) { byte_ |= (num & 1) << 6; } void SetLocalColorTableFlag(byte num) { byte_ |= (num & 1) << 7; } } private static class BitUtils { static byte BitsNeeded(int n) { byte ret = 1; if (n-- == 0) return 0; while ((n >>= 1) != 0) ++ret; return ret; } static void WriteWord(OutputStream output, short w) throws IOException { output.write(w & 0xFF); output.write((w >> 8) & 0xFF); } static void WriteString(OutputStream output, String string) throws IOException { for (int loop = 0; loop < string.length(); ++loop) output.write((byte)(string.charAt(loop))); } } private static class MyGrabber extends PixelGrabber { ProgressMonitor monitor; int progress; int goal; MyGrabber(ProgressMonitor monitor, Image image, int x, int y, int width, int height, int[] values, int start, int scan) { super(image, x, y, width, height, values, start, scan); this.monitor = monitor; progress = 0; goal = width * height; monitor.setMinimum(0); monitor.setMaximum(goal * 21 / 20); } @Override public void setPixels(int srcX, int srcY, int srcW, int srcH, ColorModel model, int[] pixels, int srcOff, int srcScan) { progress += srcW * srcH; monitor.setProgress(progress); if (monitor.isCanceled()) { abortGrabbing(); } else { super.setPixels(srcX, srcY, srcW, srcH, model, pixels, srcOff, srcScan); } } } private short width_, height_; private int numColors_; private byte pixels_[], colors_[]; /** * Construct a GIFEncoder. The constructor will convert the image to * an indexed color array. This may take some time.

* * @param image The image to encode. The image must be * completely loaded. * @exception AWTException Will be thrown if the pixel grab fails. This * can happen if Java runs out of memory. It may also indicate that the image * contains more than 256 colors. * */ public GifEncoder(Image image, ProgressMonitor monitor) throws AWTException { width_ = (short)image.getWidth(null); height_ = (short)image.getHeight(null); int values[] = new int[width_ * height_]; PixelGrabber grabber; if (monitor != null) { grabber = new MyGrabber(monitor, image, 0, 0, width_, height_, values, 0, width_); } else { grabber = new PixelGrabber(image, 0, 0, width_, height_, values, 0, width_); } try { if (grabber.grabPixels() != true) throw new AWTException(Strings.get("grabberError") + ": " + grabber.status()); } catch (InterruptedException e) { ; } byte r[][] = new byte[width_][height_]; byte g[][] = new byte[width_][height_]; byte b[][] = new byte[width_][height_]; int index = 0; for (int y = 0; y < height_; ++y) for (int x = 0; x < width_; ++x) { r[x][y] = (byte)((values[index] >> 16) & 0xFF); g[x][y] = (byte)((values[index] >> 8) & 0xFF); b[x][y] = (byte)((values[index]) & 0xFF); ++index; } ToIndexedColor(r, g, b); } /** * Construct a GifEncoder. The constructor will convert the image to * an indexed color array. This may take some time.

* * Each array stores intensity values for the image. In other words, * r[x][y] refers to the red intensity of the pixel at column x, row * y.

* * @param r An array containing the red intensity values. * @param g An array containing the green intensity values. * @param b An array containing the blue intensity values. * * @exception AWTException Will be thrown if the image contains more than * 256 colors. * */ public GifEncoder(byte r[][], byte g[][], byte b[][]) throws AWTException { width_ = (short)(r.length); height_ = (short)(r[0].length); ToIndexedColor(r, g, b); } /** * Writes the image out to a stream in the GIF file format. This will * be a single GIF87a image, non-interlaced, with no background color. * This may take some time.

* * @param output The stream to output to. This should probably be a * buffered stream. * * @exception IOException Will be thrown if a write operation fails. * */ public void write(OutputStream output) throws IOException { BitUtils.WriteString(output, "GIF87a"); ScreenDescriptor sd = new ScreenDescriptor(width_, height_, numColors_); sd.Write(output); output.write(colors_, 0, colors_.length); ImageDescriptor id = new ImageDescriptor(width_, height_, ','); id.Write(output); byte codesize = BitUtils.BitsNeeded(numColors_); if (codesize == 1) ++codesize; output.write(codesize); LZWCompressor.LZWCompress(output, codesize, pixels_); output.write(0); id = new ImageDescriptor((byte)0, (byte)0, ';'); id.Write(output); output.flush(); } void ToIndexedColor(byte r[][], byte g[][], byte b[][]) throws AWTException { pixels_ = new byte[width_ * height_]; colors_ = new byte[256 * 3]; int colornum = 0; for (int x = 0; x < width_; ++x) { for (int y = 0; y < height_; ++y) { int search; for (search = 0; search < colornum; ++search) if (colors_[search * 3] == r[x][y] && colors_[search * 3 + 1] == g[x][y] && colors_[search * 3 + 2] == b[x][y]) break; if (search > 255) throw new AWTException(Strings.get("manyColorError")); pixels_[y * width_ + x] = (byte)search; if (search == colornum) { colors_[search * 3] = r[x][y]; colors_[search * 3 + 1] = g[x][y]; colors_[search * 3 + 2] = b[x][y]; ++colornum; } } } numColors_ = 1 << BitUtils.BitsNeeded(colornum); byte copy[] = new byte[numColors_ * 3]; System.arraycopy(colors_, 0, copy, 0, numColors_ * 3); colors_ = copy; } public static void toFile(Image img, String filename, ProgressMonitor monitor) throws IOException, AWTException { FileOutputStream out = new FileOutputStream(filename); new GifEncoder(img, monitor).write(out); out.close(); } public static void toFile(Image img, File file, ProgressMonitor monitor) throws IOException, AWTException { FileOutputStream out = new FileOutputStream(file); new GifEncoder(img, monitor).write(out); out.close(); } public static void toFile(Image img, String filename) throws IOException, AWTException { toFile(img, filename, null); } public static void toFile(Image img, File file) throws IOException, AWTException { toFile(img, file, null); } } logisim-2.7.1/src/com/cburch/logisim/util/FontUtil.java0000644000175000017500000000156011446034570022732 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.util; import java.awt.Font; public class FontUtil { public static String toStyleStandardString(int style) { switch (style) { case Font.PLAIN: return "plain"; case Font.ITALIC: return "italic"; case Font.BOLD: return "bold"; case Font.BOLD | Font.ITALIC: return "bolditalic"; default: return "??"; } } public static String toStyleDisplayString(int style) { switch (style) { case Font.PLAIN: return Strings.get("fontPlainStyle"); case Font.ITALIC: return Strings.get("fontItalicStyle"); case Font.BOLD: return Strings.get("fontBoldStyle"); case Font.BOLD | Font.ITALIC: return Strings.get("fontBoldItalicStyle"); default: return "??"; } } } logisim-2.7.1/src/com/cburch/logisim/util/EventSourceWeakSupport.java0000644000175000017500000000264011446034570025635 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.util; import java.lang.ref.WeakReference; import java.util.Iterator; import java.util.ArrayList; import java.util.concurrent.ConcurrentLinkedQueue; public class EventSourceWeakSupport implements Iterable { private ConcurrentLinkedQueue> listeners = new ConcurrentLinkedQueue>(); public EventSourceWeakSupport() { } public void add(L listener) { listeners.add(new WeakReference(listener)); } public void remove(L listener) { for (Iterator> it = listeners.iterator(); it.hasNext(); ) { L l = it.next().get(); if (l == null || l == listener) it.remove(); } } public boolean isEmpty() { for (Iterator> it = listeners.iterator(); it.hasNext(); ) { L l = it.next().get(); if (l == null) { it.remove(); } else { return false; } } return true; } public Iterator iterator() { // copy elements into another list in case any event handlers // want to add a listener ArrayList ret = new ArrayList(listeners.size()); for (Iterator> it = listeners.iterator(); it.hasNext(); ) { L l = it.next().get(); if (l == null) { it.remove(); } else { ret.add(l); } } return ret.iterator(); } } logisim-2.7.1/src/com/cburch/logisim/util/Dag.java0000644000175000017500000000625611446034570021670 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.util; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.Iterator; public class Dag { private static class Node { Object data; HashSet succs = new HashSet(); // of Nodes int numPreds = 0; boolean mark; Node(Object data) { this.data = data; } } private HashMap nodes = new HashMap(); public Dag() { } public boolean hasPredecessors(Object data) { Node from = findNode(data); return from != null && from.numPreds != 0; } public boolean hasSuccessors(Object data) { Node to = findNode(data); return to != null && !to.succs.isEmpty(); } public boolean canFollow(Object query, Object base) { Node queryNode = findNode(query); Node baseNode = findNode(base); if (baseNode == null || queryNode == null) { return !base.equals(query); } else { return canFollow(queryNode, baseNode); } } public boolean addEdge(Object srcData, Object dstData) { if (!canFollow(dstData, srcData)) return false; Node src = createNode(srcData); Node dst = createNode(dstData); if (src.succs.add(dst)) ++dst.numPreds; // add since not already present return true; } public boolean removeEdge(Object srcData, Object dstData) { // returns true if the edge could be removed Node src = findNode(srcData); Node dst = findNode(dstData); if (src == null || dst == null) return false; if (!src.succs.remove(dst)) return false; --dst.numPreds; if (dst.numPreds == 0 && dst.succs.isEmpty()) nodes.remove(dstData); if (src.numPreds == 0 && src.succs.isEmpty()) nodes.remove(srcData); return true; } public void removeNode(Object data) { Node n = findNode(data); if (n == null) return; for (Iterator it = n.succs.iterator(); it.hasNext(); ) { Node succ = it.next(); --(succ.numPreds); if (succ.numPreds == 0 && succ.succs.isEmpty()) it.remove(); } if (n.numPreds > 0) { for (Iterator it = nodes.values().iterator(); it.hasNext(); ) { Node q = it.next(); if (q.succs.remove(n) && q.numPreds == 0 && q.succs.isEmpty()) it.remove(); } } } private Node findNode(Object data) { if (data == null) return null; return nodes.get(data); } private Node createNode(Object data) { Node ret = findNode(data); if (ret != null) return ret; if (data == null) return null; ret = new Node(data); nodes.put(data, ret); return ret; } private boolean canFollow(Node query, Node base) { if (base == query) return false; // mark all as unvisited for (Node n : nodes.values()) { n.mark = false; // will become true once reached } // Search starting at query: If base is found, then it follows // the query already, and so query cannot follow base. LinkedList fringe = new LinkedList(); fringe.add(query); while (!fringe.isEmpty()) { Node n = fringe.removeFirst(); for (Node next : n.succs) { if (!next.mark) { if (next == base) return false; next.mark = true; fringe.addLast(next); } } } return true; } } logisim-2.7.1/src/com/cburch/logisim/util/CollectionUtil.java0000644000175000017500000000275511446034570024126 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.util; import java.util.AbstractList; import java.util.AbstractSet; import java.util.Iterator; import java.util.List; import java.util.Set; public class CollectionUtil { private static class UnionSet extends AbstractSet { private Set a; private Set b; UnionSet(Set a, Set b) { this.a = a; this.b = b; } @Override public int size() { return a.size() + b.size(); } @Override public Iterator iterator() { return IteratorUtil.createJoinedIterator(a.iterator(), b.iterator()); } } private static class UnionList extends AbstractList { private List a; private List b; UnionList(List a, List b) { this.a = a; this.b = b; } @Override public int size() { return a.size() + b.size(); } @Override public E get(int index) { E ret; if (index < a.size()) { ret = a.get(index); } else { ret = a.get(index - a.size()); } return ret; } } private CollectionUtil() { } public static Set createUnmodifiableSetUnion(Set a, Set b) { return new UnionSet(a, b); } public static List createUnmodifiableListUnion(List a, List b) { return new UnionList(a, b); } } logisim-2.7.1/src/com/cburch/logisim/util/Cache.java0000644000175000017500000000170411446034570022171 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.util; /** * Allows immutable objects to be cached in memory in order to reduce * the creation of duplicate objects. */ public class Cache { private int mask; private Object[] data; public Cache() { this(8); } public Cache(int logSize) { if (logSize > 12) logSize = 12; data = new Object[1 << logSize]; mask = data.length - 1; } public Object get(int hashCode) { return data[hashCode & mask]; } public void put(int hashCode, Object value) { if (value != null) { data[hashCode & mask] = value; } } public Object get(Object value) { if (value == null) return null; int code = value.hashCode() & mask; Object ret = data[code]; if (ret != null && ret.equals(value)) { return ret; } else { data[code] = value; return value; } } } logisim-2.7.1/src/com/cburch/logisim/util/ArraySet.java0000644000175000017500000000722311446034570022722 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.util; import java.util.AbstractSet; import java.util.ConcurrentModificationException; import java.util.Iterator; import java.util.NoSuchElementException; public class ArraySet extends AbstractSet { private static final Object[] EMPTY_ARRAY = new Object[0]; private class ArrayIterator implements Iterator { int itVersion = version; int pos = 0; // position of next item to return boolean hasNext = values.length > 0; boolean removeOk = false; public boolean hasNext() { return hasNext; } public E next() { if (itVersion != version) { throw new ConcurrentModificationException(); } else if (!hasNext) { throw new NoSuchElementException(); } else { @SuppressWarnings("unchecked") E ret = (E) values[pos]; ++pos; hasNext = pos < values.length; removeOk = true; return ret; } } public void remove() { if (itVersion != version) { throw new ConcurrentModificationException(); } else if (!removeOk) { throw new IllegalStateException(); } else if (values.length == 1) { values = EMPTY_ARRAY; ++version; itVersion = version; removeOk = false; } else { Object[] newValues = new Object[values.length - 1]; if (pos > 1) { System.arraycopy(values, 0, newValues, 0, pos - 1); } if (pos < values.length) { System.arraycopy(values, pos, newValues, pos - 1, values.length - pos); } values = newValues; --pos; ++version; itVersion = version; removeOk = false; } } } private int version = 0; private Object[] values = EMPTY_ARRAY; public ArraySet() { } @Override public Object[] toArray() { return values; } @Override public Object clone() { ArraySet ret = new ArraySet(); if (this.values == EMPTY_ARRAY) { ret.values = EMPTY_ARRAY; } else { ret.values = this.values.clone(); } return ret; } @Override public void clear() { values = EMPTY_ARRAY; ++version; } @Override public boolean isEmpty() { return values.length == 0; } @Override public int size() { return values.length; } @Override public boolean add(Object value) { int n = values.length; for (int i = 0; i < n; i++) { if (values[i].equals(value)) return false; } Object[] newValues = new Object[n + 1]; System.arraycopy(values, 0, newValues, 0, n); newValues[n] = value; values = newValues; ++version; return true; } @Override public boolean contains(Object value) { for (int i = 0, n = values.length; i < n; i++) { if (values[i].equals(value)) return true; } return false; } @Override public Iterator iterator() { return new ArrayIterator(); } public static void main(String[] args) throws java.io.IOException { ArraySet set = new ArraySet(); java.io.BufferedReader in = new java.io.BufferedReader( new java.io.InputStreamReader(System.in)); while (true) { System.out.print(set.size() + ":"); //OK for (String str : set) { System.out.print(" " + str); //OK } System.out.println(); //OK System.out.print("> "); //OK String cmd = in.readLine(); if (cmd == null) break; cmd = cmd.trim(); if (cmd.equals("")) { ; } else if (cmd.startsWith("+")) { set.add(cmd.substring(1)); } else if (cmd.startsWith("-")) { set.remove(cmd.substring(1)); } else if (cmd.startsWith("?")) { boolean ret = set.contains(cmd.substring(1)); System.out.println(" " + ret); //OK } else { System.out.println("unrecognized command"); //OK } } } } logisim-2.7.1/src/com/cburch/logisim/tools/0000755000175000017500000000000011534737550020512 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/logisim/tools/WiringTool.java0000644000175000017500000002476211455470046023461 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools; import java.awt.Cursor; import java.awt.Color; import java.awt.Graphics; import java.awt.Rectangle; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import javax.swing.Icon; import com.cburch.logisim.circuit.CircuitMutation; import com.cburch.logisim.circuit.Wire; import com.cburch.logisim.comp.Component; import com.cburch.logisim.comp.ComponentDrawContext; import com.cburch.logisim.data.Location; import com.cburch.logisim.gui.main.Canvas; import com.cburch.logisim.prefs.AppPreferences; import com.cburch.logisim.proj.Action; import com.cburch.logisim.util.GraphicsUtil; import com.cburch.logisim.util.Icons; import com.cburch.logisim.util.StringGetter; import java.util.ArrayList; import java.util.Collections; import java.util.Set; public class WiringTool extends Tool { private static Cursor cursor = Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR); private static final Icon toolIcon = Icons.getIcon("wiring.gif"); private static final int HORIZONTAL = 1; private static final int VERTICAL = 2; private boolean exists = false; private boolean inCanvas = false; private Location start = Location.create(0, 0); private Location cur = Location.create(0, 0); private boolean hasDragged = false; private boolean startShortening = false; private Wire shortening = null; private Action lastAction = null; private int direction = 0; public WiringTool() { super.select(null); } @Override public void select(Canvas canvas) { super.select(canvas); lastAction = null; reset(); } private void reset() { exists = false; inCanvas = false; start = Location.create(0, 0); cur = Location.create(0, 0); startShortening = false; shortening = null; direction = 0; } @Override public boolean equals(Object other) { return other instanceof WiringTool; } @Override public int hashCode() { return WiringTool.class.hashCode(); } @Override public String getName() { return "Wiring Tool"; } @Override public String getDisplayName() { return Strings.get("wiringTool"); } @Override public String getDescription() { return Strings.get("wiringToolDesc"); } private boolean computeMove(int newX, int newY) { if (cur.getX() == newX && cur.getY() == newY) return false; Location start = this.start; if (direction == 0) { if (newX != start.getX()) direction = HORIZONTAL; else if (newY != start.getY()) direction = VERTICAL; } else if (direction == HORIZONTAL && newX == start.getX()) { if (newY == start.getY()) direction = 0; else direction = VERTICAL; } else if (direction == VERTICAL && newY == start.getY()) { if (newX == start.getX()) direction = 0; else direction = HORIZONTAL; } return true; } @Override public Set getHiddenComponents(Canvas canvas) { Component shorten = willShorten(start, cur); if (shorten != null) { return Collections.singleton(shorten); } else { return null; } } @Override public void draw(Canvas canvas, ComponentDrawContext context) { Graphics g = context.getGraphics(); if (exists) { Location e0 = start; Location e1 = cur; Wire shortenBefore = willShorten(start, cur); if (shortenBefore != null) { Wire shorten = getShortenResult(shortenBefore, start, cur); if (shorten == null) { return; } else { e0 = shorten.getEnd0(); e1 = shorten.getEnd1(); } } int x0 = e0.getX(); int y0 = e0.getY(); int x1 = e1.getX(); int y1 = e1.getY(); g.setColor(Color.BLACK); GraphicsUtil.switchToWidth(g, 3); if (direction == HORIZONTAL) { if (x0 != x1) g.drawLine(x0, y0, x1, y0); if (y0 != y1) g.drawLine(x1, y0, x1, y1); } else if (direction == VERTICAL) { if (y0 != y1) g.drawLine(x0, y0, x0, y1); if (x0 != x1) g.drawLine(x0, y1, x1, y1); } } else if (AppPreferences.ADD_SHOW_GHOSTS.getBoolean() && inCanvas) { g.setColor(Color.GRAY); g.fillOval(cur.getX() - 2, cur.getY() - 2, 5, 5); } } @Override public void mouseEntered(Canvas canvas, Graphics g, MouseEvent e) { inCanvas = true; canvas.getProject().repaintCanvas(); } @Override public void mouseExited(Canvas canvas, Graphics g, MouseEvent e) { inCanvas = false; canvas.getProject().repaintCanvas(); } @Override public void mouseMoved(Canvas canvas, Graphics g, MouseEvent e) { if (exists) { mouseDragged(canvas, g, e); } else { Canvas.snapToGrid(e); inCanvas = true; int curX = e.getX(); int curY = e.getY(); if (cur.getX() != curX || cur.getY() != curY) { cur = Location.create(curX, curY); } canvas.getProject().repaintCanvas(); } } @Override public void mousePressed(Canvas canvas, Graphics g, MouseEvent e) { if (!canvas.getProject().getLogisimFile().contains(canvas.getCircuit())) { exists = false; canvas.setErrorMessage(Strings.getter("cannotModifyError")); return; } if (exists) { mouseDragged(canvas, g, e); } else { Canvas.snapToGrid(e); start = Location.create(e.getX(), e.getY()); cur = start; exists = true; hasDragged = false; startShortening = !canvas.getCircuit().getWires(start).isEmpty(); shortening = null; super.mousePressed(canvas, g, e); canvas.getProject().repaintCanvas(); } } @Override public void mouseDragged(Canvas canvas, Graphics g, MouseEvent e) { if (exists) { Canvas.snapToGrid(e); int curX = e.getX(); int curY = e.getY(); if (!computeMove(curX, curY)) return; hasDragged = true; Rectangle rect = new Rectangle(); rect.add(start.getX(), start.getY()); rect.add(cur.getX(), cur.getY()); rect.add(curX, curY); rect.grow(3, 3); cur = Location.create(curX, curY); super.mouseDragged(canvas, g, e); Wire shorten = null; if (startShortening) { for (Wire w : canvas.getCircuit().getWires(start)) { if (w.contains(cur)) { shorten = w; break; } } } if (shorten == null) { for (Wire w : canvas.getCircuit().getWires(cur)) { if (w.contains(start)) { shorten = w; break; } } } shortening = shorten; canvas.repaint(rect); } } void resetClick() { exists = false; } @Override public void mouseReleased(Canvas canvas, Graphics g, MouseEvent e) { if (!exists) return; Canvas.snapToGrid(e); int curX = e.getX(); int curY = e.getY(); if (computeMove(curX, curY)) { cur = Location.create(curX, curY); } if (hasDragged) { exists = false; super.mouseReleased(canvas, g, e); ArrayList ws = new ArrayList(2); if (cur.getY() == start.getY() || cur.getX() == start.getX()) { Wire w = Wire.create(cur, start); w = checkForRepairs(canvas, w, w.getEnd0()); w = checkForRepairs(canvas, w, w.getEnd1()); if (performShortening(canvas, start, cur)) { return; } if (w.getLength() > 0) ws.add(w); } else { Location m; if (direction == HORIZONTAL) { m = Location.create(cur.getX(), start.getY()); } else { m = Location.create(start.getX(), cur.getY()); } Wire w0 = Wire.create(start, m); Wire w1 = Wire.create(m, cur); w0 = checkForRepairs(canvas, w0, start); w1 = checkForRepairs(canvas, w1, cur); if (w0.getLength() > 0) ws.add(w0); if (w1.getLength() > 0) ws.add(w1); } if (ws.size() > 0) { CircuitMutation mutation = new CircuitMutation(canvas.getCircuit()); mutation.addAll(ws); StringGetter desc; if (ws.size() == 1) desc = Strings.getter("addWireAction"); else desc = Strings.getter("addWiresAction"); Action act = mutation.toAction(desc); canvas.getProject().doAction(act); lastAction = act; } } } private Wire checkForRepairs(Canvas canvas, Wire w, Location end) { if (w.getLength() <= 10) return w; // don't repair a short wire to nothing if (!canvas.getCircuit().getNonWires(end).isEmpty()) return w; int delta = (end.equals(w.getEnd0()) ? 10 : -10); Location cand; if (w.isVertical()) { cand = Location.create(end.getX(), end.getY() + delta); } else { cand = Location.create(end.getX() + delta, end.getY()); } for (Component comp : canvas.getCircuit().getNonWires(cand)) { if (comp.getBounds().contains(end)) { WireRepair repair = (WireRepair) comp.getFeature(WireRepair.class); if (repair != null && repair.shouldRepairWire(new WireRepairData(w, cand))) { w = Wire.create(w.getOtherEnd(end), cand); canvas.repaint(end.getX() - 13, end.getY() - 13, 26, 26); return w; } } } return w; } private Wire willShorten(Location drag0, Location drag1) { Wire shorten = shortening; if (shorten == null) { return null; } else if (shorten.endsAt(drag0) || shorten.endsAt(drag1)) { return shorten; } else { return null; } } private Wire getShortenResult(Wire shorten, Location drag0, Location drag1) { if (shorten == null) { return null; } else { Location e0; Location e1; if (shorten.endsAt(drag0)) { e0 = drag1; e1 = shorten.getOtherEnd(drag0); } else if (shorten.endsAt(drag1)) { e0 = drag0; e1 = shorten.getOtherEnd(drag1); } else { return null; } return e0.equals(e1) ? null : Wire.create(e0, e1); } } private boolean performShortening(Canvas canvas, Location drag0, Location drag1) { Wire shorten = willShorten(drag0, drag1); if (shorten == null) { return false; } else { CircuitMutation xn = new CircuitMutation(canvas.getCircuit()); StringGetter actName; Wire result = getShortenResult(shorten, drag0, drag1); if (result == null) { xn.remove(shorten); actName = Strings.getter("removeComponentAction", shorten.getFactory().getDisplayGetter()); } else { xn.replace(shorten, result); actName = Strings.getter("shortenWireAction"); } canvas.getProject().doAction(xn.toAction(actName)); return true; } } @Override public void keyPressed(Canvas canvas, KeyEvent event) { switch (event.getKeyCode()) { case KeyEvent.VK_BACK_SPACE: if (lastAction != null && canvas.getProject().getLastAction() == lastAction) { canvas.getProject().undoAction(); lastAction = null; } } } @Override public void paintIcon(ComponentDrawContext c, int x, int y) { Graphics g = c.getGraphics(); if (toolIcon != null) { toolIcon.paintIcon(c.getDestination(), g, x + 2, y + 2); } else { g.setColor(java.awt.Color.black); g.drawLine(x + 3, y + 13, x + 17, y + 7); g.fillOval(x + 1, y + 11, 5, 5); g.fillOval(x + 15, y + 5, 5, 5); } } @Override public Cursor getCursor() { return cursor; } } logisim-2.7.1/src/com/cburch/logisim/tools/WireRepairData.java0000644000175000017500000000103111446034522024202 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools; import com.cburch.logisim.circuit.Wire; import com.cburch.logisim.data.Location; public class WireRepairData { private Wire wire; private Location point; public WireRepairData(Wire wire, Location point) { this.wire = wire; this.point = point; } public Location getPoint() { return point; } public Wire getWire() { return wire; } } logisim-2.7.1/src/com/cburch/logisim/tools/WireRepair.java0000644000175000017500000000041611446034522023416 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools; public interface WireRepair { public boolean shouldRepairWire(WireRepairData data); } logisim-2.7.1/src/com/cburch/logisim/tools/ToolTipMaker.java0000644000175000017500000000050211446034522023713 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools; import com.cburch.logisim.comp.ComponentUserEvent; public interface ToolTipMaker { public String getToolTip(ComponentUserEvent event); } logisim-2.7.1/src/com/cburch/logisim/tools/Tool.java0000644000175000017500000000505511527054422022267 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools; import java.awt.Cursor; import java.awt.Graphics; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import java.util.Set; import com.cburch.logisim.LogisimVersion; import com.cburch.logisim.comp.Component; import com.cburch.logisim.comp.ComponentDrawContext; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeDefaultProvider; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.gui.main.Canvas; // // DRAWING TOOLS // public abstract class Tool implements AttributeDefaultProvider { private static Cursor dflt_cursor = Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR); public abstract String getName(); public abstract String getDisplayName(); public abstract String getDescription(); public Tool cloneTool() { return this; } public boolean sharesSource(Tool other) { return this == other; } public AttributeSet getAttributeSet() { return null; } public AttributeSet getAttributeSet(Canvas canvas) { return getAttributeSet(); } public boolean isAllDefaultValues(AttributeSet attrs, LogisimVersion ver) { return false; } public Object getDefaultAttributeValue(Attribute attr, LogisimVersion ver) { return null; } public void setAttributeSet(AttributeSet attrs) { } public void paintIcon(ComponentDrawContext c, int x, int y) { } @Override public String toString() { return getName(); } // This was the draw method until 2.0.4 - As of 2.0.5, you should // use the other draw method. public void draw(ComponentDrawContext context) { } public void draw(Canvas canvas, ComponentDrawContext context) { draw(context); } public Set getHiddenComponents(Canvas canvas) { return null; } public void select(Canvas canvas) { } public void deselect(Canvas canvas) { } public void mousePressed(Canvas canvas, Graphics g, MouseEvent e) { } public void mouseDragged(Canvas canvas, Graphics g, MouseEvent e) { } public void mouseReleased(Canvas canvas, Graphics g, MouseEvent e) { } public void mouseEntered(Canvas canvas, Graphics g, MouseEvent e) { } public void mouseExited(Canvas canvas, Graphics g, MouseEvent e) { } public void mouseMoved(Canvas canvas, Graphics g, MouseEvent e) { } public void keyTyped(Canvas canvas, KeyEvent e) { } public void keyPressed(Canvas canvas, KeyEvent e) { } public void keyReleased(Canvas canvas, KeyEvent e) { } public Cursor getCursor() { return dflt_cursor; } } logisim-2.7.1/src/com/cburch/logisim/tools/TextTool.java0000644000175000017500000001670511447117126023142 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools; import java.awt.Cursor; import java.awt.Graphics; import java.awt.event.MouseEvent; import java.awt.event.KeyEvent; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.CircuitEvent; import com.cburch.logisim.circuit.CircuitListener; import com.cburch.logisim.circuit.CircuitMutation; import com.cburch.logisim.comp.Component; import com.cburch.logisim.comp.ComponentDrawContext; import com.cburch.logisim.comp.ComponentUserEvent; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Location; import com.cburch.logisim.gui.main.Canvas; import com.cburch.logisim.proj.Action; import com.cburch.logisim.proj.Project; import com.cburch.logisim.std.base.Text; public class TextTool extends Tool { private class MyListener implements CaretListener, CircuitListener { public void editingCanceled(CaretEvent e) { if (e.getCaret() != caret) { e.getCaret().removeCaretListener(this); return; } caret.removeCaretListener(this); caretCircuit.removeCircuitListener(this); caretCircuit = null; caretComponent = null; caretCreatingText = false; caret = null; } public void editingStopped(CaretEvent e) { if (e.getCaret() != caret) { e.getCaret().removeCaretListener(this); return; } caret.removeCaretListener(this); caretCircuit.removeCircuitListener(this); String val = caret.getText(); boolean isEmpty = (val == null || val.equals("")); Action a; Project proj = caretCanvas.getProject(); if (caretCreatingText) { if (!isEmpty) { CircuitMutation xn = new CircuitMutation(caretCircuit); xn.add(caretComponent); a = xn.toAction(Strings.getter("addComponentAction", Text.FACTORY.getDisplayGetter())); } else { a = null; // don't add the blank text field } } else { if (isEmpty && caretComponent.getFactory() instanceof Text) { CircuitMutation xn = new CircuitMutation(caretCircuit); xn.add(caretComponent); a = xn.toAction(Strings.getter("removeComponentAction", Text.FACTORY.getDisplayGetter())); } else { Object obj = caretComponent.getFeature(TextEditable.class); if (obj == null) { // should never happen a = null; } else { TextEditable editable = (TextEditable) obj; a = editable.getCommitAction(caretCircuit, e.getOldText(), e.getText()); } } } caretCircuit = null; caretComponent = null; caretCreatingText = false; caret = null; if (a != null) proj.doAction(a); } public void circuitChanged(CircuitEvent event) { if (event.getCircuit() != caretCircuit) { event.getCircuit().removeCircuitListener(this); return; } int action = event.getAction(); if (action == CircuitEvent.ACTION_REMOVE) { if (event.getData() == caretComponent) { caret.cancelEditing(); } } else if (action == CircuitEvent.ACTION_CLEAR) { if (caretComponent != null) { caret.cancelEditing(); } } } } private static Cursor cursor = Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR); private MyListener listener = new MyListener(); private AttributeSet attrs; private Caret caret = null; private boolean caretCreatingText = false; private Canvas caretCanvas = null; private Circuit caretCircuit = null; private Component caretComponent = null; public TextTool() { attrs = Text.FACTORY.createAttributeSet(); } @Override public boolean equals(Object other) { return other instanceof TextTool; } @Override public int hashCode() { return TextTool.class.hashCode(); } @Override public String getName() { return "Text Tool"; } @Override public String getDisplayName() { return Strings.get("textTool"); } @Override public String getDescription() { return Strings.get("textToolDesc"); } @Override public AttributeSet getAttributeSet() { return attrs; } @Override public void paintIcon(ComponentDrawContext c, int x, int y) { Text.FACTORY.paintIcon(c, x, y, null); } @Override public void draw(Canvas canvas, ComponentDrawContext context) { if (caret != null) caret.draw(context.getGraphics()); } @Override public void deselect(Canvas canvas) { if (caret != null) { caret.stopEditing(); caret = null; } } @Override public void mousePressed(Canvas canvas, Graphics g, MouseEvent e) { Project proj = canvas.getProject(); Circuit circ = canvas.getCircuit(); if (!proj.getLogisimFile().contains(circ)) { if (caret != null) caret.cancelEditing(); canvas.setErrorMessage(Strings.getter("cannotModifyError")); return; } // Maybe user is clicking within the current caret. if (caret != null) { if (caret.getBounds(g).contains(e.getX(), e.getY())) { // Yes caret.mousePressed(e); proj.repaintCanvas(); return; } else { // No. End the current caret. caret.stopEditing(); } } // caret will be null at this point // Otherwise search for a new caret. int x = e.getX(); int y = e.getY(); Location loc = Location.create(x, y); ComponentUserEvent event = new ComponentUserEvent(canvas, x, y); // First search in selection. for (Component comp : proj.getSelection().getComponentsContaining(loc, g)) { TextEditable editable = (TextEditable) comp.getFeature(TextEditable.class); if (editable != null) { caret = editable.getTextCaret(event); if (caret != null) { proj.getFrame().viewComponentAttributes(circ, comp); caretComponent = comp; caretCreatingText = false; break; } } } // Then search in circuit if (caret == null) { for (Component comp : circ.getAllContaining(loc, g)) { TextEditable editable = (TextEditable) comp.getFeature(TextEditable.class); if (editable != null) { caret = editable.getTextCaret(event); if (caret != null) { proj.getFrame().viewComponentAttributes(circ, comp); caretComponent = comp; caretCreatingText = false; break; } } } } // if nothing found, create a new label if (caret == null) { if (loc.getX() < 0 || loc.getY() < 0) return; AttributeSet copy = (AttributeSet) attrs.clone(); caretComponent = Text.FACTORY.createComponent(loc, copy); caretCreatingText = true; TextEditable editable = (TextEditable) caretComponent.getFeature(TextEditable.class); if (editable != null) { caret = editable.getTextCaret(event); proj.getFrame().viewComponentAttributes(circ, caretComponent); } } if (caret != null) { caretCanvas = canvas; caretCircuit = canvas.getCircuit(); caret.addCaretListener(listener); caretCircuit.addCircuitListener(listener); } proj.repaintCanvas(); } @Override public void mouseDragged(Canvas canvas, Graphics g, MouseEvent e) { //TODO: enhance label editing } @Override public void mouseReleased(Canvas canvas, Graphics g, MouseEvent e) { //TODO: enhance label editing } @Override public void keyPressed(Canvas canvas, KeyEvent e) { if (caret != null) { caret.keyPressed(e); canvas.getProject().repaintCanvas(); } } @Override public void keyReleased(Canvas canvas, KeyEvent e) { if (caret != null) { caret.keyReleased(e); canvas.getProject().repaintCanvas(); } } @Override public void keyTyped(Canvas canvas, KeyEvent e) { if (caret != null) { caret.keyTyped(e); canvas.getProject().repaintCanvas(); } } @Override public Cursor getCursor() { return cursor; } } logisim-2.7.1/src/com/cburch/logisim/tools/TextEditable.java0000644000175000017500000000074611446034522023731 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.comp.ComponentUserEvent; import com.cburch.logisim.proj.Action; public interface TextEditable { public Caret getTextCaret(ComponentUserEvent event); public Action getCommitAction(Circuit circuit, String oldText, String newText); } logisim-2.7.1/src/com/cburch/logisim/tools/Strings.java0000644000175000017500000000117611451540056023002 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.StringGetter; class Strings { private static LocaleManager source = new LocaleManager("resources/logisim", "tools"); public static String get(String key) { return source.get(key); } public static StringGetter getter(String key) { return source.getter(key); } public static StringGetter getter(String key, StringGetter arg) { return source.getter(key, arg); } } logisim-2.7.1/src/com/cburch/logisim/tools/SetAttributeAction.java0000644000175000017500000000513111446034522025121 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools; import java.util.ArrayList; import java.util.List; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.CircuitMutation; import com.cburch.logisim.circuit.CircuitTransaction; import com.cburch.logisim.circuit.CircuitTransactionResult; import com.cburch.logisim.comp.Component; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.proj.Action; import com.cburch.logisim.proj.Project; import com.cburch.logisim.util.StringGetter; public class SetAttributeAction extends Action { private StringGetter nameGetter; private Circuit circuit; private List comps; private List> attrs; private List values; private List oldValues; private CircuitTransaction xnReverse; public SetAttributeAction(Circuit circuit, StringGetter nameGetter) { this.nameGetter = nameGetter; this.circuit = circuit; this.comps = new ArrayList(); this.attrs = new ArrayList>(); this.values = new ArrayList(); this.oldValues = new ArrayList(); } public void set(Component comp, Attribute attr, Object value) { @SuppressWarnings("unchecked") Attribute a = (Attribute) attr; comps.add(comp); attrs.add(a); values.add(value); } public boolean isEmpty() { return comps.isEmpty(); } @Override public String getName() { return nameGetter.get(); } @Override public void doIt(Project proj) { CircuitMutation xn = new CircuitMutation(circuit); int len = values.size(); oldValues.clear(); for (int i = 0; i < len; i++) { Component comp = comps.get(i); Attribute attr = attrs.get(i); Object value = values.get(i); if (circuit.contains(comp)) { oldValues.add(null); xn.set(comp, attr, value); } else { AttributeSet compAttrs = comp.getAttributeSet(); oldValues.add(compAttrs.getValue(attr)); compAttrs.setValue(attr, value); } } if (!xn.isEmpty()) { CircuitTransactionResult result = xn.execute(); xnReverse = result.getReverseTransaction(); } } @Override public void undo(Project proj) { if (xnReverse != null) xnReverse.execute(); for (int i = oldValues.size() - 1; i >= 0; i--) { Component comp = comps.get(i); Attribute attr = attrs.get(i); Object value = oldValues.get(i); if (value != null) { comp.getAttributeSet().setValue(attr, value); } } } } logisim-2.7.1/src/com/cburch/logisim/tools/SelectTool.java0000644000175000017500000004117711527054322023433 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools; import java.awt.Color; import java.awt.Cursor; import java.awt.Graphics; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import javax.swing.Icon; import com.cburch.logisim.LogisimVersion; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.ReplacementMap; import com.cburch.logisim.circuit.Wire; import com.cburch.logisim.comp.Component; import com.cburch.logisim.comp.ComponentDrawContext; import com.cburch.logisim.comp.ComponentFactory; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Location; import com.cburch.logisim.gui.main.Canvas; import com.cburch.logisim.gui.main.Selection; import com.cburch.logisim.gui.main.SelectionActions; import com.cburch.logisim.gui.main.Selection.Event; import com.cburch.logisim.prefs.AppPreferences; import com.cburch.logisim.proj.Action; import com.cburch.logisim.proj.Project; import com.cburch.logisim.tools.key.KeyConfigurationEvent; import com.cburch.logisim.tools.key.KeyConfigurator; import com.cburch.logisim.tools.key.KeyConfigurationResult; import com.cburch.logisim.tools.move.MoveResult; import com.cburch.logisim.tools.move.MoveGesture; import com.cburch.logisim.tools.move.MoveRequestListener; import com.cburch.logisim.util.GraphicsUtil; import com.cburch.logisim.util.Icons; import com.cburch.logisim.util.StringGetter; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; public class SelectTool extends Tool { private static final Cursor selectCursor = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR); private static final Cursor rectSelectCursor = Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR); private static final Cursor moveCursor = Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR); private static final int IDLE = 0; private static final int MOVING = 1; private static final int RECT_SELECT = 2; private static final Icon toolIcon = Icons.getIcon("select.gif"); private static final Color COLOR_UNMATCHED = new Color(192, 0, 0); private static final Color COLOR_COMPUTING = new Color(96, 192, 96); private static final Color COLOR_RECT_SELECT = new Color(0, 64, 128, 255); private static final Color BACKGROUND_RECT_SELECT = new Color(192, 192, 255, 192); private static class MoveRequestHandler implements MoveRequestListener { private Canvas canvas; MoveRequestHandler(Canvas canvas) { this.canvas = canvas; } public void requestSatisfied(MoveGesture gesture, int dx, int dy) { clearCanvasMessage(canvas, dx, dy); } } private class Listener implements Selection.Listener { public void selectionChanged(Event event) { keyHandlers = null; } } private Location start; private int state; private int curDx; private int curDy; private boolean drawConnections; private MoveGesture moveGesture; private HashMap keyHandlers; private HashSet selectionsAdded; private Listener selListener; public SelectTool() { start = null; state = IDLE; selectionsAdded = new HashSet(); selListener = new Listener(); keyHandlers = null; } @Override public boolean equals(Object other) { return other instanceof SelectTool; } @Override public int hashCode() { return SelectTool.class.hashCode(); } @Override public String getName() { return "Select Tool"; } @Override public String getDisplayName() { return Strings.get("selectTool"); } @Override public String getDescription() { return Strings.get("selectToolDesc"); } @Override public AttributeSet getAttributeSet(Canvas canvas) { return canvas.getSelection().getAttributeSet(); } @Override public boolean isAllDefaultValues(AttributeSet attrs, LogisimVersion ver) { return true; } @Override public void draw(Canvas canvas, ComponentDrawContext context) { Project proj = canvas.getProject(); int dx = curDx; int dy = curDy; if (state == MOVING) { proj.getSelection().drawGhostsShifted(context, dx, dy); MoveGesture gesture = moveGesture; if (gesture != null && drawConnections && (dx != 0 || dy != 0)) { MoveResult result = gesture.findResult(dx, dy); if (result != null) { Collection wiresToAdd = result.getWiresToAdd(); Graphics g = context.getGraphics(); GraphicsUtil.switchToWidth(g, 3); g.setColor(Color.GRAY); for (Wire w : wiresToAdd) { Location loc0 = w.getEnd0(); Location loc1 = w.getEnd1(); g.drawLine(loc0.getX(), loc0.getY(), loc1.getX(), loc1.getY()); } GraphicsUtil.switchToWidth(g, 1); g.setColor(COLOR_UNMATCHED); for (Location conn : result.getUnconnectedLocations()) { int connX = conn.getX(); int connY = conn.getY(); g.fillOval(connX - 3, connY - 3, 6, 6); g.fillOval(connX + dx - 3, connY + dy - 3, 6, 6); } } } } else if (state == RECT_SELECT) { int left = start.getX(); int right = left + dx; if (left > right) { int i = left; left = right; right = i; } int top = start.getY(); int bot = top + dy; if (top > bot) { int i = top; top = bot; bot = i; } Graphics gBase = context.getGraphics(); int w = right - left - 1; int h = bot - top - 1; if (w > 2 && h > 2) { gBase.setColor(BACKGROUND_RECT_SELECT); gBase.fillRect(left + 1, top + 1, w - 1, h - 1); } Circuit circ = canvas.getCircuit(); Bounds bds = Bounds.create(left, top, right - left, bot - top); for (Component c : circ.getAllWithin(bds)) { Location cloc = c.getLocation(); Graphics gDup = gBase.create(); context.setGraphics(gDup); c.getFactory().drawGhost(context, COLOR_RECT_SELECT, cloc.getX(), cloc.getY(), c.getAttributeSet()); gDup.dispose(); } gBase.setColor(COLOR_RECT_SELECT); GraphicsUtil.switchToWidth(gBase, 2); if (w < 0) w = 0; if (h < 0) h = 0; gBase.drawRect(left, top, w, h); } } @Override public void select(Canvas canvas) { Selection sel = canvas.getSelection(); if (!selectionsAdded.contains(sel)) { sel.addListener(selListener); } } @Override public void deselect(Canvas canvas) { moveGesture = null; } @Override public void mouseEntered(Canvas canvas, Graphics g, MouseEvent e) { canvas.requestFocusInWindow(); } @Override public void mousePressed(Canvas canvas, Graphics g, MouseEvent e) { Project proj = canvas.getProject(); Selection sel = proj.getSelection(); Circuit circuit = canvas.getCircuit(); start = Location.create(e.getX(), e.getY()); curDx = 0; curDy = 0; moveGesture = null; // if the user clicks into the selection, // selection is being modified Collection in_sel = sel.getComponentsContaining(start, g); if (!in_sel.isEmpty()) { if ((e.getModifiers() & InputEvent.SHIFT_MASK) == 0) { setState(proj, MOVING); proj.repaintCanvas(); return; } else { Action act = SelectionActions.drop(sel, in_sel); if (act != null) { proj.doAction(act); } } } // if the user clicks into a component outside selection, user // wants to add/reset selection Collection clicked = circuit.getAllContaining(start, g); if (!clicked.isEmpty()) { if ((e.getModifiers() & InputEvent.SHIFT_MASK) == 0) { if (sel.getComponentsContaining(start).isEmpty()) { Action act = SelectionActions.dropAll(sel); if (act != null) { proj.doAction(act); } } } for (Component comp : clicked) { if (!in_sel.contains(comp)) { sel.add(comp); } } setState(proj, MOVING); proj.repaintCanvas(); return; } // The user clicked on the background. This is a rectangular // selection (maybe with the shift key down). if ((e.getModifiers() & InputEvent.SHIFT_MASK) == 0) { Action act = SelectionActions.dropAll(sel); if (act != null) { proj.doAction(act); } } setState(proj, RECT_SELECT); proj.repaintCanvas(); } @Override public void mouseDragged(Canvas canvas, Graphics g, MouseEvent e) { if (state == MOVING) { Project proj = canvas.getProject(); computeDxDy(proj, e, g); handleMoveDrag(canvas, curDx, curDy, e.getModifiersEx()); } else if (state == RECT_SELECT) { Project proj = canvas.getProject(); curDx = e.getX() - start.getX(); curDy = e.getY() - start.getY(); proj.repaintCanvas(); } } private void handleMoveDrag(Canvas canvas, int dx, int dy, int modsEx) { boolean connect = shouldConnect(canvas, modsEx); drawConnections = connect; if (connect) { MoveGesture gesture = moveGesture; if (gesture == null) { gesture = new MoveGesture(new MoveRequestHandler(canvas), canvas.getCircuit(), canvas.getSelection().getAnchoredComponents()); moveGesture = gesture; } if (dx != 0 || dy != 0) { boolean queued = gesture.enqueueRequest(dx, dy); if (queued) { canvas.setErrorMessage(new ComputingMessage(dx, dy), COLOR_COMPUTING); // maybe CPU scheduled led the request to be satisfied // just before the "if(queued)" statement. In any case, it // doesn't hurt to check to ensure the message belongs. if (gesture.findResult(dx, dy) != null) { clearCanvasMessage(canvas, dx, dy); } } } } canvas.repaint(); } private boolean shouldConnect(Canvas canvas, int modsEx) { boolean shiftReleased = (modsEx & MouseEvent.SHIFT_DOWN_MASK) == 0; boolean dflt = AppPreferences.MOVE_KEEP_CONNECT.getBoolean(); if (shiftReleased) { return dflt; } else { return !dflt; } } @Override public void mouseReleased(Canvas canvas, Graphics g, MouseEvent e) { Project proj = canvas.getProject(); if (state == MOVING) { setState(proj, IDLE); computeDxDy(proj, e, g); int dx = curDx; int dy = curDy; if (dx != 0 || dy != 0) { if (!proj.getLogisimFile().contains(canvas.getCircuit())) { canvas.setErrorMessage(Strings.getter("cannotModifyError")); } else if (proj.getSelection().hasConflictWhenMoved(dx, dy)) { canvas.setErrorMessage(Strings.getter("exclusiveError")); } else { boolean connect = shouldConnect(canvas, e.getModifiersEx()); drawConnections = false; ReplacementMap repl; if (connect) { MoveGesture gesture = moveGesture; if (gesture == null) { gesture = new MoveGesture(new MoveRequestHandler(canvas), canvas.getCircuit(), canvas.getSelection().getAnchoredComponents()); } canvas.setErrorMessage(new ComputingMessage(dx, dy), COLOR_COMPUTING); MoveResult result = gesture.forceRequest(dx, dy); clearCanvasMessage(canvas, dx, dy); repl = result.getReplacementMap(); } else { repl = null; } Selection sel = proj.getSelection(); proj.doAction(SelectionActions.translate(sel, dx, dy, repl)); } } moveGesture = null; proj.repaintCanvas(); } else if (state == RECT_SELECT) { Bounds bds = Bounds.create(start).add(start.getX() + curDx, start.getY() + curDy); Circuit circuit = canvas.getCircuit(); Selection sel = proj.getSelection(); Collection in_sel = sel.getComponentsWithin(bds, g); for (Component comp : circuit.getAllWithin(bds, g)) { if (!in_sel.contains(comp)) sel.add(comp); } Action act = SelectionActions.drop(sel, in_sel); if (act != null) { proj.doAction(act); } setState(proj, IDLE); proj.repaintCanvas(); } } @Override public void keyPressed(Canvas canvas, KeyEvent e) { if (state == MOVING && e.getKeyCode() == KeyEvent.VK_SHIFT) { handleMoveDrag(canvas, curDx, curDy, e.getModifiersEx()); } else { switch (e.getKeyCode()) { case KeyEvent.VK_BACK_SPACE: case KeyEvent.VK_DELETE: if (!canvas.getSelection().isEmpty()) { Action act = SelectionActions.clear(canvas.getSelection()); canvas.getProject().doAction(act); e.consume(); } break; default: processKeyEvent(canvas, e, KeyConfigurationEvent.KEY_PRESSED); } } } @Override public void keyReleased(Canvas canvas, KeyEvent e) { if (state == MOVING && e.getKeyCode() == KeyEvent.VK_SHIFT) { handleMoveDrag(canvas, curDx, curDy, e.getModifiersEx()); } else { processKeyEvent(canvas, e, KeyConfigurationEvent.KEY_RELEASED); } } @Override public void keyTyped(Canvas canvas, KeyEvent e) { processKeyEvent(canvas, e, KeyConfigurationEvent.KEY_TYPED); } private void processKeyEvent(Canvas canvas, KeyEvent e, int type) { HashMap handlers = keyHandlers; if (handlers == null) { handlers = new HashMap(); Selection sel = canvas.getSelection(); for (Component comp : sel.getComponents()) { ComponentFactory factory = comp.getFactory(); AttributeSet attrs = comp.getAttributeSet(); Object handler = factory.getFeature(KeyConfigurator.class, attrs); if (handler != null) { KeyConfigurator base = (KeyConfigurator) handler; handlers.put(comp, base.clone()); } } keyHandlers = handlers; } if (!handlers.isEmpty()) { boolean consume = false; ArrayList results; results = new ArrayList(); for (Map.Entry entry : handlers.entrySet()) { Component comp = entry.getKey(); KeyConfigurator handler = entry.getValue(); KeyConfigurationEvent event = new KeyConfigurationEvent(type, comp.getAttributeSet(), e, comp); KeyConfigurationResult result = handler.keyEventReceived(event); consume |= event.isConsumed(); if (result != null) { results.add(result); } } if (consume) { e.consume(); } if (!results.isEmpty()) { SetAttributeAction act = new SetAttributeAction(canvas.getCircuit(), Strings.getter("changeComponentAttributesAction")); for (KeyConfigurationResult result : results) { Component comp = (Component) result.getEvent().getData(); Map,Object> newValues = result.getAttributeValues(); for (Map.Entry,Object> entry : newValues.entrySet()) { act.set(comp, entry.getKey(), entry.getValue()); } } if (!act.isEmpty()) { canvas.getProject().doAction(act); } } } } private void computeDxDy(Project proj, MouseEvent e, Graphics g) { Bounds bds = proj.getSelection().getBounds(g); int dx; int dy; if (bds == Bounds.EMPTY_BOUNDS) { dx = e.getX() - start.getX(); dy = e.getY() - start.getY(); } else { dx = Math.max(e.getX() - start.getX(), -bds.getX()); dy = Math.max(e.getY() - start.getY(), -bds.getY()); } Selection sel = proj.getSelection(); if (sel.shouldSnap()) { dx = Canvas.snapXToGrid(dx); dy = Canvas.snapYToGrid(dy); } curDx = dx; curDy = dy; } @Override public void paintIcon(ComponentDrawContext c, int x, int y) { Graphics g = c.getGraphics(); if (toolIcon != null) { toolIcon.paintIcon(c.getDestination(), g, x + 2, y + 2); } else { int[] xp = { x+ 5, x+ 5, x+ 9, x+12, x+14, x+11, x+16 }; int[] yp = { y , y+17, y+12, y+18, y+18, y+12, y+12 }; g.setColor(java.awt.Color.black); g.fillPolygon(xp, yp, xp.length); } } @Override public Cursor getCursor() { return state == IDLE ? selectCursor : (state == RECT_SELECT ? rectSelectCursor : moveCursor); } @Override public Set getHiddenComponents(Canvas canvas) { if (state == MOVING) { int dx = curDx; int dy = curDy; if (dx == 0 && dy == 0) { return null; } Set sel = canvas.getSelection().getComponents(); MoveGesture gesture = moveGesture; if (gesture != null && drawConnections) { MoveResult result = gesture.findResult(dx, dy); if (result != null) { HashSet ret = new HashSet(sel); ret.addAll(result.getReplacementMap().getRemovals()); return ret; } } return sel; } else { return null; } } private void setState(Project proj, int new_state) { if (state == new_state) return; // do nothing if state not new state = new_state; proj.getFrame().getCanvas().setCursor(getCursor()); } private static void clearCanvasMessage(Canvas canvas, int dx, int dy) { Object getter = canvas.getErrorMessage(); if (getter instanceof ComputingMessage) { ComputingMessage msg = (ComputingMessage) getter; if (msg.dx == dx && msg.dy == dy) { canvas.setErrorMessage(null); canvas.repaint(); } } } private static class ComputingMessage implements StringGetter { private int dx; private int dy; public ComputingMessage(int dx, int dy) { this.dx = dx; this.dy = dy; } public String get() { return Strings.get("moveWorkingMsg"); } } } logisim-2.7.1/src/com/cburch/logisim/tools/PokeTool.java0000644000175000017500000001561411534737550023120 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools; import java.awt.Cursor; import java.awt.Color; import java.awt.Graphics; import java.awt.FontMetrics; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import javax.swing.Icon; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.CircuitEvent; import com.cburch.logisim.circuit.CircuitListener; import com.cburch.logisim.circuit.RadixOption; import com.cburch.logisim.circuit.Wire; import com.cburch.logisim.circuit.WireSet; import com.cburch.logisim.comp.Component; import com.cburch.logisim.comp.ComponentDrawContext; import com.cburch.logisim.comp.ComponentUserEvent; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.gui.main.Canvas; import com.cburch.logisim.prefs.AppPreferences; import com.cburch.logisim.proj.Project; import com.cburch.logisim.util.Icons; public class PokeTool extends Tool { private static final Icon toolIcon = Icons.getIcon("poke.gif"); private static final Color caretColor = new Color(255, 255, 150); private static class WireCaret extends AbstractCaret { AttributeSet opts; Canvas canvas; Wire wire; int x; int y; WireCaret(Canvas c, Wire w, int x, int y, AttributeSet opts) { canvas = c; wire = w; this.x = x; this.y = y; this.opts = opts; } @Override public void draw(Graphics g) { Value v = canvas.getCircuitState().getValue(wire.getEnd0()); RadixOption radix1 = RadixOption.decode(AppPreferences.POKE_WIRE_RADIX1.get()); RadixOption radix2 = RadixOption.decode(AppPreferences.POKE_WIRE_RADIX2.get()); if (radix1 == null) radix1 = RadixOption.RADIX_2; String vStr = radix1.toString(v); if (radix2 != null && v.getWidth() > 1) { vStr += " / " + radix2.toString(v); } FontMetrics fm = g.getFontMetrics(); g.setColor(caretColor); g.fillRect(x + 2, y + 2, fm.stringWidth(vStr) + 4, fm.getAscent() + fm.getDescent() + 4); g.setColor(Color.BLACK); g.drawRect(x + 2, y + 2, fm.stringWidth(vStr) + 4, fm.getAscent() + fm.getDescent() + 4); g.fillOval(x - 2, y - 2, 5, 5); g.drawString(vStr, x + 4, y + 4 + fm.getAscent()); } } private class Listener implements CircuitListener { public void circuitChanged(CircuitEvent event) { Circuit circ = pokedCircuit; if (event.getCircuit() == circ && circ != null && (event.getAction() == CircuitEvent.ACTION_REMOVE || event.getAction() == CircuitEvent.ACTION_CLEAR) && !circ.contains(pokedComponent)) { removeCaret(false); } } } private static Cursor cursor = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR); private Listener listener; private Circuit pokedCircuit; private Component pokedComponent; private Caret pokeCaret; public PokeTool() { this.listener = new Listener(); } @Override public boolean equals(Object other) { return other instanceof PokeTool; } @Override public int hashCode() { return PokeTool.class.hashCode(); } @Override public String getName() { return "Poke Tool"; } @Override public String getDisplayName() { return Strings.get("pokeTool"); } private void removeCaret(boolean normal) { Circuit circ = pokedCircuit; Caret caret = pokeCaret; if (caret != null) { if (normal) caret.stopEditing(); else caret.cancelEditing(); circ.removeCircuitListener(listener); pokedCircuit = null; pokedComponent = null; pokeCaret = null; } } private void setPokedComponent(Circuit circ, Component comp, Caret caret) { removeCaret(true); pokedCircuit = circ; pokedComponent = comp; pokeCaret = caret; if (caret != null) { circ.addCircuitListener(listener); } } @Override public String getDescription() { return Strings.get("pokeToolDesc"); } @Override public void draw(Canvas canvas, ComponentDrawContext context) { if (pokeCaret != null) pokeCaret.draw(context.getGraphics()); } @Override public void deselect(Canvas canvas) { removeCaret(true); canvas.setHighlightedWires(WireSet.EMPTY); } @Override public void mousePressed(Canvas canvas, Graphics g, MouseEvent e) { int x = e.getX(); int y = e.getY(); Location loc = Location.create(x, y); boolean dirty = false; canvas.setHighlightedWires(WireSet.EMPTY); if (pokeCaret != null && !pokeCaret.getBounds(g).contains(loc)) { dirty = true; removeCaret(true); } if (pokeCaret == null) { ComponentUserEvent event = new ComponentUserEvent(canvas, x, y); Circuit circ = canvas.getCircuit(); for (Component c : circ.getAllContaining(loc, g)) { if (pokeCaret != null) break; if (c instanceof Wire) { Caret caret = new WireCaret(canvas, (Wire) c, x, y, canvas.getProject().getOptions().getAttributeSet()); setPokedComponent(circ, c, caret); canvas.setHighlightedWires(circ.getWireSet((Wire) c)); } else { Pokable p = (Pokable) c.getFeature(Pokable.class); if (p != null) { Caret caret = p.getPokeCaret(event); setPokedComponent(circ, c, caret); AttributeSet attrs = c.getAttributeSet(); if (attrs != null && attrs.getAttributes().size() > 0) { Project proj = canvas.getProject(); proj.getFrame().viewComponentAttributes(circ, c); } } } } } if (pokeCaret != null) { dirty = true; pokeCaret.mousePressed(e); } if (dirty) canvas.getProject().repaintCanvas(); } @Override public void mouseDragged(Canvas canvas, Graphics g, MouseEvent e) { if (pokeCaret != null) { pokeCaret.mouseDragged(e); canvas.getProject().repaintCanvas(); } } @Override public void mouseReleased(Canvas canvas, Graphics g, MouseEvent e) { if (pokeCaret != null) { pokeCaret.mouseReleased(e); canvas.getProject().repaintCanvas(); } } @Override public void keyTyped(Canvas canvas, KeyEvent e) { if (pokeCaret != null) { pokeCaret.keyTyped(e); canvas.getProject().repaintCanvas(); } } @Override public void keyPressed(Canvas canvas, KeyEvent e) { if (pokeCaret != null) { pokeCaret.keyPressed(e); canvas.getProject().repaintCanvas(); } } @Override public void keyReleased(Canvas canvas, KeyEvent e) { if (pokeCaret != null) { pokeCaret.keyReleased(e); canvas.getProject().repaintCanvas(); } } @Override public void paintIcon(ComponentDrawContext c, int x, int y) { Graphics g = c.getGraphics(); if (toolIcon != null) { toolIcon.paintIcon(c.getDestination(), g, x + 2, y + 2); } else { g.setColor(java.awt.Color.black); g.drawLine(x + 4, y + 2, x + 4, y + 17); g.drawLine(x + 4, y + 17, x + 1, y + 11); g.drawLine(x + 4, y + 17, x + 7, y + 11); g.drawLine(x + 15, y + 2, x + 15, y + 17); g.drawLine(x + 15, y + 2, x + 12, y + 8); g.drawLine(x + 15, y + 2, x + 18, y + 8); } } @Override public Cursor getCursor() { return cursor; } } logisim-2.7.1/src/com/cburch/logisim/tools/Pokable.java0000644000175000017500000000047611446034522022730 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools; import com.cburch.logisim.comp.ComponentUserEvent; public interface Pokable { public Caret getPokeCaret(ComponentUserEvent event); } logisim-2.7.1/src/com/cburch/logisim/tools/move/0000755000175000017500000000000011532066746021460 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/logisim/tools/move/SearchNode.java0000644000175000017500000001024511532066726024336 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools.move; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; class SearchNode implements Comparable { private static final int CROSSING_PENALTY = 20; private static final int TURN_PENALTY = 50; private final Location loc; private final Direction dir; private ConnectionData conn; private final Location dest; private int dist; private int heur; private boolean extendsWire; private SearchNode prev; public SearchNode(ConnectionData conn, Location src, Direction srcDir, Location dst) { this(src, srcDir, conn, dst, 0, srcDir != null, null); } private SearchNode(Location loc, Direction dir, ConnectionData conn, Location dest, int dist, boolean extendsWire, SearchNode prev) { this.loc = loc; this.dir = dir; this.conn = conn; this.dest = dest; this.dist = dist; this.heur = dist + this.getHeuristic(); this.extendsWire = extendsWire; this.prev = prev; } private int getHeuristic() { Location cur = loc; Location dst = dest; Direction curDir = dir; int dx = dst.getX() - cur.getX(); int dy = dst.getY() - cur.getY(); int ret = -1; if (extendsWire) { ret = -1; if (curDir == Direction.EAST) { if (dx > 0) ret = dx / 10 * 9 + Math.abs(dy); } else if (curDir == Direction.WEST) { if (dx < 0) ret = -dx / 10 * 9 + Math.abs(dy); } else if (curDir == Direction.SOUTH) { if (dy > 0) ret = Math.abs(dx) + dy / 10 * 9; } else if (curDir == Direction.NORTH) { if (dy < 0) ret = Math.abs(dx) - dy / 10 * 9; } } if (ret < 0) { ret = Math.abs(dx) + Math.abs(dy); } boolean penalizeDoubleTurn = false; if (curDir == Direction.EAST) { penalizeDoubleTurn = dx < 0; } else if (curDir == Direction.WEST) { penalizeDoubleTurn = dx > 0; } else if (curDir == Direction.NORTH) { penalizeDoubleTurn = dy > 0; } else if (curDir == Direction.SOUTH) { penalizeDoubleTurn = dy < 0; } else if (curDir == null) { if (dx != 0 || dy != 0) ret += TURN_PENALTY; } if (penalizeDoubleTurn) { ret += 2 * TURN_PENALTY; } else if (dx != 0 && dy != 0) { ret += TURN_PENALTY; } return ret; } public SearchNode next(Direction moveDir, boolean crossing) { int newDist = dist; Direction connDir = conn.getDirection(); Location nextLoc = loc.translate(moveDir, 10); boolean exWire = extendsWire && moveDir == connDir; if (exWire) { newDist += 9; } else { newDist += 10; } if (crossing) newDist += CROSSING_PENALTY; if (moveDir != dir) newDist += TURN_PENALTY; if (nextLoc.getX() < 0 || nextLoc.getY() < 0) { return null; } else { return new SearchNode(nextLoc, moveDir, conn, dest, newDist, exWire, this); } } public boolean isStart() { return prev == null; } public boolean isDestination() { return dest.equals(loc); } public SearchNode getPrevious() { return prev; } public int getDistance() { return dist; } public Location getLocation() { return loc; } public Direction getDirection() { return dir; } public int getHeuristicValue() { return heur; } public Location getDestination() { return dest; } public boolean isExtendingWire() { return extendsWire; } public ConnectionData getConnection() { return conn; } @Override public boolean equals(Object other) { if (other instanceof SearchNode) { SearchNode o = (SearchNode) other; return this.loc.equals(o.loc) && (this.dir == null ? o.dir == null : this.dir.equals(o.dir)) && this.dest.equals(o.dest); } else { return false; } } @Override public int hashCode() { int dirHash = dir == null ? 0 : dir.hashCode(); return ((loc.hashCode() * 31) + dirHash) * 31 + dest.hashCode(); } public int compareTo(SearchNode o) { int ret = this.heur - o.heur; if (ret == 0) { return this.hashCode() - o.hashCode(); } else { return ret; } } @Override public String toString() { return loc + "/" + (dir == null ? "null" : dir.toString()) + (extendsWire ? "+" : "-") + "/" + dest + ":" + dist + "+" + (heur-dist); } } logisim-2.7.1/src/com/cburch/logisim/tools/move/MoveResult.java0000644000175000017500000000500411500267124024413 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools.move; import java.io.PrintStream; import java.util.ArrayList; import java.util.Collection; import com.cburch.logisim.circuit.ReplacementMap; import com.cburch.logisim.circuit.Wire; import com.cburch.logisim.comp.Component; import com.cburch.logisim.data.Location; public class MoveResult { private ReplacementMap replacements; private Collection unsatisfiedConnections; private Collection unconnectedLocations; private int totalDistance; public MoveResult(MoveRequest request, ReplacementMap replacements, Collection unsatisfiedConnections, int totalDistance) { this.replacements = replacements; this.unsatisfiedConnections = unsatisfiedConnections; this.totalDistance = totalDistance; ArrayList unconnected = new ArrayList(); for (ConnectionData conn : unsatisfiedConnections) { unconnected.add(conn.getLocation()); } unconnectedLocations = unconnected; } void addUnsatisfiedConnections(Collection toAdd) { unsatisfiedConnections.addAll(toAdd); for (ConnectionData conn : toAdd) { unconnectedLocations.add(conn.getLocation()); } } public Collection getWiresToAdd() { @SuppressWarnings("unchecked") Collection ret = (Collection) replacements.getAdditions(); return ret; } public Collection getWiresToRemove() { @SuppressWarnings("unchecked") Collection ret = (Collection) replacements.getAdditions(); return ret; } public ReplacementMap getReplacementMap() { return replacements; } public Collection getUnconnectedLocations() { return unconnectedLocations; } Collection getUnsatisifiedConnections() { return unsatisfiedConnections; } int getTotalDistance() { return totalDistance; } public void print(PrintStream out) { boolean printed = false; for (Component w : replacements.getAdditions()) { printed = true; out.println("add " + w); } for (Component w : replacements.getRemovals()) { printed = true; out.println("del " + w); } for (Component w : replacements.getReplacedComponents()) { printed = true; out.print("repl " + w + " by"); for (Component w2 : replacements.getComponentsReplacing(w)) { out.print(" " + w2); } out.println(); } if (!printed) { out.println("no replacements"); } } } logisim-2.7.1/src/com/cburch/logisim/tools/move/MoveRequestListener.java0000644000175000017500000000045111446034522026277 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools.move; public interface MoveRequestListener { public void requestSatisfied(MoveGesture gesture, int dx, int dy); } logisim-2.7.1/src/com/cburch/logisim/tools/move/MoveRequest.java0000644000175000017500000000155611446034522024600 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools.move; class MoveRequest { private MoveGesture gesture; private int dx; private int dy; public MoveRequest(MoveGesture gesture, int dx, int dy) { this.gesture = gesture; this.dx = dx; this.dy = dy; } public MoveGesture getMoveGesture() { return gesture; } public int getDeltaX() { return dx; } public int getDeltaY() { return dy; } @Override public boolean equals(Object other) { if (other instanceof MoveRequest) { MoveRequest o = (MoveRequest) other; return this.gesture == o.gesture && this.dx == o.dx && this.dy == o.dy; } else { return false; } } @Override public int hashCode() { return (gesture.hashCode() * 31 + dx) * 31 + dy; } } logisim-2.7.1/src/com/cburch/logisim/tools/move/MoveGesture.java0000644000175000017500000001202211447117124024555 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools.move; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Set; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.Wire; import com.cburch.logisim.comp.Component; import com.cburch.logisim.comp.EndData; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; public class MoveGesture { private MoveRequestListener listener; private Circuit circuit; private HashSet selected; private transient Set connections; private transient AvoidanceMap initAvoid; private HashMap cachedResults; public MoveGesture(MoveRequestListener listener, Circuit circuit, Collection selected) { this.listener = listener; this.circuit = circuit; this.selected = new HashSet(selected); this.connections = null; this.initAvoid = null; this.cachedResults = new HashMap(); } HashSet getSelected() { return selected; } AvoidanceMap getFixedAvoidanceMap() { AvoidanceMap ret = initAvoid; if (ret == null) { HashSet comps = new HashSet(circuit.getNonWires()); comps.addAll(circuit.getWires()); comps.removeAll(selected); ret = AvoidanceMap.create(comps, 0, 0); initAvoid = ret; } return ret; } Set getConnections() { Set ret = connections; if (ret == null) { ret = computeConnections(circuit, selected); connections = ret; } return ret; } public MoveResult findResult(int dx, int dy) { MoveRequest request = new MoveRequest(this, dx, dy); synchronized (cachedResults) { return cachedResults.get(request); } } public boolean enqueueRequest(int dx, int dy) { MoveRequest request = new MoveRequest(this, dx, dy); synchronized (cachedResults) { Object result = cachedResults.get(request); if (result == null) { ConnectorThread.enqueueRequest(request, false); return true; } else { return false; } } } public MoveResult forceRequest(int dx, int dy) { MoveRequest request = new MoveRequest(this, dx, dy); ConnectorThread.enqueueRequest(request, true); synchronized (cachedResults) { Object result = cachedResults.get(request); while (result == null) { try { cachedResults.wait(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); return null; } result = cachedResults.get(request); } return (MoveResult) result; } } void notifyResult(MoveRequest request, MoveResult result) { synchronized (cachedResults) { cachedResults.put(request, result); cachedResults.notifyAll(); } if (listener != null) { listener.requestSatisfied(this, request.getDeltaX(), request.getDeltaY()); } } private static Set computeConnections(Circuit circuit, Set selected) { if (selected == null || selected.isEmpty()) return Collections.emptySet(); // first identify locations that might be connected Set locs = new HashSet(); for (Component comp : selected) { for (EndData end : comp.getEnds()) { locs.add(end.getLocation()); } } // now see which of them require connection Set conns = new HashSet(); for (Location loc : locs) { boolean found = false; for (Component comp : circuit.getComponents(loc)) { if (!selected.contains(comp)) { found = true; break; } } if (found) { List wirePath; Location wirePathStart; Wire lastOnPath = findWire(circuit, loc, selected, null); if (lastOnPath == null) { wirePath = Collections.emptyList(); wirePathStart = loc; } else { wirePath = new ArrayList(); Location cur = loc; for (Wire w = lastOnPath; w != null; w = findWire(circuit, cur, selected, w)) { wirePath.add(w); cur = w.getOtherEnd(cur); } Collections.reverse(wirePath); wirePathStart = cur; } Direction dir = null; if (lastOnPath != null) { Location other = lastOnPath.getOtherEnd(loc); int dx = loc.getX() - other.getX(); int dy = loc.getY() - other.getY(); if (Math.abs(dx) > Math.abs(dy)) { dir = dx > 0 ? Direction.EAST : Direction.WEST; } else { dir = dy > 0 ? Direction.SOUTH : Direction.NORTH; } } conns.add(new ConnectionData(loc, dir, wirePath, wirePathStart)); } } return conns; } private static Wire findWire(Circuit circ, Location loc, Set ignore, Wire ignoreW) { Wire ret = null; for (Component comp : circ.getComponents(loc)) { if (!ignore.contains(comp) && comp != ignoreW) { if (ret == null && comp instanceof Wire) { ret = (Wire) comp; } else { return null; } } } return ret; } } logisim-2.7.1/src/com/cburch/logisim/tools/move/ConnectorThread.java0000644000175000017500000000370511532066746025412 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools.move; import com.cburch.logisim.circuit.ReplacementMap; class ConnectorThread extends Thread { private static ConnectorThread INSTANCE = new ConnectorThread(); static { INSTANCE.start(); } public static void enqueueRequest(MoveRequest req, boolean priority) { synchronized (INSTANCE.lock) { if (!req.equals(INSTANCE.processingRequest)) { INSTANCE.nextRequest = req; INSTANCE.overrideRequest = priority; INSTANCE.lock.notifyAll(); } } } public static boolean isOverrideRequested() { return INSTANCE.overrideRequest; } private Object lock; private transient boolean overrideRequest; private MoveRequest nextRequest; private MoveRequest processingRequest; private ConnectorThread() { lock = new Object(); overrideRequest = false; nextRequest = null; } public boolean isAbortRequested() { return overrideRequest; } @Override public void run() { while (true) { MoveRequest req; boolean wasOverride; synchronized (lock) { processingRequest = null; while (nextRequest == null) { try { lock.wait(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); return; } } req = nextRequest; wasOverride = overrideRequest; nextRequest = null; overrideRequest = false; processingRequest = req; } try { MoveResult result = Connector.computeWires(req); if (result != null) { MoveGesture gesture = req.getMoveGesture(); gesture.notifyResult(req, result); } } catch (Throwable t) { t.printStackTrace(); if (wasOverride) { MoveResult result = new MoveResult(req, new ReplacementMap(), req.getMoveGesture().getConnections(), 0); req.getMoveGesture().notifyResult(req, result); } } } } } logisim-2.7.1/src/com/cburch/logisim/tools/move/Connector.java0000644000175000017500000002624211524651462024257 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools.move; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.PriorityQueue; import java.util.Set; import com.cburch.logisim.circuit.ReplacementMap; import com.cburch.logisim.circuit.Wire; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; class Connector { private static final int MAX_SECONDS = 10; private static final int MAX_ORDERING_TRIES = 10; private static final int MAX_SEARCH_ITERATIONS = 20000; private Connector() { } static final String ALLOW_NEITHER = "neither"; static final String ALLOW_VERTICAL = "vert"; static final String ALLOW_HORIZONTAL = "horz"; static MoveResult computeWires(MoveRequest req) { MoveGesture gesture = req.getMoveGesture(); int dx = req.getDeltaX(); int dy = req.getDeltaY(); ArrayList baseConnects; baseConnects = new ArrayList(gesture.getConnections()); ArrayList impossible = pruneImpossible(baseConnects, gesture.getFixedAvoidanceMap(), dx, dy); AvoidanceMap selAvoid = AvoidanceMap.create(gesture.getSelected(), dx, dy); HashMap> pathLocs; pathLocs = new HashMap>(); HashMap> initNodes; initNodes = new HashMap>(); for (ConnectionData conn : baseConnects) { HashSet connLocs = new HashSet(); ArrayList connNodes = new ArrayList(); processConnection(conn, dx, dy, connLocs, connNodes, selAvoid); pathLocs.put(conn, connLocs); initNodes.put(conn, connNodes); } MoveResult bestResult = null; int tries; switch (baseConnects.size()) { case 0: tries = 0; break; case 1: tries = 1; break; case 2: tries = 2; break; case 3: tries = 8; break; default: tries = MAX_ORDERING_TRIES; } long stopTime = System.currentTimeMillis() + MAX_SECONDS * 1000; for (int tryNum = 0; tryNum < tries && stopTime - System.currentTimeMillis() > 0; tryNum++) { if (ConnectorThread.isOverrideRequested()) { return null; } ArrayList connects; connects = new ArrayList(baseConnects); if (tryNum < 2) { sortConnects(connects, dx, dy); if (tryNum == 1) { Collections.reverse(connects); } } else { Collections.shuffle(connects); } MoveResult candidate = tryList(req, gesture, connects, dx, dy, pathLocs, initNodes, stopTime); if (candidate == null) { return null; } else if (bestResult == null) { bestResult = candidate; } else { int unsatisfied1 = bestResult.getUnsatisifiedConnections().size(); int unsatisfied2 = candidate.getUnsatisifiedConnections().size(); if (unsatisfied2 < unsatisfied1) { bestResult = candidate; } else if (unsatisfied2 == unsatisfied1) { int dist1 = bestResult.getTotalDistance(); int dist2 = candidate.getTotalDistance(); if (dist2 < dist1) { bestResult = candidate; } } } } if (bestResult == null) { // should only happen for no connections bestResult = new MoveResult(req, new ReplacementMap(), impossible, 0); } else { bestResult.addUnsatisfiedConnections(impossible); } return bestResult; } private static ArrayList pruneImpossible( ArrayList connects, AvoidanceMap avoid, int dx, int dy) { ArrayList pathWires = new ArrayList(); for (ConnectionData conn : connects) { for (Wire w : conn.getWirePath()) { pathWires.add(w); } } ArrayList impossible = new ArrayList(); for (Iterator it = connects.iterator(); it.hasNext(); ) { ConnectionData conn = it.next(); Location dest = conn.getLocation().translate(dx, dy); if (avoid.get(dest) != null) { boolean isInPath = false; for (Wire w : pathWires) { if (w.contains(dest)) { isInPath = true; break; } } if (!isInPath) { it.remove(); impossible.add(conn); } } } return impossible; } /** Creates a list of the connections to make, sorted according to their * location. If, for example, we are moving an east-facing AND gate * southeast, then we prefer to connect the inputs from the top down to * minimize the chances that the created wires will interfere with each * other - but if we are moving that gate northeast, we prefer to connect * the inputs from the bottom up. */ private static void sortConnects(ArrayList connects, final int dx, final int dy) { Collections.sort(connects, new Comparator() { public int compare(ConnectionData ac, ConnectionData bc) { Location a = ac.getLocation(); Location b = bc.getLocation(); int abx = a.getX() - b.getX(); int aby = a.getY() - b.getY(); return abx * dx + aby * dy; } }); } private static void processConnection(ConnectionData conn, int dx, int dy, HashSet connLocs, ArrayList connNodes, AvoidanceMap selAvoid) { Location cur = conn.getLocation(); Location dest = cur.translate(dx, dy); if (selAvoid.get(cur) == null) { Direction preferred = conn.getDirection(); if (preferred == null) { if (Math.abs(dx) > Math.abs(dy)) { preferred = dx > 0 ? Direction.EAST : Direction.WEST; } else { preferred = dy > 0 ? Direction.SOUTH : Direction.NORTH; } } connLocs.add(cur); connNodes.add(new SearchNode(conn, cur, preferred, dest)); } for (Wire w : conn.getWirePath()) { for (Location loc : w) { if (selAvoid.get(loc) == null || loc.equals(dest)) { boolean added = connLocs.add(loc); if (added) { Direction dir = null; if (w.endsAt(loc)) { if (w.isVertical()) { int y0 = loc.getY(); int y1 = w.getOtherEnd(loc).getY(); dir = y0 < y1 ? Direction.NORTH : Direction.SOUTH; } else { int x0 = loc.getX(); int x1 = w.getOtherEnd(loc).getX(); dir = x0 < x1 ? Direction.WEST : Direction.EAST; } } connNodes.add(new SearchNode(conn, loc, dir, dest)); } } } } } private static MoveResult tryList(MoveRequest req, MoveGesture gesture, ArrayList connects, int dx, int dy, HashMap> pathLocs, HashMap> initNodes, long stopTime) { AvoidanceMap avoid = gesture.getFixedAvoidanceMap().cloneMap(); avoid.markAll(gesture.getSelected(), dx, dy); ReplacementMap replacements = new ReplacementMap(); ArrayList unconnected = new ArrayList(); int totalDistance = 0; for (ConnectionData conn : connects) { if (ConnectorThread.isOverrideRequested()) { return null; } if (System.currentTimeMillis() - stopTime > 0) { unconnected.add(conn); continue; } List connNodes = initNodes.get(conn); Set connPathLocs = pathLocs.get(conn); SearchNode n = findShortestPath(connNodes, connPathLocs, avoid); if (n != null) { // normal case - a path was found totalDistance += n.getDistance(); ArrayList path = convertToPath(n); processPath(path, conn, avoid, replacements, connPathLocs); } else if (ConnectorThread.isOverrideRequested()) { return null; // search was aborted: return null to indicate this } else { unconnected.add(conn); } } return new MoveResult(req, replacements, unconnected, totalDistance); } private static SearchNode findShortestPath(List nodes, Set pathLocs, AvoidanceMap avoid) { PriorityQueue q = new PriorityQueue(nodes); HashSet visited = new HashSet(); int iters = 0; while (!q.isEmpty() && iters < MAX_SEARCH_ITERATIONS) { iters++; SearchNode n = q.remove(); if (iters % 64 == 0 && ConnectorThread.isOverrideRequested() || n == null) { return null; } if (n.isDestination()) { return n; } boolean added = visited.add(n); if (!added) { continue; } Location loc = n.getLocation(); Direction dir = n.getDirection(); int neighbors = 3; Object allowed = avoid.get(loc); if (allowed != null && n.isStart() && pathLocs.contains(loc)) { allowed = null; } if (allowed == ALLOW_NEITHER) { neighbors = 0; } else if (allowed == ALLOW_VERTICAL) { if (dir == null) { dir = Direction.NORTH; neighbors = 2; } else if (dir == Direction.NORTH || dir == Direction.SOUTH) { neighbors = 1; } else { neighbors = 0; } } else if (allowed == ALLOW_HORIZONTAL) { if (dir == null) { dir = Direction.EAST; neighbors = 2; } else if (dir == Direction.EAST || dir == Direction.WEST) { neighbors = 1; } else { neighbors = 0; } } else { if (dir == null) { dir = Direction.NORTH; neighbors = 4; } else { neighbors = 3; } } for (int i = 0; i < neighbors; i++) { Direction oDir; switch (i) { case 0: oDir = dir; break; case 1: oDir = neighbors == 2 ? dir.reverse() : dir.getLeft(); break; case 2: oDir = dir.getRight(); break; default: // must be 3 oDir = dir.reverse(); } SearchNode o = n.next(oDir, allowed != null); if (o != null && !visited.contains(o)) { q.add(o); } } } return null; } private static ArrayList convertToPath(SearchNode last) { SearchNode next = last; SearchNode prev = last.getPrevious(); ArrayList ret = new ArrayList(); ret.add(next.getLocation()); while (prev != null) { if (prev.getDirection() != next.getDirection()) { ret.add(prev.getLocation()); } next = prev; prev = prev.getPrevious(); } if (!ret.get(ret.size() - 1).equals(next.getLocation())) { ret.add(next.getLocation()); } Collections.reverse(ret); return ret; } private static void processPath(ArrayList path, ConnectionData conn, AvoidanceMap avoid, ReplacementMap repl, Set unmarkable) { Iterator pathIt = path.iterator(); Location loc0 = pathIt.next(); if (!loc0.equals(conn.getLocation())) { Location pathLoc = conn.getWirePathStart(); boolean found = loc0.equals(pathLoc); for (Wire w : conn.getWirePath()) { Location nextLoc = w.getOtherEnd(pathLoc); if (found) { // existing wire will be removed repl.remove(w); avoid.unmarkWire(w, nextLoc, unmarkable); } else if (w.contains(loc0)) { // wires after this will be removed found = true; if (!loc0.equals(nextLoc)) { avoid.unmarkWire(w, nextLoc, unmarkable); Wire shortenedWire = Wire.create(pathLoc, loc0); repl.replace(w, shortenedWire); avoid.markWire(shortenedWire, 0, 0); } } pathLoc = nextLoc; } } while (pathIt.hasNext()) { Location loc1 = pathIt.next(); Wire newWire = Wire.create(loc0, loc1); repl.add(newWire); avoid.markWire(newWire, 0, 0); loc0 = loc1; } } } logisim-2.7.1/src/com/cburch/logisim/tools/move/ConnectionData.java0000644000175000017500000000252611446034522025210 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools.move; import java.util.List; import com.cburch.logisim.circuit.Wire; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; class ConnectionData { private Location loc; private Direction dir; /** The list of wires leading up to this point - we may well want to * truncate this path somewhat. */ private List wirePath; private Location wirePathStart; public ConnectionData(Location loc, Direction dir, List wirePath, Location wirePathStart) { this.loc = loc; this.dir = dir; this.wirePath = wirePath; this.wirePathStart = wirePathStart; } public Location getLocation() { return loc; } public Direction getDirection() { return dir; } public List getWirePath() { return wirePath; } public Location getWirePathStart() { return wirePathStart; } @Override public boolean equals(Object other) { if (other instanceof ConnectionData) { ConnectionData o = (ConnectionData) other; return this.loc.equals(o.loc) && this.dir.equals(o.dir); } else { return false; } } @Override public int hashCode() { return loc.hashCode() * 31 + (dir == null ? 0 : dir.hashCode()); } } logisim-2.7.1/src/com/cburch/logisim/tools/move/AvoidanceMap.java0000644000175000017500000001146511447117124024651 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools.move; import java.io.PrintStream; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Set; import com.cburch.logisim.circuit.Wire; import com.cburch.logisim.comp.Component; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Location; class AvoidanceMap { static AvoidanceMap create(Collection elements, int dx, int dy) { AvoidanceMap ret = new AvoidanceMap(new HashMap()); ret.markAll(elements, dx, dy); return ret; } private final HashMap avoid; private AvoidanceMap(HashMap map) { avoid = map; } public AvoidanceMap cloneMap() { return new AvoidanceMap(new HashMap(avoid)); } public Object get(Location loc) { return avoid.get(loc); } public void markAll(Collection elements, int dx, int dy) { // first we go through the components, saying that we should not // intersect with any point that lies within a component for (Component el : elements) { if (el instanceof Wire) { markWire((Wire) el, dx, dy); } else { markComponent(el, dx, dy); } } } public void markComponent(Component comp, int dx, int dy) { HashMap avoid = this.avoid; boolean translated = dx != 0 || dy != 0; Bounds bds = comp.getBounds(); int x0 = bds.getX() + dx; int y0 = bds.getY() + dy; int x1 = x0 + bds.getWidth(); int y1 = y0 + bds.getHeight(); x0 += 9 - (x0 + 9) % 10; y0 += 9 - (y0 + 9) % 10; for (int x = x0; x <= x1; x += 10) { for (int y = y0; y <= y1; y += 10) { Location loc = Location.create(x, y); // loc is most likely in the component, so go ahead and // put it into the map as if it is - and in the rare event // that loc isn't in the component, we can remove it. String prev = avoid.put(loc, Connector.ALLOW_NEITHER); if (prev != Connector.ALLOW_NEITHER) { Location baseLoc = translated ? loc.translate(-dx, -dy) : loc; if (!comp.contains(baseLoc)) { if (prev == null) { avoid.remove(loc); } else { avoid.put(loc, prev); } } } } } } public void markWire(Wire w, int dx, int dy) { HashMap avoid = this.avoid; boolean translated = dx != 0 || dy != 0; Location loc0 = w.getEnd0(); Location loc1 = w.getEnd1(); if (translated) { loc0 = loc0.translate(dx, dy); loc1 = loc1.translate(dx, dy); } avoid.put(loc0, Connector.ALLOW_NEITHER); avoid.put(loc1, Connector.ALLOW_NEITHER); int x0 = loc0.getX(); int y0 = loc0.getY(); int x1 = loc1.getX(); int y1 = loc1.getY(); if (x0 == x1) { // vertical wire for (Location loc : Wire.create(loc0, loc1)) { Object prev = avoid.put(loc, Connector.ALLOW_HORIZONTAL); if (prev == Connector.ALLOW_NEITHER || prev == Connector.ALLOW_VERTICAL) { avoid.put(loc, Connector.ALLOW_NEITHER); } } } else if (y0 == y1) { // horizontal wire for (Location loc : Wire.create(loc0, loc1)) { Object prev = avoid.put(loc, Connector.ALLOW_VERTICAL); if (prev == Connector.ALLOW_NEITHER || prev == Connector.ALLOW_HORIZONTAL) { avoid.put(loc, Connector.ALLOW_NEITHER); } } } else { // diagonal - shouldn't happen throw new RuntimeException("diagonal wires not supported"); } } public void unmarkLocation(Location loc) { avoid.remove(loc); } public void unmarkWire(Wire w, Location deletedEnd, Set unmarkable) { Location loc0 = w.getEnd0(); Location loc1 = w.getEnd1(); if (unmarkable == null || unmarkable.contains(deletedEnd)) { avoid.remove(deletedEnd); } int x0 = loc0.getX(); int y0 = loc0.getY(); int x1 = loc1.getX(); int y1 = loc1.getY(); if (x0 == x1) { // vertical wire for (Location loc : w) { if (unmarkable == null || unmarkable.contains(deletedEnd)) { Object prev = avoid.remove(loc); if (prev != Connector.ALLOW_HORIZONTAL && prev != null) { avoid.put(loc, Connector.ALLOW_VERTICAL); } } } } else if (y0 == y1) { // horizontal wire for (Location loc : w) { if (unmarkable == null || unmarkable.contains(deletedEnd)) { Object prev = avoid.remove(loc); if (prev != Connector.ALLOW_VERTICAL && prev != null) { avoid.put(loc, Connector.ALLOW_HORIZONTAL); } } } } else { // diagonal - shouldn't happen throw new RuntimeException("diagonal wires not supported"); } } public void print(PrintStream stream) { ArrayList list = new ArrayList(avoid.keySet()); Collections.sort(list); for (int i = 0, n = list.size(); i < n; i++) { stream.println(list.get(i) + ": " + avoid.get(list.get(i))); } } } logisim-2.7.1/src/com/cburch/logisim/tools/MenuTool.java0000644000175000017500000001145411446034522023113 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools; import java.awt.Graphics; import java.awt.Color; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.awt.event.MouseEvent; import javax.swing.JComponent; import javax.swing.JPopupMenu; import javax.swing.JMenuItem; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.CircuitMutation; import com.cburch.logisim.comp.Component; import com.cburch.logisim.comp.ComponentDrawContext; import com.cburch.logisim.data.Location; import com.cburch.logisim.gui.main.Canvas; import com.cburch.logisim.gui.main.Selection; import com.cburch.logisim.gui.main.SelectionActions; import com.cburch.logisim.proj.Project; import java.util.Collection; public class MenuTool extends Tool { private class MenuComponent extends JPopupMenu implements ActionListener { Project proj; Circuit circ; Component comp; JMenuItem del = new JMenuItem(Strings.get("compDeleteItem")); JMenuItem attrs = new JMenuItem(Strings.get("compShowAttrItem")); MenuComponent(Project proj, Circuit circ, Component comp) { this.proj = proj; this.circ = circ; this.comp = comp; boolean canChange = proj.getLogisimFile().contains(circ); add(del); del.addActionListener(this); del.setEnabled(canChange); add(attrs); attrs.addActionListener(this); } public void actionPerformed(ActionEvent e) { Object src = e.getSource(); if (src == del) { Circuit circ = proj.getCurrentCircuit(); CircuitMutation xn = new CircuitMutation(circ); xn.remove(comp); proj.doAction(xn.toAction(Strings.getter("removeComponentAction", comp.getFactory().getDisplayGetter()))); } else if (src == attrs) { proj.getFrame().viewComponentAttributes(circ, comp); } } } private class MenuSelection extends JPopupMenu implements ActionListener { Project proj; JMenuItem del = new JMenuItem(Strings.get("selDeleteItem")); JMenuItem cut = new JMenuItem(Strings.get("selCutItem")); JMenuItem copy = new JMenuItem(Strings.get("selCopyItem")); MenuSelection(Project proj) { this.proj = proj; boolean canChange = proj.getLogisimFile().contains(proj.getCurrentCircuit()); add(del); del.addActionListener(this); del.setEnabled(canChange); add(cut); cut.addActionListener(this); cut.setEnabled(canChange); add(copy); copy.addActionListener(this); } public void actionPerformed(ActionEvent e) { Object src = e.getSource(); Selection sel = proj.getSelection(); if (src == del) { proj.doAction(SelectionActions.clear(sel)); } else if (src == cut) { proj.doAction(SelectionActions.cut(sel)); } else if (src == copy) { proj.doAction(SelectionActions.copy(sel)); } } public void show(JComponent parent, int x, int y) { super.show(this, x, y); } } public MenuTool() { } @Override public boolean equals(Object other) { return other instanceof MenuTool; } @Override public int hashCode() { return MenuTool.class.hashCode(); } @Override public String getName() { return "Menu Tool"; } @Override public String getDisplayName() { return Strings.get("menuTool"); } @Override public String getDescription() { return Strings.get("menuToolDesc"); } @Override public void mousePressed(Canvas canvas, Graphics g, MouseEvent e) { int x = e.getX(); int y = e.getY(); Location pt = Location.create(x, y); JPopupMenu menu; Project proj = canvas.getProject(); Selection sel = proj.getSelection(); Collection in_sel = sel.getComponentsContaining(pt, g); if (!in_sel.isEmpty()) { Component comp = in_sel.iterator().next(); if (sel.getComponents().size() > 1) { menu = new MenuSelection(proj); } else { menu = new MenuComponent(proj, canvas.getCircuit(), comp); MenuExtender extender = (MenuExtender) comp.getFeature(MenuExtender.class); if (extender != null) extender.configureMenu(menu, proj); } } else { Collection cl = canvas.getCircuit().getAllContaining(pt, g); if (!cl.isEmpty()) { Component comp = cl.iterator().next(); menu = new MenuComponent(proj, canvas.getCircuit(), comp); MenuExtender extender = (MenuExtender) comp.getFeature(MenuExtender.class); if (extender != null) extender.configureMenu(menu, proj); } else { menu = null; } } if (menu != null) { canvas.showPopupMenu(menu, x, y); } } @Override public void paintIcon(ComponentDrawContext c, int x, int y) { Graphics g = c.getGraphics(); g.fillRect(x + 2, y + 1, 9, 2); g.drawRect(x + 2, y + 3, 15, 12); g.setColor(Color.lightGray); g.drawLine(x + 4, y + 2, x + 8, y + 2); for (int y_offs = y + 6; y_offs < y + 15; y_offs += 3) { g.drawLine(x + 4, y_offs, x + 14, y_offs); } } } logisim-2.7.1/src/com/cburch/logisim/tools/MenuExtender.java0000644000175000017500000000053511446034522023752 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools; import javax.swing.JPopupMenu; import com.cburch.logisim.proj.Project; public interface MenuExtender { public void configureMenu(JPopupMenu menu, Project proj); } logisim-2.7.1/src/com/cburch/logisim/tools/Library.java0000644000175000017500000000313611446034522022753 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools; import java.util.Collections; import java.util.List; import com.cburch.logisim.comp.ComponentFactory; import com.cburch.logisim.util.ListUtil; public abstract class Library { public String getName() { return getClass().getName(); } public abstract List getTools(); @Override public String toString() { return getName(); } public String getDisplayName() { return getName(); } public boolean isDirty() { return false; } public List getLibraries() { return Collections.emptyList(); } public List getElements() { return ListUtil.joinImmutableLists(getTools(), getLibraries()); } public Tool getTool(String name) { for (Tool tool : getTools()) { if (tool.getName().equals(name)) { return tool; } } return null; } public boolean containsFromSource(Tool query) { for (Tool tool : getTools()) { if (tool.sharesSource(query)) { return true; } } return false; } public int indexOf(ComponentFactory query) { int index = -1; for (Tool obj : getTools()) { index++; if (obj instanceof AddTool) { AddTool tool = (AddTool) obj; if (tool.getFactory() == query) return index; } } return -1; } public boolean contains(ComponentFactory query) { return indexOf(query) >= 0; } public Library getLibrary(String name) { for (Library lib : getLibraries()) { if (lib.getName().equals(name)) { return lib; } } return null; } } logisim-2.7.1/src/com/cburch/logisim/tools/key/0000755000175000017500000000000011451540050021263 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/logisim/tools/key/Strings.java0000644000175000017500000000103211451540050023553 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools.key; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.StringGetter; class Strings { private static LocaleManager source = new LocaleManager("resources/logisim", "tools"); public static String get(String key) { return source.get(key); } public static StringGetter getter(String key) { return source.getter(key); } } logisim-2.7.1/src/com/cburch/logisim/tools/key/ParallelConfigurator.java0000644000175000017500000000354311446034516026263 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools.key; import java.util.HashMap; import com.cburch.logisim.data.Attribute; public class ParallelConfigurator implements KeyConfigurator, Cloneable { public static ParallelConfigurator create(KeyConfigurator a, KeyConfigurator b) { return new ParallelConfigurator(new KeyConfigurator[] { a, b }); } public static ParallelConfigurator create(KeyConfigurator[] configs) { return new ParallelConfigurator(configs); } private KeyConfigurator[] handlers; private ParallelConfigurator(KeyConfigurator[] handlers) { this.handlers = handlers; } @Override public ParallelConfigurator clone() { ParallelConfigurator ret; try { ret = (ParallelConfigurator) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); return null; } int len = this.handlers.length; ret.handlers = new KeyConfigurator[len]; for (int i = 0; i < len; i++) { ret.handlers[i] = this.handlers[i].clone(); } return ret; } public KeyConfigurationResult keyEventReceived(KeyConfigurationEvent event) { KeyConfigurator[] hs = handlers; if (event.isConsumed()) { return null; } KeyConfigurationResult first = null; HashMap,Object> map = null; for (int i = 0; i < hs.length; i++) { KeyConfigurationResult result = hs[i].keyEventReceived(event); if (result != null) { if (first == null) { first = result; } else if (map == null) { map = new HashMap,Object>(first.getAttributeValues()); map.putAll(result.getAttributeValues()); } else { map.putAll(result.getAttributeValues()); } } } if (map != null) { return new KeyConfigurationResult(event, map); } else { return first; } } } logisim-2.7.1/src/com/cburch/logisim/tools/key/NumericConfigurator.java0000644000175000017500000000466411446034516026136 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools.key; import java.awt.event.KeyEvent; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; public abstract class NumericConfigurator implements KeyConfigurator, Cloneable { private static final int MAX_TIME_KEY_LASTS = 800; private Attribute attr; private int minValue; private int maxValue; private int curValue; private int radix; private int modsEx; private long whenTyped; public NumericConfigurator(Attribute attr, int min, int max, int modifiersEx) { this(attr, min, max, modifiersEx, 10); } public NumericConfigurator(Attribute attr, int min, int max, int modifiersEx, int radix) { this.attr = attr; this.minValue = min; this.maxValue = max; this.radix = radix; this.modsEx = modifiersEx; this.curValue = 0; this.whenTyped = 0; } @Override public NumericConfigurator clone() { try { @SuppressWarnings("unchecked") NumericConfigurator ret = (NumericConfigurator) super.clone(); ret.whenTyped = 0; ret.curValue = 0; return ret; } catch (CloneNotSupportedException e) { e.printStackTrace(); return null; } } protected int getMinimumValue(AttributeSet attrs) { return minValue; } protected int getMaximumValue(AttributeSet attrs) { return maxValue; } protected abstract V createValue(int value); public KeyConfigurationResult keyEventReceived(KeyConfigurationEvent event) { if (event.getType() == KeyConfigurationEvent.KEY_TYPED) { KeyEvent e = event.getKeyEvent(); int digit = Character.digit(e.getKeyChar(), radix); if (digit >= 0 && e.getModifiersEx() == modsEx) { long now = System.currentTimeMillis(); long sinceLast = now - whenTyped; AttributeSet attrs = event.getAttributeSet(); int min = getMinimumValue(attrs); int max = getMaximumValue(attrs); int val = 0; if (sinceLast < MAX_TIME_KEY_LASTS) { val = radix * curValue; if (val > max) { val = 0; } } val += digit; if (val > max) { val = digit; if (val > max) { return null; } } event.consume(); whenTyped = now; curValue = val; if (val >= min) { Object valObj = createValue(val); return new KeyConfigurationResult(event, attr, valObj); } } } return null; } } logisim-2.7.1/src/com/cburch/logisim/tools/key/KeyConfigurator.java0000644000175000017500000000051711446034516025255 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools.key; public interface KeyConfigurator { public KeyConfigurator clone(); public KeyConfigurationResult keyEventReceived(KeyConfigurationEvent event); } logisim-2.7.1/src/com/cburch/logisim/tools/key/KeyConfigurationResult.java0000644000175000017500000000171511446034514026620 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools.key; import java.util.HashMap; import java.util.Map; import com.cburch.logisim.data.Attribute; public class KeyConfigurationResult { private KeyConfigurationEvent event; private Map,Object> attrValueMap; public KeyConfigurationResult(KeyConfigurationEvent event, Attribute attr, Object value) { this.event = event; Map,Object> singleMap = new HashMap,Object>(1); singleMap.put(attr, value); this.attrValueMap = singleMap; } public KeyConfigurationResult(KeyConfigurationEvent event, Map,Object> values) { this.event = event; this.attrValueMap = values; } public KeyConfigurationEvent getEvent() { return event; } public Map,Object> getAttributeValues() { return attrValueMap; } } logisim-2.7.1/src/com/cburch/logisim/tools/key/KeyConfigurationEvent.java0000644000175000017500000000205511446034516026423 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools.key; import java.awt.event.KeyEvent; import com.cburch.logisim.data.AttributeSet; public class KeyConfigurationEvent { public static final int KEY_PRESSED = 0; public static final int KEY_RELEASED = 1; public static final int KEY_TYPED = 2; private int type; private AttributeSet attrs; private KeyEvent event; private Object data; private boolean consumed; public KeyConfigurationEvent(int type, AttributeSet attrs, KeyEvent event, Object data) { this.type = type; this.attrs = attrs; this.event = event; this.data = data; this.consumed = false; } public int getType() { return type; } public KeyEvent getKeyEvent() { return event; } public AttributeSet getAttributeSet() { return attrs; } public void consume() { consumed = true; } public boolean isConsumed() { return consumed; } public Object getData() { return data; } } logisim-2.7.1/src/com/cburch/logisim/tools/key/JoinedConfigurator.java0000644000175000017500000000260611446034516025736 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools.key; public class JoinedConfigurator implements KeyConfigurator, Cloneable { public static JoinedConfigurator create(KeyConfigurator a, KeyConfigurator b) { return new JoinedConfigurator(new KeyConfigurator[] { a, b }); } public static JoinedConfigurator create(KeyConfigurator[] configs) { return new JoinedConfigurator(configs); } private KeyConfigurator[] handlers; private JoinedConfigurator(KeyConfigurator[] handlers) { this.handlers = handlers; } @Override public JoinedConfigurator clone() { JoinedConfigurator ret; try { ret = (JoinedConfigurator) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); return null; } int len = this.handlers.length; ret.handlers = new KeyConfigurator[len]; for (int i = 0; i < len; i++) { ret.handlers[i] = this.handlers[i].clone(); } return ret; } public KeyConfigurationResult keyEventReceived(KeyConfigurationEvent event) { KeyConfigurator[] hs = handlers; if (event.isConsumed()) { return null; } for (int i = 0; i < hs.length; i++) { KeyConfigurationResult result = hs[i].keyEventReceived(event); if (result != null || event.isConsumed()) { return result; } } return null; } } logisim-2.7.1/src/com/cburch/logisim/tools/key/IntegerConfigurator.java0000644000175000017500000000124611446034516026122 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools.key; import com.cburch.logisim.data.Attribute; public class IntegerConfigurator extends NumericConfigurator { public IntegerConfigurator(Attribute attr, int min, int max, int modifiersEx) { super(attr, min, max, modifiersEx); } public IntegerConfigurator(Attribute attr, int min, int max, int modifiersEx, int radix) { super(attr, min, max, modifiersEx, radix); } @Override protected Integer createValue(int val) { return Integer.valueOf(val); } } logisim-2.7.1/src/com/cburch/logisim/tools/key/DirectionConfigurator.java0000644000175000017500000000262111446663000026437 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools.key; import java.awt.event.KeyEvent; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.Direction; public class DirectionConfigurator implements KeyConfigurator, Cloneable { private Attribute attr; private int modsEx; public DirectionConfigurator(Attribute attr, int modifiersEx) { this.attr = attr; this.modsEx = modifiersEx; } @Override public DirectionConfigurator clone() { try { return (DirectionConfigurator) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); return null; } } public KeyConfigurationResult keyEventReceived(KeyConfigurationEvent event) { if (event.getType() == KeyConfigurationEvent.KEY_PRESSED) { KeyEvent e = event.getKeyEvent(); if (e.getModifiersEx() == modsEx) { Direction value = null; switch (e.getKeyCode()) { case KeyEvent.VK_UP: value = Direction.NORTH; break; case KeyEvent.VK_DOWN: value = Direction.SOUTH; break; case KeyEvent.VK_LEFT: value = Direction.WEST; break; case KeyEvent.VK_RIGHT: value = Direction.EAST; break; } if (value != null) { event.consume(); return new KeyConfigurationResult(event, attr, value); } } } return null; } } logisim-2.7.1/src/com/cburch/logisim/tools/key/BitWidthConfigurator.java0000644000175000017500000000160111446034516026236 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools.key; import java.awt.event.InputEvent; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Value; public class BitWidthConfigurator extends NumericConfigurator { public BitWidthConfigurator(Attribute attr, int min, int max, int modifiersEx) { super(attr, min, max, modifiersEx); } public BitWidthConfigurator(Attribute attr, int min, int max) { super(attr, min, max, InputEvent.ALT_DOWN_MASK); } public BitWidthConfigurator(Attribute attr) { super(attr, 1, Value.MAX_WIDTH, InputEvent.ALT_DOWN_MASK); } @Override protected BitWidth createValue(int val) { return BitWidth.create(val); } } logisim-2.7.1/src/com/cburch/logisim/tools/FactoryDescription.java0000644000175000017500000001006711524651446025172 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools; import java.util.Arrays; import java.util.List; import javax.swing.Icon; import com.cburch.logisim.comp.ComponentFactory; import com.cburch.logisim.util.Icons; import com.cburch.logisim.util.StringGetter; /** This class allows an object to be created holding all the information * essential to showing a ComponentFactory in the explorer window, but without * actually loading the ComponentFactory unless a program genuinely gets around * to needing to use it. Note that for this to work, the relevant * ComponentFactory class must be in the same package as its Library class, * the ComponentFactory class must be public, and it must include a public * no-arguments constructor. */ public class FactoryDescription { public static List getTools(Class base, FactoryDescription[] descriptions) { Tool[] tools = new Tool[descriptions.length]; for (int i = 0; i < tools.length; i++) { tools[i] = new AddTool(base, descriptions[i]); } return Arrays.asList(tools); } private String name; private StringGetter displayName; private String iconName; private boolean iconLoadAttempted; private Icon icon; private String factoryClassName; private boolean factoryLoadAttempted; private ComponentFactory factory; private StringGetter toolTip; public FactoryDescription(String name, StringGetter displayName, String iconName, String factoryClassName) { this(name, displayName, factoryClassName); this.iconName = iconName; this.iconLoadAttempted = false; this.icon = null; } public FactoryDescription(String name, StringGetter displayName, Icon icon, String factoryClassName) { this(name, displayName, factoryClassName); this.iconName = "???"; this.iconLoadAttempted = true; this.icon = icon; } public FactoryDescription(String name, StringGetter displayName, String factoryClassName) { this.name = name; this.displayName = displayName; this.iconName = "???"; this.iconLoadAttempted = true; this.icon = null; this.factoryClassName = factoryClassName; this.factoryLoadAttempted = false; this.factory = null; this.toolTip = null; } public String getName() { return name; } public String getDisplayName() { return displayName.get(); } public boolean isFactoryLoaded() { return factoryLoadAttempted; } public Icon getIcon() { Icon ret = icon; if (ret != null || iconLoadAttempted) { return ret; } else { ret = Icons.getIcon(iconName); icon = ret; iconLoadAttempted = true; return ret; } } public ComponentFactory getFactory(Class libraryClass) { ComponentFactory ret = factory; if (factory != null || factoryLoadAttempted) { return ret; } else { String msg = ""; try { msg = "getting class loader"; ClassLoader loader = libraryClass.getClassLoader(); msg = "getting package name"; String name; Package pack = libraryClass.getPackage(); if (pack == null) { name = factoryClassName; } else { name = pack.getName() + "." + factoryClassName; } msg = "loading class"; Class factoryClass = loader.loadClass(name); msg = "creating instance"; Object factoryValue = factoryClass.newInstance(); msg = "converting to factory"; if (factoryValue instanceof ComponentFactory) { ret = (ComponentFactory) factoryValue; factory = ret; factoryLoadAttempted = true; return ret; } } catch (Throwable t) { String name = t.getClass().getName(); String m = t.getMessage(); if (m != null) msg = msg + ": " + name + ": " + m; else msg = msg + ": " + name; } System.err.println("error while " + msg); //OK factory = null; factoryLoadAttempted = true; return null; } } public FactoryDescription setToolTip(StringGetter getter) { toolTip = getter; return this; } public String getToolTip() { StringGetter getter = toolTip; return getter == null ? null : getter.get(); } } logisim-2.7.1/src/com/cburch/logisim/tools/FactoryAttributes.java0000644000175000017500000000630011446034522025021 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools; import java.util.ArrayList; import java.util.List; import com.cburch.logisim.comp.ComponentFactory; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeEvent; import com.cburch.logisim.data.AttributeListener; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.AttributeSets; class FactoryAttributes implements AttributeSet, AttributeListener, Cloneable { private Class descBase; private FactoryDescription desc; private ComponentFactory factory; private AttributeSet baseAttrs; private ArrayList listeners; public FactoryAttributes(Class descBase, FactoryDescription desc) { this.descBase = descBase; this.desc = desc; this.factory = null; this.baseAttrs = null; this.listeners = new ArrayList(); } public FactoryAttributes(ComponentFactory factory) { this.descBase = null; this.desc = null; this.factory = factory; this.baseAttrs = null; this.listeners = new ArrayList(); } boolean isFactoryInstantiated() { return baseAttrs != null; } AttributeSet getBase() { AttributeSet ret = baseAttrs; if (ret == null) { ComponentFactory fact = factory; if (fact == null) { fact = desc.getFactory(descBase); factory = fact; } if (fact == null) { ret = AttributeSets.EMPTY; } else { ret = fact.createAttributeSet(); ret.addAttributeListener(this); } baseAttrs = ret; } return ret; } public void addAttributeListener(AttributeListener l) { listeners.add(l); } public void removeAttributeListener(AttributeListener l) { listeners.remove(l); } @Override public AttributeSet clone() { return (AttributeSet) getBase().clone(); } public boolean containsAttribute(Attribute attr) { return getBase().containsAttribute(attr); } public Attribute getAttribute(String name) { return getBase().getAttribute(name); } public List> getAttributes() { return getBase().getAttributes(); } public V getValue(Attribute attr) { return getBase().getValue(attr); } public boolean isReadOnly(Attribute attr) { return getBase().isReadOnly(attr); } public boolean isToSave(Attribute attr) { return getBase().isToSave(attr); } public void setReadOnly(Attribute attr, boolean value) { getBase().setReadOnly(attr, value); } public void setValue(Attribute attr, V value) { getBase().setValue(attr, value); } public void attributeListChanged(AttributeEvent baseEvent) { AttributeEvent e = null; for (AttributeListener l : listeners) { if (e == null) { e = new AttributeEvent(this, baseEvent.getAttribute(), baseEvent.getValue()); } l.attributeListChanged(e); } } public void attributeValueChanged(AttributeEvent baseEvent) { AttributeEvent e = null; for (AttributeListener l : listeners) { if (e == null) { e = new AttributeEvent(this, baseEvent.getAttribute(), baseEvent.getValue()); } l.attributeValueChanged(e); } } } logisim-2.7.1/src/com/cburch/logisim/tools/EditTool.java0000644000175000017500000002743111527054300023072 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools; import java.awt.Color; import java.awt.Cursor; import java.awt.Graphics; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Set; import com.cburch.logisim.LogisimVersion; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.CircuitEvent; import com.cburch.logisim.circuit.CircuitListener; import com.cburch.logisim.circuit.Wire; import com.cburch.logisim.comp.Component; import com.cburch.logisim.comp.ComponentDrawContext; import com.cburch.logisim.comp.ComponentFactory; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.gui.main.Canvas; import com.cburch.logisim.gui.main.Selection; import com.cburch.logisim.gui.main.SelectionActions; import com.cburch.logisim.gui.main.Selection.Event; import com.cburch.logisim.proj.Action; import com.cburch.logisim.util.GraphicsUtil; public class EditTool extends Tool { private static final int CACHE_MAX_SIZE = 32; private static final Location NULL_LOCATION = Location.create(Integer.MIN_VALUE, Integer.MIN_VALUE); private class Listener implements CircuitListener, Selection.Listener { public void circuitChanged(CircuitEvent event) { if (event.getAction() != CircuitEvent.ACTION_INVALIDATE) { lastX = -1; cache.clear(); updateLocation(lastCanvas, lastRawX, lastRawY, lastMods); } } public void selectionChanged(Event event) { lastX = -1; cache.clear(); updateLocation(lastCanvas, lastRawX, lastRawY, lastMods); } } private Listener listener; private SelectTool select; private WiringTool wiring; private Tool current; private LinkedHashMap cache; private Canvas lastCanvas; private int lastRawX; private int lastRawY; private int lastX; // last coordinates where wiring was computed private int lastY; private int lastMods; // last modifiers for mouse event private Location wireLoc; // coordinates where to draw wiring indicator, if private int pressX; // last coordinate where mouse was pressed private int pressY; // (used to determine when a short wire has been clicked) public EditTool(SelectTool select, WiringTool wiring) { this.listener = new Listener(); this.select = select; this.wiring = wiring; this.current = select; this.cache = new LinkedHashMap(); this.lastX = -1; this.wireLoc = NULL_LOCATION; this.pressX = -1; } @Override public boolean equals(Object other) { return other instanceof EditTool; } @Override public int hashCode() { return EditTool.class.hashCode(); } @Override public String getName() { return "Edit Tool"; } @Override public String getDisplayName() { return Strings.get("editTool"); } @Override public String getDescription() { return Strings.get("editToolDesc"); } @Override public AttributeSet getAttributeSet() { return select.getAttributeSet(); } @Override public void setAttributeSet(AttributeSet attrs) { select.setAttributeSet(attrs); } @Override public AttributeSet getAttributeSet(Canvas canvas) { return canvas.getSelection().getAttributeSet(); } @Override public boolean isAllDefaultValues(AttributeSet attrs, LogisimVersion ver) { return true; } @Override public void paintIcon(ComponentDrawContext c, int x, int y) { select.paintIcon(c, x, y); } @Override public Set getHiddenComponents(Canvas canvas) { return current.getHiddenComponents(canvas); } @Override public void draw(Canvas canvas, ComponentDrawContext context) { Location loc = wireLoc; if (loc != NULL_LOCATION && current != wiring) { int x = loc.getX(); int y = loc.getY(); Graphics g = context.getGraphics(); g.setColor(Value.TRUE_COLOR); GraphicsUtil.switchToWidth(g, 2); g.drawOval(x - 5, y - 5, 10, 10); g.setColor(Color.BLACK); GraphicsUtil.switchToWidth(g, 1); } current.draw(canvas, context); } @Override public void select(Canvas canvas) { current = select; lastCanvas = canvas; cache.clear(); canvas.getCircuit().addCircuitListener(listener); canvas.getSelection().addListener(listener); select.select(canvas); } @Override public void deselect(Canvas canvas) { current = select; canvas.getSelection().setSuppressHandles(null); cache.clear(); canvas.getCircuit().removeCircuitListener(listener); canvas.getSelection().removeListener(listener); } @Override public void mousePressed(Canvas canvas, Graphics g, MouseEvent e) { boolean wire = updateLocation(canvas, e); Location oldWireLoc = wireLoc; wireLoc = NULL_LOCATION; lastX = Integer.MIN_VALUE; if (wire) { current = wiring; Selection sel = canvas.getSelection(); Circuit circ = canvas.getCircuit(); Collection selected = sel.getAnchoredComponents(); ArrayList suppress = null; for (Wire w : circ.getWires()) { if (selected.contains(w)) { if (w.contains(oldWireLoc)) { if (suppress == null) suppress = new ArrayList(); suppress.add(w); } } } sel.setSuppressHandles(suppress); } else { current = select; } pressX = e.getX(); pressY = e.getY(); current.mousePressed(canvas, g, e); } @Override public void mouseDragged(Canvas canvas, Graphics g, MouseEvent e) { isClick(e); current.mouseDragged(canvas, g, e); } @Override public void mouseReleased(Canvas canvas, Graphics g, MouseEvent e) { boolean click = isClick(e) && current == wiring; canvas.getSelection().setSuppressHandles(null); current.mouseReleased(canvas, g, e); if (click) { wiring.resetClick(); select.mousePressed(canvas, g, e); select.mouseReleased(canvas, g, e); } current = select; cache.clear(); updateLocation(canvas, e); } @Override public void mouseEntered(Canvas canvas, Graphics g, MouseEvent e) { pressX = -1; current.mouseEntered(canvas, g, e); canvas.requestFocusInWindow(); } @Override public void mouseExited(Canvas canvas, Graphics g, MouseEvent e) { pressX = -1; current.mouseExited(canvas, g, e); } @Override public void mouseMoved(Canvas canvas, Graphics g, MouseEvent e) { updateLocation(canvas, e); select.mouseMoved(canvas, g, e); } private boolean isClick(MouseEvent e) { int px = pressX; if (px < 0) { return false; } else { int dx = e.getX() - px; int dy = e.getY() - pressY; if (dx * dx + dy * dy <= 4) { return true; } else { pressX = -1; return false; } } } private boolean updateLocation(Canvas canvas, MouseEvent e) { return updateLocation(canvas, e.getX(), e.getY(), e.getModifiersEx()); } private boolean updateLocation(Canvas canvas, KeyEvent e) { int x = lastRawX; if (x >= 0) return updateLocation(canvas, x, lastRawY, e.getModifiersEx()); else return false; } private boolean updateLocation(Canvas canvas, int mx, int my, int mods) { int snapx = Canvas.snapXToGrid(mx); int snapy = Canvas.snapYToGrid(my); int dx = mx - snapx; int dy = my - snapy; boolean isEligible = dx * dx + dy * dy < 36; if ((mods & MouseEvent.ALT_DOWN_MASK) != 0) isEligible = true; if (!isEligible) { snapx = -1; snapy = -1; } boolean modsSame = lastMods == mods; lastCanvas = canvas; lastRawX = mx; lastRawY = my; lastMods = mods; if (lastX == snapx && lastY == snapy && modsSame) { // already computed return wireLoc != NULL_LOCATION; } else { Location snap = Location.create(snapx, snapy); if (modsSame) { Object o = cache.get(snap); if (o != null) { lastX = snapx; lastY = snapy; canvas.repaint(); boolean ret = ((Boolean) o).booleanValue(); wireLoc = ret ? snap : NULL_LOCATION; return ret; } } else { cache.clear(); } boolean ret = isEligible && isWiringPoint(canvas, snap, mods); wireLoc = ret ? snap : NULL_LOCATION; cache.put(snap, Boolean.valueOf(ret)); int toRemove = cache.size() - CACHE_MAX_SIZE; Iterator it = cache.keySet().iterator(); while (it.hasNext() && toRemove > 0) { it.next(); it.remove(); toRemove--; } lastX = snapx; lastY = snapy; canvas.repaint(); return ret; } } private boolean isWiringPoint(Canvas canvas, Location loc, int modsEx) { boolean wiring = (modsEx & MouseEvent.ALT_DOWN_MASK) == 0; boolean select = !wiring; if (canvas != null && canvas.getSelection() != null) { Collection sel = canvas.getSelection().getComponents(); if (sel != null) { for (Component c : sel) { if (c instanceof Wire) { Wire w = (Wire) c; if (w.contains(loc) && !w.endsAt(loc)) return select; } } } } Circuit circ = canvas.getCircuit(); Collection at = circ.getComponents(loc); if (at != null && at.size() > 0) return wiring; for (Wire w : circ.getWires()) { if (w.contains(loc)) { return wiring; } } return select; } @Override public void keyTyped(Canvas canvas, KeyEvent e) { select.keyTyped(canvas, e); } @Override public void keyPressed(Canvas canvas, KeyEvent e) { switch (e.getKeyCode()) { case KeyEvent.VK_BACK_SPACE: case KeyEvent.VK_DELETE: if (!canvas.getSelection().isEmpty()) { Action act = SelectionActions.clear(canvas.getSelection()); canvas.getProject().doAction(act); e.consume(); } else { wiring.keyPressed(canvas, e); } break; case KeyEvent.VK_INSERT: Action act = SelectionActions.duplicate(canvas.getSelection()); canvas.getProject().doAction(act); e.consume(); break; case KeyEvent.VK_UP: if (e.getModifiersEx() == 0) attemptReface(canvas, Direction.NORTH, e); else select.keyPressed(canvas, e); break; case KeyEvent.VK_DOWN: if (e.getModifiersEx() == 0) attemptReface(canvas, Direction.SOUTH, e); else select.keyPressed(canvas, e); break; case KeyEvent.VK_LEFT: if (e.getModifiersEx() == 0) attemptReface(canvas, Direction.WEST, e); else select.keyPressed(canvas, e); break; case KeyEvent.VK_RIGHT: if (e.getModifiersEx() == 0) attemptReface(canvas, Direction.EAST, e); else select.keyPressed(canvas, e); break; case KeyEvent.VK_ALT: updateLocation(canvas, e); e.consume(); break; default: select.keyPressed(canvas, e); } } @Override public void keyReleased(Canvas canvas, KeyEvent e) { switch (e.getKeyCode()) { case KeyEvent.VK_ALT: updateLocation(canvas, e); e.consume(); break; default: select.keyReleased(canvas, e); } } private void attemptReface(Canvas canvas, final Direction facing, KeyEvent e) { if (e.getModifiersEx() == 0) { final Circuit circuit = canvas.getCircuit(); final Selection sel = canvas.getSelection(); SetAttributeAction act = new SetAttributeAction(circuit, Strings.getter("selectionRefaceAction")); for (Component comp : sel.getComponents()) { if (!(comp instanceof Wire)) { Attribute attr = getFacingAttribute(comp); if (attr != null) { act.set(comp, attr, facing); } } } if (!act.isEmpty()) { canvas.getProject().doAction(act); e.consume(); } } } private Attribute getFacingAttribute(Component comp) { AttributeSet attrs = comp.getAttributeSet(); Object key = ComponentFactory.FACING_ATTRIBUTE_KEY; Attribute a = (Attribute) comp.getFactory().getFeature(key, attrs); @SuppressWarnings("unchecked") Attribute ret = (Attribute) a; return ret; } @Override public Cursor getCursor() { return select.getCursor(); } } logisim-2.7.1/src/com/cburch/logisim/tools/CustomHandles.java0000644000175000017500000000051011446034522024111 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools; import com.cburch.logisim.comp.ComponentDrawContext; public interface CustomHandles { public void drawHandles(ComponentDrawContext context); } logisim-2.7.1/src/com/cburch/logisim/tools/CaretListener.java0000644000175000017500000000046111446034522024111 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools; public interface CaretListener { public void editingCanceled(CaretEvent e); public void editingStopped(CaretEvent e); } logisim-2.7.1/src/com/cburch/logisim/tools/CaretEvent.java0000644000175000017500000000107711446034522023411 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools; public class CaretEvent { private Caret caret; private String oldtext; private String newtext; public CaretEvent(Caret caret, String oldtext, String newtext) { this.caret = caret; this.oldtext = oldtext; this.newtext = newtext; } public Caret getCaret() { return caret; } public String getOldText() { return oldtext; } public String getText() { return newtext; } } logisim-2.7.1/src/com/cburch/logisim/tools/Caret.java0000644000175000017500000000167111446034522022407 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools; import java.awt.Graphics; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import com.cburch.logisim.data.Bounds; public interface Caret { // listener methods public void addCaretListener(CaretListener e); public void removeCaretListener(CaretListener e); // query/Graphics methods public String getText(); public Bounds getBounds(Graphics g); public void draw(Graphics g); // finishing public void commitText(String text); public void cancelEditing(); public void stopEditing(); // events to handle public void mousePressed(MouseEvent e); public void mouseDragged(MouseEvent e); public void mouseReleased(MouseEvent e); public void keyPressed(KeyEvent e); public void keyReleased(KeyEvent e); public void keyTyped(KeyEvent e); } logisim-2.7.1/src/com/cburch/logisim/tools/AddTool.java0000644000175000017500000003547011527054400022700 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools; import java.awt.Color; import java.awt.Cursor; import java.awt.Graphics; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import javax.swing.Icon; import javax.swing.JOptionPane; import com.cburch.logisim.LogisimVersion; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.CircuitException; import com.cburch.logisim.circuit.CircuitMutation; import com.cburch.logisim.circuit.SubcircuitFactory; import com.cburch.logisim.comp.Component; import com.cburch.logisim.comp.ComponentFactory; import com.cburch.logisim.comp.ComponentDrawContext; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeEvent; import com.cburch.logisim.data.AttributeListener; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.gui.main.Canvas; import com.cburch.logisim.gui.main.SelectionActions; import com.cburch.logisim.gui.main.ToolAttributeAction; import com.cburch.logisim.prefs.AppPreferences; import com.cburch.logisim.proj.Action; import com.cburch.logisim.proj.Dependencies; import com.cburch.logisim.proj.Project; import com.cburch.logisim.tools.key.KeyConfigurationEvent; import com.cburch.logisim.tools.key.KeyConfigurator; import com.cburch.logisim.tools.key.KeyConfigurationResult; import com.cburch.logisim.util.StringUtil; public class AddTool extends Tool { private static int INVALID_COORD = Integer.MIN_VALUE; private static int SHOW_NONE = 0; private static int SHOW_GHOST = 1; private static int SHOW_ADD = 2; private static int SHOW_ADD_NO = 3; private static Cursor cursor = Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR); private class MyAttributeListener implements AttributeListener { public void attributeListChanged(AttributeEvent e) { bounds = null; } public void attributeValueChanged(AttributeEvent e) { bounds = null; } } private Class descriptionBase; private FactoryDescription description; private boolean sourceLoadAttempted; private ComponentFactory factory; private AttributeSet attrs; private Bounds bounds; private boolean shouldSnap; private int lastX = INVALID_COORD; private int lastY = INVALID_COORD; private int state = SHOW_GHOST; private Action lastAddition; private boolean keyHandlerTried; private KeyConfigurator keyHandler; public AddTool(Class base, FactoryDescription description) { this.descriptionBase = base; this.description = description; this.sourceLoadAttempted = false; this.shouldSnap = true; this.attrs = new FactoryAttributes(base, description); attrs.addAttributeListener(new MyAttributeListener()); this.keyHandlerTried = false; } public AddTool(ComponentFactory source) { this.description = null; this.sourceLoadAttempted = true; this.factory = source; this.bounds = null; this.attrs = new FactoryAttributes(source); attrs.addAttributeListener(new MyAttributeListener()); Boolean value = (Boolean) source.getFeature(ComponentFactory.SHOULD_SNAP, attrs); this.shouldSnap = value == null ? true : value.booleanValue(); } private AddTool(AddTool base) { this.descriptionBase = base.descriptionBase; this.description = base.description; this.sourceLoadAttempted = base.sourceLoadAttempted; this.factory = base.factory; this.bounds = base.bounds; this.shouldSnap = base.shouldSnap; this.attrs = (AttributeSet) base.attrs.clone(); attrs.addAttributeListener(new MyAttributeListener()); } @Override public boolean equals(Object other) { if (!(other instanceof AddTool)) return false; AddTool o = (AddTool) other; if (this.description != null) { return this.descriptionBase == o.descriptionBase && this.description.equals(o.description); } else { return this.factory.equals(o.factory); } } @Override public int hashCode() { FactoryDescription desc = description; return desc != null ? desc.hashCode() : factory.hashCode(); } @Override public boolean sharesSource(Tool other) { if (!(other instanceof AddTool)) return false; AddTool o = (AddTool) other; if (this.sourceLoadAttempted && o.sourceLoadAttempted) { return this.factory.equals(o.factory); } else if (this.description == null) { return o.description == null; } else { return this.description.equals(o.description); } } public ComponentFactory getFactory(boolean forceLoad) { return forceLoad ? getFactory() : factory; } public ComponentFactory getFactory() { ComponentFactory ret = factory; if (ret != null || sourceLoadAttempted) { return ret; } else { ret = description.getFactory(descriptionBase); if (ret != null) { AttributeSet base = getBaseAttributes(); Boolean value = (Boolean) ret.getFeature(ComponentFactory.SHOULD_SNAP, base); shouldSnap = value == null ? true : value.booleanValue(); } factory = ret; sourceLoadAttempted = true; return ret; } } @Override public String getName() { FactoryDescription desc = description; return desc == null ? factory.getName() : desc.getName(); } @Override public String getDisplayName() { FactoryDescription desc = description; return desc == null ? factory.getDisplayName() : desc.getDisplayName(); } @Override public String getDescription() { String ret; FactoryDescription desc = description; if (desc != null) { ret = desc.getToolTip(); } else { ComponentFactory source = getFactory(); if (source != null) { ret = (String) source.getFeature(ComponentFactory.TOOL_TIP, getAttributeSet()); } else { ret = null; } } if (ret == null) { ret = StringUtil.format(Strings.get("addToolText"), getDisplayName()); } return ret; } @Override public Tool cloneTool() { return new AddTool(this); } @Override public AttributeSet getAttributeSet() { return attrs; } @Override public boolean isAllDefaultValues(AttributeSet attrs, LogisimVersion ver) { return this.attrs == attrs && attrs instanceof FactoryAttributes && !((FactoryAttributes) attrs).isFactoryInstantiated(); } @Override public Object getDefaultAttributeValue(Attribute attr, LogisimVersion ver) { return getFactory().getDefaultAttributeValue(attr, ver); } @Override public void draw(Canvas canvas, ComponentDrawContext context) { // next "if" suggested roughly by Kevin Walsh of Cornell to take care of // repaint problems on OpenJDK under Ubuntu int x = lastX; int y = lastY; if (x == INVALID_COORD || y == INVALID_COORD) return; ComponentFactory source = getFactory(); if (source == null) return; if (state == SHOW_GHOST) { source.drawGhost(context, Color.GRAY, x, y, getBaseAttributes()); } else if (state == SHOW_ADD) { source.drawGhost(context, Color.BLACK, x, y, getBaseAttributes()); } } private AttributeSet getBaseAttributes() { AttributeSet ret = attrs; if (ret instanceof FactoryAttributes) { ret = ((FactoryAttributes) ret).getBase(); } return ret; } public void cancelOp() { } @Override public void select(Canvas canvas) { setState(canvas, SHOW_GHOST); bounds = null; } @Override public void deselect(Canvas canvas) { setState(canvas, SHOW_GHOST); moveTo(canvas, canvas.getGraphics(), INVALID_COORD, INVALID_COORD); bounds = null; lastAddition = null; } private synchronized void moveTo(Canvas canvas, Graphics g, int x, int y) { if (state != SHOW_NONE) expose(canvas, lastX, lastY); lastX = x; lastY = y; if (state != SHOW_NONE) expose(canvas, lastX, lastY); } @Override public void mouseEntered(Canvas canvas, Graphics g, MouseEvent e) { if (state == SHOW_GHOST || state == SHOW_NONE) { setState(canvas, SHOW_GHOST); canvas.requestFocusInWindow(); } else if (state == SHOW_ADD_NO) { setState(canvas, SHOW_ADD); canvas.requestFocusInWindow(); } } @Override public void mouseExited(Canvas canvas, Graphics g, MouseEvent e) { if (state == SHOW_GHOST) { moveTo(canvas, canvas.getGraphics(), INVALID_COORD, INVALID_COORD); setState(canvas, SHOW_NONE); } else if (state == SHOW_ADD) { moveTo(canvas, canvas.getGraphics(), INVALID_COORD, INVALID_COORD); setState(canvas, SHOW_ADD_NO); } } @Override public void mouseMoved(Canvas canvas, Graphics g, MouseEvent e) { if (state != SHOW_NONE) { if (shouldSnap) Canvas.snapToGrid(e); moveTo(canvas, g, e.getX(), e.getY()); } } @Override public void mousePressed(Canvas canvas, Graphics g, MouseEvent e) { // verify the addition would be valid Circuit circ = canvas.getCircuit(); if (!canvas.getProject().getLogisimFile().contains(circ)) { canvas.setErrorMessage(Strings.getter("cannotModifyError")); return; } if (factory instanceof SubcircuitFactory) { SubcircuitFactory circFact = (SubcircuitFactory) factory; Dependencies depends = canvas.getProject().getDependencies(); if (!depends.canAdd(circ, circFact.getSubcircuit())) { canvas.setErrorMessage(Strings.getter("circularError")); return; } } if (shouldSnap) Canvas.snapToGrid(e); moveTo(canvas, g, e.getX(), e.getY()); setState(canvas, SHOW_ADD); } @Override public void mouseDragged(Canvas canvas, Graphics g, MouseEvent e) { if (state != SHOW_NONE) { if (shouldSnap) Canvas.snapToGrid(e); moveTo(canvas, g, e.getX(), e.getY()); } } @Override public void mouseReleased(Canvas canvas, Graphics g, MouseEvent e) { Component added = null; if (state == SHOW_ADD) { Circuit circ = canvas.getCircuit(); if (!canvas.getProject().getLogisimFile().contains(circ)) return; if (shouldSnap) Canvas.snapToGrid(e); moveTo(canvas, g, e.getX(), e.getY()); Location loc = Location.create(e.getX(), e.getY()); AttributeSet attrsCopy = (AttributeSet) attrs.clone(); ComponentFactory source = getFactory(); if (source == null) return; Component c = source.createComponent(loc, attrsCopy); if (circ.hasConflict(c)) { canvas.setErrorMessage(Strings.getter("exclusiveError")); return; } Bounds bds = c.getBounds(g); if (bds.getX() < 0 || bds.getY() < 0) { canvas.setErrorMessage(Strings.getter("negativeCoordError")); return; } try { CircuitMutation mutation = new CircuitMutation(circ); mutation.add(c); Action action = mutation.toAction(Strings.getter("addComponentAction", factory.getDisplayGetter())); canvas.getProject().doAction(action); lastAddition = action; added = c; } catch (CircuitException ex) { JOptionPane.showMessageDialog(canvas.getProject().getFrame(), ex.getMessage()); } setState(canvas, SHOW_GHOST); } else if (state == SHOW_ADD_NO) { setState(canvas, SHOW_NONE); } Project proj = canvas.getProject(); Tool next = determineNext(proj); if (next != null) { proj.setTool(next); Action act = SelectionActions.dropAll(canvas.getSelection()); if (act != null) { proj.doAction(act); } if (added != null) canvas.getSelection().add(added); } } private Tool determineNext(Project proj) { String afterAdd = AppPreferences.ADD_AFTER.get(); if (afterAdd.equals(AppPreferences.ADD_AFTER_UNCHANGED)) { return null; } else { // switch to Edit Tool Library base = proj.getLogisimFile().getLibrary("Base"); if (base == null) { return null; } else { return base.getTool("Edit Tool"); } } } @Override public void keyPressed(Canvas canvas, KeyEvent event) { processKeyEvent(canvas, event, KeyConfigurationEvent.KEY_PRESSED); if (!event.isConsumed() && event.getModifiersEx() == 0) { switch (event.getKeyCode()) { case KeyEvent.VK_UP: setFacing(canvas, Direction.NORTH); break; case KeyEvent.VK_DOWN: setFacing(canvas, Direction.SOUTH); break; case KeyEvent.VK_LEFT: setFacing(canvas, Direction.WEST); break; case KeyEvent.VK_RIGHT: setFacing(canvas, Direction.EAST); break; case KeyEvent.VK_BACK_SPACE: if (lastAddition != null && canvas.getProject().getLastAction() == lastAddition) { canvas.getProject().undoAction(); lastAddition = null; } } } } @Override public void keyReleased(Canvas canvas, KeyEvent event) { processKeyEvent(canvas, event, KeyConfigurationEvent.KEY_RELEASED); } @Override public void keyTyped(Canvas canvas, KeyEvent event) { processKeyEvent(canvas, event, KeyConfigurationEvent.KEY_TYPED); } private void processKeyEvent(Canvas canvas, KeyEvent event, int type) { KeyConfigurator handler = keyHandler; if (!keyHandlerTried) { ComponentFactory source = getFactory(); AttributeSet baseAttrs = getBaseAttributes(); handler = (KeyConfigurator) source.getFeature(KeyConfigurator.class, baseAttrs); keyHandler = handler; keyHandlerTried = true; } if (handler != null) { AttributeSet baseAttrs = getBaseAttributes(); KeyConfigurationEvent e = new KeyConfigurationEvent(type, baseAttrs, event, this); KeyConfigurationResult r = handler.keyEventReceived(e); if (r != null) { Action act = ToolAttributeAction.create(r); canvas.getProject().doAction(act); } } } private void setFacing(Canvas canvas, Direction facing) { ComponentFactory source = getFactory(); if (source == null) return; AttributeSet base = getBaseAttributes(); Object feature = source.getFeature(ComponentFactory.FACING_ATTRIBUTE_KEY, base); @SuppressWarnings("unchecked") Attribute attr = (Attribute) feature; if (attr != null) { Action act = ToolAttributeAction.create(this, attr, facing); canvas.getProject().doAction(act); } } @Override public void paintIcon(ComponentDrawContext c, int x, int y) { FactoryDescription desc = description; if (desc != null && !desc.isFactoryLoaded()) { Icon icon = desc.getIcon(); if (icon != null) { icon.paintIcon(c.getDestination(), c.getGraphics(), x + 2, y + 2); return; } } ComponentFactory source = getFactory(); if (source != null) { AttributeSet base = getBaseAttributes(); source.paintIcon(c, x, y, base); } } private void expose(java.awt.Component c, int x, int y) { Bounds bds = getBounds(); c.repaint(x + bds.getX(), y + bds.getY(), bds.getWidth(), bds.getHeight()); } @Override public Cursor getCursor() { return cursor; } private void setState(Canvas canvas, int value) { if (value == SHOW_GHOST) { if (canvas.getProject().getLogisimFile().contains(canvas.getCircuit()) && AppPreferences.ADD_SHOW_GHOSTS.getBoolean()) { state = SHOW_GHOST; } else { state = SHOW_NONE; } } else{ state = value; } } private Bounds getBounds() { Bounds ret = bounds; if (ret == null) { ComponentFactory source = getFactory(); if (source == null) { ret = Bounds.EMPTY_BOUNDS; } else { AttributeSet base = getBaseAttributes(); ret = source.getOffsetBounds(base).expand(5); } bounds = ret; } return ret; } } logisim-2.7.1/src/com/cburch/logisim/tools/AbstractCaret.java0000644000175000017500000000304411446034522024067 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.tools; import java.awt.Graphics; import java.awt.event.MouseEvent; import java.awt.event.KeyEvent; import java.util.Collections; import java.util.List; import java.util.ArrayList; import com.cburch.logisim.data.Bounds; public class AbstractCaret implements Caret { private ArrayList listeners = new ArrayList(); private List listenersView; private Bounds bds = Bounds.EMPTY_BOUNDS; public AbstractCaret() { listenersView = Collections.unmodifiableList(listeners); } // listener methods public void addCaretListener(CaretListener e) { listeners.add(e); } public void removeCaretListener(CaretListener e) { listeners.remove(e); } protected List getCaretListeners() { return listenersView; } // configuration methods public void setBounds(Bounds value) { bds = value; } // query/Graphics methods public String getText() { return ""; } public Bounds getBounds(Graphics g) { return bds; } public void draw(Graphics g) { } // finishing public void commitText(String text) { } public void cancelEditing() { } public void stopEditing() { } // events to handle public void mousePressed(MouseEvent e) { } public void mouseDragged(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void keyPressed(KeyEvent e) { } public void keyReleased(KeyEvent e) { } public void keyTyped(KeyEvent e) { } } logisim-2.7.1/src/com/cburch/logisim/std/0000755000175000017500000000000011527054370020136 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/logisim/std/wiring/0000755000175000017500000000000011537604346021442 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/logisim/std/wiring/Wiring.java0000644000175000017500000000463211530653030023534 0ustar vincentvincent/* Copyright (c) 2011, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.wiring; import java.util.ArrayList; import java.util.List; import com.cburch.logisim.circuit.SplitterFactory; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeOption; import com.cburch.logisim.data.Attributes; import com.cburch.logisim.tools.AddTool; import com.cburch.logisim.tools.FactoryDescription; import com.cburch.logisim.tools.Library; import com.cburch.logisim.tools.Tool; public class Wiring extends Library { static final AttributeOption GATE_TOP_LEFT = new AttributeOption("tl", Strings.getter("wiringGateTopLeftOption")); static final AttributeOption GATE_BOTTOM_RIGHT = new AttributeOption("br", Strings.getter("wiringGateBottomRightOption")); static final Attribute ATTR_GATE = Attributes.forOption("gate", Strings.getter("wiringGateAttr"), new AttributeOption[] { GATE_TOP_LEFT, GATE_BOTTOM_RIGHT }); private static Tool[] ADD_TOOLS = { new AddTool(SplitterFactory.instance), new AddTool(Pin.FACTORY), new AddTool(Probe.FACTORY), new AddTool(Tunnel.FACTORY), new AddTool(PullResistor.FACTORY), new AddTool(Clock.FACTORY), new AddTool(Constant.FACTORY), }; private static FactoryDescription[] DESCRIPTIONS = { new FactoryDescription("Power", Strings.getter("powerComponent"), "power.gif", "Power"), new FactoryDescription("Ground", Strings.getter("groundComponent"), "ground.gif", "Ground"), new FactoryDescription("Transistor", Strings.getter("transistorComponent"), "trans0.gif", "Transistor"), new FactoryDescription("Transmission Gate", Strings.getter("transmissionGateComponent"), "transmis.gif", "TransmissionGate"), new FactoryDescription("Bit Extender", Strings.getter("extenderComponent"), "extender.gif", "BitExtender"), }; private List tools = null; public Wiring() { } @Override public String getName() { return "Wiring"; } @Override public String getDisplayName() { return Strings.get("wiringLibrary"); } @Override public List getTools() { if (tools == null) { List ret = new ArrayList(ADD_TOOLS.length + DESCRIPTIONS.length); for (Tool a : ADD_TOOLS) { ret.add(a); } ret.addAll(FactoryDescription.getTools(Wiring.class, DESCRIPTIONS)); tools = ret; } return tools; } } logisim-2.7.1/src/com/cburch/logisim/std/wiring/TunnelAttributes.java0000644000175000017500000000657711524651336025635 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.wiring; import java.awt.Font; import java.util.Arrays; import java.util.List; import com.cburch.logisim.comp.TextField; import com.cburch.logisim.data.AbstractAttributeSet; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.instance.StdAttr; class TunnelAttributes extends AbstractAttributeSet { private static final List> ATTRIBUTES = Arrays.asList(new Attribute[] { StdAttr.FACING, StdAttr.WIDTH, StdAttr.LABEL, StdAttr.LABEL_FONT }); private Direction facing; private BitWidth width; private String label; private Font labelFont; private Bounds offsetBounds; private int labelX; private int labelY; private int labelHAlign; private int labelVAlign; public TunnelAttributes() { facing = Direction.WEST; width = BitWidth.ONE; label = ""; labelFont = StdAttr.DEFAULT_LABEL_FONT; offsetBounds = null; configureLabel(); } Direction getFacing() { return facing; } String getLabel() { return label; } Font getFont() { return labelFont; } Bounds getOffsetBounds() { return offsetBounds; } int getLabelX() { return labelX; } int getLabelY() { return labelY; } int getLabelHAlign() { return labelHAlign; } int getLabelVAlign() { return labelVAlign; } boolean setOffsetBounds(Bounds value) { Bounds old = offsetBounds; boolean same = old == null ? value == null : old.equals(value); if (!same) { offsetBounds = value; } return !same; } @Override protected void copyInto(AbstractAttributeSet destObj) { ; // nothing to do } @Override public List> getAttributes() { return ATTRIBUTES; } @Override @SuppressWarnings("unchecked") public V getValue(Attribute attr) { if (attr == StdAttr.FACING) return (V) facing; if (attr == StdAttr.WIDTH) return (V) width; if (attr == StdAttr.LABEL) return (V) label; if (attr == StdAttr.LABEL_FONT) return (V) labelFont; return null; } @Override public void setValue(Attribute attr, V value) { if (attr == StdAttr.FACING) { facing = (Direction) value; configureLabel(); } else if (attr == StdAttr.WIDTH) { width = (BitWidth) value; } else if (attr == StdAttr.LABEL) { label = (String) value; } else if (attr == StdAttr.LABEL_FONT) { labelFont = (Font) value; } else { throw new IllegalArgumentException("unknown attribute"); } offsetBounds = null; fireAttributeValueChanged(attr, value); } private void configureLabel() { Direction facing = this.facing; int x; int y; int halign; int valign; int margin = Tunnel.ARROW_MARGIN; if (facing == Direction.NORTH) { x = 0; y = margin; halign = TextField.H_CENTER; valign = TextField.V_TOP; } else if (facing == Direction.SOUTH) { x = 0; y = -margin; halign = TextField.H_CENTER; valign = TextField.V_BOTTOM; } else if (facing == Direction.EAST) { x = -margin; y = 0; halign = TextField.H_RIGHT; valign = TextField.V_CENTER_OVERALL; } else { x = margin; y = 0; halign = TextField.H_LEFT; valign = TextField.V_CENTER_OVERALL; } labelX = x; labelY = y; labelHAlign = halign; labelVAlign = valign; } } logisim-2.7.1/src/com/cburch/logisim/std/wiring/Tunnel.java0000644000175000017500000001406611524651336023556 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.wiring; import java.awt.Color; import java.awt.FontMetrics; import java.awt.Graphics; import com.cburch.logisim.comp.TextField; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.tools.key.BitWidthConfigurator; import com.cburch.logisim.util.GraphicsUtil; public class Tunnel extends InstanceFactory { public static final Tunnel FACTORY = new Tunnel(); static final int MARGIN = 3; static final int ARROW_MARGIN = 5; static final int ARROW_DEPTH = 4; static final int ARROW_MIN_WIDTH = 16; static final int ARROW_MAX_WIDTH = 20; public Tunnel() { super("Tunnel", Strings.getter("tunnelComponent")); setIconName("tunnel.gif"); setFacingAttribute(StdAttr.FACING); setKeyConfigurator(new BitWidthConfigurator(StdAttr.WIDTH)); } @Override public AttributeSet createAttributeSet() { return new TunnelAttributes(); } @Override public Bounds getOffsetBounds(AttributeSet attrsBase) { TunnelAttributes attrs = (TunnelAttributes) attrsBase; Bounds bds = attrs.getOffsetBounds(); if (bds != null) { return bds; } else { int ht = attrs.getFont().getSize(); int wd = ht * attrs.getLabel().length() / 2; bds = computeBounds(attrs, wd, ht, null, ""); attrs.setOffsetBounds(bds); return bds; } } // // graphics methods // @Override public void paintGhost(InstancePainter painter) { TunnelAttributes attrs = (TunnelAttributes) painter.getAttributeSet(); Direction facing = attrs.getFacing(); String label = attrs.getLabel(); Graphics g = painter.getGraphics(); g.setFont(attrs.getFont()); FontMetrics fm = g.getFontMetrics(); Bounds bds = computeBounds(attrs, fm.stringWidth(label), fm.getAscent() + fm.getDescent(), g, label); if (attrs.setOffsetBounds(bds)) { Instance instance = painter.getInstance(); if (instance != null) instance.recomputeBounds(); } int x0 = bds.getX(); int y0 = bds.getY(); int x1 = x0 + bds.getWidth(); int y1 = y0 + bds.getHeight(); int mw = ARROW_MAX_WIDTH / 2; int[] xp; int[] yp; if (facing == Direction.NORTH) { int yb = y0 + ARROW_DEPTH; if (x1 - x0 <= ARROW_MAX_WIDTH) { xp = new int[] { x0, 0, x1, x1, x0 }; yp = new int[] { yb, y0, yb, y1, y1 }; } else { xp = new int[] { x0, -mw, 0, mw, x1, x1, x0 }; yp = new int[] { yb, yb, y0, yb, yb, y1, y1 }; } } else if (facing == Direction.SOUTH) { int yb = y1 - ARROW_DEPTH; if (x1 - x0 <= ARROW_MAX_WIDTH) { xp = new int[] { x0, x1, x1, 0, x0 }; yp = new int[] { y0, y0, yb, y1, yb }; } else { xp = new int[] { x0, x1, x1, mw, 0, -mw, x0 }; yp = new int[] { y0, y0, yb, yb, y1, yb, yb }; } } else if (facing == Direction.EAST) { int xb = x1 - ARROW_DEPTH; if (y1 - y0 <= ARROW_MAX_WIDTH) { xp = new int[] { x0, xb, x1, xb, x0 }; yp = new int[] { y0, y0, 0, y1, y1 }; } else { xp = new int[] { x0, xb, xb, x1, xb, xb, x0 }; yp = new int[] { y0, y0, -mw, 0, mw, y1, y1 }; } } else { int xb = x0 + ARROW_DEPTH; if (y1 - y0 <= ARROW_MAX_WIDTH) { xp = new int[] { xb, x1, x1, xb, x0 }; yp = new int[] { y0, y0, y1, y1, 0 }; } else { xp = new int[] { xb, x1, x1, xb, xb, x0, xb }; yp = new int[] { y0, y0, y1, y1, mw, 0, -mw }; } } GraphicsUtil.switchToWidth(g, 2); g.drawPolygon(xp, yp, xp.length); } @Override public void paintInstance(InstancePainter painter) { Location loc = painter.getLocation(); int x = loc.getX(); int y = loc.getY(); Graphics g = painter.getGraphics(); g.translate(x, y); g.setColor(Color.BLACK); paintGhost(painter); g.translate(-x, -y); painter.drawPorts(); } // // methods for instances // @Override protected void configureNewInstance(Instance instance) { instance.addAttributeListener(); instance.setPorts(new Port[] { new Port(0, 0, Port.INOUT, StdAttr.WIDTH) }); configureLabel(instance); } @Override protected void instanceAttributeChanged(Instance instance, Attribute attr) { if (attr == StdAttr.FACING) { configureLabel(instance); instance.recomputeBounds(); } else if (attr == StdAttr.LABEL || attr == StdAttr.LABEL_FONT) { instance.recomputeBounds(); } } @Override public void propagate(InstanceState state) { ; // nothing to do - handled by circuit } // // private methods // private void configureLabel(Instance instance) { TunnelAttributes attrs = (TunnelAttributes) instance.getAttributeSet(); Location loc = instance.getLocation(); instance.setTextField(StdAttr.LABEL, StdAttr.LABEL_FONT, loc.getX() + attrs.getLabelX(), loc.getY() + attrs.getLabelY(), attrs.getLabelHAlign(), attrs.getLabelVAlign()); } private Bounds computeBounds(TunnelAttributes attrs, int textWidth, int textHeight, Graphics g, String label) { int x = attrs.getLabelX(); int y = attrs.getLabelY(); int halign = attrs.getLabelHAlign(); int valign = attrs.getLabelVAlign(); int minDim = ARROW_MIN_WIDTH - 2 * MARGIN; int bw = Math.max(minDim, textWidth); int bh = Math.max(minDim, textHeight); int bx; int by; switch (halign) { case TextField.H_LEFT: bx = x; break; case TextField.H_RIGHT: bx = x - bw; break; default: bx = x - (bw / 2); } switch (valign) { case TextField.V_TOP: by = y; break; case TextField.V_BOTTOM: by = y - bh; break; default: by = y - (bh / 2); } if (g != null) { GraphicsUtil.drawText(g, label, bx + bw / 2, by + bh / 2, GraphicsUtil.H_CENTER, GraphicsUtil.V_CENTER_OVERALL); } return Bounds.create(bx, by, bw, bh).expand(MARGIN).add(0, 0); } }logisim-2.7.1/src/com/cburch/logisim/std/wiring/TransmissionGate.java0000644000175000017500000001512011537604346025576 0ustar vincentvincent/* Copyright (c) 2011, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ /** * Based on PUCTools (v0.9 beta) by CRC - PUC - Minas (pucmg.crc at gmail.com) */ package com.cburch.logisim.std.wiring; import java.awt.Color; import java.awt.Graphics2D; import com.cburch.logisim.circuit.Wire; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.tools.key.BitWidthConfigurator; import com.cburch.logisim.util.GraphicsUtil; public class TransmissionGate extends InstanceFactory { static final int OUTPUT = 0; static final int INPUT = 1; static final int GATE0 = 2; static final int GATE1 = 3; public TransmissionGate() { super("Transmission Gate", Strings.getter("transmissionGateComponent")); setIconName("transmis.gif"); setAttributes(new Attribute[] { StdAttr.FACING, Wiring.ATTR_GATE, StdAttr.WIDTH }, new Object[] { Direction.EAST, Wiring.GATE_TOP_LEFT, BitWidth.ONE }); setFacingAttribute(StdAttr.FACING); setKeyConfigurator(new BitWidthConfigurator(StdAttr.WIDTH)); } @Override protected void configureNewInstance(Instance instance) { instance.addAttributeListener(); updatePorts(instance); } @Override protected void instanceAttributeChanged(Instance instance, Attribute attr) { if (attr == StdAttr.FACING || attr == Wiring.ATTR_GATE) { instance.recomputeBounds(); updatePorts(instance); } else if (attr == StdAttr.WIDTH) { instance.fireInvalidated(); } } private void updatePorts(Instance instance) { int dx = 0; int dy = 0; Direction facing = instance.getAttributeValue(StdAttr.FACING); if (facing == Direction.NORTH) { dy = 1; } else if (facing == Direction.EAST) { dx = -1; } else if (facing == Direction.SOUTH) { dy = -1; } else if (facing == Direction.WEST) { dx = 1; } Object powerLoc = instance.getAttributeValue(Wiring.ATTR_GATE); boolean flip = (facing == Direction.SOUTH || facing == Direction.WEST) == (powerLoc == Wiring.GATE_TOP_LEFT); Port[] ports = new Port[4]; ports[OUTPUT] = new Port(0, 0, Port.OUTPUT, StdAttr.WIDTH); ports[INPUT] = new Port(40 * dx, 40 * dy, Port.INPUT, StdAttr.WIDTH); if (flip) { ports[GATE1] = new Port(20 * (dx - dy), 20 * (dx + dy), Port.INPUT, 1); ports[GATE0] = new Port(20 * (dx + dy), 20 * (-dx + dy), Port.INPUT, 1); } else { ports[GATE0] = new Port(20 * (dx - dy), 20 * (dx + dy), Port.INPUT, 1); ports[GATE1] = new Port(20 * (dx + dy), 20 * (-dx + dy), Port.INPUT, 1); } instance.setPorts(ports); } @Override public Bounds getOffsetBounds(AttributeSet attrs) { Direction facing = attrs.getValue(StdAttr.FACING); return Bounds.create(0, -20, 40, 40).rotate(Direction.WEST, facing, 0, 0); } @Override public boolean contains(Location loc, AttributeSet attrs) { if (super.contains(loc, attrs)) { Direction facing = attrs.getValue(StdAttr.FACING); Location center = Location.create(0, 0).translate(facing, -20); return center.manhattanDistanceTo(loc) < 24; } else { return false; } } @Override public void propagate(InstanceState state) { state.setPort(OUTPUT, computeOutput(state), 1); } private Value computeOutput(InstanceState state) { BitWidth width = state.getAttributeValue(StdAttr.WIDTH); Value input = state.getPort(INPUT); Value gate0 = state.getPort(GATE0); Value gate1 = state.getPort(GATE1); if (gate0.isFullyDefined() && gate1.isFullyDefined() && gate0 != gate1) { if (gate0 == Value.TRUE) { return Value.createUnknown(width); } else { return input; } } else { if (input.isFullyDefined()) { return Value.createError(width); } else { Value[] v = input.getAll(); for (int i = 0; i < v.length; i++) { if (v[i] != Value.UNKNOWN) { v[i] = Value.ERROR; } } return Value.create(v); } } } @Override public void paintInstance(InstancePainter painter) { drawInstance(painter, false); painter.drawPorts(); } @Override public void paintGhost(InstancePainter painter) { drawInstance(painter, true); } private void drawInstance(InstancePainter painter, boolean isGhost) { Bounds bds = painter.getBounds(); Object powerLoc = painter.getAttributeValue(Wiring.ATTR_GATE); Direction facing = painter.getAttributeValue(StdAttr.FACING); boolean flip = (facing == Direction.SOUTH || facing == Direction.WEST) == (powerLoc == Wiring.GATE_TOP_LEFT); int degrees = Direction.WEST.toDegrees() - facing.toDegrees(); if (flip) degrees += 180; double radians = Math.toRadians((degrees + 360) % 360); Graphics2D g = (Graphics2D) painter.getGraphics().create(); g.rotate(radians, bds.getX() + 20, bds.getY() + 20); g.translate(bds.getX(), bds.getY()); GraphicsUtil.switchToWidth(g, Wire.WIDTH); Color gate0 = g.getColor(); Color gate1 = gate0; Color input = gate0; Color output = gate0; Color platform = gate0; if (!isGhost && painter.getShowState()) { gate0 = painter.getPort(GATE0).getColor(); gate1 = painter.getPort(GATE0).getColor(); input = painter.getPort(INPUT).getColor(); output = painter.getPort(OUTPUT).getColor(); platform = computeOutput(painter).getColor(); } g.setColor(flip ? input : output); g.drawLine(0, 20, 11, 20); g.drawLine(11, 13, 11, 27); g.setColor(flip ? output : input); g.drawLine(29, 20, 40, 20); g.drawLine(29, 13, 29, 27); g.setColor(gate0); g.drawLine(20, 35, 20, 40); GraphicsUtil.switchToWidth(g, 1); g.drawOval(18, 30, 4, 4); g.drawLine(10, 30, 30, 30); GraphicsUtil.switchToWidth(g, Wire.WIDTH); g.setColor(gate1); g.drawLine(20, 9, 20, 0); GraphicsUtil.switchToWidth(g, 1); g.drawLine(10, 10, 30, 10); g.setColor(platform); g.drawLine(9, 12, 31, 12); g.drawLine(9, 28, 31, 28); if (flip) { // arrow g.drawLine(18, 17, 21, 20); g.drawLine(18, 23, 21, 20); } else { g.drawLine(22, 17, 19, 20); g.drawLine(22, 23, 19, 20); } g.dispose(); } } logisim-2.7.1/src/com/cburch/logisim/std/wiring/Transistor.java0000644000175000017500000001760511537604334024463 0ustar vincentvincent/* Copyright (c) 2011, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ /** * Based on PUCTools (v0.9 beta) by CRC - PUC - Minas (pucmg.crc at gmail.com) */ package com.cburch.logisim.std.wiring; import java.awt.Color; import java.awt.Graphics2D; import javax.swing.Icon; import com.cburch.logisim.circuit.Wire; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeOption; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Attributes; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.tools.key.BitWidthConfigurator; import com.cburch.logisim.util.GraphicsUtil; import com.cburch.logisim.util.Icons; public class Transistor extends InstanceFactory { static final AttributeOption TYPE_P = new AttributeOption("p", Strings.getter("transistorTypeP")); static final AttributeOption TYPE_N = new AttributeOption("n", Strings.getter("transistorTypeN")); static final Attribute ATTR_TYPE = Attributes.forOption("type", Strings.getter("transistorTypeAttr"), new AttributeOption[] { TYPE_P, TYPE_N }); static final int OUTPUT = 0; static final int INPUT = 1; static final int GATE = 2; private static final Icon ICON_N = Icons.getIcon("trans1.gif"); private static final Icon ICON_P = Icons.getIcon("trans0.gif"); public Transistor() { super("Transistor", Strings.getter("transistorComponent")); setAttributes( new Attribute[] { ATTR_TYPE, StdAttr.FACING, Wiring.ATTR_GATE, StdAttr.WIDTH }, new Object[] { TYPE_P, Direction.EAST, Wiring.GATE_TOP_LEFT, BitWidth.ONE }); setFacingAttribute(StdAttr.FACING); setKeyConfigurator(new BitWidthConfigurator(StdAttr.WIDTH)); } @Override protected void configureNewInstance(Instance instance) { instance.addAttributeListener(); updatePorts(instance); } @Override protected void instanceAttributeChanged(Instance instance, Attribute attr) { if (attr == StdAttr.FACING || attr == Wiring.ATTR_GATE) { instance.recomputeBounds(); updatePorts(instance); } else if (attr == StdAttr.WIDTH) { updatePorts(instance); } else if (attr == ATTR_TYPE) { instance.fireInvalidated(); } } private void updatePorts(Instance instance) { Direction facing = instance.getAttributeValue(StdAttr.FACING); int dx = 0; int dy = 0; if (facing == Direction.NORTH) { dy = 1; } else if (facing == Direction.EAST) { dx = -1; } else if (facing == Direction.SOUTH) { dy = -1; } else if (facing == Direction.WEST) { dx = 1; } Object powerLoc = instance.getAttributeValue(Wiring.ATTR_GATE); boolean flip = (facing == Direction.SOUTH || facing == Direction.WEST) == (powerLoc == Wiring.GATE_TOP_LEFT); Port[] ports = new Port[3]; ports[OUTPUT] = new Port(0, 0, Port.OUTPUT, StdAttr.WIDTH); ports[INPUT] = new Port(40 * dx, 40 * dy, Port.INPUT, StdAttr.WIDTH); if (flip) { ports[GATE] = new Port(20 * (dx + dy), 20 * (-dx + dy), Port.INPUT, 1); } else { ports[GATE] = new Port(20 * (dx - dy), 20 * (dx + dy), Port.INPUT, 1); } instance.setPorts(ports); } @Override public Bounds getOffsetBounds(AttributeSet attrs) { Direction facing = attrs.getValue(StdAttr.FACING); Object gateLoc = attrs.getValue(Wiring.ATTR_GATE); int delta = gateLoc == Wiring.GATE_TOP_LEFT ? -20 : 0; if (facing == Direction.NORTH) { return Bounds.create(delta, 0, 20, 40); } else if (facing == Direction.SOUTH) { return Bounds.create(delta, -40, 20, 40); } else if (facing == Direction.WEST) { return Bounds.create(0, delta, 40, 20); } else { // facing == Direction.EAST return Bounds.create(-40, delta, 40, 20); } } @Override public boolean contains(Location loc, AttributeSet attrs) { if (super.contains(loc, attrs)) { Direction facing = attrs.getValue(StdAttr.FACING); Location center = Location.create(0, 0).translate(facing, -20); return center.manhattanDistanceTo(loc) < 24; } else { return false; } } @Override public void propagate(InstanceState state) { state.setPort(OUTPUT, computeOutput(state), 1); } private Value computeOutput(InstanceState state) { BitWidth width = state.getAttributeValue(StdAttr.WIDTH); Value gate = state.getPort(GATE); Value input = state.getPort(INPUT); Value desired = state.getAttributeValue(ATTR_TYPE) == TYPE_P ? Value.FALSE : Value.TRUE; if (!gate.isFullyDefined()) { if (input.isFullyDefined()) { return Value.createError(width); } else { Value[] v = input.getAll(); for (int i = 0; i < v.length; i++) { if (v[i] != Value.UNKNOWN) { v[i] = Value.ERROR; } } return Value.create(v); } } else if (gate != desired) { return Value.createUnknown(width); } else { return input; } } @Override public void paintIcon(InstancePainter painter) { Object type = painter.getAttributeValue(ATTR_TYPE); Icon icon = type == TYPE_N ? ICON_N : ICON_P; icon.paintIcon(painter.getDestination(), painter.getGraphics(), 2, 2); } @Override public void paintInstance(InstancePainter painter) { drawInstance(painter, false); painter.drawPorts(); } @Override public void paintGhost(InstancePainter painter) { drawInstance(painter, true); } private void drawInstance(InstancePainter painter, boolean isGhost) { Object type = painter.getAttributeValue(ATTR_TYPE); Object powerLoc = painter.getAttributeValue(Wiring.ATTR_GATE); Direction from = painter.getAttributeValue(StdAttr.FACING); Direction facing = painter.getAttributeValue(StdAttr.FACING); boolean flip = (facing == Direction.SOUTH || facing == Direction.WEST) == (powerLoc == Wiring.GATE_TOP_LEFT); int degrees = Direction.EAST.toDegrees() - from.toDegrees(); double radians = Math.toRadians((degrees + 360) % 360); int m = flip ? 1 : -1; Graphics2D g = (Graphics2D) painter.getGraphics(); Location loc = painter.getLocation(); g.translate(loc.getX(), loc.getY()); g.rotate(radians); Color gate; Color input; Color output; Color platform; if (!isGhost && painter.getShowState()) { gate = painter.getPort(GATE).getColor(); input = painter.getPort(INPUT).getColor(); output = painter.getPort(OUTPUT).getColor(); Value out = computeOutput(painter); platform = out.isUnknown() ? Value.UNKNOWN.getColor() : out.getColor(); } else { Color base = g.getColor(); gate = base; input = base; output = base; platform = base; } // input and output lines GraphicsUtil.switchToWidth(g, Wire.WIDTH); g.setColor(output); g.drawLine(0, 0, -11, 0); g.drawLine(-11, m * 7, -11, 0); g.setColor(input); g.drawLine(-40, 0, -29, 0); g.drawLine(-29, m * 7, -29, 0); // gate line g.setColor(gate); if (type == TYPE_P) { g.drawLine(-20, m * 20, -20, m * 15); GraphicsUtil.switchToWidth(g, 1); g.drawOval(-22, m * 12 - 2, 4, 4); } else { g.drawLine(-20, m * 20, -20, m * 11); GraphicsUtil.switchToWidth(g, 1); } // draw platforms g.drawLine(-10, m * 10, -30, m * 10); // gate platform g.setColor(platform); g.drawLine(-9, m * 8, -31, m * 8); // input/output platform // arrow (same color as platform) g.drawLine(-21, m * 6, -18, m * 3); g.drawLine(-21, 0, -18, m * 3); g.rotate(-radians); g.translate(-loc.getX(), -loc.getY()); } } logisim-2.7.1/src/com/cburch/logisim/std/wiring/Strings.java0000644000175000017500000000145511524651336023740 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.wiring; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.StringGetter; import com.cburch.logisim.util.StringUtil; class Strings { private static LocaleManager source = new LocaleManager("resources/logisim", "std"); public static String get(String key) { return source.get(key); } public static String get(String key, String arg0) { return StringUtil.format(source.get(key), arg0); } public static String get(String key, String arg0, String arg1) { return StringUtil.format(source.get(key), arg0, arg1); } public static StringGetter getter(String key) { return source.getter(key); } } logisim-2.7.1/src/com/cburch/logisim/std/wiring/PullResistor.java0000644000175000017500000001327011527054340024747 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.wiring; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import javax.swing.Icon; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeOption; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Attributes; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.prefs.AppPreferences; import com.cburch.logisim.util.GraphicsUtil; import com.cburch.logisim.util.Icons; public class PullResistor extends InstanceFactory { public static final Attribute ATTR_PULL_TYPE = Attributes.forOption("pull", Strings.getter("pullTypeAttr"), new AttributeOption[] { new AttributeOption(Value.FALSE, "0", Strings.getter("pullZeroType")), new AttributeOption(Value.TRUE, "1", Strings.getter("pullOneType")), new AttributeOption(Value.ERROR, "X", Strings.getter("pullErrorType")) }); public static final PullResistor FACTORY = new PullResistor(); private static final Icon ICON_SHAPED = Icons.getIcon("pullshap.gif"); private static final Icon ICON_RECTANGULAR = Icons.getIcon("pullrect.gif"); public PullResistor() { super("Pull Resistor", Strings.getter("pullComponent")); setAttributes(new Attribute[] { StdAttr.FACING, ATTR_PULL_TYPE }, new Object[] { Direction.SOUTH, ATTR_PULL_TYPE.parse("0") }); setFacingAttribute(StdAttr.FACING); } @Override public Bounds getOffsetBounds(AttributeSet attrs) { Direction facing = attrs.getValue(StdAttr.FACING); if (facing == Direction.EAST) { return Bounds.create(-42, -6, 42, 12); } else if (facing == Direction.WEST) { return Bounds.create(0, -6, 42, 12); } else if (facing == Direction.NORTH) { return Bounds.create(-6, 0, 12, 42); } else { return Bounds.create(-6, -42, 12, 42); } } // // graphics methods // @Override public void paintIcon(InstancePainter painter) { Icon icon; if (painter.getGateShape() == AppPreferences.SHAPE_SHAPED) { icon = ICON_SHAPED; } else { icon = ICON_RECTANGULAR; } icon.paintIcon(painter.getDestination(), painter.getGraphics(), 2, 2); } @Override public void paintGhost(InstancePainter painter) { Value pull = getPullValue(painter.getAttributeSet()); paintBase(painter, pull, null, null); } @Override public void paintInstance(InstancePainter painter) { Location loc = painter.getLocation(); int x = loc.getX(); int y = loc.getY(); Graphics g = painter.getGraphics(); g.translate(x, y); Value pull = getPullValue(painter.getAttributeSet()); Value actual = painter.getPort(0); paintBase(painter, pull, pull.getColor(), actual.getColor()); g.translate(-x, -y); painter.drawPorts(); } private void paintBase(InstancePainter painter, Value pullValue, Color inColor, Color outColor) { boolean color = painter.shouldDrawColor(); Direction facing = painter.getAttributeValue(StdAttr.FACING); Graphics g = painter.getGraphics(); Color baseColor = g.getColor(); GraphicsUtil.switchToWidth(g, 3); if (color && inColor != null) g.setColor(inColor); if (facing == Direction.EAST) { GraphicsUtil.drawText(g, pullValue.toDisplayString(), -32, 0, GraphicsUtil.H_RIGHT, GraphicsUtil.V_CENTER); } else if (facing == Direction.WEST) { GraphicsUtil.drawText(g, pullValue.toDisplayString(), 32, 0, GraphicsUtil.H_LEFT, GraphicsUtil.V_CENTER); } else if (facing == Direction.NORTH) { GraphicsUtil.drawText(g, pullValue.toDisplayString(), 0, 32, GraphicsUtil.H_CENTER, GraphicsUtil.V_TOP); } else { GraphicsUtil.drawText(g, pullValue.toDisplayString(), 0, -32, GraphicsUtil.H_CENTER, GraphicsUtil.V_BASELINE); } double rotate = 0.0; if (g instanceof Graphics2D) { rotate = Direction.SOUTH.toRadians() - facing.toRadians(); if (rotate != 0.0) ((Graphics2D) g).rotate(rotate); } g.drawLine(0, -30, 0, -26); g.drawLine(-6, -30, 6, -30); if (color && outColor != null) g.setColor(outColor); g.drawLine(0, -4, 0, 0); g.setColor(baseColor); GraphicsUtil.switchToWidth(g, 2); if (painter.getGateShape() == AppPreferences.SHAPE_SHAPED) { int[] xp = { 0, -5, 5, -5, 5, -5, 0 }; int[] yp = { -25, -23, -19, -15, -11, -7, -5}; g.drawPolyline(xp, yp, xp.length); } else { g.drawRect(-5, -25, 10, 20); } if (rotate != 0.0) { ((Graphics2D) g).rotate(-rotate); } } // // methods for instances // @Override protected void configureNewInstance(Instance instance) { instance.addAttributeListener(); instance.setPorts(new Port[] { new Port(0, 0, Port.INOUT, BitWidth.UNKNOWN) }); } @Override protected void instanceAttributeChanged(Instance instance, Attribute attr) { if (attr == StdAttr.FACING) { instance.recomputeBounds(); } else if (attr == ATTR_PULL_TYPE) { instance.fireInvalidated(); } } @Override public void propagate(InstanceState state) { ; // nothing to do - handled by CircuitWires } public static Value getPullValue(Instance instance) { return getPullValue(instance.getAttributeSet()); } private static Value getPullValue(AttributeSet attrs) { AttributeOption opt = attrs.getValue(ATTR_PULL_TYPE); return (Value) opt.getValue(); } }logisim-2.7.1/src/com/cburch/logisim/std/wiring/ProbeAttributes.java0000644000175000017500000000420311524651336025417 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.wiring; import java.awt.Font; import java.util.Arrays; import java.util.List; import com.cburch.logisim.circuit.RadixOption; import com.cburch.logisim.data.AbstractAttributeSet; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Direction; import com.cburch.logisim.instance.StdAttr; class ProbeAttributes extends AbstractAttributeSet { public static ProbeAttributes instance = new ProbeAttributes(); private static final List> ATTRIBUTES = Arrays.asList(new Attribute[] { StdAttr.FACING, RadixOption.ATTRIBUTE, StdAttr.LABEL, Pin.ATTR_LABEL_LOC, StdAttr.LABEL_FONT, }); Direction facing = Direction.EAST; String label = ""; Direction labelloc = Direction.WEST; Font labelfont = StdAttr.DEFAULT_LABEL_FONT; RadixOption radix = RadixOption.RADIX_2; BitWidth width = BitWidth.ONE; public ProbeAttributes() { } @Override protected void copyInto(AbstractAttributeSet destObj) { ; // nothing to do } @Override public List> getAttributes() { return ATTRIBUTES; } @Override @SuppressWarnings("unchecked") public E getValue(Attribute attr) { if (attr == StdAttr.FACING) return (E) facing; if (attr == StdAttr.LABEL) return (E) label; if (attr == Pin.ATTR_LABEL_LOC) return (E) labelloc; if (attr == StdAttr.LABEL_FONT) return (E) labelfont; if (attr == RadixOption.ATTRIBUTE) return (E) radix; return null; } @Override public void setValue(Attribute attr, V value) { if (attr == StdAttr.FACING) { facing = (Direction) value; } else if (attr == StdAttr.LABEL) { label = (String) value; } else if (attr == Pin.ATTR_LABEL_LOC) { labelloc = (Direction) value; } else if (attr == StdAttr.LABEL_FONT) { labelfont = (Font) value; } else if (attr == RadixOption.ATTRIBUTE) { radix = (RadixOption) value; } else { throw new IllegalArgumentException("unknown attribute"); } fireAttributeValueChanged(attr, value); } } logisim-2.7.1/src/com/cburch/logisim/std/wiring/Probe.java0000644000175000017500000002660511524651336023362 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.wiring; import java.awt.Color; import java.awt.Graphics; import com.cburch.logisim.circuit.RadixOption; import com.cburch.logisim.comp.TextField; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceData; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstanceLogger; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.util.GraphicsUtil; public class Probe extends InstanceFactory { public static final Probe FACTORY = new Probe(); private static class StateData implements InstanceData, Cloneable { Value curValue = Value.NIL; @Override public Object clone() { try { return super.clone(); } catch (CloneNotSupportedException e) { return null; } } } public static class ProbeLogger extends InstanceLogger { public ProbeLogger() { } @Override public String getLogName(InstanceState state, Object option) { String ret = state.getAttributeValue(StdAttr.LABEL); return ret != null && !ret.equals("") ? ret : null; } @Override public Value getLogValue(InstanceState state, Object option) { return getValue(state); } } public Probe() { super("Probe", Strings.getter("probeComponent")); setIconName("probe.gif"); setFacingAttribute(StdAttr.FACING); setInstanceLogger(ProbeLogger.class); } @Override public AttributeSet createAttributeSet() { return new ProbeAttributes(); } @Override public Bounds getOffsetBounds(AttributeSet attrsBase) { ProbeAttributes attrs = (ProbeAttributes) attrsBase; return getOffsetBounds(attrs.facing, attrs.width, attrs.radix); } // // graphics methods // @Override public void paintGhost(InstancePainter painter) { Graphics g = painter.getGraphics(); Bounds bds = painter.getOffsetBounds(); g.drawOval(bds.getX() + 1, bds.getY() + 1, bds.getWidth() - 1, bds.getHeight() - 1); } @Override public void paintInstance(InstancePainter painter) { Value value = getValue(painter); Graphics g = painter.getGraphics(); Bounds bds = painter.getBounds(); // intentionally with no graphics object - we don't want label included int x = bds.getX(); int y = bds.getY(); g.setColor(Color.WHITE); g.fillRect(x + 5, y + 5, bds.getWidth() - 10, bds.getHeight() - 10); g.setColor(Color.GRAY); if (value.getWidth() <= 1) { g.drawOval(x + 1, y + 1, bds.getWidth() - 2, bds.getHeight() - 2); } else { g.drawRoundRect(x + 1, y + 1, bds.getWidth() - 2, bds.getHeight() - 2, 6, 6); } g.setColor(Color.BLACK); painter.drawLabel(); if (!painter.getShowState()) { if (value.getWidth() > 0) { GraphicsUtil.drawCenteredText(g, "x" + value.getWidth(), bds.getX() + bds.getWidth() / 2, bds.getY() + bds.getHeight() / 2); } } else { paintValue(painter, value); } painter.drawPorts(); } static void paintValue(InstancePainter painter, Value value) { Graphics g = painter.getGraphics(); Bounds bds = painter.getBounds(); // intentionally with no graphics object - we don't want label included RadixOption radix = painter.getAttributeValue(RadixOption.ATTRIBUTE); if (radix == null || radix == RadixOption.RADIX_2) { int x = bds.getX(); int y = bds.getY(); int wid = value.getWidth(); if (wid == 0) { x += bds.getWidth() / 2; y += bds.getHeight() / 2; GraphicsUtil.switchToWidth(g, 2); g.drawLine(x - 4, y, x + 4, y); return; } int x0 = bds.getX() + bds.getWidth() - 5; int compWidth = wid * 10; if (compWidth < bds.getWidth() - 3) { x0 = bds.getX() + (bds.getWidth() + compWidth) / 2 - 5; } int cx = x0; int cy = bds.getY() + bds.getHeight() - 12; int cur = 0; for (int k = 0; k < wid; k++) { GraphicsUtil.drawCenteredText(g, value.get(k).toDisplayString(), cx, cy); ++cur; if (cur == 8) { cur = 0; cx = x0; cy -= 20; } else { cx -= 10; } } } else { String text = radix.toString(value); GraphicsUtil.drawCenteredText(g, text, bds.getX() + bds.getWidth() / 2, bds.getY() + bds.getHeight() / 2); } } // // methods for instances // @Override protected void configureNewInstance(Instance instance) { instance.setPorts(new Port[] { new Port(0, 0, Port.INPUT, BitWidth.UNKNOWN) }); instance.addAttributeListener(); configureLabel(instance); } @Override protected void instanceAttributeChanged(Instance instance, Attribute attr) { if (attr == Pin.ATTR_LABEL_LOC) { configureLabel(instance); } else if (attr == StdAttr.FACING || attr == RadixOption.ATTRIBUTE) { instance.recomputeBounds(); configureLabel(instance); } } @Override public void propagate(InstanceState state) { StateData oldData = (StateData) state.getData(); Value oldValue = oldData == null ? Value.NIL : oldData.curValue; Value newValue = state.getPort(0); boolean same = oldValue == null ? newValue == null : oldValue.equals(newValue); if (!same) { if (oldData == null) { oldData = new StateData(); oldData.curValue = newValue; state.setData(oldData); } else { oldData.curValue = newValue; } int oldWidth = oldValue == null ? 1 : oldValue.getBitWidth().getWidth(); int newWidth = newValue.getBitWidth().getWidth(); if (oldWidth != newWidth) { ProbeAttributes attrs = (ProbeAttributes) state.getAttributeSet(); attrs.width = newValue.getBitWidth(); state.getInstance().recomputeBounds(); configureLabel(state.getInstance()); } state.fireInvalidated(); } } private static Value getValue(InstanceState state) { StateData data = (StateData) state.getData(); return data == null ? Value.NIL : data.curValue; } void configureLabel(Instance instance) { ProbeAttributes attrs = (ProbeAttributes) instance.getAttributeSet(); Probe.configureLabel(instance, attrs.labelloc, attrs.facing); } // // static methods // static Bounds getOffsetBounds(Direction dir, BitWidth width, RadixOption radix) { Bounds ret = null; int len = radix == null || radix == RadixOption.RADIX_2 ? width.getWidth() : radix.getMaxLength(width); if (dir == Direction.EAST) { switch (len) { case 0: case 1: ret = Bounds.create(-20, -10, 20, 20); break; case 2: ret = Bounds.create(-20, -10, 20, 20); break; case 3: ret = Bounds.create(-30, -10, 30, 20); break; case 4: ret = Bounds.create(-40, -10, 40, 20); break; case 5: ret = Bounds.create(-50, -10, 50, 20); break; case 6: ret = Bounds.create(-60, -10, 60, 20); break; case 7: ret = Bounds.create(-70, -10, 70, 20); break; case 8: ret = Bounds.create(-80, -10, 80, 20); break; case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 16: ret = Bounds.create(-80, -20, 80, 40); break; case 17: case 18: case 19: case 20: case 21: case 22: case 23: case 24: ret = Bounds.create(-80, -30, 80, 60); break; case 25: case 26: case 27: case 28: case 29: case 30: case 31: case 32: ret = Bounds.create(-80, -40, 80, 80); break; } } else if (dir == Direction.WEST) { switch (len) { case 0: case 1: ret = Bounds.create(0, -10, 20, 20); break; case 2: ret = Bounds.create(0, -10, 20, 20); break; case 3: ret = Bounds.create(0, -10, 30, 20); break; case 4: ret = Bounds.create(0, -10, 40, 20); break; case 5: ret = Bounds.create(0, -10, 50, 20); break; case 6: ret = Bounds.create(0, -10, 60, 20); break; case 7: ret = Bounds.create(0, -10, 70, 20); break; case 8: ret = Bounds.create(0, -10, 80, 20); break; case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 16: ret = Bounds.create(0, -20, 80, 40); break; case 17: case 18: case 19: case 20: case 21: case 22: case 23: case 24: ret = Bounds.create(0, -30, 80, 60); break; case 25: case 26: case 27: case 28: case 29: case 30: case 31: case 32: ret = Bounds.create(0, -40, 80, 80); break; } } else if (dir == Direction.SOUTH) { switch (len) { case 0: case 1: ret = Bounds.create(-10, -20, 20, 20); break; case 2: ret = Bounds.create(-10, -20, 20, 20); break; case 3: ret = Bounds.create(-15, -20, 30, 20); break; case 4: ret = Bounds.create(-20, -20, 40, 20); break; case 5: ret = Bounds.create(-25, -20, 50, 20); break; case 6: ret = Bounds.create(-30, -20, 60, 20); break; case 7: ret = Bounds.create(-35, -20, 70, 20); break; case 8: ret = Bounds.create(-40, -20, 80, 20); break; case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 16: ret = Bounds.create(-40, -40, 80, 40); break; case 17: case 18: case 19: case 20: case 21: case 22: case 23: case 24: ret = Bounds.create(-40, -60, 80, 60); break; case 25: case 26: case 27: case 28: case 29: case 30: case 31: case 32: ret = Bounds.create(-40, -80, 80, 80); break; } } else if (dir == Direction.NORTH) { switch (len) { case 0: case 1: ret = Bounds.create(-10, 0, 20, 20); break; case 2: ret = Bounds.create(-10, 0, 20, 20); break; case 3: ret = Bounds.create(-15, 0, 30, 20); break; case 4: ret = Bounds.create(-20, 0, 40, 20); break; case 5: ret = Bounds.create(-25, 0, 50, 20); break; case 6: ret = Bounds.create(-30, 0, 60, 20); break; case 7: ret = Bounds.create(-35, 0, 70, 20); break; case 8: ret = Bounds.create(-40, 0, 80, 20); break; case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 16: ret = Bounds.create(-40, 0, 80, 40); break; case 17: case 18: case 19: case 20: case 21: case 22: case 23: case 24: ret = Bounds.create(-40, 0, 80, 60); break; case 25: case 26: case 27: case 28: case 29: case 30: case 31: case 32: ret = Bounds.create(-40, 0, 80, 80); break; } } if (ret == null) { ret = Bounds.create(0, -10, 20, 20); // should never happen } return ret; } static void configureLabel(Instance instance, Direction labelLoc, Direction facing) { Bounds bds = instance.getBounds(); int x; int y; int halign; int valign; if (labelLoc == Direction.NORTH) { halign = TextField.H_CENTER; valign = TextField.V_BOTTOM; x = bds.getX() + bds.getWidth() / 2; y = bds.getY() - 2; if (facing == labelLoc) { halign = TextField.H_LEFT; x += 2; } } else if (labelLoc == Direction.SOUTH) { halign = TextField.H_CENTER; valign = TextField.V_TOP; x = bds.getX() + bds.getWidth() / 2; y = bds.getY() + bds.getHeight() + 2; if (facing == labelLoc) { halign = TextField.H_LEFT; x += 2; } } else if (labelLoc == Direction.EAST) { halign = TextField.H_LEFT; valign = TextField.V_CENTER; x = bds.getX() + bds.getWidth() + 2; y = bds.getY() + bds.getHeight() / 2; if (facing == labelLoc) { valign = TextField.V_BOTTOM; y -= 2; } } else { // WEST halign = TextField.H_RIGHT; valign = TextField.V_CENTER; x = bds.getX() - 2; y = bds.getY() + bds.getHeight() / 2; if (facing == labelLoc) { valign = TextField.V_BOTTOM; y -= 2; } } instance.setTextField(StdAttr.LABEL, StdAttr.LABEL_FONT, x, y, halign, valign); } }logisim-2.7.1/src/com/cburch/logisim/std/wiring/Power.java0000644000175000017500000000635111524651336023403 0ustar vincentvincent/* Copyright (c) 2011, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ /** * Based on PUCTools (v0.9 beta) by CRC - PUC - Minas (pucmg.crc at gmail.com) */ package com.cburch.logisim.std.wiring; import java.awt.Graphics2D; import com.cburch.logisim.tools.key.BitWidthConfigurator; import com.cburch.logisim.util.GraphicsUtil; import com.cburch.logisim.circuit.Wire; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; public class Power extends InstanceFactory { public Power() { super("Power", Strings.getter("powerComponent")); setIconName("power.gif"); setAttributes(new Attribute[] { StdAttr.FACING, StdAttr.WIDTH }, new Object[] { Direction.NORTH, BitWidth.ONE }); setFacingAttribute(StdAttr.FACING); setKeyConfigurator(new BitWidthConfigurator(StdAttr.WIDTH)); setPorts(new Port[] { new Port(0, 0, Port.OUTPUT, StdAttr.WIDTH) }); } @Override protected void configureNewInstance(Instance instance) { instance.addAttributeListener(); } @Override protected void instanceAttributeChanged(Instance instance, Attribute attr) { if (attr == StdAttr.FACING) { instance.recomputeBounds(); } } @Override public Bounds getOffsetBounds(AttributeSet attrs) { return Bounds.create(0, -8, 15, 16) .rotate(Direction.EAST, attrs.getValue(StdAttr.FACING), 0, 0); } @Override public void propagate(InstanceState state) { BitWidth width = state.getAttributeValue(StdAttr.WIDTH); state.setPort(0, Value.repeat(Value.TRUE, width.getWidth()), 1); } @Override public void paintInstance(InstancePainter painter) { drawInstance(painter, false); painter.drawPorts(); } @Override public void paintGhost(InstancePainter painter) { drawInstance(painter, true); } private void drawInstance(InstancePainter painter, boolean isGhost) { Graphics2D g = (Graphics2D) painter.getGraphics().create(); Location loc = painter.getLocation(); g.translate(loc.getX(), loc.getY()); Direction from = painter.getAttributeValue(StdAttr.FACING); int degrees = Direction.EAST.toDegrees() - from.toDegrees(); double radians = Math.toRadians((degrees + 360) % 360); g.rotate(radians); GraphicsUtil.switchToWidth(g, Wire.WIDTH); if (!isGhost && painter.getShowState()) { g.setColor(painter.getPort(0).getColor()); } g.drawLine(0, 0, 5, 0); GraphicsUtil.switchToWidth(g, 1); if (!isGhost && painter.shouldDrawColor()) { BitWidth width = painter.getAttributeValue(StdAttr.WIDTH); g.setColor(Value.repeat(Value.TRUE, width.getWidth()).getColor()); } g.drawPolygon(new int[] { 6, 14, 6 }, new int[] { -8, 0, 8 }, 3); g.dispose(); } } logisim-2.7.1/src/com/cburch/logisim/std/wiring/PinAttributes.java0000644000175000017500000000371011524651336025100 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.wiring; import java.util.Arrays; import java.util.List; import com.cburch.logisim.comp.EndData; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.instance.StdAttr; class PinAttributes extends ProbeAttributes { public static PinAttributes instance = new PinAttributes(); private static final List> ATTRIBUTES = Arrays.asList(new Attribute[] { StdAttr.FACING, Pin.ATTR_TYPE, StdAttr.WIDTH, Pin.ATTR_TRISTATE, Pin.ATTR_PULL, StdAttr.LABEL, Pin.ATTR_LABEL_LOC, StdAttr.LABEL_FONT }); BitWidth width = BitWidth.ONE; boolean threeState = true; int type = EndData.INPUT_ONLY; Object pull = Pin.PULL_NONE; public PinAttributes() { } @Override public List> getAttributes() { return ATTRIBUTES; } @Override @SuppressWarnings("unchecked") public V getValue(Attribute attr) { if (attr == StdAttr.WIDTH) return (V) width; if (attr == Pin.ATTR_TRISTATE) return (V) Boolean.valueOf(threeState); if (attr == Pin.ATTR_TYPE) return (V) Boolean.valueOf(type == EndData.OUTPUT_ONLY); if (attr == Pin.ATTR_PULL) return (V) pull; return super.getValue(attr); } boolean isOutput() { return type != EndData.INPUT_ONLY; } boolean isInput() { return type != EndData.OUTPUT_ONLY; } @Override public void setValue(Attribute attr, V value) { if (attr == StdAttr.WIDTH) { width = (BitWidth) value; } else if (attr == Pin.ATTR_TRISTATE) { threeState = ((Boolean) value).booleanValue(); } else if (attr == Pin.ATTR_TYPE) { type = ((Boolean) value).booleanValue() ? EndData.OUTPUT_ONLY : EndData.INPUT_ONLY; } else if (attr == Pin.ATTR_PULL) { pull = value; } else { super.setValue(attr, value); return; } fireAttributeValueChanged(attr, value); } } logisim-2.7.1/src/com/cburch/logisim/std/wiring/Pin.java0000644000175000017500000003477411524651336023047 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.wiring; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import javax.swing.Icon; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.circuit.RadixOption; import com.cburch.logisim.comp.EndData; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeOption; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Attributes; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.gui.main.Canvas; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceData; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstanceLogger; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstancePoker; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.tools.key.BitWidthConfigurator; import com.cburch.logisim.tools.key.DirectionConfigurator; import com.cburch.logisim.tools.key.JoinedConfigurator; import com.cburch.logisim.util.GraphicsUtil; import com.cburch.logisim.util.Icons; public class Pin extends InstanceFactory { public static final Attribute ATTR_TRISTATE = Attributes.forBoolean("tristate", Strings.getter("pinThreeStateAttr")); public static final Attribute ATTR_TYPE = Attributes.forBoolean("output", Strings.getter("pinOutputAttr")); public static final Attribute ATTR_LABEL_LOC = Attributes.forDirection("labelloc", Strings.getter("pinLabelLocAttr")); public static final AttributeOption PULL_NONE = new AttributeOption("none", Strings.getter("pinPullNoneOption")); public static final AttributeOption PULL_UP = new AttributeOption("up", Strings.getter("pinPullUpOption")); public static final AttributeOption PULL_DOWN = new AttributeOption("down", Strings.getter("pinPullDownOption")); public static final Attribute ATTR_PULL = Attributes.forOption("pull", Strings.getter("pinPullAttr"), new AttributeOption[] { PULL_NONE, PULL_UP, PULL_DOWN }); public static final Pin FACTORY = new Pin(); private static final Icon ICON_IN = Icons.getIcon("pinInput.gif"); private static final Icon ICON_OUT = Icons.getIcon("pinOutput.gif"); private static final Font ICON_WIDTH_FONT = new Font("SansSerif", Font.BOLD, 9); private static final Color ICON_WIDTH_COLOR = Value.WIDTH_ERROR_COLOR.darker(); public Pin() { super("Pin", Strings.getter("pinComponent")); setFacingAttribute(StdAttr.FACING); setKeyConfigurator(JoinedConfigurator.create( new BitWidthConfigurator(StdAttr.WIDTH), new DirectionConfigurator(ATTR_LABEL_LOC, KeyEvent.ALT_DOWN_MASK))); setInstanceLogger(PinLogger.class); setInstancePoker(PinPoker.class); } @Override public AttributeSet createAttributeSet() { return new PinAttributes(); } @Override public Bounds getOffsetBounds(AttributeSet attrs) { Direction facing = attrs.getValue(StdAttr.FACING); BitWidth width = attrs.getValue(StdAttr.WIDTH); return Probe.getOffsetBounds(facing, width, RadixOption.RADIX_2); } // // graphics methods // @Override public void paintIcon(InstancePainter painter) { paintIconBase(painter); BitWidth w = painter.getAttributeValue(StdAttr.WIDTH); if (!w.equals(BitWidth.ONE)) { Graphics g = painter.getGraphics(); g.setColor(ICON_WIDTH_COLOR); g.setFont(ICON_WIDTH_FONT); GraphicsUtil.drawCenteredText(g, "" + w.getWidth(), 10, 9); g.setColor(Color.BLACK); } } private void paintIconBase(InstancePainter painter) { PinAttributes attrs = (PinAttributes) painter.getAttributeSet(); Direction dir = attrs.facing; boolean output = attrs.isOutput(); Graphics g = painter.getGraphics(); if (output) { if (ICON_OUT != null) { Icons.paintRotated(g, 2, 2, dir, ICON_OUT, painter.getDestination()); return; } } else { if (ICON_IN != null) { Icons.paintRotated(g, 2, 2, dir, ICON_IN, painter.getDestination()); return; } } int pinx = 16; int piny = 9; if (dir == Direction.EAST) { // keep defaults } else if (dir == Direction.WEST) { pinx = 4; } else if (dir == Direction.NORTH) { pinx = 9; piny = 4; } else if (dir == Direction.SOUTH) { pinx = 9; piny = 16; } g.setColor(Color.black); if (output) { g.drawOval(4, 4, 13, 13); } else { g.drawRect(4, 4, 13, 13); } g.setColor(Value.TRUE.getColor()); g.fillOval(7, 7, 8, 8); g.fillOval(pinx, piny, 3, 3); } @Override public void paintGhost(InstancePainter painter) { PinAttributes attrs = (PinAttributes) painter.getAttributeSet(); Location loc = painter.getLocation(); Bounds bds = painter.getOffsetBounds(); int x = loc.getX(); int y = loc.getY(); Graphics g = painter.getGraphics(); GraphicsUtil.switchToWidth(g, 2); boolean output = attrs.isOutput(); if (output) { BitWidth width = attrs.getValue(StdAttr.WIDTH); if (width == BitWidth.ONE) { g.drawOval(x + bds.getX() + 1, y + bds.getY() + 1, bds.getWidth() - 1, bds.getHeight() - 1); } else { g.drawRoundRect(x + bds.getX() + 1, y + bds.getY() + 1, bds.getWidth() - 1, bds.getHeight() - 1, 6, 6); } } else { g.drawRect(x + bds.getX() + 1, y + bds.getY() + 1, bds.getWidth() - 1, bds.getHeight() - 1); } } @Override public void paintInstance(InstancePainter painter) { PinAttributes attrs = (PinAttributes) painter.getAttributeSet(); Graphics g = painter.getGraphics(); Bounds bds = painter.getInstance().getBounds(); // intentionally with no graphics object - we don't want label included int x = bds.getX(); int y = bds.getY(); GraphicsUtil.switchToWidth(g, 2); g.setColor(Color.black); if (attrs.type == EndData.OUTPUT_ONLY) { if (attrs.width.getWidth() == 1) { g.drawOval(x + 1, y + 1, bds.getWidth() - 1, bds.getHeight() - 1); } else { g.drawRoundRect(x + 1, y + 1, bds.getWidth() - 1, bds.getHeight() - 1, 6, 6); } } else { g.drawRect(x + 1, y + 1, bds.getWidth() - 1, bds.getHeight() - 1); } painter.drawLabel(); if (!painter.getShowState()) { g.setColor(Color.BLACK); GraphicsUtil.drawCenteredText(g, "x" + attrs.width.getWidth(), bds.getX() + bds.getWidth() / 2, bds.getY() + bds.getHeight() / 2); } else { PinState state = getState(painter); if (attrs.width.getWidth() <= 1) { Value receiving = state.receiving; g.setColor(receiving.getColor()); g.fillOval(x + 4, y + 4, 13, 13); if (attrs.width.getWidth() == 1) { g.setColor(Color.WHITE); GraphicsUtil.drawCenteredText(g, state.sending.toDisplayString(), x + 11, y + 9); } } else { Probe.paintValue(painter, state.sending); } } painter.drawPorts(); } // // methods for instances // @Override protected void configureNewInstance(Instance instance) { PinAttributes attrs = (PinAttributes) instance.getAttributeSet(); instance.addAttributeListener(); configurePorts(instance); Probe.configureLabel(instance, attrs.labelloc, attrs.facing); } @Override protected void instanceAttributeChanged(Instance instance, Attribute attr) { if (attr == ATTR_TYPE) { configurePorts(instance); } else if (attr == StdAttr.WIDTH || attr == StdAttr.FACING || attr == Pin.ATTR_LABEL_LOC) { instance.recomputeBounds(); PinAttributes attrs = (PinAttributes) instance.getAttributeSet(); Probe.configureLabel(instance, attrs.labelloc, attrs.facing); } } private void configurePorts(Instance instance) { PinAttributes attrs = (PinAttributes) instance.getAttributeSet(); String endType = attrs.isOutput() ? Port.INPUT : Port.OUTPUT; Port port = new Port(0, 0, endType, StdAttr.WIDTH); if (attrs.isOutput()) { port.setToolTip(Strings.getter("pinOutputToolTip")); } else { port.setToolTip(Strings.getter("pinInputToolTip")); } instance.setPorts(new Port[] { port }); } @Override public void propagate(InstanceState state) { PinAttributes attrs = (PinAttributes) state.getAttributeSet(); Value val = state.getPort(0); PinState q = getState(state); if (attrs.type == EndData.OUTPUT_ONLY) { q.sending = val; q.receiving = val; state.setPort(0, Value.createUnknown(attrs.width), 1); } else { if (!val.isFullyDefined() && !attrs.threeState && state.isCircuitRoot()) { q.sending = pull2(q.sending, attrs.width); q.receiving = pull2(val, attrs.width); state.setPort(0, q.sending, 1); } else { q.receiving = val; if (!val.equals(q.sending)) { // ignore if no change state.setPort(0, q.sending, 1); } } } } private static Value pull2(Value mod, BitWidth expectedWidth) { if (mod.getWidth() == expectedWidth.getWidth()) { Value[] vs = mod.getAll(); for (int i = 0; i < vs.length; i++) { if (vs[i] == Value.UNKNOWN) vs[i] = Value.FALSE; } return Value.create(vs); } else { return Value.createKnown(expectedWidth, 0); } } // // basic information methods // public BitWidth getWidth(Instance instance) { PinAttributes attrs = (PinAttributes) instance.getAttributeSet(); return attrs.width; } public int getType(Instance instance) { PinAttributes attrs = (PinAttributes) instance.getAttributeSet(); return attrs.type; } public boolean isInputPin(Instance instance) { PinAttributes attrs = (PinAttributes) instance.getAttributeSet(); return attrs.type != EndData.OUTPUT_ONLY; } // // state information methods // public Value getValue(InstanceState state) { return getState(state).sending; } public void setValue(InstanceState state, Value value) { PinAttributes attrs = (PinAttributes) state.getAttributeSet(); Object pull = attrs.pull; if (pull != PULL_NONE && pull != null && !value.isFullyDefined()) { Value[] bits = value.getAll(); if (pull == PULL_UP) { for (int i = 0; i < bits.length; i++) { if (bits[i] != Value.FALSE) bits[i] = Value.TRUE; } } else if (pull == PULL_DOWN) { for (int i = 0; i < bits.length; i++) { if (bits[i] != Value.TRUE) bits[i] = Value.FALSE; } } value = Value.create(bits); } PinState myState = getState(state); if (value == Value.NIL) { myState.sending = Value.createUnknown(attrs.width); } else { myState.sending = value; } } private static PinState getState(InstanceState state) { PinAttributes attrs = (PinAttributes) state.getAttributeSet(); BitWidth width = attrs.width; PinState ret = (PinState) state.getData(); if (ret == null) { Value val = attrs.threeState ? Value.UNKNOWN : Value.FALSE; if (width.getWidth() > 1) { Value[] arr = new Value[width.getWidth()]; java.util.Arrays.fill(arr, val); val = Value.create(arr); } ret = new PinState(val, val); state.setData(ret); } if (ret.sending.getWidth() != width.getWidth()) { ret.sending = ret.sending.extendWidth(width.getWidth(), attrs.threeState ? Value.UNKNOWN : Value.FALSE); } if (ret.receiving.getWidth() != width.getWidth()) { ret.receiving = ret.receiving.extendWidth(width.getWidth(), Value.UNKNOWN); } return ret; } private static class PinState implements InstanceData, Cloneable { Value sending; Value receiving; public PinState(Value sending, Value receiving) { this.sending = sending; this.receiving = receiving; } @Override public Object clone() { try { return super.clone(); } catch (CloneNotSupportedException e) { return null; } } } public static class PinPoker extends InstancePoker { int bitPressed = -1; @Override public void mousePressed(InstanceState state, MouseEvent e) { bitPressed = getBit(state, e); } @Override public void mouseReleased(InstanceState state, MouseEvent e) { int bit = getBit(state, e); if (bit == bitPressed && bit >= 0) { handleBitPress(state, bit, e); } bitPressed = -1; } private void handleBitPress(InstanceState state, int bit, MouseEvent e) { PinAttributes attrs = (PinAttributes) state.getAttributeSet(); if (!attrs.isInput()) return; java.awt.Component sourceComp = e.getComponent(); if (sourceComp instanceof Canvas && !state.isCircuitRoot()) { Canvas canvas = (Canvas) e.getComponent(); CircuitState circState = canvas.getCircuitState(); java.awt.Component frame = SwingUtilities.getRoot(canvas); int choice = JOptionPane.showConfirmDialog(frame, Strings.get("pinFrozenQuestion"), Strings.get("pinFrozenTitle"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE); if (choice == JOptionPane.OK_OPTION) { circState = circState.cloneState(); canvas.getProject().setCircuitState(circState); state = circState.getInstanceState(state.getInstance()); } else { return; } } PinState pinState = getState(state); Value val = pinState.sending.get(bit); if (val == Value.FALSE) { val = Value.TRUE; } else if (val == Value.TRUE) { val = attrs.threeState ? Value.UNKNOWN : Value.FALSE; } else { val = Value.FALSE; } pinState.sending = pinState.sending.set(bit, val); state.fireInvalidated(); } private int getBit(InstanceState state, MouseEvent e) { BitWidth width = state.getAttributeValue(StdAttr.WIDTH); if (width.getWidth() == 1) { return 0; } else { Bounds bds = state.getInstance().getBounds(); // intentionally with no graphics object - we don't want label included int i = (bds.getX() + bds.getWidth() - e.getX()) / 10; int j = (bds.getY() + bds.getHeight() - e.getY()) / 20; int bit = 8 * j + i; if (bit < 0 || bit >= width.getWidth()) { return -1; } else { return bit; } } } } public static class PinLogger extends InstanceLogger { @Override public String getLogName(InstanceState state, Object option) { PinAttributes attrs = (PinAttributes) state.getAttributeSet(); String ret = attrs.label; if (ret == null || ret.equals("")) { String type = attrs.type == EndData.INPUT_ONLY ? Strings.get("pinInputName") : Strings.get("pinOutputName"); return type + state.getInstance().getLocation(); } else { return ret; } } @Override public Value getLogValue(InstanceState state, Object option) { PinState s = getState(state); return s.sending; } } }logisim-2.7.1/src/com/cburch/logisim/std/wiring/Ground.java0000644000175000017500000000640111524651340023534 0ustar vincentvincent/* Copyright (c) 2011, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ /** * Based on PUCTools (v0.9 beta) by CRC - PUC - Minas (pucmg.crc at gmail.com) */ package com.cburch.logisim.std.wiring; import java.awt.Graphics2D; import com.cburch.logisim.tools.key.BitWidthConfigurator; import com.cburch.logisim.util.GraphicsUtil; import com.cburch.logisim.circuit.Wire; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; public class Ground extends InstanceFactory { public Ground() { super("Ground", Strings.getter("groundComponent")); setIconName("ground.gif"); setAttributes(new Attribute[] { StdAttr.FACING, StdAttr.WIDTH }, new Object[] { Direction.SOUTH, BitWidth.ONE }); setFacingAttribute(StdAttr.FACING); setKeyConfigurator(new BitWidthConfigurator(StdAttr.WIDTH)); setPorts(new Port[] { new Port(0, 0, Port.OUTPUT, StdAttr.WIDTH) }); } @Override protected void configureNewInstance(Instance instance) { instance.addAttributeListener(); } @Override protected void instanceAttributeChanged(Instance instance, Attribute attr) { if (attr == StdAttr.FACING) { instance.recomputeBounds(); } } @Override public Bounds getOffsetBounds(AttributeSet attrs) { return Bounds.create(0, -8, 14, 16) .rotate(Direction.EAST, attrs.getValue(StdAttr.FACING), 0, 0); } @Override public void propagate(InstanceState state) { BitWidth width = state.getAttributeValue(StdAttr.WIDTH); state.setPort(0, Value.repeat(Value.FALSE, width.getWidth()), 1); } @Override public void paintInstance(InstancePainter painter) { drawInstance(painter, false); painter.drawPorts(); } @Override public void paintGhost(InstancePainter painter) { drawInstance(painter, true); } private void drawInstance(InstancePainter painter, boolean isGhost) { Graphics2D g = (Graphics2D) painter.getGraphics().create(); Location loc = painter.getLocation(); g.translate(loc.getX(), loc.getY()); Direction from = painter.getAttributeValue(StdAttr.FACING); int degrees = Direction.EAST.toDegrees() - from.toDegrees(); double radians = Math.toRadians((degrees + 360) % 360); g.rotate(radians); GraphicsUtil.switchToWidth(g, Wire.WIDTH); if (!isGhost && painter.getShowState()) { g.setColor(painter.getPort(0).getColor()); } g.drawLine(0, 0, 5, 0); GraphicsUtil.switchToWidth(g, 1); if (!isGhost && painter.shouldDrawColor()) { BitWidth width = painter.getAttributeValue(StdAttr.WIDTH); g.setColor(Value.repeat(Value.FALSE, width.getWidth()).getColor()); } g.drawLine(6, -8, 6, 8); g.drawLine(9, -5, 9, 5); g.drawLine(12, -2, 12, 2); g.dispose(); } } logisim-2.7.1/src/com/cburch/logisim/std/wiring/DurationAttribute.java0000644000175000017500000000275611524651336025765 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.wiring; import javax.swing.JTextField; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.util.StringGetter; import com.cburch.logisim.util.StringUtil; public class DurationAttribute extends Attribute { private int min; private int max; public DurationAttribute(String name, StringGetter disp, int min, int max) { super(name, disp); this.min = min; this.max = max; } @Override public Integer parse(String value) { try { Integer ret = Integer.valueOf(value); if (ret.intValue() < min) { throw new NumberFormatException(StringUtil.format(Strings.get("durationSmallMessage"), "" + min)); } else if (ret.intValue() > max) { throw new NumberFormatException(StringUtil.format(Strings.get("durationLargeMessage"), "" + max)); } return ret; } catch (NumberFormatException e) { throw new NumberFormatException(Strings.get("freqInvalidMessage")); } } @Override public String toDisplayString(Integer value) { if (value.equals(Integer.valueOf(1))) { return Strings.get("clockDurationOneValue"); } else { return StringUtil.format(Strings.get("clockDurationValue"), value.toString()); } } @Override public java.awt.Component getCellEditor(Integer value) { JTextField field = new JTextField(); field.setText(value.toString()); return field; } } logisim-2.7.1/src/com/cburch/logisim/std/wiring/ConstantConfigurator.java0000644000175000017500000000165211524651336026462 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.wiring; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.tools.key.IntegerConfigurator; class ConstantConfigurator extends IntegerConfigurator { public ConstantConfigurator() { super(Constant.ATTR_VALUE, 0, 0, 0, 16); } @Override public int getMaximumValue(AttributeSet attrs) { BitWidth width = attrs.getValue(StdAttr.WIDTH); int ret = width.getMask(); if (ret >= 0) { return ret; } else { return Integer.MAX_VALUE; } } @Override public int getMinimumValue(AttributeSet attrs) { BitWidth width = attrs.getValue(StdAttr.WIDTH); if (width.getWidth() < 32) { return 0; } else { return Integer.MIN_VALUE; } } } logisim-2.7.1/src/com/cburch/logisim/std/wiring/Constant.java0000644000175000017500000002304511524651336024077 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.wiring; import java.awt.Color; import java.awt.Graphics; import java.util.Arrays; import java.util.List; import java.util.Map; import com.cburch.logisim.analyze.model.Expression; import com.cburch.logisim.analyze.model.Expressions; import com.cburch.logisim.circuit.ExpressionComputer; import com.cburch.logisim.data.AbstractAttributeSet; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Attributes; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.tools.key.BitWidthConfigurator; import com.cburch.logisim.tools.key.JoinedConfigurator; import com.cburch.logisim.util.GraphicsUtil; public class Constant extends InstanceFactory { public static final Attribute ATTR_VALUE = Attributes.forHexInteger("value", Strings.getter("constantValueAttr")); public static InstanceFactory FACTORY = new Constant(); private static final Color BACKGROUND_COLOR = new Color(230, 230, 230); private static final List> ATTRIBUTES = Arrays.asList(new Attribute[] { StdAttr.FACING, StdAttr.WIDTH, ATTR_VALUE }); private static class ConstantAttributes extends AbstractAttributeSet { private Direction facing = Direction.EAST;; private BitWidth width = BitWidth.ONE; private Value value = Value.TRUE; @Override protected void copyInto(AbstractAttributeSet destObj) { ConstantAttributes dest = (ConstantAttributes) destObj; dest.facing = this.facing; dest.width = this.width; dest.value = this.value; } @Override public List> getAttributes() { return ATTRIBUTES; } @Override @SuppressWarnings("unchecked") public V getValue(Attribute attr) { if (attr == StdAttr.FACING) return (V) facing; if (attr == StdAttr.WIDTH) return (V) width; if (attr == ATTR_VALUE) return (V) Integer.valueOf(value.toIntValue()); return null; } @Override public void setValue(Attribute attr, V value) { if (attr == StdAttr.FACING) { facing = (Direction) value; } else if (attr == StdAttr.WIDTH) { width = (BitWidth) value; this.value = this.value.extendWidth(width.getWidth(), this.value.get(this.value.getWidth() - 1)); } else if (attr == ATTR_VALUE) { int val = ((Integer) value).intValue(); this.value = Value.createKnown(width, val); } else { throw new IllegalArgumentException("unknown attribute " + attr); } fireAttributeValueChanged(attr, value); } } private static class ConstantExpression implements ExpressionComputer { private Instance instance; public ConstantExpression(Instance instance) { this.instance = instance; } public void computeExpression(Map expressionMap) { AttributeSet attrs = instance.getAttributeSet(); int intValue = attrs.getValue(ATTR_VALUE).intValue(); expressionMap.put(instance.getLocation(), Expressions.constant(intValue)); } } public Constant() { super("Constant", Strings.getter("constantComponent")); setFacingAttribute(StdAttr.FACING); setKeyConfigurator(JoinedConfigurator.create( new ConstantConfigurator(), new BitWidthConfigurator(StdAttr.WIDTH))); } @Override public AttributeSet createAttributeSet() { return new ConstantAttributes(); } @Override protected void configureNewInstance(Instance instance) { instance.addAttributeListener(); updatePorts(instance); } private void updatePorts(Instance instance) { Port[] ps = { new Port(0, 0, Port.OUTPUT, StdAttr.WIDTH) }; instance.setPorts(ps); } @Override protected void instanceAttributeChanged(Instance instance, Attribute attr) { if (attr == StdAttr.WIDTH) { instance.recomputeBounds(); updatePorts(instance); } else if (attr == StdAttr.FACING) { instance.recomputeBounds(); } else if (attr == ATTR_VALUE) { instance.fireInvalidated(); } } @Override protected Object getInstanceFeature(Instance instance, Object key) { if (key == ExpressionComputer.class) return new ConstantExpression(instance); return super.getInstanceFeature(instance, key); } @Override public void propagate(InstanceState state) { BitWidth width = state.getAttributeValue(StdAttr.WIDTH); int value = state.getAttributeValue(ATTR_VALUE).intValue(); state.setPort(0, Value.createKnown(width, value), 1); } @Override public Bounds getOffsetBounds(AttributeSet attrs) { Direction facing = attrs.getValue(StdAttr.FACING); BitWidth width = attrs.getValue(StdAttr.WIDTH); int chars = (width.getWidth() + 3) / 4; Bounds ret = null; if (facing == Direction.EAST) { switch (chars) { case 1: ret = Bounds.create(-16, -8, 16, 16); break; case 2: ret = Bounds.create(-16, -8, 16, 16); break; case 3: ret = Bounds.create(-26, -8, 26, 16); break; case 4: ret = Bounds.create(-36, -8, 36, 16); break; case 5: ret = Bounds.create(-46, -8, 46, 16); break; case 6: ret = Bounds.create(-56, -8, 56, 16); break; case 7: ret = Bounds.create(-66, -8, 66, 16); break; case 8: ret = Bounds.create(-76, -8, 76, 16); break; } } else if (facing == Direction.WEST) { switch (chars) { case 1: ret = Bounds.create( 0, -8, 16, 16); break; case 2: ret = Bounds.create( 0, -8, 16, 16); break; case 3: ret = Bounds.create( 0, -8, 26, 16); break; case 4: ret = Bounds.create( 0, -8, 36, 16); break; case 5: ret = Bounds.create( 0, -8, 46, 16); break; case 6: ret = Bounds.create( 0, -8, 56, 16); break; case 7: ret = Bounds.create( 0, -8, 66, 16); break; case 8: ret = Bounds.create( 0, -8, 76, 16); break; } } else if (facing == Direction.SOUTH) { switch (chars) { case 1: ret = Bounds.create(-8, -16, 16, 16); break; case 2: ret = Bounds.create(-8, -16, 16, 16); break; case 3: ret = Bounds.create(-13, -16, 26, 16); break; case 4: ret = Bounds.create(-18, -16, 36, 16); break; case 5: ret = Bounds.create(-23, -16, 46, 16); break; case 6: ret = Bounds.create(-28, -16, 56, 16); break; case 7: ret = Bounds.create(-33, -16, 66, 16); break; case 8: ret = Bounds.create(-38, -16, 76, 16); break; } } else if (facing == Direction.NORTH) { switch (chars) { case 1: ret = Bounds.create(-8, 0, 16, 16); break; case 2: ret = Bounds.create(-8, 0, 16, 16); break; case 3: ret = Bounds.create(-13, 0, 26, 16); break; case 4: ret = Bounds.create(-18, 0, 36, 16); break; case 5: ret = Bounds.create(-23, 0, 46, 16); break; case 6: ret = Bounds.create(-28, 0, 56, 16); break; case 7: ret = Bounds.create(-33, 0, 66, 16); break; case 8: ret = Bounds.create(-38, 0, 76, 16); break; } } if (ret == null) { throw new IllegalArgumentException("unrecognized arguments " + facing + " " + width); } return ret; } // // painting methods // @Override public void paintIcon(InstancePainter painter) { int w = painter.getAttributeValue(StdAttr.WIDTH).getWidth(); int pinx = 16; int piny = 9; Direction dir = painter.getAttributeValue(StdAttr.FACING); if (dir == Direction.EAST) { } // keep defaults else if (dir == Direction.WEST) { pinx = 4; } else if (dir == Direction.NORTH) { pinx = 9; piny = 4; } else if (dir == Direction.SOUTH) { pinx = 9; piny = 16; } Graphics g = painter.getGraphics(); if (w == 1) { int v = painter.getAttributeValue(ATTR_VALUE).intValue(); Value val = v == 1 ? Value.TRUE : Value.FALSE; g.setColor(val.getColor()); GraphicsUtil.drawCenteredText(g, "" + v, 10, 9); } else { g.setFont(g.getFont().deriveFont(9.0f)); GraphicsUtil.drawCenteredText(g, "x" + w, 10, 9); } g.fillOval(pinx, piny, 3, 3); } @Override public void paintGhost(InstancePainter painter) { int v = painter.getAttributeValue(ATTR_VALUE).intValue(); String vStr = Integer.toHexString(v); Bounds bds = getOffsetBounds(painter.getAttributeSet()); Graphics g = painter.getGraphics(); GraphicsUtil.switchToWidth(g, 2); g.fillOval(-2, -2, 5, 5); GraphicsUtil.drawCenteredText(g, vStr, bds.getX() + bds.getWidth() / 2, bds.getY() + bds.getHeight() / 2); } @Override public void paintInstance(InstancePainter painter) { Bounds bds = painter.getOffsetBounds(); BitWidth width = painter.getAttributeValue(StdAttr.WIDTH); int intValue = painter.getAttributeValue(ATTR_VALUE).intValue(); Value v = Value.createKnown(width, intValue); Location loc = painter.getLocation(); int x = loc.getX(); int y = loc.getY(); Graphics g = painter.getGraphics(); if (painter.shouldDrawColor()) { g.setColor(BACKGROUND_COLOR); g.fillRect(x + bds.getX(), y + bds.getY(), bds.getWidth(), bds.getHeight()); } if (v.getWidth() == 1) { if (painter.shouldDrawColor()) g.setColor(v.getColor()); GraphicsUtil.drawCenteredText(g, v.toString(), x + bds.getX() + bds.getWidth() / 2, y + bds.getY() + bds.getHeight() / 2 - 2); } else { g.setColor(Color.BLACK); GraphicsUtil.drawCenteredText(g, v.toHexString(), x + bds.getX() + bds.getWidth() / 2, y + bds.getY() + bds.getHeight() / 2 - 2); } painter.drawPorts(); } //TODO: Allow editing of value via text tool/attribute table } logisim-2.7.1/src/com/cburch/logisim/std/wiring/Clock.java0000644000175000017500000001620011524651336023334 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.wiring; import java.awt.Color; import java.awt.Graphics; import java.awt.event.MouseEvent; import javax.swing.Icon; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.circuit.RadixOption; import com.cburch.logisim.comp.Component; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceData; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstanceLogger; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstancePoker; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.util.GraphicsUtil; import com.cburch.logisim.util.Icons; public class Clock extends InstanceFactory { public static final Attribute ATTR_HIGH = new DurationAttribute("highDuration", Strings.getter("clockHighAttr"), 1, Integer.MAX_VALUE); public static final Attribute ATTR_LOW = new DurationAttribute("lowDuration", Strings.getter("clockLowAttr"), 1, Integer.MAX_VALUE); public static final Clock FACTORY = new Clock(); private static final Icon toolIcon = Icons.getIcon("clock.gif"); private static class ClockState implements InstanceData, Cloneable { Value sending = Value.FALSE; int clicks = 0; @Override public ClockState clone() { try { return (ClockState) super.clone(); } catch (CloneNotSupportedException e) { return null; } } } public static class ClockLogger extends InstanceLogger { @Override public String getLogName(InstanceState state, Object option) { return state.getAttributeValue(StdAttr.LABEL); } @Override public Value getLogValue(InstanceState state, Object option) { ClockState s = getState(state); return s.sending; } } public static class ClockPoker extends InstancePoker { boolean isPressed = true; @Override public void mousePressed(InstanceState state, MouseEvent e) { isPressed = isInside(state, e); } @Override public void mouseReleased(InstanceState state, MouseEvent e) { if (isPressed && isInside(state, e)) { ClockState myState = (ClockState) state.getData(); myState.sending = myState.sending.not(); myState.clicks++; state.fireInvalidated(); } isPressed = false; } private boolean isInside(InstanceState state, MouseEvent e) { Bounds bds = state.getInstance().getBounds(); return bds.contains(e.getX(), e.getY()); } } public Clock() { super("Clock", Strings.getter("clockComponent")); setAttributes(new Attribute[] { StdAttr.FACING, ATTR_HIGH, ATTR_LOW, StdAttr.LABEL, Pin.ATTR_LABEL_LOC, StdAttr.LABEL_FONT }, new Object[] { Direction.EAST, Integer.valueOf(1), Integer.valueOf(1), "", Direction.WEST, StdAttr.DEFAULT_LABEL_FONT }); setFacingAttribute(StdAttr.FACING); setInstanceLogger(ClockLogger.class); setInstancePoker(ClockPoker.class); } @Override public Bounds getOffsetBounds(AttributeSet attrs) { return Probe.getOffsetBounds( attrs.getValue(StdAttr.FACING), BitWidth.ONE, RadixOption.RADIX_2); } // // graphics methods // @Override public void paintIcon(InstancePainter painter) { Graphics g = painter.getGraphics(); if (toolIcon != null) { toolIcon.paintIcon(painter.getDestination(), g, 2, 2); } else { g.drawRect(4, 4, 13, 13); g.setColor(Value.FALSE.getColor()); g.drawPolyline(new int[] { 6, 6, 10, 10, 14, 14 }, new int[] { 10, 6, 6, 14, 14, 10 }, 6); } Direction dir = painter.getAttributeValue(StdAttr.FACING); int pinx = 15; int piny = 8; if (dir == Direction.EAST) { // keep defaults } else if (dir == Direction.WEST) { pinx = 3; } else if (dir == Direction.NORTH) { pinx = 8; piny = 3; } else if (dir == Direction.SOUTH) { pinx = 8; piny = 15; } g.setColor(Value.TRUE.getColor()); g.fillOval(pinx, piny, 3, 3); } @Override public void paintInstance(InstancePainter painter) { java.awt.Graphics g = painter.getGraphics(); Bounds bds = painter.getInstance().getBounds(); // intentionally with no graphics object - we don't want label included int x = bds.getX(); int y = bds.getY(); GraphicsUtil.switchToWidth(g, 2); g.setColor(Color.BLACK); g.drawRect(x, y, bds.getWidth(), bds.getHeight()); painter.drawLabel(); boolean drawUp; if (painter.getShowState()) { ClockState state = getState(painter); g.setColor(state.sending.getColor()); drawUp = state.sending == Value.TRUE; } else { g.setColor(Color.BLACK); drawUp = true; } x += 10; y += 10; int[] xs = { x - 6, x - 6, x, x, x + 6, x + 6 }; int[] ys; if (drawUp) { ys = new int[] { y, y - 4, y - 4, y + 4, y + 4, y }; } else { ys = new int[] { y, y + 4, y + 4, y - 4, y - 4, y }; } g.drawPolyline(xs, ys, xs.length); painter.drawPorts(); } // // methods for instances // @Override protected void configureNewInstance(Instance instance) { instance.addAttributeListener(); instance.setPorts(new Port[] { new Port(0, 0, Port.OUTPUT, BitWidth.ONE) }); configureLabel(instance); } @Override protected void instanceAttributeChanged(Instance instance, Attribute attr) { if (attr == Pin.ATTR_LABEL_LOC) { configureLabel(instance); } else if (attr == StdAttr.FACING) { instance.recomputeBounds(); configureLabel(instance); } } @Override public void propagate(InstanceState state) { Value val = state.getPort(0); ClockState q = getState(state); if (!val.equals(q.sending)) { // ignore if no change state.setPort(0, q.sending, 1); } } // // package methods // public static boolean tick(CircuitState circState, int ticks, Component comp) { AttributeSet attrs = comp.getAttributeSet(); int durationHigh = attrs.getValue(ATTR_HIGH).intValue(); int durationLow = attrs.getValue(ATTR_LOW).intValue(); ClockState state = (ClockState) circState.getData(comp); if (state == null) { state = new ClockState(); circState.setData(comp, state); } boolean curValue = ticks % (durationHigh + durationLow) < durationLow; if (state.clicks % 2 == 1) curValue = !curValue; Value desired = (curValue ? Value.FALSE : Value.TRUE); if (!state.sending.equals(desired)) { state.sending = desired; Instance.getInstanceFor(comp).fireInvalidated(); return true; } else { return false; } } // // private methods // private void configureLabel(Instance instance) { Direction facing = instance.getAttributeValue(StdAttr.FACING); Direction labelLoc = instance.getAttributeValue(Pin.ATTR_LABEL_LOC); Probe.configureLabel(instance, labelLoc, facing); } private static ClockState getState(InstanceState state) { ClockState ret = (ClockState) state.getData(); if (ret == null) { ret = new ClockState(); state.setData(ret); } return ret; } } logisim-2.7.1/src/com/cburch/logisim/std/wiring/BitExtender.java0000644000175000017500000001231111524651336024515 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.wiring; import java.awt.FontMetrics; import java.awt.Graphics; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeOption; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Attributes; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.tools.key.BitWidthConfigurator; import com.cburch.logisim.tools.key.JoinedConfigurator; import com.cburch.logisim.util.GraphicsUtil; public class BitExtender extends InstanceFactory { private static final Attribute ATTR_IN_WIDTH = Attributes.forBitWidth("in_width", Strings.getter("extenderInAttr")); private static final Attribute ATTR_OUT_WIDTH = Attributes.forBitWidth("out_width", Strings.getter("extenderOutAttr")); private static final Attribute ATTR_TYPE = Attributes.forOption("type", Strings.getter("extenderTypeAttr"), new AttributeOption[] { new AttributeOption("zero", "zero", Strings.getter("extenderZeroType")), new AttributeOption("one", "one", Strings.getter("extenderOneType")), new AttributeOption("sign", "sign", Strings.getter("extenderSignType")), new AttributeOption("input", "input", Strings.getter("extenderInputType")), }); public static final BitExtender FACTORY = new BitExtender(); public BitExtender() { super("Bit Extender", Strings.getter("extenderComponent")); setIconName("extender.gif"); setAttributes(new Attribute[] { ATTR_IN_WIDTH, ATTR_OUT_WIDTH, ATTR_TYPE }, new Object[] { BitWidth.create(8), BitWidth.create(16), ATTR_TYPE.parse("zero") }); setFacingAttribute(StdAttr.FACING); setKeyConfigurator(JoinedConfigurator.create( new BitWidthConfigurator(ATTR_OUT_WIDTH), new BitWidthConfigurator(ATTR_IN_WIDTH, 1, Value.MAX_WIDTH, 0))); setOffsetBounds(Bounds.create(-40, -20, 40, 40)); } // // graphics methods // @Override public void paintInstance(InstancePainter painter) { Graphics g = painter.getGraphics(); FontMetrics fm = g.getFontMetrics(); int asc = fm.getAscent(); painter.drawBounds(); String s0; String type = getType(painter.getAttributeSet()); if (type.equals("zero")) s0 = Strings.get("extenderZeroLabel"); else if (type.equals("one")) s0 = Strings.get("extenderOneLabel"); else if (type.equals("sign")) s0 = Strings.get("extenderSignLabel"); else if (type.equals("input")) s0 = Strings.get("extenderInputLabel"); else s0 = "???"; // should never happen String s1 = Strings.get("extenderMainLabel"); Bounds bds = painter.getBounds(); int x = bds.getX() + bds.getWidth() / 2; int y0 = bds.getY() + (bds.getHeight() / 2 + asc) / 2; int y1 = bds.getY() + (3 * bds.getHeight() / 2 + asc) / 2; GraphicsUtil.drawText(g, s0, x, y0, GraphicsUtil.H_CENTER, GraphicsUtil.V_BASELINE); GraphicsUtil.drawText(g, s1, x, y1, GraphicsUtil.H_CENTER, GraphicsUtil.V_BASELINE); BitWidth w0 = painter.getAttributeValue(ATTR_OUT_WIDTH); BitWidth w1 = painter.getAttributeValue(ATTR_IN_WIDTH); painter.drawPort(0, "" + w0.getWidth(), Direction.WEST); painter.drawPort(1, "" + w1.getWidth(), Direction.EAST); if (type.equals("input")) painter.drawPort(2); } // // methods for instances // @Override protected void configureNewInstance(Instance instance) { configurePorts(instance); instance.addAttributeListener(); } @Override protected void instanceAttributeChanged(Instance instance, Attribute attr) { if (attr == ATTR_TYPE) { configurePorts(instance); instance.fireInvalidated(); } else { instance.fireInvalidated(); } } private void configurePorts(Instance instance) { Port p0 = new Port(0, 0, Port.OUTPUT, ATTR_OUT_WIDTH); Port p1 = new Port(-40, 0, Port.INPUT, ATTR_IN_WIDTH); String type = getType(instance.getAttributeSet()); if (type.equals("input")) { instance.setPorts(new Port[] { p0, p1, new Port(-20, -20, Port.INPUT, 1) }); } else { instance.setPorts(new Port[] { p0, p1 }); } } @Override public void propagate(InstanceState state) { Value in = state.getPort(1); BitWidth wout = state.getAttributeValue(ATTR_OUT_WIDTH); String type = getType(state.getAttributeSet()); Value extend; if (type.equals("one")) { extend = Value.TRUE; } else if (type.equals("sign")) { int win = in.getWidth(); extend = win > 0 ? in.get(win - 1) : Value.ERROR; } else if (type.equals("input")) { extend = state.getPort(2); if (extend.getWidth() != 1) extend = Value.ERROR; } else { extend = Value.FALSE; } Value out = in.extendWidth(wout.getWidth(), extend); state.setPort(0, out, 1); } private String getType(AttributeSet attrs) { AttributeOption topt = attrs.getValue(ATTR_TYPE); return (String) topt.getValue(); } }logisim-2.7.1/src/com/cburch/logisim/std/Strings.java0000644000175000017500000000102211446034566022432 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.StringGetter; class Strings { private static LocaleManager source = new LocaleManager("resources/logisim", "std"); public static String get(String key) { return source.get(key); } public static StringGetter getter(String key) { return source.getter(key); } } logisim-2.7.1/src/com/cburch/logisim/std/plexers/0000755000175000017500000000000011540557306021622 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/logisim/std/plexers/Strings.java0000644000175000017500000000142411446034554024117 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.plexers; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.StringGetter; import com.cburch.logisim.util.StringUtil; class Strings { private static LocaleManager source = new LocaleManager("resources/logisim", "std"); public static String get(String key) { return source.get(key); } public static String get(String key, String arg0) { return StringUtil.format(source.get(key), arg0); } public static StringGetter getter(String key) { return source.getter(key); } public static StringGetter getter(String key, String arg0) { return source.getter(key, arg0); } } logisim-2.7.1/src/com/cburch/logisim/std/plexers/PriorityEncoder.java0000644000175000017500000001415211520127246025603 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.plexers; import java.awt.Color; import java.awt.Graphics; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.tools.key.BitWidthConfigurator; import com.cburch.logisim.util.GraphicsUtil; public class PriorityEncoder extends InstanceFactory { private static final int OUT = 0; private static final int EN_IN = 1; private static final int EN_OUT = 2; private static final int GS = 3; public PriorityEncoder() { super("Priority Encoder", Strings.getter("priorityEncoderComponent")); setAttributes(new Attribute[] { StdAttr.FACING, Plexers.ATTR_SELECT, Plexers.ATTR_DISABLED }, new Object[] { Direction.EAST, BitWidth.create(3), Plexers.DISABLED_FLOATING }); setKeyConfigurator(new BitWidthConfigurator(Plexers.ATTR_SELECT, 1, 5, 0)); setIconName("priencod.gif"); setFacingAttribute(StdAttr.FACING); } @Override public Bounds getOffsetBounds(AttributeSet attrs) { Direction dir = attrs.getValue(StdAttr.FACING); BitWidth select = attrs.getValue(Plexers.ATTR_SELECT); int inputs = 1 << select.getWidth(); int offs = -5 * inputs; int len = 10 * inputs + 10; if (dir == Direction.NORTH) { return Bounds.create(offs, 0, len, 40); } else if (dir == Direction.SOUTH) { return Bounds.create(offs, -40, len, 40); } else if (dir == Direction.WEST) { return Bounds.create( 0, offs, 40, len); } else { // dir == Direction.EAST return Bounds.create(-40, offs, 40, len); } } @Override protected void configureNewInstance(Instance instance) { instance.addAttributeListener(); updatePorts(instance); } @Override protected void instanceAttributeChanged(Instance instance, Attribute attr) { if (attr == StdAttr.FACING || attr == Plexers.ATTR_SELECT) { instance.recomputeBounds(); updatePorts(instance); } else if (attr == Plexers.ATTR_SELECT) { updatePorts(instance); } else if (attr == Plexers.ATTR_DISABLED) { instance.fireInvalidated(); } } private void updatePorts(Instance instance) { Object dir = instance.getAttributeValue(StdAttr.FACING); BitWidth select = instance.getAttributeValue(Plexers.ATTR_SELECT); int n = 1 << select.getWidth(); Port[] ps = new Port[n + 4]; if (dir == Direction.NORTH || dir == Direction.SOUTH) { int x = -5 * n + 10; int y = dir == Direction.NORTH ? 40 : -40; for (int i = 0; i < n; i++) { ps[i] = new Port(x + 10 * i, y, Port.INPUT, 1); } ps[n + OUT] = new Port(0, 0, Port.OUTPUT, select.getWidth()); ps[n + EN_IN] = new Port(x + 10 * n, y / 2, Port.INPUT, 1); ps[n + EN_OUT] = new Port(x - 10, y / 2, Port.OUTPUT, 1); ps[n + GS] = new Port(10, 0, Port.OUTPUT, 1); } else { int x = dir == Direction.EAST ? -40 : 40; int y = -5 * n + 10; for (int i = 0; i < n; i++) { ps[i] = new Port(x, y + 10 * i, Port.INPUT, 1); } ps[n + OUT] = new Port(0, 0, Port.OUTPUT, select.getWidth()); ps[n + EN_IN] = new Port(x / 2, y + 10 * n, Port.INPUT, 1); ps[n + EN_OUT] = new Port(x / 2, y - 10, Port.OUTPUT, 1); ps[n + GS] = new Port(0, 10, Port.OUTPUT, 1); } for (int i = 0; i < n; i++) { ps[i].setToolTip(Strings.getter("priorityEncoderInTip", "" + i)); } ps[n + OUT].setToolTip(Strings.getter("priorityEncoderOutTip")); ps[n + EN_IN].setToolTip(Strings.getter("priorityEncoderEnableInTip")); ps[n + EN_OUT].setToolTip(Strings.getter("priorityEncoderEnableOutTip")); ps[n + GS].setToolTip(Strings.getter("priorityEncoderGroupSignalTip")); instance.setPorts(ps); } @Override public void propagate(InstanceState state) { BitWidth select = state.getAttributeValue(Plexers.ATTR_SELECT); int n = 1 << select.getWidth(); boolean enabled = state.getPort(n + EN_IN) != Value.FALSE; int out = -1; Value outDefault; if (enabled) { outDefault = Value.createUnknown(select); for (int i = n - 1; i >= 0; i--) { if (state.getPort(i) == Value.TRUE) { out = i; break; } } } else { Object opt = state.getAttributeValue(Plexers.ATTR_DISABLED); Value base = opt == Plexers.DISABLED_ZERO ? Value.FALSE : Value.UNKNOWN; outDefault = Value.repeat(base, select.getWidth()); } if (out < 0) { state.setPort(n + OUT, outDefault, Plexers.DELAY); state.setPort(n + EN_OUT, enabled ? Value.TRUE : Value.FALSE, Plexers.DELAY); state.setPort(n + GS, Value.FALSE, Plexers.DELAY); } else { state.setPort(n + OUT, Value.createKnown(select, out), Plexers.DELAY); state.setPort(n + EN_OUT, Value.FALSE, Plexers.DELAY); state.setPort(n + GS, Value.TRUE, Plexers.DELAY); } } @Override public void paintInstance(InstancePainter painter) { Graphics g = painter.getGraphics(); Direction facing = painter.getAttributeValue(StdAttr.FACING); painter.drawBounds(); Bounds bds = painter.getBounds(); g.setColor(Color.GRAY); int x0; int y0; int halign; if (facing == Direction.WEST) { x0 = bds.getX() + bds.getWidth() - 3; y0 = bds.getY() + 15; halign = GraphicsUtil.H_RIGHT; } else if (facing == Direction.NORTH) { x0 = bds.getX() + 10; y0 = bds.getY() + bds.getHeight() - 2; halign = GraphicsUtil.H_CENTER; } else if (facing == Direction.SOUTH) { x0 = bds.getX() + 10; y0 = bds.getY() + 12; halign = GraphicsUtil.H_CENTER; } else { x0 = bds.getX() + 3; y0 = bds.getY() + 15; halign = GraphicsUtil.H_LEFT; } GraphicsUtil.drawText(g, "0", x0, y0, halign, GraphicsUtil.V_BASELINE); g.setColor(Color.BLACK); GraphicsUtil.drawCenteredText(g, "Pri", bds.getX() + bds.getWidth() / 2, bds.getY() + bds.getHeight() / 2); painter.drawPorts(); } } logisim-2.7.1/src/com/cburch/logisim/std/plexers/Plexers.java0000644000175000017500000001106311540557302024104 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.plexers; import java.awt.Graphics; import java.util.List; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeOption; import com.cburch.logisim.data.Attributes; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.tools.FactoryDescription; import com.cburch.logisim.tools.Library; import com.cburch.logisim.tools.Tool; import com.cburch.logisim.util.GraphicsUtil; public class Plexers extends Library { public static final Attribute ATTR_SELECT = Attributes.forBitWidth("select", Strings.getter("plexerSelectBitsAttr"), 1, 5); public static final Object DEFAULT_SELECT = BitWidth.create(1); public static final Attribute ATTR_TRISTATE = Attributes.forBoolean("tristate", Strings.getter("plexerThreeStateAttr")); public static final Object DEFAULT_TRISTATE = Boolean.FALSE; public static final AttributeOption DISABLED_FLOATING = new AttributeOption("Z", Strings.getter("plexerDisabledFloating")); public static final AttributeOption DISABLED_ZERO = new AttributeOption("0", Strings.getter("plexerDisabledZero")); public static final Attribute ATTR_DISABLED = Attributes.forOption("disabled", Strings.getter("plexerDisabledAttr"), new AttributeOption[] { DISABLED_FLOATING, DISABLED_ZERO }); public static final Attribute ATTR_ENABLE = Attributes.forBoolean("enable", Strings.getter("plexerEnableAttr")); static final AttributeOption SELECT_BOTTOM_LEFT = new AttributeOption("bl", Strings.getter("plexerSelectBottomLeftOption")); static final AttributeOption SELECT_TOP_RIGHT = new AttributeOption("tr", Strings.getter("plexerSelectTopRightOption")); static final Attribute ATTR_SELECT_LOC = Attributes.forOption("selloc", Strings.getter("plexerSelectLocAttr"), new AttributeOption[] { SELECT_BOTTOM_LEFT, SELECT_TOP_RIGHT }); protected static final int DELAY = 3; private static FactoryDescription[] DESCRIPTIONS = { new FactoryDescription("Multiplexer", Strings.getter("multiplexerComponent"), "multiplexer.gif", "Multiplexer"), new FactoryDescription("Demultiplexer", Strings.getter("demultiplexerComponent"), "demultiplexer.gif", "Demultiplexer"), new FactoryDescription("Decoder", Strings.getter("decoderComponent"), "decoder.gif", "Decoder"), new FactoryDescription("Priority Encoder", Strings.getter("priorityEncoderComponent"), "priencod.gif", "PriorityEncoder"), new FactoryDescription("BitSelector", Strings.getter("bitSelectorComponent"), "bitSelector.gif", "BitSelector"), }; private List tools = null; public Plexers() { } @Override public String getName() { return "Plexers"; } @Override public String getDisplayName() { return Strings.get("plexerLibrary"); } @Override public List getTools() { if (tools == null) { tools = FactoryDescription.getTools(Plexers.class, DESCRIPTIONS); } return tools; } static void drawTrapezoid(Graphics g, Bounds bds, Direction facing, int facingLean) { int wid = bds.getWidth(); int ht = bds.getHeight(); int x0 = bds.getX(); int x1 = x0 + wid; int y0 = bds.getY(); int y1 = y0 + ht; int[] xp = { x0, x1, x1, x0 }; int[] yp = { y0, y0, y1, y1 }; if (facing == Direction.WEST) { yp[0] += facingLean; yp[3] -= facingLean; } else if (facing == Direction.NORTH) { xp[0] += facingLean; xp[1] -= facingLean; } else if (facing == Direction.SOUTH) { xp[2] -= facingLean; xp[3] += facingLean; } else { yp[1] += facingLean; yp[2] -= facingLean; } GraphicsUtil.switchToWidth(g, 2); g.drawPolygon(xp, yp, 4); } static boolean contains(Location loc, Bounds bds, Direction facing) { if (bds.contains(loc, 1)) { int x = loc.getX(); int y = loc.getY(); int x0 = bds.getX(); int x1 = x0 + bds.getWidth(); int y0 = bds.getY(); int y1 = y0 + bds.getHeight(); if (facing == Direction.NORTH || facing == Direction.SOUTH) { if (x < x0 + 5 || x > x1 - 5) { if (facing == Direction.SOUTH) { return y < y0 + 5; } else { return y > y1 - 5; } } else { return true; } } else { if (y < y0 + 5 || y > y1 - 5) { if (facing == Direction.EAST) { return x < x0 + 5; } else { return x > x1 - 5; } } else { return true; } } } else { return false; } } } logisim-2.7.1/src/com/cburch/logisim/std/plexers/Multiplexer.java0000644000175000017500000002452311537604336025007 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.plexers; import java.awt.Color; import java.awt.Graphics; import com.cburch.logisim.LogisimVersion; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.tools.key.BitWidthConfigurator; import com.cburch.logisim.tools.key.JoinedConfigurator; import com.cburch.logisim.util.GraphicsUtil; public class Multiplexer extends InstanceFactory { public Multiplexer() { super("Multiplexer", Strings.getter("multiplexerComponent")); setAttributes(new Attribute[] { StdAttr.FACING, Plexers.ATTR_SELECT_LOC, Plexers.ATTR_SELECT, StdAttr.WIDTH, Plexers.ATTR_DISABLED, Plexers.ATTR_ENABLE }, new Object[] { Direction.EAST, Plexers.SELECT_BOTTOM_LEFT, Plexers.DEFAULT_SELECT, BitWidth.ONE, Plexers.DISABLED_FLOATING, Boolean.TRUE }); setKeyConfigurator(JoinedConfigurator.create( new BitWidthConfigurator(Plexers.ATTR_SELECT, 1, 5, 0), new BitWidthConfigurator(StdAttr.WIDTH))); setIconName("multiplexer.gif"); setFacingAttribute(StdAttr.FACING); } @Override public Object getDefaultAttributeValue(Attribute attr, LogisimVersion ver) { if (attr == Plexers.ATTR_ENABLE) { int newer = ver.compareTo(LogisimVersion.get(2, 6, 3, 220)); return Boolean.valueOf(newer >= 0); } else { return super.getDefaultAttributeValue(attr, ver); } } @Override public Bounds getOffsetBounds(AttributeSet attrs) { Direction dir = attrs.getValue(StdAttr.FACING); BitWidth select = attrs.getValue(Plexers.ATTR_SELECT); int inputs = 1 << select.getWidth(); if (inputs == 2) { return Bounds.create(-30, -20, 30, 40).rotate(Direction.EAST, dir, 0, 0); } else { int offs = -(inputs / 2) * 10 - 10; int length = inputs * 10 + 20; return Bounds.create(-40, offs, 40, length).rotate(Direction.EAST, dir, 0, 0); } } @Override public boolean contains(Location loc, AttributeSet attrs) { Direction facing = attrs.getValue(StdAttr.FACING); return Plexers.contains(loc, getOffsetBounds(attrs), facing); } @Override protected void configureNewInstance(Instance instance) { instance.addAttributeListener(); updatePorts(instance); } @Override protected void instanceAttributeChanged(Instance instance, Attribute attr) { if (attr == StdAttr.FACING || attr == Plexers.ATTR_SELECT_LOC || attr == Plexers.ATTR_SELECT) { instance.recomputeBounds(); updatePorts(instance); } else if (attr == StdAttr.WIDTH || attr == Plexers.ATTR_ENABLE) { updatePorts(instance); } else if (attr == Plexers.ATTR_DISABLED) { instance.fireInvalidated(); } } private void updatePorts(Instance instance) { Direction dir = instance.getAttributeValue(StdAttr.FACING); Object selectLoc = instance.getAttributeValue(Plexers.ATTR_SELECT_LOC); BitWidth data = instance.getAttributeValue(StdAttr.WIDTH); BitWidth select = instance.getAttributeValue(Plexers.ATTR_SELECT); boolean enable = instance.getAttributeValue(Plexers.ATTR_ENABLE).booleanValue(); int selMult = selectLoc == Plexers.SELECT_BOTTOM_LEFT ? 1 : -1; int inputs = 1 << select.getWidth(); Port[] ps = new Port[inputs + (enable ? 3 : 2)]; Location sel; if (inputs == 2) { Location end0; Location end1; if (dir == Direction.WEST) { end0 = Location.create(30, -10); end1 = Location.create(30, 10); sel = Location.create(20, selMult * 20); } else if (dir == Direction.NORTH) { end0 = Location.create(-10, 30); end1 = Location.create( 10, 30); sel = Location.create(selMult * -20, 20); } else if (dir == Direction.SOUTH) { end0 = Location.create(-10, -30); end1 = Location.create( 10, -30); sel = Location.create(selMult * -20, -20); } else { end0 = Location.create(-30, -10); end1 = Location.create(-30, 10); sel = Location.create(-20, selMult * 20); } ps[0] = new Port(end0.getX(), end0.getY(), Port.INPUT, data.getWidth()); ps[1] = new Port(end1.getX(), end1.getY(), Port.INPUT, data.getWidth()); } else { int dx = -(inputs / 2) * 10; int ddx = 10; int dy = -(inputs / 2) * 10; int ddy = 10; if (dir == Direction.WEST) { dx = 40; ddx = 0; sel = Location.create(20, selMult * (dy + 10 * inputs)); } else if (dir == Direction.NORTH) { dy = 40; ddy = 0; sel = Location.create(selMult * dx, 20); } else if (dir == Direction.SOUTH) { dy = -40; ddy = 0; sel = Location.create(selMult * dx, -20); } else { dx = -40; ddx = 0; sel = Location.create(-20, selMult * (dy + 10 * inputs)); } for (int i = 0; i < inputs; i++) { ps[i] = new Port(dx, dy, Port.INPUT, data.getWidth()); dx += ddx; dy += ddy; } } Location en = sel.translate(dir, 10); ps[inputs] = new Port(sel.getX(), sel.getY(), Port.INPUT, select.getWidth()); if (enable) { ps[inputs + 1] = new Port(en.getX(), en.getY(), Port.INPUT, BitWidth.ONE); } ps[ps.length - 1] = new Port(0, 0, Port.OUTPUT, data.getWidth()); for (int i = 0; i < inputs; i++) { ps[i].setToolTip(Strings.getter("multiplexerInTip", "" + i)); } ps[inputs].setToolTip(Strings.getter("multiplexerSelectTip")); if (enable) { ps[inputs + 1].setToolTip(Strings.getter("multiplexerEnableTip")); } ps[ps.length - 1].setToolTip(Strings.getter("multiplexerOutTip")); instance.setPorts(ps); } @Override public void propagate(InstanceState state) { BitWidth data = state.getAttributeValue(StdAttr.WIDTH); BitWidth select = state.getAttributeValue(Plexers.ATTR_SELECT); boolean enable = state.getAttributeValue(Plexers.ATTR_ENABLE).booleanValue(); int inputs = 1 << select.getWidth(); Value en = enable ? state.getPort(inputs + 1) : Value.TRUE; Value out; if (en == Value.FALSE) { Object opt = state.getAttributeValue(Plexers.ATTR_DISABLED); Value base = opt == Plexers.DISABLED_ZERO ? Value.FALSE : Value.UNKNOWN; out = Value.repeat(base, data.getWidth()); } else if (en == Value.ERROR && state.isPortConnected(inputs + 1)) { out = Value.createError(data); } else { Value sel = state.getPort(inputs); if (sel.isFullyDefined()) { out = state.getPort(sel.toIntValue()); } else if (sel.isErrorValue()) { out = Value.createError(data); } else { out = Value.createUnknown(data); } } state.setPort(inputs + (enable ? 2 : 1), out, Plexers.DELAY); } @Override public void paintGhost(InstancePainter painter) { Direction facing = painter.getAttributeValue(StdAttr.FACING); BitWidth select = painter.getAttributeValue(Plexers.ATTR_SELECT); Plexers.drawTrapezoid(painter.getGraphics(), painter.getBounds(), facing, select.getWidth() == 1 ? 10 : 20); } @Override public void paintInstance(InstancePainter painter) { Graphics g = painter.getGraphics(); Bounds bds = painter.getBounds(); Direction facing = painter.getAttributeValue(StdAttr.FACING); BitWidth select = painter.getAttributeValue(Plexers.ATTR_SELECT); boolean enable = painter.getAttributeValue(Plexers.ATTR_ENABLE).booleanValue(); int inputs = 1 << select.getWidth(); // draw stubs for select/enable inputs that aren't on instance boundary GraphicsUtil.switchToWidth(g, 3); boolean vertical = facing != Direction.NORTH && facing != Direction.SOUTH; Object selectLoc = painter.getAttributeValue(Plexers.ATTR_SELECT_LOC); int selMult = selectLoc == Plexers.SELECT_BOTTOM_LEFT ? 1 : -1; int dx = vertical ? 0 : -selMult; int dy = vertical ? selMult : 0; if (inputs == 2) { // draw select wire Location pt = painter.getInstance().getPortLocation(inputs); if (painter.getShowState()) { g.setColor(painter.getPort(inputs).getColor()); } g.drawLine(pt.getX() - 2 * dx, pt.getY() - 2 * dy, pt.getX(), pt.getY()); } if (enable) { Location en = painter.getInstance().getPortLocation(inputs + 1); if (painter.getShowState()) { g.setColor(painter.getPort(inputs + 1).getColor()); } int len = inputs == 2 ? 6 : 4; g.drawLine(en.getX() - len * dx, en.getY() - len * dy, en.getX(), en.getY()); } GraphicsUtil.switchToWidth(g, 1); // draw a circle indicating where the select input is located Multiplexer.drawSelectCircle(g, bds, painter.getInstance().getPortLocation(inputs)); // draw a 0 indicating where the numbering starts for inputs int x0; int y0; int halign; if (facing == Direction.WEST) { x0 = bds.getX() + bds.getWidth() - 3; y0 = bds.getY() + 15; halign = GraphicsUtil.H_RIGHT; } else if (facing == Direction.NORTH) { x0 = bds.getX() + 10; y0 = bds.getY() + bds.getHeight() - 2; halign = GraphicsUtil.H_CENTER; } else if (facing == Direction.SOUTH) { x0 = bds.getX() + 10; y0 = bds.getY() + 12; halign = GraphicsUtil.H_CENTER; } else { x0 = bds.getX() + 3; y0 = bds.getY() + 15; halign = GraphicsUtil.H_LEFT; } g.setColor(Color.GRAY); GraphicsUtil.drawText(g, "0", x0, y0, halign, GraphicsUtil.V_BASELINE); // draw the trapezoid, "MUX" string, the individual ports g.setColor(Color.BLACK); Plexers.drawTrapezoid(g, bds, facing, select.getWidth() == 1 ? 10 : 20); GraphicsUtil.drawCenteredText(g, "MUX", bds.getX() + bds.getWidth() / 2, bds.getY() + bds.getHeight() / 2); painter.drawPorts(); } static void drawSelectCircle(Graphics g, Bounds bds, Location loc) { int locDelta = Math.max(bds.getHeight(), bds.getWidth()) <= 50 ? 8 : 6; Location circLoc; if (bds.getHeight() >= bds.getWidth()) { // vertically oriented if (loc.getY() < bds.getY() + bds.getHeight() / 2) { // at top circLoc = loc.translate(0, locDelta); } else { // at bottom circLoc = loc.translate(0, -locDelta); } } else { if (loc.getX() < bds.getX() + bds.getWidth() / 2) { // at left circLoc = loc.translate(locDelta, 0); } else { // at right circLoc = loc.translate(-locDelta, 0); } } g.setColor(Color.LIGHT_GRAY); g.fillOval(circLoc.getX() - 3, circLoc.getY() - 3, 6, 6); } } logisim-2.7.1/src/com/cburch/logisim/std/plexers/Demultiplexer.java0000644000175000017500000002406411537604332025314 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.plexers; import java.awt.Color; import java.awt.Graphics; import com.cburch.logisim.LogisimVersion; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.tools.key.BitWidthConfigurator; import com.cburch.logisim.tools.key.JoinedConfigurator; import com.cburch.logisim.util.GraphicsUtil; public class Demultiplexer extends InstanceFactory { public Demultiplexer() { super("Demultiplexer", Strings.getter("demultiplexerComponent")); setAttributes(new Attribute[] { StdAttr.FACING, Plexers.ATTR_SELECT_LOC, Plexers.ATTR_SELECT, StdAttr.WIDTH, Plexers.ATTR_TRISTATE, Plexers.ATTR_DISABLED, Plexers.ATTR_ENABLE }, new Object[] { Direction.EAST, Plexers.SELECT_BOTTOM_LEFT, Plexers.DEFAULT_SELECT, BitWidth.ONE, Plexers.DEFAULT_TRISTATE, Plexers.DISABLED_FLOATING, Boolean.TRUE }); setKeyConfigurator(JoinedConfigurator.create( new BitWidthConfigurator(Plexers.ATTR_SELECT, 1, 5, 0), new BitWidthConfigurator(StdAttr.WIDTH))); setFacingAttribute(StdAttr.FACING); setIconName("demultiplexer.gif"); } @Override public Object getDefaultAttributeValue(Attribute attr, LogisimVersion ver) { if (attr == Plexers.ATTR_ENABLE) { int newer = ver.compareTo(LogisimVersion.get(2, 6, 3, 220)); return Boolean.valueOf(newer >= 0); } else { return super.getDefaultAttributeValue(attr, ver); } } @Override public Bounds getOffsetBounds(AttributeSet attrs) { Direction facing = attrs.getValue(StdAttr.FACING); BitWidth select = attrs.getValue(Plexers.ATTR_SELECT); int outputs = 1 << select.getWidth(); Bounds bds; if (outputs == 2) { bds = Bounds.create(0, -20, 30, 40); } else { bds = Bounds.create(0, -(outputs / 2) * 10 - 10, 40, outputs * 10 + 20); } return bds.rotate(Direction.EAST, facing, 0, 0); } @Override public boolean contains(Location loc, AttributeSet attrs) { Direction facing = attrs.getValue(StdAttr.FACING).reverse(); return Plexers.contains(loc, getOffsetBounds(attrs), facing); } @Override protected void configureNewInstance(Instance instance) { instance.addAttributeListener(); updatePorts(instance); } @Override protected void instanceAttributeChanged(Instance instance, Attribute attr) { if (attr == StdAttr.FACING || attr == Plexers.ATTR_SELECT_LOC || attr == Plexers.ATTR_SELECT) { instance.recomputeBounds(); updatePorts(instance); } else if (attr == StdAttr.WIDTH || attr == Plexers.ATTR_ENABLE) { updatePorts(instance); } else if (attr == Plexers.ATTR_TRISTATE || attr == Plexers.ATTR_DISABLED) { instance.fireInvalidated(); } } private void updatePorts(Instance instance) { Direction facing = instance.getAttributeValue(StdAttr.FACING); Object selectLoc = instance.getAttributeValue(Plexers.ATTR_SELECT_LOC); BitWidth data = instance.getAttributeValue(StdAttr.WIDTH); BitWidth select = instance.getAttributeValue(Plexers.ATTR_SELECT); boolean enable = instance.getAttributeValue(Plexers.ATTR_ENABLE).booleanValue(); int outputs = 1 << select.getWidth(); Port[] ps = new Port[outputs + (enable ? 3 : 2)]; Location sel; int selMult = selectLoc == Plexers.SELECT_BOTTOM_LEFT ? 1 : -1; if (outputs == 2) { Location end0; Location end1; if (facing == Direction.WEST) { end0 = Location.create(-30, -10); end1 = Location.create(-30, 10); sel = Location.create(-20, selMult * 20); } else if (facing == Direction.NORTH) { end0 = Location.create(-10, -30); end1 = Location.create( 10, -30); sel = Location.create(selMult * -20, -20); } else if (facing == Direction.SOUTH) { end0 = Location.create(-10, 30); end1 = Location.create( 10, 30); sel = Location.create(selMult * -20, 20); } else { end0 = Location.create(30, -10); end1 = Location.create(30, 10); sel = Location.create(20, selMult * 20); } ps[0] = new Port(end0.getX(), end0.getY(), Port.OUTPUT, data.getWidth()); ps[1] = new Port(end1.getX(), end1.getY(), Port.OUTPUT, data.getWidth()); } else { int dx = -(outputs / 2) * 10; int ddx = 10; int dy = dx; int ddy = 10; if (facing == Direction.WEST) { dx = -40; ddx = 0; sel = Location.create(-20, selMult * (dy + 10 * outputs)); } else if (facing == Direction.NORTH) { dy = -40; ddy = 0; sel = Location.create(selMult * dx, -20); } else if (facing == Direction.SOUTH) { dy = 40; ddy = 0; sel = Location.create(selMult * dx, 20); } else { dx = 40; ddx = 0; sel = Location.create(20, selMult * (dy + 10 * outputs)); } for (int i = 0; i < outputs; i++) { ps[i] = new Port(dx, dy, Port.OUTPUT, data.getWidth()); dx += ddx; dy += ddy; } } Location en = sel.translate(facing, -10); ps[outputs] = new Port(sel.getX(), sel.getY(), Port.INPUT, select.getWidth()); if (enable) { ps[outputs + 1] = new Port(en.getX(), en.getY(), Port.INPUT, BitWidth.ONE); } ps[ps.length - 1] = new Port(0, 0, Port.INPUT, data.getWidth()); for (int i = 0; i < outputs; i++) { ps[i].setToolTip(Strings.getter("demultiplexerOutTip", "" + i)); } ps[outputs].setToolTip(Strings.getter("demultiplexerSelectTip")); if (enable) { ps[outputs + 1].setToolTip(Strings.getter("demultiplexerEnableTip")); } ps[ps.length - 1].setToolTip(Strings.getter("demultiplexerInTip")); instance.setPorts(ps); } @Override public void propagate(InstanceState state) { // get attributes BitWidth data = state.getAttributeValue(StdAttr.WIDTH); BitWidth select = state.getAttributeValue(Plexers.ATTR_SELECT); Boolean threeState = state.getAttributeValue(Plexers.ATTR_TRISTATE); boolean enable = state.getAttributeValue(Plexers.ATTR_ENABLE).booleanValue(); int outputs = 1 << select.getWidth(); Value en = enable ? state.getPort(outputs + 1) : Value.TRUE; // determine output values Value others; // the default output if (threeState.booleanValue()) { others = Value.createUnknown(data); } else { others = Value.createKnown(data, 0); } int outIndex = -1; // the special output Value out = null; if (en == Value.FALSE) { Object opt = state.getAttributeValue(Plexers.ATTR_DISABLED); Value base = opt == Plexers.DISABLED_ZERO ? Value.FALSE : Value.UNKNOWN; others = Value.repeat(base, data.getWidth()); } else if (en == Value.ERROR && state.isPortConnected(outputs + 1)) { others = Value.createError(data); } else { Value sel = state.getPort(outputs); if (sel.isFullyDefined()) { outIndex = sel.toIntValue(); out = state.getPort(outputs + (enable ? 2 : 1)); } else if (sel.isErrorValue()) { others = Value.createError(data); } else { others = Value.createUnknown(data); } } // now propagate them for (int i = 0; i < outputs; i++) { state.setPort(i, i == outIndex ? out : others, Plexers.DELAY); } } @Override public void paintGhost(InstancePainter painter) { Direction facing = painter.getAttributeValue(StdAttr.FACING); BitWidth select = painter.getAttributeValue(Plexers.ATTR_SELECT); Plexers.drawTrapezoid(painter.getGraphics(), painter.getBounds(), facing.reverse(), select.getWidth() == 1 ? 10 : 20); } @Override public void paintInstance(InstancePainter painter) { Graphics g = painter.getGraphics(); Bounds bds = painter.getBounds(); Direction facing = painter.getAttributeValue(StdAttr.FACING); BitWidth select = painter.getAttributeValue(Plexers.ATTR_SELECT); boolean enable = painter.getAttributeValue(Plexers.ATTR_ENABLE).booleanValue(); int outputs = 1 << select.getWidth(); // draw select and enable inputs GraphicsUtil.switchToWidth(g, 3); boolean vertical = facing == Direction.NORTH || facing == Direction.SOUTH; Object selectLoc = painter.getAttributeValue(Plexers.ATTR_SELECT_LOC); int selMult = selectLoc == Plexers.SELECT_BOTTOM_LEFT ? 1 : -1; int dx = vertical ? selMult : 0; int dy = vertical ? 0 : -selMult; if (outputs == 2) { // draw select wire Location sel = painter.getInstance().getPortLocation(outputs); if (painter.getShowState()) { g.setColor(painter.getPort(outputs).getColor()); } g.drawLine(sel.getX(), sel.getY(), sel.getX() + 2 * dx, sel.getY() + 2 * dy); } if (enable) { Location en = painter.getInstance().getPortLocation(outputs + 1); if (painter.getShowState()) { g.setColor(painter.getPort(outputs + 1).getColor()); } int len = outputs == 2 ? 6 : 4; g.drawLine(en.getX(), en.getY(), en.getX() + len * dx, en.getY() + len * dy); } GraphicsUtil.switchToWidth(g, 1); // draw a circle indicating where the select input is located Multiplexer.drawSelectCircle(g, bds, painter.getInstance().getPortLocation(outputs)); // draw "0" next to first input int x0; int y0; int halign; if (facing == Direction.WEST) { x0 = 3; y0 = 15; halign = GraphicsUtil.H_LEFT; } else if (facing == Direction.NORTH) { x0 = 10; y0 = 15; halign = GraphicsUtil.H_CENTER; } else if (facing == Direction.SOUTH) { x0 = 10; y0 = bds.getHeight() - 3; halign = GraphicsUtil.H_CENTER; } else { x0 = bds.getWidth() - 3; y0 = 15; halign = GraphicsUtil.H_RIGHT; } g.setColor(Color.GRAY); GraphicsUtil.drawText(g, "0", bds.getX() + x0, bds.getY() + y0, halign, GraphicsUtil.V_BASELINE); // draw trapezoid, "DMX" label, and ports g.setColor(Color.BLACK); Plexers.drawTrapezoid(g, bds, facing.reverse(), select.getWidth() == 1 ? 10 : 20); GraphicsUtil.drawCenteredText(g, "DMX", bds.getX() + bds.getWidth() / 2, bds.getY() + bds.getHeight() / 2); painter.drawPorts(); } } logisim-2.7.1/src/com/cburch/logisim/std/plexers/Decoder.java0000644000175000017500000002315711540557306024042 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.plexers; import java.awt.Color; import java.awt.Graphics; import com.cburch.logisim.LogisimVersion; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.tools.key.BitWidthConfigurator; import com.cburch.logisim.util.GraphicsUtil; public class Decoder extends InstanceFactory { public Decoder() { super("Decoder", Strings.getter("decoderComponent")); setAttributes(new Attribute[] { StdAttr.FACING, Plexers.ATTR_SELECT_LOC, Plexers.ATTR_SELECT, Plexers.ATTR_TRISTATE, Plexers.ATTR_DISABLED, Plexers.ATTR_ENABLE }, new Object[] { Direction.EAST, Plexers.SELECT_BOTTOM_LEFT, Plexers.DEFAULT_SELECT, Plexers.DEFAULT_TRISTATE, Plexers.DISABLED_FLOATING, Boolean.TRUE }); setKeyConfigurator(new BitWidthConfigurator(Plexers.ATTR_SELECT, 1, 5, 0)); setIconName("decoder.gif"); setFacingAttribute(StdAttr.FACING); } @Override public Object getDefaultAttributeValue(Attribute attr, LogisimVersion ver) { if (attr == Plexers.ATTR_ENABLE) { int newer = ver.compareTo(LogisimVersion.get(2, 6, 3, 220)); return Boolean.valueOf(newer >= 0); } else { return super.getDefaultAttributeValue(attr, ver); } } @Override public Bounds getOffsetBounds(AttributeSet attrs) { Direction facing = attrs.getValue(StdAttr.FACING); Object selectLoc = attrs.getValue(Plexers.ATTR_SELECT_LOC); BitWidth select = attrs.getValue(Plexers.ATTR_SELECT); int outputs = 1 << select.getWidth(); Bounds bds; boolean reversed = facing == Direction.WEST || facing == Direction.NORTH; if (selectLoc == Plexers.SELECT_TOP_RIGHT) reversed = !reversed; if (outputs == 2) { int y = reversed ? 0 : -40; bds = Bounds.create(-20, y, 30, 40); } else { int x = -20; int y = reversed ? -10 : -(outputs * 10 + 10); bds = Bounds.create(x, y, 40, outputs * 10 + 20); } return bds.rotate(Direction.EAST, facing, 0, 0); } @Override public boolean contains(Location loc, AttributeSet attrs) { Direction facing = attrs.getValue(StdAttr.FACING).reverse(); return Plexers.contains(loc, getOffsetBounds(attrs), facing); } @Override protected void configureNewInstance(Instance instance) { instance.addAttributeListener(); updatePorts(instance); } @Override protected void instanceAttributeChanged(Instance instance, Attribute attr) { if (attr == StdAttr.FACING || attr == Plexers.ATTR_SELECT_LOC || attr == Plexers.ATTR_SELECT) { instance.recomputeBounds(); updatePorts(instance); } else if (attr == Plexers.ATTR_SELECT || attr == Plexers.ATTR_ENABLE) { updatePorts(instance); } else if (attr == Plexers.ATTR_TRISTATE || attr == Plexers.ATTR_DISABLED) { instance.fireInvalidated(); } } private void updatePorts(Instance instance) { Direction facing = instance.getAttributeValue(StdAttr.FACING); Object selectLoc = instance.getAttributeValue(Plexers.ATTR_SELECT_LOC); BitWidth select = instance.getAttributeValue(Plexers.ATTR_SELECT); boolean enable = instance.getAttributeValue(Plexers.ATTR_ENABLE).booleanValue(); int outputs = 1 << select.getWidth(); Port[] ps = new Port[outputs + (enable ? 2 : 1)]; if (outputs == 2) { Location end0; Location end1; if (facing == Direction.NORTH || facing == Direction.SOUTH) { int y = facing == Direction.NORTH ? -10 : 10; if (selectLoc == Plexers.SELECT_TOP_RIGHT) { end0 = Location.create(-30, y); end1 = Location.create(-10, y); } else { end0 = Location.create(10, y); end1 = Location.create(30, y); } } else { int x = facing == Direction.WEST ? -10 : 10; if (selectLoc == Plexers.SELECT_TOP_RIGHT) { end0 = Location.create(x, 10); end1 = Location.create(x, 30); } else { end0 = Location.create(x, -30); end1 = Location.create(x, -10); } } ps[0] = new Port(end0.getX(), end0.getY(), Port.OUTPUT, 1); ps[1] = new Port(end1.getX(), end1.getY(), Port.OUTPUT, 1); } else { int dx; int ddx; int dy; int ddy; if (facing == Direction.NORTH || facing == Direction.SOUTH) { dy = facing == Direction.NORTH ? -20 : 20; ddy = 0; dx = selectLoc == Plexers.SELECT_TOP_RIGHT ? -10 * outputs : 0; ddx = 10; } else { dx = facing == Direction.WEST ? -20 : 20; ddx = 0; dy = selectLoc == Plexers.SELECT_TOP_RIGHT ? 0 : -10 * outputs; ddy = 10; } for (int i = 0; i < outputs; i++) { ps[i] = new Port(dx, dy, Port.OUTPUT, 1); dx += ddx; dy += ddy; } } Location en = Location.create(0, 0).translate(facing, -10); ps[outputs] = new Port(0, 0, Port.INPUT, select.getWidth()); if (enable) { ps[outputs + 1] = new Port(en.getX(), en.getY(), Port.INPUT, BitWidth.ONE); } for (int i = 0; i < outputs; i++) { ps[i].setToolTip(Strings.getter("decoderOutTip", "" + i)); } ps[outputs].setToolTip(Strings.getter("decoderSelectTip")); if (enable) { ps[outputs + 1].setToolTip(Strings.getter("decoderEnableTip")); } instance.setPorts(ps); } @Override public void propagate(InstanceState state) { // get attributes BitWidth data = BitWidth.ONE; BitWidth select = state.getAttributeValue(Plexers.ATTR_SELECT); Boolean threeState = state.getAttributeValue(Plexers.ATTR_TRISTATE); boolean enable = state.getAttributeValue(Plexers.ATTR_ENABLE).booleanValue(); int outputs = 1 << select.getWidth(); // determine default output values Value others; // the default output if (threeState.booleanValue()) { others = Value.UNKNOWN; } else { others = Value.FALSE; } // determine selected output value int outIndex = -1; // the special output Value out = null; Value en = enable ? state.getPort(outputs + 1) : Value.TRUE; if (en == Value.FALSE) { Object opt = state.getAttributeValue(Plexers.ATTR_DISABLED); Value base = opt == Plexers.DISABLED_ZERO ? Value.FALSE : Value.UNKNOWN; others = Value.repeat(base, data.getWidth()); } else if (en == Value.ERROR && state.isPortConnected(outputs + 1)) { others = Value.createError(data); } else { Value sel = state.getPort(outputs); if (sel.isFullyDefined()) { outIndex = sel.toIntValue(); out = Value.TRUE; } else if (sel.isErrorValue()) { others = Value.createError(data); } else { others = Value.createUnknown(data); } } // now propagate them for (int i = 0; i < outputs; i++) { state.setPort(i, i == outIndex ? out : others, Plexers.DELAY); } } @Override public void paintGhost(InstancePainter painter) { Direction facing = painter.getAttributeValue(StdAttr.FACING); BitWidth select = painter.getAttributeValue(Plexers.ATTR_SELECT); Plexers.drawTrapezoid(painter.getGraphics(), painter.getBounds(), facing.reverse(), select.getWidth() == 1 ? 10 : 20); } @Override public void paintInstance(InstancePainter painter) { Graphics g = painter.getGraphics(); Bounds bds = painter.getBounds(); Direction facing = painter.getAttributeValue(StdAttr.FACING); Object selectLoc = painter.getAttributeValue(Plexers.ATTR_SELECT_LOC); BitWidth select = painter.getAttributeValue(Plexers.ATTR_SELECT); boolean enable = painter.getAttributeValue(Plexers.ATTR_ENABLE).booleanValue(); int selMult = selectLoc == Plexers.SELECT_TOP_RIGHT ? -1 : 1; int outputs = 1 << select.getWidth(); // draw stubs for select and enable ports GraphicsUtil.switchToWidth(g, 3); boolean vertical = facing == Direction.NORTH || facing == Direction.SOUTH; int dx = vertical ? selMult : 0; int dy = vertical ? 0 : -selMult; if (outputs == 2) { // draw select wire if (painter.getShowState()) { g.setColor(painter.getPort(outputs).getColor()); } Location pt = painter.getInstance().getPortLocation(outputs); g.drawLine(pt.getX(), pt.getY(), pt.getX() + 2 * dx, pt.getY() + 2 * dy); } if (enable) { Location en = painter.getInstance().getPortLocation(outputs + 1); int len = outputs == 2 ? 6 : 4; if (painter.getShowState()) { g.setColor(painter.getPort(outputs + 1).getColor()); } g.drawLine(en.getX(), en.getY(), en.getX() + len * dx, en.getY() + len * dy); } GraphicsUtil.switchToWidth(g, 1); // draw a circle indicating where the select input is located Multiplexer.drawSelectCircle(g, bds, painter.getInstance().getPortLocation(outputs)); // draw "0" int x0; int y0; int halign; if (facing == Direction.WEST) { x0 = 3; y0 = 15; halign = GraphicsUtil.H_LEFT; } else if (facing == Direction.NORTH) { x0 = 10; y0 = 15; halign = GraphicsUtil.H_CENTER; } else if (facing == Direction.SOUTH) { x0 = 10; y0 = bds.getHeight() - 3; halign = GraphicsUtil.H_CENTER; } else { x0 = bds.getWidth() - 3; y0 = 15; halign = GraphicsUtil.H_RIGHT; } g.setColor(Color.GRAY); GraphicsUtil.drawText(g, "0", bds.getX() + x0, bds.getY() + y0, halign, GraphicsUtil.V_BASELINE); // draw trapezoid, "Decd", and ports g.setColor(Color.BLACK); Plexers.drawTrapezoid(g, bds, facing.reverse(), outputs == 2 ? 10 : 20); GraphicsUtil.drawCenteredText(g, "Decd", bds.getX() + bds.getWidth() / 2, bds.getY() + bds.getHeight() / 2); painter.drawPorts(); } } logisim-2.7.1/src/com/cburch/logisim/std/plexers/BitSelector.java0000644000175000017500000001202111446034554024700 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.plexers; import java.awt.Color; import java.awt.Graphics; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Attributes; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.tools.key.BitWidthConfigurator; import com.cburch.logisim.tools.key.JoinedConfigurator; import com.cburch.logisim.util.GraphicsUtil; public class BitSelector extends InstanceFactory { public static final Attribute GROUP_ATTR = Attributes.forBitWidth("group", Strings.getter("bitSelectorGroupAttr")); public BitSelector() { super("BitSelector", Strings.getter("bitSelectorComponent")); setAttributes(new Attribute[] { StdAttr.FACING, StdAttr.WIDTH, GROUP_ATTR }, new Object[] { Direction.EAST, BitWidth.create(8), BitWidth.ONE }); setKeyConfigurator(JoinedConfigurator.create( new BitWidthConfigurator(GROUP_ATTR, 1, Value.MAX_WIDTH, 0), new BitWidthConfigurator(StdAttr.WIDTH))); setIconName("bitSelector.gif"); setFacingAttribute(StdAttr.FACING); } @Override public Bounds getOffsetBounds(AttributeSet attrs) { Direction facing = attrs.getValue(StdAttr.FACING); Bounds base = Bounds.create(-30, -15, 30, 30); return base.rotate(Direction.EAST, facing, 0, 0); } @Override protected void configureNewInstance(Instance instance) { instance.addAttributeListener(); updatePorts(instance); } @Override protected void instanceAttributeChanged(Instance instance, Attribute attr) { if (attr == StdAttr.FACING) { instance.recomputeBounds(); updatePorts(instance); } else if (attr == StdAttr.WIDTH || attr == GROUP_ATTR) { updatePorts(instance); } } private void updatePorts(Instance instance) { Direction facing = instance.getAttributeValue(StdAttr.FACING); BitWidth data = instance.getAttributeValue(StdAttr.WIDTH); BitWidth group = instance.getAttributeValue(GROUP_ATTR); int groups = (data.getWidth() + group.getWidth() - 1) / group.getWidth() - 1; int selectBits = 1; if (groups > 0) { while (groups != 1) { groups >>= 1; selectBits++; } } BitWidth select = BitWidth.create(selectBits); Location inPt; Location selPt; if (facing == Direction.WEST) { inPt = Location.create(30, 0); selPt = Location.create(10, 10); } else if (facing == Direction.NORTH) { inPt = Location.create( 0, 30); selPt = Location.create(-10, 10); } else if (facing == Direction.SOUTH) { inPt = Location.create( 0, -30); selPt = Location.create(-10, -10); } else { inPt = Location.create(-30, 0); selPt = Location.create(-10, 10); } Port[] ps = new Port[3]; ps[0] = new Port(0, 0, Port.OUTPUT, group.getWidth()); ps[1] = new Port(inPt.getX(), inPt.getY(), Port.INPUT, data.getWidth()); ps[2] = new Port(selPt.getX(), selPt.getY(), Port.INPUT, select.getWidth()); ps[0].setToolTip(Strings.getter("bitSelectorOutputTip")); ps[1].setToolTip(Strings.getter("bitSelectorDataTip")); ps[2].setToolTip(Strings.getter("bitSelectorSelectTip")); instance.setPorts(ps); } @Override public void propagate(InstanceState state) { Value data = state.getPort(1); Value select = state.getPort(2); BitWidth groupBits = state.getAttributeValue(GROUP_ATTR); Value group; if (!select.isFullyDefined()) { group = Value.createUnknown(groupBits); } else { int shift = select.toIntValue() * groupBits.getWidth(); if (shift >= data.getWidth()) { group = Value.createKnown(groupBits, 0); } else if (groupBits.getWidth() == 1) { group = data.get(shift); } else { Value[] bits = new Value[groupBits.getWidth()]; for (int i = 0; i < bits.length; i++) { if (shift + i >= data.getWidth()) { bits[i] = Value.FALSE; } else { bits[i] = data.get(shift + i); } } group = Value.create(bits); } } state.setPort(0, group, Plexers.DELAY); } @Override public void paintGhost(InstancePainter painter) { Plexers.drawTrapezoid(painter.getGraphics(), painter.getBounds(), painter.getAttributeValue(StdAttr.FACING), 9); } @Override public void paintInstance(InstancePainter painter) { Graphics g = painter.getGraphics(); Direction facing = painter.getAttributeValue(StdAttr.FACING); Plexers.drawTrapezoid(g, painter.getBounds(), facing, 9); Bounds bds = painter.getBounds(); g.setColor(Color.BLACK); GraphicsUtil.drawCenteredText(g, "Sel", bds.getX() + bds.getWidth() / 2, bds.getY() + bds.getHeight() / 2); painter.drawPorts(); } } logisim-2.7.1/src/com/cburch/logisim/std/memory/0000755000175000017500000000000011527054442021446 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/logisim/std/memory/TFlipFlop.java0000644000175000017500000000127411527054374024160 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.memory; import com.cburch.logisim.data.Value; public class TFlipFlop extends AbstractFlipFlop { public TFlipFlop() { super("T Flip-Flop", "tFlipFlop.gif", Strings.getter("tFlipFlopComponent"), 1, false); } @Override protected String getInputName(int index) { return "T"; } @Override protected Value computeValue(Value[] inputs, Value curValue) { if (curValue == Value.UNKNOWN) curValue = Value.FALSE; if (inputs[0] == Value.TRUE) { return curValue.not(); } else { return curValue; } } } logisim-2.7.1/src/com/cburch/logisim/std/memory/Strings.java0000644000175000017500000000145511446034564023752 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.memory; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.StringGetter; import com.cburch.logisim.util.StringUtil; class Strings { private static LocaleManager source = new LocaleManager("resources/logisim", "std"); public static String get(String key) { return source.get(key); } public static String get(String key, String arg0) { return StringUtil.format(source.get(key), arg0); } public static String get(String key, String arg0, String arg1) { return StringUtil.format(source.get(key), arg0, arg1); } public static StringGetter getter(String key) { return source.getter(key); } } logisim-2.7.1/src/com/cburch/logisim/std/memory/SRFlipFlop.java0000644000175000017500000000164111527054356024277 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.memory; import com.cburch.logisim.data.Value; public class SRFlipFlop extends AbstractFlipFlop { public SRFlipFlop() { super("S-R Flip-Flop", "srFlipFlop.gif", Strings.getter("srFlipFlopComponent"), 2, true); } @Override protected String getInputName(int index) { return index == 0 ? "S" : "R"; } @Override protected Value computeValue(Value[] inputs, Value curValue) { if (inputs[0] == Value.FALSE) { if (inputs[1] == Value.FALSE) { return curValue; } else if (inputs[1] == Value.TRUE) { return Value.FALSE; } } else if (inputs[0] == Value.TRUE) { if (inputs[1] == Value.FALSE) { return Value.TRUE; } else if (inputs[1] == Value.TRUE) { return Value.ERROR; } } return Value.UNKNOWN; } } logisim-2.7.1/src/com/cburch/logisim/std/memory/ShiftRegisterPoker.java0000644000175000017500000000706411446034564026106 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.memory; import java.awt.Color; import java.awt.Graphics; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstancePoker; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.StdAttr; public class ShiftRegisterPoker extends InstancePoker { private int loc; @Override public boolean init(InstanceState state, MouseEvent e) { loc = computeStage(state, e); return loc >= 0; } private int computeStage(InstanceState state, MouseEvent e) { Integer lenObj = state.getAttributeValue(ShiftRegister.ATTR_LENGTH); BitWidth widObj = state.getAttributeValue(StdAttr.WIDTH); Boolean loadObj = state.getAttributeValue(ShiftRegister.ATTR_LOAD); Bounds bds = state.getInstance().getBounds(); int y = bds.getY(); String label = state.getAttributeValue(StdAttr.LABEL); if (label == null || label.equals("")) y += bds.getHeight() / 2; else y += 3 * bds.getHeight() / 4; y = e.getY() - y; if (y <= -6 || y >= 8) return -1; int x = e.getX() - (bds.getX() + 15); if (!loadObj.booleanValue() || widObj.getWidth() > 4) return -1; if (x < 0 || x >= lenObj.intValue() * 10) return -1; return x / 10; } @Override public void paint(InstancePainter painter) { int loc = this.loc; if (loc < 0) return; Bounds bds = painter.getInstance().getBounds(); int x = bds.getX() + 15 + loc * 10; int y = bds.getY(); String label = painter.getAttributeValue(StdAttr.LABEL); if (label == null || label.equals("")) y += bds.getHeight() / 2; else y += 3 * bds.getHeight() / 4; Graphics g = painter.getGraphics(); g.setColor(Color.RED); g.drawRect(x, y - 6, 10, 13); } @Override public void mousePressed(InstanceState state, MouseEvent e) { loc = computeStage(state, e); } @Override public void mouseReleased(InstanceState state, MouseEvent e) { int oldLoc = loc; if (oldLoc < 0) return; BitWidth widObj = state.getAttributeValue(StdAttr.WIDTH); if (widObj.equals(BitWidth.ONE)) { int newLoc = computeStage(state, e); if (oldLoc == newLoc) { ShiftRegisterData data = (ShiftRegisterData) state.getData(); int i = data.getLength() - 1 - loc; Value v = data.get(i); if (v == Value.FALSE) v = Value.TRUE; else v = Value.FALSE; data.set(i, v); state.fireInvalidated(); } } } @Override public void keyTyped(InstanceState state, KeyEvent e) { int loc = this.loc; if (loc < 0) return; char c = e.getKeyChar(); if (c == ' ') { Integer lenObj = state.getAttributeValue(ShiftRegister.ATTR_LENGTH); if (loc < lenObj.intValue() - 1) { this.loc = loc + 1; state.fireInvalidated(); } } else if (c == '\u0008') { if (loc > 0) { this.loc = loc - 1; state.fireInvalidated(); } } else { try { int val = Integer.parseInt("" + e.getKeyChar(), 16); BitWidth widObj = state.getAttributeValue(StdAttr.WIDTH); if ((val & ~widObj.getMask()) != 0) return; Value valObj = Value.createKnown(widObj, val); ShiftRegisterData data = (ShiftRegisterData) state.getData(); int i = data.getLength() - 1 - loc; if (!data.get(i).equals(valObj)) { data.set(i, valObj); state.fireInvalidated(); } } catch (NumberFormatException ex) { return; } } } } logisim-2.7.1/src/com/cburch/logisim/std/memory/ShiftRegisterLogger.java0000644000175000017500000000304611446034564026241 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.memory; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.InstanceLogger; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.StdAttr; public class ShiftRegisterLogger extends InstanceLogger { @Override public Object[] getLogOptions(InstanceState state) { Integer stages = state.getAttributeValue(ShiftRegister.ATTR_LENGTH); Object[] ret = new Object[stages.intValue()]; for (int i = 0; i < ret.length; i++) { ret[i] = Integer.valueOf(i); } return ret; } @Override public String getLogName(InstanceState state, Object option) { String inName = state.getAttributeValue(StdAttr.LABEL); if (inName == null || inName.equals("")) { inName = Strings.get("shiftRegisterComponent") + state.getInstance().getLocation(); } if (option instanceof Integer) { return inName + "[" + option + "]"; } else { return inName; } } @Override public Value getLogValue(InstanceState state, Object option) { BitWidth dataWidth = state.getAttributeValue(StdAttr.WIDTH); if (dataWidth == null) dataWidth = BitWidth.create(0); ShiftRegisterData data = (ShiftRegisterData) state.getData(); if (data == null) { return Value.createKnown(dataWidth, 0); } else { int index = option == null ? 0 : ((Integer) option).intValue(); return data.get(index); } } } logisim-2.7.1/src/com/cburch/logisim/std/memory/ShiftRegisterData.java0000644000175000017500000000402411446034564025670 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.memory; import java.util.Arrays; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.InstanceData; class ShiftRegisterData extends ClockState implements InstanceData { private BitWidth width; private Value[] vs; private int vsPos; public ShiftRegisterData(BitWidth width, int len) { this.width = width; this.vs = new Value[len]; Arrays.fill(this.vs, Value.createKnown(width, 0)); this.vsPos = 0; } @Override public ShiftRegisterData clone() { ShiftRegisterData ret = (ShiftRegisterData) super.clone(); ret.vs = this.vs.clone(); return ret; } public int getLength() { return vs.length; } public void setDimensions(BitWidth newWidth, int newLength) { Value[] v = vs; BitWidth oldWidth = width; int oldW = oldWidth.getWidth(); int newW = newWidth.getWidth(); if (v.length != newLength) { Value[] newV = new Value[newLength]; int j = vsPos; int copy = Math.min(newLength, v.length); for (int i = 0; i < copy; i++) { newV[i] = v[j]; j++; if (j == v.length) j = 0; } Arrays.fill(newV, copy, newLength, Value.createKnown(newWidth, 0)); v = newV; vsPos = 0; vs = newV; } if (oldW != newW) { for (int i = 0; i < v.length; i++) { Value vi = v[i]; if (vi.getWidth() != newW) { v[i] = vi.extendWidth(newW, Value.FALSE); } } width = newWidth; } } public void clear() { Arrays.fill(vs, Value.createKnown(width, 0)); vsPos = 0; } public void push(Value v) { int pos = vsPos; vs[pos] = v; vsPos = pos >= vs.length - 1 ? 0 : pos + 1; } public Value get(int index) { int i = vsPos + index; Value[] v = vs; if (i >= v.length) i -= v.length; return v[i]; } public void set(int index, Value val) { int i = vsPos + index; Value[] v = vs; if (i >= v.length) i -= v.length; v[i] = val; } }logisim-2.7.1/src/com/cburch/logisim/std/memory/ShiftRegister.java0000644000175000017500000001660511446034564025106 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.memory; import java.awt.Graphics; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Attributes; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.tools.key.BitWidthConfigurator; import com.cburch.logisim.tools.key.IntegerConfigurator; import com.cburch.logisim.tools.key.JoinedConfigurator; import com.cburch.logisim.util.GraphicsUtil; public class ShiftRegister extends InstanceFactory { static final Attribute ATTR_LENGTH = Attributes.forIntegerRange("length", Strings.getter("shiftRegLengthAttr"), 1, 32); static final Attribute ATTR_LOAD = Attributes.forBoolean("parallel", Strings.getter("shiftRegParallelAttr")); private static final int IN = 0; private static final int SH = 1; private static final int CK = 2; private static final int CLR = 3; private static final int OUT = 4; private static final int LD = 5; public ShiftRegister() { super("Shift Register", Strings.getter("shiftRegisterComponent")); setAttributes(new Attribute[] { StdAttr.WIDTH, ATTR_LENGTH, ATTR_LOAD, StdAttr.EDGE_TRIGGER, StdAttr.LABEL, StdAttr.LABEL_FONT }, new Object[] { BitWidth.ONE, Integer.valueOf(8), Boolean.TRUE, StdAttr.TRIG_RISING, "", StdAttr.DEFAULT_LABEL_FONT }); setKeyConfigurator(JoinedConfigurator.create( new IntegerConfigurator(ATTR_LENGTH, 1, 32, 0), new BitWidthConfigurator(StdAttr.WIDTH))); setIconName("shiftreg.gif"); setInstanceLogger(ShiftRegisterLogger.class); setInstancePoker(ShiftRegisterPoker.class); } @Override public Bounds getOffsetBounds(AttributeSet attrs) { Object parallel = attrs.getValue(ATTR_LOAD); if (parallel == null || ((Boolean) parallel).booleanValue()) { int len = attrs.getValue(ATTR_LENGTH).intValue(); return Bounds.create(0, -20, 20 + 10 * len, 40); } else { return Bounds.create(0, -20, 30, 40); } } @Override protected void configureNewInstance(Instance instance) { configurePorts(instance); instance.addAttributeListener(); } @Override protected void instanceAttributeChanged(Instance instance, Attribute attr) { if (attr == ATTR_LOAD || attr == ATTR_LENGTH || attr == StdAttr.WIDTH) { instance.recomputeBounds(); configurePorts(instance); } } private void configurePorts(Instance instance) { BitWidth widthObj = instance.getAttributeValue(StdAttr.WIDTH); int width = widthObj.getWidth(); Boolean parallelObj = instance.getAttributeValue(ATTR_LOAD); Bounds bds = instance.getBounds(); Port[] ps; if (parallelObj == null || parallelObj.booleanValue()) { Integer lenObj = instance.getAttributeValue(ATTR_LENGTH); int len = lenObj == null ? 8 : lenObj.intValue(); ps = new Port[6 + 2 * len]; ps[LD] = new Port(10, -20, Port.INPUT, 1); ps[LD].setToolTip(Strings.getter("shiftRegLoadTip")); for (int i = 0; i < len; i++) { ps[6 + 2 * i] = new Port(20 + 10 * i, -20, Port.INPUT, width); ps[6 + 2 * i + 1] = new Port(20 + 10 * i, 20, Port.OUTPUT, width); } } else { ps = new Port[5]; } ps[OUT] = new Port(bds.getWidth(), 0, Port.OUTPUT, width); ps[SH] = new Port( 0, -10, Port.INPUT, 1); ps[IN] = new Port( 0, 0, Port.INPUT, width); ps[CK] = new Port( 0, 10, Port.INPUT, 1); ps[CLR] = new Port(10, 20, Port.INPUT, 1); ps[OUT].setToolTip(Strings.getter("shiftRegOutTip")); ps[SH].setToolTip(Strings.getter("shiftRegShiftTip")); ps[IN].setToolTip(Strings.getter("shiftRegInTip")); ps[CK].setToolTip(Strings.getter("shiftRegClockTip")); ps[CLR].setToolTip(Strings.getter("shiftRegClearTip")); instance.setPorts(ps); instance.setTextField(StdAttr.LABEL, StdAttr.LABEL_FONT, bds.getX() + bds.getWidth() / 2, bds.getY() + bds.getHeight() / 4, GraphicsUtil.H_CENTER, GraphicsUtil.V_CENTER); } private ShiftRegisterData getData(InstanceState state) { BitWidth width = state.getAttributeValue(StdAttr.WIDTH); Integer lenObj = state.getAttributeValue(ATTR_LENGTH); int length = lenObj == null ? 8 : lenObj.intValue(); ShiftRegisterData data = (ShiftRegisterData) state.getData(); if (data == null) { data = new ShiftRegisterData(width, length); state.setData(data); } else { data.setDimensions(width, length); } return data; } @Override public void propagate(InstanceState state) { Object triggerType = state.getAttributeValue(StdAttr.EDGE_TRIGGER); boolean parallel = state.getAttributeValue(ATTR_LOAD).booleanValue(); ShiftRegisterData data = getData(state); int len = data.getLength(); boolean triggered = data.updateClock(state.getPort(CK), triggerType); if (state.getPort(CLR) == Value.TRUE) { data.clear(); } else if (triggered) { if (parallel && state.getPort(LD) == Value.TRUE) { data.clear(); for (int i = len - 1; i >= 0; i--) { data.push(state.getPort(6 + 2 * i)); } } else if (state.getPort(SH) != Value.FALSE) { data.push(state.getPort(IN)); } } state.setPort(OUT, data.get(0), 4); if (parallel) { for (int i = 0; i < len; i++) { state.setPort(6 + 2 * i + 1, data.get(len - 1 - i), 4); } } } @Override public void paintInstance(InstancePainter painter) { // draw boundary, label painter.drawBounds(); painter.drawLabel(); // draw state boolean parallel = painter.getAttributeValue(ATTR_LOAD).booleanValue(); if (parallel) { BitWidth widObj = painter.getAttributeValue(StdAttr.WIDTH); int wid = widObj.getWidth(); Integer lenObj = painter.getAttributeValue(ATTR_LENGTH); int len = lenObj == null ? 8 : lenObj.intValue(); if (painter.getShowState()) { if (wid <= 4) { ShiftRegisterData data = getData(painter); Bounds bds = painter.getBounds(); int x = bds.getX() + 20; int y = bds.getY(); Object label = painter.getAttributeValue(StdAttr.LABEL); if (label == null || label.equals("")) { y += bds.getHeight() / 2; } else { y += 3 * bds.getHeight() / 4; } Graphics g = painter.getGraphics(); for (int i = 0; i < len; i++) { String s = data.get(len - 1 - i).toHexString(); GraphicsUtil.drawCenteredText(g, s, x, y); x += 10; } } } else { Bounds bds = painter.getBounds(); int x = bds.getX() + bds.getWidth() / 2; int y = bds.getY(); int h = bds.getHeight(); Graphics g = painter.getGraphics(); Object label = painter.getAttributeValue(StdAttr.LABEL); if (label == null || label.equals("")) { String a = Strings.get("shiftRegisterLabel1"); GraphicsUtil.drawCenteredText(g, a, x, y + h / 4); } String b = Strings.get("shiftRegisterLabel2", "" + len, "" + wid); GraphicsUtil.drawCenteredText(g, b, x, y + 3 * h / 4); } } // draw input and output ports int ports = painter.getInstance().getPorts().size(); for (int i = 0; i < ports; i++) { if (i != CK) painter.drawPort(i); } painter.drawClock(CK, Direction.EAST); } }logisim-2.7.1/src/com/cburch/logisim/std/memory/RomContentsListener.java0000644000175000017500000000646311446034564026306 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.memory; import com.cburch.hex.HexModel; import com.cburch.hex.HexModelListener; import com.cburch.logisim.proj.Action; import com.cburch.logisim.proj.Project; class RomContentsListener implements HexModelListener { private static class Change extends Action { private RomContentsListener source; private MemContents contents; private long start; private int[] oldValues; private int[] newValues; private boolean completed = true; Change(RomContentsListener source, MemContents contents, long start, int[] oldValues, int[] newValues) { this.source = source; this.contents = contents; this.start = start; this.oldValues = oldValues; this.newValues = newValues; } @Override public String getName() { return Strings.get("romChangeAction"); } @Override public void doIt(Project proj) { if (!completed) { completed = true; try { source.setEnabled(false); contents.set(start, newValues); } finally { source.setEnabled(true); } } } @Override public void undo(Project proj) { if (completed) { completed = false; try { source.setEnabled(false); contents.set(start, oldValues); } finally { source.setEnabled(true); } } } @Override public boolean shouldAppendTo(Action other) { if (other instanceof Change) { Change o = (Change) other; long oEnd = o.start + o.newValues.length; long end = start + newValues.length; if (oEnd >= start && end >= o.start) return true; } return super.shouldAppendTo(other); } @Override public Action append(Action other) { if (other instanceof Change) { Change o = (Change) other; long oEnd = o.start + o.newValues.length; long end = start + newValues.length; if (oEnd >= start && end >= o.start) { long nStart = Math.min(start, o.start); long nEnd = Math.max(end, oEnd); int[] nOld = new int[(int) (nEnd - nStart)]; int[] nNew = new int[(int) (nEnd - nStart)]; System.arraycopy(o.oldValues, 0, nOld, (int) (o.start - nStart), o.oldValues.length); System.arraycopy(oldValues, 0, nOld, (int) (start - nStart), oldValues.length); System.arraycopy(newValues, 0, nNew, (int) (start - nStart), newValues.length); System.arraycopy(o.newValues, 0, nNew, (int) (o.start - nStart), o.newValues.length); return new Change(source, contents, nStart, nOld, nNew); } } return super.append(other); } } Project proj; boolean enabled = true; RomContentsListener(Project proj) { this.proj = proj; } void setEnabled(boolean value) { enabled = value; } public void metainfoChanged(HexModel source) { // ignore - this can only come from an already-registered // action } public void bytesChanged(HexModel source, long start, long numBytes, int[] oldValues) { if (enabled && proj != null && oldValues != null) { // this change needs to be logged in the undo log int[] newValues = new int[oldValues.length]; for (int i = 0; i < newValues.length; i++) { newValues[i] = source.get(start + i); } proj.doAction(new Change(this, (MemContents) source, start, oldValues, newValues)); } } } logisim-2.7.1/src/com/cburch/logisim/std/memory/RomAttributes.java0000644000175000017500000000526711446034564025132 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.memory; import java.util.Arrays; import java.util.List; import java.util.WeakHashMap; import com.cburch.logisim.data.AbstractAttributeSet; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.gui.hex.HexFrame; import com.cburch.logisim.proj.Project; class RomAttributes extends AbstractAttributeSet { private static List> ATTRIBUTES = Arrays.asList(new Attribute[] { Mem.ADDR_ATTR, Mem.DATA_ATTR, Rom.CONTENTS_ATTR }); private static WeakHashMap listenerRegistry = new WeakHashMap(); private static WeakHashMap windowRegistry = new WeakHashMap(); static void register(MemContents value, Project proj) { if (proj == null || listenerRegistry.containsKey(value)) return; RomContentsListener l = new RomContentsListener(proj); value.addHexModelListener(l); listenerRegistry.put(value, l); } static HexFrame getHexFrame(MemContents value, Project proj) { synchronized(windowRegistry) { HexFrame ret = windowRegistry.get(value); if (ret == null) { ret = new HexFrame(proj, value); windowRegistry.put(value, ret); } return ret; } } private BitWidth addrBits = BitWidth.create(8); private BitWidth dataBits = BitWidth.create(8); private MemContents contents; RomAttributes() { contents = MemContents.create(addrBits.getWidth(), dataBits.getWidth()); } void setProject(Project proj) { register(contents, proj); } @Override protected void copyInto(AbstractAttributeSet dest) { RomAttributes d = (RomAttributes) dest; d.addrBits = addrBits; d.dataBits = dataBits; d.contents = contents.clone(); } @Override public List> getAttributes() { return ATTRIBUTES; } @Override @SuppressWarnings("unchecked") public V getValue(Attribute attr) { if (attr == Mem.ADDR_ATTR) return (V) addrBits; if (attr == Mem.DATA_ATTR) return (V) dataBits; if (attr == Rom.CONTENTS_ATTR) return (V) contents; return null; } @Override public void setValue(Attribute attr, V value) { if (attr == Mem.ADDR_ATTR) { addrBits = (BitWidth) value; contents.setDimensions(addrBits.getWidth(), dataBits.getWidth()); } else if (attr == Mem.DATA_ATTR) { dataBits = (BitWidth) value; contents.setDimensions(addrBits.getWidth(), dataBits.getWidth()); } else if (attr == Rom.CONTENTS_ATTR) { contents = (MemContents) value; } fireAttributeValueChanged(attr, value); } } logisim-2.7.1/src/com/cburch/logisim/std/memory/Rom.java0000644000175000017500000001366211527054442023056 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.memory; import java.awt.Window; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.io.IOException; import java.io.StringReader; import java.io.StringWriter; import java.util.NoSuchElementException; import java.util.StringTokenizer; import java.util.WeakHashMap; import javax.swing.JLabel; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Value; import com.cburch.logisim.gui.hex.HexFile; import com.cburch.logisim.gui.hex.HexFrame; import com.cburch.logisim.gui.main.Frame; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.proj.Project; public class Rom extends Mem { public static Attribute CONTENTS_ATTR = new ContentsAttribute(); // The following is so that instance's MemListeners aren't freed by the // garbage collector until the instance itself is ready to be freed. private WeakHashMap memListeners; public Rom() { super("ROM", Strings.getter("romComponent"), 0); setIconName("rom.gif"); memListeners = new WeakHashMap(); } @Override void configurePorts(Instance instance) { Port[] ps = new Port[MEM_INPUTS]; configureStandardPorts(instance, ps); instance.setPorts(ps); } @Override public AttributeSet createAttributeSet() { return new RomAttributes(); } @Override MemState getState(Instance instance, CircuitState state) { MemState ret = (MemState) instance.getData(state); if (ret == null) { MemContents contents = getMemContents(instance); ret = new MemState(contents); instance.setData(state, ret); } return ret; } @Override MemState getState(InstanceState state) { MemState ret = (MemState) state.getData(); if (ret == null) { MemContents contents = getMemContents(state.getInstance()); ret = new MemState(contents); state.setData(ret); } return ret; } @Override HexFrame getHexFrame(Project proj, Instance instance, CircuitState state) { return RomAttributes.getHexFrame(getMemContents(instance), proj); } // TODO - maybe delete this method? MemContents getMemContents(Instance instance) { return instance.getAttributeValue(CONTENTS_ATTR); } @Override public void propagate(InstanceState state) { MemState myState = getState(state); BitWidth dataBits = state.getAttributeValue(DATA_ATTR); Value addrValue = state.getPort(ADDR); boolean chipSelect = state.getPort(CS) != Value.FALSE; if (!chipSelect) { myState.setCurrent(-1); state.setPort(DATA, Value.createUnknown(dataBits), DELAY); return; } int addr = addrValue.toIntValue(); if (!addrValue.isFullyDefined() || addr < 0) return; if (addr != myState.getCurrent()) { myState.setCurrent(addr); myState.scrollToShow(addr); } int val = myState.getContents().get(addr); state.setPort(DATA, Value.createKnown(dataBits, val), DELAY); } @Override protected void configureNewInstance(Instance instance) { super.configureNewInstance(instance); MemContents contents = getMemContents(instance); MemListener listener = new MemListener(instance); memListeners.put(instance, listener); contents.addHexModelListener(listener); } private static class ContentsAttribute extends Attribute { public ContentsAttribute() { super("contents", Strings.getter("romContentsAttr")); } @Override public java.awt.Component getCellEditor(Window source, MemContents value) { if (source instanceof Frame) { Project proj = ((Frame) source).getProject(); RomAttributes.register(value, proj); } ContentsCell ret = new ContentsCell(source, value); ret.mouseClicked(null); return ret; } @Override public String toDisplayString(MemContents value) { return Strings.get("romContentsValue"); } @Override public String toStandardString(MemContents state) { int addr = state.getLogLength(); int data = state.getWidth(); StringWriter ret = new StringWriter(); ret.write("addr/data: " + addr + " " + data + "\n"); try { HexFile.save(ret, state); } catch (IOException e) { } return ret.toString(); } @Override public MemContents parse(String value) { int lineBreak = value.indexOf('\n'); String first = lineBreak < 0 ? value : value.substring(0, lineBreak); String rest = lineBreak < 0 ? "" : value.substring(lineBreak + 1); StringTokenizer toks = new StringTokenizer(first); try { String header = toks.nextToken(); if (!header.equals("addr/data:")) return null; int addr = Integer.parseInt(toks.nextToken()); int data = Integer.parseInt(toks.nextToken()); MemContents ret = MemContents.create(addr, data); HexFile.open(ret, new StringReader(rest)); return ret; } catch (IOException e) { return null; } catch (NumberFormatException e) { return null; } catch (NoSuchElementException e) { return null; } } } private static class ContentsCell extends JLabel implements MouseListener { Window source; MemContents contents; ContentsCell(Window source, MemContents contents) { super(Strings.get("romContentsValue")); this.source = source; this.contents = contents; addMouseListener(this); } public void mouseClicked(MouseEvent e) { if (contents == null) return; Project proj = source instanceof Frame ? ((Frame) source).getProject() : null; HexFrame frame = RomAttributes.getHexFrame(contents, proj); frame.setVisible(true); frame.toFront(); } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } } } logisim-2.7.1/src/com/cburch/logisim/std/memory/RegisterPoker.java0000644000175000017500000000360711446034564025107 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.memory; import java.awt.Color; import java.awt.Graphics; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstancePoker; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.StdAttr; public class RegisterPoker extends InstancePoker { private int initValue; private int curValue; @Override public boolean init(InstanceState state, MouseEvent e) { RegisterData data = (RegisterData) state.getData(); if (data == null) { data = new RegisterData(); state.setData(data); } initValue = data.value; curValue = initValue; return true; } @Override public void paint(InstancePainter painter) { Bounds bds = painter.getBounds(); BitWidth dataWidth = painter.getAttributeValue(StdAttr.WIDTH); int width = dataWidth == null ? 8 : dataWidth.getWidth(); int len = (width + 3) / 4; Graphics g = painter.getGraphics(); g.setColor(Color.RED); if (len > 4) { g.drawRect(bds.getX(), bds.getY() + 3, bds.getWidth(), 25); } else { int wid = 7 * len + 2; g.drawRect(bds.getX() + (bds.getWidth() - wid) / 2, bds.getY() + 4, wid, 15); } g.setColor(Color.BLACK); } @Override public void keyTyped(InstanceState state, KeyEvent e) { int val = Character.digit(e.getKeyChar(), 16); if (val < 0) return; BitWidth dataWidth = state.getAttributeValue(StdAttr.WIDTH); if (dataWidth == null) dataWidth = BitWidth.create(8); curValue = (curValue * 16 + val) & dataWidth.getMask(); RegisterData data = (RegisterData) state.getData(); data.value = curValue; state.fireInvalidated(); } } logisim-2.7.1/src/com/cburch/logisim/std/memory/RegisterLogger.java0000644000175000017500000000177311446034564025250 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.memory; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.InstanceLogger; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.StdAttr; public class RegisterLogger extends InstanceLogger { @Override public String getLogName(InstanceState state, Object option) { String ret = state.getAttributeValue(StdAttr.LABEL); return ret != null && !ret.equals("") ? ret : null; } @Override public Value getLogValue(InstanceState state, Object option) { BitWidth dataWidth = state.getAttributeValue(StdAttr.WIDTH); if (dataWidth == null) dataWidth = BitWidth.create(0); RegisterData data = (RegisterData) state.getData(); if (data == null) return Value.createKnown(dataWidth, 0); return Value.createKnown(dataWidth, data.value); } } logisim-2.7.1/src/com/cburch/logisim/std/memory/RegisterData.java0000644000175000017500000000072111446034564024672 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.memory; import com.cburch.logisim.instance.InstanceData; class RegisterData extends ClockState implements InstanceData { int value; public RegisterData() { value = 0; } public void setValue(int value) { this.value = value; } public int getValue() { return value; } }logisim-2.7.1/src/com/cburch/logisim/std/memory/Register.java0000644000175000017500000001143411446034564024103 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.memory; import java.awt.Color; import java.awt.Graphics; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.tools.key.BitWidthConfigurator; import com.cburch.logisim.util.GraphicsUtil; import com.cburch.logisim.util.StringUtil; public class Register extends InstanceFactory { private static final int DELAY = 8; private static final int OUT = 0; private static final int IN = 1; private static final int CK = 2; private static final int CLR = 3; private static final int EN = 4; public Register() { super("Register", Strings.getter("registerComponent")); setAttributes(new Attribute[] { StdAttr.WIDTH, StdAttr.TRIGGER, StdAttr.LABEL, StdAttr.LABEL_FONT }, new Object[] { BitWidth.create(8), StdAttr.TRIG_RISING, "", StdAttr.DEFAULT_LABEL_FONT }); setKeyConfigurator(new BitWidthConfigurator(StdAttr.WIDTH)); setOffsetBounds(Bounds.create(-30, -20, 30, 40)); setIconName("register.gif"); setInstancePoker(RegisterPoker.class); setInstanceLogger(RegisterLogger.class); Port[] ps = new Port[5]; ps[OUT] = new Port( 0, 0, Port.OUTPUT, StdAttr.WIDTH); ps[IN] = new Port(-30, 0, Port.INPUT, StdAttr.WIDTH); ps[CK] = new Port(-20, 20, Port.INPUT, 1); ps[CLR] = new Port(-10, 20, Port.INPUT, 1); ps[EN] = new Port(-30, 10, Port.INPUT, 1); ps[OUT].setToolTip(Strings.getter("registerQTip")); ps[IN].setToolTip(Strings.getter("registerDTip")); ps[CK].setToolTip(Strings.getter("registerClkTip")); ps[CLR].setToolTip(Strings.getter("registerClrTip")); ps[EN].setToolTip(Strings.getter("registerEnableTip")); setPorts(ps); } @Override protected void configureNewInstance(Instance instance) { Bounds bds = instance.getBounds(); instance.setTextField(StdAttr.LABEL, StdAttr.LABEL_FONT, bds.getX() + bds.getWidth() / 2, bds.getY() - 3, GraphicsUtil.H_CENTER, GraphicsUtil.V_BASELINE); } @Override public void propagate(InstanceState state) { RegisterData data = (RegisterData) state.getData(); if (data == null) { data = new RegisterData(); state.setData(data); } BitWidth dataWidth = state.getAttributeValue(StdAttr.WIDTH); Object triggerType = state.getAttributeValue(StdAttr.TRIGGER); boolean triggered = data.updateClock(state.getPort(CK), triggerType); if (state.getPort(CLR) == Value.TRUE) { data.value = 0; } else if (triggered && state.getPort(EN) != Value.FALSE) { Value in = state.getPort(IN); if (in.isFullyDefined()) data.value = in.toIntValue(); } state.setPort(OUT, Value.createKnown(dataWidth, data.value), DELAY); } @Override public void paintInstance(InstancePainter painter) { Graphics g = painter.getGraphics(); Bounds bds = painter.getBounds(); RegisterData state = (RegisterData) painter.getData(); BitWidth widthVal = painter.getAttributeValue(StdAttr.WIDTH); int width = widthVal == null ? 8 : widthVal.getWidth(); // determine text to draw in label String a; String b = null; if (painter.getShowState()) { int val = state == null ? 0 : state.value; String str = StringUtil.toHexString(width, val); if (str.length() <= 4) { a = str; } else { int split = str.length() - 4; a = str.substring(0, split); b = str.substring(split); } } else { a = Strings.get("registerLabel"); b = Strings.get("registerWidthLabel", "" + widthVal.getWidth()); } // draw boundary, label painter.drawBounds(); painter.drawLabel(); // draw input and output ports if (b == null) { painter.drawPort(IN, "D", Direction.EAST); painter.drawPort(OUT, "Q", Direction.WEST); } else { painter.drawPort(IN); painter.drawPort(OUT); } g.setColor(Color.GRAY); painter.drawPort(CLR, "0", Direction.SOUTH); painter.drawPort(EN, Strings.get("memEnableLabel"), Direction.EAST); g.setColor(Color.BLACK); painter.drawClock(CK, Direction.NORTH); // draw contents if (b == null) { GraphicsUtil.drawText(g, a, bds.getX() + 15, bds.getY() + 4, GraphicsUtil.H_CENTER, GraphicsUtil.V_TOP); } else { GraphicsUtil.drawText(g, a, bds.getX() + 15, bds.getY() + 3, GraphicsUtil.H_CENTER, GraphicsUtil.V_TOP); GraphicsUtil.drawText(g, b, bds.getX() + 15, bds.getY() + 15, GraphicsUtil.H_CENTER, GraphicsUtil.V_TOP); } } }logisim-2.7.1/src/com/cburch/logisim/std/memory/Random.java0000644000175000017500000001367611524651340023543 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.memory; import java.awt.Graphics; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.Attributes; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceData; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstanceLogger; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.tools.key.BitWidthConfigurator; import com.cburch.logisim.util.GraphicsUtil; import com.cburch.logisim.util.StringUtil; public class Random extends InstanceFactory { private static final Attribute ATTR_SEED = Attributes.forInteger("seed", Strings.getter("randomSeedAttr")); private static final int OUT = 0; private static final int CK = 1; private static final int NXT = 2; private static final int RST = 3; public Random() { super("Random", Strings.getter("randomComponent")); setAttributes(new Attribute[] { StdAttr.WIDTH, ATTR_SEED, StdAttr.EDGE_TRIGGER, StdAttr.LABEL, StdAttr.LABEL_FONT }, new Object[] { BitWidth.create(8), Integer.valueOf(0), StdAttr.TRIG_RISING, "", StdAttr.DEFAULT_LABEL_FONT }); setKeyConfigurator(new BitWidthConfigurator(StdAttr.WIDTH)); setOffsetBounds(Bounds.create(-30, -20, 30, 40)); setIconName("random.gif"); setInstanceLogger(Logger.class); Port[] ps = new Port[4]; ps[OUT] = new Port( 0, 0, Port.OUTPUT, StdAttr.WIDTH); ps[CK] = new Port(-30, -10, Port.INPUT, 1); ps[NXT] = new Port(-30, 10, Port.INPUT, 1); ps[RST] = new Port(-20, 20, Port.INPUT, 1); ps[OUT].setToolTip(Strings.getter("randomQTip")); ps[CK].setToolTip(Strings.getter("randomClockTip")); ps[NXT].setToolTip(Strings.getter("randomNextTip")); ps[RST].setToolTip(Strings.getter("randomResetTip")); setPorts(ps); } @Override protected void configureNewInstance(Instance instance) { Bounds bds = instance.getBounds(); instance.setTextField(StdAttr.LABEL, StdAttr.LABEL_FONT, bds.getX() + bds.getWidth() / 2, bds.getY() - 3, GraphicsUtil.H_CENTER, GraphicsUtil.V_BASELINE); } @Override public void propagate(InstanceState state) { StateData data = (StateData) state.getData(); if (data == null) { data = new StateData(state.getAttributeValue(ATTR_SEED)); state.setData(data); } BitWidth dataWidth = state.getAttributeValue(StdAttr.WIDTH); Object triggerType = state.getAttributeValue(StdAttr.EDGE_TRIGGER); boolean triggered = data.updateClock(state.getPort(CK), triggerType); if (state.getPort(RST) == Value.TRUE) { data.reset(state.getAttributeValue(ATTR_SEED)); } else if (triggered && state.getPort(NXT) != Value.FALSE) { data.step(); } state.setPort(OUT, Value.createKnown(dataWidth, data.value), 4); } @Override public void paintInstance(InstancePainter painter) { Graphics g = painter.getGraphics(); Bounds bds = painter.getBounds(); StateData state = (StateData) painter.getData(); BitWidth widthVal = painter.getAttributeValue(StdAttr.WIDTH); int width = widthVal == null ? 8 : widthVal.getWidth(); // draw boundary, label painter.drawBounds(); painter.drawLabel(); // draw input and output ports painter.drawPort(OUT, "Q", Direction.WEST); painter.drawPort(RST); painter.drawPort(NXT); painter.drawClock(CK, Direction.EAST); // draw contents if (painter.getShowState()) { int val = state == null ? 0 : state.value; String str = StringUtil.toHexString(width, val); if (str.length() <= 4) { GraphicsUtil.drawText(g, str, bds.getX() + 15, bds.getY() + 4, GraphicsUtil.H_CENTER, GraphicsUtil.V_TOP); } else { int split = str.length() - 4; GraphicsUtil.drawText(g, str.substring(0, split), bds.getX() + 15, bds.getY() + 3, GraphicsUtil.H_CENTER, GraphicsUtil.V_TOP); GraphicsUtil.drawText(g, str.substring(split), bds.getX() + 15, bds.getY() + 15, GraphicsUtil.H_CENTER, GraphicsUtil.V_TOP); } } } private static class StateData extends ClockState implements InstanceData { private final static long multiplier = 0x5DEECE66DL; private final static long addend = 0xBL; private final static long mask = (1L << 48) - 1; private long initSeed; private long curSeed; private int value; public StateData(Object seed) { reset(seed); } void reset(Object seed) { long start = seed instanceof Integer ? ((Integer) seed).intValue() : 0; if (start == 0) { // Prior to 2.7.0, this would reset to the seed at the time of // the StateData's creation. It seems more likely that what // would be intended was starting a new sequence entirely... start = (System.currentTimeMillis() ^ multiplier) & mask; if (start == initSeed) { start = (start + multiplier) & mask; } } this.initSeed = start; this.curSeed = start; this.value = (int) start; } void step() { long v = curSeed; v = (v * multiplier + addend) & mask; curSeed = v; value = (int) (v >> 12); } } public static class Logger extends InstanceLogger { @Override public String getLogName(InstanceState state, Object option) { String ret = state.getAttributeValue(StdAttr.LABEL); return ret != null && !ret.equals("") ? ret : null; } @Override public Value getLogValue(InstanceState state, Object option) { BitWidth dataWidth = state.getAttributeValue(StdAttr.WIDTH); if (dataWidth == null) dataWidth = BitWidth.create(0); StateData data = (StateData) state.getData(); if (data == null) return Value.createKnown(dataWidth, 0); return Value.createKnown(dataWidth, data.value); } } }logisim-2.7.1/src/com/cburch/logisim/std/memory/Ram.java0000644000175000017500000002463511527054336023044 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.memory; import java.awt.Color; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeEvent; import com.cburch.logisim.data.AttributeListener; import com.cburch.logisim.data.AttributeOption; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.AttributeSets; import com.cburch.logisim.data.Attributes; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.gui.hex.HexFrame; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceData; import com.cburch.logisim.instance.InstanceLogger; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.proj.Project; public class Ram extends Mem { static final AttributeOption BUS_COMBINED = new AttributeOption("combined", Strings.getter("ramBusSynchCombined")); static final AttributeOption BUS_ASYNCH = new AttributeOption("asynch", Strings.getter("ramBusAsynchCombined")); static final AttributeOption BUS_SEPARATE = new AttributeOption("separate", Strings.getter("ramBusSeparate")); static final Attribute ATTR_BUS = Attributes.forOption("bus", Strings.getter("ramBusAttr"), new AttributeOption[] { BUS_COMBINED, BUS_ASYNCH, BUS_SEPARATE }); private static Attribute[] ATTRIBUTES = { Mem.ADDR_ATTR, Mem.DATA_ATTR, ATTR_BUS }; private static Object[] DEFAULTS = { BitWidth.create(8), BitWidth.create(8), BUS_COMBINED }; private static final int OE = MEM_INPUTS + 0; private static final int CLR = MEM_INPUTS + 1; private static final int CLK = MEM_INPUTS + 2; private static final int WE = MEM_INPUTS + 3; private static final int DIN = MEM_INPUTS + 4; private static Object[][] logOptions = new Object[9][]; public Ram() { super("RAM", Strings.getter("ramComponent"), 3); setIconName("ram.gif"); setInstanceLogger(Logger.class); } @Override protected void configureNewInstance(Instance instance) { super.configureNewInstance(instance); instance.addAttributeListener(); } @Override protected void instanceAttributeChanged(Instance instance, Attribute attr) { super.instanceAttributeChanged(instance, attr); configurePorts(instance); } @Override void configurePorts(Instance instance) { Object bus = instance.getAttributeValue(ATTR_BUS); if (bus == null) bus = BUS_COMBINED; boolean asynch = bus == null ? false : bus.equals(BUS_ASYNCH); boolean separate = bus == null ? false : bus.equals(BUS_SEPARATE); int portCount = MEM_INPUTS; if (asynch) portCount += 2; else if (separate) portCount += 5; else portCount += 3; Port[] ps = new Port[portCount]; configureStandardPorts(instance, ps); ps[OE] = new Port(-50, 40, Port.INPUT, 1); ps[OE].setToolTip(Strings.getter("ramOETip")); ps[CLR] = new Port(-30, 40, Port.INPUT, 1); ps[CLR].setToolTip(Strings.getter("ramClrTip")); if (!asynch) { ps[CLK] = new Port(-70, 40, Port.INPUT, 1); ps[CLK].setToolTip(Strings.getter("ramClkTip")); } if (separate) { ps[WE] = new Port(-110, 40, Port.INPUT, 1); ps[WE].setToolTip(Strings.getter("ramWETip")); ps[DIN] = new Port(-140, 20, Port.INPUT, DATA_ATTR); ps[DIN].setToolTip(Strings.getter("ramInTip")); } else { ps[DATA].setToolTip(Strings.getter("ramBusTip")); } instance.setPorts(ps); } @Override public AttributeSet createAttributeSet() { return AttributeSets.fixedSet(ATTRIBUTES, DEFAULTS); } @Override MemState getState(InstanceState state) { BitWidth addrBits = state.getAttributeValue(ADDR_ATTR); BitWidth dataBits = state.getAttributeValue(DATA_ATTR); RamState myState = (RamState) state.getData(); if (myState == null) { MemContents contents = MemContents.create(addrBits.getWidth(), dataBits.getWidth()); Instance instance = state.getInstance(); myState = new RamState(instance, contents, new MemListener(instance)); state.setData(myState); } else { myState.setRam(state.getInstance()); } return myState; } @Override MemState getState(Instance instance, CircuitState state) { BitWidth addrBits = instance.getAttributeValue(ADDR_ATTR); BitWidth dataBits = instance.getAttributeValue(DATA_ATTR); RamState myState = (RamState) instance.getData(state); if (myState == null) { MemContents contents = MemContents.create(addrBits.getWidth(), dataBits.getWidth()); myState = new RamState(instance, contents, new MemListener(instance)); instance.setData(state, myState); } else { myState.setRam(instance); } return myState; } @Override HexFrame getHexFrame(Project proj, Instance instance, CircuitState circState) { RamState state = (RamState) getState(instance, circState); return state.getHexFrame(proj); } @Override public void propagate(InstanceState state) { RamState myState = (RamState) getState(state); BitWidth dataBits = state.getAttributeValue(DATA_ATTR); Object busVal = state.getAttributeValue(ATTR_BUS); boolean asynch = busVal == null ? false : busVal.equals(BUS_ASYNCH); boolean separate = busVal == null ? false : busVal.equals(BUS_SEPARATE); Value addrValue = state.getPort(ADDR); boolean chipSelect = state.getPort(CS) != Value.FALSE; boolean triggered = asynch || myState.setClock(state.getPort(CLK), StdAttr.TRIG_RISING); boolean outputEnabled = state.getPort(OE) != Value.FALSE; boolean shouldClear = state.getPort(CLR) == Value.TRUE; if (shouldClear) { myState.getContents().clear(); } if (!chipSelect) { myState.setCurrent(-1); state.setPort(DATA, Value.createUnknown(dataBits), DELAY); return; } int addr = addrValue.toIntValue(); if (!addrValue.isFullyDefined() || addr < 0) return; if (addr != myState.getCurrent()) { myState.setCurrent(addr); myState.scrollToShow(addr); } if (!shouldClear && triggered) { boolean shouldStore; if (separate) { shouldStore = state.getPort(WE) != Value.FALSE; } else { shouldStore = !outputEnabled; } if (shouldStore) { Value dataValue = state.getPort(separate ? DIN : DATA); myState.getContents().set(addr, dataValue.toIntValue()); } } if (outputEnabled) { int val = myState.getContents().get(addr); state.setPort(DATA, Value.createKnown(dataBits, val), DELAY); } else { state.setPort(DATA, Value.createUnknown(dataBits), DELAY); } } @Override public void paintInstance(InstancePainter painter) { super.paintInstance(painter); Object busVal = painter.getAttributeValue(ATTR_BUS); boolean asynch = busVal == null ? false : busVal.equals(BUS_ASYNCH); boolean separate = busVal == null ? false : busVal.equals(BUS_SEPARATE); if (!asynch) painter.drawClock(CLK, Direction.NORTH); painter.drawPort(OE, Strings.get("ramOELabel"), Direction.SOUTH); painter.drawPort(CLR, Strings.get("ramClrLabel"), Direction.SOUTH); if (separate) { painter.drawPort(WE, Strings.get("ramWELabel"), Direction.SOUTH); painter.getGraphics().setColor(Color.BLACK); painter.drawPort(DIN, Strings.get("ramDataLabel"), Direction.EAST); } } private static class RamState extends MemState implements InstanceData, AttributeListener { private Instance parent; private MemListener listener; private HexFrame hexFrame = null; private ClockState clockState; RamState(Instance parent, MemContents contents, MemListener listener) { super(contents); this.parent = parent; this.listener = listener; this.clockState = new ClockState(); if (parent != null) parent.getAttributeSet().addAttributeListener(this); contents.addHexModelListener(listener); } void setRam(Instance value) { if (parent == value) return; if (parent != null) parent.getAttributeSet().removeAttributeListener(this); parent = value; if (value != null) value.getAttributeSet().addAttributeListener(this); } @Override public RamState clone() { RamState ret = (RamState) super.clone(); ret.parent = null; ret.clockState = this.clockState.clone(); ret.getContents().addHexModelListener(listener); return ret; } // Retrieves a HexFrame for editing within a separate window public HexFrame getHexFrame(Project proj) { if (hexFrame == null) { hexFrame = new HexFrame(proj, getContents()); hexFrame.addWindowListener(new WindowAdapter() { @Override public void windowClosed(WindowEvent e) { hexFrame = null; } }); } return hexFrame; } // // methods for accessing the write-enable data // public boolean setClock(Value newClock, Object trigger) { return clockState.updateClock(newClock, trigger); } public void attributeListChanged(AttributeEvent e) { } public void attributeValueChanged(AttributeEvent e) { AttributeSet attrs = e.getSource(); BitWidth addrBits = attrs.getValue(Mem.ADDR_ATTR); BitWidth dataBits = attrs.getValue(Mem.DATA_ATTR); getContents().setDimensions(addrBits.getWidth(), dataBits.getWidth()); } } public static class Logger extends InstanceLogger { @Override public Object[] getLogOptions(InstanceState state) { int addrBits = state.getAttributeValue(ADDR_ATTR).getWidth(); if (addrBits >= logOptions.length) addrBits = logOptions.length - 1; synchronized(logOptions) { Object[] ret = logOptions[addrBits]; if (ret == null) { ret = new Object[1 << addrBits]; logOptions[addrBits] = ret; for (int i = 0; i < ret.length; i++) { ret[i] = Integer.valueOf(i); } } return ret; } } @Override public String getLogName(InstanceState state, Object option) { if (option instanceof Integer) { String disp = Strings.get("ramComponent"); Location loc = state.getInstance().getLocation(); return disp + loc + "[" + option + "]"; } else { return null; } } @Override public Value getLogValue(InstanceState state, Object option) { if (option instanceof Integer) { MemState s = (MemState) state.getData(); int addr = ((Integer) option).intValue(); return Value.createKnown(BitWidth.create(s.getDataBits()), s.getContents().get(addr)); } else { return Value.NIL; } } } } logisim-2.7.1/src/com/cburch/logisim/std/memory/MemState.java0000644000175000017500000001652611447117150024037 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.memory; import java.awt.Color; import java.awt.Graphics; import com.cburch.hex.HexModel; import com.cburch.hex.HexModelListener; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.instance.InstanceData; import com.cburch.logisim.util.GraphicsUtil; import com.cburch.logisim.util.StringUtil; class MemState implements InstanceData, Cloneable, HexModelListener { private static final int ROWS = 4; // rows in memory display private static final int TABLE_WIDTH12 = 80; // width of table for addr bits <= 12 private static final int TABLE_WIDTH32 = 65; // width of table for addr bits > 12 private static final int ENTRY_HEIGHT = 15; // pixels high per entry private static final int ENTRY_XOFFS12 = 40; // x offset for entries for addr bits <= 12 private static final int ENTRY_XOFFS32 = 60; // x offset for entries for addr bits > 12 private static final int ENTRY_YOFFS = 5; // y offset for entries private static final int ADDR_WIDTH_PER_CHAR = 10; // pixels wide per address character private MemContents contents; private int columns; private long curScroll = 0; private long cursorLoc = -1; private long curAddr = -1; MemState(MemContents contents) { this.contents = contents; setBits(contents.getLogLength(), contents.getWidth()); contents.addHexModelListener(this); } @Override public MemState clone() { try { MemState ret = (MemState) super.clone(); ret.contents = contents.clone(); ret.contents.addHexModelListener(ret); return ret; } catch (CloneNotSupportedException e) { return null; } } // // methods for accessing the address bits // private void setBits(int addrBits, int dataBits) { if (contents == null) { contents = MemContents.create(addrBits, dataBits); } else { contents.setDimensions(addrBits, dataBits); } if (addrBits <= 12) { if (dataBits <= 8) { columns = dataBits <= 4 ? 8 : 4; } else { columns = dataBits <= 16 ? 2 : 1; } } else { columns = dataBits <= 8 ? 2 : 1; } long newLast = contents.getLastOffset(); // I do subtraction in the next two conditions to account for possibility of overflow if (cursorLoc > newLast) cursorLoc = newLast; if (curAddr - newLast > 0) curAddr = -1; long maxScroll = Math.max(0, newLast + 1 - (ROWS - 1) * columns); if (curScroll > maxScroll) curScroll = maxScroll; } public MemContents getContents() { return contents; } // // methods for accessing data within memory // int getAddrBits() { return contents.getLogLength(); } int getDataBits() { return contents.getWidth(); } long getLastAddress() { return (1L << contents.getLogLength()) - 1; } boolean isValidAddr(long addr) { int addrBits = contents.getLogLength(); return addr >>> addrBits == 0; } int getRows() { return ROWS; } int getColumns() { return columns; } // // methods for manipulating cursor and scroll location // long getCursor() { return cursorLoc; } long getCurrent() { return curAddr; } long getScroll() { return curScroll; } void setCursor(long value) { cursorLoc = isValidAddr(value) ? value : -1L; } void setCurrent(long value) { curAddr = isValidAddr(value) ? value : -1L; } void scrollToShow(long addr) { if (isValidAddr(addr)) { addr = addr / columns * columns; long curTop = curScroll / columns * columns; if (addr < curTop) { curScroll = addr; } else if (addr >= curTop + ROWS * columns) { curScroll = addr - (ROWS - 1) * columns; if (curScroll < 0) curScroll = 0; } } } void setScroll(long addr) { long maxAddr = getLastAddress() - ROWS * columns; if (addr > maxAddr) addr = maxAddr; // note: maxAddr could be negative if (addr < 0) addr = 0; curScroll = addr; } // // graphical methods // public long getAddressAt(int x, int y) { int addrBits = getAddrBits(); int boxX = addrBits <= 12 ? ENTRY_XOFFS12 : ENTRY_XOFFS32; int boxW = addrBits <= 12 ? TABLE_WIDTH12 : TABLE_WIDTH32; // See if outside box if (x < boxX || x >= boxX + boxW || y <= ENTRY_YOFFS || y >= ENTRY_YOFFS + ROWS * ENTRY_HEIGHT) { return -1; } int col = (x - boxX) / (boxW / columns); int row = (y - ENTRY_YOFFS) / ENTRY_HEIGHT; long ret = (curScroll / columns * columns) + columns * row + col; return isValidAddr(ret) ? ret : getLastAddress(); } public Bounds getBounds(long addr, Bounds bds) { int addrBits = getAddrBits(); int boxX = bds.getX() + (addrBits <= 12 ? ENTRY_XOFFS12 : ENTRY_XOFFS32); int boxW = addrBits <= 12 ? TABLE_WIDTH12 : TABLE_WIDTH32; if (addr < 0) { int addrLen = (contents.getWidth() + 3) / 4; int width = ADDR_WIDTH_PER_CHAR * addrLen; return Bounds.create(boxX - width, bds.getY() + ENTRY_YOFFS, width, ENTRY_HEIGHT); } else { int bdsX = addrToX(bds, addr); int bdsY = addrToY(bds, addr); return Bounds.create(bdsX, bdsY, boxW / columns, ENTRY_HEIGHT); } } public void paint(Graphics g, int leftX, int topY) { int addrBits = getAddrBits(); int dataBits = contents.getWidth(); int boxX = leftX + (addrBits <= 12 ? ENTRY_XOFFS12 : ENTRY_XOFFS32); int boxY = topY + ENTRY_YOFFS; int boxW = addrBits <= 12 ? TABLE_WIDTH12 : TABLE_WIDTH32; int boxH = ROWS * ENTRY_HEIGHT; GraphicsUtil.switchToWidth(g, 1); g.drawRect(boxX, boxY, boxW, boxH); int entryWidth = boxW / columns; for (int row = 0; row < ROWS; row++) { long addr = (curScroll / columns * columns) + columns * row; int x = boxX; int y = boxY + ENTRY_HEIGHT * row; int yoffs = ENTRY_HEIGHT - 3; if (isValidAddr(addr)) { g.setColor(Color.GRAY); GraphicsUtil.drawText(g, StringUtil.toHexString(getAddrBits(), (int) addr), x - 2, y + yoffs, GraphicsUtil.H_RIGHT, GraphicsUtil.V_BASELINE); } g.setColor(Color.BLACK); for (int col = 0; col < columns && isValidAddr(addr); col++) { int val = contents.get(addr); if (addr == curAddr) { g.fillRect(x, y, entryWidth, ENTRY_HEIGHT); g.setColor(Color.WHITE); GraphicsUtil.drawText(g, StringUtil.toHexString(dataBits, val), x + entryWidth / 2, y + yoffs, GraphicsUtil.H_CENTER, GraphicsUtil.V_BASELINE); g.setColor(Color.BLACK); } else { GraphicsUtil.drawText(g, StringUtil.toHexString(dataBits, val), x + entryWidth / 2, y + yoffs, GraphicsUtil.H_CENTER, GraphicsUtil.V_BASELINE); } addr++; x += entryWidth; } } } private int addrToX(Bounds bds, long addr) { int addrBits = getAddrBits(); int boxX = bds.getX() + (addrBits <= 12 ? ENTRY_XOFFS12 : ENTRY_XOFFS32); int boxW = addrBits <= 12 ? TABLE_WIDTH12 : TABLE_WIDTH32; long topRow = curScroll / columns; long row = addr / columns; if (row < topRow || row >= topRow + ROWS) return -1; int col = (int) (addr - row * columns); if (col < 0 || col >= columns) return -1; return boxX + boxW * col / columns; } private int addrToY(Bounds bds, long addr) { long topRow = curScroll / columns; long row = addr / columns; if (row < topRow || row >= topRow + ROWS) return -1; return (int) (bds.getY() + ENTRY_YOFFS + ENTRY_HEIGHT * (row - topRow)); } public void metainfoChanged(HexModel source) { setBits(contents.getLogLength(), contents.getWidth()); } public void bytesChanged(HexModel source, long start, long numBytes, int[] oldValues) { } } logisim-2.7.1/src/com/cburch/logisim/std/memory/MemPoker.java0000644000175000017500000001043111446034564024032 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.memory; import java.awt.Color; import java.awt.Graphics; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstancePoker; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.proj.Project; public class MemPoker extends InstancePoker { private MemPoker sub; @Override public boolean init(InstanceState state, MouseEvent event) { Bounds bds = state.getInstance().getBounds(); MemState data = (MemState) state.getData(); long addr = data.getAddressAt(event.getX() - bds.getX(), event.getY() - bds.getY()); // See if outside box if (addr < 0) { sub = new AddrPoker(); } else { sub = new DataPoker(state, data, addr); } return true; } @Override public Bounds getBounds(InstancePainter state) { return sub.getBounds(state); } @Override public void paint(InstancePainter painter) { sub.paint(painter); } @Override public void keyTyped(InstanceState state, KeyEvent e) { sub.keyTyped(state, e); } private static class DataPoker extends MemPoker { int initValue; int curValue; private DataPoker(InstanceState state, MemState data, long addr) { data.setCursor(addr); initValue = data.getContents().get(data.getCursor()); curValue = initValue; Object attrs = state.getInstance().getAttributeSet(); if (attrs instanceof RomAttributes) { Project proj = state.getProject(); if (proj != null) { ((RomAttributes) attrs).setProject(proj); } } } @Override public Bounds getBounds(InstancePainter painter) { MemState data = (MemState) painter.getData(); Bounds inBounds = painter.getInstance().getBounds(); return data.getBounds(data.getCursor(), inBounds); } @Override public void paint(InstancePainter painter) { Bounds bds = getBounds(painter); Graphics g = painter.getGraphics(); g.setColor(Color.RED); g.drawRect(bds.getX(), bds.getY(), bds.getWidth(), bds.getHeight()); g.setColor(Color.BLACK); } @Override public void stopEditing(InstanceState state) { MemState data = (MemState) state.getData(); data.setCursor(-1); } @Override public void keyTyped(InstanceState state, KeyEvent e) { char c = e.getKeyChar(); int val = Character.digit(e.getKeyChar(), 16); MemState data = (MemState) state.getData(); if (val >= 0) { curValue = curValue * 16 + val; data.getContents().set(data.getCursor(), curValue); state.fireInvalidated(); } else if (c == ' ' || c == '\t') { moveTo(data, data.getCursor() + 1); } else if (c == '\r' || c == '\n') { moveTo(data, data.getCursor() + data.getColumns()); } else if (c == '\u0008' || c == '\u007f') { moveTo(data, data.getCursor() - 1); } } private void moveTo(MemState data, long addr) { if (data.isValidAddr(addr)) { data.setCursor(addr); data.scrollToShow(addr); initValue = data.getContents().get(addr); curValue = initValue; } } } private static class AddrPoker extends MemPoker { @Override public Bounds getBounds(InstancePainter painter) { MemState data = (MemState) painter.getData(); return data.getBounds(-1, painter.getBounds()); } @Override public void paint(InstancePainter painter) { Bounds bds = getBounds(painter); Graphics g = painter.getGraphics(); g.setColor(Color.RED); g.drawRect(bds.getX(), bds.getY(), bds.getWidth(), bds.getHeight()); g.setColor(Color.BLACK); } @Override public void keyTyped(InstanceState state, KeyEvent e) { char c = e.getKeyChar(); int val = Character.digit(e.getKeyChar(), 16); MemState data = (MemState) state.getData(); if (val >= 0) { long newScroll = (data.getScroll() * 16 + val) & (data.getLastAddress()); data.setScroll(newScroll); } else if (c == ' ') { data.setScroll(data.getScroll() + (data.getRows() - 1) * data.getColumns()); } else if (c == '\r' || c == '\n') { data.setScroll(data.getScroll() + data.getColumns()); } else if (c == '\u0008' || c == '\u007f') { data.setScroll(data.getScroll() - data.getColumns()); } } } }logisim-2.7.1/src/com/cburch/logisim/std/memory/Memory.java0000644000175000017500000000356611446034564023576 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.memory; import java.util.List; import com.cburch.logisim.tools.FactoryDescription; import com.cburch.logisim.tools.Library; import com.cburch.logisim.tools.Tool; public class Memory extends Library { protected static final int DELAY = 5; private static FactoryDescription[] DESCRIPTIONS = { new FactoryDescription("D Flip-Flop", Strings.getter("dFlipFlopComponent"), "dFlipFlop.gif", "DFlipFlop"), new FactoryDescription("T Flip-Flop", Strings.getter("tFlipFlopComponent"), "tFlipFlop.gif", "TFlipFlop"), new FactoryDescription("J-K Flip-Flop", Strings.getter("jkFlipFlopComponent"), "jkFlipFlop.gif", "JKFlipFlop"), new FactoryDescription("S-R Flip-Flop", Strings.getter("srFlipFlopComponent"), "srFlipFlop.gif", "SRFlipFlop"), new FactoryDescription("Register", Strings.getter("registerComponent"), "register.gif", "Register"), new FactoryDescription("Counter", Strings.getter("counterComponent"), "counter.gif", "Counter"), new FactoryDescription("Shift Register", Strings.getter("shiftRegisterComponent"), "shiftreg.gif", "ShiftRegister"), new FactoryDescription("Random", Strings.getter("randomComponent"), "random.gif", "Random"), new FactoryDescription("RAM", Strings.getter("ramComponent"), "ram.gif", "Ram"), new FactoryDescription("ROM", Strings.getter("romComponent"), "rom.gif", "Rom"), }; private List tools = null; public Memory() { } @Override public String getName() { return "Memory"; } @Override public String getDisplayName() { return Strings.get("memoryLibrary"); } @Override public List getTools() { if (tools == null) { tools = FactoryDescription.getTools(Memory.class, DESCRIPTIONS); } return tools; } } logisim-2.7.1/src/com/cburch/logisim/std/memory/MemMenu.java0000644000175000017500000001005411446034564023657 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.memory; import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.IOException; import javax.swing.JFileChooser; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPopupMenu; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.gui.hex.HexFile; import com.cburch.logisim.gui.hex.HexFrame; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.proj.Project; import com.cburch.logisim.tools.MenuExtender; class MemMenu implements ActionListener, MenuExtender { private Mem factory; private Instance instance; private Project proj; private Frame frame; private CircuitState circState; private JMenuItem edit; private JMenuItem clear; private JMenuItem load; private JMenuItem save; MemMenu(Mem factory, Instance instance) { this.factory = factory; this.instance = instance; } public void configureMenu(JPopupMenu menu, Project proj) { this.proj = proj; this.frame = proj.getFrame(); this.circState = proj.getCircuitState(); Object attrs = instance.getAttributeSet(); if (attrs instanceof RomAttributes) { ((RomAttributes) attrs).setProject(proj); } boolean enabled = circState != null; edit = createItem(enabled, Strings.get("ramEditMenuItem")); clear = createItem(enabled, Strings.get("ramClearMenuItem")); load = createItem(enabled, Strings.get("ramLoadMenuItem")); save = createItem(enabled, Strings.get("ramSaveMenuItem")); menu.addSeparator(); menu.add(edit); menu.add(clear); menu.add(load); menu.add(save); } private JMenuItem createItem(boolean enabled, String label) { JMenuItem ret = new JMenuItem(label); ret.setEnabled(enabled); ret.addActionListener(this); return ret; } public void actionPerformed(ActionEvent evt) { Object src = evt.getSource(); if (src == edit) doEdit(); else if (src == clear) doClear(); else if (src == load) doLoad(); else if (src == save) doSave(); } private void doEdit() { MemState s = factory.getState(instance, circState); if (s == null) return; HexFrame frame = factory.getHexFrame(proj, instance, circState); frame.setVisible(true); frame.toFront(); } private void doClear() { MemState s = factory.getState(instance, circState); boolean isAllZero = s.getContents().isClear(); if (isAllZero) return; int choice = JOptionPane.showConfirmDialog(frame, Strings.get("ramConfirmClearMsg"), Strings.get("ramConfirmClearTitle"), JOptionPane.YES_NO_OPTION); if (choice == JOptionPane.YES_OPTION) { s.getContents().clear(); } } private void doLoad() { JFileChooser chooser = proj.createChooser(); File oldSelected = factory.getCurrentImage(instance); if (oldSelected != null) chooser.setSelectedFile(oldSelected); chooser.setDialogTitle(Strings.get("ramLoadDialogTitle")); int choice = chooser.showOpenDialog(frame); if (choice == JFileChooser.APPROVE_OPTION) { File f = chooser.getSelectedFile(); try { factory.loadImage(circState.getInstanceState(instance), f); } catch (IOException e) { JOptionPane.showMessageDialog(frame, e.getMessage(), Strings.get("ramLoadErrorTitle"), JOptionPane.ERROR_MESSAGE); } } } private void doSave() { MemState s = factory.getState(instance, circState); JFileChooser chooser = proj.createChooser(); File oldSelected = factory.getCurrentImage(instance); if (oldSelected != null) chooser.setSelectedFile(oldSelected); chooser.setDialogTitle(Strings.get("ramSaveDialogTitle")); int choice = chooser.showSaveDialog(frame); if (choice == JFileChooser.APPROVE_OPTION) { File f = chooser.getSelectedFile(); try { HexFile.save(f, s.getContents()); factory.setCurrentImage(instance, f); } catch (IOException e) { JOptionPane.showMessageDialog(frame, e.getMessage(), Strings.get("ramSaveErrorTitle"), JOptionPane.ERROR_MESSAGE); } } } } logisim-2.7.1/src/com/cburch/logisim/std/memory/MemContentsSub.java0000644000175000017500000001077211446034564025231 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.memory; import java.util.Arrays; class MemContentsSub { private MemContentsSub() { } static ContentsInterface createContents(int size, int bits) { if (bits <= 8) return new ByteContents(size); else if (bits <= 16) return new ShortContents(size); else return new IntContents(size); } static abstract class ContentsInterface implements Cloneable { @Override public ContentsInterface clone() { try { return (ContentsInterface) super.clone(); } catch (CloneNotSupportedException e) { return this; } } abstract int getLength(); abstract int get(int addr); abstract void set(int addr, int value); abstract void clear(); abstract void load(int start, int[] values, int mask); boolean matches(int[] values, int start, int mask) { for (int i = 0; i < values.length; i++) { if (get(start + i) != (values[i] & mask)) return false; } return true; } int[] get(int start, int len) { int[] ret = new int[len]; for (int i = 0; i < ret.length; i++) ret[i] = get(start + i); return ret; } boolean isClear() { for (int i = 0, n = getLength(); i < n; i++) { if (get(i) != 0) return false; } return true; } } private static class ByteContents extends ContentsInterface { private byte[] data; public ByteContents(int size) { data = new byte[size]; } @Override public ByteContents clone() { ByteContents ret = (ByteContents) super.clone(); ret.data = new byte[this.data.length]; System.arraycopy(this.data, 0, ret.data, 0, this.data.length); return ret; } // // methods for accessing data within memory // @Override int getLength() { return data.length; } @Override int get(int addr) { return addr >= 0 && addr < data.length ? data[addr] : 0; } @Override void set(int addr, int value) { if (addr >= 0 && addr < data.length) { byte oldValue = data[addr]; if (value != oldValue) { data[addr] = (byte) value; } } } @Override void clear() { Arrays.fill(data, (byte) 0); } @Override void load(int start, int[] values, int mask) { int n = Math.min(values.length, data.length - start); for (int i = 0; i < n; i++) { data[start + i] = (byte) (values[i] & mask); } } } private static class ShortContents extends ContentsInterface { private short[] data; public ShortContents(int size) { data = new short[size]; } @Override public ShortContents clone() { ShortContents ret = (ShortContents) super.clone(); ret.data = new short[this.data.length]; System.arraycopy(this.data, 0, ret.data, 0, this.data.length); return ret; } // // methods for accessing data within memory // @Override int getLength() { return data.length; } @Override int get(int addr) { return addr >= 0 && addr < data.length ? data[addr] : 0; } @Override void set(int addr, int value) { if (addr >= 0 && addr < data.length) { short oldValue = data[addr]; if (value != oldValue) { data[addr] = (short) value; } } } @Override void clear() { Arrays.fill(data, (short) 0); } @Override void load(int start, int[] values, int mask) { int n = Math.min(values.length, data.length - start); for (int i = 0; i < n; i++) { data[start + i] = (short) (values[i] & mask); } } } private static class IntContents extends ContentsInterface { private int[] data; public IntContents(int size) { data = new int[size]; } @Override public IntContents clone() { IntContents ret = (IntContents) super.clone(); ret.data = new int[this.data.length]; System.arraycopy(this.data, 0, ret.data, 0, this.data.length); return ret; } // // methods for accessing data within memory // @Override int getLength() { return data.length; } @Override int get(int addr) { return addr >= 0 && addr < data.length ? data[addr] : 0; } @Override void set(int addr, int value) { if (addr >= 0 && addr < data.length) { int oldValue = data[addr]; if (value != oldValue) { data[addr] = value; } } } @Override void clear() { Arrays.fill(data, 0); } @Override void load(int start, int[] values, int mask) { int n = Math.min(values.length, data.length - start); for (int i = 0; i < n; i++) { data[i] = values[i] & mask; } } } } logisim-2.7.1/src/com/cburch/logisim/std/memory/MemContents.java0000644000175000017500000002401411454501242024540 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.memory; import java.util.Arrays; import com.cburch.hex.HexModel; import com.cburch.hex.HexModelListener; import com.cburch.logisim.util.EventSourceWeakSupport; class MemContents implements Cloneable, HexModel { private static final int PAGE_SIZE_BITS = 12; private static final int PAGE_SIZE = 1 << PAGE_SIZE_BITS; private static final int PAGE_MASK = PAGE_SIZE - 1; static MemContents create(int addrBits, int width) { return new MemContents(addrBits, width); } private EventSourceWeakSupport listeners = null; private int width; private int addrBits; private int mask; private MemContentsSub.ContentsInterface[] pages; private MemContents(int addrBits, int width) { listeners = null; setDimensions(addrBits, width); } // // HexModel methods // public void addHexModelListener(HexModelListener l) { if (listeners == null) listeners = new EventSourceWeakSupport(); listeners.add(l); } public void removeHexModelListener(HexModelListener l) { if (listeners == null) return; listeners.add(l); if (listeners.isEmpty()) listeners = null; } private void fireMetainfoChanged() { if (listeners == null) return; boolean found = false; for (HexModelListener l : listeners) { found = true; l.metainfoChanged(this); } if (!found) listeners = null; } private void fireBytesChanged(long start, long numBytes, int[] oldValues) { if (listeners == null) return; boolean found = false; for (HexModelListener l : listeners) { found = true; l.bytesChanged(this, start, numBytes, oldValues); } if (!found) listeners = null; } // // other methods // @Override public MemContents clone() { try { MemContents ret = (MemContents) super.clone(); ret.listeners = null; ret.pages = new MemContentsSub.ContentsInterface[this.pages.length]; for (int i = 0; i < ret.pages.length; i++) { if (this.pages[i] != null) { ret.pages[i] = this.pages[i].clone(); } } return ret; } catch (CloneNotSupportedException ex) { return this; } } public int getLogLength() { return addrBits; } public int getWidth() { return width; } public int get(long addr) { int page = (int) (addr >>> PAGE_SIZE_BITS); int offs = (int) (addr & PAGE_MASK); if (page < 0 || page >= pages.length || pages[page] == null) return 0; return pages[page].get(offs) & mask; } public boolean isClear() { for (int i = 0; i < pages.length; i++) { MemContentsSub.ContentsInterface page = pages[i]; if (page != null) { for (int j = page.getLength() - 1; j >= 0; j--) { if (page.get(j) != 0) return false; } } } return true; } public void set(long addr, int value) { int page = (int) (addr >>> PAGE_SIZE_BITS); int offs = (int) (addr & PAGE_MASK); int old = pages[page] == null ? 0 : pages[page].get(offs) & mask; int val = value & mask; if (old != val) { if (pages[page] == null) { pages[page] = MemContentsSub.createContents(PAGE_SIZE, width); } pages[page].set(offs, val); fireBytesChanged(addr, 1, new int[] { old }); } } public void set(long start, int[] values) { if (values.length == 0) return; int pageStart = (int) (start >>> PAGE_SIZE_BITS); int startOffs = (int) (start & PAGE_MASK); int pageEnd = (int) ((start + values.length - 1) >>> PAGE_SIZE_BITS); int endOffs = (int) ((start + values.length - 1) & PAGE_MASK); if (pageStart == pageEnd) { ensurePage(pageStart); MemContentsSub.ContentsInterface page = pages[pageStart]; if (!page.matches(values, startOffs, mask)) { int[] oldValues = page.get(startOffs, values.length); page.load(startOffs, values, mask); if (page.isClear()) pages[pageStart] = null; fireBytesChanged(start, values.length, oldValues); } } else { int nextOffs; if (startOffs == 0) { pageStart--; nextOffs = 0; } else { ensurePage(pageStart); int[] vals = new int[PAGE_SIZE - startOffs]; System.arraycopy(values, 0, vals, 0, vals.length); MemContentsSub.ContentsInterface page = pages[pageStart]; if (!page.matches(vals, startOffs, mask)) { int[] oldValues = page.get(startOffs, vals.length); page.load(startOffs, vals, mask); if (page.isClear()) pages[pageStart] = null; fireBytesChanged(start, PAGE_SIZE - pageStart, oldValues); } nextOffs = vals.length; } int[] vals = new int[PAGE_SIZE]; int offs = nextOffs; for (int i = pageStart + 1; i < pageEnd; i++, offs += PAGE_SIZE) { MemContentsSub.ContentsInterface page = pages[i]; if (page == null) { boolean allZeroes = true; for (int j = 0; j < PAGE_SIZE; j++) { if ((values[offs + j] & mask) != 0) { allZeroes = false; break; } } if (!allZeroes) { page = MemContentsSub.createContents(PAGE_SIZE, width); pages[i] = page; } } if (page != null) { System.arraycopy(values, offs, vals, 0, PAGE_SIZE); if (!page.matches(vals, startOffs, mask)) { int[] oldValues = page.get(0, PAGE_SIZE); page.load(0, vals, mask); if (page.isClear()) pages[i] = null; fireBytesChanged((long) i << PAGE_SIZE_BITS, PAGE_SIZE, oldValues); } } } if (endOffs >= 0) { ensurePage(pageEnd); vals = new int[endOffs + 1]; System.arraycopy(values, offs, vals, 0, endOffs + 1); MemContentsSub.ContentsInterface page = pages[pageEnd]; if (!page.matches(vals, startOffs, mask)) { int[] oldValues = page.get(0, endOffs + 1); page.load(0, vals, mask); if (page.isClear()) pages[pageEnd] = null; fireBytesChanged((long) pageEnd << PAGE_SIZE_BITS, endOffs + 1, oldValues); } } } } public void fill(long start, long len, int value) { if (len == 0) return; int pageStart = (int) (start >>> PAGE_SIZE_BITS); int startOffs = (int) (start & PAGE_MASK); int pageEnd = (int) ((start + len - 1) >>> PAGE_SIZE_BITS); int endOffs = (int) ((start + len - 1) & PAGE_MASK); value &= mask; if (pageStart == pageEnd) { ensurePage(pageStart); int[] vals = new int[(int) len]; Arrays.fill(vals, value); MemContentsSub.ContentsInterface page = pages[pageStart]; if (!page.matches(vals, startOffs, mask)) { int[] oldValues = page.get(startOffs, (int) len); page.load(startOffs, vals, mask); if (value == 0 && page.isClear()) pages[pageStart] = null; fireBytesChanged(start, len, oldValues); } } else { if (startOffs == 0) { pageStart--; } else { if (value == 0 && pages[pageStart] == null) { // nothing to do } else { ensurePage(pageStart); int[] vals = new int[PAGE_SIZE - startOffs]; Arrays.fill(vals, value); MemContentsSub.ContentsInterface page = pages[pageStart]; if (!page.matches(vals, startOffs, mask)) { int[] oldValues = page.get(startOffs, vals.length); page.load(startOffs, vals, mask); if (value == 0 && page.isClear()) pages[pageStart] = null; fireBytesChanged(start, PAGE_SIZE - pageStart, oldValues); } } } if (value == 0) { for (int i = pageStart + 1; i < pageEnd; i++) { if (pages[i] != null) clearPage(i); } } else { int[] vals = new int[PAGE_SIZE]; Arrays.fill(vals, value); for (int i = pageStart + 1; i < pageEnd; i++) { ensurePage(i); MemContentsSub.ContentsInterface page = pages[i]; if (!page.matches(vals, 0, mask)) { int[] oldValues = page.get(0, PAGE_SIZE); page.load(0, vals, mask); fireBytesChanged((long) i << PAGE_SIZE_BITS, PAGE_SIZE, oldValues); } } } if (endOffs >= 0) { MemContentsSub.ContentsInterface page = pages[pageEnd]; if (value == 0 && page == null) { // nothing to do } else { ensurePage(pageEnd); int[] vals = new int[endOffs + 1]; Arrays.fill(vals, value); if (!page.matches(vals, 0, mask)) { int[] oldValues = page.get(0, endOffs + 1); page.load(0, vals, mask); if (value == 0 && page.isClear()) pages[pageEnd] = null; fireBytesChanged((long) pageEnd << PAGE_SIZE_BITS, endOffs + 1, oldValues); } } } } } public void clear() { for (int i = 0; i < pages.length; i++) { if (pages[i] != null) { if (pages[i] != null) clearPage(i); } } } private void clearPage(int index) { MemContentsSub.ContentsInterface page = pages[index]; int[] oldValues = new int[page.getLength()]; boolean changed = false; for (int j = 0; j < oldValues.length; j++) { int val = page.get(j) & mask; oldValues[j] = val; if (val != 0) changed = true; } if (changed) { pages[index] = null; fireBytesChanged(index << PAGE_SIZE_BITS, oldValues.length, oldValues); } } public void setDimensions(int addrBits, int width) { if (addrBits == this.addrBits && width == this.width) return; this.addrBits = addrBits; this.width = width; this.mask = width == 32 ? 0xffffffff : ((1 << width) - 1); MemContentsSub.ContentsInterface[] oldPages = pages; int pageCount; int pageLength; if (addrBits < PAGE_SIZE_BITS) { pageCount = 1; pageLength = 1 << addrBits; } else { pageCount = 1 << (addrBits - PAGE_SIZE_BITS); pageLength = PAGE_SIZE; } pages = new MemContentsSub.ContentsInterface[pageCount]; if (oldPages != null) { int n = Math.min(oldPages.length, pages.length); for (int i = 0; i < n; i++) { if (oldPages[i] != null) { pages[i] = MemContentsSub.createContents(pageLength, width); int m = Math.max(oldPages[i].getLength(), pageLength); for (int j = 0; j < m; j++) { pages[i].set(j, oldPages[i].get(j)); } } } } if (pageCount == 0 && pages[0] == null) { pages[0] = MemContentsSub.createContents(pageLength, width); } fireMetainfoChanged(); } public long getFirstOffset() { return 0; } public long getLastOffset() { return (1L << addrBits) - 1; } public int getValueWidth() { return width; } private void ensurePage(int index) { if (pages[index] == null) { pages[index] = MemContentsSub.createContents(PAGE_SIZE, width); } } } logisim-2.7.1/src/com/cburch/logisim/std/memory/Mem.java0000644000175000017500000001460611447117150023033 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.memory; import java.awt.Color; import java.awt.Graphics; import java.io.File; import java.io.IOException; import java.util.WeakHashMap; import com.cburch.hex.HexModel; import com.cburch.hex.HexModelListener; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Attributes; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.gui.hex.HexFile; import com.cburch.logisim.gui.hex.HexFrame; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.proj.Project; import com.cburch.logisim.tools.MenuExtender; import com.cburch.logisim.tools.key.BitWidthConfigurator; import com.cburch.logisim.tools.key.JoinedConfigurator; import com.cburch.logisim.util.GraphicsUtil; import com.cburch.logisim.util.StringGetter; import com.cburch.logisim.util.StringUtil; abstract class Mem extends InstanceFactory { // Note: The code is meant to be able to handle up to 32-bit addresses, but it // hasn't been debugged thoroughly. There are two definite changes I would // make if I were to extend the address bits: First, there would need to be some // modification to the memory's graphical representation, because there isn't // room in the box to include such long memory addresses with the current font // size. And second, I'd alter the MemContents class's PAGE_SIZE_BITS constant // to 14 so that its "page table" isn't quite so big. public static final Attribute ADDR_ATTR = Attributes.forBitWidth( "addrWidth", Strings.getter("ramAddrWidthAttr"), 2, 24); public static final Attribute DATA_ATTR = Attributes.forBitWidth( "dataWidth", Strings.getter("ramDataWidthAttr")); // port-related constants static final int DATA = 0; static final int ADDR = 1; static final int CS = 2; static final int MEM_INPUTS = 3; // other constants static final int DELAY = 10; private WeakHashMap currentInstanceFiles; Mem(String name, StringGetter desc, int extraPorts) { super(name, desc); currentInstanceFiles = new WeakHashMap(); setInstancePoker(MemPoker.class); setKeyConfigurator(JoinedConfigurator.create( new BitWidthConfigurator(ADDR_ATTR, 2, 24, 0), new BitWidthConfigurator(DATA_ATTR))); setOffsetBounds(Bounds.create(-140, -40, 140, 80)); } abstract void configurePorts(Instance instance); @Override public abstract AttributeSet createAttributeSet(); abstract MemState getState(InstanceState state); abstract MemState getState(Instance instance, CircuitState state); abstract HexFrame getHexFrame(Project proj, Instance instance, CircuitState state); @Override public abstract void propagate(InstanceState state); @Override protected void configureNewInstance(Instance instance) { configurePorts(instance); } void configureStandardPorts(Instance instance, Port[] ps) { ps[DATA] = new Port( 0, 0, Port.INOUT, DATA_ATTR); ps[ADDR] = new Port(-140, 0, Port.INPUT, ADDR_ATTR); ps[CS] = new Port( -90, 40, Port.INPUT, 1); ps[DATA].setToolTip(Strings.getter("memDataTip")); ps[ADDR].setToolTip(Strings.getter("memAddrTip")); ps[CS].setToolTip(Strings.getter("memCSTip")); } @Override public void paintInstance(InstancePainter painter) { Graphics g = painter.getGraphics(); Bounds bds = painter.getBounds(); // draw boundary painter.drawBounds(); // draw contents if (painter.getShowState()) { MemState state = getState(painter); state.paint(painter.getGraphics(), bds.getX(), bds.getY()); } else { BitWidth addr = painter.getAttributeValue(ADDR_ATTR); int addrBits = addr.getWidth(); int bytes = 1 << addrBits; String label; if (this instanceof Rom) { if (addrBits >= 30) { label = StringUtil.format(Strings.get("romGigabyteLabel"), "" + (bytes >>> 30)); } else if (addrBits >= 20) { label = StringUtil.format(Strings.get("romMegabyteLabel"), "" + (bytes >> 20)); } else if (addrBits >= 10) { label = StringUtil.format(Strings.get("romKilobyteLabel"), "" + (bytes >> 10)); } else { label = StringUtil.format(Strings.get("romByteLabel"), "" + bytes); } } else { if (addrBits >= 30) { label = StringUtil.format(Strings.get("ramGigabyteLabel"), "" + (bytes >>> 30)); } else if (addrBits >= 20) { label = StringUtil.format(Strings.get("ramMegabyteLabel"), "" + (bytes >> 20)); } else if (addrBits >= 10) { label = StringUtil.format(Strings.get("ramKilobyteLabel"), "" + (bytes >> 10)); } else { label = StringUtil.format(Strings.get("ramByteLabel"), "" + bytes); } } GraphicsUtil.drawCenteredText(g, label, bds.getX() + bds.getWidth() / 2, bds.getY() + bds.getHeight() / 2); } // draw input and output ports painter.drawPort(DATA, Strings.get("ramDataLabel"), Direction.WEST); painter.drawPort(ADDR, Strings.get("ramAddrLabel"), Direction.EAST); g.setColor(Color.GRAY); painter.drawPort(CS, Strings.get("ramCSLabel"), Direction.SOUTH); } File getCurrentImage(Instance instance) { return currentInstanceFiles.get(instance); } void setCurrentImage(Instance instance, File value) { currentInstanceFiles.put(instance, value); } public void loadImage(InstanceState instanceState, File imageFile) throws IOException { MemState s = this.getState(instanceState); HexFile.open(s.getContents(), imageFile); this.setCurrentImage(instanceState.getInstance(), imageFile); } @Override protected Object getInstanceFeature(Instance instance, Object key) { if (key == MenuExtender.class) return new MemMenu(this, instance); return super.getInstanceFeature(instance, key); } static class MemListener implements HexModelListener { Instance instance; MemListener(Instance instance) { this.instance = instance; } public void metainfoChanged(HexModel source) { } public void bytesChanged(HexModel source, long start, long numBytes, int[] values) { instance.fireInvalidated(); } } } logisim-2.7.1/src/com/cburch/logisim/std/memory/JKFlipFlop.java0000644000175000017500000000164511527054366024264 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.memory; import com.cburch.logisim.data.Value; public class JKFlipFlop extends AbstractFlipFlop { public JKFlipFlop() { super("J-K Flip-Flop", "jkFlipFlop.gif", Strings.getter("jkFlipFlopComponent"), 2, false); } @Override protected String getInputName(int index) { return index == 0 ? "J" : "K"; } @Override protected Value computeValue(Value[] inputs, Value curValue) { if (inputs[0] == Value.FALSE) { if (inputs[1] == Value.FALSE) { return curValue; } else if (inputs[1] == Value.TRUE) { return Value.FALSE; } } else if (inputs[0] == Value.TRUE) { if (inputs[1] == Value.FALSE) { return Value.TRUE; } else if (inputs[1] == Value.TRUE) { return curValue.not(); } } return Value.UNKNOWN; } } logisim-2.7.1/src/com/cburch/logisim/std/memory/DFlipFlop.java0000644000175000017500000000107011527054404024124 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.memory; import com.cburch.logisim.data.Value; public class DFlipFlop extends AbstractFlipFlop { public DFlipFlop() { super("D Flip-Flop", "dFlipFlop.gif", Strings.getter("dFlipFlopComponent"), 1, true); } @Override protected String getInputName(int index) { return "D"; } @Override protected Value computeValue(Value[] inputs, Value curValue) { return inputs[0]; } } logisim-2.7.1/src/com/cburch/logisim/std/memory/CounterAttributes.java0000644000175000017500000000602211446034564026002 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.memory; import java.util.List; import com.cburch.logisim.data.AbstractAttributeSet; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.AttributeSets; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.instance.StdAttr; class CounterAttributes extends AbstractAttributeSet { private AttributeSet base; public CounterAttributes() { base = AttributeSets.fixedSet(new Attribute[] { StdAttr.WIDTH, Counter.ATTR_MAX, Counter.ATTR_ON_GOAL, StdAttr.EDGE_TRIGGER, StdAttr.LABEL, StdAttr.LABEL_FONT }, new Object[] { BitWidth.create(8), Integer.valueOf(0xFF), Counter.ON_GOAL_WRAP, StdAttr.TRIG_RISING, "", StdAttr.DEFAULT_LABEL_FONT }); } @Override public void copyInto(AbstractAttributeSet dest) { ((CounterAttributes) dest).base = (AttributeSet) this.base.clone(); } @Override public List> getAttributes() { return base.getAttributes(); } @Override public V getValue(Attribute attr) { return base.getValue(attr); } @Override public void setValue(Attribute attr, V value) { Object oldValue = base.getValue(attr); if (oldValue == null ? value == null : oldValue.equals(value)) return; Integer newMax = null; if (attr == StdAttr.WIDTH) { BitWidth oldWidth = base.getValue(StdAttr.WIDTH); BitWidth newWidth = (BitWidth) value; int oldW = oldWidth.getWidth(); int newW = newWidth.getWidth(); Integer oldValObj = base.getValue(Counter.ATTR_MAX); int oldVal = oldValObj.intValue(); base.setValue(StdAttr.WIDTH, newWidth); if (newW > oldW) { newMax = Integer.valueOf(newWidth.getMask()); } else { int v = oldVal & newWidth.getMask(); if (v != oldVal) { Integer newValObj = Integer.valueOf(v); base.setValue(Counter.ATTR_MAX, newValObj); fireAttributeValueChanged(Counter.ATTR_MAX, newValObj); } } fireAttributeValueChanged(StdAttr.WIDTH, newWidth); } else if (attr == Counter.ATTR_MAX) { int oldVal = ((Integer) value).intValue(); BitWidth width = base.getValue(StdAttr.WIDTH); int newVal = oldVal & width.getMask(); if (newVal != oldVal) { @SuppressWarnings("unchecked") V val = (V) Integer.valueOf(newVal); value = val; } fireAttributeValueChanged(attr, value); } base.setValue(attr, value); if (newMax != null) { base.setValue(Counter.ATTR_MAX, newMax); fireAttributeValueChanged(Counter.ATTR_MAX, newMax); } } @Override public boolean containsAttribute(Attribute attr) { return base.containsAttribute(attr); } @Override public Attribute getAttribute(String name) { return base.getAttribute(name); } @Override public boolean isReadOnly(Attribute attr) { return base.isReadOnly(attr); } @Override public void setReadOnly(Attribute attr, boolean value) { base.setReadOnly(attr, value); } } logisim-2.7.1/src/com/cburch/logisim/std/memory/Counter.java0000644000175000017500000001723511446034564023743 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.memory; import java.awt.Color; import java.awt.Graphics; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeOption; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Attributes; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.tools.key.BitWidthConfigurator; import com.cburch.logisim.util.GraphicsUtil; import com.cburch.logisim.util.StringUtil; public class Counter extends InstanceFactory { static final AttributeOption ON_GOAL_WRAP = new AttributeOption("wrap", "wrap", Strings.getter("counterGoalWrap")); static final AttributeOption ON_GOAL_STAY = new AttributeOption("stay", "stay", Strings.getter("counterGoalStay")); static final AttributeOption ON_GOAL_CONT = new AttributeOption("continue", "continue", Strings.getter("counterGoalContinue")); static final AttributeOption ON_GOAL_LOAD = new AttributeOption("load", "load", Strings.getter("counterGoalLoad")); static final Attribute ATTR_MAX = Attributes.forHexInteger("max", Strings.getter("counterMaxAttr")); static final Attribute ATTR_ON_GOAL = Attributes.forOption("ongoal", Strings.getter("counterGoalAttr"), new AttributeOption[] { ON_GOAL_WRAP, ON_GOAL_STAY, ON_GOAL_CONT, ON_GOAL_LOAD }); private static final int DELAY = 8; private static final int OUT = 0; private static final int IN = 1; private static final int CK = 2; private static final int CLR = 3; private static final int LD = 4; private static final int CT = 5; private static final int CARRY = 6; public Counter() { super("Counter", Strings.getter("counterComponent")); setOffsetBounds(Bounds.create(-30, -20, 30, 40)); setIconName("counter.gif"); setInstancePoker(RegisterPoker.class); setInstanceLogger(RegisterLogger.class); setKeyConfigurator(new BitWidthConfigurator(StdAttr.WIDTH)); Port[] ps = new Port[7]; ps[OUT] = new Port( 0, 0, Port.OUTPUT, StdAttr.WIDTH); ps[IN] = new Port(-30, 0, Port.INPUT, StdAttr.WIDTH); ps[CK] = new Port(-20, 20, Port.INPUT, 1); ps[CLR] = new Port(-10, 20, Port.INPUT, 1); ps[LD] = new Port(-30, -10, Port.INPUT, 1); ps[CT] = new Port(-30, 10, Port.INPUT, 1); ps[CARRY] = new Port(0, 10, Port.OUTPUT, 1); ps[OUT].setToolTip(Strings.getter("counterQTip")); ps[IN].setToolTip(Strings.getter("counterDataTip")); ps[CK].setToolTip(Strings.getter("counterClockTip")); ps[CLR].setToolTip(Strings.getter("counterResetTip")); ps[LD].setToolTip(Strings.getter("counterLoadTip")); ps[CT].setToolTip(Strings.getter("counterEnableTip")); ps[CARRY].setToolTip(Strings.getter("counterCarryTip")); setPorts(ps); } @Override public AttributeSet createAttributeSet() { return new CounterAttributes(); } @Override protected void configureNewInstance(Instance instance) { Bounds bds = instance.getBounds(); instance.setTextField(StdAttr.LABEL, StdAttr.LABEL_FONT, bds.getX() + bds.getWidth() / 2, bds.getY() - 3, GraphicsUtil.H_CENTER, GraphicsUtil.V_BASELINE); } @Override public void propagate(InstanceState state) { RegisterData data = (RegisterData) state.getData(); if (data == null) { data = new RegisterData(); state.setData(data); } BitWidth dataWidth = state.getAttributeValue(StdAttr.WIDTH); Object triggerType = state.getAttributeValue(StdAttr.EDGE_TRIGGER); int max = state.getAttributeValue(ATTR_MAX).intValue(); Value clock = state.getPort(CK); boolean triggered = data.updateClock(clock, triggerType); Value newValue; boolean carry; if (state.getPort(CLR) == Value.TRUE) { newValue = Value.createKnown(dataWidth, 0); carry = false; } else { boolean ld = state.getPort(LD) == Value.TRUE; boolean ct = state.getPort(CT) != Value.FALSE; int oldVal = data.value; int newVal; if (!triggered) { newVal = oldVal; } else if (ct) { // trigger, enable = 1: should increment or decrement int goal = ld ? 0 : max; if (oldVal == goal) { Object onGoal = state.getAttributeValue(ATTR_ON_GOAL); if (onGoal == ON_GOAL_WRAP) { newVal = ld ? max : 0; } else if (onGoal == ON_GOAL_STAY) { newVal = oldVal; } else if (onGoal == ON_GOAL_LOAD) { Value in = state.getPort(IN); newVal = in.isFullyDefined() ? in.toIntValue() : 0; if (newVal > max) newVal &= max; } else if (onGoal == ON_GOAL_CONT) { newVal = ld ? oldVal - 1 : oldVal + 1; } else { System.err.println("Invalid goal attribute " + onGoal); //OK newVal = ld ? max : 0; } } else { newVal = ld ? oldVal - 1 : oldVal + 1; } } else if (ld) { // trigger, enable = 0, load = 1: should load Value in = state.getPort(IN); newVal = in.isFullyDefined() ? in.toIntValue() : 0; if (newVal > max) newVal &= max; } else { // trigger, enable = 0, load = 0: no change newVal = oldVal; } newValue = Value.createKnown(dataWidth, newVal); newVal = newValue.toIntValue(); carry = newVal == (ld && ct ? 0 : max); /* I would want this if I were worried about the carry signal * outrunning the clock. But the component's delay should be * enough to take care of it. if (carry) { if (triggerType == StdAttr.TRIG_FALLING) { carry = clock == Value.TRUE; } else { carry = clock == Value.FALSE; } } */ } data.value = newValue.toIntValue(); state.setPort(OUT, newValue, DELAY); state.setPort(CARRY, carry ? Value.TRUE : Value.FALSE, DELAY); } @Override public void paintInstance(InstancePainter painter) { Graphics g = painter.getGraphics(); Bounds bds = painter.getBounds(); RegisterData state = (RegisterData) painter.getData(); BitWidth widthVal = painter.getAttributeValue(StdAttr.WIDTH); int width = widthVal == null ? 8 : widthVal.getWidth(); // determine text to draw in label String a; String b = null; if (painter.getShowState()) { int val = state == null ? 0 : state.value; String str = StringUtil.toHexString(width, val); if (str.length() <= 4) { a = str; } else { int split = str.length() - 4; a = str.substring(0, split); b = str.substring(split); } } else { a = Strings.get("counterLabel"); b = Strings.get("registerWidthLabel", "" + widthVal.getWidth()); } // draw boundary, label painter.drawBounds(); painter.drawLabel(); // draw input and output ports if (b == null) { painter.drawPort(IN, "D", Direction.EAST); painter.drawPort(OUT, "Q", Direction.WEST); } else { painter.drawPort(IN); painter.drawPort(OUT); } g.setColor(Color.GRAY); painter.drawPort(LD); painter.drawPort(CARRY); painter.drawPort(CLR, "0", Direction.SOUTH); painter.drawPort(CT, Strings.get("counterEnableLabel"), Direction.EAST); g.setColor(Color.BLACK); painter.drawClock(CK, Direction.NORTH); // draw contents if (b == null) { GraphicsUtil.drawText(g, a, bds.getX() + 15, bds.getY() + 4, GraphicsUtil.H_CENTER, GraphicsUtil.V_TOP); } else { GraphicsUtil.drawText(g, a, bds.getX() + 15, bds.getY() + 3, GraphicsUtil.H_CENTER, GraphicsUtil.V_TOP); GraphicsUtil.drawText(g, b, bds.getX() + 15, bds.getY() + 15, GraphicsUtil.H_CENTER, GraphicsUtil.V_TOP); } } }logisim-2.7.1/src/com/cburch/logisim/std/memory/ClockState.java0000644000175000017500000000215011446034564024346 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.memory; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.StdAttr; class ClockState implements Cloneable { private Value lastClock; public ClockState() { lastClock = Value.FALSE; } @Override public ClockState clone() { try { return (ClockState) super.clone(); } catch (CloneNotSupportedException e) { return null; } } public boolean updateClock(Value newClock, Object trigger) { Value oldClock = lastClock; lastClock = newClock; if (trigger == null || trigger == StdAttr.TRIG_RISING) { return oldClock == Value.FALSE && newClock == Value.TRUE; } else if (trigger == StdAttr.TRIG_FALLING) { return oldClock == Value.TRUE && newClock == Value.FALSE; } else if (trigger == StdAttr.TRIG_HIGH) { return newClock == Value.TRUE; } else if (trigger == StdAttr.TRIG_LOW) { return newClock == Value.FALSE; } else { return oldClock == Value.FALSE && newClock == Value.TRUE; } } } logisim-2.7.1/src/com/cburch/logisim/std/memory/AbstractFlipFlop.java0000644000175000017500000001555711527054412025522 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.memory; import java.awt.Color; import java.awt.Graphics; import java.awt.event.MouseEvent; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeOption; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceData; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstanceLogger; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstancePoker; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.util.GraphicsUtil; import com.cburch.logisim.util.StringGetter; abstract class AbstractFlipFlop extends InstanceFactory { private static final int STD_PORTS = 6; private Attribute triggerAttribute; protected AbstractFlipFlop(String name, String iconName, StringGetter desc, int numInputs, boolean allowLevelTriggers) { super(name, desc); setIconName(iconName); triggerAttribute = allowLevelTriggers ? StdAttr.TRIGGER : StdAttr.EDGE_TRIGGER; setAttributes(new Attribute[] { triggerAttribute, StdAttr.LABEL, StdAttr.LABEL_FONT }, new Object[] { StdAttr.TRIG_RISING, "", StdAttr.DEFAULT_LABEL_FONT }); setOffsetBounds(Bounds.create(-40, -10, 40, 40)); setInstancePoker(Poker.class); setInstanceLogger(Logger.class); Port[] ps = new Port[numInputs + STD_PORTS]; if (numInputs == 1) { ps[0] = new Port(-40, 20, Port.INPUT, 1); ps[1] = new Port(-40, 0, Port.INPUT, 1); } else if (numInputs == 2) { ps[0] = new Port(-40, 0, Port.INPUT, 1); ps[1] = new Port(-40, 20, Port.INPUT, 1); ps[2] = new Port(-40, 10, Port.INPUT, 1); } else { throw new RuntimeException("flip-flop input > 2"); } ps[numInputs + 1] = new Port( 0, 0, Port.OUTPUT, 1); ps[numInputs + 2] = new Port( 0, 20, Port.OUTPUT, 1); ps[numInputs + 3] = new Port(-10, 30, Port.INPUT, 1); ps[numInputs + 4] = new Port(-30, 30, Port.INPUT, 1); ps[numInputs + 5] = new Port(-20, 30, Port.INPUT, 1); ps[numInputs].setToolTip(Strings.getter("flipFlopClockTip")); ps[numInputs + 1].setToolTip(Strings.getter("flipFlopQTip")); ps[numInputs + 2].setToolTip(Strings.getter("flipFlopNotQTip")); ps[numInputs + 3].setToolTip(Strings.getter("flipFlopResetTip")); ps[numInputs + 4].setToolTip(Strings.getter("flipFlopPresetTip")); ps[numInputs + 5].setToolTip(Strings.getter("flipFlopEnableTip")); setPorts(ps); } // // abstract methods intended to be implemented in subclasses // protected abstract String getInputName(int index); protected abstract Value computeValue(Value[] inputs, Value curValue); // // concrete methods not intended to be overridden // @Override protected void configureNewInstance(Instance instance) { Bounds bds = instance.getBounds(); instance.setTextField(StdAttr.LABEL, StdAttr.LABEL_FONT, bds.getX() + bds.getWidth() / 2, bds.getY() - 3, GraphicsUtil.H_CENTER, GraphicsUtil.V_BASELINE); } @Override public void propagate(InstanceState state) { boolean changed = false; StateData data = (StateData) state.getData(); if (data == null) { changed = true; data = new StateData(); state.setData(data); } int n = getPorts().size() - STD_PORTS; Object triggerType = state.getAttributeValue(triggerAttribute); boolean triggered = data.updateClock(state.getPort(n), triggerType); if (state.getPort(n + 3) == Value.TRUE) { // clear requested changed |= data.curValue != Value.FALSE; data.curValue = Value.FALSE; } else if (state.getPort(n + 4) == Value.TRUE) { // preset requested changed |= data.curValue != Value.TRUE; data.curValue = Value.TRUE; } else if (triggered && state.getPort(n + 5) != Value.FALSE) { // Clock has triggered and flip-flop is enabled: Update the state Value[] inputs = new Value[n]; for (int i = 0; i < n; i++) { inputs[i] = state.getPort(i); } Value newVal = computeValue(inputs, data.curValue); if (newVal == Value.TRUE || newVal == Value.FALSE) { changed |= data.curValue != newVal; data.curValue = newVal; } } state.setPort(n + 1, data.curValue, Memory.DELAY); state.setPort(n + 2, data.curValue.not(), Memory.DELAY); } @Override public void paintInstance(InstancePainter painter) { Graphics g = painter.getGraphics(); painter.drawBounds(); painter.drawLabel(); if (painter.getShowState()) { Location loc = painter.getLocation(); StateData myState = (StateData) painter.getData(); if (myState != null) { int x = loc.getX(); int y = loc.getY(); g.setColor(myState.curValue.getColor()); g.fillOval(x - 26, y + 4, 13, 13); g.setColor(Color.WHITE); GraphicsUtil.drawCenteredText(g, myState.curValue.toDisplayString(), x - 19, y + 9); g.setColor(Color.BLACK); } } int n = getPorts().size() - STD_PORTS; g.setColor(Color.GRAY); painter.drawPort(n + 3, "0", Direction.SOUTH); painter.drawPort(n + 4, "1", Direction.SOUTH); painter.drawPort(n + 5, Strings.get("memEnableLabel"), Direction.SOUTH); g.setColor(Color.BLACK); for (int i = 0; i < n; i++) { painter.drawPort(i, getInputName(i), Direction.EAST); } painter.drawClock(n, Direction.EAST); painter.drawPort(n + 1, "Q", Direction.WEST); painter.drawPort(n + 2); } private static class StateData extends ClockState implements InstanceData { Value curValue = Value.FALSE; } public static class Logger extends InstanceLogger { @Override public String getLogName(InstanceState state, Object option) { String ret = state.getAttributeValue(StdAttr.LABEL); return ret != null && !ret.equals("") ? ret : null; } @Override public Value getLogValue(InstanceState state, Object option) { StateData s = (StateData) state.getData(); return s == null ? Value.FALSE : s.curValue; } } public static class Poker extends InstancePoker { boolean isPressed = true; @Override public void mousePressed(InstanceState state, MouseEvent e) { isPressed = isInside(state, e); } @Override public void mouseReleased(InstanceState state, MouseEvent e) { if (isPressed && isInside(state, e)) { StateData myState = (StateData) state.getData(); if (myState == null) return; myState.curValue = myState.curValue.not(); state.fireInvalidated(); } isPressed = false; } private boolean isInside(InstanceState state, MouseEvent e) { Location loc = state.getInstance().getLocation(); int dx = e.getX() - (loc.getX() - 20); int dy = e.getY() - (loc.getY() + 10); int d2 = dx * dx + dy * dy; return d2 < 8 * 8; } } } logisim-2.7.1/src/com/cburch/logisim/std/io/0000755000175000017500000000000011532247702020544 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/logisim/std/io/TtyState.java0000644000175000017500000000625711446034562023204 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.io; import java.util.Arrays; import com.cburch.logisim.data.Value; import com.cburch.logisim.gui.start.TtyInterface; import com.cburch.logisim.instance.InstanceData; class TtyState implements InstanceData, Cloneable { private Value lastClock; private String[] rowData; private int colCount; private StringBuffer lastRow; private int row; private boolean sendStdout; public TtyState(int rows, int cols) { lastClock = Value.UNKNOWN; rowData = new String[rows - 1]; colCount = cols; lastRow = new StringBuffer(cols); sendStdout = false; clear(); } @Override public TtyState clone() { try { TtyState ret = (TtyState) super.clone(); ret.rowData = this.rowData.clone(); return ret; } catch (CloneNotSupportedException e) { return null; } } public Value setLastClock(Value newClock) { Value ret = lastClock; lastClock = newClock; return ret; } public void setSendStdout(boolean value) { sendStdout = value; } public void clear() { Arrays.fill(rowData, ""); lastRow.delete(0, lastRow.length()); row = 0; } public String getRowString(int index) { if (index < row) return rowData[index]; else if (index == row) return lastRow.toString(); else return ""; } public int getCursorRow() { return row; } public int getCursorColumn() { return lastRow.length(); } public void add(char c) { if (sendStdout) { TtyInterface.sendFromTty(c); } int lastLength = lastRow.length(); switch (c) { case 12: // control-L row = 0; lastRow.delete(0, lastLength); Arrays.fill(rowData, ""); break; case '\b': // backspace if (lastLength > 0) lastRow.delete(lastLength - 1, lastLength); break; case '\n': case '\r': // newline commit(); break; default: if (!Character.isISOControl(c)) { if (lastLength == colCount) commit(); lastRow.append(c); } } } private void commit() { if (row >= rowData.length) { System.arraycopy(rowData, 1, rowData, 0, rowData.length - 1); rowData[row - 1] = lastRow.toString(); } else { rowData[row] = lastRow.toString(); row++; } lastRow.delete(0, lastRow.length()); } public void updateSize(int rows, int cols) { int oldRows = rowData.length + 1; if (rows != oldRows) { String[] newData = new String[rows - 1]; if (rows > oldRows // rows have been added, || row < rows - 1) { // or rows removed but filled rows fit System.arraycopy(rowData, 0, newData, 0, row); Arrays.fill(newData, row, rows - 1, ""); } else { // rows removed, and some filled rows must go System.arraycopy(rowData, row - rows + 1, newData, 0, rows - 1); row = rows - 1; } rowData = newData; } int oldCols = colCount; if (cols != oldCols){ colCount = cols; if (cols < oldCols) { // will need to trim any long rows for (int i = 0; i < rows - 1; i++) { String s = rowData[i]; if (s.length() > cols) rowData[i] = s.substring(0, cols); } if (lastRow.length() > cols) { lastRow.delete(cols, lastRow.length()); } } } } } logisim-2.7.1/src/com/cburch/logisim/std/io/Tty.java0000644000175000017500000001540211451010360022155 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.io; import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Attributes; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.util.GraphicsUtil; public class Tty extends InstanceFactory { private static final int CLR = 0; private static final int CK = 1; private static final int WE = 2; private static final int IN = 3; private static final int BORDER = 5; private static final int ROW_HEIGHT = 15; private static final int COL_WIDTH = 7; private static final Color DEFAULT_BACKGROUND = new Color(0, 0, 0, 64); private static final Font DEFAULT_FONT = new Font("monospaced", Font.PLAIN, 12); private static final Attribute ATTR_COLUMNS = Attributes.forIntegerRange("cols", Strings.getter("ttyColsAttr"), 1, 120); private static final Attribute ATTR_ROWS = Attributes.forIntegerRange("rows", Strings.getter("ttyRowsAttr"), 1, 48); public Tty() { super("TTY", Strings.getter("ttyComponent")); setAttributes(new Attribute[] { ATTR_ROWS, ATTR_COLUMNS, StdAttr.EDGE_TRIGGER, Io.ATTR_COLOR, Io.ATTR_BACKGROUND }, new Object[] { Integer.valueOf(8), Integer.valueOf(32), StdAttr.TRIG_RISING, Color.BLACK, DEFAULT_BACKGROUND }); setIconName("tty.gif"); Port[] ps = new Port[4]; ps[CLR] = new Port(20, 10, Port.INPUT, 1); ps[CK] = new Port( 0, 0, Port.INPUT, 1); ps[WE] = new Port(10, 10, Port.INPUT, 1); ps[IN] = new Port( 0, -10, Port.INPUT, 7); ps[CLR].setToolTip(Strings.getter("ttyClearTip")); ps[CK].setToolTip(Strings.getter("ttyClockTip")); ps[WE].setToolTip(Strings.getter("ttyEnableTip")); ps[IN].setToolTip(Strings.getter("ttyInputTip")); setPorts(ps); } @Override public Bounds getOffsetBounds(AttributeSet attrs) { int rows = getRowCount(attrs.getValue(ATTR_ROWS)); int cols = getColumnCount(attrs.getValue(ATTR_COLUMNS)); int width = 2 * BORDER + cols * COL_WIDTH; int height = 2 * BORDER + rows * ROW_HEIGHT; if (width < 30) width = 30; if (height < 30) height = 30; return Bounds.create(0, 10 - height, width, height); } @Override protected void configureNewInstance(Instance instance) { instance.addAttributeListener(); } @Override protected void instanceAttributeChanged(Instance instance, Attribute attr) { if (attr == ATTR_ROWS || attr == ATTR_COLUMNS) { instance.recomputeBounds(); } } @Override public void propagate(InstanceState circState) { Object trigger = circState.getAttributeValue(StdAttr.EDGE_TRIGGER); TtyState state = getTtyState(circState); Value clear = circState.getPort(CLR); Value clock = circState.getPort(CK); Value enable = circState.getPort(WE); Value in = circState.getPort(IN); synchronized(state) { Value lastClock = state.setLastClock(clock); if (clear == Value.TRUE) { state.clear(); } else if (enable != Value.FALSE) { boolean go; if (trigger == StdAttr.TRIG_FALLING) { go = lastClock == Value.TRUE && clock == Value.FALSE; } else { go = lastClock == Value.FALSE && clock == Value.TRUE; } if (go) state.add(in.isFullyDefined() ? (char) in.toIntValue() : '?'); } } } @Override public void paintGhost(InstancePainter painter) { Graphics g = painter.getGraphics(); GraphicsUtil.switchToWidth(g, 2); Bounds bds = painter.getBounds(); g.drawRoundRect(bds.getX(), bds.getY(), bds.getWidth(), bds.getHeight(), 10, 10); } @Override public void paintInstance(InstancePainter painter) { boolean showState = painter.getShowState(); Graphics g = painter.getGraphics(); Bounds bds = painter.getBounds(); painter.drawClock(CK, Direction.EAST); if (painter.shouldDrawColor()) { g.setColor(painter.getAttributeValue(Io.ATTR_BACKGROUND)); g.fillRoundRect(bds.getX(), bds.getY(), bds.getWidth(), bds.getHeight(), 10, 10); } GraphicsUtil.switchToWidth(g, 2); g.setColor(Color.BLACK); g.drawRoundRect(bds.getX(), bds.getY(), bds.getWidth(), bds.getHeight(), 2 * BORDER, 2 * BORDER); GraphicsUtil.switchToWidth(g, 1); painter.drawPort(CLR); painter.drawPort(WE); painter.drawPort(IN); int rows = getRowCount(painter.getAttributeValue(ATTR_ROWS)); int cols = getColumnCount(painter.getAttributeValue(ATTR_COLUMNS)); if (showState) { String[] rowData = new String[rows]; int curRow; int curCol; TtyState state = getTtyState(painter); synchronized(state) { for (int i = 0; i < rows; i++) { rowData[i] = state.getRowString(i); } curRow = state.getCursorRow(); curCol = state.getCursorColumn(); } g.setFont(DEFAULT_FONT); g.setColor(painter.getAttributeValue(Io.ATTR_COLOR)); FontMetrics fm = g.getFontMetrics(); int x = bds.getX() + BORDER; int y = bds.getY() + BORDER + (ROW_HEIGHT + fm.getAscent()) / 2; for (int i = 0; i < rows; i++) { g.drawString(rowData[i], x, y); if (i == curRow) { int x0 = x + fm.stringWidth(rowData[i].substring(0, curCol)); g.drawLine(x0, y - fm.getAscent(), x0, y); } y += ROW_HEIGHT; } } else { String str = Strings.get("ttyDesc", "" + rows, "" + cols); FontMetrics fm = g.getFontMetrics(); int strWidth = fm.stringWidth(str); if (strWidth + BORDER > bds.getWidth()) { str = Strings.get("ttyDescShort"); strWidth = fm.stringWidth(str); } int x = bds.getX() + (bds.getWidth() - strWidth) / 2; int y = bds.getY() + (bds.getHeight() + fm.getAscent()) / 2; g.drawString(str, x, y); } } private TtyState getTtyState(InstanceState state) { int rows = getRowCount(state.getAttributeValue(ATTR_ROWS)); int cols = getColumnCount(state.getAttributeValue(ATTR_COLUMNS)); TtyState ret = (TtyState) state.getData(); if (ret == null) { ret = new TtyState(rows, cols); state.setData(ret); } else { ret.updateSize(rows, cols); } return ret; } public void sendToStdout(InstanceState state) { TtyState tty = getTtyState(state); tty.setSendStdout(true); } private static int getRowCount(Object val) { if (val instanceof Integer) return ((Integer) val).intValue(); else return 4; } private static int getColumnCount(Object val) { if (val instanceof Integer) return ((Integer) val).intValue(); else return 16; } } logisim-2.7.1/src/com/cburch/logisim/std/io/Strings.java0000644000175000017500000000145111446034562023043 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.io; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.StringGetter; import com.cburch.logisim.util.StringUtil; class Strings { private static LocaleManager source = new LocaleManager("resources/logisim", "std"); public static String get(String key) { return source.get(key); } public static String get(String key, String arg0) { return StringUtil.format(source.get(key), arg0); } public static String get(String key, String arg0, String arg1) { return StringUtil.format(source.get(key), arg0, arg1); } public static StringGetter getter(String key) { return source.getter(key); } } logisim-2.7.1/src/com/cburch/logisim/std/io/SevenSegment.java0000644000175000017500000000703711451010402024002 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.io; import java.awt.Color; import java.awt.Graphics; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.InstanceDataSingleton; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; public class SevenSegment extends InstanceFactory { static Bounds[] SEGMENTS = null; static Color DEFAULT_OFF = new Color(220, 220, 220); public SevenSegment() { super("7-Segment Display", Strings.getter("sevenSegmentComponent")); setAttributes(new Attribute[] { Io.ATTR_ON_COLOR, Io.ATTR_OFF_COLOR, Io.ATTR_BACKGROUND, Io.ATTR_ACTIVE }, new Object[] { new Color(240, 0, 0), DEFAULT_OFF, Io.DEFAULT_BACKGROUND, Boolean.TRUE }); setOffsetBounds(Bounds.create(-5, 0, 40, 60)); setIconName("7seg.gif"); setPorts(new Port[] { new Port(20, 0, Port.INPUT, 1), new Port(30, 0, Port.INPUT, 1), new Port(20, 60, Port.INPUT, 1), new Port(10, 60, Port.INPUT, 1), new Port( 0, 60, Port.INPUT, 1), new Port(10, 0, Port.INPUT, 1), new Port( 0, 0, Port.INPUT, 1), new Port(30, 60, Port.INPUT, 1), }); } @Override public void propagate(InstanceState state) { int summary = 0; for (int i = 0; i < 8; i++) { Value val = state.getPort(i); if (val == Value.TRUE) summary |= 1 << i; } Object value = Integer.valueOf(summary); InstanceDataSingleton data = (InstanceDataSingleton) state.getData(); if (data == null) { state.setData(new InstanceDataSingleton(value)); } else { data.setValue(value); } } @Override public void paintInstance(InstancePainter painter) { drawBase(painter); } static void drawBase(InstancePainter painter) { ensureSegments(); InstanceDataSingleton data = (InstanceDataSingleton) painter.getData(); int summ = (data == null ? 0 : ((Integer) data.getValue()).intValue()); Boolean active = painter.getAttributeValue(Io.ATTR_ACTIVE); int desired = active == null || active.booleanValue() ? 1 : 0; Bounds bds = painter.getBounds(); int x = bds.getX() + 5; int y = bds.getY(); Graphics g = painter.getGraphics(); Color onColor = painter.getAttributeValue(Io.ATTR_ON_COLOR); Color offColor = painter.getAttributeValue(Io.ATTR_OFF_COLOR); Color bgColor = painter.getAttributeValue(Io.ATTR_BACKGROUND); if (painter.shouldDrawColor() && bgColor.getAlpha() != 0) { g.setColor(bgColor); g.fillRect(bds.getX(), bds.getY(), bds.getWidth(), bds.getHeight()); g.setColor(Color.BLACK); } painter.drawBounds(); g.setColor(Color.DARK_GRAY); for (int i = 0; i <= 7; i++) { if (painter.getShowState()) { g.setColor(((summ >> i) & 1) == desired ? onColor : offColor); } if (i < 7) { Bounds seg = SEGMENTS[i]; g.fillRect(x + seg.getX(), y + seg.getY(), seg.getWidth(), seg.getHeight()); } else { g.fillOval(x + 28, y + 48, 5, 5); // draw decimal point } } painter.drawPorts(); } static void ensureSegments() { if (SEGMENTS == null) { SEGMENTS = new Bounds[] { Bounds.create( 3, 8, 19, 4), Bounds.create(23, 10, 4, 19), Bounds.create(23, 30, 4, 19), Bounds.create( 3, 47, 19, 4), Bounds.create(-2, 30, 4, 19), Bounds.create(-2, 10, 4, 19), Bounds.create( 3, 28, 19, 4) }; } } } logisim-2.7.1/src/com/cburch/logisim/std/io/Led.java0000644000175000017500000001215711446034562022123 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.io; import java.awt.Color; import java.awt.Graphics; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceDataSingleton; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstanceLogger; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.util.GraphicsUtil; public class Led extends InstanceFactory { public Led() { super("LED", Strings.getter("ledComponent")); setAttributes(new Attribute[] { StdAttr.FACING, Io.ATTR_ON_COLOR, Io.ATTR_OFF_COLOR, Io.ATTR_ACTIVE, StdAttr.LABEL, Io.ATTR_LABEL_LOC, StdAttr.LABEL_FONT, Io.ATTR_LABEL_COLOR }, new Object[] { Direction.WEST, new Color(240, 0, 0), Color.DARK_GRAY, Boolean.TRUE, "", Io.LABEL_CENTER, StdAttr.DEFAULT_LABEL_FONT, Color.BLACK }); setFacingAttribute(StdAttr.FACING); setIconName("led.gif"); setPorts(new Port[] { new Port(0, 0, Port.INPUT, 1) }); setInstanceLogger(Logger.class); } @Override public Bounds getOffsetBounds(AttributeSet attrs) { Direction facing = attrs.getValue(StdAttr.FACING); return Bounds.create(0, -10, 20, 20).rotate(Direction.WEST, facing, 0, 0); } @Override protected void configureNewInstance(Instance instance) { instance.addAttributeListener(); computeTextField(instance); } @Override protected void instanceAttributeChanged(Instance instance, Attribute attr) { if (attr == StdAttr.FACING) { instance.recomputeBounds(); computeTextField(instance); } else if (attr == Io.ATTR_LABEL_LOC) { computeTextField(instance); } } private void computeTextField(Instance instance) { Direction facing = instance.getAttributeValue(StdAttr.FACING); Object labelLoc = instance.getAttributeValue(Io.ATTR_LABEL_LOC); Bounds bds = instance.getBounds(); int x = bds.getX() + bds.getWidth() / 2; int y = bds.getY() + bds.getHeight() / 2; int halign = GraphicsUtil.H_CENTER; int valign = GraphicsUtil.V_CENTER; if (labelLoc == Direction.NORTH) { y = bds.getY() - 2; valign = GraphicsUtil.V_BOTTOM; } else if (labelLoc == Direction.SOUTH) { y = bds.getY() + bds.getHeight() + 2; valign = GraphicsUtil.V_TOP; } else if (labelLoc == Direction.EAST) { x = bds.getX() + bds.getWidth() + 2; halign = GraphicsUtil.H_LEFT; } else if (labelLoc == Direction.WEST) { x = bds.getX() - 2; halign = GraphicsUtil.H_RIGHT; } if (labelLoc == facing) { if (labelLoc == Direction.NORTH || labelLoc == Direction.SOUTH) { x += 2; halign = GraphicsUtil.H_LEFT; } else { y -= 2; valign = GraphicsUtil.V_BOTTOM; } } instance.setTextField(StdAttr.LABEL, StdAttr.LABEL_FONT, x, y, halign, valign); } @Override public void propagate(InstanceState state) { Value val = state.getPort(0); InstanceDataSingleton data = (InstanceDataSingleton) state.getData(); if (data == null) { state.setData(new InstanceDataSingleton(val)); } else { data.setValue(val); } } @Override public void paintGhost(InstancePainter painter) { Graphics g = painter.getGraphics(); Bounds bds = painter.getBounds(); GraphicsUtil.switchToWidth(g, 2); g.drawOval(bds.getX() + 1, bds.getY() + 1, bds.getWidth() - 2, bds.getHeight() - 2); } @Override public void paintInstance(InstancePainter painter) { InstanceDataSingleton data = (InstanceDataSingleton) painter.getData(); Value val = data == null ? Value.FALSE : (Value) data.getValue(); Bounds bds = painter.getBounds().expand(-1); Graphics g = painter.getGraphics(); if (painter.getShowState()) { Color onColor = painter.getAttributeValue(Io.ATTR_ON_COLOR); Color offColor = painter.getAttributeValue(Io.ATTR_OFF_COLOR); Boolean activ = painter.getAttributeValue(Io.ATTR_ACTIVE); Object desired = activ.booleanValue() ? Value.TRUE : Value.FALSE; g.setColor(val == desired ? onColor : offColor); g.fillOval(bds.getX(), bds.getY(), bds.getWidth(), bds.getHeight()); } g.setColor(Color.BLACK); GraphicsUtil.switchToWidth(g, 2); g.drawOval(bds.getX(), bds.getY(), bds.getWidth(), bds.getHeight()); GraphicsUtil.switchToWidth(g, 1); g.setColor(painter.getAttributeValue(Io.ATTR_LABEL_COLOR)); painter.drawLabel(); painter.drawPorts(); } public static class Logger extends InstanceLogger { @Override public String getLogName(InstanceState state, Object option) { return state.getAttributeValue(StdAttr.LABEL); } @Override public Value getLogValue(InstanceState state, Object option) { InstanceDataSingleton data = (InstanceDataSingleton) state.getData(); if (data == null) return Value.FALSE; return data.getValue() == Value.TRUE ? Value.TRUE : Value.FALSE; } } } logisim-2.7.1/src/com/cburch/logisim/std/io/KeyboardData.java0000644000175000017500000001261011446034562023743 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.io; import java.awt.FontMetrics; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.InstanceData; class KeyboardData implements InstanceData, Cloneable { private Value lastClock; private char[] buffer; private String str; private int bufferLength; private int cursorPos; private boolean dispValid; private int dispStart; private int dispEnd; public KeyboardData(int capacity) { lastClock = Value.UNKNOWN; buffer = new char[capacity]; clear(); } @Override public Object clone() { try { KeyboardData ret = (KeyboardData) super.clone(); ret.buffer = this.buffer.clone(); return ret; } catch (CloneNotSupportedException e) { return null; } } public Value setLastClock(Value newClock) { Value ret = lastClock; lastClock = newClock; return ret; } public boolean isDisplayValid() { return dispValid; } public int getDisplayStart() { return dispStart; } public int getDisplayEnd() { return dispEnd; } public int getCursorPosition() { return cursorPos; } public void updateBufferLength(int len) { synchronized(this) { char[] buf = buffer; int oldLen = buf.length; if (oldLen != len) { char[] newBuf = new char[len]; System.arraycopy(buf, 0, newBuf, 0, Math.min(len, oldLen)); if (len < oldLen) { if (bufferLength > len) bufferLength = len; if (cursorPos > len) cursorPos = len; } buffer = newBuf; str = null; dispValid = false; } } } @Override public String toString() { String s = str; if (s != null) return s; StringBuilder build = new StringBuilder(); char[] buf = buffer; int len = bufferLength; for (int i = 0; i < len; i++) { char c = buf[i]; build.append(Character.isISOControl(c) ? ' ' : c); } str = build.toString(); return str; } public char getChar(int pos) { return pos >= 0 && pos < bufferLength ? buffer[pos] : '\0'; } public int getNextSpecial(int pos) { char[] buf = buffer; int len = bufferLength; for (int i = pos; i < len; i++) { char c = buf[i]; if (Character.isISOControl(c)) return i; } return -1; } public void clear() { bufferLength = 0; cursorPos = 0; str = ""; dispValid = false; dispStart = 0; dispEnd = 0; } public char dequeue() { char[] buf = buffer; int len = bufferLength; if (len == 0) return '\0'; char ret = buf[0]; for (int i = 1; i < len; i++) buf[i - 1] = buf[i]; bufferLength = len - 1; int pos = cursorPos; if (pos > 0) cursorPos = pos - 1; str = null; dispValid = false; return ret; } public boolean insert(char value) { char[] buf = buffer; int len = bufferLength; if (len >= buf.length) return false; int pos = cursorPos; for (int i = len; i > pos; i--) buf[i] = buf[i - 1]; buf[pos] = value; bufferLength = len + 1; cursorPos = pos + 1; str = null; dispValid = false; return true; } public boolean delete() { char[] buf = buffer; int len = bufferLength; int pos = cursorPos; if (pos >= len) return false; for (int i = pos + 1; i < len; i++) buf[i - 1] = buf[i]; bufferLength = len - 1; str = null; dispValid = false; return true; } public boolean moveCursorBy(int delta) { int len = bufferLength; int pos = cursorPos; int newPos = pos + delta; if (newPos < 0 || newPos > len) return false; cursorPos = newPos; dispValid = false; return true; } public boolean setCursor(int value) { int len = bufferLength; if (value > len) value = len; int pos = cursorPos; if (pos == value) return false; cursorPos = value; dispValid = false; return true; } public void updateDisplay(FontMetrics fm) { if (dispValid) return; int pos = cursorPos; int i0 = dispStart; int i1 = dispEnd; String str = toString(); int len = str.length(); int max = Keyboard.WIDTH - 8 - 4; if (str.equals("") || fm.stringWidth(str) <= max) { i0 = 0; i1 = len; } else { // grow to include end of string if possible int w0 = fm.stringWidth(str.charAt(0) + "m"); int w1 = fm.stringWidth("m"); int w = i0 == 0 ? fm.stringWidth(str) : w0 + fm.stringWidth(str.substring(i0)); if (w <= max) i1 = len; // rearrange start/end so as to include cursor if (pos <= i0) { if (pos < i0) { i1 += pos - i0; i0 = pos; } if (pos == i0 && i0 > 0) { i0--; i1--; } } if (pos >= i1) { if (pos > i1) { i0 += pos - i1; i1 = pos; } if (pos == i1 && i1 < len) { i0++; i1++; } } if (i0 <= 2) i0 = 0; // resize segment to fit if (fits(fm, str, w0, w1, i0, i1, max)) { // maybe should grow while (fits(fm, str, w0, w1, i0, i1 + 1, max)) i1++; while (fits(fm, str, w0, w1, i0 - 1, i1, max)) i0--; } else { // should shrink if (pos < (i0 + i1) / 2) { i1--; while (!fits(fm, str, w0, w1, i0, i1, max)) i1--; } else { i0++; while (!fits(fm, str, w0, w1, i0, i1, max)) i0++; } } if (i0 == 1) i0 = 0; } dispStart = i0; dispEnd = i1; dispValid = true; } private boolean fits(FontMetrics fm, String str, int w0, int w1, int i0, int i1, int max) { if (i0 >= i1) return true; int len = str.length(); if (i0 < 0 || i1 > len) return false; int w = fm.stringWidth(str.substring(i0, i1)); if (i0 > 0) w += w0; if (i1 < str.length()) w += w1; return w <= max; } }logisim-2.7.1/src/com/cburch/logisim/std/io/Keyboard.java0000644000175000017500000002410511446034562023153 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.io; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.event.KeyEvent; import java.util.ArrayList; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.Attributes; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstancePoker; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; public class Keyboard extends InstanceFactory { private static final int CLR = 0; private static final int CK = 1; private static final int RE = 2; private static final int AVL = 3; private static final int OUT = 4; private static final int DELAY0 = 9; private static final int DELAY1 = 11; static final int WIDTH = 145; static final int HEIGHT = 25; private static final Font DEFAULT_FONT = new Font("monospaced", Font.PLAIN, 12); private static final char FORM_FEED = '\u000c'; // control-L private static final Attribute ATTR_BUFFER = Attributes.forIntegerRange("buflen", Strings.getter("keybBufferLengthAttr"), 1, 256); public Keyboard() { super("Keyboard", Strings.getter("keyboardComponent")); setAttributes(new Attribute[] { ATTR_BUFFER, StdAttr.EDGE_TRIGGER }, new Object[] { Integer.valueOf(32), StdAttr.TRIG_RISING }); setOffsetBounds(Bounds.create(0, -15, WIDTH, HEIGHT)); setIconName("keyboard.gif"); setInstancePoker(Poker.class); Port[] ps = new Port[5]; ps[CLR] = new Port( 20, 10, Port.INPUT, 1); ps[CK] = new Port( 0, 0, Port.INPUT, 1); ps[RE] = new Port( 10, 10, Port.INPUT, 1); ps[AVL] = new Port(130, 10, Port.OUTPUT, 1); ps[OUT] = new Port(140, 10, Port.OUTPUT, 7); ps[CLR].setToolTip(Strings.getter("keybClearTip")); ps[CK].setToolTip(Strings.getter("keybClockTip")); ps[RE].setToolTip(Strings.getter("keybEnableTip")); ps[AVL].setToolTip(Strings.getter("keybAvailTip")); ps[OUT].setToolTip(Strings.getter("keybOutputTip")); setPorts(ps); } @Override public void propagate(InstanceState circState) { Object trigger = circState.getAttributeValue(StdAttr.EDGE_TRIGGER); KeyboardData state = getKeyboardState(circState); Value clear = circState.getPort(CLR); Value clock = circState.getPort(CK); Value enable = circState.getPort(RE); char c; synchronized(state) { Value lastClock = state.setLastClock(clock); if (clear == Value.TRUE) { state.clear(); } else if (enable != Value.FALSE) { boolean go; if (trigger == StdAttr.TRIG_FALLING) { go = lastClock == Value.TRUE && clock == Value.FALSE; } else { go = lastClock == Value.FALSE && clock == Value.TRUE; } if (go) state.dequeue(); } c = state.getChar(0); } Value out = Value.createKnown(BitWidth.create(7), c & 0x7F); circState.setPort(OUT, out, DELAY0); circState.setPort(AVL, c != '\0' ? Value.TRUE : Value.FALSE, DELAY1); } @Override public void paintInstance(InstancePainter painter) { boolean showState = painter.getShowState(); Graphics g = painter.getGraphics(); painter.drawClock(CK, Direction.EAST); painter.drawBounds(); painter.drawPort(CLR); painter.drawPort(RE); painter.drawPort(AVL); painter.drawPort(OUT); if (showState) { String str; int dispStart; int dispEnd; ArrayList specials = new ArrayList(); FontMetrics fm = null; KeyboardData state = getKeyboardState(painter); synchronized(state) { str = state.toString(); for (int i = state.getNextSpecial(0); i >= 0; i = state.getNextSpecial(i + 1)) { char c = state.getChar(i); specials.add(Integer.valueOf(c << 16 | i)); } if (!state.isDisplayValid()) { fm = g.getFontMetrics(DEFAULT_FONT); state.updateDisplay(fm); } dispStart = state.getDisplayStart(); dispEnd = state.getDisplayEnd(); } if (str.length() > 0) { Bounds bds = painter.getBounds(); drawBuffer(g, fm, str, dispStart, dispEnd, specials, bds); } } else { Bounds bds = painter.getBounds(); int len = getBufferLength(painter.getAttributeValue(ATTR_BUFFER)); String str = Strings.get("keybDesc", "" + len); FontMetrics fm = g.getFontMetrics(); int x = bds.getX() + (WIDTH - fm.stringWidth(str)) / 2; int y = bds.getY() + (HEIGHT + fm.getAscent()) / 2; g.drawString(str, x, y); } } private void drawDots(Graphics g, int x, int y, int width, int ascent) { int r = width / 10; if (r < 1) r = 1; int d = 2 * r; if (2 * r + 1 * d <= width) g.fillOval(x + r, y - d, d, d); if (3 * r + 2 * d <= width) g.fillOval(x + 2 * r + d, y - d, d, d); if (5 * r + 3 * d <= width) g.fillOval(x + 3 * r + 2 * d, y - d, d, d); } private void drawBuffer(Graphics g, FontMetrics fm, String str, int dispStart, int dispEnd, ArrayList specials, Bounds bds) { int x = bds.getX(); int y = bds.getY(); g.setFont(DEFAULT_FONT); if (fm == null) fm = g.getFontMetrics(); int asc = fm.getAscent(); int x0 = x + 8; int ys = y + (HEIGHT + asc) / 2; int dotsWidth = fm.stringWidth("m"); int xs; if (dispStart > 0) { g.drawString(str.substring(0, 1), x0, ys); xs = x0 + fm.stringWidth(str.charAt(0) + "m"); drawDots(g, xs - dotsWidth, ys, dotsWidth, asc); String sub = str.substring(dispStart, dispEnd); g.drawString(sub, xs, ys); if (dispEnd < str.length()) { drawDots(g, xs + fm.stringWidth(sub), ys, dotsWidth, asc); } } else if (dispEnd < str.length()) { String sub = str.substring(dispStart, dispEnd); xs = x0; g.drawString(sub, xs, ys); drawDots(g, xs + fm.stringWidth(sub), ys, dotsWidth, asc); } else { xs = x0; g.drawString(str, xs, ys); } if (specials.size() > 0) { drawSpecials(specials, x0, xs, ys, asc, g, fm, str, dispStart, dispEnd); } } private void drawSpecials(ArrayList specials, int x0, int xs, int ys, int asc, Graphics g, FontMetrics fm, String str, int dispStart, int dispEnd) { int[] px = new int[3]; int[] py = new int[3]; for (Integer special : specials) { int code = special.intValue(); int pos = code & 0xFF; int w0; int w1; if (pos == 0) { w0 = x0; w1 = x0 + fm.stringWidth(str.substring(0, 1)); } else if (pos >= dispStart && pos < dispEnd) { w0 = xs + fm.stringWidth(str.substring(dispStart, pos)); w1 = xs + fm.stringWidth(str.substring(dispStart, pos + 1)); } else { continue; // this character is not in current view } w0++; w1--; int key = code >> 16; if (key == '\b') { int y1 = ys - asc / 2; g.drawLine(w0, y1, w1, y1); px[0] = w0 + 3; py[0] = y1 - 3; px[1] = w0; py[1] = y1; px[2] = w0 + 3; py[2] = y1 + 3; g.drawPolyline(px, py, 3); } else if (key == '\n') { int y1 = ys - 3; px[0] = w1; py[0] = ys - asc; px[1] = w1; py[1] = y1; px[2] = w0; py[2] = y1; g.drawPolyline(px, py, 3); px[0] = w0 + 3; py[0] = y1 - 3; px[1] = w0; py[1] = y1; px[2] = w0 + 3; py[2] = y1 + 3; g.drawPolyline(px, py, 3); } else if (key == FORM_FEED) { g.drawRect(w0, ys - asc, w1 - w0, asc); } } } private static int getBufferLength(Object bufferAttr) { if (bufferAttr instanceof Integer) return ((Integer) bufferAttr).intValue(); else return 32; } private static KeyboardData getKeyboardState(InstanceState state) { int bufLen = getBufferLength(state.getAttributeValue(ATTR_BUFFER)); KeyboardData ret = (KeyboardData) state.getData(); if (ret == null) { ret = new KeyboardData(bufLen); state.setData(ret); } else { ret.updateBufferLength(bufLen); } return ret; } public static void addToBuffer(InstanceState state, char[] newChars) { KeyboardData keyboardData = getKeyboardState(state); for (int i = 0; i < newChars.length; i++) { keyboardData.insert(newChars[i]); } } public static class Poker extends InstancePoker { @Override public void keyPressed(InstanceState state, KeyEvent e) { KeyboardData data = getKeyboardState(state); boolean changed = false; boolean used = true; synchronized(data) { switch (e.getKeyCode()) { case KeyEvent.VK_DELETE: changed = data.delete(); break; case KeyEvent.VK_LEFT: data.moveCursorBy(-1); break; case KeyEvent.VK_RIGHT: data.moveCursorBy(1); break; case KeyEvent.VK_HOME: data.setCursor(0); break; case KeyEvent.VK_END: data.setCursor(Integer.MAX_VALUE); break; default: used = false; } } if (used) e.consume(); if (changed) state.getInstance().fireInvalidated(); } @Override public void keyTyped(InstanceState state, KeyEvent e) { KeyboardData data = getKeyboardState(state); char ch = e.getKeyChar(); boolean changed = false; if (ch != KeyEvent.CHAR_UNDEFINED) { if (!Character.isISOControl(ch) || ch == '\b' || ch == '\n' || ch == FORM_FEED) { synchronized(data) { changed = data.insert(ch); } e.consume(); } } if (changed) state.getInstance().fireInvalidated(); } public void draw(InstancePainter painter) { KeyboardData data = getKeyboardState(painter); Bounds bds = painter.getInstance().getBounds(); Graphics g = painter.getGraphics(); FontMetrics fm = g.getFontMetrics(DEFAULT_FONT); String str; int cursor; int dispStart; synchronized(data) { str = data.toString(); cursor = data.getCursorPosition(); if (!data.isDisplayValid()) data.updateDisplay(fm); dispStart = data.getDisplayStart(); } int asc = fm.getAscent(); int x = bds.getX() + 8; if (dispStart > 0) { x += fm.stringWidth(str.charAt(0) + "m"); x += fm.stringWidth(str.substring(dispStart, cursor)); } else if (cursor >= str.length()) { x += fm.stringWidth(str); } else { x += fm.stringWidth(str.substring(0, cursor)); } int y = bds.getY() + (bds.getHeight() + asc) / 2; g.drawLine(x, y - asc, x, y); } } } logisim-2.7.1/src/com/cburch/logisim/std/io/Joystick.java0000644000175000017500000001204711455470136023215 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.io; import java.awt.Color; import java.awt.Graphics; import java.awt.event.MouseEvent; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.Attributes; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.InstanceData; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstancePoker; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.tools.key.BitWidthConfigurator; import com.cburch.logisim.util.GraphicsUtil; public class Joystick extends InstanceFactory { static final Attribute ATTR_WIDTH = Attributes.forBitWidth("bits", Strings.getter("ioBitWidthAttr"), 2, 5); public Joystick() { super("Joystick", Strings.getter("joystickComponent")); setAttributes(new Attribute[] { ATTR_WIDTH, Io.ATTR_COLOR }, new Object[] { BitWidth.create(4), Color.RED }); setKeyConfigurator(new BitWidthConfigurator(ATTR_WIDTH, 2, 5)); setOffsetBounds(Bounds.create(-30, -10, 30, 30)); setIconName("joystick.gif"); setPorts(new Port[] { new Port(0, 0, Port.OUTPUT, ATTR_WIDTH), new Port(0, 10, Port.OUTPUT, ATTR_WIDTH), }); setInstancePoker(Poker.class); } @Override public void propagate(InstanceState state) { BitWidth bits = state.getAttributeValue(ATTR_WIDTH); int dx; int dy; State s = (State) state.getData(); if (s == null) { dx = 0; dy = 0; } else { dx = s.xPos; dy = s.yPos; } int steps = (1 << bits.getWidth()) - 1; dx = (dx + 14) * steps / 29 + 1; dy = (dy + 14) * steps / 29 + 1; if (bits.getWidth() > 4) { if (dx >= steps / 2) dx++; if (dy >= steps / 2) dy++; } state.setPort(0, Value.createKnown(bits, dx), 1); state.setPort(1, Value.createKnown(bits, dy), 1); } @Override public void paintGhost(InstancePainter painter) { Graphics g = painter.getGraphics(); GraphicsUtil.switchToWidth(g, 2); g.drawRoundRect(-30, -10, 30, 30, 8, 8); } @Override public void paintInstance(InstancePainter painter) { Location loc = painter.getLocation(); int x = loc.getX(); int y = loc.getY(); Graphics g = painter.getGraphics(); g.drawRoundRect(x - 30, y - 10, 30, 30, 8, 8); g.drawRoundRect(x - 28, y - 8, 26, 26, 4, 4); drawBall(g, x - 15, y + 5, painter.getAttributeValue(Io.ATTR_COLOR), painter.shouldDrawColor()); painter.drawPorts(); } private static void drawBall(Graphics g, int x, int y, Color c, boolean inColor) { if (inColor) { g.setColor(c == null ? Color.RED : c); } else { int hue = c == null ? 128 : (c.getRed() + c.getGreen() + c.getBlue()) / 3; g.setColor(new Color(hue, hue, hue)); } GraphicsUtil.switchToWidth(g, 1); g.fillOval(x - 4, y - 4, 8, 8); g.setColor(Color.BLACK); g.drawOval(x - 4, y - 4, 8, 8); } private static class State implements InstanceData, Cloneable { private int xPos; private int yPos; public State(int x, int y) { xPos = x; yPos = y; } @Override public Object clone() { try { return super.clone(); } catch (CloneNotSupportedException e) { return null; } } } public static class Poker extends InstancePoker { @Override public void mousePressed(InstanceState state, MouseEvent e) { mouseDragged(state, e); } @Override public void mouseReleased(InstanceState state, MouseEvent e) { updateState(state, 0, 0); } @Override public void mouseDragged(InstanceState state, MouseEvent e) { Location loc = state.getInstance().getLocation(); int cx = loc.getX() - 15; int cy = loc.getY() + 5; updateState(state, e.getX() - cx, e.getY() - cy); } private void updateState(InstanceState state, int dx, int dy) { State s = (State) state.getData(); if (dx < -14) dx = -14; if (dy < -14) dy = -14; if (dx > 14) dx = 14; if (dy > 14) dy = 14; if (s == null) { s = new State(dx, dy); state.setData(s); } else { s.xPos = dx; s.yPos = dy; } state.getInstance().fireInvalidated(); } @Override public void paint(InstancePainter painter) { State state = (State) painter.getData(); if (state == null) { state = new State(0, 0); painter.setData(state); } Location loc = painter.getLocation(); int x = loc.getX(); int y = loc.getY(); Graphics g = painter.getGraphics(); g.setColor(Color.WHITE); g.fillRect(x - 20, y, 10, 10); GraphicsUtil.switchToWidth(g, 3); g.setColor(Color.BLACK); int dx = state.xPos; int dy = state.yPos; int x0 = x - 15 + (dx > 5 ? 1 : dx < -5 ? -1 : 0); int y0 = y + 5 + (dy > 5 ? 1 : dy < 0 ? -1 : 0); int x1 = x - 15 + dx; int y1 = y + 5 + dy; g.drawLine(x0, y0, x1, y1); Color ballColor = painter.getAttributeValue(Io.ATTR_COLOR); Joystick.drawBall(g, x1, y1, ballColor, true); } } } logisim-2.7.1/src/com/cburch/logisim/std/io/Io.java0000644000175000017500000000553111451010400021741 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.io; import java.awt.Color; import java.util.List; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeOption; import com.cburch.logisim.data.Attributes; import com.cburch.logisim.data.Direction; import com.cburch.logisim.tools.FactoryDescription; import com.cburch.logisim.tools.Library; import com.cburch.logisim.tools.Tool; public class Io extends Library { static final AttributeOption LABEL_CENTER = new AttributeOption("center", "center", Strings.getter("ioLabelCenter")); static final Attribute ATTR_COLOR = Attributes.forColor("color", Strings.getter("ioColorAttr")); static final Attribute ATTR_ON_COLOR = Attributes.forColor("color", Strings.getter("ioOnColor")); static final Attribute ATTR_OFF_COLOR = Attributes.forColor("offcolor", Strings.getter("ioOffColor")); static final Attribute ATTR_BACKGROUND = Attributes.forColor("bg", Strings.getter("ioBackgroundColor")); static final Attribute ATTR_LABEL_LOC = Attributes.forOption("labelloc", Strings.getter("ioLabelLocAttr"), new Object[] { LABEL_CENTER, Direction.NORTH, Direction.SOUTH, Direction.EAST, Direction.WEST }); static final Attribute ATTR_LABEL_COLOR = Attributes.forColor("labelcolor", Strings.getter("ioLabelColorAttr")); static final Attribute ATTR_ACTIVE = Attributes.forBoolean("active", Strings.getter("ioActiveAttr")); static final Color DEFAULT_BACKGROUND = new Color(255, 255, 255, 0); private static FactoryDescription[] DESCRIPTIONS = { new FactoryDescription("Button", Strings.getter("buttonComponent"), "button.gif", "Button"), new FactoryDescription("Joystick", Strings.getter("joystickComponent"), "joystick.gif", "Joystick"), new FactoryDescription("Keyboard", Strings.getter("keyboardComponent"), "keyboard.gif", "Keyboard"), new FactoryDescription("LED", Strings.getter("ledComponent"), "led.gif", "Led"), new FactoryDescription("7-Segment Display", Strings.getter("sevenSegmentComponent"), "7seg.gif", "SevenSegment"), new FactoryDescription("Hex Digit Display", Strings.getter("hexDigitComponent"), "hexdig.gif", "HexDigit"), new FactoryDescription("DotMatrix", Strings.getter("dotMatrixComponent"), "dotmat.gif", "DotMatrix"), new FactoryDescription("TTY", Strings.getter("ttyComponent"), "tty.gif", "Tty"), }; private List tools = null; public Io() { } @Override public String getName() { return "I/O"; } @Override public String getDisplayName() { return Strings.get("ioLibrary"); } @Override public List getTools() { if (tools == null) { tools = FactoryDescription.getTools(Io.class, DESCRIPTIONS); } return tools; } } logisim-2.7.1/src/com/cburch/logisim/std/io/HexDigit.java0000644000175000017500000000571711451010364023116 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.io; import java.awt.Color; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.InstanceDataSingleton; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; public class HexDigit extends InstanceFactory { public HexDigit() { super("Hex Digit Display", Strings.getter("hexDigitComponent")); setAttributes(new Attribute[] { Io.ATTR_ON_COLOR, Io.ATTR_OFF_COLOR, Io.ATTR_BACKGROUND }, new Object[] { new Color(240, 0, 0), SevenSegment.DEFAULT_OFF, Io.DEFAULT_BACKGROUND }); setPorts(new Port[] { new Port( 0, 0, Port.INPUT, 4), new Port(10, 0, Port.INPUT, 1) }); setOffsetBounds(Bounds.create(-15, -60, 40, 60)); setIconName("hexdig.gif"); } @Override public void propagate(InstanceState state) { int summary = 0; Value baseVal = state.getPort(0); if (baseVal == null) baseVal = Value.createUnknown(BitWidth.create(4)); int segs; // each nibble is one segment, in top-down, left-to-right // order: middle three nibbles are the three horizontal segments switch (baseVal.toIntValue()) { case 0: segs = 0x1110111; break; case 1: segs = 0x0000011; break; case 2: segs = 0x0111110; break; case 3: segs = 0x0011111; break; case 4: segs = 0x1001011; break; case 5: segs = 0x1011101; break; case 6: segs = 0x1111101; break; case 7: segs = 0x0010011; break; case 8: segs = 0x1111111; break; case 9: segs = 0x1011011; break; case 10: segs = 0x1111011; break; case 11: segs = 0x1101101; break; case 12: segs = 0x1110100; break; case 13: segs = 0x0101111; break; case 14: segs = 0x1111100; break; case 15: segs = 0x1111000; break; default: segs = 0x0001000; break; // a dash '-' } if ((segs & 0x1) != 0) summary |= 4; // vertical seg in bottom right if ((segs & 0x10) != 0) summary |= 2; // vertical seg in top right if ((segs & 0x100) != 0) summary |= 8; // horizontal seg at bottom if ((segs & 0x1000) != 0) summary |= 64; // horizontal seg at middle if ((segs & 0x10000) != 0) summary |= 1; // horizontal seg at top if ((segs & 0x100000) != 0) summary |= 16; // vertical seg at bottom left if ((segs & 0x1000000) != 0) summary |= 32; // vertical seg at top left if (state.getPort(1) == Value.TRUE) summary |= 128; Object value = Integer.valueOf(summary); InstanceDataSingleton data = (InstanceDataSingleton) state.getData(); if (data == null) { state.setData(new InstanceDataSingleton(value)); } else { data.setValue(value); } } @Override public void paintInstance(InstancePainter painter) { SevenSegment.drawBase(painter); } } logisim-2.7.1/src/com/cburch/logisim/std/io/DotMatrix.java0000644000175000017500000002360311532247702023326 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.io; import java.awt.Color; import java.awt.Graphics; import java.util.Arrays; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeOption; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Attributes; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceData; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.std.wiring.DurationAttribute; import com.cburch.logisim.util.GraphicsUtil; // TODO repropagate when rows/cols change public class DotMatrix extends InstanceFactory { static final AttributeOption INPUT_SELECT = new AttributeOption("select", Strings.getter("ioInputSelect")); static final AttributeOption INPUT_COLUMN = new AttributeOption("column", Strings.getter("ioInputColumn")); static final AttributeOption INPUT_ROW = new AttributeOption("row", Strings.getter("ioInputRow")); static final AttributeOption SHAPE_CIRCLE = new AttributeOption("circle", Strings.getter("ioShapeCircle")); static final AttributeOption SHAPE_SQUARE = new AttributeOption("square", Strings.getter("ioShapeSquare")); static final Attribute ATTR_INPUT_TYPE = Attributes.forOption("inputtype", Strings.getter("ioMatrixInput"), new AttributeOption[] { INPUT_COLUMN, INPUT_ROW, INPUT_SELECT }); static final Attribute ATTR_MATRIX_COLS = Attributes.forIntegerRange("matrixcols", Strings.getter("ioMatrixCols"), 1, Value.MAX_WIDTH); static final Attribute ATTR_MATRIX_ROWS = Attributes.forIntegerRange("matrixrows", Strings.getter("ioMatrixRows"), 1, Value.MAX_WIDTH); static final Attribute ATTR_DOT_SHAPE = Attributes.forOption("dotshape", Strings.getter("ioMatrixShape"), new AttributeOption[] { SHAPE_CIRCLE, SHAPE_SQUARE }); static final Attribute ATTR_PERSIST = new DurationAttribute("persist", Strings.getter("ioMatrixPersistenceAttr"), 0, Integer.MAX_VALUE); public DotMatrix() { super("DotMatrix", Strings.getter("dotMatrixComponent")); setAttributes(new Attribute[] { ATTR_INPUT_TYPE, ATTR_MATRIX_COLS, ATTR_MATRIX_ROWS, Io.ATTR_ON_COLOR, Io.ATTR_OFF_COLOR, ATTR_PERSIST, ATTR_DOT_SHAPE }, new Object[] { INPUT_COLUMN, Integer.valueOf(5), Integer.valueOf(7), Color.GREEN, Color.DARK_GRAY, Integer.valueOf(0), SHAPE_SQUARE }); setIconName("dotmat.gif"); } @Override public Bounds getOffsetBounds(AttributeSet attrs) { Object input = attrs.getValue(ATTR_INPUT_TYPE); int cols = attrs.getValue(ATTR_MATRIX_COLS).intValue(); int rows = attrs.getValue(ATTR_MATRIX_ROWS).intValue(); if (input == INPUT_COLUMN) { return Bounds.create(-5, -10 * rows, 10 * cols, 10 * rows); } else if (input == INPUT_ROW) { return Bounds.create(0, -5, 10 * cols, 10 * rows); } else { // input == INPUT_SELECT if (rows == 1) { return Bounds.create(0, -5, 10 * cols, 10 * rows); } else { return Bounds.create(0, -5 * rows + 5, 10 * cols, 10 * rows); } } } @Override protected void configureNewInstance(Instance instance) { instance.addAttributeListener(); updatePorts(instance); } @Override protected void instanceAttributeChanged(Instance instance, Attribute attr) { if (attr == ATTR_MATRIX_ROWS || attr == ATTR_MATRIX_COLS || attr == ATTR_INPUT_TYPE) { instance.recomputeBounds(); updatePorts(instance); } } private void updatePorts(Instance instance) { Object input = instance.getAttributeValue(ATTR_INPUT_TYPE); int rows = instance.getAttributeValue(ATTR_MATRIX_ROWS).intValue(); int cols = instance.getAttributeValue(ATTR_MATRIX_COLS).intValue(); Port[] ps; if (input == INPUT_COLUMN) { ps = new Port[cols]; for (int i = 0; i < cols; i++) { ps[i] = new Port(10 * i, 0, Port.INPUT, rows); } } else if (input == INPUT_ROW) { ps = new Port[rows]; for (int i = 0; i < rows; i++) { ps[i] = new Port(0, 10 * i, Port.INPUT, cols); } } else { if (rows <= 1) { ps = new Port[] { new Port(0, 0, Port.INPUT, cols) }; } else if (cols <= 1) { ps = new Port[] { new Port(0, 0, Port.INPUT, rows) }; } else { ps = new Port[] { new Port(0, 0, Port.INPUT, cols), new Port(0, 10, Port.INPUT, rows) }; } } instance.setPorts(ps); } private State getState(InstanceState state) { int rows = state.getAttributeValue(ATTR_MATRIX_ROWS).intValue(); int cols = state.getAttributeValue(ATTR_MATRIX_COLS).intValue(); long clock = state.getTickCount(); State data = (State) state.getData(); if (data == null) { data = new State(rows, cols, clock); state.setData(data); } else { data.updateSize(rows, cols, clock); } return data; } @Override public void propagate(InstanceState state) { Object type = state.getAttributeValue(ATTR_INPUT_TYPE); int rows = state.getAttributeValue(ATTR_MATRIX_ROWS).intValue(); int cols = state.getAttributeValue(ATTR_MATRIX_COLS).intValue(); long clock = state.getTickCount(); long persist = clock + state.getAttributeValue(ATTR_PERSIST).intValue(); State data = getState(state); if (type == INPUT_ROW) { for (int i = 0; i < rows; i++) { data.setRow(i, state.getPort(i), persist); } } else if (type == INPUT_COLUMN) { for (int i = 0; i < cols; i++) { data.setColumn(i, state.getPort(i), persist); } } else if (type == INPUT_SELECT) { data.setSelect(state.getPort(1), state.getPort(0), persist); } else { throw new RuntimeException("unexpected matrix type"); } } @Override public void paintInstance(InstancePainter painter) { Color onColor = painter.getAttributeValue(Io.ATTR_ON_COLOR); Color offColor = painter.getAttributeValue(Io.ATTR_OFF_COLOR); boolean drawSquare = painter.getAttributeValue(ATTR_DOT_SHAPE) == SHAPE_SQUARE; State data = getState(painter); long ticks = painter.getTickCount(); Bounds bds = painter.getBounds(); boolean showState = painter.getShowState(); Graphics g = painter.getGraphics(); int rows = data.rows; int cols = data.cols; for (int j = 0; j < rows; j++) { for (int i = 0; i < cols; i++) { int x = bds.getX() + 10 * i; int y = bds.getY() + 10 * j; if (showState) { Value val = data.get(j, i, ticks); Color c; if (val == Value.TRUE) c = onColor; else if (val == Value.FALSE) c = offColor; else c = Value.ERROR_COLOR; g.setColor(c); if (drawSquare) g.fillRect(x, y, 10, 10); else g.fillOval(x + 1, y + 1, 8, 8); } else { g.setColor(Color.GRAY); g.fillOval(x + 1, y + 1, 8, 8); } } } g.setColor(Color.BLACK); GraphicsUtil.switchToWidth(g, 2); g.drawRect(bds.getX(), bds.getY(), bds.getWidth(), bds.getHeight()); GraphicsUtil.switchToWidth(g, 1); painter.drawPorts(); } private static class State implements InstanceData, Cloneable { private int rows; private int cols; private Value[] grid; private long[] persistTo; public State(int rows, int cols, long curClock) { this.rows = -1; this.cols = -1; updateSize(rows, cols, curClock); } @Override public Object clone() { try { State ret = (State) super.clone(); ret.grid = this.grid.clone(); ret.persistTo = this.persistTo.clone(); return ret; } catch (CloneNotSupportedException e) { return null; } } private void updateSize(int rows, int cols, long curClock) { if (this.rows != rows || this.cols != cols) { this.rows = rows; this.cols = cols; int length = rows * cols; grid = new Value[length]; persistTo = new long[length]; Arrays.fill(grid, Value.UNKNOWN); Arrays.fill(persistTo, curClock - 1); } } private Value get(int row, int col, long curTick) { int index = row * cols + col; Value ret = grid[index]; if (ret == Value.FALSE && persistTo[index] - curTick >= 0) { ret = Value.TRUE; } return ret; } private void setRow(int index, Value rowVector, long persist) { int gridloc = (index + 1) * cols - 1; int stride = -1; Value[] vals = rowVector.getAll(); for (int i = 0; i < vals.length; i++, gridloc += stride) { Value val = vals[i]; if (grid[gridloc] == Value.TRUE) { persistTo[gridloc] = persist - 1; } grid[gridloc] = vals[i]; if (val == Value.TRUE) { persistTo[gridloc] = persist; } } } private void setColumn(int index, Value colVector, long persist) { int gridloc = (rows - 1) * cols + index; int stride = -cols; Value[] vals = colVector.getAll(); for (int i = 0; i < vals.length; i++, gridloc += stride) { Value val = vals[i]; if (grid[gridloc] == Value.TRUE) { persistTo[gridloc] = persist - 1; } grid[gridloc] = val; if (val == Value.TRUE) { persistTo[gridloc] = persist; } } } private void setSelect(Value rowVector, Value colVector, long persist) { Value[] rowVals = rowVector.getAll(); Value[] colVals = colVector.getAll(); int gridloc = 0; for (int i = rowVals.length - 1; i >= 0; i--) { Value wholeRow = rowVals[i]; if (wholeRow == Value.TRUE) { for (int j = colVals.length - 1; j >= 0; j--, gridloc++) { Value val = colVals[colVals.length - 1 - j]; if (grid[gridloc] == Value.TRUE) { persistTo[gridloc] = persist - 1; } grid[gridloc] = val; if (val == Value.TRUE) { persistTo[gridloc] = persist; } } } else { if (wholeRow != Value.FALSE) wholeRow = Value.ERROR; for (int j = colVals.length - 1; j >= 0; j--, gridloc++) { if (grid[gridloc] == Value.TRUE) { persistTo[gridloc] = persist - 1; } grid[gridloc] = wholeRow; } } } } } } logisim-2.7.1/src/com/cburch/logisim/std/io/Button.java0000644000175000017500000001555011446034562022672 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.io; import java.awt.Color; import java.awt.Graphics; import java.awt.event.MouseEvent; import com.cburch.logisim.circuit.Wire; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceDataSingleton; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstanceLogger; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstancePoker; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.util.GraphicsUtil; public class Button extends InstanceFactory { private static final int DEPTH = 3; public Button() { super("Button", Strings.getter("buttonComponent")); setAttributes(new Attribute[] { StdAttr.FACING, Io.ATTR_COLOR, StdAttr.LABEL, Io.ATTR_LABEL_LOC, StdAttr.LABEL_FONT, Io.ATTR_LABEL_COLOR }, new Object[] { Direction.EAST, Color.WHITE, "", Io.LABEL_CENTER, StdAttr.DEFAULT_LABEL_FONT, Color.BLACK }); setFacingAttribute(StdAttr.FACING); setIconName("button.gif"); setPorts(new Port[] { new Port(0, 0, Port.OUTPUT, 1) }); setInstancePoker(Poker.class); setInstanceLogger(Logger.class); } @Override public Bounds getOffsetBounds(AttributeSet attrs) { Direction facing = attrs.getValue(StdAttr.FACING); return Bounds.create(-20, -10, 20, 20).rotate(Direction.EAST, facing, 0, 0); } @Override protected void configureNewInstance(Instance instance) { instance.addAttributeListener(); computeTextField(instance); } @Override protected void instanceAttributeChanged(Instance instance, Attribute attr) { if (attr == StdAttr.FACING) { instance.recomputeBounds(); computeTextField(instance); } else if (attr == Io.ATTR_LABEL_LOC) { computeTextField(instance); } } private void computeTextField(Instance instance) { Direction facing = instance.getAttributeValue(StdAttr.FACING); Object labelLoc = instance.getAttributeValue(Io.ATTR_LABEL_LOC); Bounds bds = instance.getBounds(); int x = bds.getX() + bds.getWidth() / 2; int y = bds.getY() + bds.getHeight() / 2; int halign = GraphicsUtil.H_CENTER; int valign = GraphicsUtil.V_CENTER; if (labelLoc == Io.LABEL_CENTER) { x = bds.getX() + (bds.getWidth() - DEPTH) / 2; y = bds.getY() + (bds.getHeight() - DEPTH) / 2; } else if (labelLoc == Direction.NORTH) { y = bds.getY() - 2; valign = GraphicsUtil.V_BOTTOM; } else if (labelLoc == Direction.SOUTH) { y = bds.getY() + bds.getHeight() + 2; valign = GraphicsUtil.V_TOP; } else if (labelLoc == Direction.EAST) { x = bds.getX() + bds.getWidth() + 2; halign = GraphicsUtil.H_LEFT; } else if (labelLoc == Direction.WEST) { x = bds.getX() - 2; halign = GraphicsUtil.H_RIGHT; } if (labelLoc == facing) { if (labelLoc == Direction.NORTH || labelLoc == Direction.SOUTH) { x += 2; halign = GraphicsUtil.H_LEFT; } else { y -= 2; valign = GraphicsUtil.V_BOTTOM; } } instance.setTextField(StdAttr.LABEL, StdAttr.LABEL_FONT, x, y, halign, valign); } @Override public void propagate(InstanceState state) { InstanceDataSingleton data = (InstanceDataSingleton) state.getData(); Value val = data == null ? Value.FALSE : (Value) data.getValue(); state.setPort(0, val, 1); } @Override public void paintInstance(InstancePainter painter) { Bounds bds = painter.getBounds(); int x = bds.getX(); int y = bds.getY(); int w = bds.getWidth(); int h = bds.getHeight(); Value val; if (painter.getShowState()) { InstanceDataSingleton data = (InstanceDataSingleton) painter.getData(); val = data == null ? Value.FALSE : (Value) data.getValue(); } else { val = Value.FALSE; } Color color = painter.getAttributeValue(Io.ATTR_COLOR); if (!painter.shouldDrawColor()) { int hue = (color.getRed() + color.getGreen() + color.getBlue()) / 3; color = new Color(hue, hue, hue); } Graphics g = painter.getGraphics(); int depress; if (val == Value.TRUE) { x += DEPTH; y += DEPTH; Object labelLoc = painter.getAttributeValue(Io.ATTR_LABEL_LOC); if (labelLoc == Io.LABEL_CENTER || labelLoc == Direction.NORTH || labelLoc == Direction.WEST) { depress = DEPTH; } else { depress = 0; } Object facing = painter.getAttributeValue(StdAttr.FACING); if (facing == Direction.NORTH || facing == Direction.WEST) { Location p = painter.getLocation(); int px = p.getX(); int py = p.getY(); GraphicsUtil.switchToWidth(g, Wire.WIDTH); g.setColor(Value.TRUE_COLOR); if (facing == Direction.NORTH) g.drawLine(px, py, px, py + 10); else g.drawLine(px, py, px + 10, py); GraphicsUtil.switchToWidth(g, 1); } g.setColor(color); g.fillRect(x, y, w - DEPTH, h - DEPTH); g.setColor(Color.BLACK); g.drawRect(x, y, w - DEPTH, h - DEPTH); } else { depress = 0; int[] xp = new int[] { x, x + w - DEPTH, x + w, x + w, x + DEPTH, x }; int[] yp = new int[] { y, y, y + DEPTH, y + h, y + h, y + h - DEPTH }; g.setColor(color.darker()); g.fillPolygon(xp, yp, xp.length); g.setColor(color); g.fillRect(x, y, w - DEPTH, h - DEPTH); g.setColor(Color.BLACK); g.drawRect(x, y, w - DEPTH, h - DEPTH); g.drawLine(x + w - DEPTH, y + h - DEPTH, x + w, y + h); g.drawPolygon(xp, yp, xp.length); } g.translate(depress, depress); g.setColor(painter.getAttributeValue(Io.ATTR_LABEL_COLOR)); painter.drawLabel(); g.translate(-depress, -depress); painter.drawPorts(); } public static class Poker extends InstancePoker { @Override public void mousePressed(InstanceState state, MouseEvent e) { setValue(state, Value.TRUE); } @Override public void mouseReleased(InstanceState state, MouseEvent e) { setValue(state, Value.FALSE); } private void setValue(InstanceState state, Value val) { InstanceDataSingleton data = (InstanceDataSingleton) state.getData(); if (data == null) { state.setData(new InstanceDataSingleton(val)); } else { data.setValue(val); } state.getInstance().fireInvalidated(); } } public static class Logger extends InstanceLogger { @Override public String getLogName(InstanceState state, Object option) { return state.getAttributeValue(StdAttr.LABEL); } @Override public Value getLogValue(InstanceState state, Object option) { InstanceDataSingleton data = (InstanceDataSingleton) state.getData(); return data == null ? Value.FALSE : (Value) data.getValue(); } } } logisim-2.7.1/src/com/cburch/logisim/std/gates/0000755000175000017500000000000011535206224021235 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/logisim/std/gates/XorGate.java0000644000175000017500000000570311500267056023460 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.gates; import java.awt.Graphics; import com.cburch.logisim.analyze.model.Expression; import com.cburch.logisim.analyze.model.Expressions; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.tools.WireRepairData; import com.cburch.logisim.util.GraphicsUtil; class XorGate extends AbstractGate { public static XorGate FACTORY = new XorGate(); private XorGate() { super("XOR Gate", Strings.getter("xorGateComponent"), true); setAdditionalWidth(10); setIconNames("xorGate.gif", "xorGateRect.gif", "dinXorGate.gif"); setPaintInputLines(true); } @Override public String getRectangularLabel(AttributeSet attrs) { if (attrs == null) return ""; boolean isOdd = false; Object behavior = attrs.getValue(GateAttributes.ATTR_XOR); if (behavior == GateAttributes.XOR_ODD) { Object inputs = attrs.getValue(GateAttributes.ATTR_INPUTS); if (inputs == null || ((Integer) inputs).intValue() != 2) { isOdd = true; } } return isOdd ? "2k+1" : "=1"; } @Override public void paintIconShaped(InstancePainter painter) { Graphics g = painter.getGraphics(); GraphicsUtil.drawCenteredArc(g, 2, -5, 22, -90, 53); GraphicsUtil.drawCenteredArc(g, 2, 23, 22, 90, -53); GraphicsUtil.drawCenteredArc(g, -10, 9, 16, -30, 60); GraphicsUtil.drawCenteredArc(g, -12, 9, 16, -30, 60); } @Override protected void paintShape(InstancePainter painter, int width, int height) { PainterShaped.paintXor(painter, width, height); } @Override protected void paintDinShape(InstancePainter painter, int width, int height, int inputs) { PainterDin.paintXor(painter, width, height, false); } @Override protected Value computeOutput(Value[] inputs, int numInputs, InstanceState state) { Object behavior = state.getAttributeValue(GateAttributes.ATTR_XOR); if (behavior == GateAttributes.XOR_ODD) { return GateFunctions.computeOddParity(inputs, numInputs); } else { return GateFunctions.computeExactlyOne(inputs, numInputs); } } @Override protected boolean shouldRepairWire(Instance instance, WireRepairData data) { return !data.getPoint().equals(instance.getLocation()); } @Override protected Expression computeExpression(Expression[] inputs, int numInputs) { return xorExpression(inputs, numInputs); } @Override protected Value getIdentity() { return Value.FALSE; } protected static Expression xorExpression(Expression[] inputs, int numInputs) { if (numInputs > 2) { throw new UnsupportedOperationException("XorGate"); } Expression ret = inputs[0]; for (int i = 1; i < numInputs; i++) { ret = Expressions.xor(ret, inputs[i]); } return ret; } } logisim-2.7.1/src/com/cburch/logisim/std/gates/XnorGate.java0000644000175000017500000000473011500267066023636 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.gates; import java.awt.Graphics; import com.cburch.logisim.analyze.model.Expression; import com.cburch.logisim.analyze.model.Expressions; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.tools.WireRepairData; import com.cburch.logisim.util.GraphicsUtil; class XnorGate extends AbstractGate { public static XnorGate FACTORY = new XnorGate(); private XnorGate() { super("XNOR Gate", Strings.getter("xnorGateComponent"), true); setNegateOutput(true); setAdditionalWidth(10); setIconNames("xnorGate.gif", "xnorGateRect.gif", "dinXnorGate.gif"); setPaintInputLines(true); } @Override protected String getRectangularLabel(AttributeSet attrs) { return XorGate.FACTORY.getRectangularLabel(attrs); } @Override public void paintIconShaped(InstancePainter painter) { Graphics g = painter.getGraphics(); GraphicsUtil.drawCenteredArc(g, 0, - 5, 22, -90, 53); GraphicsUtil.drawCenteredArc(g, 0, 23, 22, 90, -53); GraphicsUtil.drawCenteredArc(g, -8, 9, 16, -30, 60); GraphicsUtil.drawCenteredArc(g, -10, 9, 16, -30, 60); g.drawOval(16, 8, 4, 4); } @Override protected void paintShape(InstancePainter painter, int width, int height) { PainterShaped.paintXor(painter, width, height); } @Override protected void paintDinShape(InstancePainter painter, int width, int height, int inputs) { PainterDin.paintXnor(painter, width, height, false); } @Override protected Value computeOutput(Value[] inputs, int numInputs, InstanceState state) { Object behavior = state.getAttributeValue(GateAttributes.ATTR_XOR); if (behavior == GateAttributes.XOR_ODD) { return GateFunctions.computeOddParity(inputs, numInputs).not(); } else { return GateFunctions.computeExactlyOne(inputs, numInputs).not(); } } @Override protected boolean shouldRepairWire(Instance instance, WireRepairData data) { return !data.getPoint().equals(instance.getLocation()); } @Override protected Expression computeExpression(Expression[] inputs, int numInputs) { return Expressions.not(XorGate.xorExpression(inputs, numInputs)); } @Override protected Value getIdentity() { return Value.FALSE; } } logisim-2.7.1/src/com/cburch/logisim/std/gates/Strings.java0000644000175000017500000000103011446034560023526 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.gates; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.StringGetter; class Strings { private static LocaleManager source = new LocaleManager("resources/logisim", "std"); public static String get(String key) { return source.get(key); } public static StringGetter getter(String key) { return source.getter(key); } } logisim-2.7.1/src/com/cburch/logisim/std/gates/PainterShaped.java0000644000175000017500000002257611446034560024646 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.gates; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.geom.GeneralPath; import java.awt.geom.Point2D; import java.util.HashMap; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.util.GraphicsUtil; public class PainterShaped { private static final GeneralPath PATH_NARROW; private static final GeneralPath PATH_MEDIUM; private static final GeneralPath PATH_WIDE; private static final GeneralPath SHIELD_NARROW; private static final GeneralPath SHIELD_MEDIUM; private static final GeneralPath SHIELD_WIDE; static { PATH_NARROW = new GeneralPath(); PATH_NARROW.moveTo(0, 0); PATH_NARROW.quadTo(-10, -15, -30, -15); PATH_NARROW.quadTo(-22, 0, -30, 15); PATH_NARROW.quadTo(-10, 15, 0, 0); PATH_NARROW.closePath(); PATH_MEDIUM = new GeneralPath(); PATH_MEDIUM.moveTo(0, 0); PATH_MEDIUM.quadTo(-20, -25, -50, -25); PATH_MEDIUM.quadTo(-37, 0, -50, 25); PATH_MEDIUM.quadTo(-20, 25, 0, 0); PATH_MEDIUM.closePath(); PATH_WIDE = new GeneralPath(); PATH_WIDE.moveTo(0, 0); PATH_WIDE.quadTo(-25, -35, -70, -35); PATH_WIDE.quadTo(-50, 0, -70, 35); PATH_WIDE.quadTo(-25, 35, 0, 0); PATH_WIDE.closePath(); SHIELD_NARROW = new GeneralPath(); SHIELD_NARROW.moveTo(-30, -15); SHIELD_NARROW.quadTo(-22, 0, -30, 15); SHIELD_MEDIUM = new GeneralPath(); SHIELD_MEDIUM.moveTo(-50, -25); SHIELD_MEDIUM.quadTo(-37, 0, -50, 25); SHIELD_WIDE = new GeneralPath(); SHIELD_WIDE.moveTo(-70, -35); SHIELD_WIDE.quadTo(-50, 0, -70, 35); } private PainterShaped() { } private static HashMap INPUT_LENGTHS = new HashMap(); static void paintAnd(InstancePainter painter, int width, int height) { Graphics g = painter.getGraphics(); GraphicsUtil.switchToWidth(g, 2); int[] xp = new int[] { -width / 2, -width + 1, -width + 1, -width / 2 }; int[] yp = new int[] { -width / 2, -width / 2, width / 2, width / 2 }; GraphicsUtil.drawCenteredArc(g, -width / 2, 0, width / 2, -90, 180); g.drawPolyline(xp, yp, 4); if (height > width) { g.drawLine(-width + 1, -height / 2, -width + 1, height / 2); } } static void paintOr(InstancePainter painter, int width, int height) { Graphics g = painter.getGraphics(); GraphicsUtil.switchToWidth(g, 2); /* The following, used previous to version 2.5.1, didn't use GeneralPath g.setColor(Color.LIGHT_GRAY); if (width < 40) { GraphicsUtil.drawCenteredArc(g, -30, -21, 36, -90, 53); GraphicsUtil.drawCenteredArc(g, -30, 21, 36, 90, -53); } else if (width < 60) { GraphicsUtil.drawCenteredArc(g, -50, -37, 62, -90, 53); GraphicsUtil.drawCenteredArc(g, -50, 37, 62, 90, -53); } else { GraphicsUtil.drawCenteredArc(g, -70, -50, 85, -90, 53); GraphicsUtil.drawCenteredArc(g, -70, 50, 85, 90, -53); } paintShield(g, -width, 0, width, height); */ GeneralPath path; if (width < 40) { path = PATH_NARROW; } else if (width < 60) { path = PATH_MEDIUM; } else { path = PATH_WIDE; } ((Graphics2D) g).draw(path); if (height > width) { paintShield(g, 0, width, height); } } static void paintNot(InstancePainter painter) { Graphics g = painter.getGraphics(); GraphicsUtil.switchToWidth(g, 2); if (painter.getAttributeValue(NotGate.ATTR_SIZE) == NotGate.SIZE_NARROW) { GraphicsUtil.switchToWidth(g, 2); int[] xp = new int[4]; int[] yp = new int[4]; xp[0] = -6; yp[0] = 0; xp[1] = -19; yp[1] = -6; xp[2] = -19; yp[2] = 6; xp[3] = -6; yp[3] = 0; g.drawPolyline(xp, yp, 4); g.drawOval(-6, -3, 6, 6); } else { int[] xp = new int[4]; int[] yp = new int[4]; xp[0] = -10; yp[0] = 0; xp[1] = -29; yp[1] = -7; xp[2] = -29; yp[2] = 7; xp[3] = -10; yp[3] = 0; g.drawPolyline(xp, yp, 4); g.drawOval(-9, -4, 9, 9); } } static void paintXor(InstancePainter painter, int width, int height) { Graphics g = painter.getGraphics(); paintOr(painter, width - 10, width - 10); paintShield(g, -10, width - 10, height); } private static void paintShield(Graphics g, int xlate, int width, int height) { GraphicsUtil.switchToWidth(g, 2); g.translate(xlate, 0); ((Graphics2D) g).draw(computeShield(width, height)); g.translate(-xlate, 0); /* The following, used previous to version 2.5.1, didn't use GeneralPath if (width < 40) { GraphicsUtil.drawCenteredArc(g, x - 26, y, 30, -30, 60); } else if (width < 60) { GraphicsUtil.drawCenteredArc(g, x - 43, y, 50, -30, 60); } else { GraphicsUtil.drawCenteredArc(g, x - 60, y, 70, -30, 60); } if (height > width) { // we need to draw the shield GraphicsUtil.drawCenteredArc(g, x - dx, y - (width + extra) / 2, extra, -30, 60); GraphicsUtil.drawCenteredArc(g, x - dx, y + (width + extra) / 2, extra, -30, 60); } */ } private static GeneralPath computeShield(int width, int height) { GeneralPath base; if (width < 40) { base = SHIELD_NARROW; } else if (width < 60) { base = SHIELD_MEDIUM; } else { base = SHIELD_WIDE; } if (height <= width) { // no wings return base; } else { // we need to add wings int wingHeight = (height - width) / 2; int dx = Math.min(20, wingHeight / 4); GeneralPath path = new GeneralPath(); path.moveTo(-width, -height / 2); path.quadTo(-width + dx, -(width + height) / 4, -width, -width / 2); path.append(base, true); path.quadTo(-width + dx, (width + height) / 4, -width, height / 2); return path; } } static void paintInputLines(InstancePainter painter, AbstractGate factory) { Location loc = painter.getLocation(); boolean printView = painter.isPrintView(); GateAttributes attrs = (GateAttributes) painter.getAttributeSet(); Direction facing = attrs.facing; int inputs = attrs.inputs; int negated = attrs.negated; int[] lengths = getInputLineLengths(attrs, factory); if (painter.getInstance() == null) { // drawing ghost - negation bubbles only for (int i = 0; i < inputs; i++) { boolean iNegated = ((negated >> i) & 1) == 1; if (iNegated) { Location offs = factory.getInputOffset(attrs, i); Location loci = loc.translate(offs.getX(), offs.getY()); Location cent = loci.translate(facing, lengths[i] + 5); painter.drawDongle(cent.getX(), cent.getY()); } } } else { Graphics g = painter.getGraphics(); Color baseColor = g.getColor(); GraphicsUtil.switchToWidth(g, 3); for (int i = 0; i < inputs; i++) { Location offs = factory.getInputOffset(attrs, i); Location src = loc.translate(offs.getX(), offs.getY()); int len = lengths[i]; if (len != 0 && (!printView || painter.isPortConnected(i + 1))) { if (painter.getShowState()) { Value val = painter.getPort(i + 1); g.setColor(val.getColor()); } else { g.setColor(baseColor); } Location dst = src.translate(facing, len); g.drawLine(src.getX(), src.getY(), dst.getX(), dst.getY()); } if (((negated >> i) & 1) == 1) { Location cent = src.translate(facing, lengths[i] + 5); g.setColor(baseColor); painter.drawDongle(cent.getX(), cent.getY()); GraphicsUtil.switchToWidth(g, 3); } } } } private static int[] getInputLineLengths(GateAttributes attrs, AbstractGate factory) { int inputs = attrs.inputs; int mainHeight = ((Integer) attrs.size.getValue()).intValue(); Integer key = Integer.valueOf(inputs * 31 + mainHeight); Object ret = INPUT_LENGTHS.get(key); if (ret != null) { return (int[]) ret; } Direction facing = attrs.facing; if (facing != Direction.EAST) { attrs = (GateAttributes) attrs.clone(); attrs.facing = Direction.EAST; } int[] lengths = new int[inputs]; INPUT_LENGTHS.put(key, lengths); int width = mainHeight; Location loc0 = OrGate.FACTORY.getInputOffset(attrs, 0); Location locn = OrGate.FACTORY.getInputOffset(attrs, inputs - 1); int totalHeight = 10 + loc0.manhattanDistanceTo(locn); if (totalHeight < width) totalHeight = width; GeneralPath path = computeShield(width, totalHeight); for (int i = 0; i < inputs; i++) { Location loci = OrGate.FACTORY.getInputOffset(attrs, i); Point2D p = new Point2D.Float(loci.getX() + 1, loci.getY()); int iters = 0; while (path.contains(p) && iters < 15) { iters++; p.setLocation(p.getX() + 1, p.getY()); } if (iters >= 15) iters = 0; lengths[i] = iters; } /* used prior to 2.5.1, when moved to GeneralPath int wingHeight = (totalHeight - mainHeight) / 2; double wingCenterX = wingHeight * Math.sqrt(3) / 2; double mainCenterX = mainHeight * Math.sqrt(3) / 2; for (int i = 0; i < inputs; i++) { Location loci = factory.getInputOffset(attrs, i); int disti = 5 + loc0.manhattanDistanceTo(loci); if (disti > totalHeight - disti) { // ensure on top half disti = totalHeight - disti; } double dx; if (disti < wingHeight) { // point is on wing int dy = wingHeight / 2 - disti; dx = Math.sqrt(wingHeight * wingHeight - dy * dy) - wingCenterX; } else { // point is on main shield int dy = totalHeight / 2 - disti; dx = Math.sqrt(mainHeight * mainHeight - dy * dy) - mainCenterX; } lengths[i] = (int) (dx - 0.5); } */ return lengths; } } logisim-2.7.1/src/com/cburch/logisim/std/gates/PainterDin.java0000644000175000017500000001022011446034560024133 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.gates; import java.awt.Color; import java.awt.Graphics; import java.util.HashMap; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.util.GraphicsUtil; class PainterDin { private PainterDin() { } static final int AND = 0; static final int OR = 1; static final int XOR = 2; static final int XNOR = 3; private static HashMap orLenArrays = new HashMap(); static void paintAnd(InstancePainter painter, int width, int height, boolean drawBubble) { paint(painter, width, height, drawBubble, AND); } static void paintOr(InstancePainter painter, int width, int height, boolean drawBubble) { paint(painter, width, height, drawBubble, OR); } static void paintXor(InstancePainter painter, int width, int height, boolean drawBubble) { paint(painter, width, height, drawBubble, XOR); } static void paintXnor(InstancePainter painter, int width, int height, boolean drawBubble) { paint(painter, width, height, drawBubble, XNOR); } private static void paint(InstancePainter painter, int width, int height, boolean drawBubble, int dinType) { Graphics g = painter.getGraphics(); int x = 0; int xMid = -width; int y0 = -height / 2; if (drawBubble) { x -= 4; width -= 8; } int diam = Math.min(height, 2 * width); if (dinType == AND) { ; // nothing to do } else if (dinType == OR) { paintOrLines(painter, width, height, drawBubble); } else if (dinType == XOR || dinType == XNOR) { int elen = Math.min(diam / 2 - 10, 20); int ex0 = xMid + (diam / 2 - elen) / 2; int ex1 = ex0 + elen; g.drawLine(ex0, -5, ex1, -5); g.drawLine(ex0, 0, ex1, 0); g.drawLine(ex0, 5, ex1, 5); if (dinType == XOR) { int exMid = ex0 + elen / 2; g.drawLine(exMid, -8, exMid, 8); } } else { throw new IllegalArgumentException("unrecognized shape"); } GraphicsUtil.switchToWidth(g, 2); int x0 = xMid - diam / 2; Color oldColor = g.getColor(); if (painter.getShowState()) { Value val = painter.getPort(0); g.setColor(val.getColor()); } g.drawLine(x0 + diam, 0, 0, 0); g.setColor(oldColor); if (height <= diam) { g.drawArc(x0, y0, diam, diam, -90, 180); } else { int x1 = x0 + diam; int yy0 = -(height - diam) / 2; int yy1 = (height - diam) / 2; g.drawArc(x0, y0, diam, diam, 0, 90); g.drawLine(x1, yy0, x1, yy1); g.drawArc(x0, y0 + height - diam, diam, diam, -90, 90); } g.drawLine(xMid, y0, xMid, y0 + height); if (drawBubble) { g.fillOval(x0 + diam - 4, -4, 8, 8); xMid += 4; } } private static void paintOrLines(InstancePainter painter, int width, int height, boolean hasBubble) { GateAttributes baseAttrs = (GateAttributes) painter.getAttributeSet(); int inputs = baseAttrs.inputs; GateAttributes attrs = (GateAttributes) OrGate.FACTORY.createAttributeSet(); attrs.inputs = inputs; attrs.size = baseAttrs.size; Graphics g = painter.getGraphics(); // draw state if appropriate // ignore lines if in print view int r = Math.min(height / 2, width); Integer hash = Integer.valueOf(r << 4 | inputs); int[] lens = orLenArrays.get(hash); if (lens == null) { lens = new int[inputs]; orLenArrays.put(hash, lens); int yCurveStart = height / 2 - r; for (int i = 0; i < inputs; i++) { int y = OrGate.FACTORY.getInputOffset(attrs, i).getY(); if (y < 0) y = -y; if (y <= yCurveStart) { lens[i] = r; } else { int dy = y - yCurveStart; lens[i] = (int) (Math.sqrt(r * r - dy * dy) + 0.5); } } } AbstractGate factory = hasBubble ? NorGate.FACTORY : OrGate.FACTORY; boolean printView = painter.isPrintView() && painter.getInstance() != null; GraphicsUtil.switchToWidth(g, 2); for (int i = 0; i < inputs; i++) { if (!printView || painter.isPortConnected(i)) { Location loc = factory.getInputOffset(attrs, i); int x = loc.getX(); int y = loc.getY(); g.drawLine(x, y, x + lens[i], y); } } } } logisim-2.7.1/src/com/cburch/logisim/std/gates/OrGate.java0000644000175000017500000000406111446034560023265 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.gates; import java.awt.Graphics; import com.cburch.logisim.analyze.model.Expression; import com.cburch.logisim.analyze.model.Expressions; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.tools.WireRepairData; import com.cburch.logisim.util.GraphicsUtil; class OrGate extends AbstractGate { public static OrGate FACTORY = new OrGate(); private OrGate() { super("OR Gate", Strings.getter("orGateComponent")); setRectangularLabel("\u2265" + "1"); setIconNames("orGate.gif", "orGateRect.gif", "dinOrGate.gif"); setPaintInputLines(true); } @Override public void paintIconShaped(InstancePainter painter) { Graphics g = painter.getGraphics(); GraphicsUtil.drawCenteredArc(g, 0, -5, 22, -90, 53); GraphicsUtil.drawCenteredArc(g, 0, 23, 22, 90, -53); GraphicsUtil.drawCenteredArc(g, -12, 9, 16, -30, 60); } @Override protected void paintShape(InstancePainter painter, int width, int height) { PainterShaped.paintOr(painter, width, height); } @Override protected void paintDinShape(InstancePainter painter, int width, int height, int inputs) { PainterDin.paintOr(painter, width, height, false); } @Override protected Value computeOutput(Value[] inputs, int numInputs, InstanceState state) { return GateFunctions.computeOr(inputs, numInputs); } @Override protected boolean shouldRepairWire(Instance instance, WireRepairData data) { boolean ret = !data.getPoint().equals(instance.getLocation()); return ret; } @Override protected Expression computeExpression(Expression[] inputs, int numInputs) { Expression ret = inputs[0]; for (int i = 1; i < numInputs; i++) { ret = Expressions.or(ret, inputs[i]); } return ret; } @Override protected Value getIdentity() { return Value.FALSE; } } logisim-2.7.1/src/com/cburch/logisim/std/gates/OddParityGate.java0000644000175000017500000000373311446034560024611 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.gates; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import com.cburch.logisim.analyze.model.Expression; import com.cburch.logisim.analyze.model.Expressions; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.util.GraphicsUtil; class OddParityGate extends AbstractGate { public static OddParityGate FACTORY = new OddParityGate(); private OddParityGate() { super("Odd Parity", Strings.getter("oddParityComponent")); setRectangularLabel("2k+1"); setIconNames("parityOddGate.gif"); } @Override public void paintIconShaped(InstancePainter painter) { paintIconRectangular(painter); } @Override public void paintIconRectangular(InstancePainter painter) { Graphics g = painter.getGraphics(); g.setColor(Color.black); g.drawRect(1, 2, 16, 16); Font old = g.getFont(); g.setFont(old.deriveFont(9.0f)); GraphicsUtil.drawCenteredText(g, "2k", 9, 6); GraphicsUtil.drawCenteredText(g, "+1", 9, 13); g.setFont(old); } @Override protected void paintShape(InstancePainter painter, int width, int height) { paintRectangular(painter, width, height); } @Override protected void paintDinShape(InstancePainter painter, int width, int height, int inputs) { paintRectangular(painter, width, height); } @Override protected Value computeOutput(Value[] inputs, int numInputs, InstanceState state) { return GateFunctions.computeOddParity(inputs, numInputs); } @Override protected Expression computeExpression(Expression[] inputs, int numInputs) { Expression ret = inputs[0]; for (int i = 1; i < numInputs; i++) { ret = Expressions.xor(ret, inputs[i]); } return ret; } @Override protected Value getIdentity() { return Value.FALSE; } } logisim-2.7.1/src/com/cburch/logisim/std/gates/NotGate.java0000644000175000017500000002113311527054416023446 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.gates; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.util.Map; import javax.swing.Icon; import com.cburch.logisim.analyze.model.Expression; import com.cburch.logisim.analyze.model.Expressions; import com.cburch.logisim.circuit.ExpressionComputer; import com.cburch.logisim.comp.TextField; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeOption; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Attributes; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.prefs.AppPreferences; import com.cburch.logisim.tools.key.BitWidthConfigurator; import com.cburch.logisim.util.GraphicsUtil; import com.cburch.logisim.util.Icons; class NotGate extends InstanceFactory { public static final AttributeOption SIZE_NARROW = new AttributeOption(Integer.valueOf(20), Strings.getter("gateSizeNarrowOpt")); public static final AttributeOption SIZE_WIDE = new AttributeOption(Integer.valueOf(30), Strings.getter("gateSizeWideOpt")); public static final Attribute ATTR_SIZE = Attributes.forOption("size", Strings.getter("gateSizeAttr"), new AttributeOption[] { SIZE_NARROW, SIZE_WIDE }); private static final String RECT_LABEL = "1"; private static final Icon toolIcon = Icons.getIcon("notGate.gif"); private static final Icon toolIconRect = Icons.getIcon("notGateRect.gif"); private static final Icon toolIconDin = Icons.getIcon("dinNotGate.gif"); public static InstanceFactory FACTORY = new NotGate(); private NotGate() { super("NOT Gate", Strings.getter("notGateComponent")); setAttributes(new Attribute[] { StdAttr.FACING, StdAttr.WIDTH, ATTR_SIZE, GateAttributes.ATTR_OUTPUT, StdAttr.LABEL, StdAttr.LABEL_FONT, }, new Object[] { Direction.EAST, BitWidth.ONE, SIZE_WIDE, GateAttributes.OUTPUT_01, "", StdAttr.DEFAULT_LABEL_FONT, }); setFacingAttribute(StdAttr.FACING); setKeyConfigurator(new BitWidthConfigurator(StdAttr.WIDTH)); } @Override public Bounds getOffsetBounds(AttributeSet attrs) { Object value = attrs.getValue(ATTR_SIZE); if (value == SIZE_NARROW) { Direction facing = attrs.getValue(StdAttr.FACING); if (facing == Direction.SOUTH) return Bounds.create(-9, -20, 18, 20); if (facing == Direction.NORTH) return Bounds.create(-9, 0, 18, 20); if (facing == Direction.WEST) return Bounds.create(0, -9, 20, 18); return Bounds.create(-20, -9, 20, 18); } else { Direction facing = attrs.getValue(StdAttr.FACING); if (facing == Direction.SOUTH) return Bounds.create(-9, -30, 18, 30); if (facing == Direction.NORTH) return Bounds.create(-9, 0, 18, 30); if (facing == Direction.WEST) return Bounds.create(0, -9, 30, 18); return Bounds.create(-30, -9, 30, 18); } } @Override public void propagate(InstanceState state) { Value in = state.getPort(1); Value out = in.not(); out = Buffer.repair(state, out); state.setPort(0, out, GateAttributes.DELAY); } // // methods for instances // @Override protected void configureNewInstance(Instance instance) { configurePorts(instance); instance.addAttributeListener(); String gateShape = AppPreferences.GATE_SHAPE.get(); configureLabel(instance, gateShape.equals(AppPreferences.SHAPE_RECTANGULAR), null); } @Override protected void instanceAttributeChanged(Instance instance, Attribute attr) { if (attr == ATTR_SIZE || attr == StdAttr.FACING) { instance.recomputeBounds(); configurePorts(instance); String gateShape = AppPreferences.GATE_SHAPE.get(); configureLabel(instance, gateShape.equals(AppPreferences.SHAPE_RECTANGULAR), null); } } private void configurePorts(Instance instance) { Object size = instance.getAttributeValue(ATTR_SIZE); Direction facing = instance.getAttributeValue(StdAttr.FACING); int dx = size == SIZE_NARROW ? -20 : -30; Port[] ports = new Port[2]; ports[0] = new Port(0, 0, Port.OUTPUT, StdAttr.WIDTH); Location out = Location.create(0, 0).translate(facing, dx); ports[1] = new Port(out.getX(), out.getY(), Port.INPUT, StdAttr.WIDTH); instance.setPorts(ports); } @Override protected Object getInstanceFeature(final Instance instance, Object key) { if (key == ExpressionComputer.class) { return new ExpressionComputer() { public void computeExpression(Map expressionMap) { Expression e = expressionMap.get(instance.getPortLocation(1)); if (e != null) { expressionMap.put(instance.getPortLocation(0), Expressions.not(e)); } } }; } return super.getInstanceFeature(instance, key); } // // painting methods // @Override public void paintIcon(InstancePainter painter) { Graphics g = painter.getGraphics(); g.setColor(Color.black); if (painter.getGateShape() == AppPreferences.SHAPE_RECTANGULAR) { if (toolIconRect != null) { toolIconRect.paintIcon(painter.getDestination(), g, 2, 2); } else { g.drawRect(0, 2, 16, 16); GraphicsUtil.drawCenteredText(g, RECT_LABEL, 8, 8); g.drawOval(16, 8, 4, 4); } } else if (painter.getGateShape() == AppPreferences.SHAPE_DIN40700) { if (toolIconDin != null) { toolIconDin.paintIcon(painter.getDestination(), g, 2, 2); } else { g.drawRect(0, 2, 16, 16); GraphicsUtil.drawCenteredText(g, RECT_LABEL, 8, 8); g.drawOval(16, 8, 4, 4); } } else { if (toolIcon != null) { toolIcon.paintIcon(painter.getDestination(), g, 2, 2); } else { int[] xp = new int[4]; int[] yp = new int[4]; xp[0] = 15; yp[0] = 10; xp[1] = 1; yp[1] = 3; xp[2] = 1; yp[2] = 17; xp[3] = 15; yp[3] = 10; g.drawPolyline(xp, yp, 4); g.drawOval(15, 8, 4, 4); } } } @Override public void paintGhost(InstancePainter painter) { paintBase(painter); } @Override public void paintInstance(InstancePainter painter) { painter.getGraphics().setColor(Color.BLACK); paintBase(painter); painter.drawPorts(); painter.drawLabel(); } private void paintBase(InstancePainter painter) { Graphics g = painter.getGraphics(); Direction facing = painter.getAttributeValue(StdAttr.FACING); Location loc = painter.getLocation(); int x = loc.getX(); int y = loc.getY(); g.translate(x, y); double rotate = 0.0; if (facing != null && facing != Direction.EAST && g instanceof Graphics2D) { rotate = -facing.toRadians(); ((Graphics2D) g).rotate(rotate); } Object shape = painter.getGateShape(); if (shape == AppPreferences.SHAPE_RECTANGULAR) { paintRectangularBase(g, painter); } else if (shape == AppPreferences.SHAPE_DIN40700) { int width = painter.getAttributeValue(ATTR_SIZE) == SIZE_NARROW ? 20 : 30; PainterDin.paintAnd(painter, width, 18, true); } else { PainterShaped.paintNot(painter); } if (rotate != 0.0) { ((Graphics2D) g).rotate(-rotate); } g.translate(-x, -y); } private void paintRectangularBase(Graphics g, InstancePainter painter) { GraphicsUtil.switchToWidth(g, 2); if (painter.getAttributeValue(ATTR_SIZE) == SIZE_NARROW) { g.drawRect(-20, -9, 14, 18); GraphicsUtil.drawCenteredText(g, RECT_LABEL, -13, 0); g.drawOval(-6, -3, 6, 6); } else { g.drawRect(-30, -9, 20, 18); GraphicsUtil.drawCenteredText(g, RECT_LABEL, -20, 0); g.drawOval(-10, -5, 9, 9); } GraphicsUtil.switchToWidth(g, 1); } static void configureLabel(Instance instance, boolean isRectangular, Location control) { Object facing = instance.getAttributeValue(StdAttr.FACING); Bounds bds = instance.getBounds(); int x; int y; int halign; if (facing == Direction.NORTH || facing == Direction.SOUTH) { x = bds.getX() + bds.getWidth() / 2 + 2; y = bds.getY() - 2; halign = TextField.H_LEFT; } else { // west or east y = isRectangular ? bds.getY() - 2 : bds.getY(); if (control != null && control.getY() == bds.getY()) { // the control line will get in the way x = control.getX() + 2; halign = TextField.H_LEFT; } else { x = bds.getX() + bds.getWidth() / 2; halign = TextField.H_CENTER; } } instance.setTextField(StdAttr.LABEL, StdAttr.LABEL_FONT, x, y, halign, TextField.V_BASELINE); } } logisim-2.7.1/src/com/cburch/logisim/std/gates/NorGate.java0000644000175000017500000000421011446034560023437 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.gates; import java.awt.Graphics; import com.cburch.logisim.analyze.model.Expression; import com.cburch.logisim.analyze.model.Expressions; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.tools.WireRepairData; import com.cburch.logisim.util.GraphicsUtil; class NorGate extends AbstractGate { public static NorGate FACTORY = new NorGate(); private NorGate() { super("NOR Gate", Strings.getter("norGateComponent")); setNegateOutput(true); setRectangularLabel(OrGate.FACTORY.getRectangularLabel(null)); setIconNames("norGate.gif", "norGateRect.gif", "dinNorGate.gif"); setPaintInputLines(true); } @Override public void paintIconShaped(InstancePainter painter) { Graphics g = painter.getGraphics(); GraphicsUtil.drawCenteredArc(g, 0, -5, 22, -90, 53); GraphicsUtil.drawCenteredArc(g, 0, 23, 22, 90, -53); GraphicsUtil.drawCenteredArc(g, -12, 9, 16, -30, 60); g.drawOval(16, 8, 4, 4); } @Override protected void paintShape(InstancePainter painter, int width, int height) { PainterShaped.paintOr(painter, width, height); } @Override protected void paintDinShape(InstancePainter painter, int width, int height, int inputs) { PainterDin.paintOr(painter, width, height, true); } @Override protected Value computeOutput(Value[] inputs, int numInputs, InstanceState state) { return GateFunctions.computeOr(inputs, numInputs).not(); } @Override protected boolean shouldRepairWire(Instance instance, WireRepairData data) { return !data.getPoint().equals(instance.getLocation()); } @Override protected Expression computeExpression(Expression[] inputs, int numInputs) { Expression ret = inputs[0]; for (int i = 1; i < numInputs; i++) { ret = Expressions.or(ret, inputs[i]); } return Expressions.not(ret); } @Override protected Value getIdentity() { return Value.FALSE; } } logisim-2.7.1/src/com/cburch/logisim/std/gates/NegateAttribute.java0000644000175000017500000000302611446034560025173 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.gates; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.Attributes; import com.cburch.logisim.data.Direction; import com.cburch.logisim.util.StringUtil; class NegateAttribute extends Attribute { private static Attribute BOOLEAN_ATTR = Attributes.forBoolean("negateDummy"); int index; private Direction side; public NegateAttribute(int index, Direction side) { super("negate" + index, null); this.index = index; this.side = side; } @Override public boolean equals(Object other) { if (other instanceof NegateAttribute) { NegateAttribute o = (NegateAttribute) other; return this.index == o.index && this.side == o.side; } else { return false; } } @Override public int hashCode() { return index * 31 + (side == null ? 0 : side.hashCode()); } @Override public String getDisplayName() { String ret = StringUtil.format(Strings.get("gateNegateAttr"), "" + (index + 1)); if (side != null) { ret += " (" + side.toVerticalDisplayString() + ")"; } return ret; } @Override public String toDisplayString(Boolean value) { return BOOLEAN_ATTR.toDisplayString(value); } @Override public Boolean parse(String value) { return BOOLEAN_ATTR.parse(value); } @Override public java.awt.Component getCellEditor(Boolean value) { return BOOLEAN_ATTR.getCellEditor(null, value); } } logisim-2.7.1/src/com/cburch/logisim/std/gates/NandGate.java0000644000175000017500000000357411446034560023575 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.gates; import java.awt.Graphics; import com.cburch.logisim.analyze.model.Expression; import com.cburch.logisim.analyze.model.Expressions; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.util.GraphicsUtil; class NandGate extends AbstractGate { public static NandGate FACTORY = new NandGate(); private NandGate() { super("NAND Gate", Strings.getter("nandGateComponent")); setNegateOutput(true); setRectangularLabel(AndGate.FACTORY.getRectangularLabel(null)); setIconNames("nandGate.gif", "nandGateRect.gif", "dinNandGate.gif"); } @Override public void paintIconShaped(InstancePainter painter) { Graphics g = painter.getGraphics(); int[] xp = new int[] { 8, 0, 0, 8 }; int[] yp = new int[] { 2, 2, 18, 18 }; g.drawPolyline(xp, yp, 4); GraphicsUtil.drawCenteredArc(g, 8, 10, 8, -90, 180); g.drawOval(16, 8, 4, 4); } @Override protected void paintShape(InstancePainter painter, int width, int height) { PainterShaped.paintAnd(painter, width, height); } @Override protected void paintDinShape(InstancePainter painter, int width, int height, int inputs) { PainterDin.paintAnd(painter, width, height, true); } @Override protected Value computeOutput(Value[] inputs, int numInputs, InstanceState state) { return GateFunctions.computeAnd(inputs, numInputs).not(); } @Override protected Expression computeExpression(Expression[] inputs, int numInputs) { Expression ret = inputs[0]; for (int i = 1; i < numInputs; i++) { ret = Expressions.and(ret, inputs[i]); } return Expressions.not(ret); } @Override protected Value getIdentity() { return Value.TRUE; } } logisim-2.7.1/src/com/cburch/logisim/std/gates/Gates.java0000644000175000017500000000216611524651340023151 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.gates; 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; public class Gates extends Library { private List tools = null; public Gates() { tools = Arrays.asList(new Tool[] { new AddTool(NotGate.FACTORY), new AddTool(Buffer.FACTORY), new AddTool(AndGate.FACTORY), new AddTool(OrGate.FACTORY), new AddTool(NandGate.FACTORY), new AddTool(NorGate.FACTORY), new AddTool(XorGate.FACTORY), new AddTool(XnorGate.FACTORY), new AddTool(OddParityGate.FACTORY), new AddTool(EvenParityGate.FACTORY), new AddTool(ControlledBuffer.FACTORY_BUFFER), new AddTool(ControlledBuffer.FACTORY_INVERTER), }); } @Override public String getName() { return "Gates"; } @Override public String getDisplayName() { return Strings.get("gatesLibrary"); } @Override public List getTools() { return tools; } } logisim-2.7.1/src/com/cburch/logisim/std/gates/GateFunctions.java0000644000175000017500000000256711446034560024666 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.gates; import com.cburch.logisim.data.Value; class GateFunctions { private GateFunctions() { } static Value computeOr(Value[] inputs, int numInputs) { Value ret = inputs[0]; for (int i = 1; i < numInputs; i++) { ret = ret.or(inputs[i]); } return ret; } static Value computeAnd(Value[] inputs, int numInputs) { Value ret = inputs[0]; for (int i = 1; i < numInputs; i++) { ret = ret.and(inputs[i]); } return ret; } static Value computeOddParity(Value[] inputs, int numInputs) { Value ret = inputs[0]; for (int i = 1; i < numInputs; i++) { ret = ret.xor(inputs[i]); } return ret; } static Value computeExactlyOne(Value[] inputs, int numInputs) { int width = inputs[0].getWidth(); Value[] ret = new Value[width]; for (int i = 0; i < width; i++) { int count = 0; for (int j = 0; j < numInputs; j++) { Value v = inputs[j].get(i); if (v == Value.TRUE) { count++; } else if (v == Value.FALSE) { ; // do nothing } else { count = -1; break; } } if (count < 0) { ret[i] = Value.ERROR; } else if (count == 1) { ret[i] = Value.TRUE; } else { ret[i] = Value.FALSE; } } return Value.create(ret); } } logisim-2.7.1/src/com/cburch/logisim/std/gates/GateAttributes.java0000644000175000017500000001072511527054330025034 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.gates; import java.awt.Font; import java.util.List; import com.cburch.logisim.data.AbstractAttributeSet; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeOption; import com.cburch.logisim.data.Attributes; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Direction; import com.cburch.logisim.instance.StdAttr; class GateAttributes extends AbstractAttributeSet { static final int MAX_INPUTS = 32; static final int DELAY = 1; static final AttributeOption SIZE_NARROW = new AttributeOption(Integer.valueOf(30), Strings.getter("gateSizeNarrowOpt")); static final AttributeOption SIZE_MEDIUM = new AttributeOption(Integer.valueOf(50), Strings.getter("gateSizeNormalOpt")); static final AttributeOption SIZE_WIDE = new AttributeOption(Integer.valueOf(70), Strings.getter("gateSizeWideOpt")); public static final Attribute ATTR_SIZE = Attributes.forOption("size", Strings.getter("gateSizeAttr"), new AttributeOption[] { SIZE_NARROW, SIZE_MEDIUM, SIZE_WIDE }); public static final Attribute ATTR_INPUTS = Attributes.forIntegerRange("inputs", Strings.getter("gateInputsAttr"), 2, MAX_INPUTS); static final AttributeOption XOR_ONE = new AttributeOption("1", Strings.getter("xorBehaviorOne")); static final AttributeOption XOR_ODD = new AttributeOption("odd", Strings.getter("xorBehaviorOdd")); public static final Attribute ATTR_XOR = Attributes.forOption("xor", Strings.getter("xorBehaviorAttr"), new AttributeOption[] { XOR_ONE, XOR_ODD }); static final AttributeOption OUTPUT_01 = new AttributeOption("01", Strings.getter("gateOutput01")); static final AttributeOption OUTPUT_0Z = new AttributeOption("0Z", Strings.getter("gateOutput0Z")); static final AttributeOption OUTPUT_Z1 = new AttributeOption("Z1", Strings.getter("gateOutputZ1")); public static final Attribute ATTR_OUTPUT = Attributes.forOption("out", Strings.getter("gateOutputAttr"), new AttributeOption[] { OUTPUT_01, OUTPUT_0Z, OUTPUT_Z1 }); Direction facing = Direction.EAST; BitWidth width = BitWidth.ONE; AttributeOption size = SIZE_MEDIUM; int inputs = 5; int negated = 0; AttributeOption out = OUTPUT_01; AttributeOption xorBehave; String label = ""; Font labelFont = StdAttr.DEFAULT_LABEL_FONT; GateAttributes(boolean isXor) { xorBehave = isXor ? XOR_ONE : null; } @Override protected void copyInto(AbstractAttributeSet dest) { ; // nothing to do } @Override public List> getAttributes() { return new GateAttributeList(this); } @Override @SuppressWarnings("unchecked") public V getValue(Attribute attr) { if (attr == StdAttr.FACING) return (V) facing; if (attr == StdAttr.WIDTH) return (V) width; if (attr == StdAttr.LABEL) return (V) label; if (attr == StdAttr.LABEL_FONT) return (V) labelFont; if (attr == ATTR_SIZE) return (V) size; if (attr == ATTR_INPUTS) return (V) Integer.valueOf(inputs); if (attr == ATTR_OUTPUT) return (V) out; if (attr == ATTR_XOR) return (V) xorBehave; if (attr instanceof NegateAttribute) { int index = ((NegateAttribute) attr).index; int bit = (negated >> index) & 1; return (V) Boolean.valueOf(bit == 1); } return null; } @Override public void setValue(Attribute attr, V value) { if (attr == StdAttr.WIDTH) { width = (BitWidth) value; int bits = width.getWidth(); int mask = bits >= 32 ? -1 : ((1 << inputs) - 1); negated &= mask; } else if (attr == StdAttr.FACING) { facing = (Direction) value; } else if (attr == StdAttr.LABEL) { label = (String) value; } else if (attr == StdAttr.LABEL_FONT) { labelFont = (Font) value; } else if (attr == ATTR_SIZE) { size = (AttributeOption) value; } else if (attr == ATTR_INPUTS) { inputs = ((Integer) value).intValue(); fireAttributeListChanged(); } else if (attr == ATTR_XOR) { xorBehave = (AttributeOption) value; } else if (attr == ATTR_OUTPUT) { out = (AttributeOption) value; } else if (attr instanceof NegateAttribute) { int index = ((NegateAttribute) attr).index; if (((Boolean) value).booleanValue()) { negated |= 1 << index; } else { negated &= ~(1 << index); } } else { throw new IllegalArgumentException("unrecognized argument"); } fireAttributeValueChanged(attr, value); } } logisim-2.7.1/src/com/cburch/logisim/std/gates/GateAttributeList.java0000644000175000017500000000332011527054364025505 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.gates; import java.util.AbstractList; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.Direction; import com.cburch.logisim.instance.StdAttr; class GateAttributeList extends AbstractList> { private static final Attribute[] BASE_ATTRIBUTES = { StdAttr.FACING, StdAttr.WIDTH, GateAttributes.ATTR_SIZE, GateAttributes.ATTR_INPUTS, GateAttributes.ATTR_OUTPUT, StdAttr.LABEL, StdAttr.LABEL_FONT, }; private GateAttributes attrs; public GateAttributeList(GateAttributes attrs) { this.attrs = attrs; } @Override public Attribute get(int index) { int len = BASE_ATTRIBUTES.length; if (index < len) { return BASE_ATTRIBUTES[index]; } index -= len; if (attrs.xorBehave != null) { index--; if (index < 0) return GateAttributes.ATTR_XOR; } Direction facing = attrs.facing; int inputs = attrs.inputs; if (index == 0) { if (facing == Direction.EAST || facing == Direction.WEST) { return new NegateAttribute(index, Direction.NORTH); } else { return new NegateAttribute(index, Direction.WEST); } } else if (index == inputs - 1) { if (facing == Direction.EAST || facing == Direction.WEST) { return new NegateAttribute(index, Direction.SOUTH); } else { return new NegateAttribute(index, Direction.EAST); } } else if (index < inputs) { return new NegateAttribute(index, null); } return null; } @Override public int size() { int ret = BASE_ATTRIBUTES.length; if (attrs.xorBehave != null) ret++; ret += attrs.inputs; return ret; } } logisim-2.7.1/src/com/cburch/logisim/std/gates/EvenParityGate.java0000644000175000017500000000304211446034560024771 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.gates; import com.cburch.logisim.analyze.model.Expression; import com.cburch.logisim.analyze.model.Expressions; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; class EvenParityGate extends AbstractGate { public static EvenParityGate FACTORY = new EvenParityGate(); private EvenParityGate() { super("Even Parity", Strings.getter("evenParityComponent")); setRectangularLabel("2k"); setIconNames("parityEvenGate.gif"); } @Override public void paintIconShaped(InstancePainter painter) { paintIconRectangular(painter); } @Override protected void paintShape(InstancePainter painter, int width, int height) { paintRectangular(painter, width, height); } @Override protected void paintDinShape(InstancePainter painter, int width, int height, int inputs) { paintRectangular(painter, width, height); } @Override protected Value computeOutput(Value[] inputs, int numInputs, InstanceState state) { return GateFunctions.computeOddParity(inputs, numInputs).not(); } @Override protected Expression computeExpression(Expression[] inputs, int numInputs) { Expression ret = inputs[0]; for (int i = 1; i < numInputs; i++) { ret = Expressions.xor(ret, inputs[i]); } return Expressions.not(ret); } @Override protected Value getIdentity() { return Value.FALSE; } } logisim-2.7.1/src/com/cburch/logisim/std/gates/ControlledBuffer.java0000644000175000017500000002063111524651340025342 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.gates; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import javax.swing.Icon; import com.cburch.logisim.comp.ComponentFactory; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeOption; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Attributes; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.file.Options; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.tools.WireRepair; import com.cburch.logisim.tools.WireRepairData; import com.cburch.logisim.tools.key.BitWidthConfigurator; import com.cburch.logisim.util.GraphicsUtil; import com.cburch.logisim.util.Icons; class ControlledBuffer extends InstanceFactory { private static final AttributeOption RIGHT_HANDED = new AttributeOption("right", Strings.getter("controlledRightHanded")); private static final AttributeOption LEFT_HANDED = new AttributeOption("left", Strings.getter("controlledLeftHanded")); private static final Attribute ATTR_CONTROL = Attributes.forOption("control", Strings.getter("controlledControlOption"), new AttributeOption[] { RIGHT_HANDED, LEFT_HANDED }); public static ComponentFactory FACTORY_BUFFER = new ControlledBuffer(false); public static ComponentFactory FACTORY_INVERTER = new ControlledBuffer(true); private static final Icon ICON_BUFFER = Icons.getIcon("controlledBuffer.gif"); private static final Icon ICON_INVERTER = Icons.getIcon("controlledInverter.gif"); private boolean isInverter; private ControlledBuffer(boolean isInverter) { super(isInverter ? "Controlled Inverter" : "Controlled Buffer", isInverter ? Strings.getter("controlledInverterComponent") : Strings.getter("controlledBufferComponent")); this.isInverter = isInverter; if (isInverter) { setAttributes(new Attribute[] { StdAttr.FACING, StdAttr.WIDTH, NotGate.ATTR_SIZE, ATTR_CONTROL, StdAttr.LABEL, StdAttr.LABEL_FONT }, new Object[] { Direction.EAST, BitWidth.ONE, NotGate.SIZE_WIDE, RIGHT_HANDED, "", StdAttr.DEFAULT_LABEL_FONT }); } else { setAttributes(new Attribute[] { StdAttr.FACING, StdAttr.WIDTH, ATTR_CONTROL, StdAttr.LABEL, StdAttr.LABEL_FONT }, new Object[] { Direction.EAST, BitWidth.ONE, RIGHT_HANDED, "", StdAttr.DEFAULT_LABEL_FONT }); } setFacingAttribute(StdAttr.FACING); setKeyConfigurator(new BitWidthConfigurator(StdAttr.WIDTH)); } @Override public Bounds getOffsetBounds(AttributeSet attrs) { int w = 20; if (isInverter && !NotGate.SIZE_NARROW.equals(attrs.getValue(NotGate.ATTR_SIZE))) { w = 30; } Direction facing = attrs.getValue(StdAttr.FACING); if (facing == Direction.NORTH) return Bounds.create(-10, 0, 20, w); if (facing == Direction.SOUTH) return Bounds.create(-10, -w, 20, w); if (facing == Direction.WEST) return Bounds.create(0, -10, w, 20); return Bounds.create(-w, -10, w, 20); } // // graphics methods // @Override public void paintGhost(InstancePainter painter) { paintShape(painter); } @Override public void paintIcon(InstancePainter painter) { Graphics g = painter.getGraphics(); Icon icon = isInverter ? ICON_INVERTER : ICON_BUFFER; if (icon != null) { icon.paintIcon(painter.getDestination(), g, 2, 2); } else { int x = isInverter ? 0 : 2; g.setColor(Color.BLACK); int[] xp = new int[] { x + 15, x + 1, x + 1, x + 15 }; int[] yp = new int[] { 10, 3, 17, 10 }; g.drawPolyline(xp, yp, 4); if (isInverter) g.drawOval(x + 13, 8, 4, 4); g.setColor(Value.FALSE_COLOR); g.drawLine(x + 8, 14, x + 8, 18); } } @Override public void paintInstance(InstancePainter painter) { Direction face = painter.getAttributeValue(StdAttr.FACING); Graphics g = painter.getGraphics(); // draw control wire GraphicsUtil.switchToWidth(g, 3); Location pt0 = painter.getInstance().getPortLocation(2); Location pt1; if (painter.getAttributeValue(ATTR_CONTROL) == LEFT_HANDED) { pt1 = pt0.translate(face, 0, 6); } else { pt1 = pt0.translate(face, 0, -6); } if (painter.getShowState()) { g.setColor(painter.getPort(2).getColor()); } g.drawLine(pt0.getX(), pt0.getY(), pt1.getX(), pt1.getY()); // draw triangle g.setColor(Color.BLACK); paintShape(painter); // draw input and output pins if (!painter.isPrintView()) { painter.drawPort(0); painter.drawPort(1); } painter.drawLabel(); } private void paintShape(InstancePainter painter) { Direction facing = painter.getAttributeValue(StdAttr.FACING); Location loc = painter.getLocation(); int x = loc.getX(); int y = loc.getY(); double rotate = 0.0; Graphics g = painter.getGraphics(); g.translate(x, y); if (facing != Direction.EAST && g instanceof Graphics2D) { rotate = -facing.toRadians(); ((Graphics2D) g).rotate(rotate); } if (isInverter) { PainterShaped.paintNot(painter); } else { GraphicsUtil.switchToWidth(g, 2); int d = isInverter ? 10 : 0; int[] xp = new int[] { -d, -19 - d, -19 - d, -d }; int[] yp = new int[] { 0, -7, 7, 0 }; g.drawPolyline(xp, yp, 4); // if (isInverter) g.drawOval(-9, -4, 9, 9); } if (rotate != 0.0) { ((Graphics2D) g).rotate(-rotate); } g.translate(-x, -y); } // // methods for instances // @Override protected void configureNewInstance(Instance instance) { instance.addAttributeListener(); configurePorts(instance); NotGate.configureLabel(instance, false, instance.getPortLocation(2)); } @Override protected void instanceAttributeChanged(Instance instance, Attribute attr) { if (attr == StdAttr.FACING || attr == NotGate.ATTR_SIZE) { instance.recomputeBounds(); configurePorts(instance); NotGate.configureLabel(instance, false, instance.getPortLocation(2)); } else if (attr == ATTR_CONTROL) { configurePorts(instance); NotGate.configureLabel(instance, false, instance.getPortLocation(2)); } } private void configurePorts(Instance instance) { Direction facing = instance.getAttributeValue(StdAttr.FACING); Bounds bds = getOffsetBounds(instance.getAttributeSet()); int d = Math.max(bds.getWidth(), bds.getHeight()) - 20; Location loc0 = Location.create(0, 0); Location loc1 = loc0.translate(facing.reverse(), 20 + d); Location loc2; if (instance.getAttributeValue(ATTR_CONTROL) == LEFT_HANDED) { loc2 = loc0.translate(facing.reverse(), 10 + d, 10); } else { loc2 = loc0.translate(facing.reverse(), 10 + d, -10); } Port[] ports = new Port[3]; ports[0] = new Port(0, 0, Port.OUTPUT, StdAttr.WIDTH); ports[1] = new Port(loc1.getX(), loc1.getY(), Port.INPUT, StdAttr.WIDTH); ports[2] = new Port(loc2.getX(), loc2.getY(), Port.INPUT, 1); instance.setPorts(ports); } @Override public void propagate(InstanceState state) { Value control = state.getPort(2); BitWidth width = state.getAttributeValue(StdAttr.WIDTH); if (control == Value.TRUE) { Value in = state.getPort(1); state.setPort(0, isInverter ? in.not() : in, GateAttributes.DELAY); } else if (control == Value.ERROR || control == Value.UNKNOWN) { state.setPort(0, Value.createError(width), GateAttributes.DELAY); } else { Value out; if (control == Value.UNKNOWN || control == Value.NIL) { AttributeSet opts = state.getProject().getOptions().getAttributeSet(); if (opts.getValue(Options.ATTR_GATE_UNDEFINED) .equals(Options.GATE_UNDEFINED_ERROR)) { out = Value.createError(width); } else { out = Value.createUnknown(width); } } else { out = Value.createUnknown(width); } state.setPort(0, out, GateAttributes.DELAY); } } @Override public Object getInstanceFeature(final Instance instance, Object key) { if (key == WireRepair.class) { return new WireRepair() { public boolean shouldRepairWire(WireRepairData data) { Location port2 = instance.getPortLocation(2); return data.getPoint().equals(port2); } }; } return super.getInstanceFeature(instance, key); } } logisim-2.7.1/src/com/cburch/logisim/std/gates/CircuitDetermination.java0000644000175000017500000001745111447117146026243 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.gates; import java.util.ArrayList; import com.cburch.logisim.analyze.model.Expression; import com.cburch.logisim.analyze.model.ExpressionVisitor; import com.cburch.logisim.comp.ComponentFactory; /** This represents the actual gate selection used corresponding * to an expression, without any correspondence to how they would * be laid down in a circuit. This intermediate representation permits * easy manipulation of an expression's translation. */ abstract class CircuitDetermination { /** Ensures that all gates have only two inputs. */ void convertToTwoInputs() { } /** Converts all gates to NANDs. Note that this will fail with an * exception if any XOR/XNOR gates are used. */ void convertToNands() { } /** Repairs two errors that may have cropped up in creating the * circuit. First, if there are gates with more inputs than their * capacity, we repair them. Second, any XOR/XNOR gates with * more than 2 inputs should really be Odd/Even Parity gates. */ void repair() { } /** A utility method for determining whether this fits the * pattern of a NAND representing a NOT. */ boolean isNandNot() { return false; } // // static members // static class Gate extends CircuitDetermination { private ComponentFactory factory; private ArrayList inputs = new ArrayList(); private Gate(ComponentFactory factory) { this.factory = factory; } ComponentFactory getFactory() { return factory; } ArrayList getInputs() { return inputs; } @Override void convertToTwoInputs() { if (inputs.size() <= 2) { for (CircuitDetermination a : inputs) { a.convertToTwoInputs(); } } else { ComponentFactory subFactory; if (factory == NorGate.FACTORY) subFactory = OrGate.FACTORY; else if (factory == NandGate.FACTORY) subFactory = AndGate.FACTORY; else subFactory = factory; int split = (inputs.size() + 1) / 2; CircuitDetermination a = convertToTwoInputsSub(0, split, subFactory); CircuitDetermination b = convertToTwoInputsSub(split, inputs.size(), subFactory); inputs.clear(); inputs.add(a); inputs.add(b); } } private CircuitDetermination convertToTwoInputsSub(int start, int stop, ComponentFactory subFactory) { if (stop - start == 1) { CircuitDetermination a = inputs.get(start); a.convertToTwoInputs(); return a; } else { int split = (start + stop + 1) / 2; CircuitDetermination a = convertToTwoInputsSub(start, split, subFactory); CircuitDetermination b = convertToTwoInputsSub(split, stop, subFactory); Gate ret = new Gate(subFactory); ret.inputs.add(a); ret.inputs.add(b); return ret; } } @Override void convertToNands() { // first recurse to clean up any children for (CircuitDetermination sub : inputs) { sub.convertToNands(); } // repair large XOR/XNORs to odd/even parity gates if (factory == NotGate.FACTORY) { inputs.add(inputs.get(0)); } else if (factory == AndGate.FACTORY) { notOutput(); } else if (factory == OrGate.FACTORY) { notAllInputs(); } else if (factory == NorGate.FACTORY) { notAllInputs(); // the order of these two lines is significant notOutput(); } else if (factory == NandGate.FACTORY) { ; } else { throw new IllegalArgumentException("Cannot handle " + factory.getDisplayName()); } factory = NandGate.FACTORY; } private void notOutput() { Gate sub = new Gate(NandGate.FACTORY); sub.inputs = this.inputs; this.inputs = new ArrayList(); inputs.add(sub); inputs.add(sub); } private void notAllInputs() { for (int i = 0; i < inputs.size(); i++) { CircuitDetermination old = inputs.get(i); if (old.isNandNot()) { inputs.set(i, ((Gate) old).inputs.get(0)); } else { Gate now = new Gate(NandGate.FACTORY); now.inputs.add(old); now.inputs.add(old); inputs.set(i, now); } } } @Override boolean isNandNot() { return factory == NandGate.FACTORY && inputs.size() == 2 && inputs.get(0) == inputs.get(1); } @Override void repair() { // check whether we need to split ourself up. int num = inputs.size(); if (num > GateAttributes.MAX_INPUTS) { int newNum = (num + GateAttributes.MAX_INPUTS - 1) / GateAttributes.MAX_INPUTS; ArrayList oldInputs = inputs; inputs = new ArrayList(); ComponentFactory subFactory = factory; if (subFactory == NandGate.FACTORY) subFactory = AndGate.FACTORY; if (subFactory == NorGate.FACTORY) subFactory = OrGate.FACTORY; int per = num / newNum; int numExtra = num - per * newNum; int k = 0; for (int i = 0; i < newNum; i++) { Gate sub = new Gate(subFactory); int subCount = per + (i < numExtra ? 1 : 0); for (int j = 0; j < subCount; j++) { sub.inputs.add(oldInputs.get(k)); k++; } inputs.add(sub); } } // repair large XOR/XNORs to odd/even parity gates if (inputs.size() > 2) { if (factory == XorGate.FACTORY) { factory = OddParityGate.FACTORY; } else if (factory == XnorGate.FACTORY) { factory = EvenParityGate.FACTORY; } } // finally, recurse to clean up any children for (CircuitDetermination sub : inputs) { sub.repair(); } } } static class Input extends CircuitDetermination { private String name; private Input(String name) { this.name = name; } String getName() { return name; } } static class Value extends CircuitDetermination { private int value; private Value(int value) { this.value = value; } int getValue() { return value; } } static CircuitDetermination create(Expression expr) { if (expr == null) return null; return expr.visit(new Determine()); } private static class Determine implements ExpressionVisitor { public CircuitDetermination visitAnd(Expression a, Expression b) { return binary(a.visit(this), b.visit(this), AndGate.FACTORY); } public CircuitDetermination visitOr(Expression a, Expression b) { return binary(a.visit(this), b.visit(this), OrGate.FACTORY); } public CircuitDetermination visitXor(Expression a, Expression b) { return binary(a.visit(this), b.visit(this), XorGate.FACTORY); } private Gate binary(CircuitDetermination aret, CircuitDetermination bret, ComponentFactory factory) { if (aret instanceof Gate) { Gate a = (Gate) aret; if (a.factory == factory) { if (bret instanceof Gate) { Gate b = (Gate) bret; if (b.factory == factory) { a.inputs.addAll(b.inputs); return a; } } a.inputs.add(bret); return a; } } if (bret instanceof Gate) { Gate b = (Gate) bret; if (b.factory == factory) { b.inputs.add(aret); return b; } } Gate ret = new Gate(factory); ret.inputs.add(aret); ret.inputs.add(bret); return ret; } public CircuitDetermination visitNot(Expression aBase) { CircuitDetermination aret = aBase.visit(this); if (aret instanceof Gate) { Gate a = (Gate) aret; if (a.factory == AndGate.FACTORY) { a.factory = NandGate.FACTORY; return a; } else if (a.factory == OrGate.FACTORY) { a.factory = NorGate.FACTORY; return a; } else if (a.factory == XorGate.FACTORY) { a.factory = XnorGate.FACTORY; return a; } } Gate ret = new Gate(NotGate.FACTORY); ret.inputs.add(aret); return ret; } public CircuitDetermination visitVariable(String name) { return new Input(name); } public CircuitDetermination visitConstant(int value) { return new Value(value); } } } logisim-2.7.1/src/com/cburch/logisim/std/gates/CircuitBuilder.java0000644000175000017500000004027511535206224025021 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.gates; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import com.cburch.logisim.analyze.model.AnalyzerModel; import com.cburch.logisim.analyze.model.Expression; import com.cburch.logisim.analyze.model.VariableList; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.CircuitMutation; import com.cburch.logisim.circuit.Wire; import com.cburch.logisim.comp.Component; import com.cburch.logisim.comp.ComponentFactory; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.std.wiring.Constant; import com.cburch.logisim.std.wiring.Pin; public class CircuitBuilder { private CircuitBuilder() { } public static CircuitMutation build(Circuit destCirc, AnalyzerModel model, boolean twoInputs, boolean useNands) { CircuitMutation result = new CircuitMutation(destCirc); result.clear(); Layout[] layouts = new Layout[model.getOutputs().size()]; int maxWidth = 0; for (int i = 0; i < layouts.length; i++) { String output = model.getOutputs().get(i); Expression expr = model.getOutputExpressions().getExpression(output); CircuitDetermination det = CircuitDetermination.create(expr); if (det != null) { if (twoInputs) det.convertToTwoInputs(); if (useNands) det.convertToNands(); det.repair(); layouts[i] = layoutGates(det); maxWidth = Math.max(maxWidth, layouts[i].width); } else { layouts[i] = null; } } InputData inputData = computeInputData(model); int x = inputData.getStartX(); int y = 10; int outputX = x + maxWidth + 20; for (int i = 0; i < layouts.length; i++) { String outputName = model.getOutputs().get(i); Layout layout = layouts[i]; Location output; int height; if (layout == null) { output = Location.create(outputX, y + 20); height = 40; } else { int dy = 0; if (layout.outputY < 20) dy = 20 - layout.outputY; height = Math.max(dy + layout.height, 40); output = Location.create(outputX, y + dy + layout.outputY); placeComponents(result, layouts[i], x, y + dy, inputData, output); } placeOutput(result, output, outputName); y += height + 10; } placeInputs(result, inputData); return result; } // // layoutGates // private static Layout layoutGates(CircuitDetermination det) { return layoutGatesSub(det); } private static class Layout { // initialized by parent int y; // top edge relative to parent's top edge // (or edge corresponding to input) // initialized by self int width; int height; ComponentFactory factory; AttributeSet attrs; int outputY; // where output is relative to my top edge int subX; // where right edge of sublayouts should be relative to my left edge Layout[] subLayouts; String inputName; // for references directly to inputs Layout(int width, int height, int outputY, ComponentFactory factory, AttributeSet attrs, Layout[] subLayouts, int subX) { this.width = width; this.height = roundUp(height); this.outputY = outputY; this.factory = factory; this.attrs = attrs; this.subLayouts = subLayouts; this.subX = subX; this.inputName = null; } Layout(String inputName) { this(0, 0, 0, null, null, null, 0); this.inputName = inputName; } } private static Layout layoutGatesSub(CircuitDetermination det) { if (det instanceof CircuitDetermination.Input) { CircuitDetermination.Input input = (CircuitDetermination.Input) det; return new Layout(input.getName()); } else if (det instanceof CircuitDetermination.Value) { CircuitDetermination.Value value = (CircuitDetermination.Value) det; ComponentFactory factory = Constant.FACTORY; AttributeSet attrs = factory.createAttributeSet(); attrs.setValue(Constant.ATTR_VALUE, Integer.valueOf(value.getValue())); Bounds bds = factory.getOffsetBounds(attrs); return new Layout(bds.getWidth(), bds.getHeight(), -bds.getY(), factory, attrs, new Layout[0], 0); } // We know det is a Gate. Determine sublayouts. CircuitDetermination.Gate gate = (CircuitDetermination.Gate) det; ComponentFactory factory = gate.getFactory(); ArrayList inputs = gate.getInputs(); // Handle a NOT implemented with a NAND as a special case if (gate.isNandNot()) { CircuitDetermination subDet = inputs.get(0); if (!(subDet instanceof CircuitDetermination.Input)) { Layout[] sub = new Layout[1]; sub[0] = layoutGatesSub(subDet); sub[0].y = 0; AttributeSet attrs = factory.createAttributeSet(); attrs.setValue(GateAttributes.ATTR_SIZE, GateAttributes.SIZE_NARROW); attrs.setValue(GateAttributes.ATTR_INPUTS, Integer.valueOf(2)); // determine layout's width Bounds bds = factory.getOffsetBounds(attrs); int betweenWidth = 40; if (sub[0].width == 0) betweenWidth = 0; int width = sub[0].width + betweenWidth + bds.getWidth(); // determine outputY and layout's height. int outputY = sub[0].y + sub[0].outputY; int height = sub[0].height; int minOutputY = roundUp(-bds.getY()); if (minOutputY > outputY) { // we have to shift everything down because otherwise // the component will peek over the rectangle's top. int dy = minOutputY - outputY; sub[0].y += dy; height += dy; outputY += dy; } int minHeight = outputY + bds.getY() + bds.getHeight(); if (minHeight > height) height = minHeight; // ok; create and return the layout. return new Layout(width, height, outputY, factory, attrs, sub, sub[0].width); } } Layout[] sub = new Layout[inputs.size()]; int subWidth = 0; // maximum width of sublayouts int subHeight = 0; // total height of sublayouts for (int i = 0; i < sub.length; i++) { sub[i] = layoutGatesSub(inputs.get(i)); if (sub.length % 2 == 0 && i == (sub.length + 1) / 2 && sub[i - 1].height + sub[i].height == 0) { // if there are an even number of inputs, then there is a // 20-tall gap between the middle two inputs. Ensure the two // middle inputs are at least 20 pixels apart. subHeight += 10; } sub[i].y = subHeight; subWidth = Math.max(subWidth, sub[i].width); subHeight += sub[i].height + 10; } subHeight -= 10; AttributeSet attrs = factory.createAttributeSet(); if (factory == NotGate.FACTORY) { attrs.setValue(NotGate.ATTR_SIZE, NotGate.SIZE_NARROW); } else { attrs.setValue(GateAttributes.ATTR_SIZE, GateAttributes.SIZE_NARROW); int ins = sub.length; attrs.setValue(GateAttributes.ATTR_INPUTS, Integer.valueOf(ins)); } // determine layout's width Bounds bds = factory.getOffsetBounds(attrs); int betweenWidth = 40 + 10 * (sub.length / 2 - 1); if (sub.length == 1) betweenWidth = 20; if (subWidth == 0) betweenWidth = 0; int width = subWidth + betweenWidth + bds.getWidth(); // determine outputY and layout's height. int outputY; if (sub.length % 2 == 1) { // odd number - match the middle input int i = (sub.length - 1) / 2; outputY = sub[i].y + sub[i].outputY; } else { // even number - halfway between middle two inputs int i0 = (sub.length / 2) - 1; int i1 = (sub.length / 2); int o0 = sub[i0].y + sub[i0].outputY; int o1 = sub[i1].y + sub[i1].outputY; outputY = roundDown((o0 + o1) / 2); } int height = subHeight; int minOutputY = roundUp(-bds.getY()); if (minOutputY > outputY) { // we have to shift everything down because otherwise // the component will peek over the rectangle's top. int dy = minOutputY - outputY; for (int i = 0; i < sub.length; i++) sub[i].y += dy; height += dy; outputY += dy; } int minHeight = outputY + bds.getY() + bds.getHeight(); if (minHeight > height) height = minHeight; // ok; create and return the layout. return new Layout(width, height, outputY, factory, attrs, sub, subWidth); } private static int roundDown(int value) { return value / 10 * 10; } private static int roundUp(int value) { return (value + 9) / 10 * 10; } // // computeInputData // private static InputData computeInputData(AnalyzerModel model) { InputData ret = new InputData(); VariableList inputs = model.getInputs(); int spineX = 60; ret.names = new String[inputs.size()]; for (int i = 0; i < inputs.size(); i++) { String name = inputs.get(i); ret.names[i] = name; ret.inputs.put(name, new SingleInput(spineX)); spineX += 20; } ret.startX = spineX; return ret; } private static class InputData { int startX; String[] names; HashMap inputs = new HashMap(); InputData() { } int getStartX() { return startX; } int getSpineX(String input) { SingleInput data = inputs.get(input); return data.spineX; } void registerConnection(String input, Location loc) { SingleInput data = inputs.get(input); data.ys.add(loc); } } private static class SingleInput { int spineX; ArrayList ys = new ArrayList(); SingleInput(int spineX) { this.spineX = spineX; } } // // placeComponents // /** * @param circuit the circuit where to place the components. * @param layout the layout specifying the gates to place there. * @param x the left edge of where the layout should be placed. * @param y the top edge of where the layout should be placed. * @param inputData information about how to reach inputs. * @param output a point to which the output should be connected. */ private static void placeComponents(CircuitMutation result, Layout layout, int x, int y, InputData inputData, Location output) { if (layout.inputName != null) { int inputX = inputData.getSpineX(layout.inputName); Location input = Location.create(inputX, output.getY()); inputData.registerConnection(layout.inputName, input); result.add(Wire.create(input, output)); return; } Location compOutput = Location.create(x + layout.width, output.getY()); Component parent = layout.factory.createComponent(compOutput, layout.attrs); result.add(parent); if (!compOutput.equals(output)) { result.add(Wire.create(compOutput, output)); } // handle a NOT gate pattern implemented with NAND as a special case if (layout.factory == NandGate.FACTORY && layout.subLayouts.length == 1 && layout.subLayouts[0].inputName == null) { Layout sub = layout.subLayouts[0]; Location input0 = parent.getEnd(1).getLocation(); Location input1 = parent.getEnd(2).getLocation(); int midX = input0.getX() - 20; Location subOutput = Location.create(midX, output.getY()); Location midInput0 = Location.create(midX, input0.getY()); Location midInput1 = Location.create(midX, input1.getY()); result.add(Wire.create(subOutput, midInput0)); result.add(Wire.create(midInput0, input0)); result.add(Wire.create(subOutput, midInput1)); result.add(Wire.create(midInput1, input1)); int subX = x + layout.subX - sub.width; placeComponents(result, sub, subX, y + sub.y, inputData, subOutput); return; } if (layout.subLayouts.length == parent.getEnds().size() - 2) { int index = layout.subLayouts.length / 2 + 1; Object factory = parent.getFactory(); if (factory instanceof AbstractGate) { Value val = ((AbstractGate) factory).getIdentity(); Integer valInt = Integer.valueOf(val.toIntValue()); Location loc = parent.getEnd(index).getLocation(); AttributeSet attrs = Constant.FACTORY.createAttributeSet(); attrs.setValue(Constant.ATTR_VALUE, valInt); result.add(Constant.FACTORY.createComponent(loc, attrs)); } } for (int i = 0; i < layout.subLayouts.length; i++) { Layout sub = layout.subLayouts[i]; int inputIndex = i + 1; Location subDest = parent.getEnd(inputIndex).getLocation(); int subOutputY = y + sub.y + sub.outputY; if (sub.inputName != null) { int destY = subDest.getY(); if (i == 0 && destY < subOutputY || i == layout.subLayouts.length - 1 && destY > subOutputY) { subOutputY = destY; } } Location subOutput; int numSubs = layout.subLayouts.length; if (subOutputY == subDest.getY()) { subOutput = subDest; } else { int back; if (i < numSubs / 2) { if (subOutputY < subDest.getY()) { // bending upward back = i; } else { back = ((numSubs - 1) / 2) - i; } } else { if (subOutputY > subDest.getY()) { // bending downward back = numSubs - 1 - i; } else { back = i - (numSubs / 2); } } int subOutputX = subDest.getX() - 20 - 10 * back; subOutput = Location.create(subOutputX, subOutputY); Location mid = Location.create(subOutputX, subDest.getY()); result.add(Wire.create(subOutput, mid)); result.add(Wire.create(mid, subDest)); } int subX = x + layout.subX - sub.width; int subY = y + sub.y; placeComponents(result, sub, subX, subY, inputData, subOutput); } } // // placeOutput // private static void placeOutput(CircuitMutation result, Location loc, String name) { ComponentFactory factory = Pin.FACTORY; AttributeSet attrs = factory.createAttributeSet(); attrs.setValue(StdAttr.FACING, Direction.WEST); attrs.setValue(Pin.ATTR_TYPE, Boolean.TRUE); attrs.setValue(StdAttr.LABEL, name); attrs.setValue(Pin.ATTR_LABEL_LOC, Direction.NORTH); result.add(factory.createComponent(loc, attrs)); } // // placeInputs // private static void placeInputs(CircuitMutation result, InputData inputData) { ArrayList forbiddenYs = new ArrayList(); Comparator compareYs = new CompareYs(); int curX = 40; int curY = 30; for (int i = 0; i < inputData.names.length; i++) { String name = inputData.names[i]; SingleInput singleInput = inputData.inputs.get(name); // determine point where we can intersect with spine int spineX = singleInput.spineX; Location spineLoc = Location.create(spineX, curY); if (singleInput.ys.size() > 0) { // search for a Y that won't intersect with others // (we needn't bother if the pin doesn't connect // with anything anyway.) Collections.sort(forbiddenYs, compareYs); while (Collections.binarySearch(forbiddenYs, spineLoc, compareYs) >= 0) { curY += 10; spineLoc = Location.create(spineX, curY); } singleInput.ys.add(spineLoc); } Location loc = Location.create(curX, curY); // now create the pin ComponentFactory factory = Pin.FACTORY; AttributeSet attrs = factory.createAttributeSet(); attrs.setValue(StdAttr.FACING, Direction.EAST); attrs.setValue(Pin.ATTR_TYPE, Boolean.FALSE); attrs.setValue(Pin.ATTR_TRISTATE, Boolean.FALSE); attrs.setValue(StdAttr.LABEL, name); attrs.setValue(Pin.ATTR_LABEL_LOC, Direction.NORTH); result.add(factory.createComponent(loc, attrs)); ArrayList spine = singleInput.ys; if (spine.size() > 0) { // create wire connecting pin to spine /* This should no longer matter - the wires will be repaired * anyway by the circuit's WireRepair class. if (spine.size() == 2 && spine.get(0).equals(spine.get(1))) { // a freak accident where the input is used just once, // and it happens that the pin is placed where no // spine is necessary Iterator it = circuit.getWires(spineLoc).iterator(); Wire existing = it.next(); Wire replace = Wire.create(loc, existing.getEnd1()); result.replace(existing, replace); } else { */ result.add(Wire.create(loc, spineLoc)); // } // create spine Collections.sort(spine, compareYs); Location prev = spine.get(0); for (int k = 1, n = spine.size(); k < n; k++) { Location cur = spine.get(k); if (!cur.equals(prev)) { result.add(Wire.create(prev, cur)); prev = cur; } } } // advance y and forbid spine intersections for next pin forbiddenYs.addAll(singleInput.ys); curY += 50; } } private static class CompareYs implements Comparator { public int compare(Location a, Location b) { return a.getY() - b.getY(); } } } logisim-2.7.1/src/com/cburch/logisim/std/gates/Buffer.java0000644000175000017500000001302411527054350023313 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.gates; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.util.Map; import com.cburch.logisim.analyze.model.Expression; import com.cburch.logisim.circuit.ExpressionComputer; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.file.Options; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.tools.key.BitWidthConfigurator; import com.cburch.logisim.util.GraphicsUtil; import com.cburch.logisim.util.Icons; class Buffer extends InstanceFactory { public static InstanceFactory FACTORY = new Buffer(); private Buffer() { super("Buffer", Strings.getter("bufferComponent")); setAttributes(new Attribute[] { StdAttr.FACING, StdAttr.WIDTH, GateAttributes.ATTR_OUTPUT, StdAttr.LABEL, StdAttr.LABEL_FONT }, new Object[] { Direction.EAST, BitWidth.ONE, GateAttributes.OUTPUT_01, "", StdAttr.DEFAULT_LABEL_FONT }); setIcon(Icons.getIcon("bufferGate.gif")); setFacingAttribute(StdAttr.FACING); setKeyConfigurator(new BitWidthConfigurator(StdAttr.WIDTH)); setPorts(new Port[] { new Port(0, 0, Port.OUTPUT, StdAttr.WIDTH), new Port(0, -20, Port.INPUT, StdAttr.WIDTH), }); } @Override public Bounds getOffsetBounds(AttributeSet attrs) { Direction facing = attrs.getValue(StdAttr.FACING); if (facing == Direction.SOUTH) return Bounds.create(-9, -20, 18, 20); if (facing == Direction.NORTH) return Bounds.create(-9, 0, 18, 20); if (facing == Direction.WEST) return Bounds.create(0, -9, 20, 18); return Bounds.create(-20, -9, 20, 18); } @Override public void propagate(InstanceState state) { Value in = state.getPort(1); in = Buffer.repair(state, in); state.setPort(0, in, GateAttributes.DELAY); } // // methods for instances // @Override protected void configureNewInstance(Instance instance) { configurePorts(instance); instance.addAttributeListener(); NotGate.configureLabel(instance, false, null); } @Override protected void instanceAttributeChanged(Instance instance, Attribute attr) { if (attr == StdAttr.FACING) { instance.recomputeBounds(); configurePorts(instance); NotGate.configureLabel(instance, false, null); } } private void configurePorts(Instance instance) { Direction facing = instance.getAttributeValue(StdAttr.FACING); Port[] ports = new Port[2]; ports[0] = new Port(0, 0, Port.OUTPUT, StdAttr.WIDTH); Location out = Location.create(0, 0).translate(facing, -20); ports[1] = new Port(out.getX(), out.getY(), Port.INPUT, StdAttr.WIDTH); instance.setPorts(ports); } @Override public Object getInstanceFeature(final Instance instance, Object key) { if (key == ExpressionComputer.class) { return new ExpressionComputer() { public void computeExpression(Map expressionMap) { Expression e = expressionMap.get(instance.getPortLocation(1)); if (e != null) { expressionMap.put(instance.getPortLocation(0), e); } } }; } return super.getInstanceFeature(instance, key); } // // painting methods // @Override public void paintGhost(InstancePainter painter) { paintBase(painter); } @Override public void paintInstance(InstancePainter painter) { Graphics g = painter.getGraphics(); g.setColor(Color.BLACK); paintBase(painter); painter.drawPorts(); painter.drawLabel(); } private void paintBase(InstancePainter painter) { Direction facing = painter.getAttributeValue(StdAttr.FACING); Location loc = painter.getLocation(); int x = loc.getX(); int y = loc.getY(); Graphics g = painter.getGraphics(); g.translate(x, y); double rotate = 0.0; if (facing != Direction.EAST && g instanceof Graphics2D) { rotate = -facing.toRadians(); ((Graphics2D) g).rotate(rotate); } GraphicsUtil.switchToWidth(g, 2); int[] xp = new int[4]; int[] yp = new int[4]; xp[0] = 0; yp[0] = 0; xp[1] = -19; yp[1] = -7; xp[2] = -19; yp[2] = 7; xp[3] = 0; yp[3] = 0; g.drawPolyline(xp, yp, 4); if (rotate != 0.0) { ((Graphics2D) g).rotate(-rotate); } g.translate(-x, -y); } // // static methods - shared with other classes // static Value repair(InstanceState state, Value v) { AttributeSet opts = state.getProject().getOptions().getAttributeSet(); Object onUndefined = opts.getValue(Options.ATTR_GATE_UNDEFINED); boolean errorIfUndefined = onUndefined.equals(Options.GATE_UNDEFINED_ERROR); Value repaired; if (errorIfUndefined) { int vw = v.getWidth(); BitWidth w = state.getAttributeValue(StdAttr.WIDTH); int ww = w.getWidth(); if (vw == ww && v.isFullyDefined()) return v; Value[] vs = new Value[w.getWidth()]; for (int i = 0; i < vs.length; i++) { Value ini = i < vw ? v.get(i) : Value.ERROR; vs[i] = ini.isFullyDefined() ? ini : Value.ERROR; } repaired = Value.create(vs); } else { repaired = v; } Object outType = state.getAttributeValue(GateAttributes.ATTR_OUTPUT); return AbstractGate.pullOutput(repaired, outType); } } logisim-2.7.1/src/com/cburch/logisim/std/gates/AndGate.java0000644000175000017500000000340611446034560023411 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.gates; import java.awt.Graphics; import com.cburch.logisim.analyze.model.Expression; import com.cburch.logisim.analyze.model.Expressions; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.util.GraphicsUtil; class AndGate extends AbstractGate { public static AndGate FACTORY = new AndGate(); private AndGate() { super("AND Gate", Strings.getter("andGateComponent")); setRectangularLabel("&"); setIconNames("andGate.gif", "andGateRect.gif", "dinAndGate.gif"); } @Override protected void paintIconShaped(InstancePainter painter) { Graphics g = painter.getGraphics(); int[] xp = new int[] { 10, 2, 2, 10 }; int[] yp = new int[] { 2, 2, 18, 18 }; g.drawPolyline(xp, yp, 4); GraphicsUtil.drawCenteredArc(g, 10, 10, 8, -90, 180); } @Override protected void paintShape(InstancePainter painter, int width, int height) { PainterShaped.paintAnd(painter, width, height); } @Override protected void paintDinShape(InstancePainter painter, int width, int height, int inputs) { PainterDin.paintAnd(painter, width, height, false); } @Override protected Value computeOutput(Value[] inputs, int numInputs, InstanceState state) { return GateFunctions.computeAnd(inputs, numInputs); } @Override protected Expression computeExpression(Expression[] inputs, int numInputs) { Expression ret = inputs[0]; for (int i = 1; i < numInputs; i++) { ret = Expressions.and(ret, inputs[i]); } return ret; } @Override protected Value getIdentity() { return Value.TRUE; } } logisim-2.7.1/src/com/cburch/logisim/std/gates/AbstractGate.java0000644000175000017500000003740711527054334024463 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.gates; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.util.Map; import javax.swing.Icon; import com.cburch.logisim.LogisimVersion; import com.cburch.logisim.analyze.model.Expression; import com.cburch.logisim.analyze.model.Expressions; import com.cburch.logisim.circuit.ExpressionComputer; import com.cburch.logisim.comp.TextField; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.file.Options; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.prefs.AppPreferences; import com.cburch.logisim.tools.WireRepair; import com.cburch.logisim.tools.WireRepairData; import com.cburch.logisim.tools.key.BitWidthConfigurator; import com.cburch.logisim.tools.key.IntegerConfigurator; import com.cburch.logisim.tools.key.JoinedConfigurator; import com.cburch.logisim.util.GraphicsUtil; import com.cburch.logisim.util.Icons; import com.cburch.logisim.util.StringGetter; abstract class AbstractGate extends InstanceFactory { private String[] iconNames = new String[3]; private Icon[] icons = new Icon[3]; private int bonusWidth = 0; private boolean negateOutput = false; private boolean isXor = false; private String rectLabel = ""; private boolean paintInputLines; protected AbstractGate(String name, StringGetter desc) { this(name, desc, false); } protected AbstractGate(String name, StringGetter desc, boolean isXor) { super(name, desc); this.isXor = isXor; setFacingAttribute(StdAttr.FACING); setKeyConfigurator(JoinedConfigurator.create( new IntegerConfigurator(GateAttributes.ATTR_INPUTS, 2, GateAttributes.MAX_INPUTS, 0), new BitWidthConfigurator(StdAttr.WIDTH))); } @Override public AttributeSet createAttributeSet() { return new GateAttributes(isXor); } @Override public Object getDefaultAttributeValue(Attribute attr, LogisimVersion ver) { if (attr instanceof NegateAttribute) { return Boolean.FALSE; } else { return super.getDefaultAttributeValue(attr, ver); } } @Override public Bounds getOffsetBounds(AttributeSet attrsBase) { GateAttributes attrs = (GateAttributes) attrsBase; Direction facing = attrs.facing; int size = ((Integer) attrs.size.getValue()).intValue(); int inputs = attrs.inputs; if (inputs % 2 == 0) { inputs++; } int negated = attrs.negated; int width = size + bonusWidth + (negateOutput ? 10 : 0); if (negated != 0) { width += 10; } int height = Math.max(10 * inputs, size); if (facing == Direction.SOUTH) { return Bounds.create(-height / 2, -width, height, width); } else if (facing == Direction.NORTH) { return Bounds.create(-height / 2, 0, height, width); } else if (facing == Direction.WEST) { return Bounds.create(0, -height / 2, width, height); } else { return Bounds.create(-width, -height / 2, width, height); } } @Override public boolean contains(Location loc, AttributeSet attrsBase) { GateAttributes attrs = (GateAttributes) attrsBase; if (super.contains(loc, attrs)) { if (attrs.negated == 0) { return true; } else { Direction facing = attrs.facing; Bounds bds = getOffsetBounds(attrsBase); int delt; if (facing == Direction.NORTH) { delt = loc.getY() - (bds.getY() + bds.getHeight()); } else if (facing == Direction.SOUTH) { delt = loc.getY() - bds.getY(); } else if (facing == Direction.WEST) { delt = loc.getX() - (bds.getX() + bds.getHeight()); } else { delt = loc.getX() - bds.getX(); } if (Math.abs(delt) > 5) { return true; } else { int inputs = attrs.inputs; for (int i = 1; i <= inputs; i++) { Location offs = getInputOffset(attrs, i); if (loc.manhattanDistanceTo(offs) <= 5) return true; } return false; } } } else { return false; } } // // painting methods // @Override public void paintGhost(InstancePainter painter) { paintBase(painter); } @Override public void paintInstance(InstancePainter painter) { paintBase(painter); if (!painter.isPrintView() || painter.getGateShape() == AppPreferences.SHAPE_RECTANGULAR) { painter.drawPorts(); } } private void paintBase(InstancePainter painter) { GateAttributes attrs = (GateAttributes) painter.getAttributeSet(); Direction facing = attrs.facing; int inputs = attrs.inputs; int negated = attrs.negated; Object shape = painter.getGateShape(); Location loc = painter.getLocation(); Bounds bds = painter.getOffsetBounds(); int width = bds.getWidth(); int height = bds.getHeight(); if (facing == Direction.NORTH || facing == Direction.SOUTH) { int t = width; width = height; height = t; } if (negated != 0) { width -= 10; } Graphics g = painter.getGraphics(); Color baseColor = g.getColor(); if (shape == AppPreferences.SHAPE_SHAPED && paintInputLines) { PainterShaped.paintInputLines(painter, this); } else if (negated != 0) { for (int i = 0; i < inputs; i++) { int negatedBit = (negated >> i) & 1; if (negatedBit == 1) { Location in = getInputOffset(attrs, i); Location cen = in.translate(facing, 5); painter.drawDongle(loc.getX() + cen.getX(), loc.getY() + cen.getY()); } } } g.setColor(baseColor); g.translate(loc.getX(), loc.getY()); double rotate = 0.0; if (facing != Direction.EAST && g instanceof Graphics2D) { rotate = -facing.toRadians(); Graphics2D g2 = (Graphics2D) g; g2.rotate(rotate); } if (shape == AppPreferences.SHAPE_RECTANGULAR) { paintRectangular(painter, width, height); } else if (shape == AppPreferences.SHAPE_DIN40700) { paintDinShape(painter, width, height, inputs); } else { // SHAPE_SHAPED if (negateOutput) { g.translate(-10, 0); paintShape(painter, width - 10, height); painter.drawDongle(5, 0); g.translate(10, 0); } else { paintShape(painter, width, height); } } if (rotate != 0.0) { ((Graphics2D) g).rotate(-rotate); } g.translate(-loc.getX(), -loc.getY()); painter.drawLabel(); } protected void setIconNames(String all) { setIconNames(all, all, all); } protected void setIconNames(String shaped, String rect, String din) { iconNames[0] = shaped; iconNames[1] = rect; iconNames[2] = din; } private Icon getIcon(int type) { Icon ret = icons[type]; if (ret != null) { return ret; } else { String iconName = iconNames[type]; if (iconName == null) { return null; } else { ret = Icons.getIcon(iconName); if (ret == null) { iconNames[type] = null; } else { icons[type] = ret; } return ret; } } } private Icon getIconShaped() { return getIcon(0); } private Icon getIconRectangular() { return getIcon(1); } private Icon getIconDin40700() { return getIcon(2); } protected void setPaintInputLines(boolean value) { paintInputLines = value; } protected abstract void paintIconShaped(InstancePainter painter); protected void paintIconRectangular(InstancePainter painter) { Graphics g = painter.getGraphics(); g.drawRect(1, 2, 16, 16); if (negateOutput) g.drawOval(16, 8, 4, 4); String label = getRectangularLabel(painter.getAttributeSet()); GraphicsUtil.drawCenteredText(g, label, 9, 8); } @Override public final void paintIcon(InstancePainter painter) { Graphics g = painter.getGraphics(); g.setColor(Color.black); if (painter.getGateShape() == AppPreferences.SHAPE_RECTANGULAR) { Icon iconRect = getIconRectangular(); if (iconRect != null) { iconRect.paintIcon(painter.getDestination(), g, 2, 2); } else { paintIconRectangular(painter); } } else if (painter.getGateShape() == AppPreferences.SHAPE_DIN40700) { Icon iconDin = getIconDin40700(); if (iconDin != null) { iconDin.paintIcon(painter.getDestination(), g, 2, 2); } else { paintIconRectangular(painter); } } else { Icon iconShaped = getIconShaped(); if (iconShaped != null) { iconShaped.paintIcon(painter.getDestination(), g, 2, 2); } else { paintIconShaped(painter); } } } protected void setAdditionalWidth(int value) { bonusWidth = value; } protected void setNegateOutput(boolean value) { negateOutput = value; } protected void setRectangularLabel(String value) { rectLabel = value; } protected String getRectangularLabel(AttributeSet attrs) { return rectLabel; } // // protected methods intended to be overridden // protected abstract Value getIdentity(); protected abstract void paintShape(InstancePainter painter, int width, int height); protected void paintRectangular(InstancePainter painter, int width, int height) { int don = negateOutput ? 10 : 0; AttributeSet attrs = painter.getAttributeSet(); painter.drawRectangle(-width, -height / 2, width - don, height, getRectangularLabel(attrs)); if (negateOutput) { painter.drawDongle(-5, 0); } } protected abstract void paintDinShape(InstancePainter painter, int width, int height, int inputs); protected abstract Value computeOutput(Value[] inputs, int numInputs, InstanceState state); protected abstract Expression computeExpression(Expression[] inputs, int numInputs); protected boolean shouldRepairWire(Instance instance, WireRepairData data) { return false; } // // methods for instances // @Override protected void configureNewInstance(Instance instance) { instance.addAttributeListener(); computePorts(instance); computeLabel(instance); } @Override protected void instanceAttributeChanged(Instance instance, Attribute attr) { if (attr == GateAttributes.ATTR_SIZE || attr == StdAttr.FACING) { instance.recomputeBounds(); computePorts(instance); computeLabel(instance); } else if (attr == GateAttributes.ATTR_INPUTS || attr instanceof NegateAttribute) { instance.recomputeBounds(); computePorts(instance); } else if (attr == GateAttributes.ATTR_XOR) { instance.fireInvalidated(); } } private void computeLabel(Instance instance) { GateAttributes attrs = (GateAttributes) instance.getAttributeSet(); Direction facing = attrs.facing; int baseWidth = ((Integer) attrs.size.getValue()).intValue(); int axis = baseWidth / 2 + (negateOutput ? 10 : 0); int perp = 0; if (AppPreferences.GATE_SHAPE.get().equals(AppPreferences.SHAPE_RECTANGULAR)) { perp += 6; } Location loc = instance.getLocation(); int cx; int cy; if (facing == Direction.NORTH) { cx = loc.getX() + perp; cy = loc.getY() + axis; } else if (facing == Direction.SOUTH) { cx = loc.getX() - perp; cy = loc.getY() - axis; } else if (facing == Direction.WEST) { cx = loc.getX() + axis; cy = loc.getY() - perp; } else { cx = loc.getX() - axis; cy = loc.getY() + perp; } instance.setTextField(StdAttr.LABEL, StdAttr.LABEL_FONT, cx, cy, TextField.H_CENTER, TextField.V_CENTER); } void computePorts(Instance instance) { GateAttributes attrs = (GateAttributes) instance.getAttributeSet(); int inputs = attrs.inputs; Port[] ports = new Port[inputs + 1]; ports[0] = new Port(0, 0, Port.OUTPUT, StdAttr.WIDTH); for (int i = 0; i < inputs; i++) { Location offs = getInputOffset(attrs, i); ports[i + 1] = new Port(offs.getX(), offs.getY(), Port.INPUT, StdAttr.WIDTH); } instance.setPorts(ports); } @Override public void propagate(InstanceState state) { GateAttributes attrs = (GateAttributes) state.getAttributeSet(); int inputCount = attrs.inputs; int negated = attrs.negated; AttributeSet opts = state.getProject().getOptions().getAttributeSet(); boolean errorIfUndefined = opts.getValue(Options.ATTR_GATE_UNDEFINED) .equals(Options.GATE_UNDEFINED_ERROR); Value[] inputs = new Value[inputCount]; int numInputs = 0; boolean error = false; for (int i = 1; i <= inputCount; i++) { if (state.isPortConnected(i)) { int negatedBit = (negated >> (i - 1)) & 1; if (negatedBit == 1) { inputs[numInputs] = state.getPort(i).not(); } else { inputs[numInputs] = state.getPort(i); } numInputs++; } else { if (errorIfUndefined) { error = true; } } } Value out = null; if (numInputs == 0 || error) { out = Value.createError(attrs.width); } else { out = computeOutput(inputs, numInputs, state); out = pullOutput(out, attrs.out); } state.setPort(0, out, GateAttributes.DELAY); } static Value pullOutput(Value value, Object outType) { if (outType == GateAttributes.OUTPUT_01) { return value; } else { Value[] v = value.getAll(); if (outType == GateAttributes.OUTPUT_0Z) { for (int i = 0; i < v.length; i++) { if (v[i] == Value.TRUE) v[i] = Value.UNKNOWN; } } else if (outType == GateAttributes.OUTPUT_Z1) { for (int i = 0; i < v.length; i++) { if (v[i] == Value.FALSE) v[i] = Value.UNKNOWN; } } return Value.create(v); } } @Override protected Object getInstanceFeature(final Instance instance, Object key) { if (key == WireRepair.class) { return new WireRepair() { public boolean shouldRepairWire(WireRepairData data) { return AbstractGate.this.shouldRepairWire(instance, data); } }; } if (key == ExpressionComputer.class) { return new ExpressionComputer() { public void computeExpression(Map expressionMap) { GateAttributes attrs = (GateAttributes) instance.getAttributeSet(); int inputCount = attrs.inputs; int negated = attrs.negated; Expression[] inputs = new Expression[inputCount]; int numInputs = 0; for (int i = 1; i <= inputCount; i++) { Expression e = expressionMap.get(instance.getPortLocation(i)); if (e != null) { int negatedBit = (negated >> (i - 1)) & 1; if (negatedBit == 1) { e = Expressions.not(e); } inputs[numInputs] = e; ++numInputs; } } if (numInputs > 0) { Expression out = AbstractGate.this.computeExpression(inputs, numInputs); expressionMap.put(instance.getPortLocation(0), out); } } }; } return super.getInstanceFeature(instance, key); } Location getInputOffset(GateAttributes attrs, int index) { int inputs = attrs.inputs; Direction facing = attrs.facing; int size = ((Integer) attrs.size.getValue()).intValue(); int axisLength = size + bonusWidth + (negateOutput ? 10 : 0); int negated = attrs.negated; int skipStart; int skipDist; int skipLowerEven = 10; if (inputs <= 3) { if (size < 40) { skipStart = -5; skipDist = 10; skipLowerEven = 10; } else if (size < 60 || inputs <= 2) { skipStart = -10; skipDist = 20; skipLowerEven = 20; } else { skipStart = -15; skipDist = 30; skipLowerEven = 30; } } else if (inputs == 4 && size >= 60) { skipStart = -5; skipDist = 20; skipLowerEven = 0; } else { skipStart = -5; skipDist = 10; skipLowerEven = 10; } int dy; if ((inputs & 1) == 1) { dy = skipStart * (inputs - 1) + skipDist * index; } else { dy = skipStart * inputs + skipDist * index; if (index >= inputs / 2) dy += skipLowerEven; } int dx = axisLength; int negatedBit = (negated >> index) & 1; if (negatedBit == 1) { dx += 10; } if (facing == Direction.NORTH) { return Location.create(dy, dx); } else if (facing == Direction.SOUTH) { return Location.create(dy, -dx); } else if (facing == Direction.WEST) { return Location.create(dx, dy); } else { return Location.create(-dx, dy); } } } logisim-2.7.1/src/com/cburch/logisim/std/Builtin.java0000644000175000017500000000230111527054370022403 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std; import java.util.Arrays; import java.util.Collections; import java.util.List; import com.cburch.logisim.std.arith.Arithmetic; import com.cburch.logisim.std.base.Base; import com.cburch.logisim.std.gates.Gates; import com.cburch.logisim.std.io.Io; import com.cburch.logisim.std.memory.Memory; import com.cburch.logisim.std.plexers.Plexers; import com.cburch.logisim.std.wiring.Wiring; import com.cburch.logisim.tools.Library; import com.cburch.logisim.tools.Tool; public class Builtin extends Library { private List libraries = null; public Builtin() { libraries = Arrays.asList(new Library[] { new Base(), new Gates(), new Wiring(), new Plexers(), new Arithmetic(), new Memory(), new Io(), }); } @Override public String getName() { return "Builtin"; } @Override public String getDisplayName() { return Strings.get("builtinLibrary"); } @Override public List getTools() { return Collections.emptyList(); } @Override public List getLibraries() { return libraries; } } logisim-2.7.1/src/com/cburch/logisim/std/base/0000755000175000017500000000000011524651342021047 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/logisim/std/base/TextAttributes.java0000644000175000017500000000470711446034566024723 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.base; import java.awt.Font; import java.util.Arrays; import java.util.List; import com.cburch.logisim.data.AbstractAttributeSet; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeOption; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.instance.StdAttr; class TextAttributes extends AbstractAttributeSet { private static final List> ATTRIBUTES = Arrays.asList(new Attribute[] { Text.ATTR_TEXT, Text.ATTR_FONT, Text.ATTR_HALIGN, Text.ATTR_VALIGN }); private String text; private Font font; private AttributeOption halign; private AttributeOption valign; private Bounds offsetBounds; public TextAttributes() { text = ""; font = StdAttr.DEFAULT_LABEL_FONT; halign = Text.ATTR_HALIGN.parse("center"); valign = Text.ATTR_VALIGN.parse("base"); offsetBounds = null; } String getText() { return text; } Font getFont() { return font; } int getHorizontalAlign() { return ((Integer) halign.getValue()).intValue(); } int getVerticalAlign() { return ((Integer) valign.getValue()).intValue(); } Bounds getOffsetBounds() { return offsetBounds; } boolean setOffsetBounds(Bounds value) { Bounds old = offsetBounds; boolean same = old == null ? value == null : old.equals(value); if (!same) { offsetBounds = value; } return !same; } @Override protected void copyInto(AbstractAttributeSet destObj) { ; // nothing to do } @Override public List> getAttributes() { return ATTRIBUTES; } @Override @SuppressWarnings("unchecked") public V getValue(Attribute attr) { if (attr == Text.ATTR_TEXT) return (V) text; if (attr == Text.ATTR_FONT) return (V) font; if (attr == Text.ATTR_HALIGN) return (V) halign; if (attr == Text.ATTR_VALIGN) return (V) valign; return null; } @Override public void setValue(Attribute attr, V value) { if (attr == Text.ATTR_TEXT) { text = (String) value; } else if (attr == Text.ATTR_FONT) { font = (Font) value; } else if (attr == Text.ATTR_HALIGN) { halign = (AttributeOption) value; } else if (attr == Text.ATTR_VALIGN) { valign = (AttributeOption) value; } else { throw new IllegalArgumentException("unknown attribute"); } offsetBounds = null; fireAttributeValueChanged(attr, value); } } logisim-2.7.1/src/com/cburch/logisim/std/base/Text.java0000644000175000017500000001264211446034566022651 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.base; import java.awt.Color; import java.awt.Graphics; import java.awt.Font; import java.awt.Rectangle; import com.cburch.logisim.comp.TextField; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeOption; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Attributes; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Location; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.util.GraphicsUtil; public class Text extends InstanceFactory { public static Attribute ATTR_TEXT = Attributes.forString("text", Strings.getter("textTextAttr")); public static Attribute ATTR_FONT = Attributes.forFont("font", Strings.getter("textFontAttr")); public static Attribute ATTR_HALIGN = Attributes.forOption("halign", Strings.getter("textHorzAlignAttr"), new AttributeOption[] { new AttributeOption(Integer.valueOf(TextField.H_LEFT), "left", Strings.getter("textHorzAlignLeftOpt")), new AttributeOption(Integer.valueOf(TextField.H_RIGHT), "right", Strings.getter("textHorzAlignRightOpt")), new AttributeOption(Integer.valueOf(TextField.H_CENTER), "center", Strings.getter("textHorzAlignCenterOpt")), }); public static Attribute ATTR_VALIGN = Attributes.forOption("valign", Strings.getter("textVertAlignAttr"), new AttributeOption[] { new AttributeOption(Integer.valueOf(TextField.V_TOP), "top", Strings.getter("textVertAlignTopOpt")), new AttributeOption(Integer.valueOf(TextField.V_BASELINE), "base", Strings.getter("textVertAlignBaseOpt")), new AttributeOption(Integer.valueOf(TextField.V_BOTTOM), "bottom", Strings.getter("textVertAlignBottomOpt")), new AttributeOption(Integer.valueOf(TextField.H_CENTER), "center", Strings.getter("textVertAlignCenterOpt")), }); public static final Text FACTORY = new Text(); private Text() { super("Text", Strings.getter("textComponent")); setIconName("text.gif"); setShouldSnap(false); } @Override public AttributeSet createAttributeSet() { return new TextAttributes(); } @Override public Bounds getOffsetBounds(AttributeSet attrsBase) { TextAttributes attrs = (TextAttributes) attrsBase; String text = attrs.getText(); if (text == null || text.equals("")) { return Bounds.EMPTY_BOUNDS; } else { Bounds bds = attrs.getOffsetBounds(); if (bds == null) { bds = estimateBounds(attrs); attrs.setOffsetBounds(bds); } return bds == null ? Bounds.EMPTY_BOUNDS : bds; } } private Bounds estimateBounds(TextAttributes attrs) { // TODO - you can imagine being more clever here String text = attrs.getText(); if (text == null || text.length() == 0) return Bounds.EMPTY_BOUNDS; int size = attrs.getFont().getSize(); int h = size; int w = size * text.length() / 2; int ha = attrs.getHorizontalAlign(); int va = attrs.getVerticalAlign(); int x; int y; if (ha == TextField.H_LEFT) { x = 0; } else if (ha == TextField.H_RIGHT) { x = -w; } else { x = -w / 2; } if (va == TextField.V_TOP) { y = 0; } else if (va == TextField.V_CENTER) { y = -h / 2; } else { y = -h; } return Bounds.create(x, y, w, h); } // // graphics methods // @Override public void paintGhost(InstancePainter painter) { TextAttributes attrs = (TextAttributes) painter.getAttributeSet(); String text = attrs.getText(); if (text == null || text.equals("")) return; int halign = attrs.getHorizontalAlign(); int valign = attrs.getVerticalAlign(); Graphics g = painter.getGraphics(); Font old = g.getFont(); g.setFont(attrs.getFont()); GraphicsUtil.drawText(g, text, 0, 0, halign, valign); String textTrim = text.endsWith(" ") ? text.substring(0, text.length() - 1) : text; Bounds newBds; if (textTrim.equals("")) { newBds = Bounds.EMPTY_BOUNDS; } else { Rectangle bdsOut = GraphicsUtil.getTextBounds(g, textTrim, 0, 0, halign, valign); newBds = Bounds.create(bdsOut).expand(4); } if (attrs.setOffsetBounds(newBds)) { Instance instance = painter.getInstance(); if (instance != null) instance.recomputeBounds(); } g.setFont(old); } @Override public void paintInstance(InstancePainter painter) { Location loc = painter.getLocation(); int x = loc.getX(); int y = loc.getY(); Graphics g = painter.getGraphics(); g.translate(x, y); g.setColor(Color.BLACK); paintGhost(painter); g.translate(-x, -y); } // // methods for instances // @Override protected void configureNewInstance(Instance instance) { configureLabel(instance); instance.addAttributeListener(); } @Override protected void instanceAttributeChanged(Instance instance, Attribute attr) { if (attr == ATTR_HALIGN || attr == ATTR_VALIGN) { configureLabel(instance); } } private void configureLabel(Instance instance) { TextAttributes attrs = (TextAttributes) instance.getAttributeSet(); Location loc = instance.getLocation(); instance.setTextField(ATTR_TEXT, ATTR_FONT, loc.getX(), loc.getY(), attrs.getHorizontalAlign(), attrs.getVerticalAlign()); } @Override public void propagate(InstanceState state) { } } logisim-2.7.1/src/com/cburch/logisim/std/base/Strings.java0000644000175000017500000000117111446034566023351 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.base; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.StringGetter; class Strings { private static LocaleManager source = new LocaleManager("resources/logisim", "std"); public static String get(String key) { return source.get(key); } public static StringGetter getter(String key) { return source.getter(key); } public static StringGetter getter(String key, String arg) { return source.getter(key, arg); } } logisim-2.7.1/src/com/cburch/logisim/std/base/Base.java0000644000175000017500000000222711524651342022567 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.base; import java.util.Arrays; import java.util.List; import com.cburch.logisim.tools.Library; import com.cburch.logisim.tools.MenuTool; import com.cburch.logisim.tools.PokeTool; import com.cburch.logisim.tools.SelectTool; import com.cburch.logisim.tools.TextTool; import com.cburch.logisim.tools.AddTool; import com.cburch.logisim.tools.EditTool; import com.cburch.logisim.tools.Tool; import com.cburch.logisim.tools.WiringTool; public class Base extends Library { private List tools = null; public Base() { SelectTool select = new SelectTool(); WiringTool wiring = new WiringTool(); tools = Arrays.asList(new Tool[] { new PokeTool(), new EditTool(select, wiring), select, wiring, new TextTool(), new MenuTool(), new AddTool(Text.FACTORY), }); } @Override public String getName() { return "Base"; } @Override public String getDisplayName() { return Strings.get("baseLibrary"); } @Override public List getTools() { return tools; } } logisim-2.7.1/src/com/cburch/logisim/std/arith/0000755000175000017500000000000011530601324021234 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/logisim/std/arith/Subtractor.java0000644000175000017500000000613011451010374024230 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.arith; import java.awt.Color; import java.awt.Graphics; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.tools.key.BitWidthConfigurator; import com.cburch.logisim.util.GraphicsUtil; public class Subtractor extends InstanceFactory { private static final int IN0 = 0; private static final int IN1 = 1; private static final int OUT = 2; private static final int B_IN = 3; private static final int B_OUT = 4; public Subtractor() { super("Subtractor", Strings.getter("subtractorComponent")); setAttributes(new Attribute[] { StdAttr.WIDTH }, new Object[] { BitWidth.create(8) }); setKeyConfigurator(new BitWidthConfigurator(StdAttr.WIDTH)); setOffsetBounds(Bounds.create(-40, -20, 40, 40)); setIconName("subtractor.gif"); Port[] ps = new Port[5]; ps[IN0] = new Port(-40, -10, Port.INPUT, StdAttr.WIDTH); ps[IN1] = new Port(-40, 10, Port.INPUT, StdAttr.WIDTH); ps[OUT] = new Port( 0, 0, Port.OUTPUT, StdAttr.WIDTH); ps[B_IN] = new Port(-20, -20, Port.INPUT, 1); ps[B_OUT] = new Port(-20, 20, Port.OUTPUT, 1); ps[IN0].setToolTip(Strings.getter("subtractorMinuendTip")); ps[IN1].setToolTip(Strings.getter("subtractorSubtrahendTip")); ps[OUT].setToolTip(Strings.getter("subtractorOutputTip")); ps[B_IN].setToolTip(Strings.getter("subtractorBorrowInTip")); ps[B_OUT].setToolTip(Strings.getter("subtractorBorrowOutTip")); setPorts(ps); } @Override public void propagate(InstanceState state) { // get attributes BitWidth data = state.getAttributeValue(StdAttr.WIDTH); // compute outputs Value a = state.getPort(IN0); Value b = state.getPort(IN1); Value b_in = state.getPort(B_IN); if (b_in == Value.UNKNOWN || b_in == Value.NIL) b_in = Value.FALSE; Value[] outs = Adder.computeSum(data, a, b.not(), b_in.not()); // propagate them int delay = (data.getWidth() + 4) * Adder.PER_DELAY; state.setPort(OUT, outs[0], delay); state.setPort(B_OUT, outs[1].not(), delay); } @Override public void paintInstance(InstancePainter painter) { Graphics g = painter.getGraphics(); painter.drawBounds(); g.setColor(Color.GRAY); painter.drawPort(IN0); painter.drawPort(IN1); painter.drawPort(OUT); painter.drawPort(B_IN, "b in", Direction.NORTH); painter.drawPort(B_OUT, "b out", Direction.SOUTH); Location loc = painter.getLocation(); int x = loc.getX(); int y = loc.getY(); GraphicsUtil.switchToWidth(g, 2); g.setColor(Color.BLACK); g.drawLine(x - 15, y, x - 5, y); GraphicsUtil.switchToWidth(g, 1); } } logisim-2.7.1/src/com/cburch/logisim/std/arith/Strings.java0000644000175000017500000000117211451010374023532 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.arith; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.StringGetter; class Strings { private static LocaleManager source = new LocaleManager("resources/logisim", "std"); public static String get(String key) { return source.get(key); } public static StringGetter getter(String key) { return source.getter(key); } public static StringGetter getter(String key, String arg) { return source.getter(key, arg); } } logisim-2.7.1/src/com/cburch/logisim/std/arith/Shifter.java0000644000175000017500000001472111451010374023511 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.arith; import java.awt.Color; import java.awt.Graphics; import java.util.Arrays; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeOption; import com.cburch.logisim.data.Attributes; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.tools.key.BitWidthConfigurator; public class Shifter extends InstanceFactory { static final AttributeOption SHIFT_LOGICAL_LEFT = new AttributeOption("ll", Strings.getter("shiftLogicalLeft")); static final AttributeOption SHIFT_LOGICAL_RIGHT = new AttributeOption("lr", Strings.getter("shiftLogicalRight")); static final AttributeOption SHIFT_ARITHMETIC_RIGHT = new AttributeOption("ar", Strings.getter("shiftArithmeticRight")); static final AttributeOption SHIFT_ROLL_LEFT = new AttributeOption("rl", Strings.getter("shiftRollLeft")); static final AttributeOption SHIFT_ROLL_RIGHT = new AttributeOption("rr", Strings.getter("shiftRollRight")); static final Attribute ATTR_SHIFT = Attributes.forOption("shift", Strings.getter("shifterShiftAttr"), new AttributeOption[] { SHIFT_LOGICAL_LEFT, SHIFT_LOGICAL_RIGHT, SHIFT_ARITHMETIC_RIGHT, SHIFT_ROLL_LEFT, SHIFT_ROLL_RIGHT }); private static final int IN0 = 0; private static final int IN1 = 1; private static final int OUT = 2; public Shifter() { super("Shifter", Strings.getter("shifterComponent")); setAttributes(new Attribute[] { StdAttr.WIDTH, ATTR_SHIFT }, new Object[] { BitWidth.create(8), SHIFT_LOGICAL_LEFT }); setKeyConfigurator(new BitWidthConfigurator(StdAttr.WIDTH)); setOffsetBounds(Bounds.create(-40, -20, 40, 40)); setIconName("shifter.gif"); } @Override protected void configureNewInstance(Instance instance) { configurePorts(instance); instance.addAttributeListener(); } @Override protected void instanceAttributeChanged(Instance instance, Attribute attr) { if (attr == StdAttr.WIDTH) { configurePorts(instance); } } private void configurePorts(Instance instance) { BitWidth dataWid = instance.getAttributeValue(StdAttr.WIDTH); int data = dataWid == null ? 32 : dataWid.getWidth(); int shift = 1; while ((1 << shift) < data) shift++; Port[] ps = new Port[3]; ps[IN0] = new Port(-40, -10, Port.INPUT, data); ps[IN1] = new Port(-40, 10, Port.INPUT, shift); ps[OUT] = new Port( 0, 0, Port.OUTPUT, data); ps[IN0].setToolTip(Strings.getter("shifterInputTip")); ps[IN1].setToolTip(Strings.getter("shifterDistanceTip")); ps[OUT].setToolTip(Strings.getter("shifterOutputTip")); instance.setPorts(ps); } @Override public void propagate(InstanceState state) { // compute output BitWidth dataWidth = state.getAttributeValue(StdAttr.WIDTH); int bits = dataWidth == null ? 32 : dataWidth.getWidth(); Value vx = state.getPort(IN0); Value vd = state.getPort(IN1); Value vy; // y will by x shifted by d if (vd.isFullyDefined() && vx.getWidth() == bits) { int d = vd.toIntValue(); Object shift = state.getAttributeValue(ATTR_SHIFT); if (d == 0) { vy = vx; } else if (vx.isFullyDefined()) { int x = vx.toIntValue(); int y; if (shift == SHIFT_LOGICAL_RIGHT) { y = x >>> d; } else if (shift == SHIFT_ARITHMETIC_RIGHT) { if (d >= bits) d = bits - 1; y = x >> d | ((x << (32 - bits)) >> (32 - bits + d)); } else if (shift == SHIFT_ROLL_RIGHT) { if (d >= bits) d -= bits; y = (x >>> d) | (x << (bits - d)); } else if (shift == SHIFT_ROLL_LEFT) { if (d >= bits) d -= bits; y = (x << d) | (x >>> (bits - d)); } else { // SHIFT_LOGICAL_LEFT y = x << d; } vy = Value.createKnown(dataWidth, y); } else { Value[] x = vx.getAll(); Value[] y = new Value[bits]; if (shift == SHIFT_LOGICAL_RIGHT) { if (d >= bits) d = bits; System.arraycopy(x, d, y, 0, bits - d); Arrays.fill(y, bits - d, bits, Value.FALSE); } else if (shift == SHIFT_ARITHMETIC_RIGHT) { if (d >= bits) d = bits; System.arraycopy(x, d, y, 0, x.length - d); Arrays.fill(y, bits - d, y.length, x[bits - 1]); } else if (shift == SHIFT_ROLL_RIGHT) { if (d >= bits) d -= bits; System.arraycopy(x, d, y, 0, bits - d); System.arraycopy(x, 0, y, bits - d, d); } else if (shift == SHIFT_ROLL_LEFT) { if (d >= bits) d -= bits; System.arraycopy(x, x.length - d, y, 0, d); System.arraycopy(x, 0, y, d, bits - d); } else { // SHIFT_LOGICAL_LEFT if (d >= bits) d = bits; Arrays.fill(y, 0, d, Value.FALSE); System.arraycopy(x, 0, y, d, bits - d); } vy = Value.create(y); } } else { vy = Value.createError(dataWidth); } // propagate them int delay = dataWidth.getWidth() * (3 * Adder.PER_DELAY); state.setPort(OUT, vy, delay); } @Override public void paintInstance(InstancePainter painter) { Graphics g = painter.getGraphics(); painter.drawBounds(); painter.drawPorts(); Location loc = painter.getLocation(); int x = loc.getX() - 15; int y = loc.getY(); Object shift = painter.getAttributeValue(ATTR_SHIFT); g.setColor(Color.BLACK); if (shift == SHIFT_LOGICAL_RIGHT) { g.fillRect(x, y - 1, 8, 3); drawArrow(g, x + 10, y, -4); } else if (shift == SHIFT_ARITHMETIC_RIGHT) { g.fillRect(x, y - 1, 2, 3); g.fillRect(x + 3, y - 1, 5, 3); drawArrow(g, x + 10, y, -4); } else if (shift == SHIFT_ROLL_RIGHT) { g.fillRect(x, y - 1, 5, 3); g.fillRect(x + 8, y - 7, 2, 8); g.fillRect(x, y - 7, 2, 8); g.fillRect(x, y - 7, 10, 2); drawArrow(g, x + 8, y, -4); } else if (shift == SHIFT_ROLL_LEFT) { g.fillRect(x + 6, y - 1, 4, 3); g.fillRect(x + 8, y - 7, 2, 8); g.fillRect(x, y - 7, 2, 8); g.fillRect(x, y - 7, 10, 2); drawArrow(g, x + 3, y, 4); } else { // SHIFT_LOGICAL_LEFT g.fillRect(x + 2, y - 1, 8, 3); drawArrow(g, x, y, 4); } } private void drawArrow(Graphics g, int x, int y, int d) { int[] px = { x + d, x, x + d }; int[] py = { y + d, y, y - d }; g.fillPolygon(px, py, 3); } } logisim-2.7.1/src/com/cburch/logisim/std/arith/Negator.java0000644000175000017500000000517311451010374023505 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.arith; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.tools.key.BitWidthConfigurator; public class Negator extends InstanceFactory { private static final int IN = 0; private static final int OUT = 1; public Negator() { super("Negator", Strings.getter("negatorComponent")); setAttributes(new Attribute[] { StdAttr.WIDTH }, new Object[] { BitWidth.create(8) }); setKeyConfigurator(new BitWidthConfigurator(StdAttr.WIDTH)); setOffsetBounds(Bounds.create(-40, -20, 40, 40)); setIconName("negator.gif"); Port[] ps = new Port[2]; ps[IN] = new Port(-40, 0, Port.INPUT, StdAttr.WIDTH); ps[OUT] = new Port( 0, 0, Port.OUTPUT, StdAttr.WIDTH); ps[IN].setToolTip(Strings.getter("negatorInputTip")); ps[OUT].setToolTip(Strings.getter("negatorOutputTip")); setPorts(ps); } @Override public void propagate(InstanceState state) { // get attributes BitWidth dataWidth = state.getAttributeValue(StdAttr.WIDTH); // compute outputs Value in = state.getPort(IN); Value out; if (in.isFullyDefined()) { out = Value.createKnown(in.getBitWidth(), -in.toIntValue()); } else { Value[] bits = in.getAll(); Value fill = Value.FALSE; int pos = 0; while (pos < bits.length) { if (bits[pos] == Value.FALSE) { bits[pos] = fill; } else if (bits[pos] == Value.TRUE) { if (fill != Value.FALSE) bits[pos] = fill; pos++; break; } else if (bits[pos] == Value.ERROR) { fill = Value.ERROR; } else { if (fill == Value.FALSE) fill = bits[pos]; else bits[pos] = fill; } pos++; } while (pos < bits.length) { if (bits[pos] == Value.TRUE) { bits[pos] = Value.FALSE; } else if (bits[pos] == Value.FALSE) { bits[pos] = Value.TRUE; } pos++; } out = Value.create(bits); } // propagate them int delay = (dataWidth.getWidth() + 2) * Adder.PER_DELAY; state.setPort(OUT, out, delay); } @Override public void paintInstance(InstancePainter painter) { painter.drawBounds(); painter.drawPort(IN); painter.drawPort(OUT, "-x", Direction.WEST); } } logisim-2.7.1/src/com/cburch/logisim/std/arith/Multiplier.java0000644000175000017500000001200011451010374024217 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.arith; import java.awt.Color; import java.awt.Graphics; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.tools.key.BitWidthConfigurator; import com.cburch.logisim.util.GraphicsUtil; public class Multiplier extends InstanceFactory { static final int PER_DELAY = 1; private static final int IN0 = 0; private static final int IN1 = 1; private static final int OUT = 2; private static final int C_IN = 3; private static final int C_OUT = 4; public Multiplier() { super("Multiplier", Strings.getter("multiplierComponent")); setAttributes(new Attribute[] { StdAttr.WIDTH }, new Object[] { BitWidth.create(8) }); setKeyConfigurator(new BitWidthConfigurator(StdAttr.WIDTH)); setOffsetBounds(Bounds.create(-40, -20, 40, 40)); setIconName("multiplier.gif"); Port[] ps = new Port[5]; ps[IN0] = new Port(-40, -10, Port.INPUT, StdAttr.WIDTH); ps[IN1] = new Port(-40, 10, Port.INPUT, StdAttr.WIDTH); ps[OUT] = new Port( 0, 0, Port.OUTPUT, StdAttr.WIDTH); ps[C_IN] = new Port(-20, -20, Port.INPUT, StdAttr.WIDTH); ps[C_OUT] = new Port(-20, 20, Port.OUTPUT, StdAttr.WIDTH); ps[IN0].setToolTip(Strings.getter("multiplierInputTip")); ps[IN1].setToolTip(Strings.getter("multiplierInputTip")); ps[OUT].setToolTip(Strings.getter("multiplierOutputTip")); ps[C_IN].setToolTip(Strings.getter("multiplierCarryInTip")); ps[C_OUT].setToolTip(Strings.getter("multiplierCarryOutTip")); setPorts(ps); } @Override public void propagate(InstanceState state) { // get attributes BitWidth dataWidth = state.getAttributeValue(StdAttr.WIDTH); // compute outputs Value a = state.getPort(IN0); Value b = state.getPort(IN1); Value c_in = state.getPort(C_IN); Value[] outs = Multiplier.computeProduct(dataWidth, a, b, c_in); // propagate them int delay = dataWidth.getWidth() * (dataWidth.getWidth() + 2) * PER_DELAY; state.setPort(OUT, outs[0], delay); state.setPort(C_OUT, outs[1], delay); } @Override public void paintInstance(InstancePainter painter) { Graphics g = painter.getGraphics(); painter.drawBounds(); g.setColor(Color.GRAY); painter.drawPort(IN0); painter.drawPort(IN1); painter.drawPort(OUT); painter.drawPort(C_IN, "c in", Direction.NORTH); painter.drawPort(C_OUT, "c out", Direction.SOUTH); Location loc = painter.getLocation(); int x = loc.getX(); int y = loc.getY(); GraphicsUtil.switchToWidth(g, 2); g.setColor(Color.BLACK); g.drawLine(x - 15, y - 5, x - 5, y + 5); g.drawLine(x - 15, y + 5, x - 5, y - 5); GraphicsUtil.switchToWidth(g, 1); } static Value[] computeProduct(BitWidth width, Value a, Value b, Value c_in) { int w = width.getWidth(); if (c_in == Value.NIL || c_in.isUnknown()) c_in = Value.createKnown(width, 0); if (a.isFullyDefined() && b.isFullyDefined() && c_in.isFullyDefined()) { long sum = (long) a.toIntValue() * (long) b.toIntValue() + (long) c_in.toIntValue(); return new Value[] { Value.createKnown(width, (int) sum), Value.createKnown(width, (int) (sum >> w)) }; } else { Value[] avals = a.getAll(); int aOk = findUnknown(avals); int aErr = findError(avals); int ax = getKnown(avals); Value[] bvals = b.getAll(); int bOk = findUnknown(bvals); int bErr = findError(bvals); int bx = getKnown(bvals); Value[] cvals = c_in.getAll(); int cOk = findUnknown(cvals); int cErr = findError(cvals); int cx = getKnown(cvals); int known = Math.min(Math.min(aOk, bOk), cOk); int error = Math.min(Math.min(aErr, bErr), cErr); int ret = ax * bx + cx; Value[] bits = new Value[w]; for (int i = 0; i < w; i++) { if (i < known) { bits[i] = ((ret & (1 << i)) != 0 ? Value.TRUE : Value.FALSE); } else if (i < error) { bits[i] = Value.UNKNOWN; } else { bits[i] = Value.ERROR; } } return new Value[] { Value.create(bits), error < w ? Value.createError(width) : Value.createUnknown(width) }; } } private static int findUnknown(Value[] vals) { for (int i = 0; i < vals.length; i++) { if (!vals[i].isFullyDefined()) return i; } return vals.length; } private static int findError(Value[] vals) { for (int i = 0; i < vals.length; i++) { if (vals[i].isErrorValue()) return i; } return vals.length; } private static int getKnown(Value[] vals) { int ret = 0; for (int i = 0; i < vals.length; i++) { int val = vals[i].toIntValue(); if (val < 0) return ret; ret |= val << i; } return ret; } } logisim-2.7.1/src/com/cburch/logisim/std/arith/Divider.java0000644000175000017500000001022211451010374023463 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.arith; import java.awt.Color; import java.awt.Graphics; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.tools.key.BitWidthConfigurator; import com.cburch.logisim.util.GraphicsUtil; public class Divider extends InstanceFactory { static final int PER_DELAY = 1; private static final int IN0 = 0; private static final int IN1 = 1; private static final int OUT = 2; private static final int UPPER = 3; private static final int REM = 4; public Divider() { super("Divider", Strings.getter("dividerComponent")); setAttributes(new Attribute[] { StdAttr.WIDTH }, new Object[] { BitWidth.create(8) }); setKeyConfigurator(new BitWidthConfigurator(StdAttr.WIDTH)); setOffsetBounds(Bounds.create(-40, -20, 40, 40)); setIconName("divider.gif"); Port[] ps = new Port[5]; ps[IN0] = new Port(-40, -10, Port.INPUT, StdAttr.WIDTH); ps[IN1] = new Port(-40, 10, Port.INPUT, StdAttr.WIDTH); ps[OUT] = new Port( 0, 0, Port.OUTPUT, StdAttr.WIDTH); ps[UPPER] = new Port(-20, -20, Port.INPUT, StdAttr.WIDTH); ps[REM] = new Port(-20, 20, Port.OUTPUT, StdAttr.WIDTH); ps[IN0].setToolTip(Strings.getter("dividerDividendLowerTip")); ps[IN1].setToolTip(Strings.getter("dividerDivisorTip")); ps[OUT].setToolTip(Strings.getter("dividerOutputTip")); ps[UPPER].setToolTip(Strings.getter("dividerDividendUpperTip")); ps[REM].setToolTip(Strings.getter("dividerRemainderTip")); setPorts(ps); } @Override public void propagate(InstanceState state) { // get attributes BitWidth dataWidth = state.getAttributeValue(StdAttr.WIDTH); // compute outputs Value a = state.getPort(IN0); Value b = state.getPort(IN1); Value upper = state.getPort(UPPER); Value[] outs = Divider.computeResult(dataWidth, a, b, upper); // propagate them int delay = dataWidth.getWidth() * (dataWidth.getWidth() + 2) * PER_DELAY; state.setPort(OUT, outs[0], delay); state.setPort(REM, outs[1], delay); } @Override public void paintInstance(InstancePainter painter) { Graphics g = painter.getGraphics(); painter.drawBounds(); g.setColor(Color.GRAY); painter.drawPort(IN0); painter.drawPort(IN1); painter.drawPort(OUT); painter.drawPort(UPPER, Strings.get("dividerUpperInput"), Direction.NORTH); painter.drawPort(REM, Strings.get("dividerRemainderOutput"), Direction.SOUTH); Location loc = painter.getLocation(); int x = loc.getX(); int y = loc.getY(); GraphicsUtil.switchToWidth(g, 2); g.setColor(Color.BLACK); g.fillOval(x - 12, y - 7, 4, 4); g.drawLine(x - 15, y, x - 5, y); g.fillOval(x - 12, y + 3, 4, 4); GraphicsUtil.switchToWidth(g, 1); } static Value[] computeResult(BitWidth width, Value a, Value b, Value upper) { int w = width.getWidth(); if (upper == Value.NIL || upper.isUnknown()) upper = Value.createKnown(width, 0); if (a.isFullyDefined() && b.isFullyDefined() && upper.isFullyDefined()) { long num = ((long) upper.toIntValue() << w) | ((long) a.toIntValue() & 0xFFFFFFFFL); long den = (long) b.toIntValue() & 0xFFFFFFFFL; if (den == 0) den = 1; long result = num / den; long rem = num % den; if (rem < 0) { if (den >= 0) { rem += den; result--; } else { rem -= den; result++; } } return new Value[] { Value.createKnown(width, (int) result), Value.createKnown(width, (int) rem) }; } else if (a.isErrorValue() || b.isErrorValue() || upper.isErrorValue()) { return new Value[] { Value.createError(width), Value.createError(width) }; } else { return new Value[] { Value.createUnknown(width), Value.createUnknown(width) }; } } } logisim-2.7.1/src/com/cburch/logisim/std/arith/Comparator.java0000644000175000017500000001051311500267076024217 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.arith; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeOption; import com.cburch.logisim.data.Attributes; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.tools.key.BitWidthConfigurator; public class Comparator extends InstanceFactory { private static final AttributeOption SIGNED_OPTION = new AttributeOption("twosComplement", "twosComplement", Strings.getter("twosComplementOption")); private static final AttributeOption UNSIGNED_OPTION = new AttributeOption("unsigned", "unsigned", Strings.getter("unsignedOption")); private static final Attribute MODE_ATTRIBUTE = Attributes.forOption("mode", Strings.getter("comparatorType"), new AttributeOption[] { SIGNED_OPTION, UNSIGNED_OPTION }); private static final int IN0 = 0; private static final int IN1 = 1; private static final int GT = 2; private static final int EQ = 3; private static final int LT = 4; public Comparator() { super("Comparator", Strings.getter("comparatorComponent")); setAttributes(new Attribute[] { StdAttr.WIDTH, MODE_ATTRIBUTE }, new Object[] { BitWidth.create(8), SIGNED_OPTION }); setKeyConfigurator(new BitWidthConfigurator(StdAttr.WIDTH)); setOffsetBounds(Bounds.create(-40, -20, 40, 40)); setIconName("comparator.gif"); Port[] ps = new Port[5]; ps[IN0] = new Port(-40, -10, Port.INPUT, StdAttr.WIDTH); ps[IN1] = new Port(-40, 10, Port.INPUT, StdAttr.WIDTH); ps[GT] = new Port( 0, -10, Port.OUTPUT, 1); ps[EQ] = new Port( 0, 0, Port.OUTPUT, 1); ps[LT] = new Port( 0, 10, Port.OUTPUT, 1); ps[IN0].setToolTip(Strings.getter("comparatorInputATip")); ps[IN1].setToolTip(Strings.getter("comparatorInputBTip")); ps[GT].setToolTip(Strings.getter("comparatorGreaterTip")); ps[EQ].setToolTip(Strings.getter("comparatorEqualTip")); ps[LT].setToolTip(Strings.getter("comparatorLessTip")); setPorts(ps); } @Override public void propagate(InstanceState state) { // get attributes BitWidth dataWidth = state.getAttributeValue(StdAttr.WIDTH); // compute outputs Value gt = Value.FALSE; Value eq = Value.TRUE; Value lt = Value.FALSE; Value a = state.getPort(IN0); Value b = state.getPort(IN1); Value[] ax = a.getAll(); Value[] bx = b.getAll(); int maxlen = Math.max(ax.length, bx.length); for (int pos = maxlen - 1; pos >= 0; pos--) { Value ab = pos < ax.length ? ax[pos] : Value.ERROR; Value bb = pos < bx.length ? bx[pos] : Value.ERROR; if (pos == ax.length - 1 && ab != bb) { Object mode = state.getAttributeValue(MODE_ATTRIBUTE); if (mode != UNSIGNED_OPTION) { Value t = ab; ab = bb; bb = t; } } if (ab == Value.ERROR || bb == Value.ERROR) { gt = Value.ERROR; eq = Value.ERROR; lt = Value.ERROR; break; } else if (ab == Value.UNKNOWN || bb == Value.UNKNOWN) { gt = Value.UNKNOWN; eq = Value.UNKNOWN; lt = Value.UNKNOWN; break; } else if (ab != bb) { eq = Value.FALSE; if (ab == Value.TRUE) gt = Value.TRUE; else lt = Value.TRUE; break; } } // propagate them int delay = (dataWidth.getWidth() + 2) * Adder.PER_DELAY; state.setPort(GT, gt, delay); state.setPort(EQ, eq, delay); state.setPort(LT, lt, delay); } @Override public void paintInstance(InstancePainter painter) { painter.drawBounds(); painter.drawPort(IN0); painter.drawPort(IN1); painter.drawPort(GT, ">", Direction.WEST); painter.drawPort(EQ, "=", Direction.WEST); painter.drawPort(LT, "<", Direction.WEST); } // // methods for instances // @Override protected void configureNewInstance(Instance instance) { instance.addAttributeListener(); } @Override protected void instanceAttributeChanged(Instance instance, Attribute attr) { instance.fireInvalidated(); } } logisim-2.7.1/src/com/cburch/logisim/std/arith/BitFinder.java0000644000175000017500000001324311451672636023770 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.arith; import java.awt.Graphics; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeOption; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Attributes; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.tools.key.BitWidthConfigurator; import com.cburch.logisim.util.GraphicsUtil; public class BitFinder extends InstanceFactory { static final AttributeOption LOW_ONE = new AttributeOption("low1", Strings.getter("bitFinderLowOption", "1")); static final AttributeOption HIGH_ONE = new AttributeOption("high1", Strings.getter("bitFinderHighOption", "1")); static final AttributeOption LOW_ZERO = new AttributeOption("low0", Strings.getter("bitFinderLowOption", "0")); static final AttributeOption HIGH_ZERO = new AttributeOption("high0", Strings.getter("bitFinderHighOption", "0")); static final Attribute TYPE = Attributes.forOption("type", Strings.getter("bitFinderTypeAttr"), new AttributeOption[] { LOW_ONE, HIGH_ONE, LOW_ZERO, HIGH_ZERO }); public BitFinder() { super("BitFinder", Strings.getter("bitFinderComponent")); setAttributes(new Attribute[] { StdAttr.WIDTH, TYPE }, new Object[] { BitWidth.create(8), LOW_ONE }); setKeyConfigurator(new BitWidthConfigurator(StdAttr.WIDTH)); setIconName("bitfindr.gif"); } @Override public Bounds getOffsetBounds(AttributeSet attrs) { return Bounds.create(-40, -20, 40, 40); } @Override protected void configureNewInstance(Instance instance) { configurePorts(instance); instance.addAttributeListener(); } @Override protected void instanceAttributeChanged(Instance instance, Attribute attr) { if (attr == StdAttr.WIDTH) { configurePorts(instance); } else if (attr == TYPE) { instance.fireInvalidated(); } } private void configurePorts(Instance instance) { BitWidth inWidth = instance.getAttributeValue(StdAttr.WIDTH); int outWidth = computeOutputBits(inWidth.getWidth() - 1); Port[] ps = new Port[3]; ps[0] = new Port(-20, 20, Port.OUTPUT, BitWidth.ONE); ps[1] = new Port( 0, 0, Port.OUTPUT, BitWidth.create(outWidth)); ps[2] = new Port(-40, 0, Port.INPUT, inWidth); Object type = instance.getAttributeValue(TYPE); if (type == HIGH_ZERO) { ps[0].setToolTip(Strings.getter("bitFinderPresentTip", "0")); ps[1].setToolTip(Strings.getter("bitFinderIndexHighTip", "0")); } else if (type == LOW_ZERO) { ps[0].setToolTip(Strings.getter("bitFinderPresentTip", "0")); ps[1].setToolTip(Strings.getter("bitFinderIndexLowTip", "0")); } else if (type == HIGH_ONE) { ps[0].setToolTip(Strings.getter("bitFinderPresentTip", "1")); ps[1].setToolTip(Strings.getter("bitFinderIndexHighTip", "1")); } else { ps[0].setToolTip(Strings.getter("bitFinderPresentTip", "1")); ps[1].setToolTip(Strings.getter("bitFinderIndexLowTip", "1")); } ps[2].setToolTip(Strings.getter("bitFinderInputTip")); instance.setPorts(ps); } private int computeOutputBits(int maxBits) { int outWidth = 1; while ((1 << outWidth) <= maxBits) outWidth++; return outWidth; } @Override public void propagate(InstanceState state) { int width = state.getAttributeValue(StdAttr.WIDTH).getWidth(); int outWidth = computeOutputBits(width - 1); Object type = state.getAttributeValue(TYPE); Value[] bits = state.getPort(2).getAll(); Value want; int i; if (type == HIGH_ZERO) { want = Value.FALSE; for (i = bits.length - 1; i >= 0 && bits[i] == Value.TRUE; i--) { } } else if (type == LOW_ZERO) { want = Value.FALSE; for (i = 0; i < bits.length && bits[i] == Value.TRUE; i++) { } } else if (type == HIGH_ONE) { want = Value.TRUE; for (i = bits.length - 1; i >= 0 && bits[i] == Value.FALSE; i--) { } } else { want = Value.TRUE; for (i = 0; i < bits.length && bits[i] == Value.FALSE; i++) { } } Value present; Value index; if (i < 0 || i >= bits.length) { present = Value.FALSE; index = Value.createKnown(BitWidth.create(outWidth), 0); } else if (bits[i] == want) { present = Value.TRUE; index = Value.createKnown(BitWidth.create(outWidth), i); } else { present = Value.ERROR; index = Value.createError(BitWidth.create(outWidth)); } int delay = outWidth * Adder.PER_DELAY; state.setPort(0, present, delay); state.setPort(1, index, delay); } @Override public void paintInstance(InstancePainter painter) { Graphics g = painter.getGraphics(); painter.drawBounds(); painter.drawPorts(); String top = Strings.get("bitFinderFindLabel"); String mid; String bot; Object type = painter.getAttributeValue(TYPE); if (type == HIGH_ZERO) { mid = Strings.get("bitFinderHighLabel"); bot = "0"; } else if (type == LOW_ZERO) { mid = Strings.get("bitFinderLowLabel"); bot = "0"; } else if (type == HIGH_ONE) { mid = Strings.get("bitFinderHighLabel"); bot = "1"; } else { mid = Strings.get("bitFinderLowLabel"); bot = "1"; } Bounds bds = painter.getBounds(); int x = bds.getX() + bds.getWidth() / 2; int y0 = bds.getY(); GraphicsUtil.drawCenteredText(g, top, x, y0 + 8); GraphicsUtil.drawCenteredText(g, mid, x, y0 + 20); GraphicsUtil.drawCenteredText(g, bot, x, y0 + 32); } } logisim-2.7.1/src/com/cburch/logisim/std/arith/BitAdder.java0000644000175000017500000001124611530601324023561 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.arith; import java.awt.Graphics; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Attributes; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.tools.key.BitWidthConfigurator; import com.cburch.logisim.tools.key.IntegerConfigurator; import com.cburch.logisim.tools.key.JoinedConfigurator; import com.cburch.logisim.util.GraphicsUtil; public class BitAdder extends InstanceFactory { static final Attribute NUM_INPUTS = Attributes.forIntegerRange("inputs", Strings.getter("gateInputsAttr"), 1, 32); public BitAdder() { super("BitAdder", Strings.getter("bitAdderComponent")); setAttributes(new Attribute[] { StdAttr.WIDTH, NUM_INPUTS }, new Object[] { BitWidth.create(8), Integer.valueOf(1) }); setKeyConfigurator(JoinedConfigurator.create( new IntegerConfigurator(NUM_INPUTS, 1, 32, 0), new BitWidthConfigurator(StdAttr.WIDTH))); setIconName("bitadder.gif"); } @Override public Bounds getOffsetBounds(AttributeSet attrs) { int inputs = attrs.getValue(NUM_INPUTS).intValue(); int h = Math.max(40, 10 * inputs); int y = inputs < 4 ? 20 : (((inputs - 1) / 2) * 10 + 5); return Bounds.create(-40, -y, 40, h); } @Override protected void configureNewInstance(Instance instance) { configurePorts(instance); instance.addAttributeListener(); } @Override protected void instanceAttributeChanged(Instance instance, Attribute attr) { if (attr == StdAttr.WIDTH) { configurePorts(instance); } else if (attr == NUM_INPUTS) { configurePorts(instance); instance.recomputeBounds(); } } private void configurePorts(Instance instance) { BitWidth inWidth = instance.getAttributeValue(StdAttr.WIDTH); int inputs = instance.getAttributeValue(NUM_INPUTS).intValue(); int outWidth = computeOutputBits(inWidth.getWidth(), inputs); int y; int dy = 10; switch (inputs) { case 1: y = 0; break; case 2: y = -10; dy = 20; break; case 3: y = -10; break; default: y = ((inputs - 1) / 2) * -10; } Port[] ps = new Port[inputs + 1]; ps[0] = new Port(0, 0, Port.OUTPUT, BitWidth.create(outWidth)); ps[0].setToolTip(Strings.getter("bitAdderOutputManyTip")); for (int i = 0; i < inputs; i++) { ps[i + 1] = new Port(-40, y + i * dy, Port.INPUT, inWidth); ps[i + 1].setToolTip(Strings.getter("bitAdderInputTip")); } instance.setPorts(ps); } private int computeOutputBits(int width, int inputs) { int maxBits = width * inputs; int outWidth = 1; while ((1 << outWidth) <= maxBits) outWidth++; return outWidth; } @Override public void propagate(InstanceState state) { int width = state.getAttributeValue(StdAttr.WIDTH).getWidth(); int inputs = state.getAttributeValue(NUM_INPUTS).intValue(); // compute the number of 1 bits int minCount = 0; // number that are definitely 1 int maxCount = 0; // number that are definitely not 0 (incl X/Z) for (int i = 1; i <= inputs; i++) { Value v = state.getPort(i); Value[] bits = v.getAll(); for (int j = 0; j < bits.length; j++) { Value b = bits[j]; if (b == Value.TRUE) minCount++; if (b != Value.FALSE) maxCount++; } } // compute which output bits should be error bits int unknownMask = 0; for (int i = minCount + 1; i <= maxCount; i++) { unknownMask |= (minCount ^ i); } Value[] out = new Value[computeOutputBits(width, inputs)]; for (int i = 0; i < out.length; i++) { if (((unknownMask >> i) & 1) != 0) { out[i] = Value.ERROR; } else if (((minCount >> i) & 1) != 0) { out[i] = Value.TRUE; } else { out[i] = Value.FALSE; } } int delay = out.length * Adder.PER_DELAY; state.setPort(0, Value.create(out), delay); } @Override public void paintInstance(InstancePainter painter) { Graphics g = painter.getGraphics(); painter.drawBounds(); painter.drawPorts(); GraphicsUtil.switchToWidth(g, 2); Location loc = painter.getLocation(); int x = loc.getX() - 10; int y = loc.getY(); g.drawLine(x - 2, y - 5, x - 2, y + 5); g.drawLine(x + 2, y - 5, x + 2, y + 5); g.drawLine(x - 5, y - 2, x + 5, y - 2); g.drawLine(x - 5, y + 2, x + 5, y + 2); } } logisim-2.7.1/src/com/cburch/logisim/std/arith/Arithmetic.java0000644000175000017500000000337211451010374024176 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.arith; import java.util.List; import com.cburch.logisim.tools.FactoryDescription; import com.cburch.logisim.tools.Library; import com.cburch.logisim.tools.Tool; public class Arithmetic extends Library { private static FactoryDescription[] DESCRIPTIONS = { new FactoryDescription("Adder", Strings.getter("adderComponent"), "adder.gif", "Adder"), new FactoryDescription("Subtractor", Strings.getter("subtractorComponent"), "subtractor.gif", "Subtractor"), new FactoryDescription("Multiplier", Strings.getter("multiplierComponent"), "multiplier.gif", "Multiplier"), new FactoryDescription("Divider", Strings.getter("dividerComponent"), "divider.gif", "Divider"), new FactoryDescription("Negator", Strings.getter("negatorComponent"), "negator.gif", "Negator"), new FactoryDescription("Comparator", Strings.getter("comparatorComponent"), "comparator.gif", "Comparator"), new FactoryDescription("Shifter", Strings.getter("shifterComponent"), "shifter.gif", "Shifter"), new FactoryDescription("BitAdder", Strings.getter("bitAdderComponent"), "bitadder.gif", "BitAdder"), new FactoryDescription("BitFinder", Strings.getter("bitFinderComponent"), "bitfindr.gif", "BitFinder"), }; private List tools = null; public Arithmetic() { } @Override public String getName() { return "Arithmetic"; } @Override public String getDisplayName() { return Strings.get("arithmeticLibrary"); } @Override public List getTools() { if (tools == null) { tools = FactoryDescription.getTools(Arithmetic.class, DESCRIPTIONS); } return tools; } } logisim-2.7.1/src/com/cburch/logisim/std/arith/Adder.java0000644000175000017500000001117311451010374023122 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.std.arith; import java.awt.Color; import java.awt.Graphics; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.tools.key.BitWidthConfigurator; import com.cburch.logisim.util.GraphicsUtil; public class Adder extends InstanceFactory { static final int PER_DELAY = 1; private static final int IN0 = 0; private static final int IN1 = 1; private static final int OUT = 2; private static final int C_IN = 3; private static final int C_OUT = 4; public Adder() { super("Adder", Strings.getter("adderComponent")); setAttributes(new Attribute[] { StdAttr.WIDTH }, new Object[] { BitWidth.create(8) }); setKeyConfigurator(new BitWidthConfigurator(StdAttr.WIDTH)); setOffsetBounds(Bounds.create(-40, -20, 40, 40)); setIconName("adder.gif"); Port[] ps = new Port[5]; ps[IN0] = new Port(-40, -10, Port.INPUT, StdAttr.WIDTH); ps[IN1] = new Port(-40, 10, Port.INPUT, StdAttr.WIDTH); ps[OUT] = new Port( 0, 0, Port.OUTPUT, StdAttr.WIDTH); ps[C_IN] = new Port(-20, -20, Port.INPUT, 1); ps[C_OUT] = new Port(-20, 20, Port.INPUT, 1); ps[IN0].setToolTip(Strings.getter("adderInputTip")); ps[IN1].setToolTip(Strings.getter("adderInputTip")); ps[OUT].setToolTip(Strings.getter("adderOutputTip")); ps[C_IN].setToolTip(Strings.getter("adderCarryInTip")); ps[C_OUT].setToolTip(Strings.getter("adderCarryOutTip")); setPorts(ps); } @Override public void propagate(InstanceState state) { // get attributes BitWidth dataWidth = state.getAttributeValue(StdAttr.WIDTH); // compute outputs Value a = state.getPort(IN0); Value b = state.getPort(IN1); Value c_in = state.getPort(C_IN); Value[] outs = Adder.computeSum(dataWidth, a, b, c_in); // propagate them int delay = (dataWidth.getWidth() + 2) * PER_DELAY; state.setPort(OUT, outs[0], delay); state.setPort(C_OUT, outs[1], delay); } @Override public void paintInstance(InstancePainter painter) { Graphics g = painter.getGraphics(); painter.drawBounds(); g.setColor(Color.GRAY); painter.drawPort(IN0); painter.drawPort(IN1); painter.drawPort(OUT); painter.drawPort(C_IN, "c in", Direction.NORTH); painter.drawPort(C_OUT, "c out", Direction.SOUTH); Location loc = painter.getLocation(); int x = loc.getX(); int y = loc.getY(); GraphicsUtil.switchToWidth(g, 2); g.setColor(Color.BLACK); g.drawLine(x - 15, y, x - 5, y); g.drawLine(x - 10, y - 5, x - 10, y + 5); GraphicsUtil.switchToWidth(g, 1); } static Value[] computeSum(BitWidth width, Value a, Value b, Value c_in) { int w = width.getWidth(); if (c_in == Value.UNKNOWN || c_in == Value.NIL) c_in = Value.FALSE; if (a.isFullyDefined() && b.isFullyDefined() && c_in.isFullyDefined()) { if (w >= 32) { long mask = (1L << w) - 1; long ax = (long) a.toIntValue() & mask; long bx = (long) b.toIntValue() & mask; long cx = (long) c_in.toIntValue() & mask; long sum = ax + bx + cx; return new Value[] { Value.createKnown(width, (int) sum), ((sum >> w) & 1) == 0 ? Value.FALSE : Value.TRUE }; } else { int sum = a.toIntValue() + b.toIntValue() + c_in.toIntValue(); return new Value[] { Value.createKnown(width, sum), ((sum >> w) & 1) == 0 ? Value.FALSE : Value.TRUE }; } } else { Value[] bits = new Value[w]; Value carry = c_in; for (int i = 0; i < w; i++) { if (carry == Value.ERROR) { bits[i] = Value.ERROR; } else if (carry == Value.UNKNOWN) { bits[i] = Value.UNKNOWN; } else { Value ab = a.get(i); Value bb = b.get(i); if (ab == Value.ERROR || bb == Value.ERROR) { bits[i] = Value.ERROR; carry = Value.ERROR; } else if (ab == Value.UNKNOWN || bb == Value.UNKNOWN) { bits[i] = Value.UNKNOWN; carry = Value.UNKNOWN; } else { int sum = (ab == Value.TRUE ? 1 : 0) + (bb == Value.TRUE ? 1 : 0) + (carry == Value.TRUE ? 1 : 0); bits[i] = (sum & 1) == 1 ? Value.TRUE : Value.FALSE; carry = (sum >= 2) ? Value.TRUE : Value.FALSE; } } } return new Value[] { Value.create(bits), carry }; } } } logisim-2.7.1/src/com/cburch/logisim/proj/0000755000175000017500000000000011541271674020322 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/logisim/proj/Strings.java0000644000175000017500000000125011446034554022612 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.proj; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.StringGetter; import com.cburch.logisim.util.StringUtil; class Strings { private static LocaleManager source = new LocaleManager("resources/logisim", "proj"); public static String get(String key) { return source.get(key); } public static String get(String key, String arg) { return StringUtil.format(source.get(key), arg); } public static StringGetter getter(String key) { return source.getter(key); } } logisim-2.7.1/src/com/cburch/logisim/proj/Projects.java0000644000175000017500000001225011500267122022742 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.proj; import java.awt.Dimension; import java.awt.Point; import java.awt.Window; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.beans.PropertyChangeListener; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.WeakHashMap; import com.cburch.logisim.file.Loader; import com.cburch.logisim.gui.main.Frame; import com.cburch.logisim.util.MacCompatibility; import com.cburch.logisim.util.PropertyChangeWeakSupport; public class Projects { public static final String projectListProperty = "projectList"; private static final WeakHashMap frameLocations = new WeakHashMap(); private static void projectRemoved(Project proj, Frame frame, MyListener listener) { frame.removeWindowListener(listener); openProjects.remove(proj); proj.getSimulator().shutDown(); propertySupport.firePropertyChange(projectListProperty, null, null); } private static class MyListener extends WindowAdapter { @Override public void windowActivated(WindowEvent event) { mostRecentFrame = (Frame) event.getSource(); } @Override public void windowClosing(WindowEvent event) { Frame frame = (Frame) event.getSource(); if ((frame.getExtendedState() & Frame.ICONIFIED) == 0) { mostRecentFrame = frame; try { frameLocations.put(frame, frame.getLocationOnScreen()); } catch (Throwable t) { } } } @Override public void windowClosed(WindowEvent event) { Frame frame = (Frame) event.getSource(); Project proj = frame.getProject(); if (frame == proj.getFrame()) { projectRemoved(proj, frame, this); } if (openProjects.isEmpty() && !MacCompatibility.isSwingUsingScreenMenuBar()) { ProjectActions.doQuit(); } } @Override public void windowOpened(WindowEvent event) { Frame frame = (Frame) event.getSource(); Project proj = frame.getProject(); if (frame == proj.getFrame() && !openProjects.contains(proj)) { openProjects.add(proj); propertySupport.firePropertyChange(projectListProperty, null, null); } } } private static final MyListener myListener = new MyListener(); private static final PropertyChangeWeakSupport propertySupport = new PropertyChangeWeakSupport(Projects.class); private static ArrayList openProjects = new ArrayList(); private static Frame mostRecentFrame = null; private Projects() { } public static Frame getTopFrame() { Frame ret = mostRecentFrame; if (ret == null) { Frame backup = null; for (Project proj : openProjects) { Frame frame = proj.getFrame(); if (ret == null) ret = frame; if (ret.isVisible() && (ret.getExtendedState() & Frame.ICONIFIED) != 0) { backup = ret; } } if (ret == null) ret = backup; } return ret; } static void windowCreated(Project proj, Frame oldFrame, Frame frame) { if (oldFrame != null) { projectRemoved(proj, oldFrame, myListener); } if (frame == null) return; // locate the window Point lowest = null; for (Project p : openProjects) { Frame f = p.getFrame(); if (f == null) continue; Point loc = p.getFrame().getLocation(); if (lowest == null || loc.y > lowest.y) lowest = loc; } if (lowest != null) { Dimension sz = frame.getToolkit().getScreenSize(); int x = Math.min(lowest.x + 20, sz.width - 200); int y = Math.min(lowest.y + 20, sz.height - 200); if (x < 0) x = 0; if (y < 0) y = 0; frame.setLocation(x, y); } if (frame.isVisible() && !openProjects.contains(proj)) { openProjects.add(proj); propertySupport.firePropertyChange(projectListProperty, null, null); } frame.addWindowListener(myListener); } public static List getOpenProjects() { return Collections.unmodifiableList(openProjects); } public static boolean windowNamed(String name) { for (Project proj : openProjects) { if (proj.getLogisimFile().getName().equals(name)) return true; } return false; } public static Project findProjectFor(File query) { for (Project proj : openProjects) { Loader loader = proj.getLogisimFile().getLoader(); if (loader == null) continue; File f = loader.getMainFile(); if (query.equals(f)) return proj; } return null; } // // PropertyChangeSource methods // public static void addPropertyChangeListener(PropertyChangeListener listener) { propertySupport.addPropertyChangeListener(listener); } public static void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { propertySupport.addPropertyChangeListener(propertyName, listener); } public static void removePropertyChangeListener(PropertyChangeListener listener) { propertySupport.removePropertyChangeListener(listener); } public static void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) { propertySupport.removePropertyChangeListener(propertyName, listener); } public static Point getLocation(Window win) { Point ret = frameLocations.get(win); return ret == null ? null : (Point) ret.clone(); } } logisim-2.7.1/src/com/cburch/logisim/proj/ProjectListener.java0000644000175000017500000000041411446034554024276 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.proj; public interface ProjectListener { public void projectChanged(ProjectEvent event); } logisim-2.7.1/src/com/cburch/logisim/proj/ProjectEvent.java0000644000175000017500000000403111446034554023571 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.proj; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.file.LogisimFile; import com.cburch.logisim.tools.Tool; public class ProjectEvent { public final static int ACTION_SET_FILE = 0; // change file public final static int ACTION_SET_CURRENT = 1; // change current public final static int ACTION_SET_TOOL = 2; // change tool public final static int ACTION_SELECTION = 3; // selection alterd public final static int ACTION_SET_STATE = 4; // circuit state changed public static final int ACTION_START = 5; // action about to start public static final int ACTION_COMPLETE = 6; // action has completed public static final int ACTION_MERGE = 7; // one action has been appended to another public static final int UNDO_START = 8; // undo about to start public static final int UNDO_COMPLETE = 9; // undo has completed public static final int REPAINT_REQUEST = 10; // canvas should be repainted private int action; private Project proj; private Object old_data; private Object data; ProjectEvent(int action, Project proj, Object old, Object data) { this.action = action; this.proj = proj; this.old_data = old; this.data = data; } ProjectEvent(int action, Project proj, Object data) { this.action = action; this.proj = proj; this.data = data; } ProjectEvent(int action, Project proj) { this.action = action; this.proj = proj; this.data = null; } // access methods public int getAction() { return action; } public Project getProject() { return proj; } public Object getOldData() { return old_data; } public Object getData() { return data; } // convenience methods public LogisimFile getLogisimFile() { return proj.getLogisimFile(); } public Circuit getCircuit() { return proj.getCurrentCircuit(); } public Tool getTool() { return proj.getTool(); } } logisim-2.7.1/src/com/cburch/logisim/proj/ProjectActions.java0000644000175000017500000002436211541271674024123 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.proj; import java.awt.Component; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Map; import java.util.regex.Pattern; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.file.LoadFailedException; import com.cburch.logisim.file.Loader; import com.cburch.logisim.file.LogisimFile; import com.cburch.logisim.gui.main.Frame; import com.cburch.logisim.gui.start.SplashScreen; import com.cburch.logisim.prefs.AppPreferences; import com.cburch.logisim.tools.Tool; import com.cburch.logisim.util.JFileChoosers; import com.cburch.logisim.util.StringUtil; public class ProjectActions { private ProjectActions() { } private static class CreateFrame implements Runnable { private Loader loader; private Project proj; private boolean isStartupScreen; public CreateFrame(Loader loader, Project proj, boolean isStartup) { this.loader = loader; this.proj = proj; this.isStartupScreen = isStartup; } public void run() { Frame frame = createFrame(null, proj); frame.setVisible(true); frame.toFront(); frame.getCanvas().requestFocus(); loader.setParent(frame); if (isStartupScreen) proj.setStartupScreen(true); } } public static Project doNew(SplashScreen monitor) { return doNew(monitor, false); } public static Project doNew(SplashScreen monitor, boolean isStartupScreen) { if (monitor != null) monitor.setProgress(SplashScreen.FILE_CREATE); Loader loader = new Loader(monitor); InputStream templReader = AppPreferences.getTemplate().createStream(); LogisimFile file = null; try { file = loader.openLogisimFile(templReader); } catch (IOException ex) { displayException(monitor, ex); } catch (LoadFailedException ex) { displayException(monitor, ex); } finally { try { templReader.close(); } catch (IOException e) { } } if (file == null) file = createEmptyFile(loader); return completeProject(monitor, loader, file, isStartupScreen); } private static void displayException(Component parent, Exception ex) { String msg = StringUtil.format(Strings.get("templateOpenError"), ex.toString()); String ttl = Strings.get("templateOpenErrorTitle"); JOptionPane.showMessageDialog(parent, msg, ttl, JOptionPane.ERROR_MESSAGE); } private static LogisimFile createEmptyFile(Loader loader) { InputStream templReader = AppPreferences.getEmptyTemplate().createStream(); LogisimFile file; try { file = loader.openLogisimFile(templReader); } catch (Throwable t) { file = LogisimFile.createNew(loader); file.addCircuit(new Circuit("main")); } finally { try { templReader.close(); } catch (IOException e) { } } return file; } private static Project completeProject(SplashScreen monitor, Loader loader, LogisimFile file, boolean isStartup) { if (monitor != null) monitor.setProgress(SplashScreen.PROJECT_CREATE); Project ret = new Project(file); if (monitor != null) monitor.setProgress(SplashScreen.FRAME_CREATE); SwingUtilities.invokeLater(new CreateFrame(loader, ret, isStartup)); return ret; } public static LogisimFile createNewFile(Project baseProject) { Loader loader = new Loader(baseProject == null ? null : baseProject.getFrame()); InputStream templReader = AppPreferences.getTemplate().createStream(); LogisimFile file; try { file = loader.openLogisimFile(templReader); } catch (IOException ex) { displayException(baseProject.getFrame(), ex); file = createEmptyFile(loader); } catch (LoadFailedException ex) { if (!ex.isShown()) { displayException(baseProject.getFrame(), ex); } file = createEmptyFile(loader); } finally { try { templReader.close(); } catch (IOException e) { } } return file; } private static Frame createFrame(Project sourceProject, Project newProject) { if (sourceProject != null) { Frame frame = sourceProject.getFrame(); if (frame != null) { frame.savePreferences(); } } Frame newFrame = new Frame(newProject); newProject.setFrame(newFrame); return newFrame; } public static Project doNew(Project baseProject) { LogisimFile file = createNewFile(baseProject); Project newProj = new Project(file); Frame frame = createFrame(baseProject, newProj); frame.setVisible(true); frame.getCanvas().requestFocus(); newProj.getLogisimFile().getLoader().setParent(frame); return newProj; } public static Project doOpen(SplashScreen monitor, File source, Map substitutions) throws LoadFailedException { if (monitor != null) monitor.setProgress(SplashScreen.FILE_LOAD); Loader loader = new Loader(monitor); LogisimFile file = loader.openLogisimFile(source, substitutions); AppPreferences.updateRecentFile(source); return completeProject(monitor, loader, file, false); } public static void doOpen(Component parent, Project baseProject) { JFileChooser chooser; if (baseProject != null) { Loader oldLoader = baseProject.getLogisimFile().getLoader(); chooser = oldLoader.createChooser(); if (oldLoader.getMainFile() != null) { chooser.setSelectedFile(oldLoader.getMainFile()); } } else { chooser = JFileChoosers.create(); } chooser.setFileFilter(Loader.LOGISIM_FILTER); int returnVal = chooser.showOpenDialog(parent); if (returnVal != JFileChooser.APPROVE_OPTION) return; File selected = chooser.getSelectedFile(); if (selected != null) { doOpen(parent, baseProject, selected); } } public static Project doOpen(Component parent, Project baseProject, File f) { Project proj = Projects.findProjectFor(f); Loader loader = null; if (proj != null) { proj.getFrame().toFront(); loader = proj.getLogisimFile().getLoader(); if (proj.isFileDirty()) { String message = StringUtil.format(Strings.get("openAlreadyMessage"), proj.getLogisimFile().getName()); String[] options = { Strings.get("openAlreadyLoseChangesOption"), Strings.get("openAlreadyNewWindowOption"), Strings.get("openAlreadyCancelOption"), }; int result = JOptionPane.showOptionDialog(proj.getFrame(), message, Strings.get("openAlreadyTitle"), 0, JOptionPane.QUESTION_MESSAGE, null, options, options[2]); if (result == 0) { ; // keep proj as is, so that load happens into the window } else if (result == 1) { proj = null; // we'll create a new project } else { return proj; } } } if (proj == null && baseProject != null && baseProject.isStartupScreen()) { proj = baseProject; proj.setStartupScreen(false); loader = baseProject.getLogisimFile().getLoader(); } else { loader = new Loader(baseProject == null ? parent : baseProject.getFrame()); } try { LogisimFile lib = loader.openLogisimFile(f); AppPreferences.updateRecentFile(f); if (lib == null) return null; if (proj == null) { proj = new Project(lib); } else { proj.setLogisimFile(lib); } } catch (LoadFailedException ex) { if (!ex.isShown()) { JOptionPane.showMessageDialog(parent, StringUtil.format(Strings.get("fileOpenError"), ex.toString()), Strings.get("fileOpenErrorTitle"), JOptionPane.ERROR_MESSAGE); } return null; } Frame frame = proj.getFrame(); if (frame == null) { frame = createFrame(baseProject, proj); } frame.setVisible(true); frame.toFront(); frame.getCanvas().requestFocus(); proj.getLogisimFile().getLoader().setParent(frame); return proj; } // returns true if save is completed public static boolean doSaveAs(Project proj) { Loader loader = proj.getLogisimFile().getLoader(); JFileChooser chooser = loader.createChooser(); chooser.setFileFilter(Loader.LOGISIM_FILTER); if (loader.getMainFile() != null) { chooser.setSelectedFile(loader.getMainFile()); } int returnVal = chooser.showSaveDialog(proj.getFrame()); if (returnVal != JFileChooser.APPROVE_OPTION) return false; File f = chooser.getSelectedFile(); String circExt = Loader.LOGISIM_EXTENSION; if (!f.getName().endsWith(circExt)) { String old = f.getName(); int ext0 = old.lastIndexOf('.'); if (ext0 < 0 || !Pattern.matches("\\.\\p{L}{2,}[0-9]?", old.substring(ext0))) { f = new File(f.getParentFile(), old + circExt); } else { String ext = old.substring(ext0); String ttl = Strings.get("replaceExtensionTitle"); String msg = Strings.get("replaceExtensionMessage", ext); Object[] options = { Strings.get("replaceExtensionReplaceOpt", ext), Strings.get("replaceExtensionAddOpt", circExt), Strings.get("replaceExtensionKeepOpt") }; JOptionPane dlog = new JOptionPane(msg); dlog.setMessageType(JOptionPane.QUESTION_MESSAGE); dlog.setOptions(options); dlog.createDialog(proj.getFrame(), ttl).setVisible(true); Object result = dlog.getValue(); if (result == options[0]) { String name = old.substring(0, ext0) + circExt; f = new File(f.getParentFile(), name); } else if (result == options[1]) { f = new File(f.getParentFile(), old + circExt); } } } if (f.exists()) { int confirm = JOptionPane.showConfirmDialog(proj.getFrame(), Strings.get("confirmOverwriteMessage"), Strings.get("confirmOverwriteTitle"), JOptionPane.YES_NO_OPTION); if (confirm != JOptionPane.YES_OPTION) return false; } return doSave(proj, f); } public static boolean doSave(Project proj) { Loader loader = proj.getLogisimFile().getLoader(); File f = loader.getMainFile(); if (f == null) return doSaveAs(proj); else return doSave(proj, f); } private static boolean doSave(Project proj, File f) { Loader loader = proj.getLogisimFile().getLoader(); Tool oldTool = proj.getTool(); proj.setTool(null); boolean ret = loader.save(proj.getLogisimFile(), f); if (ret) { AppPreferences.updateRecentFile(f); proj.setFileAsClean(); } proj.setTool(oldTool); return ret; } public static void doQuit() { Frame top = Projects.getTopFrame(); top.savePreferences(); for (Project proj : new ArrayList(Projects.getOpenProjects())) { if (!proj.confirmClose(Strings.get("confirmQuitTitle"))) return; } System.exit(0); } } logisim-2.7.1/src/com/cburch/logisim/proj/Project.java0000644000175000017500000002742211527054434022577 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.proj; import java.util.HashMap; import java.util.LinkedList; import javax.swing.JFileChooser; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.CircuitListener; import com.cburch.logisim.circuit.CircuitMutation; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.circuit.Simulator; import com.cburch.logisim.circuit.SubcircuitFactory; import com.cburch.logisim.file.Loader; import com.cburch.logisim.file.LogisimFile; import com.cburch.logisim.file.LibraryEvent; import com.cburch.logisim.file.LibraryListener; import com.cburch.logisim.file.Options; import com.cburch.logisim.gui.log.LogFrame; import com.cburch.logisim.gui.main.Canvas; import com.cburch.logisim.gui.main.Frame; import com.cburch.logisim.gui.main.Selection; import com.cburch.logisim.gui.main.SelectionActions; import com.cburch.logisim.gui.opts.OptionsFrame; import com.cburch.logisim.tools.AddTool; import com.cburch.logisim.tools.Library; import com.cburch.logisim.tools.Tool; import com.cburch.logisim.util.EventSourceWeakSupport; import com.cburch.logisim.util.JFileChoosers; public class Project { private static final int MAX_UNDO_SIZE = 64; private static class ActionData { CircuitState circuitState; Action action; public ActionData(CircuitState circuitState, Action action) { this.circuitState = circuitState; this.action = action; } } private class MyListener implements Selection.Listener, LibraryListener { public void selectionChanged(Selection.Event e) { fireEvent(ProjectEvent.ACTION_SELECTION, e.getSource()); } public void libraryChanged(LibraryEvent event) { int action = event.getAction(); if (action == LibraryEvent.REMOVE_LIBRARY) { Library unloaded = (Library) event.getData(); if (tool != null && unloaded.containsFromSource(tool)) { setTool(null); } } else if (action == LibraryEvent.REMOVE_TOOL) { Object data = event.getData(); if (data instanceof AddTool) { Object factory = ((AddTool) data).getFactory(); if (factory instanceof SubcircuitFactory) { SubcircuitFactory fact = (SubcircuitFactory) factory; if (fact.getSubcircuit() == getCurrentCircuit()) { setCurrentCircuit(file.getMainCircuit()); } } } } } } private Simulator simulator = new Simulator(); private LogisimFile file; private CircuitState circuitState; private HashMap stateMap = new HashMap(); private Frame frame = null; private OptionsFrame optionsFrame = null; private LogFrame logFrame = null; private Tool tool = null; private LinkedList undoLog = new LinkedList(); private int undoMods = 0; private EventSourceWeakSupport projectListeners = new EventSourceWeakSupport(); private EventSourceWeakSupport fileListeners = new EventSourceWeakSupport(); private EventSourceWeakSupport circuitListeners = new EventSourceWeakSupport(); private Dependencies depends; private MyListener myListener = new MyListener(); private boolean startupScreen = false; public Project(LogisimFile file) { addLibraryListener(myListener); setLogisimFile(file); } public void setFrame(Frame value) { if (frame == value) return; Frame oldValue = frame; frame = value; Projects.windowCreated(this, oldValue, value); value.getCanvas().getSelection().addListener(myListener); } // // access methods // public LogisimFile getLogisimFile() { return file; } public Simulator getSimulator() { return simulator; } public Options getOptions() { return file.getOptions(); } public Dependencies getDependencies() { return depends; } public Frame getFrame() { return frame; } public OptionsFrame getOptionsFrame(boolean create) { if (optionsFrame == null || optionsFrame.getLogisimFile() != file) { if (create) optionsFrame = new OptionsFrame(this); else optionsFrame = null; } return optionsFrame; } public LogFrame getLogFrame(boolean create) { if (logFrame == null) { if (create) logFrame = new LogFrame(this); } return logFrame; } public Circuit getCurrentCircuit() { return circuitState == null ? null : circuitState.getCircuit(); } public CircuitState getCircuitState() { return circuitState; } public CircuitState getCircuitState(Circuit circuit) { if (circuitState != null && circuitState.getCircuit() == circuit) { return circuitState; } else { CircuitState ret = stateMap.get(circuit); if (ret == null) { ret = new CircuitState(this, circuit); stateMap.put(circuit, ret); } return ret; } } public Action getLastAction() { if (undoLog.size() == 0) { return null; } else { return undoLog.getLast().action; } } public Tool getTool() { return tool; } public Selection getSelection() { if (frame == null) return null; Canvas canvas = frame.getCanvas(); if (canvas == null) return null; return canvas.getSelection(); } public boolean isFileDirty() { return undoMods != 0; } public JFileChooser createChooser() { if (file == null) return JFileChoosers.create(); Loader loader = file.getLoader(); return loader == null ? JFileChoosers.create() : loader.createChooser(); } // // Listener methods // public void addProjectListener(ProjectListener what) { projectListeners.add(what); } public void removeProjectListener(ProjectListener what) { projectListeners.remove(what); } public void addLibraryListener(LibraryListener value) { fileListeners.add(value); if (file != null) file.addLibraryListener(value); } public void removeLibraryListener(LibraryListener value) { fileListeners.remove(value); if (file != null) file.removeLibraryListener(value); } public void addCircuitListener(CircuitListener value) { circuitListeners.add(value); Circuit current = getCurrentCircuit(); if (current != null) current.addCircuitListener(value); } public void removeCircuitListener(CircuitListener value) { circuitListeners.remove(value); Circuit current = getCurrentCircuit(); if (current != null) current.removeCircuitListener(value); } private void fireEvent(int action, Object old, Object data) { fireEvent(new ProjectEvent(action, this, old, data)); } private void fireEvent(int action, Object data) { fireEvent(new ProjectEvent(action, this, data)); } private void fireEvent(ProjectEvent event) { for (ProjectListener l : projectListeners) { l.projectChanged(event); } } // We track whether this project is the empty project opened // at startup by default, because we want to close it // immediately as another project is opened, if there // haven't been any changes to it. public boolean isStartupScreen() { return startupScreen; } public boolean confirmClose(String title) { return frame.confirmClose(title); } // // actions // public void setStartupScreen(boolean value) { startupScreen = value; } public void setLogisimFile(LogisimFile value) { LogisimFile old = this.file; if (old != null) { for (LibraryListener l : fileListeners) { old.removeLibraryListener(l); } } file = value; stateMap.clear(); depends = new Dependencies(file); undoLog.clear(); undoMods = 0; fireEvent(ProjectEvent.ACTION_SET_FILE, old, file); setCurrentCircuit(file.getMainCircuit()); if (file != null) { for (LibraryListener l : fileListeners) { file.addLibraryListener(l); } } file.setDirty(true); // toggle it so that everybody hears the file is fresh file.setDirty(false); } public void setCircuitState(CircuitState value) { if (value == null || circuitState == value) return; CircuitState old = circuitState; Circuit oldCircuit = old == null ? null : old.getCircuit(); Circuit newCircuit = value.getCircuit(); boolean circuitChanged = old == null || oldCircuit != newCircuit; if (circuitChanged) { Canvas canvas = frame == null ? null : frame.getCanvas(); if (canvas != null) { if (tool != null) tool.deselect(canvas); Selection selection = canvas.getSelection(); if (selection != null) { Action act = SelectionActions.dropAll(selection); if (act != null) { doAction(act); } } if (tool != null) tool.select(canvas); } if (oldCircuit != null) { for (CircuitListener l : circuitListeners) { oldCircuit.removeCircuitListener(l); } } } circuitState = value; stateMap.put(circuitState.getCircuit(), circuitState); simulator.setCircuitState(circuitState); if (circuitChanged) { fireEvent(ProjectEvent.ACTION_SET_CURRENT, oldCircuit, newCircuit); if (newCircuit != null) { for (CircuitListener l : circuitListeners) { newCircuit.addCircuitListener(l); } } } fireEvent(ProjectEvent.ACTION_SET_STATE, old, circuitState); } public void setCurrentCircuit(Circuit circuit) { CircuitState circState = stateMap.get(circuit); if (circState == null) circState = new CircuitState(this, circuit); setCircuitState(circState); } public void setTool(Tool value) { if (tool == value) return; Tool old = tool; Canvas canvas = frame.getCanvas(); if (old != null) old.deselect(canvas); Selection selection = canvas.getSelection(); if (selection != null && !selection.isEmpty()) { Circuit circuit = canvas.getCircuit(); CircuitMutation xn = new CircuitMutation(circuit); if (value == null) { Action act = SelectionActions.dropAll(selection); if (act != null) { doAction(act); } } else if (!getOptions().getMouseMappings().containsSelectTool()) { Action act = SelectionActions.dropAll(selection); if (act != null) { doAction(act); } } if (!xn.isEmpty()) doAction(xn.toAction(null)); } startupScreen = false; tool = value; if (tool != null) tool.select(frame.getCanvas()); fireEvent(ProjectEvent.ACTION_SET_TOOL, old, tool); } public void doAction(Action act) { if (act == null) return; Action toAdd = act; startupScreen = false; if (!undoLog.isEmpty() && act.shouldAppendTo(getLastAction())) { ActionData firstData = undoLog.removeLast(); Action first = firstData.action; if (first.isModification()) --undoMods; toAdd = first.append(act); if (toAdd != null) { undoLog.add(new ActionData(circuitState, toAdd)); if (toAdd.isModification()) ++undoMods; } fireEvent(new ProjectEvent(ProjectEvent.ACTION_START, this, act)); act.doIt(this); file.setDirty(isFileDirty()); fireEvent(new ProjectEvent(ProjectEvent.ACTION_COMPLETE, this, act)); fireEvent(new ProjectEvent(ProjectEvent.ACTION_MERGE, this, first, toAdd)); return; } undoLog.add(new ActionData(circuitState, toAdd)); fireEvent(new ProjectEvent(ProjectEvent.ACTION_START, this, act)); act.doIt(this); while (undoLog.size() > MAX_UNDO_SIZE) { undoLog.removeFirst(); } if (toAdd.isModification()) ++undoMods; file.setDirty(isFileDirty()); fireEvent(new ProjectEvent(ProjectEvent.ACTION_COMPLETE, this, act)); } public void undoAction() { if (undoLog != null && undoLog.size() > 0) { ActionData data = undoLog.removeLast(); setCircuitState(data.circuitState); Action action = data.action; if (action.isModification()) --undoMods; fireEvent(new ProjectEvent(ProjectEvent.UNDO_START, this, action)); action.undo(this); file.setDirty(isFileDirty()); fireEvent(new ProjectEvent(ProjectEvent.UNDO_COMPLETE, this, action)); } } public void setFileAsClean() { undoMods = 0; file.setDirty(isFileDirty()); } public void repaintCanvas() { // for actions that ought not be logged (i.e., those that // change nothing, except perhaps the current values within // the circuit) fireEvent(new ProjectEvent(ProjectEvent.REPAINT_REQUEST, this, null)); } } logisim-2.7.1/src/com/cburch/logisim/proj/JoinedAction.java0000644000175000017500000000227411446034554023536 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.proj; import java.util.Arrays; import java.util.List; public class JoinedAction extends Action { Action[] todo; JoinedAction(Action... actions) { todo = actions; } public Action getFirstAction() { return todo[0]; } public Action getLastAction() { return todo[todo.length - 1]; } public List getActions() { return Arrays.asList(todo); } @Override public boolean isModification() { for (Action act : todo) { if (act.isModification()) return true; } return false; } @Override public String getName() { return todo[0].getName(); } @Override public void doIt(Project proj) { for (Action act : todo) { act.doIt(proj); } } @Override public void undo(Project proj) { for (int i = todo.length - 1; i >= 0; i--) { todo[i].undo(proj); } } @Override public Action append(Action other) { int oldLen = todo.length; Action[] newToDo = new Action[oldLen + 1]; System.arraycopy(todo, 0, newToDo, 0, oldLen); newToDo[oldLen] = other; todo = newToDo; return this; } }logisim-2.7.1/src/com/cburch/logisim/proj/Dependencies.java0000644000175000017500000000645411447117146023562 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.proj; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.CircuitEvent; import com.cburch.logisim.circuit.CircuitListener; import com.cburch.logisim.circuit.SubcircuitFactory; import com.cburch.logisim.comp.Component; import com.cburch.logisim.comp.ComponentFactory; import com.cburch.logisim.file.LibraryEvent; import com.cburch.logisim.file.LibraryListener; import com.cburch.logisim.file.LogisimFile; import com.cburch.logisim.tools.AddTool; import com.cburch.logisim.util.Dag; public class Dependencies { private class MyListener implements LibraryListener, CircuitListener { public void libraryChanged(LibraryEvent e) { switch (e.getAction()) { case LibraryEvent.ADD_TOOL: if (e.getData() instanceof AddTool) { ComponentFactory factory = ((AddTool) e.getData()).getFactory(); if (factory instanceof SubcircuitFactory) { SubcircuitFactory circFact = (SubcircuitFactory) factory; processCircuit(circFact.getSubcircuit()); } } break; case LibraryEvent.REMOVE_TOOL: if (e.getData() instanceof AddTool) { ComponentFactory factory = ((AddTool) e.getData()).getFactory(); if (factory instanceof SubcircuitFactory) { SubcircuitFactory circFact = (SubcircuitFactory) factory; Circuit circ = circFact.getSubcircuit(); depends.removeNode(circ); circ.removeCircuitListener(this); } } break; } } public void circuitChanged(CircuitEvent e) { Component comp; switch (e.getAction()) { case CircuitEvent.ACTION_ADD: comp = (Component) e.getData(); if (comp.getFactory() instanceof SubcircuitFactory) { SubcircuitFactory factory = (SubcircuitFactory) comp.getFactory(); depends.addEdge(e.getCircuit(), factory.getSubcircuit()); } break; case CircuitEvent.ACTION_REMOVE: comp = (Component) e.getData(); if (comp.getFactory() instanceof SubcircuitFactory) { SubcircuitFactory factory = (SubcircuitFactory) comp.getFactory(); boolean found = false; for (Component o : e.getCircuit().getNonWires()) { if (o.getFactory() == factory) { found = true; break; } } if (!found) depends.removeEdge(e.getCircuit(), factory.getSubcircuit()); } break; case CircuitEvent.ACTION_CLEAR: depends.removeNode(e.getCircuit()); break; } } } private MyListener myListener = new MyListener(); private Dag depends = new Dag(); Dependencies(LogisimFile file) { addDependencies(file); } public boolean canRemove(Circuit circ) { return !depends.hasPredecessors(circ); } public boolean canAdd(Circuit circ, Circuit sub) { return depends.canFollow(sub, circ); } private void addDependencies(LogisimFile file) { file.addLibraryListener(myListener); for (Circuit circuit : file.getCircuits()) { processCircuit(circuit); } } private void processCircuit(Circuit circ) { circ.addCircuitListener(myListener); for (Component comp : circ.getNonWires()) { if (comp.getFactory() instanceof SubcircuitFactory) { SubcircuitFactory factory = (SubcircuitFactory) comp.getFactory(); depends.addEdge(circ, factory.getSubcircuit()); } } } } logisim-2.7.1/src/com/cburch/logisim/proj/Action.java0000644000175000017500000000102511446034554022376 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.proj; public abstract class Action { public boolean isModification() { return true; } public abstract String getName(); public abstract void doIt(Project proj); public abstract void undo(Project proj); public boolean shouldAppendTo(Action other) { return false; } public Action append(Action other) { return new JoinedAction(this, other); } } logisim-2.7.1/src/com/cburch/logisim/prefs/0000755000175000017500000000000011535206230020454 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/logisim/prefs/Template.java0000644000175000017500000000276111455255472023115 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.prefs; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; public class Template { public static Template createEmpty() { String circName = Strings.get("newCircuitName"); StringBuilder buf = new StringBuilder(); buf.append(""); buf.append(""); buf.append(" "); buf.append(""); return new Template(buf.toString()); } public static Template create(InputStream in) { InputStreamReader reader = new InputStreamReader(in); char[] buf = new char[4096]; StringBuilder dest = new StringBuilder(); while (true) { try { int nbytes = reader.read(buf); if (nbytes < 0) break; dest.append(buf, 0, nbytes); } catch (IOException e) { break; } } return new Template(dest.toString()); } private String contents; private Template(String contents) { this.contents = contents; } public InputStream createStream() { try { return new ByteArrayInputStream(contents.getBytes("UTF-8")); } catch (UnsupportedEncodingException e) { System.err.println("warning: UTF-8 is not supported"); //OK return new ByteArrayInputStream(contents.getBytes()); } } } logisim-2.7.1/src/com/cburch/logisim/prefs/Strings.java0000644000175000017500000000125111455255472022764 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.prefs; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.StringGetter; import com.cburch.logisim.util.StringUtil; class Strings { private static LocaleManager source = new LocaleManager("resources/logisim", "proj"); public static String get(String key) { return source.get(key); } public static String get(String key, String arg) { return StringUtil.format(source.get(key), arg); } public static StringGetter getter(String key) { return source.getter(key); } } logisim-2.7.1/src/com/cburch/logisim/prefs/RecentProjects.java0000644000175000017500000001130311455470144024257 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.prefs; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.prefs.PreferenceChangeEvent; import java.util.prefs.PreferenceChangeListener; import java.util.prefs.Preferences; class RecentProjects implements PreferenceChangeListener { private static final String BASE_PROPERTY = "recent"; private static final int NUM_RECENT = 10; private static class FileTime { private long time; private File file; public FileTime(File file, long time) { this.time = time; this.file = file; } @Override public boolean equals(Object other) { if (other instanceof FileTime) { FileTime o = (FileTime) other; return this.time == o.time && isSame(this.file, o.file); } else { return false; } } } private File[] recentFiles; private long[] recentTimes; RecentProjects() { recentFiles = new File[NUM_RECENT]; recentTimes = new long[NUM_RECENT]; Arrays.fill(recentTimes, System.currentTimeMillis()); Preferences prefs = AppPreferences.getPrefs(); prefs.addPreferenceChangeListener(this); for (int index = 0; index < NUM_RECENT; index++) { getAndDecode(prefs, index); } } public List getRecentFiles() { long now = System.currentTimeMillis(); long[] ages = new long[NUM_RECENT]; long[] toSort = new long[NUM_RECENT]; for (int i = 0; i < NUM_RECENT; i++) { if (recentFiles[i] == null) { ages[i] = -1; } else { ages[i] = now - recentTimes[i]; } toSort[i] = ages[i]; } Arrays.sort(toSort); List ret = new ArrayList(); for (long age : toSort) { if (age >= 0) { int index = -1; for (int i = 0; i < NUM_RECENT; i++) { if (ages[i] == age) { index = i; ages[i] = -1; break; } } if (index >= 0) { ret.add(recentFiles[index]); } } } return ret; } public void updateRecent(File file) { File fileToSave = file; try { fileToSave = file.getCanonicalFile(); } catch (IOException e) { } long now = System.currentTimeMillis(); int index = getReplacementIndex(now, fileToSave); updateInto(index, now, fileToSave); } private int getReplacementIndex(long now, File f) { long oldestAge = -1; int oldestIndex = 0; int nullIndex = -1; for (int i = 0; i < NUM_RECENT; i++) { if (f.equals(recentFiles[i])) { return i; } if (recentFiles[i] == null) { nullIndex = i; } long age = now - recentTimes[i]; if (age > oldestAge) { oldestIndex = i; oldestAge = age; } } if (nullIndex != -1) { return nullIndex; } else { return oldestIndex; } } public void preferenceChange(PreferenceChangeEvent event) { Preferences prefs = event.getNode(); String prop = event.getKey(); if (prop.startsWith(BASE_PROPERTY)) { String rest = prop.substring(BASE_PROPERTY.length()); int index = -1; try { index = Integer.parseInt(rest); if (index < 0 || index >= NUM_RECENT) index = -1; } catch (NumberFormatException e) { } if (index >= 0) { File oldValue = recentFiles[index]; long oldTime = recentTimes[index]; getAndDecode(prefs, index); File newValue = recentFiles[index]; long newTime = recentTimes[index]; if (!isSame(oldValue, newValue) || oldTime != newTime) { AppPreferences.firePropertyChange(AppPreferences.RECENT_PROJECTS, new FileTime(oldValue, oldTime), new FileTime(newValue, newTime)); } } } } private void updateInto(int index, long time, File file) { File oldFile = recentFiles[index]; long oldTime = recentTimes[index]; if (!isSame(oldFile, file) || oldTime != time) { recentFiles[index] = file; recentTimes[index] = time; try { AppPreferences.getPrefs().put(BASE_PROPERTY + index, "" + time + ";" + file.getCanonicalPath()); AppPreferences.firePropertyChange(AppPreferences.RECENT_PROJECTS, new FileTime(oldFile, oldTime), new FileTime(file, time)); } catch (IOException e) { recentFiles[index] = oldFile; recentTimes[index] = oldTime; } } } private void getAndDecode(Preferences prefs, int index) { String encoding = prefs.get(BASE_PROPERTY + index, null); if (encoding == null) return; int semi = encoding.indexOf(';'); if (semi < 0) return; try { long time = Long.parseLong(encoding.substring(0, semi)); File file = new File(encoding.substring(semi + 1)); updateInto(index, time, file); } catch (NumberFormatException e) { } } private static boolean isSame(Object a, Object b) { return a == null ? b == null : a.equals(b); } } logisim-2.7.1/src/com/cburch/logisim/prefs/PrefMonitorStringOpts.java0000644000175000017500000000306111455470144025630 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.prefs; import java.util.prefs.PreferenceChangeEvent; import java.util.prefs.Preferences; class PrefMonitorStringOpts extends AbstractPrefMonitor { private String[] opts; private String value; private String dflt; PrefMonitorStringOpts(String name, String[] opts, String dflt) { super(name); this.opts = opts; this.value = opts[0]; this.dflt = dflt; Preferences prefs = AppPreferences.getPrefs(); set(prefs.get(name, dflt)); prefs.addPreferenceChangeListener(this); } public String get() { return value; } public void set(String newValue) { String oldValue = value; if (!isSame(oldValue, newValue)) { AppPreferences.getPrefs().put(getIdentifier(), newValue); } } public void preferenceChange(PreferenceChangeEvent event) { Preferences prefs = event.getNode(); String prop = event.getKey(); String name = getIdentifier(); if (prop.equals(name)) { String oldValue = value; String newValue = prefs.get(name, dflt); if (!isSame(oldValue, newValue)) { String[] o = opts; String chosen = null; for (int i = 0; i < o.length; i++) { if (isSame(o[i], newValue)) { chosen = o[i]; break; } } if (chosen == null) chosen = dflt; value = chosen; AppPreferences.firePropertyChange(name, oldValue, chosen); } } } private static boolean isSame(String a, String b) { return a == null ? b == null : a.equals(b); } } logisim-2.7.1/src/com/cburch/logisim/prefs/PrefMonitorString.java0000644000175000017500000000246511455470144024771 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.prefs; import java.util.prefs.PreferenceChangeEvent; import java.util.prefs.Preferences; class PrefMonitorString extends AbstractPrefMonitor { private String dflt; private String value; PrefMonitorString(String name, String dflt) { super(name); this.dflt = dflt; Preferences prefs = AppPreferences.getPrefs(); this.value = prefs.get(name, dflt); prefs.addPreferenceChangeListener(this); } public String get() { return value; } public void set(String newValue) { String oldValue = value; if (!isSame(oldValue, newValue)) { value = newValue; AppPreferences.getPrefs().put(getIdentifier(), newValue); } } public void preferenceChange(PreferenceChangeEvent event) { Preferences prefs = event.getNode(); String prop = event.getKey(); String name = getIdentifier(); if (prop.equals(name)) { String oldValue = value; String newValue = prefs.get(name, dflt); if (!isSame(oldValue, newValue)) { value = newValue; AppPreferences.firePropertyChange(name, oldValue, newValue); } } } private static boolean isSame(String a, String b) { return a == null ? b == null : a.equals(b); } } logisim-2.7.1/src/com/cburch/logisim/prefs/PrefMonitorInt.java0000644000175000017500000000237211455470144024252 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.prefs; import java.util.prefs.PreferenceChangeEvent; import java.util.prefs.Preferences; class PrefMonitorInt extends AbstractPrefMonitor { private int dflt; private int value; PrefMonitorInt(String name, int dflt) { super(name); this.dflt = dflt; this.value = dflt; Preferences prefs = AppPreferences.getPrefs(); set(Integer.valueOf(prefs.getInt(name, dflt))); prefs.addPreferenceChangeListener(this); } public Integer get() { return Integer.valueOf(value); } public void set(Integer newValue) { int newVal = newValue.intValue(); if (value != newVal) { AppPreferences.getPrefs().putInt(getIdentifier(), newVal); } } public void preferenceChange(PreferenceChangeEvent event) { Preferences prefs = event.getNode(); String prop = event.getKey(); String name = getIdentifier(); if (prop.equals(name)) { int oldValue = value; int newValue = prefs.getInt(name, dflt); if (newValue != oldValue) { value = newValue; AppPreferences.firePropertyChange(name, Integer.valueOf(oldValue), Integer.valueOf(newValue)); } } } } logisim-2.7.1/src/com/cburch/logisim/prefs/PrefMonitorDouble.java0000644000175000017500000000242711455470144024733 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.prefs; import java.util.prefs.PreferenceChangeEvent; import java.util.prefs.Preferences; class PrefMonitorDouble extends AbstractPrefMonitor { private double dflt; private double value; PrefMonitorDouble(String name, double dflt) { super(name); this.dflt = dflt; this.value = dflt; Preferences prefs = AppPreferences.getPrefs(); set(Double.valueOf(prefs.getDouble(name, dflt))); prefs.addPreferenceChangeListener(this); } public Double get() { return Double.valueOf(value); } public void set(Double newValue) { double newVal = newValue.doubleValue(); if (value != newVal) { AppPreferences.getPrefs().putDouble(getIdentifier(), newVal); } } public void preferenceChange(PreferenceChangeEvent event) { Preferences prefs = event.getNode(); String prop = event.getKey(); String name = getIdentifier(); if (prop.equals(name)) { double oldValue = value; double newValue = prefs.getDouble(name, dflt); if (newValue != oldValue) { value = newValue; AppPreferences.firePropertyChange(name, Double.valueOf(oldValue), Double.valueOf(newValue)); } } } } logisim-2.7.1/src/com/cburch/logisim/prefs/PrefMonitorBoolean.java0000644000175000017500000000250111455470144025071 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.prefs; import java.util.prefs.PreferenceChangeEvent; import java.util.prefs.Preferences; class PrefMonitorBoolean extends AbstractPrefMonitor { private boolean dflt; private boolean value; PrefMonitorBoolean(String name, boolean dflt) { super(name); this.dflt = dflt; this.value = dflt; Preferences prefs = AppPreferences.getPrefs(); set(Boolean.valueOf(prefs.getBoolean(name, dflt))); prefs.addPreferenceChangeListener(this); } public Boolean get() { return Boolean.valueOf(value); } @Override public boolean getBoolean() { return value; } public void set(Boolean newValue) { boolean newVal = newValue.booleanValue(); if (value != newVal) { AppPreferences.getPrefs().putBoolean(getIdentifier(), newVal); } } public void preferenceChange(PreferenceChangeEvent event) { Preferences prefs = event.getNode(); String prop = event.getKey(); String name = getIdentifier(); if (prop.equals(name)) { boolean oldValue = value; boolean newValue = prefs.getBoolean(name, dflt); if (newValue != oldValue) { value = newValue; AppPreferences.firePropertyChange(name, oldValue, newValue); } } } } logisim-2.7.1/src/com/cburch/logisim/prefs/PrefMonitor.java0000644000175000017500000000152611455255472023604 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.prefs; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.prefs.PreferenceChangeEvent; import java.util.prefs.PreferenceChangeListener; public interface PrefMonitor extends PreferenceChangeListener { public String getIdentifier(); public boolean isSource(PropertyChangeEvent event); public void addPropertyChangeListener(PropertyChangeListener listener); public void removePropertyChangeListener(PropertyChangeListener listener); public E get(); public void set(E value); public boolean getBoolean(); public void setBoolean(boolean value); public void preferenceChange(PreferenceChangeEvent e); } logisim-2.7.1/src/com/cburch/logisim/prefs/AppPreferences.java0000644000175000017500000003457511535206230024237 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.prefs; import java.beans.PropertyChangeListener; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.List; import java.util.Locale; import java.util.prefs.BackingStoreException; import java.util.prefs.PreferenceChangeEvent; import java.util.prefs.PreferenceChangeListener; import java.util.prefs.Preferences; import javax.swing.JFrame; import com.cburch.logisim.Main; import com.cburch.logisim.circuit.RadixOption; import com.cburch.logisim.data.Direction; import com.cburch.logisim.gui.start.Startup; import com.cburch.logisim.util.LocaleListener; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.PropertyChangeWeakSupport; public class AppPreferences { // class variables for maintaining consistency between properties, // internal variables, and other classes private static Preferences prefs = null; private static MyListener myListener = null; private static PropertyChangeWeakSupport propertySupport = new PropertyChangeWeakSupport(AppPreferences.class); // Template preferences public static final int TEMPLATE_UNKNOWN = -1; public static final int TEMPLATE_EMPTY = 0; public static final int TEMPLATE_PLAIN = 1; public static final int TEMPLATE_CUSTOM = 2; public static final String TEMPLATE = "template"; public static final String TEMPLATE_TYPE = "templateType"; public static final String TEMPLATE_FILE = "templateFile"; private static int templateType = TEMPLATE_PLAIN; private static File templateFile = null; private static Template plainTemplate = null; private static Template emptyTemplate = null; private static Template customTemplate = null; private static File customTemplateFile = null; // International preferences public static final String SHAPE_SHAPED = "shaped"; public static final String SHAPE_RECTANGULAR = "rectangular"; public static final String SHAPE_DIN40700 = "din40700"; public static final PrefMonitor GATE_SHAPE = create(new PrefMonitorStringOpts("gateShape", new String[] { SHAPE_SHAPED, SHAPE_RECTANGULAR, SHAPE_DIN40700 }, SHAPE_SHAPED)); public static final PrefMonitor LOCALE = create(new LocalePreference()); public static final PrefMonitor ACCENTS_REPLACE = create(new PrefMonitorBoolean("accentsReplace", false)); // Window preferences public static final String TOOLBAR_HIDDEN = "hidden"; public static final String TOOLBAR_DOWN_MIDDLE = "downMiddle"; public static final PrefMonitor SHOW_TICK_RATE = create(new PrefMonitorBoolean("showTickRate", false)); public static final PrefMonitor TOOLBAR_PLACEMENT = create(new PrefMonitorStringOpts("toolbarPlacement", new String[] { Direction.NORTH.toString(), Direction.SOUTH.toString(), Direction.EAST.toString(), Direction.WEST.toString(), TOOLBAR_DOWN_MIDDLE, TOOLBAR_HIDDEN }, Direction.NORTH.toString())); // Layout preferences public static final String ADD_AFTER_UNCHANGED = "unchanged"; public static final String ADD_AFTER_EDIT = "edit"; public static final PrefMonitor PRINTER_VIEW = create(new PrefMonitorBoolean("printerView", false)); public static final PrefMonitor ATTRIBUTE_HALO = create(new PrefMonitorBoolean("attributeHalo", true)); public static final PrefMonitor COMPONENT_TIPS = create(new PrefMonitorBoolean("componentTips", true)); public static final PrefMonitor MOVE_KEEP_CONNECT = create(new PrefMonitorBoolean("keepConnected", true)); public static final PrefMonitor ADD_SHOW_GHOSTS = create(new PrefMonitorBoolean("showGhosts", true)); public static final PrefMonitor ADD_AFTER = create(new PrefMonitorStringOpts("afterAdd", new String[] { ADD_AFTER_EDIT, ADD_AFTER_UNCHANGED }, ADD_AFTER_EDIT)); public static PrefMonitor POKE_WIRE_RADIX1; public static PrefMonitor POKE_WIRE_RADIX2; static { RadixOption[] radixOptions = RadixOption.OPTIONS; String[] radixStrings = new String[radixOptions.length]; for (int i = 0; i < radixOptions.length; i++) { radixStrings[i] = radixOptions[i].getSaveString(); } POKE_WIRE_RADIX1 = create(new PrefMonitorStringOpts("pokeRadix1", radixStrings, RadixOption.RADIX_2.getSaveString())); POKE_WIRE_RADIX2 = create(new PrefMonitorStringOpts("pokeRadix2", radixStrings, RadixOption.RADIX_10_SIGNED.getSaveString())); } // Experimental preferences public static final String ACCEL_DEFAULT = "default"; public static final String ACCEL_NONE = "none"; public static final String ACCEL_OPENGL = "opengl"; public static final String ACCEL_D3D = "d3d"; public static final PrefMonitor GRAPHICS_ACCELERATION = create(new PrefMonitorStringOpts("graphicsAcceleration", new String[] { ACCEL_DEFAULT, ACCEL_NONE, ACCEL_OPENGL, ACCEL_D3D }, ACCEL_DEFAULT)); // hidden window preferences - not part of the preferences dialog, changes // to preference does not affect current windows, and the values are not // saved until the application is closed public static final String RECENT_PROJECTS = "recentProjects"; private static final RecentProjects recentProjects = new RecentProjects(); public static final PrefMonitor TICK_FREQUENCY = create(new PrefMonitorDouble("tickFrequency", 1.0)); public static final PrefMonitor LAYOUT_SHOW_GRID = create(new PrefMonitorBoolean("layoutGrid", true)); public static final PrefMonitor LAYOUT_ZOOM = create(new PrefMonitorDouble("layoutZoom", 1.0)); public static final PrefMonitor APPEARANCE_SHOW_GRID = create(new PrefMonitorBoolean("appearanceGrid", true)); public static final PrefMonitor APPEARANCE_ZOOM = create(new PrefMonitorDouble("appearanceZoom", 1.0)); public static final PrefMonitor WINDOW_STATE = create(new PrefMonitorInt("windowState", JFrame.NORMAL)); public static final PrefMonitor WINDOW_WIDTH = create(new PrefMonitorInt("windowWidth", 640)); public static final PrefMonitor WINDOW_HEIGHT = create(new PrefMonitorInt("windowHeight", 480)); public static final PrefMonitor WINDOW_LOCATION = create(new PrefMonitorString("windowLocation", "0,0")); public static final PrefMonitor WINDOW_MAIN_SPLIT = create(new PrefMonitorDouble("windowMainSplit", 0.25)); public static final PrefMonitor WINDOW_LEFT_SPLIT = create(new PrefMonitorDouble("windowLeftSplit", 0.5)); public static final PrefMonitor DIALOG_DIRECTORY = create(new PrefMonitorString("dialogDirectory", "")); // // methods for accessing preferences // private static class MyListener implements PreferenceChangeListener, LocaleListener { public void preferenceChange(PreferenceChangeEvent event) { Preferences prefs = event.getNode(); String prop = event.getKey(); if (ACCENTS_REPLACE.getIdentifier().equals(prop)) { getPrefs(); LocaleManager.setReplaceAccents(ACCENTS_REPLACE.getBoolean()); } else if (prop.equals(TEMPLATE_TYPE)) { int oldValue = templateType; int value = prefs.getInt(TEMPLATE_TYPE, TEMPLATE_UNKNOWN); if (value != oldValue) { templateType = value; propertySupport.firePropertyChange(TEMPLATE, oldValue, value); propertySupport.firePropertyChange(TEMPLATE_TYPE, oldValue, value); } } else if (prop.equals(TEMPLATE_FILE)) { File oldValue = templateFile; File value = convertFile(prefs.get(TEMPLATE_FILE, null)); if (value == null ? oldValue != null : !value.equals(oldValue)) { templateFile = value; if (templateType == TEMPLATE_CUSTOM) { customTemplate = null; propertySupport.firePropertyChange(TEMPLATE, oldValue, value); } propertySupport.firePropertyChange(TEMPLATE_FILE, oldValue, value); } } } public void localeChanged() { Locale loc = LocaleManager.getLocale(); String lang = loc.getLanguage(); if (LOCALE != null) { LOCALE.set(lang); } } } private static PrefMonitor create(PrefMonitor monitor) { return monitor; } public static void clear() { Preferences p = getPrefs(true); try { p.clear(); } catch (BackingStoreException e) { } } static Preferences getPrefs() { return getPrefs(false); } private static Preferences getPrefs(boolean shouldClear) { if (prefs == null) { synchronized(AppPreferences.class) { if (prefs == null) { Preferences p = Preferences.userNodeForPackage(Main.class); if (shouldClear) { try { p.clear(); } catch (BackingStoreException e) { } } myListener = new MyListener(); p.addPreferenceChangeListener(myListener); prefs = p; setTemplateFile(convertFile(p.get(TEMPLATE_FILE, null))); setTemplateType(p.getInt(TEMPLATE_TYPE, TEMPLATE_PLAIN)); } } } return prefs; } private static File convertFile(String fileName) { if (fileName == null || fileName.equals("")) { return null; } else { File file = new File(fileName); return file.canRead() ? file : null; } } // // PropertyChangeSource methods // public static void addPropertyChangeListener(PropertyChangeListener listener) { propertySupport.addPropertyChangeListener(listener); } public static void removePropertyChangeListener(PropertyChangeListener listener) { propertySupport.removePropertyChangeListener(listener); } public static void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { propertySupport.addPropertyChangeListener(propertyName, listener); } public static void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) { propertySupport.removePropertyChangeListener(propertyName, listener); } static void firePropertyChange(String property, boolean oldVal, boolean newVal) { propertySupport.firePropertyChange(property, oldVal, newVal); } static void firePropertyChange(String property, Object oldVal, Object newVal) { propertySupport.firePropertyChange(property, oldVal, newVal); } // // accessor methods // public static int getTemplateType() { getPrefs(); int ret = templateType; if (ret == TEMPLATE_CUSTOM && templateFile == null) { ret = TEMPLATE_UNKNOWN; } return ret; } public static void setTemplateType(int value) { getPrefs(); if (value != TEMPLATE_PLAIN && value != TEMPLATE_EMPTY && value != TEMPLATE_CUSTOM) { value = TEMPLATE_UNKNOWN; } if (value != TEMPLATE_UNKNOWN && templateType != value) { getPrefs().putInt(TEMPLATE_TYPE, value); } } public static File getTemplateFile() { getPrefs(); return templateFile; } public static void setTemplateFile(File value) { getPrefs(); setTemplateFile(value, null); } public static void setTemplateFile(File value, Template template) { getPrefs(); if (value != null && !value.canRead()) value = null; if (value == null ? templateFile != null : !value.equals(templateFile)) { try { customTemplateFile = template == null ? null : value; customTemplate = template; getPrefs().put(TEMPLATE_FILE, value == null ? "" : value.getCanonicalPath()); } catch (IOException ex) { } } } public static void handleGraphicsAcceleration() { String accel = GRAPHICS_ACCELERATION.get(); try { if (accel == ACCEL_NONE) { System.setProperty("sun.java2d.opengl", "False"); System.setProperty("sun.java2d.d3d", "False"); } else if (accel == ACCEL_OPENGL) { System.setProperty("sun.java2d.opengl", "True"); System.setProperty("sun.java2d.d3d", "False"); } else if (accel == ACCEL_D3D) { System.setProperty("sun.java2d.opengl", "False"); System.setProperty("sun.java2d.d3d", "True"); } } catch (Throwable t) { } } // // template methods // public static Template getTemplate() { getPrefs(); switch (templateType) { case TEMPLATE_PLAIN: return getPlainTemplate(); case TEMPLATE_EMPTY: return getEmptyTemplate(); case TEMPLATE_CUSTOM: return getCustomTemplate(); default: return getPlainTemplate(); } } public static Template getEmptyTemplate() { if (emptyTemplate == null) emptyTemplate = Template.createEmpty(); return emptyTemplate; } private static Template getPlainTemplate() { if (plainTemplate == null) { ClassLoader ld = Startup.class.getClassLoader(); InputStream in = ld.getResourceAsStream("resources/logisim/default.templ"); if (in == null) { plainTemplate = getEmptyTemplate(); } else { try { try { plainTemplate = Template.create(in); } finally { in.close(); } } catch (Throwable e) { plainTemplate = getEmptyTemplate(); } } } return plainTemplate; } private static Template getCustomTemplate() { File toRead = templateFile; if (customTemplateFile == null || !(customTemplateFile.equals(toRead))) { if (toRead == null) { customTemplate = null; customTemplateFile = null; } else { FileInputStream reader = null; try { reader = new FileInputStream(toRead); customTemplate = Template.create(reader); customTemplateFile = templateFile; } catch (Throwable t) { setTemplateFile(null); customTemplate = null; customTemplateFile = null; } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { } } } } } return customTemplate == null ? getPlainTemplate() : customTemplate; } // // recent projects // public static List getRecentFiles() { return recentProjects.getRecentFiles(); } public static void updateRecentFile(File file) { recentProjects.updateRecent(file); } // // LocalePreference // private static class LocalePreference extends PrefMonitorString { public LocalePreference() { super("locale", ""); String localeStr = this.get(); if (localeStr != null && !localeStr.equals("")) { LocaleManager.setLocale(new Locale(localeStr)); } LocaleManager.addLocaleListener(myListener); myListener.localeChanged(); } @Override public void set(String value) { if (findLocale(value) != null) { super.set(value); } } private static Locale findLocale(String lang) { Locale[] check; for (int set = 0; set < 2; set++) { if (set == 0) check = new Locale[] { Locale.getDefault(), Locale.ENGLISH }; else check = Locale.getAvailableLocales(); for (int i = 0; i < check.length; i++) { Locale loc = check[i]; if (loc != null && loc.getLanguage().equals(lang)) { return loc; } } } return null; } } } logisim-2.7.1/src/com/cburch/logisim/prefs/AbstractPrefMonitor.java0000644000175000017500000000206111455470144025256 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.prefs; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; abstract class AbstractPrefMonitor implements PrefMonitor { private String name; AbstractPrefMonitor(String name) { this.name = name; } public String getIdentifier() { return name; } public boolean isSource(PropertyChangeEvent event) { return name.equals(event.getPropertyName()); } public void addPropertyChangeListener(PropertyChangeListener listener) { AppPreferences.addPropertyChangeListener(name, listener); } public void removePropertyChangeListener(PropertyChangeListener listener) { AppPreferences.removePropertyChangeListener(name, listener); } public boolean getBoolean() { return ((Boolean) get()).booleanValue(); } public void setBoolean(boolean value) { @SuppressWarnings("unchecked") E valObj = (E) Boolean.valueOf(value); set(valObj); } } logisim-2.7.1/src/com/cburch/logisim/Main.java0000644000175000017500000000244611541742660021103 0ustar vincentvincent/* * Copyright (c) 2011, Carl Burch. * * This file is part of the Logisim source code. The latest * version is available at http://www.cburch.com/logisim/. * * Logisim is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Logisim is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Logisim; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ package com.cburch.logisim; import com.cburch.logisim.gui.start.Startup; public class Main { public static final LogisimVersion VERSION = LogisimVersion.get(2, 7, 1); public static final String VERSION_NAME = VERSION.toString(); public static final int COPYRIGHT_YEAR = 2011; public static void main(String[] args) { Startup startup = Startup.parseArgs(args); if (startup == null) { System.exit(0); } else { startup.run(); } } } logisim-2.7.1/src/com/cburch/logisim/LogisimVersion.java0000644000175000017500000000462211500267072023160 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim; public class LogisimVersion { private static final int FINAL_REVISION = Integer.MAX_VALUE / 4; public static LogisimVersion get(int major, int minor, int release) { return get(major, minor, release, FINAL_REVISION); } public static LogisimVersion get(int major, int minor, int release, int revision) { return new LogisimVersion(major, minor, release, revision); } public static LogisimVersion parse(String versionString) { String[] parts = versionString.split("\\."); int major = 0; int minor = 0; int release = 0; int revision = FINAL_REVISION; try { if (parts.length >= 1) major = Integer.parseInt(parts[0]); if (parts.length >= 2) minor = Integer.parseInt(parts[1]); if (parts.length >= 3) release = Integer.parseInt(parts[2]); if (parts.length >= 4) revision = Integer.parseInt(parts[3]); } catch (NumberFormatException e) { } return new LogisimVersion(major, minor, release, revision); } private int major; private int minor; private int release; private int revision; private String repr; private LogisimVersion(int major, int minor, int release, int revision) { this.major = major; this.minor = minor; this.release = release; this.revision = revision; this.repr = null; } @Override public int hashCode() { int ret = major * 31 + minor; ret = ret * 31 + release; ret = ret * 31 + revision; return ret; } @Override public boolean equals(Object other) { if (other instanceof LogisimVersion) { LogisimVersion o = (LogisimVersion) other; return this.major == o.major && this.minor == o.minor && this.release == o.release && this.revision == o.revision; } else { return false; } } public int compareTo(LogisimVersion other) { int ret = this.major - other.major; if (ret != 0) { return ret; } else { ret = this.minor - other.minor; if (ret != 0) { return ret; } else { ret = this.release - other.release; if (ret != 0) { return ret; } else { return this.revision - other.revision; } } } } @Override public String toString() { String ret = repr; if (ret == null) { ret = major + "." + minor + "." + release; if (revision != FINAL_REVISION) ret += "." + revision; repr = ret; } return ret; } } logisim-2.7.1/src/com/cburch/logisim/instance/0000755000175000017500000000000011535206216021145 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/logisim/instance/Strings.java0000644000175000017500000000102711446034550023442 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.instance; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.StringGetter; class Strings { private static LocaleManager source = new LocaleManager("resources/logisim", "std"); public static String get(String key) { return source.get(key); } public static StringGetter getter(String key) { return source.getter(key); } } logisim-2.7.1/src/com/cburch/logisim/instance/StdAttr.java0000644000175000017500000000354011446034550023400 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.instance; import java.awt.Font; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeOption; import com.cburch.logisim.data.Attributes; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Direction; public interface StdAttr { public static final Attribute FACING = Attributes.forDirection("facing", Strings.getter("stdFacingAttr")); public static final Attribute WIDTH = Attributes.forBitWidth("width", Strings.getter("stdDataWidthAttr")); public static final AttributeOption TRIG_RISING = new AttributeOption("rising", Strings.getter("stdTriggerRising")); public static final AttributeOption TRIG_FALLING = new AttributeOption("falling", Strings.getter("stdTriggerFalling")); public static final AttributeOption TRIG_HIGH = new AttributeOption("high", Strings.getter("stdTriggerHigh")); public static final AttributeOption TRIG_LOW = new AttributeOption("low", Strings.getter("stdTriggerLow")); public static final Attribute TRIGGER = Attributes.forOption("trigger", Strings.getter("stdTriggerAttr"), new AttributeOption[] { TRIG_RISING, TRIG_FALLING, TRIG_HIGH, TRIG_LOW }); public static final Attribute EDGE_TRIGGER = Attributes.forOption("trigger", Strings.getter("stdTriggerAttr"), new AttributeOption[] { TRIG_RISING, TRIG_FALLING }); public static final Attribute LABEL = Attributes.forString("label", Strings.getter("stdLabelAttr")); public static final Attribute LABEL_FONT = Attributes.forFont("labelfont", Strings.getter("stdLabelFontAttr")); public static final Font DEFAULT_LABEL_FONT = new Font("SansSerif", Font.PLAIN, 12); } logisim-2.7.1/src/com/cburch/logisim/instance/Port.java0000644000175000017500000000674711446034550022753 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.instance; import com.cburch.logisim.comp.EndData; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Location; import com.cburch.logisim.util.StringGetter; public class Port { public static final String INPUT = "input"; public static final String OUTPUT = "output"; public static final String INOUT = "inout"; public static final String EXCLUSIVE = "exclusive"; public static final String SHARED = "shared"; private int dx; private int dy; private int type; private BitWidth widthFixed; private Attribute widthAttr; private boolean exclude; private StringGetter toolTip; public Port(int dx, int dy, String type, BitWidth bits) { this(dx, dy, type, bits, defaultExclusive(type)); } public Port(int dx, int dy, String type, int bits) { this(dx, dy, type, BitWidth.create(bits), defaultExclusive(type)); } public Port(int dx, int dy, String type, int bits, String exclude) { this(dx, dy, type, BitWidth.create(bits), exclude); } public Port(int dx, int dy, String type, BitWidth bits, String exclude) { this.dx = dx; this.dy = dy; this.type = toType(type); this.widthFixed = bits; this.widthAttr = null; this.exclude = toExclusive(exclude); this.toolTip = null; } public Port(int dx, int dy, String type, Attribute attr) { this(dx, dy, type, attr, defaultExclusive(type)); } public Port(int dx, int dy, String type, Attribute attr, String exclude) { this.dx = dx; this.dy = dy; this.type = toType(type); this.widthFixed = null; this.widthAttr = attr; this.exclude = toExclusive(exclude); this.toolTip = null; } public void setToolTip(StringGetter value) { toolTip = value; } public String getToolTip() { StringGetter getter = toolTip; return getter == null ? null : getter.get(); } public Attribute getWidthAttribute() { return widthAttr; } public EndData toEnd(Location loc, AttributeSet attrs) { Location pt = loc.translate(dx, dy); if (widthFixed != null) { return new EndData(pt, widthFixed, type, exclude); } else { Object val = attrs.getValue(widthAttr); if (!(val instanceof BitWidth)) { throw new IllegalArgumentException("Width attribute not set"); } return new EndData(pt, (BitWidth) val, type, exclude); } } private static int toType(String s) { if (s == null) throw new IllegalArgumentException("Null port type"); else if (s.equals(INPUT)) return EndData.INPUT_ONLY; else if (s.equals(OUTPUT)) return EndData.OUTPUT_ONLY; else if (s.equals(INOUT)) return EndData.INPUT_OUTPUT; else throw new IllegalArgumentException("Not recognized port type"); } private static String defaultExclusive(String s) { if (s == null) throw new IllegalArgumentException("Null port type"); else if (s.equals(INPUT)) return SHARED; else if (s.equals(OUTPUT)) return EXCLUSIVE; else if (s.equals(INOUT)) return SHARED; else throw new IllegalArgumentException("Not recognized port type"); } private static boolean toExclusive(String s) { if (s == null) throw new IllegalArgumentException("Null exclusion type"); else if (s.equals(EXCLUSIVE)) return true; else if (s.equals(SHARED)) return false; else throw new IllegalArgumentException("Not recognized exclusion type"); } } logisim-2.7.1/src/com/cburch/logisim/instance/InstanceTextField.java0000644000175000017500000001077511446034550025400 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.instance; import java.awt.Font; import java.awt.Graphics; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.comp.Component; import com.cburch.logisim.comp.ComponentDrawContext; import com.cburch.logisim.comp.ComponentUserEvent; import com.cburch.logisim.comp.TextField; import com.cburch.logisim.comp.TextFieldEvent; import com.cburch.logisim.comp.TextFieldListener; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeEvent; import com.cburch.logisim.data.AttributeListener; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Location; import com.cburch.logisim.gui.main.Canvas; import com.cburch.logisim.proj.Action; import com.cburch.logisim.tools.Caret; import com.cburch.logisim.tools.SetAttributeAction; import com.cburch.logisim.tools.TextEditable; public class InstanceTextField implements AttributeListener, TextFieldListener, TextEditable { private Canvas canvas; private InstanceComponent comp; private TextField field; private Attribute labelAttr; private Attribute fontAttr; private int fieldX; private int fieldY; private int halign; private int valign; InstanceTextField(InstanceComponent comp) { this.comp = comp; this.field = null; this.labelAttr = null; this.fontAttr = null; } void update(Attribute labelAttr, Attribute fontAttr, int x, int y, int halign, int valign) { boolean wasReg = shouldRegister(); this.labelAttr = labelAttr; this.fontAttr = fontAttr; this.fieldX = x; this.fieldY = y; this.halign = halign; this.valign = valign; boolean shouldReg = shouldRegister(); AttributeSet attrs = comp.getAttributeSet(); if (!wasReg && shouldReg) attrs.addAttributeListener(this); if (wasReg && !shouldReg) attrs.removeAttributeListener(this); updateField(attrs); } private void updateField(AttributeSet attrs) { String text = attrs.getValue(labelAttr); if (text == null || text.equals("")) { if (field != null) { field.removeTextFieldListener(this); field = null; } } else { if (field == null) { createField(attrs, text); } else { Font font = attrs.getValue(fontAttr); if (font != null) field.setFont(font); field.setLocation(fieldX, fieldY, halign, valign); field.setText(text); } } } private void createField(AttributeSet attrs, String text) { Font font = attrs.getValue(fontAttr); field = new TextField(fieldX, fieldY, halign, valign, font); field.setText(text); field.addTextFieldListener(this); } private boolean shouldRegister() { return labelAttr != null || fontAttr != null; } Bounds getBounds(Graphics g) { return field == null ? Bounds.EMPTY_BOUNDS : field.getBounds(g); } void draw(Component comp, ComponentDrawContext context) { if (field != null) { Graphics g = context.getGraphics().create(); field.draw(g); g.dispose(); } } public void attributeListChanged(AttributeEvent e) { } public void attributeValueChanged(AttributeEvent e) { Attribute attr = e.getAttribute(); if (attr == labelAttr) { updateField(comp.getAttributeSet()); } else if (attr == fontAttr) { if (field != null) field.setFont((Font) e.getValue()); } } public void textChanged(TextFieldEvent e) { String prev = e.getOldText(); String next = e.getText(); if (!next.equals(prev)) { comp.getAttributeSet().setValue(labelAttr, next); } } public Action getCommitAction(Circuit circuit, String oldText, String newText) { SetAttributeAction act = new SetAttributeAction(circuit, Strings.getter("changeLabelAction")); act.set(comp, labelAttr, newText); return act; } public Caret getTextCaret(ComponentUserEvent event) { canvas = event.getCanvas(); Graphics g = canvas.getGraphics(); // if field is absent, create it empty // and if it is empty, just return a caret at its beginning if (field == null) createField(comp.getAttributeSet(), ""); String text = field.getText(); if (text == null || text.equals("")) return field.getCaret(g, 0); Bounds bds = field.getBounds(g); if (bds.getWidth() < 4 || bds.getHeight() < 4) { Location loc = comp.getLocation(); bds = bds.add(Bounds.create(loc).expand(2)); } int x = event.getX(); int y = event.getY(); if (bds.contains(x, y)) return field.getCaret(g, x, y); else return null; } } logisim-2.7.1/src/com/cburch/logisim/instance/InstanceStateImpl.java0000644000175000017500000000523611446034550025406 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.instance; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.comp.Component; import com.cburch.logisim.comp.EndData; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.proj.Project; class InstanceStateImpl implements InstanceState { private CircuitState circuitState; private Component component; public InstanceStateImpl(CircuitState circuitState, Component component) { this.circuitState = circuitState; this.component = component; } public void repurpose(CircuitState circuitState, Component component) { this.circuitState = circuitState; this.component = component; } CircuitState getCircuitState() { return circuitState; } public Project getProject() { return circuitState.getProject(); } public Instance getInstance() { if (component instanceof InstanceComponent) { return ((InstanceComponent) component).getInstance(); } else { return null; } } public InstanceFactory getFactory() { if (component instanceof InstanceComponent) { InstanceComponent comp = (InstanceComponent) component; return (InstanceFactory) comp.getFactory(); } else { return null; } } public AttributeSet getAttributeSet() { return component.getAttributeSet(); } public E getAttributeValue(Attribute attr) { return component.getAttributeSet().getValue(attr); } public Value getPort(int portIndex) { EndData data = component.getEnd(portIndex); return circuitState.getValue(data.getLocation()); } public boolean isPortConnected(int index) { Circuit circ = circuitState.getCircuit(); Location loc = component.getEnd(index).getLocation(); return circ.isConnected(loc, component); } public void setPort(int portIndex, Value value, int delay) { EndData end = component.getEnd(portIndex); circuitState.setValue(end.getLocation(), value, component, delay); } public InstanceData getData() { return (InstanceData) circuitState.getData(component); } public void setData(InstanceData value) { circuitState.setData(component, value); } public void fireInvalidated() { if (component instanceof InstanceComponent) { ((InstanceComponent) component).fireInvalidated(); } } public boolean isCircuitRoot() { return !circuitState.isSubstate(); } public long getTickCount() { return circuitState.getPropagator().getTickCount(); } } logisim-2.7.1/src/com/cburch/logisim/instance/InstanceState.java0000644000175000017500000000157611446034550024567 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.instance; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Value; import com.cburch.logisim.proj.Project; public interface InstanceState { public Instance getInstance(); public InstanceFactory getFactory(); public Project getProject(); public AttributeSet getAttributeSet(); public E getAttributeValue(Attribute attr); public Value getPort(int portIndex); public boolean isPortConnected(int portIndex); public void setPort(int portIndex, Value value, int delay); public InstanceData getData(); public void setData(InstanceData value); public void fireInvalidated(); public boolean isCircuitRoot(); public long getTickCount(); } logisim-2.7.1/src/com/cburch/logisim/instance/InstancePokerAdapter.java0000644000175000017500000000723611446034550026067 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.instance; import java.awt.Graphics; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.comp.ComponentDrawContext; import com.cburch.logisim.comp.ComponentUserEvent; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.gui.main.Canvas; import com.cburch.logisim.tools.AbstractCaret; import com.cburch.logisim.tools.Caret; import com.cburch.logisim.tools.Pokable; class InstancePokerAdapter extends AbstractCaret implements Pokable { private InstanceComponent comp; private Canvas canvas; private InstancePoker poker; private InstanceStateImpl state; private ComponentDrawContext context; public InstancePokerAdapter(InstanceComponent comp, Class pokerClass) { try { this.comp = comp; poker = pokerClass.newInstance(); } catch (Throwable t) { handleError(t, pokerClass); poker = null; } } private void handleError(Throwable t, Class pokerClass) { String className = pokerClass.getName(); System.err.println("error while instantiating poker " + className //OK + ": " + t.getClass().getName()); String msg = t.getMessage(); if (msg != null) System.err.println(" (" + msg + ")"); //OK } public Caret getPokeCaret(ComponentUserEvent event) { if (poker == null) { return null; } else { canvas = event.getCanvas(); CircuitState circState = event.getCircuitState(); InstanceStateImpl state = new InstanceStateImpl(circState, comp); MouseEvent e = new MouseEvent(event.getCanvas(), MouseEvent.MOUSE_PRESSED, System.currentTimeMillis(), 0, event.getX(), event.getY(), 1, false); boolean isAccepted = poker.init(state, e); if (isAccepted) { this.state = state; this.context = new ComponentDrawContext(event.getCanvas(), event.getCanvas().getCircuit(), circState, null, null); mousePressed(e); return this; } else { poker = null; return null; } } } @Override public void mousePressed(MouseEvent e) { if (poker != null) { poker.mousePressed(state, e); checkCurrent(); } } @Override public void mouseDragged(MouseEvent e) { if (poker != null) { poker.mouseDragged(state, e); checkCurrent(); } } @Override public void mouseReleased(MouseEvent e) { if (poker != null) { poker.mouseReleased(state, e); checkCurrent(); } } @Override public void keyPressed(KeyEvent e) { if (poker != null) { poker.keyPressed(state, e); checkCurrent(); } } @Override public void keyReleased(KeyEvent e) { if (poker != null) { poker.keyReleased(state, e); checkCurrent(); } } @Override public void keyTyped(KeyEvent e) { if (poker != null) { poker.keyTyped(state, e); checkCurrent(); } } @Override public void stopEditing() { if (poker != null) { poker.stopEditing(state); checkCurrent(); } } @Override public Bounds getBounds(Graphics g) { if (poker != null) { context.setGraphics(g); InstancePainter painter = new InstancePainter(context, comp); return poker.getBounds(painter); } else { return Bounds.EMPTY_BOUNDS; } } @Override public void draw(Graphics g) { if (poker != null) { context.setGraphics(g); InstancePainter painter = new InstancePainter(context, comp); poker.paint(painter); } } private void checkCurrent() { if (state != null && canvas != null) { CircuitState s0 = state.getCircuitState(); CircuitState s1 = canvas.getCircuitState(); if (s0 != s1) { state = new InstanceStateImpl(s1, comp); } } } } logisim-2.7.1/src/com/cburch/logisim/instance/InstancePoker.java0000644000175000017500000000172511446034550024563 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.instance; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import com.cburch.logisim.data.Bounds; public abstract class InstancePoker { public boolean init(InstanceState state, MouseEvent e) { return true; } public Bounds getBounds(InstancePainter painter) { return painter.getInstance().getBounds(); } public void paint(InstancePainter painter) { } public void mousePressed(InstanceState state, MouseEvent e) { } public void mouseReleased(InstanceState state, MouseEvent e) { } public void mouseDragged(InstanceState state, MouseEvent e) { } public void keyPressed(InstanceState state, KeyEvent e) { } public void keyReleased(InstanceState state, KeyEvent e) { } public void keyTyped(InstanceState state, KeyEvent e) { } public void stopEditing(InstanceState state) { } } logisim-2.7.1/src/com/cburch/logisim/instance/InstancePainter.java0000644000175000017500000001265711451010346025104 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.instance; import java.awt.Graphics; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.circuit.WireSet; import com.cburch.logisim.comp.ComponentDrawContext; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.proj.Project; public class InstancePainter implements InstanceState { private ComponentDrawContext context; private InstanceComponent comp; private InstanceFactory factory; private AttributeSet attrs; public InstancePainter(ComponentDrawContext context, InstanceComponent instance) { this.context = context; this.comp = instance; } void setInstance(InstanceComponent value) { this.comp = value; } void setFactory(InstanceFactory factory, AttributeSet attrs) { this.comp = null; this.factory = factory; this.attrs = attrs; } public InstanceFactory getFactory() { return comp == null ? factory : (InstanceFactory) comp.getFactory(); } // // methods related to the context of the canvas // public WireSet getHighlightedWires() { return context.getHighlightedWires(); } public boolean getShowState() { return context.getShowState(); } public boolean isPrintView() { return context.isPrintView(); } public boolean shouldDrawColor() { return context.shouldDrawColor(); } public java.awt.Component getDestination() { return context.getDestination(); } public Graphics getGraphics() { return context.getGraphics(); } public Circuit getCircuit() { return context.getCircuit(); } public Object getGateShape() { return context.getGateShape(); } public boolean isCircuitRoot() { return !context.getCircuitState().isSubstate(); } public long getTickCount() { return context.getCircuitState().getPropagator().getTickCount(); } // // methods related to the circuit state // public Project getProject() { return context.getCircuitState().getProject(); } public Value getPort(int portIndex) { InstanceComponent c = comp; CircuitState s = context.getCircuitState(); if (c != null && s != null) { return s.getValue(c.getEnd(portIndex).getLocation()); } else { return Value.UNKNOWN; } } public void setPort(int portIndex, Value value, int delay) { throw new UnsupportedOperationException("setValue on InstancePainter"); } public InstanceData getData() { CircuitState circState = context.getCircuitState(); if (circState == null || comp == null) { throw new UnsupportedOperationException("setData on InstancePainter"); } else { return (InstanceData) circState.getData(comp); } } public void setData(InstanceData value) { CircuitState circState = context.getCircuitState(); if (circState == null || comp == null) { throw new UnsupportedOperationException("setData on InstancePainter"); } else { circState.setData(comp, value); } } // // methods related to the instance // public Instance getInstance() { InstanceComponent c = comp; return c == null ? null : c.getInstance(); } public Location getLocation() { InstanceComponent c = comp; return c == null ? Location.create(0, 0) : c.getLocation(); } public boolean isPortConnected(int index) { Circuit circ = context.getCircuit(); Location loc = comp.getEnd(index).getLocation(); return circ.isConnected(loc, comp); } public Bounds getOffsetBounds() { InstanceComponent c = comp; if (c == null) { return factory.getOffsetBounds(attrs); } else { Location loc = c.getLocation(); return c.getBounds().translate(-loc.getX(), -loc.getY()); } } public Bounds getBounds() { InstanceComponent c = comp; return c == null ? factory.getOffsetBounds(attrs) : c.getBounds(); } public AttributeSet getAttributeSet() { InstanceComponent c = comp; return c == null ? attrs : c.getAttributeSet(); } public E getAttributeValue(Attribute attr) { InstanceComponent c = comp; AttributeSet as = c == null ? attrs : c.getAttributeSet(); return as.getValue(attr); } public void fireInvalidated() { comp.fireInvalidated(); } // // helper methods for drawing common elements in components // public void drawBounds() { context.drawBounds(comp); } public void drawRectangle(Bounds bds, String label) { context.drawRectangle(bds.getX(), bds.getY(), bds.getWidth(), bds.getHeight(), label); } public void drawRectangle(int x, int y, int width, int height, String label) { context.drawRectangle(x, y, width, height, label); } public void drawDongle(int x, int y) { context.drawDongle(x, y); } public void drawPort(int i) { context.drawPin(comp, i); } public void drawPort(int i, String label, Direction dir) { context.drawPin(comp, i, label, dir); } public void drawPorts() { context.drawPins(comp); } public void drawClock(int i, Direction dir) { context.drawClock(comp, i, dir); } public void drawHandles() { context.drawHandles(comp); } public void drawHandle(Location loc) { context.drawHandle(loc); } public void drawHandle(int x, int y) { context.drawHandle(x, y); } public void drawLabel() { if (comp != null) { comp.drawLabel(context); } } } logisim-2.7.1/src/com/cburch/logisim/instance/InstanceLoggerAdapter.java0000644000175000017500000000342511446034550026222 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.instance; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.data.Value; import com.cburch.logisim.gui.log.Loggable; class InstanceLoggerAdapter implements Loggable { private InstanceComponent comp; private InstanceLogger logger; private InstanceStateImpl state; public InstanceLoggerAdapter(InstanceComponent comp, Class loggerClass) { try { this.comp = comp; this.logger = loggerClass.newInstance(); this.state = new InstanceStateImpl(null, comp); } catch (Throwable t) { handleError(t, loggerClass); logger = null; } } private void handleError(Throwable t, Class loggerClass) { String className = loggerClass.getName(); System.err.println("error while instantiating logger " + className //OK + ": " + t.getClass().getName()); String msg = t.getMessage(); if (msg != null) System.err.println(" (" + msg + ")"); //OK } public Object[] getLogOptions(CircuitState circState) { if (logger != null) { updateState(circState); return logger.getLogOptions(state); } else { return null; } } public String getLogName(Object option) { if (logger != null) { return logger.getLogName(state, option); } else { return null; } } public Value getLogValue(CircuitState circuitState, Object option) { if (logger != null) { updateState(circuitState); return logger.getLogValue(state, option); } else { return Value.UNKNOWN; } } private void updateState(CircuitState circuitState) { if (state.getCircuitState() != circuitState) { state.repurpose(circuitState, comp); } } } logisim-2.7.1/src/com/cburch/logisim/instance/InstanceLogger.java0000644000175000017500000000073711446034550024724 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.instance; import com.cburch.logisim.data.Value; public abstract class InstanceLogger { public Object[] getLogOptions(InstanceState state) { return null; } public abstract String getLogName(InstanceState state, Object option); public abstract Value getLogValue(InstanceState state, Object option); } logisim-2.7.1/src/com/cburch/logisim/instance/InstanceFactory.java0000644000175000017500000002063011535206216025105 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.instance; import java.awt.Color; import java.awt.Graphics; import java.util.Collections; import java.util.List; import javax.swing.Icon; import com.cburch.logisim.LogisimVersion; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.comp.AbstractComponentFactory; import com.cburch.logisim.comp.Component; import com.cburch.logisim.comp.ComponentDrawContext; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.AttributeSets; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.gui.log.Loggable; import com.cburch.logisim.tools.Pokable; import com.cburch.logisim.tools.key.KeyConfigurator; import com.cburch.logisim.util.Icons; import com.cburch.logisim.util.StringGetter; import com.cburch.logisim.util.StringUtil; import com.cburch.logisim.util.UnmodifiableList; /** * Represents a category of components that appear in a circuit. This class * and Component share the same sort of relationship as the * relation between classes and instances in Java. Normally, * there is only one ComponentFactory created for any particular category. */ public abstract class InstanceFactory extends AbstractComponentFactory { private String name; private StringGetter displayName; private StringGetter defaultToolTip; private String iconName; private Icon icon; private Attribute[] attrs; private Object[] defaults; private AttributeSet defaultSet; private Bounds bounds; private List portList; private Attribute facingAttribute; private Boolean shouldSnap; private KeyConfigurator keyConfigurator; private Class pokerClass; private Class loggerClass; public InstanceFactory(String name) { this(name, StringUtil.constantGetter(name)); } public InstanceFactory(String name, StringGetter displayName) { this.name = name; this.displayName = displayName; this.iconName = null; this.icon = null; this.attrs = null; this.defaults = null; this.bounds = Bounds.EMPTY_BOUNDS; this.portList = Collections.emptyList(); this.keyConfigurator = null; this.facingAttribute = null; this.shouldSnap = Boolean.TRUE; } @Override public String getName() { return name; } @Override public String getDisplayName() { return getDisplayGetter().get(); } @Override public StringGetter getDisplayGetter() { return displayName; } public void setIconName(String value) { iconName = value; icon = null; } public void setIcon(Icon value) { iconName = ""; icon = value; } @Override public final void paintIcon(ComponentDrawContext context, int x, int y, AttributeSet attrs) { InstancePainter painter = context.getInstancePainter(); painter.setFactory(this, attrs); Graphics g = painter.getGraphics(); g.translate(x, y); paintIcon(painter); g.translate(-x, -y); if (painter.getFactory() == null) { Icon i = icon; if (i == null) { String n = iconName; if (n != null) { i = Icons.getIcon(n); if (i == null) n = null; } } if (i != null) { i.paintIcon(context.getDestination(), g, x + 2, y + 2); } else { super.paintIcon(context, x, y, attrs); } } } @Override public final Component createComponent(Location loc, AttributeSet attrs) { InstanceComponent ret = new InstanceComponent(this, loc, attrs); configureNewInstance(ret.getInstance()); return ret; } public void setOffsetBounds(Bounds value) { bounds = value; } @Override public Bounds getOffsetBounds(AttributeSet attrs) { Bounds ret = bounds; if (ret == null) { throw new RuntimeException("offset bounds unknown: " + "use setOffsetBounds or override getOffsetBounds"); } return ret; } public boolean contains(Location loc, AttributeSet attrs) { Bounds bds = getOffsetBounds(attrs); if (bds == null) return false; return bds.contains(loc, 1); } public Attribute getFacingAttribute() { return facingAttribute; } public void setFacingAttribute(Attribute value) { facingAttribute = value; } public KeyConfigurator getKeyConfigurator() { return keyConfigurator; } public void setKeyConfigurator(KeyConfigurator value) { keyConfigurator = value; } public void setAttributes(Attribute[] attrs, Object[] defaults) { this.attrs = attrs; this.defaults = defaults; } @Override public AttributeSet createAttributeSet() { Attribute[] as = attrs; AttributeSet ret = as == null ? AttributeSets.EMPTY : AttributeSets.fixedSet(as, defaults); return ret; } @Override public Object getDefaultAttributeValue(Attribute attr, LogisimVersion ver) { Attribute[] as = attrs; if (as != null) { for (int i = 0; i < as.length; i++) { if (as[i] == attr) { return defaults[i]; } } return null; } else { AttributeSet dfltSet = defaultSet; if (dfltSet == null) { dfltSet = createAttributeSet(); defaultSet = dfltSet; } return dfltSet.getValue(attr); } } public void setPorts(Port[] ports) { portList = new UnmodifiableList(ports); } public void setPorts(List ports) { portList = Collections.unmodifiableList(ports); } public List getPorts() { return portList; } public void setDefaultToolTip(StringGetter value) { defaultToolTip = value; } public StringGetter getDefaultToolTip() { return defaultToolTip; } public void setInstancePoker(Class pokerClass) { if (isClassOk(pokerClass, InstancePoker.class)) { this.pokerClass = pokerClass; } } public void setInstanceLogger(Class loggerClass) { if (isClassOk(loggerClass, InstanceLogger.class)) { this.loggerClass = loggerClass; } } public void setShouldSnap(boolean value) { shouldSnap = Boolean.valueOf(value); } private boolean isClassOk(Class sub, Class sup) { boolean isSub = sup.isAssignableFrom(sub); if (!isSub) { System.err.println(sub.getName() + " must be a subclass of " + sup.getName()); //OK return false; } try { sub.getConstructor(new Class[0]); return true; } catch (SecurityException e) { System.err.println(sub.getName() + " needs its no-args constructor to be public"); //OK } catch (NoSuchMethodException e) { System.err.println(sub.getName() + " is missing a no-arguments constructor"); //OK } return true; } @Override public final Object getFeature(Object key, AttributeSet attrs) { if (key == FACING_ATTRIBUTE_KEY) return facingAttribute; if (key == KeyConfigurator.class) return keyConfigurator; if (key == SHOULD_SNAP) return shouldSnap; return super.getFeature(key, attrs); } @Override public final void drawGhost(ComponentDrawContext context, Color color, int x, int y, AttributeSet attrs) { InstancePainter painter = context.getInstancePainter(); Graphics g = painter.getGraphics(); g.setColor(color); g.translate(x, y); painter.setFactory(this, attrs); paintGhost(painter); g.translate(-x, -y); if (painter.getFactory() == null) { super.drawGhost(context, color, x, y, attrs); } } public void paintIcon(InstancePainter painter) { painter.setFactory(null, null); } public void paintGhost(InstancePainter painter) { painter.setFactory(null, null); } public abstract void paintInstance(InstancePainter painter); public abstract void propagate(InstanceState state); // event methods protected void configureNewInstance(Instance instance) { } protected void instanceAttributeChanged(Instance instance, Attribute attr) { } protected Object getInstanceFeature(Instance instance, Object key) { if (key == Pokable.class && pokerClass != null) { return new InstancePokerAdapter(instance.getComponent(), pokerClass); } else if (key == Loggable.class && loggerClass != null) { return new InstanceLoggerAdapter(instance.getComponent(), loggerClass); } else { return null; } } public InstanceState createInstanceState(CircuitState state, Instance instance) { return new InstanceStateImpl(state, instance.getComponent()); } public final InstanceState createInstanceState(CircuitState state, Component comp) { return createInstanceState(state, ((InstanceComponent) comp).getInstance()); } } logisim-2.7.1/src/com/cburch/logisim/instance/InstanceDataSingleton.java0000644000175000017500000000120611446034550026231 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.instance; public class InstanceDataSingleton implements InstanceData, Cloneable { private Object value; public InstanceDataSingleton(Object value) { this.value = value; } @Override public InstanceDataSingleton clone() { try { return (InstanceDataSingleton) super.clone(); } catch (CloneNotSupportedException e) { return null; } } public Object getValue() { return value; } public void setValue(Object value) { this.value = value; } } logisim-2.7.1/src/com/cburch/logisim/instance/InstanceData.java0000644000175000017500000000047311446034550024353 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.instance; import com.cburch.logisim.comp.ComponentState; public interface InstanceData extends ComponentState { public Object clone(); } logisim-2.7.1/src/com/cburch/logisim/instance/InstanceComponent.java0000644000175000017500000002206511446034550025445 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.instance; import java.awt.Font; import java.awt.Graphics; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.comp.Component; import com.cburch.logisim.comp.ComponentDrawContext; import com.cburch.logisim.comp.ComponentEvent; import com.cburch.logisim.comp.ComponentFactory; import com.cburch.logisim.comp.ComponentListener; import com.cburch.logisim.comp.ComponentUserEvent; import com.cburch.logisim.comp.EndData; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeEvent; import com.cburch.logisim.data.AttributeListener; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Location; import com.cburch.logisim.tools.TextEditable; import com.cburch.logisim.tools.ToolTipMaker; import com.cburch.logisim.util.EventSourceWeakSupport; import com.cburch.logisim.util.StringGetter; import com.cburch.logisim.util.UnmodifiableList; class InstanceComponent implements Component, AttributeListener, ToolTipMaker { private EventSourceWeakSupport listeners; private InstanceFactory factory; private Instance instance; private Location loc; private Bounds bounds; private List portList; private EndData[] endArray; private List endList; private boolean hasToolTips; private HashSet> widthAttrs; private AttributeSet attrs; private boolean attrListenRequested; private InstanceTextField textField; InstanceComponent(InstanceFactory factory, Location loc, AttributeSet attrs) { this.listeners = null; this.factory = factory; this.instance = new Instance(this); this.loc = loc; this.bounds = factory.getOffsetBounds(attrs).translate(loc.getX(), loc.getY()); this.portList = factory.getPorts(); this.endArray = null; this.hasToolTips = false; this.attrs = attrs; this.attrListenRequested = false; this.textField = null; computeEnds(); } private void computeEnds() { List ports = portList; EndData[] esOld = endArray; int esOldLength = esOld == null ? 0 : esOld.length; EndData[] es = esOld; if (es == null || es.length != ports.size()) { es = new EndData[ports.size()]; if (esOldLength > 0) { int toCopy = Math.min(esOldLength, es.length); System.arraycopy(esOld, 0, es, 0, toCopy); } } HashSet> wattrs = null; boolean toolTipFound = false; ArrayList endsChangedOld = null; ArrayList endsChangedNew = null; Iterator pit = ports.iterator(); for (int i = 0; pit.hasNext() || i < esOldLength; i++) { Port p = pit.hasNext() ? pit.next() : null; EndData oldEnd = i < esOldLength ? esOld[i] : null; EndData newEnd = p == null ? null : p.toEnd(loc, attrs); if (oldEnd == null || !oldEnd.equals(newEnd)) { if (newEnd != null) es[i] = newEnd; if (endsChangedOld == null) { endsChangedOld = new ArrayList(); endsChangedNew = new ArrayList(); } endsChangedOld.add(oldEnd); endsChangedNew.add(newEnd); } if (p != null) { Attribute attr = p.getWidthAttribute(); if (attr != null) { if (wattrs == null) { wattrs = new HashSet>(); } wattrs.add(attr); } if (p.getToolTip() != null) toolTipFound = true; } } if (!attrListenRequested) { HashSet> oldWattrs = widthAttrs; if (wattrs == null && oldWattrs != null) { getAttributeSet().removeAttributeListener(this); } else if (wattrs != null && oldWattrs == null) { getAttributeSet().addAttributeListener(this); } } if (es != esOld) { endArray = es; endList = new UnmodifiableList(es); } widthAttrs = wattrs; hasToolTips = toolTipFound; if (endsChangedOld != null) { fireEndsChanged(endsChangedOld, endsChangedNew); } } // // listening methods // public void addComponentListener(ComponentListener l) { EventSourceWeakSupport ls = listeners; if (ls == null) { ls = new EventSourceWeakSupport(); ls.add(l); listeners = ls; } else { ls.add(l); } } public void removeComponentListener(ComponentListener l) { if (listeners != null) { listeners.remove(l); if (listeners.isEmpty()) listeners = null; } } private void fireEndsChanged(ArrayList oldEnds, ArrayList newEnds) { EventSourceWeakSupport ls = listeners; if (ls != null) { ComponentEvent e = null; for (ComponentListener l : ls) { if (e == null) e = new ComponentEvent(this, oldEnds, newEnds); l.endChanged(e); } } } void fireInvalidated() { EventSourceWeakSupport ls = listeners; if (ls != null) { ComponentEvent e = null; for (ComponentListener l : ls) { if (e == null) e = new ComponentEvent(this); l.componentInvalidated(e); } } } // // basic information methods // public ComponentFactory getFactory() { return factory; } public AttributeSet getAttributeSet() { return attrs; } public Object getFeature(Object key) { Object ret = factory.getInstanceFeature(instance, key); if (ret != null) { return ret; } else if (key == ToolTipMaker.class) { Object defaultTip = factory.getDefaultToolTip(); if (hasToolTips || defaultTip != null) return this; } else if (key == TextEditable.class) { InstanceTextField field = textField; if (field != null) return field; } return null; } // // location/extent methods // public Location getLocation() { return loc; } public Bounds getBounds() { return bounds; } public Bounds getBounds(Graphics g) { Bounds ret = bounds; InstanceTextField field = textField; if (field != null) ret = ret.add(field.getBounds(g)); return ret; } public boolean contains(Location pt) { Location translated = pt.translate(-loc.getX(), -loc.getY()); InstanceFactory factory = instance.getFactory(); return factory.contains(translated, instance.getAttributeSet()); } public boolean contains(Location pt, Graphics g) { InstanceTextField field = textField; if (field != null && field.getBounds(g).contains(pt)) return true; else return contains(pt); } // // propagation methods // public List getEnds() { return endList; } public EndData getEnd(int index) { return endArray[index]; } public boolean endsAt(Location pt) { EndData[] ends = endArray; for (int i = 0; i < ends.length; i++) { if (ends[i].getLocation().equals(pt)) return true; } return false; } public void propagate(CircuitState state) { factory.propagate(state.getInstanceState(this)); } // // drawing methods // public void draw(ComponentDrawContext context) { InstancePainter painter = context.getInstancePainter(); painter.setInstance(this); factory.paintInstance(painter); } public void expose(ComponentDrawContext context) { Bounds b = bounds; context.getDestination().repaint(b.getX(), b.getY(), b.getWidth(), b.getHeight()); } public String getToolTip(ComponentUserEvent e) { int x = e.getX(); int y = e.getY(); int i = -1; for (EndData end : endArray) { i++; if (end.getLocation().manhattanDistanceTo(x, y) < 10) { Port p = portList.get(i); return p.getToolTip(); } } StringGetter defaultTip = factory.getDefaultToolTip(); return defaultTip == null ? null : defaultTip.get(); } // // AttributeListener methods // public void attributeListChanged(AttributeEvent e) { } public void attributeValueChanged(AttributeEvent e) { Attribute attr = e.getAttribute(); if (widthAttrs != null && widthAttrs.contains(attr)) computeEnds(); if (attrListenRequested) { factory.instanceAttributeChanged(instance, e.getAttribute()); } } // // methods for InstancePainter // void drawLabel(ComponentDrawContext context) { InstanceTextField field = textField; if (field != null) field.draw(this, context); } // // methods for Instance // Instance getInstance() { return instance; } List getPorts() { return portList; } void setPorts(Port[] ports) { Port[] portsCopy = ports.clone(); portList = new UnmodifiableList(portsCopy); computeEnds(); } void recomputeBounds() { Location p = loc; bounds = factory.getOffsetBounds(attrs).translate(p.getX(), p.getY()); } void addAttributeListener(Instance instance) { if (!attrListenRequested) { attrListenRequested = true; if (widthAttrs == null) getAttributeSet().addAttributeListener(this); } } void setTextField(Attribute labelAttr, Attribute fontAttr, int x, int y, int halign, int valign) { InstanceTextField field = textField; if (field == null) { field = new InstanceTextField(this); field.update(labelAttr, fontAttr, x, y, halign, valign); textField = field; } else { field.update(labelAttr, fontAttr, x, y, halign, valign); } } } logisim-2.7.1/src/com/cburch/logisim/instance/Instance.java0000644000175000017500000000436611446034550023566 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.instance; import java.awt.Font; import java.util.List; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.comp.Component; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Location; public class Instance { public static Instance getInstanceFor(Component comp) { if (comp instanceof InstanceComponent) { return ((InstanceComponent) comp).getInstance(); } else { return null; } } public static Component getComponentFor(Instance instance) { return instance.comp; } private InstanceComponent comp; Instance(InstanceComponent comp) { this.comp = comp; } InstanceComponent getComponent() { return comp; } public InstanceFactory getFactory() { return (InstanceFactory) comp.getFactory(); } public Location getLocation() { return comp.getLocation(); } public Bounds getBounds() { return comp.getBounds(); } public void setAttributeReadOnly(Attribute attr, boolean value) { comp.getAttributeSet().setReadOnly(attr, value); } public E getAttributeValue(Attribute attr) { return comp.getAttributeSet().getValue(attr); } public void addAttributeListener() { comp.addAttributeListener(this); } public AttributeSet getAttributeSet() { return comp.getAttributeSet(); } public List getPorts() { return comp.getPorts(); } public Location getPortLocation(int index) { return comp.getEnd(index).getLocation(); } public void setPorts(Port[] ports) { comp.setPorts(ports); } public void recomputeBounds() { comp.recomputeBounds(); } public void setTextField(Attribute labelAttr, Attribute fontAttr, int x, int y, int halign, int valign) { comp.setTextField(labelAttr, fontAttr, x, y, halign, valign); } public InstanceData getData(CircuitState state) { return (InstanceData) state.getData(comp); } public void setData(CircuitState state, InstanceData data) { state.setData(comp, data); } public void fireInvalidated() { comp.fireInvalidated(); } } logisim-2.7.1/src/com/cburch/logisim/gui/0000755000175000017500000000000011446034546020133 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/logisim/gui/start/0000755000175000017500000000000011535206216021262 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/logisim/gui/start/TtyInterface.java0000644000175000017500000002500711524651232024532 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.start; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.LinkedList; import java.util.Map; import com.cburch.logisim.circuit.Analyze; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.circuit.Propagator; import com.cburch.logisim.comp.Component; import com.cburch.logisim.data.Value; import com.cburch.logisim.file.LoadFailedException; import com.cburch.logisim.file.Loader; import com.cburch.logisim.file.LogisimFile; import com.cburch.logisim.file.FileStatistics; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.proj.Project; import com.cburch.logisim.std.io.Keyboard; import com.cburch.logisim.std.io.Tty; import com.cburch.logisim.std.memory.Ram; import com.cburch.logisim.std.wiring.Pin; import com.cburch.logisim.tools.Library; import com.cburch.logisim.util.StringUtil; public class TtyInterface { public static final int FORMAT_TABLE = 1; public static final int FORMAT_SPEED = 2; public static final int FORMAT_TTY = 4; public static final int FORMAT_HALT = 8; public static final int FORMAT_STATISTICS = 16; private static boolean lastIsNewline = true; public static void sendFromTty(char c) { lastIsNewline = c == '\n'; System.out.print(c); //OK } private static void ensureLineTerminated() { if (!lastIsNewline) { lastIsNewline = true; System.out.print('\n'); //OK } } public static void run(Startup args) { File fileToOpen = args.getFilesToOpen().get(0); Loader loader = new Loader(null); LogisimFile file; try { file = loader.openLogisimFile(fileToOpen, args.getSubstitutions()); } catch (LoadFailedException e) { System.err.println(Strings.get("ttyLoadError", fileToOpen.getName())); //OK System.exit(-1); return; } int format = args.getTtyFormat(); if ((format & FORMAT_STATISTICS) != 0) { format &= ~FORMAT_STATISTICS; displayStatistics(file); } if (format == 0) { // no simulation remaining to perform, so just exit System.exit(0); } Project proj = new Project(file); Circuit circuit = file.getMainCircuit(); Map pinNames = Analyze.getPinLabels(circuit); ArrayList outputPins = new ArrayList(); Instance haltPin = null; for (Map.Entry entry : pinNames.entrySet()) { Instance pin = entry.getKey(); String pinName = entry.getValue(); if (!Pin.FACTORY.isInputPin(pin)) { outputPins.add(pin); if (pinName.equals("halt")) { haltPin = pin; } } } CircuitState circState = new CircuitState(proj, circuit); // we have to do our initial propagation before the simulation starts - // it's necessary to populate the circuit with substates. circState.getPropagator().propagate(); if (args.getLoadFile() != null) { try { boolean loaded = loadRam(circState, args.getLoadFile()); if (!loaded) { System.err.println(Strings.get("loadNoRamError")); //OK System.exit(-1); } } catch (IOException e) { System.err.println(Strings.get("loadIoError") + ": " + e.toString()); //OK System.exit(-1); } } int ttyFormat = args.getTtyFormat(); int simCode = runSimulation(circState, outputPins, haltPin, ttyFormat); System.exit(simCode); } private static void displayStatistics(LogisimFile file) { FileStatistics stats = FileStatistics.compute(file, file.getMainCircuit()); FileStatistics.Count total = stats.getTotalWithSubcircuits(); int maxName = 0; for (FileStatistics.Count count : stats.getCounts()) { int nameLength = count.getFactory().getDisplayName().length(); if (nameLength > maxName) maxName = nameLength; } String fmt = "%" + countDigits(total.getUniqueCount()) + "d\t" + "%" + countDigits(total.getRecursiveCount()) + "d\t"; String fmtNormal = fmt + "%-" + maxName + "s\t%s\n"; for (FileStatistics.Count count : stats.getCounts()) { Library lib = count.getLibrary(); String libName = lib == null ? "-" : lib.getDisplayName(); System.out.printf(fmtNormal, //OK Integer.valueOf(count.getUniqueCount()), Integer.valueOf(count.getRecursiveCount()), count.getFactory().getDisplayName(), libName); } FileStatistics.Count totalWithout = stats.getTotalWithoutSubcircuits(); System.out.printf(fmt + "%s\n", //OK Integer.valueOf(totalWithout.getUniqueCount()), Integer.valueOf(totalWithout.getRecursiveCount()), Strings.get("statsTotalWithout")); System.out.printf(fmt + "%s\n", //OK Integer.valueOf(total.getUniqueCount()), Integer.valueOf(total.getRecursiveCount()), Strings.get("statsTotalWith")); } private static int countDigits(int num) { int digits = 1; int lessThan = 10; while (num >= lessThan) { digits++; lessThan *= 10; } return digits; } private static boolean loadRam(CircuitState circState, File loadFile) throws IOException { if (loadFile == null) return false; boolean found = false; for (Component comp : circState.getCircuit().getNonWires()) { if (comp.getFactory() instanceof Ram) { Ram ramFactory = (Ram) comp.getFactory(); InstanceState ramState = circState.getInstanceState(comp); ramFactory.loadImage(ramState, loadFile); found = true; } } for (CircuitState sub : circState.getSubstates()) { found |= loadRam(sub, loadFile); } return found; } private static boolean prepareForTty(CircuitState circState, ArrayList keybStates) { boolean found = false; for (Component comp : circState.getCircuit().getNonWires()) { Object factory = comp.getFactory(); if (factory instanceof Tty) { Tty ttyFactory = (Tty) factory; InstanceState ttyState = circState.getInstanceState(comp); ttyFactory.sendToStdout(ttyState); found = true; } else if (factory instanceof Keyboard) { keybStates.add(circState.getInstanceState(comp)); found = true; } } for (CircuitState sub : circState.getSubstates()) { found |= prepareForTty(sub, keybStates); } return found; } private static int runSimulation(CircuitState circState, ArrayList outputPins, Instance haltPin, int format) { boolean showTable = (format & FORMAT_TABLE) != 0; boolean showSpeed = (format & FORMAT_SPEED) != 0; boolean showTty = (format & FORMAT_TTY) != 0; boolean showHalt = (format & FORMAT_HALT) != 0; ArrayList keyboardStates = null; StdinThread stdinThread = null; if (showTty) { keyboardStates = new ArrayList(); boolean ttyFound = prepareForTty(circState, keyboardStates); if (!ttyFound) { System.err.println(Strings.get("ttyNoTtyError")); //OK System.exit(-1); } if (keyboardStates.isEmpty()) { keyboardStates = null; } else { stdinThread = new StdinThread(); stdinThread.start(); } } int retCode; long tickCount = 0; long start = System.currentTimeMillis(); boolean halted = false; ArrayList prevOutputs = null; Propagator prop = circState.getPropagator(); while (true) { ArrayList curOutputs = new ArrayList(); for (Instance pin : outputPins) { InstanceState pinState = circState.getInstanceState(pin); Value val = Pin.FACTORY.getValue(pinState); if (pin == haltPin) { halted |= val.equals(Value.TRUE); } else if (showTable) { curOutputs.add(val); } } if (showTable) { displayTableRow(prevOutputs, curOutputs); } if (halted) { retCode = 0; // normal exit break; } if (prop.isOscillating()) { retCode = 1; // abnormal exit break; } if (keyboardStates != null) { char[] buffer = stdinThread.getBuffer(); if (buffer != null) { for (InstanceState keyState : keyboardStates) { Keyboard.addToBuffer(keyState, buffer); } } } prevOutputs = curOutputs; tickCount++; prop.tick(); prop.propagate(); } long elapse = System.currentTimeMillis() - start; if (showTty) ensureLineTerminated(); if (showHalt || retCode != 0) { if (retCode == 0) { System.out.println(Strings.get("ttyHaltReasonPin")); //OK } else if (retCode == 1) { System.out.println(Strings.get("ttyHaltReasonOscillation")); //OK } } if (showSpeed) { displaySpeed(tickCount, elapse); } return retCode; } private static void displayTableRow(ArrayList prevOutputs, ArrayList curOutputs) { boolean shouldPrint = false; if (prevOutputs == null) { shouldPrint = true; } else { for (int i = 0; i < curOutputs.size(); i++) { Value a = prevOutputs.get(i); Value b = curOutputs.get(i); if (!a.equals(b)) { shouldPrint = true; break; } } } if (shouldPrint) { for (int i = 0; i < curOutputs.size(); i++) { if (i != 0) System.out.print("\t"); //OK System.out.print(curOutputs.get(i)); //OK } System.out.println(); //OK } } private static void displaySpeed(long tickCount, long elapse) { double hertz = (double) tickCount / elapse * 1000.0; double precision; if (hertz >= 100) precision = 1.0; else if (hertz >= 10) precision = 0.1; else if (hertz >= 1) precision = 0.01; else if (hertz >= 0.01) precision = 0.0001; else precision = 0.0000001; hertz = (int) (hertz / precision) * precision; String hertzStr = hertz == (int) hertz ? "" + (int) hertz : "" + hertz; System.out.println(StringUtil.format(Strings.get("ttySpeedMsg"), //OK hertzStr, "" + tickCount, "" + elapse)); } // It's possible to avoid using the separate thread using System.in.available(), // but this doesn't quite work because on some systems, the keyboard input // is not interactively echoed until System.in.read() is invoked. private static class StdinThread extends Thread { private LinkedList queue; // of char[] public StdinThread() { queue = new LinkedList(); } public char[] getBuffer() { synchronized (queue) { if (queue.isEmpty()) { return null; } else { return queue.removeFirst(); } } } @Override public void run() { InputStreamReader stdin = new InputStreamReader(System.in); char[] buffer = new char[32]; while (true) { try { int nbytes = stdin.read(buffer); if (nbytes > 0) { char[] add = new char[nbytes]; System.arraycopy(buffer, 0, add, 0, nbytes); synchronized (queue) { queue.addLast(add); } } } catch (IOException e) { } } } } } logisim-2.7.1/src/com/cburch/logisim/gui/start/Strings.java0000644000175000017500000000143411451540100023546 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.start; import java.util.Locale; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.StringGetter; import com.cburch.logisim.util.StringUtil; class Strings { private static LocaleManager source = new LocaleManager("resources/logisim", "start"); public static String get(String key) { return source.get(key); } public static String get(String key, String arg) { return StringUtil.format(source.get(key), arg); } public static StringGetter getter(String key) { return source.getter(key); } public static Locale[] getLocaleOptions() { return source.getLocaleOptions(); } } logisim-2.7.1/src/com/cburch/logisim/gui/start/Startup.java0000644000175000017500000003113111532247712023571 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.start; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.io.File; import javax.swing.UIManager; import com.cburch.logisim.Main; import com.cburch.logisim.file.LoadFailedException; import com.cburch.logisim.file.Loader; import com.cburch.logisim.gui.main.Print; import com.cburch.logisim.gui.menu.LogisimMenuBar; import com.cburch.logisim.gui.menu.WindowManagers; import com.cburch.logisim.gui.start.SplashScreen; import com.cburch.logisim.prefs.AppPreferences; import com.cburch.logisim.proj.Project; import com.cburch.logisim.proj.ProjectActions; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.MacCompatibility; import com.cburch.logisim.util.StringUtil; public class Startup { private static Startup startupTemp = null; static void doOpen(File file) { if (startupTemp != null) startupTemp.doOpenFile(file); } static void doPrint(File file) { if (startupTemp != null) startupTemp.doPrintFile(file); } private void doOpenFile(File file) { if (initialized) { ProjectActions.doOpen(null, null, file); } else { filesToOpen.add(file); } } private void doPrintFile(File file) { if (initialized) { Project toPrint = ProjectActions.doOpen(null, null, file); Print.doPrint(toPrint); toPrint.getFrame().dispose(); } else { filesToPrint.add(file); } } private static void registerHandler() { try { Class needed1 = Class.forName("com.apple.eawt.Application"); if (needed1 == null) return; Class needed2 = Class.forName("com.apple.eawt.ApplicationAdapter"); if (needed2 == null) return; MacOsAdapter.register(); MacOsAdapter.addListeners(true); } catch (ClassNotFoundException e) { return; } catch (Throwable t) { try { MacOsAdapter.addListeners(false); } catch (Throwable t2) { } } } // based on command line boolean isTty; private File templFile = null; private boolean templEmpty = false; private boolean templPlain = false; private ArrayList filesToOpen = new ArrayList(); private boolean showSplash; private File loadFile; private HashMap substitutions = new HashMap(); private int ttyFormat = 0; // from other sources private boolean initialized = false; private SplashScreen monitor = null; private ArrayList filesToPrint = new ArrayList(); private Startup(boolean isTty) { this.isTty = isTty; this.showSplash = !isTty; } List getFilesToOpen() { return filesToOpen; } File getLoadFile() { return loadFile; } int getTtyFormat() { return ttyFormat; } Map getSubstitutions() { return Collections.unmodifiableMap(substitutions); } public void run() { if (isTty) { try { TtyInterface.run(this); return; } catch (Throwable t) { t.printStackTrace(); System.exit(-1); return; } } // kick off the progress monitor // (The values used for progress values are based on a single run where // I loaded a large file.) if (showSplash) { try { monitor = new SplashScreen(); monitor.setVisible(true); } catch (Throwable t) { monitor = null; showSplash = false; } } // pre-load the two basic component libraries, just so that the time // taken is shown separately in the progress bar. if (showSplash) monitor.setProgress(SplashScreen.LIBRARIES); Loader templLoader = new Loader(monitor); int count = templLoader.getBuiltin().getLibrary("Base").getTools().size() + templLoader.getBuiltin().getLibrary("Gates").getTools().size(); if (count < 0) { // this will never happen, but the optimizer doesn't know that... System.err.println("FATAL ERROR - no components"); //OK System.exit(-1); } // load in template loadTemplate(templLoader, templFile, templEmpty); // now that the splash screen is almost gone, we do some last-minute // interface initialization if (showSplash) monitor.setProgress(SplashScreen.GUI_INIT); WindowManagers.initialize(); if (MacCompatibility.isSwingUsingScreenMenuBar()) { MacCompatibility.setFramelessJMenuBar(new LogisimMenuBar(null, null)); } else { new LogisimMenuBar(null, null); // most of the time occupied here will be in loading menus, which // will occur eventually anyway; we might as well do it when the // monitor says we are } // if user has double-clicked a file to open, we'll // use that as the file to open now. initialized = true; // load file if (filesToOpen.isEmpty()) { ProjectActions.doNew(monitor, true); if (showSplash) monitor.close(); } else { boolean first = true; for (File fileToOpen : filesToOpen) { try { ProjectActions.doOpen(monitor, fileToOpen, substitutions); } catch (LoadFailedException ex) { System.err.println(fileToOpen.getName() + ": " + ex.getMessage()); //OK System.exit(-1); } if (first) { first = false; if (showSplash) monitor.close(); monitor = null; } } } for (File fileToPrint : filesToPrint) { doPrintFile(fileToPrint); } } private static void setLocale(String lang) { Locale[] opts = Strings.getLocaleOptions(); for (int i = 0; i < opts.length; i++) { if (lang.equals(opts[i].toString())) { LocaleManager.setLocale(opts[i]); return; } } System.err.println(Strings.get("invalidLocaleError")); //OK System.err.println(Strings.get("invalidLocaleOptionsHeader")); //OK for (int i = 0; i < opts.length; i++) { System.err.println(" " + opts[i].toString()); //OK } System.exit(-1); } private void loadTemplate(Loader loader, File templFile, boolean templEmpty) { if (showSplash) monitor.setProgress(SplashScreen.TEMPLATE_OPEN); if (templFile != null) { AppPreferences.setTemplateFile(templFile); AppPreferences.setTemplateType(AppPreferences.TEMPLATE_CUSTOM); } else if (templEmpty) { AppPreferences.setTemplateType(AppPreferences.TEMPLATE_EMPTY); } else if (templPlain) { AppPreferences.setTemplateType(AppPreferences.TEMPLATE_PLAIN); } } public static Startup parseArgs(String[] args) { // see whether we'll be using any graphics boolean isTty = false; boolean isClearPreferences = false; for (int i = 0; i < args.length; i++) { if (args[i].equals("-tty")) { isTty = true; } else if (args[i].equals("-clearprefs") || args[i].equals("-clearprops")) { isClearPreferences = true; } } if (!isTty) { // we're using the GUI: Set up the Look&Feel to match the platform System.setProperty("com.apple.mrj.application.apple.menu.about.name", "Logisim"); System.setProperty("apple.laf.useScreenMenuBar", "true"); LocaleManager.setReplaceAccents(false); // Initialize graphics acceleration if appropriate AppPreferences.handleGraphicsAcceleration(); } Startup ret = new Startup(isTty); startupTemp = ret; if (!isTty) { registerHandler(); } if (isClearPreferences) { AppPreferences.clear(); } try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception ex) { } // parse arguments for (int i = 0; i < args.length; i++) { String arg = args[i]; if (arg.equals("-tty")) { if (i + 1 < args.length) { i++; String[] fmts = args[i].split(","); if (fmts.length == 0) { System.err.println(Strings.get("ttyFormatError")); //OK } for (int j = 0; j < fmts.length; j++) { String fmt = fmts[j].trim(); if (fmt.equals("table")) { ret.ttyFormat |= TtyInterface.FORMAT_TABLE; } else if (fmt.equals("speed")) { ret.ttyFormat |= TtyInterface.FORMAT_SPEED; } else if (fmt.equals("tty")) { ret.ttyFormat |= TtyInterface.FORMAT_TTY; } else if (fmt.equals("halt")) { ret.ttyFormat |= TtyInterface.FORMAT_HALT; } else if (fmt.equals("stats")) { ret.ttyFormat |= TtyInterface.FORMAT_STATISTICS; } else { System.err.println(Strings.get("ttyFormatError")); //OK } } } else { System.err.println(Strings.get("ttyFormatError")); //OK return null; } } else if (arg.equals("-sub")) { if (i + 2 < args.length) { File a = new File(args[i + 1]); File b = new File(args[i + 2]); if (ret.substitutions.containsKey(a)) { System.err.println(Strings.get("argDuplicateSubstitutionError")); //OK return null; } else { ret.substitutions.put(a, b); i += 2; } } else { System.err.println(Strings.get("argTwoSubstitutionError")); //OK return null; } } else if (arg.equals("-load")) { if (i + 1 < args.length) { i++; if (ret.loadFile != null) { System.err.println(Strings.get("loadMultipleError")); //OK } File f = new File(args[i]); ret.loadFile = f; } else { System.err.println(Strings.get("loadNeedsFileError")); //OK return null; } } else if (arg.equals("-empty")) { if (ret.templFile != null || ret.templEmpty || ret.templPlain) { System.err.println(Strings.get("argOneTemplateError")); //OK return null; } ret.templEmpty = true; } else if (arg.equals("-plain")) { if (ret.templFile != null || ret.templEmpty || ret.templPlain) { System.err.println(Strings.get("argOneTemplateError")); //OK return null; } ret.templPlain = true; } else if (arg.equals("-version")) { System.out.println(Main.VERSION_NAME); //OK return null; } else if (arg.equals("-gates")) { i++; if (i >= args.length) printUsage(); String a = args[i]; if (a.equals("shaped")) { AppPreferences.GATE_SHAPE.set(AppPreferences.SHAPE_SHAPED); } else if (a.equals("rectangular")) { AppPreferences.GATE_SHAPE.set(AppPreferences.SHAPE_RECTANGULAR); } else { System.err.println(Strings.get("argGatesOptionError")); //OK System.exit(-1); } } else if (arg.equals("-locale")) { i++; if (i >= args.length) printUsage(); setLocale(args[i]); } else if (arg.equals("-accents")) { i++; if (i >= args.length) printUsage(); String a = args[i]; if (a.equals("yes")) { AppPreferences.ACCENTS_REPLACE.setBoolean(false); } else if (a.equals("no")) { AppPreferences.ACCENTS_REPLACE.setBoolean(true); } else { System.err.println(Strings.get("argAccentsOptionError")); //OK System.exit(-1); } } else if (arg.equals("-template")) { if (ret.templFile != null || ret.templEmpty || ret.templPlain) { System.err.println(Strings.get("argOneTemplateError")); //OK return null; } i++; if (i >= args.length) printUsage(); ret.templFile = new File(args[i]); if (!ret.templFile.exists()) { System.err.println(StringUtil.format( //OK Strings.get("templateMissingError"), args[i])); } else if (!ret.templFile.canRead()) { System.err.println(StringUtil.format( //OK Strings.get("templateCannotReadError"), args[i])); } } else if (arg.equals("-nosplash")) { ret.showSplash = false; } else if (arg.equals("-clearprefs")) { // already handled above } else if (arg.charAt(0) == '-') { printUsage(); return null; } else { ret.filesToOpen.add(new File(arg)); } } if (ret.isTty && ret.filesToOpen.isEmpty()) { System.err.println(Strings.get("ttyNeedsFileError")); //OK return null; } if (ret.loadFile != null && !ret.isTty) { System.err.println(Strings.get("loadNeedsTtyError")); //OK return null; } return ret; } private static void printUsage() { System.err.println(StringUtil.format(Strings.get("argUsage"), Startup.class.getName())); //OK System.err.println(); //OK System.err.println(Strings.get("argOptionHeader")); //OK System.err.println(" " + Strings.get("argAccentsOption")); //OK System.err.println(" " + Strings.get("argClearOption")); //OK System.err.println(" " + Strings.get("argEmptyOption")); //OK System.err.println(" " + Strings.get("argGatesOption")); //OK System.err.println(" " + Strings.get("argHelpOption")); //OK System.err.println(" " + Strings.get("argLoadOption")); //OK System.err.println(" " + Strings.get("argLocaleOption")); //OK System.err.println(" " + Strings.get("argNoSplashOption")); //OK System.err.println(" " + Strings.get("argPlainOption")); //OK System.err.println(" " + Strings.get("argSubOption")); //OK System.err.println(" " + Strings.get("argTemplateOption")); //OK System.err.println(" " + Strings.get("argTtyOption")); //OK System.err.println(" " + Strings.get("argVersionOption")); //OK System.exit(-1); } } logisim-2.7.1/src/com/cburch/logisim/gui/start/SplashScreen.java0000644000175000017500000001010211446034550024512 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.start; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.JWindow; import javax.swing.SwingUtilities; public class SplashScreen extends JWindow implements ActionListener { public static final int LIBRARIES = 0; public static final int TEMPLATE_CREATE = 1; public static final int TEMPLATE_OPEN = 2; public static final int TEMPLATE_LOAD = 3; public static final int TEMPLATE_CLOSE = 4; public static final int GUI_INIT = 5; public static final int FILE_CREATE = 6; public static final int FILE_LOAD = 7; public static final int PROJECT_CREATE = 8; public static final int FRAME_CREATE = 9; private static final int PROGRESS_MAX = 3568; private static final boolean PRINT_TIMES = false; private static class Marker { int count; String message; Marker(int count, String message) { this.count = count; this.message = message; } } Marker[] markers = new Marker[] { new Marker(377, Strings.get("progressLibraries")), new Marker(990, Strings.get("progressTemplateCreate")), new Marker(1002, Strings.get("progressTemplateOpen")), new Marker(1002, Strings.get("progressTemplateLoad")), new Marker(1470, Strings.get("progressTemplateClose")), new Marker(1478, Strings.get("progressGuiInitialize")), new Marker(2114, Strings.get("progressFileCreate")), new Marker(2114, Strings.get("progressFileLoad")), new Marker(2383, Strings.get("progressProjectCreate")), new Marker(2519, Strings.get("progressFrameCreate")), }; boolean inClose = false; // for avoiding mutual recursion JProgressBar progress = new JProgressBar(0, PROGRESS_MAX); JButton close = new JButton(Strings.get("startupCloseButton")); JButton cancel = new JButton(Strings.get("startupQuitButton")); long startTime = System.currentTimeMillis(); public SplashScreen() { JPanel imagePanel = About.getImagePanel(); imagePanel.setBorder(null); progress.setStringPainted(true); JPanel buttonPanel = new JPanel(); buttonPanel.add(close); close.addActionListener(this); buttonPanel.add(cancel); cancel.addActionListener(this); JPanel contents = new JPanel(new BorderLayout()); contents.add(imagePanel, BorderLayout.NORTH); contents.add(progress, BorderLayout.CENTER); contents.add(buttonPanel, BorderLayout.SOUTH); contents.setBorder(BorderFactory.createLineBorder(Color.BLACK, 2)); Color bg = imagePanel.getBackground(); contents.setBackground(bg); buttonPanel.setBackground(bg); setBackground(bg); setContentPane(contents); } public void setProgress(int markerId) { final Marker marker = markers == null ? null : markers[markerId]; if (marker != null) { SwingUtilities.invokeLater(new Runnable() { public void run() { progress.setString(marker.message); progress.setValue(marker.count); } }); if (PRINT_TIMES) { System.err.println((System.currentTimeMillis() - startTime) //OK + " " + marker.message); } } else { if (PRINT_TIMES) { System.err.println((System.currentTimeMillis() - startTime) + " ??"); //OK } } } @Override public void setVisible(boolean value) { if (value) { pack(); Dimension dim = getToolkit().getScreenSize(); int x = (int) (dim.getWidth() - getWidth()) / 2; int y = (int) (dim.getHeight() - getHeight()) / 2; setLocation(x, y); } super.setVisible(value); } public void close() { if (inClose) return; inClose = true; setVisible(false); inClose = false; if (PRINT_TIMES) { System.err.println((System.currentTimeMillis() - startTime) //OK + " closed"); } markers = null; } public void actionPerformed(ActionEvent e) { Object src = e.getSource(); if (src == cancel) { System.exit(0); } else if (src == close) { close(); } } } logisim-2.7.1/src/com/cburch/logisim/gui/start/MacOsAdapter.java0000644000175000017500000000412711446034550024435 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.start; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; //MAC import java.io.File; import net.roydesign.event.ApplicationEvent; import net.roydesign.mac.MRJAdapter; //MAC import com.apple.eawt.Application; //MAC import com.apple.eawt.ApplicationAdapter; import com.cburch.logisim.gui.prefs.PreferencesFrame; import com.cburch.logisim.proj.ProjectActions; class MacOsAdapter { //MAC extends ApplicationAdapter { private static class MyListener implements ActionListener { public void actionPerformed(ActionEvent event) { ApplicationEvent event2 = (ApplicationEvent) event; int type = event2.getType(); switch (type) { case ApplicationEvent.ABOUT: About.showAboutDialog(null); break; case ApplicationEvent.QUIT_APPLICATION: ProjectActions.doQuit(); break; case ApplicationEvent.OPEN_DOCUMENT: Startup.doOpen(event2.getFile()); break; case ApplicationEvent.PRINT_DOCUMENT: Startup.doPrint(event2.getFile()); break; case ApplicationEvent.PREFERENCES: PreferencesFrame.showPreferences(); break; } } } static void addListeners(boolean added) { MyListener myListener = new MyListener(); if (!added) MRJAdapter.addOpenDocumentListener(myListener); if (!added) MRJAdapter.addPrintDocumentListener(myListener); MRJAdapter.addPreferencesListener(myListener); MRJAdapter.addQuitApplicationListener(myListener); MRJAdapter.addAboutListener(myListener); } /* MAC public void handleOpenFile(com.apple.eawt.ApplicationEvent event) { Startup.doOpen(new File(event.getFilename())); } public void handlePrintFile(com.apple.eawt.ApplicationEvent event) { Startup.doPrint(new File(event.getFilename())); } public void handlePreferences(com.apple.eawt.ApplicationEvent event) { PreferencesFrame.showPreferences(); } */ public static void register() { //MAC Application.getApplication().addApplicationListener(new MacOsAdapter()); } }logisim-2.7.1/src/com/cburch/logisim/gui/start/AboutCredits.java0000644000175000017500000001770011535206216024522 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.start; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.FontMetrics; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Paint; import java.net.URL; import java.util.ArrayList; import javax.swing.JComponent; class AboutCredits extends JComponent { /** Time to spend freezing the credits before after after scrolling */ private static final int MILLIS_FREEZE = 1000; /** Speed of how quickly the scrolling occurs */ private static final int MILLIS_PER_PIXEL = 20; /** Path to Hendrix College's logo - if you want your own logo included, * please add it separately rather than replacing this. */ private static final String HENDRIX_PATH = "resources/logisim/hendrix.png"; private static final int HENDRIX_WIDTH = 50; private static class CreditsLine { private int y; private int type; private String text; private Image img; private int imgWidth; public CreditsLine(int type, String text) { this(type, text, null, 0); } public CreditsLine(int type, String text, Image img, int imgWidth) { this.y = 0; this.type = type; this.text = text; this.img = img; this.imgWidth = imgWidth; } } private Color[] colorBase; private Paint[] paintSteady; private Font[] font; private int scroll; private float fadeStop; private ArrayList lines; private int initialLines; // number of lines to show in initial freeze private int initialHeight; // computed in code based on above private int linesHeight; // computed in code based on above public AboutCredits() { scroll = 0; setOpaque(false); int prefWidth = About.IMAGE_WIDTH + 2 * About.IMAGE_BORDER; int prefHeight = About.IMAGE_HEIGHT / 2 + About.IMAGE_BORDER; setPreferredSize(new Dimension(prefWidth, prefHeight)); fadeStop = (float) (About.IMAGE_HEIGHT / 4.0); colorBase = new Color[] { new Color(143, 0, 0), new Color(48, 0, 96), new Color(48, 0, 96), }; font = new Font[] { new Font("Sans Serif", Font.ITALIC, 20), new Font("Sans Serif", Font.BOLD, 24), new Font("Sans Serif", Font.BOLD, 18), }; paintSteady = new Paint[colorBase.length]; for (int i = 0; i < colorBase.length; i++) { Color hue = colorBase[i]; paintSteady[i] = new GradientPaint(0.0f, 0.0f, derive(hue, 0), 0.0f, fadeStop, hue); } URL url = AboutCredits.class.getClassLoader().getResource(HENDRIX_PATH); Image hendrixLogo = null; if (url != null) { hendrixLogo = getToolkit().createImage(url); } // Logisim's policy concerning who is given credit: // Past contributors are not acknowledged in the About dialog for the current // version, but they do appear in the acknowledgements section of the User's // Guide. Current contributors appear in both locations. lines = new ArrayList(); linesHeight = 0; // computed in paintComponent lines.add(new CreditsLine(1, "www.cburch.com/logisim/")); lines.add(new CreditsLine(0, Strings.get("creditsRoleLead"), hendrixLogo, HENDRIX_WIDTH)); lines.add(new CreditsLine(1, "Carl Burch")); lines.add(new CreditsLine(2, "Hendrix College")); initialLines = lines.size(); lines.add(new CreditsLine(0, Strings.get("creditsRoleGerman"))); lines.add(new CreditsLine(1, "Uwe Zimmerman")); lines.add(new CreditsLine(2, "Uppsala universitet")); lines.add(new CreditsLine(0, Strings.get("creditsRoleGreek"))); lines.add(new CreditsLine(1, "Thanos Kakarountas")); lines.add(new CreditsLine(2, "\u03A4.\u0395.\u0399 \u0399\u03BF\u03BD\u03AF\u03C9\u03BD \u039D\u03AE\u03C3\u03C9\u03BD")); lines.add(new CreditsLine(0, Strings.get("creditsRolePortuguese"))); lines.add(new CreditsLine(1, "Theldo Cruz Franqueira")); lines.add(new CreditsLine(2, "PUC Minas")); lines.add(new CreditsLine(0, Strings.get("creditsRoleRussian"))); lines.add(new CreditsLine(1, "Ilia Lilov")); lines.add(new CreditsLine(2, "\u041C\u043E\u0441\u043A\u043E\u0432\u0441\u043A\u0438\u0439 \u0433\u043E\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0439")); lines.add(new CreditsLine(2, "\u0443\u043D\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442 \u043F\u0435\u0447\u0430\u0442\u0438")); lines.add(new CreditsLine(0, Strings.get("creditsRoleTesting"))); lines.add(new CreditsLine(1, "Ilia Lilov")); lines.add(new CreditsLine(2, "\u041C\u043E\u0441\u043A\u043E\u0432\u0441\u043A\u0438\u0439 \u0433\u043E\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0439")); lines.add(new CreditsLine(2, "\u0443\u043D\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442 \u043F\u0435\u0447\u0430\u0442\u0438")); /* If you fork Logisim, feel free to change the above lines, but * please do not change these last four lines! */ lines.add(new CreditsLine(0, Strings.get("creditsRoleOriginal"), hendrixLogo, HENDRIX_WIDTH)); lines.add(new CreditsLine(1, "Carl Burch")); lines.add(new CreditsLine(2, "Hendrix College")); lines.add(new CreditsLine(1, "www.cburch.com/logisim/")); } public void setScroll(int value) { scroll = value; repaint(); } private Color derive(Color base, int alpha) { return new Color(base.getRed(), base.getGreen(), base.getBlue(), alpha); } @Override protected void paintComponent(Graphics g) { FontMetrics[] fms = new FontMetrics[font.length]; for (int i = 0; i < fms.length; i++) { fms[i] = g.getFontMetrics(font[i]); } if (linesHeight == 0) { int y = 0; int index = -1; for (CreditsLine line : lines) { index++; if (index == initialLines) initialHeight = y; if (line.type == 0) y += 10; FontMetrics fm = fms[line.type]; line.y = y + fm.getAscent(); y += fm.getHeight(); } linesHeight = y; } Paint[] paint = paintSteady; int yPos = 0; int height = getHeight(); int initY = Math.min(0, initialHeight - height + About.IMAGE_BORDER); int maxY = linesHeight - height - initY; int totalMillis = 2 * MILLIS_FREEZE + (linesHeight + height) * MILLIS_PER_PIXEL; int offs = scroll % totalMillis; if (offs >= 0 && offs < MILLIS_FREEZE) { // frozen before starting the credits scroll int a = 255 * (MILLIS_FREEZE - offs) / MILLIS_FREEZE; if (a > 245) { paint = null; } else if (a < 15) { paint = paintSteady; } else { paint = new Paint[colorBase.length]; for (int i = 0; i < paint.length; i++) { Color hue = colorBase[i]; paint[i] = new GradientPaint(0.0f, 0.0f, derive(hue, a), 0.0f, fadeStop, hue); } } yPos = initY; } else if (offs < MILLIS_FREEZE + maxY * MILLIS_PER_PIXEL) { // scrolling through credits yPos = initY + (offs - MILLIS_FREEZE) / MILLIS_PER_PIXEL; } else if (offs < 2 * MILLIS_FREEZE + maxY * MILLIS_PER_PIXEL) { // freezing at bottom of scroll yPos = initY + maxY; } else if (offs < 2 * MILLIS_FREEZE + (linesHeight - initY) * MILLIS_PER_PIXEL) { // scrolling bottom off screen yPos = initY + (offs - 2 * MILLIS_FREEZE) / MILLIS_PER_PIXEL; } else { // scrolling next credits onto screen int millis = offs - 2 * MILLIS_FREEZE - (linesHeight - initY) * MILLIS_PER_PIXEL; paint = null; yPos = -height + millis / MILLIS_PER_PIXEL; } int width = getWidth(); int centerX = width / 2; maxY = getHeight(); for (CreditsLine line : lines) { int y = line.y - yPos; if (y < -100 || y > maxY + 50) continue; int type = line.type; if (paint == null) { g.setColor(colorBase[type]); } else { ((Graphics2D) g).setPaint(paint[type]); } g.setFont(font[type]); int textWidth = fms[type].stringWidth(line.text); g.drawString(line.text, centerX - textWidth / 2, line.y - yPos); Image img = line.img; if (img != null) { int x = width - line.imgWidth - About.IMAGE_BORDER; int top = y - fms[type].getAscent(); g.drawImage(img, x, top, this); } } } }logisim-2.7.1/src/com/cburch/logisim/gui/start/About.java0000644000175000017500000001634511524651426023215 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.start; import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; import javax.swing.BorderFactory; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.event.AncestorEvent; import javax.swing.event.AncestorListener; import com.cburch.logisim.Main; import com.cburch.logisim.data.Value; import com.cburch.logisim.util.GraphicsUtil; public class About { static final int IMAGE_BORDER = 10; static final int IMAGE_WIDTH = 380; static final int IMAGE_HEIGHT = 284; private static class PanelThread extends Thread { private MyPanel panel; private boolean running = true; PanelThread(MyPanel panel) { this.panel = panel; } @Override public void run() { long start = System.currentTimeMillis(); while (running) { long elapse = System.currentTimeMillis() - start; int count = (int) (elapse / 500) % 4; panel.upper = (count == 2 || count == 3) ? Value.TRUE : Value.FALSE; panel.lower = (count == 1 || count == 2) ? Value.TRUE : Value.FALSE; panel.credits.setScroll((int) elapse); panel.repaint(); try { Thread.sleep(20); } catch (InterruptedException ex) { } } } } private static class MyPanel extends JPanel implements AncestorListener { private final Color fadeColor = new Color(255, 255, 255, 128); private final Color headerColor = new Color(143, 0, 0); private final Color gateColor = Color.DARK_GRAY; private final Font headerFont = new Font("Monospaced", Font.BOLD, 72); private final Font versionFont = new Font("Serif", Font.PLAIN | Font.ITALIC, 32); private final Font copyrightFont = new Font("Serif", Font.ITALIC, 18); private Value upper = Value.FALSE; private Value lower = Value.TRUE; private AboutCredits credits; private PanelThread thread = null; public MyPanel() { setLayout(null); int prefWidth = IMAGE_WIDTH + 2 * IMAGE_BORDER; int prefHeight = IMAGE_HEIGHT + 2 * IMAGE_BORDER; setPreferredSize(new Dimension(prefWidth, prefHeight)); setBackground(Color.WHITE); addAncestorListener(this); credits = new AboutCredits(); credits.setBounds(0, prefHeight / 2, prefWidth, prefHeight / 2); add(credits); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); try { int x = IMAGE_BORDER; int y = IMAGE_BORDER; drawCircuit(g, x + 10, y + 55); g.setColor(fadeColor); g.fillRect(x, y, IMAGE_WIDTH, IMAGE_HEIGHT); drawText(g, x, y); } catch (Throwable t) { } } private void drawCircuit(Graphics g, int x0, int y0) { if (g instanceof Graphics2D) { Graphics2D g2 = (Graphics2D) g; g2.setStroke(new BasicStroke(5.0f)); } drawWires(g, x0, y0); g.setColor(gateColor); drawNot(g, x0, y0, 70, 10); drawNot(g, x0, y0, 70, 110); drawAnd(g, x0, y0, 130, 30); drawAnd(g, x0, y0, 130, 90); drawOr(g, x0, y0, 220, 60); } private void drawWires(Graphics g, int x0, int y0) { Value upperNot = upper.not(); Value lowerNot = lower.not(); Value upperAnd = upperNot.and(lower); Value lowerAnd = lowerNot.and(upper); Value out = upperAnd.or(lowerAnd); int x; int y; g.setColor(upper.getColor()); x = toX(x0, 20); y = toY(y0, 10); g.fillOval(x - 7, y - 7, 14, 14); g.drawLine(toX(x0, 0), y, toX(x0, 40), y); g.drawLine(x, y, x, toY(y0, 70)); y = toY(y0, 70); g.drawLine(x, y, toX(x0, 80), y); g.setColor(upperNot.getColor()); y = toY(y0, 10); g.drawLine(toX(x0, 70), y, toX(x0, 80), y); g.setColor(lower.getColor()); x = toX(x0, 30); y = toY(y0, 110); g.fillOval(x - 7, y - 7, 14, 14); g.drawLine(toX(x0, 0), y, toX(x0, 40), y); g.drawLine(x, y, x, toY(y0, 50)); y = toY(y0, 50); g.drawLine(x, y, toX(x0, 80), y); g.setColor(lowerNot.getColor()); y = toY(y0, 110); g.drawLine(toX(x0, 70), y, toX(x0, 80), y); g.setColor(upperAnd.getColor()); x = toX(x0, 150); y = toY(y0, 30); g.drawLine(toX(x0, 130), y, x, y); g.drawLine(x, y, x, toY(y0, 45)); y = toY(y0, 45); g.drawLine(x, y, toX(x0, 174), y); g.setColor(lowerAnd.getColor()); y = toY(y0, 90); g.drawLine(toX(x0, 130), y, x, y); g.drawLine(x, y, x, toY(y0, 75)); y = toY(y0, 75); g.drawLine(x, y, toX(x0, 174), y); g.setColor(out.getColor()); y = toY(y0, 60); g.drawLine(toX(x0, 220), y, toX(x0, 240), y); } private void drawNot(Graphics g, int x0, int y0, int x, int y) { int[] xp = new int[4]; int[] yp = new int[4]; xp[0] = toX(x0, x - 10); yp[0] = toY(y0, y); xp[1] = toX(x0, x - 29); yp[1] = toY(y0, y - 7); xp[2] = xp[1]; yp[2] = toY(y0, y + 7); xp[3] = xp[0]; yp[3] = yp[0]; g.drawPolyline(xp, yp, 4); int diam = toDim(10); g.drawOval(xp[0], yp[0] - diam / 2, diam, diam); } private void drawAnd(Graphics g, int x0, int y0, int x, int y) { int[] xp = new int[4]; int[] yp = new int[4]; xp[0] = toX(x0, x - 25); yp[0] = toY(y0, y - 25); xp[1] = toX(x0, x - 50); yp[1] = yp[0]; xp[2] = xp[1]; yp[2] = toY(y0, y + 25); xp[3] = xp[0]; yp[3] = yp[2]; int diam = toDim(50); g.drawArc(xp[1], yp[1], diam, diam, -90, 180); g.drawPolyline(xp, yp, 4); } private void drawOr(Graphics g, int x0, int y0, int x, int y) { int cx = toX(x0, x - 50); int cd = toDim(62); GraphicsUtil.drawCenteredArc(g, cx, toY(y0, y - 37), cd, -90, 53); GraphicsUtil.drawCenteredArc(g, cx, toY(y0, y + 37), cd, 90, -53); GraphicsUtil.drawCenteredArc(g, toX(x0, x - 93), toY(y0, y), toDim(50), -30, 60); } private static int toX(int x0, int offs) { return x0 + offs * 3 / 2; } private static int toY(int y0, int offs) { return y0 + offs * 3 / 2; } private static int toDim(int offs) { return offs * 3 / 2; } private void drawText(Graphics g, int x, int y) { FontMetrics fm; String str; g.setColor(headerColor); g.setFont(headerFont); g.drawString("Logisim", x, y + 45); g.setFont(copyrightFont); fm = g.getFontMetrics(); str = "\u00a9 " + Main.COPYRIGHT_YEAR; g.drawString(str, x + IMAGE_WIDTH - fm.stringWidth(str), y + 16); g.setFont(versionFont); fm = g.getFontMetrics(); str = "Version " + Main.VERSION_NAME; g.drawString(str, x + IMAGE_WIDTH - fm.stringWidth(str), y + 75); } public void ancestorAdded(AncestorEvent arg0) { if (thread == null) { thread = new PanelThread(this); thread.start(); } } public void ancestorRemoved(AncestorEvent arg0) { if (thread != null) { thread.running = false; } } public void ancestorMoved(AncestorEvent arg0) { } } private About() { } public static MyPanel getImagePanel() { return new MyPanel(); } public static void showAboutDialog(JFrame owner) { MyPanel imgPanel = getImagePanel(); JPanel panel = new JPanel(new BorderLayout()); panel.add(imgPanel); panel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 2)); JOptionPane.showMessageDialog(owner, panel, "Logisim " + Main.VERSION_NAME, JOptionPane.PLAIN_MESSAGE); } }logisim-2.7.1/src/com/cburch/logisim/gui/prefs/0000755000175000017500000000000011532066750021250 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/logisim/gui/prefs/WindowOptions.java0000644000175000017500000000365411532066750024746 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.prefs; import javax.swing.JPanel; import com.cburch.logisim.data.Direction; import com.cburch.logisim.prefs.AppPreferences; import com.cburch.logisim.util.TableLayout; class WindowOptions extends OptionsPanel { private PrefBoolean[] checks; private PrefOptionList toolbarPlacement; public WindowOptions(PreferencesFrame window) { super(window); checks = new PrefBoolean[] { new PrefBoolean(AppPreferences.SHOW_TICK_RATE, Strings.getter("windowTickRate")), }; toolbarPlacement = new PrefOptionList(AppPreferences.TOOLBAR_PLACEMENT, Strings.getter("windowToolbarLocation"), new PrefOption[] { new PrefOption(Direction.NORTH.toString(), Direction.NORTH.getDisplayGetter()), new PrefOption(Direction.SOUTH.toString(), Direction.SOUTH.getDisplayGetter()), new PrefOption(Direction.EAST.toString(), Direction.EAST.getDisplayGetter()), new PrefOption(Direction.WEST.toString(), Direction.WEST.getDisplayGetter()), new PrefOption(AppPreferences.TOOLBAR_DOWN_MIDDLE, Strings.getter("windowToolbarDownMiddle")), new PrefOption(AppPreferences.TOOLBAR_HIDDEN, Strings.getter("windowToolbarHidden")) }); JPanel panel = new JPanel(new TableLayout(2)); panel.add(toolbarPlacement.getJLabel()); panel.add(toolbarPlacement.getJComboBox()); setLayout(new TableLayout(1)); for (int i = 0; i < checks.length; i++) { add(checks[i]); } add(panel); } @Override public String getTitle() { return Strings.get("windowTitle"); } @Override public String getHelpText() { return Strings.get("windowHelp"); } @Override public void localeChanged() { for (int i = 0; i < checks.length; i++) { checks[i].localeChanged(); } toolbarPlacement.localeChanged(); } } logisim-2.7.1/src/com/cburch/logisim/gui/prefs/TemplateOptions.java0000644000175000017500000001442011455470054025243 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.prefs; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JTextField; import com.cburch.logisim.file.Loader; import com.cburch.logisim.file.LoaderException; import com.cburch.logisim.file.LogisimFile; import com.cburch.logisim.prefs.AppPreferences; import com.cburch.logisim.prefs.Template; import com.cburch.logisim.util.JFileChoosers; import com.cburch.logisim.util.StringUtil; class TemplateOptions extends OptionsPanel { private class MyListener implements ActionListener, PropertyChangeListener { public void actionPerformed(ActionEvent event) { Object src = event.getSource(); if (src == templateButton) { JFileChooser chooser = JFileChoosers.create(); chooser.setDialogTitle(Strings.get("selectDialogTitle")); chooser.setApproveButtonText(Strings.get("selectDialogButton")); int action = chooser.showOpenDialog(getPreferencesFrame()); if (action == JFileChooser.APPROVE_OPTION) { File file = chooser.getSelectedFile(); FileInputStream reader = null; InputStream reader2 = null; try { Loader loader = new Loader(getPreferencesFrame()); reader = new FileInputStream(file); Template template = Template.create(reader); reader2 = template.createStream(); LogisimFile.load(reader2, loader); // to see if OK AppPreferences.setTemplateFile(file, template); AppPreferences.setTemplateType(AppPreferences.TEMPLATE_CUSTOM); } catch (LoaderException ex) { } catch (IOException ex) { JOptionPane.showMessageDialog(getPreferencesFrame(), StringUtil.format(Strings.get("templateErrorMessage"), ex.toString()), Strings.get("templateErrorTitle"), JOptionPane.ERROR_MESSAGE); } finally { try { if (reader != null) reader.close(); } catch (IOException ex) { } try { if (reader != null) reader2.close(); } catch (IOException ex) { } } } } else { int value = AppPreferences.TEMPLATE_UNKNOWN; if (plain.isSelected()) value = AppPreferences.TEMPLATE_PLAIN; else if (empty.isSelected()) value = AppPreferences.TEMPLATE_EMPTY; else if (custom.isSelected()) value = AppPreferences.TEMPLATE_CUSTOM; AppPreferences.setTemplateType(value); } computeEnabled(); } public void propertyChange(PropertyChangeEvent event) { String prop = event.getPropertyName(); if (prop.equals(AppPreferences.TEMPLATE_TYPE)) { int value = AppPreferences.getTemplateType(); plain.setSelected(value == AppPreferences.TEMPLATE_PLAIN); empty.setSelected(value == AppPreferences.TEMPLATE_EMPTY); custom.setSelected(value == AppPreferences.TEMPLATE_CUSTOM); } else if (prop.equals(AppPreferences.TEMPLATE_FILE)) { setTemplateField((File) event.getNewValue()); } } private void setTemplateField(File f) { try { templateField.setText(f == null ? "" : f.getCanonicalPath()); } catch (IOException e) { templateField.setText(f.getName()); } computeEnabled(); } private void computeEnabled() { custom.setEnabled(!templateField.getText().equals("")); templateField.setEnabled(custom.isSelected()); } } private MyListener myListener = new MyListener(); private JRadioButton plain = new JRadioButton(); private JRadioButton empty = new JRadioButton(); private JRadioButton custom = new JRadioButton(); private JTextField templateField = new JTextField(40); private JButton templateButton = new JButton(); public TemplateOptions(PreferencesFrame window) { super(window); ButtonGroup bgroup = new ButtonGroup(); bgroup.add(plain); bgroup.add(empty); bgroup.add(custom); plain.addActionListener(myListener); empty.addActionListener(myListener); custom.addActionListener(myListener); templateField.setEditable(false); templateButton.addActionListener(myListener); myListener.computeEnabled(); GridBagLayout gridbag = new GridBagLayout(); GridBagConstraints gbc = new GridBagConstraints(); setLayout(gridbag); gbc.weightx = 1.0; gbc.gridx = 0; gbc.gridy = GridBagConstraints.RELATIVE; gbc.gridwidth = 3; gbc.anchor = GridBagConstraints.LINE_START; gridbag.setConstraints(plain, gbc); add(plain); gridbag.setConstraints(empty, gbc); add(empty); gridbag.setConstraints(custom, gbc); add(custom); gbc.fill = GridBagConstraints.HORIZONTAL; gbc.gridwidth = 1; gbc.gridy = 3; gbc.gridx = GridBagConstraints.RELATIVE; JPanel strut = new JPanel(); strut.setMinimumSize(new Dimension(50, 1)); strut.setPreferredSize(new Dimension(50, 1)); gbc.weightx = 0.0; gridbag.setConstraints(strut, gbc); add(strut); gbc.weightx = 1.0; gridbag.setConstraints(templateField, gbc); add(templateField); gbc.weightx = 0.0; gridbag.setConstraints(templateButton, gbc); add(templateButton); AppPreferences.addPropertyChangeListener(AppPreferences.TEMPLATE_TYPE, myListener); AppPreferences.addPropertyChangeListener(AppPreferences.TEMPLATE_FILE, myListener); switch (AppPreferences.getTemplateType()) { case AppPreferences.TEMPLATE_PLAIN: plain.setSelected(true); break; case AppPreferences.TEMPLATE_EMPTY: empty.setSelected(true); break; case AppPreferences.TEMPLATE_CUSTOM: custom.setSelected(true); break; } myListener.setTemplateField(AppPreferences.getTemplateFile()); } @Override public String getTitle() { return Strings.get("templateTitle"); } @Override public String getHelpText() { return Strings.get("templateHelp"); } @Override public void localeChanged() { plain.setText(Strings.get("templatePlainOption")); empty.setText(Strings.get("templateEmptyOption")); custom.setText(Strings.get("templateCustomOption")); templateButton.setText(Strings.get("templateSelectButton")); } } logisim-2.7.1/src/com/cburch/logisim/gui/prefs/Strings.java0000644000175000017500000000140611451540060023534 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.prefs; import java.util.Locale; import javax.swing.JComponent; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.StringGetter; class Strings { private static LocaleManager source = new LocaleManager("resources/logisim", "prefs"); public static String get(String key) { return source.get(key); } public static StringGetter getter(String key) { return source.getter(key); } public static Locale[] getLocaleOptions() { return source.getLocaleOptions(); } public static JComponent createLocaleSelector() { return source.createLocaleSelector(); } } logisim-2.7.1/src/com/cburch/logisim/gui/prefs/PrefOptionList.java0000644000175000017500000000361211455255500025033 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.prefs; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JPanel; import com.cburch.logisim.prefs.PrefMonitor; import com.cburch.logisim.util.StringGetter; class PrefOptionList implements ActionListener, PropertyChangeListener { private PrefMonitor pref; private StringGetter labelStr; private JLabel label; private JComboBox combo; public PrefOptionList(PrefMonitor pref, StringGetter labelStr, PrefOption[] options) { this.pref = pref; this.labelStr = labelStr; label = new JLabel(labelStr.get() + " "); combo = new JComboBox(); for (PrefOption opt : options) { combo.addItem(opt); } combo.addActionListener(this); pref.addPropertyChangeListener(this); selectOption(pref.get()); } JPanel createJPanel() { JPanel ret = new JPanel(); ret.add(label); ret.add(combo); return ret; } JLabel getJLabel() { return label; } JComboBox getJComboBox() { return combo; } void localeChanged() { label.setText(labelStr.get() + " "); } public void actionPerformed(ActionEvent e) { PrefOption x = (PrefOption) combo.getSelectedItem(); pref.set((String) x.getValue()); } public void propertyChange(PropertyChangeEvent event) { if (pref.isSource(event)) { selectOption(pref.get()); } } private void selectOption(Object value) { for (int i = combo.getItemCount() - 1; i >= 0; i--) { PrefOption opt = (PrefOption) combo.getItemAt(i); if (opt.getValue().equals(value)) { combo.setSelectedItem(opt); return; } } combo.setSelectedItem(combo.getItemAt(0)); } } logisim-2.7.1/src/com/cburch/logisim/gui/prefs/PrefOption.java0000644000175000017500000000154011455255500024175 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.prefs; import javax.swing.JComboBox; import com.cburch.logisim.util.StringGetter; class PrefOption { private Object value; private StringGetter getter; PrefOption(String value, StringGetter getter) { this.value = value; this.getter = getter; } @Override public String toString() { return getter.get(); } public Object getValue() { return value; } static void setSelected(JComboBox combo, Object value) { for (int i = combo.getItemCount() - 1; i >= 0; i--) { PrefOption opt = (PrefOption) combo.getItemAt(i); if (opt.getValue().equals(value)) { combo.setSelectedItem(opt); return; } } combo.setSelectedItem(combo.getItemAt(0)); } } logisim-2.7.1/src/com/cburch/logisim/gui/prefs/PreferencesFrame.java0000644000175000017500000000666011520127220025322 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.prefs; import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowEvent; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTabbedPane; import com.cburch.logisim.gui.generic.LFrame; import com.cburch.logisim.gui.menu.LogisimMenuBar; import com.cburch.logisim.util.LocaleListener; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.WindowMenuItemManager; public class PreferencesFrame extends LFrame { private static WindowMenuManager MENU_MANAGER = null; public static void initializeManager() { MENU_MANAGER = new WindowMenuManager(); } private static class WindowMenuManager extends WindowMenuItemManager implements LocaleListener { private PreferencesFrame window = null; WindowMenuManager() { super(Strings.get("preferencesFrameMenuItem"), true); LocaleManager.addLocaleListener(this); } @Override public JFrame getJFrame(boolean create) { if (create) { if (window == null) { window = new PreferencesFrame(); frameOpened(window); } } return window; } public void localeChanged() { setText(Strings.get("preferencesFrameMenuItem")); } } private class MyListener implements ActionListener, LocaleListener { public void actionPerformed(ActionEvent event) { Object src = event.getSource(); if (src == close) { WindowEvent e = new WindowEvent(PreferencesFrame.this, WindowEvent.WINDOW_CLOSING); PreferencesFrame.this.processWindowEvent(e); } } public void localeChanged() { setTitle(Strings.get("preferencesFrameTitle")); for (int i = 0; i < panels.length; i++) { tabbedPane.setTitleAt(i, panels[i].getTitle()); tabbedPane.setToolTipTextAt(i, panels[i].getToolTipText()); panels[i].localeChanged(); } close.setText(Strings.get("closeButton")); } } private MyListener myListener = new MyListener(); private OptionsPanel[] panels; private JTabbedPane tabbedPane; private JButton close = new JButton(); private PreferencesFrame() { setDefaultCloseOperation(HIDE_ON_CLOSE); setJMenuBar(new LogisimMenuBar(this, null)); panels = new OptionsPanel[] { new TemplateOptions(this), new IntlOptions(this), new WindowOptions(this), new LayoutOptions(this), new ExperimentalOptions(this), }; tabbedPane = new JTabbedPane(); int intlIndex = -1; for (int index = 0; index < panels.length; index++) { OptionsPanel panel = panels[index]; tabbedPane.addTab(panel.getTitle(), null, panel, panel.getToolTipText()); if (panel instanceof IntlOptions) intlIndex = index; } JPanel buttonPanel = new JPanel(); buttonPanel.add(close); close.addActionListener(myListener); Container contents = getContentPane(); tabbedPane.setPreferredSize(new Dimension(450, 300)); contents.add(tabbedPane, BorderLayout.CENTER); contents.add(buttonPanel, BorderLayout.SOUTH); if (intlIndex >= 0) tabbedPane.setSelectedIndex(intlIndex); LocaleManager.addLocaleListener(myListener); myListener.localeChanged(); pack(); } public static void showPreferences() { JFrame frame = MENU_MANAGER.getJFrame(true); frame.setVisible(true); } } logisim-2.7.1/src/com/cburch/logisim/gui/prefs/PrefBoolean.java0000644000175000017500000000222511455255500024305 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.prefs; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.swing.JCheckBox; import com.cburch.logisim.prefs.PrefMonitor; import com.cburch.logisim.util.StringGetter; class PrefBoolean extends JCheckBox implements ActionListener, PropertyChangeListener { private PrefMonitor pref; private StringGetter title; PrefBoolean(PrefMonitor pref, StringGetter title) { super(title.get()); this.pref = pref; this.title = title; addActionListener(this); pref.addPropertyChangeListener(this); setSelected(pref.getBoolean()); } void localeChanged() { setText(title.get()); } public void actionPerformed(ActionEvent e) { pref.setBoolean(this.isSelected()); } public void propertyChange(PropertyChangeEvent event) { if (pref.isSource(event)) { setSelected(pref.getBoolean()); } } } logisim-2.7.1/src/com/cburch/logisim/gui/prefs/OptionsPanel.java0000644000175000017500000000133511446034534024527 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.prefs; import java.awt.LayoutManager; import javax.swing.JPanel; abstract class OptionsPanel extends JPanel{ private PreferencesFrame optionsFrame; public OptionsPanel(PreferencesFrame frame) { super(); this.optionsFrame = frame; } public OptionsPanel(PreferencesFrame frame, LayoutManager manager) { super(manager); this.optionsFrame = frame; } public abstract String getTitle(); public abstract String getHelpText(); public abstract void localeChanged(); PreferencesFrame getPreferencesFrame() { return optionsFrame; } } logisim-2.7.1/src/com/cburch/logisim/gui/prefs/LayoutOptions.java0000644000175000017500000000521611455470174024753 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.prefs; import javax.swing.JPanel; import com.cburch.logisim.circuit.RadixOption; import com.cburch.logisim.prefs.AppPreferences; import com.cburch.logisim.util.TableLayout; class LayoutOptions extends OptionsPanel { private PrefBoolean[] checks; private PrefOptionList afterAdd; private PrefOptionList radix1; private PrefOptionList radix2; public LayoutOptions(PreferencesFrame window) { super(window); checks = new PrefBoolean[] { new PrefBoolean(AppPreferences.PRINTER_VIEW, Strings.getter("layoutPrinterView")), new PrefBoolean(AppPreferences.ATTRIBUTE_HALO, Strings.getter("layoutAttributeHalo")), new PrefBoolean(AppPreferences.COMPONENT_TIPS, Strings.getter("layoutShowTips")), new PrefBoolean(AppPreferences.MOVE_KEEP_CONNECT, Strings.getter("layoutMoveKeepConnect")), new PrefBoolean(AppPreferences.ADD_SHOW_GHOSTS, Strings.getter("layoutAddShowGhosts")), }; for (int i = 0; i < 2; i++) { RadixOption[] opts = RadixOption.OPTIONS; PrefOption[] items = new PrefOption[opts.length]; for (int j = 0; j < RadixOption.OPTIONS.length; j++) { items[j] = new PrefOption(opts[j].getSaveString(), opts[j].getDisplayGetter()); } if (i == 0) { radix1 = new PrefOptionList(AppPreferences.POKE_WIRE_RADIX1, Strings.getter("layoutRadix1"), items); } else { radix2 = new PrefOptionList(AppPreferences.POKE_WIRE_RADIX2, Strings.getter("layoutRadix2"), items); } } afterAdd = new PrefOptionList(AppPreferences.ADD_AFTER, Strings.getter("layoutAddAfter"), new PrefOption[] { new PrefOption(AppPreferences.ADD_AFTER_UNCHANGED, Strings.getter("layoutAddAfterUnchanged")), new PrefOption(AppPreferences.ADD_AFTER_EDIT, Strings.getter("layoutAddAfterEdit")) }); JPanel panel = new JPanel(new TableLayout(2)); panel.add(afterAdd.getJLabel()); panel.add(afterAdd.getJComboBox()); panel.add(radix1.getJLabel()); panel.add(radix1.getJComboBox()); panel.add(radix2.getJLabel()); panel.add(radix2.getJComboBox()); setLayout(new TableLayout(1)); for (int i = 0; i < checks.length; i++) { add(checks[i]); } add(panel); } @Override public String getTitle() { return Strings.get("layoutTitle"); } @Override public String getHelpText() { return Strings.get("layoutHelp"); } @Override public void localeChanged() { for (int i = 0; i < checks.length; i++) { checks[i].localeChanged(); } radix1.localeChanged(); radix2.localeChanged(); } } logisim-2.7.1/src/com/cburch/logisim/gui/prefs/IntlOptions.java0000644000175000017500000000462511455470064024405 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.prefs; import java.awt.Component; import java.awt.Dimension; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import com.cburch.logisim.prefs.AppPreferences; import com.cburch.logisim.util.LocaleManager; class IntlOptions extends OptionsPanel { private static class RestrictedLabel extends JLabel { @Override public Dimension getMaximumSize() { return getPreferredSize(); } } private JLabel localeLabel = new RestrictedLabel(); private JComponent locale; private PrefBoolean replAccents; private PrefOptionList gateShape; public IntlOptions(PreferencesFrame window) { super(window); locale = Strings.createLocaleSelector(); replAccents = new PrefBoolean(AppPreferences.ACCENTS_REPLACE, Strings.getter("intlReplaceAccents")); gateShape = new PrefOptionList(AppPreferences.GATE_SHAPE, Strings.getter("intlGateShape"), new PrefOption[] { new PrefOption(AppPreferences.SHAPE_SHAPED, Strings.getter("shapeShaped")), new PrefOption(AppPreferences.SHAPE_RECTANGULAR, Strings.getter("shapeRectangular")), new PrefOption(AppPreferences.SHAPE_DIN40700, Strings.getter("shapeDIN40700")) }); Box localePanel = new Box(BoxLayout.X_AXIS); localePanel.add(Box.createGlue()); localePanel.add(localeLabel); localeLabel.setMaximumSize(localeLabel.getPreferredSize()); localeLabel.setAlignmentY(Component.TOP_ALIGNMENT); localePanel.add(locale); locale.setAlignmentY(Component.TOP_ALIGNMENT); localePanel.add(Box.createGlue()); JPanel shapePanel = new JPanel(); shapePanel.add(gateShape.getJLabel()); shapePanel.add(gateShape.getJComboBox()); setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); add(Box.createGlue()); add(shapePanel); add(localePanel); add(replAccents); add(Box.createGlue()); } @Override public String getTitle() { return Strings.get("intlTitle"); } @Override public String getHelpText() { return Strings.get("intlHelp"); } @Override public void localeChanged() { gateShape.localeChanged(); localeLabel.setText(Strings.get("intlLocale") + " "); replAccents.localeChanged(); replAccents.setEnabled(LocaleManager.canReplaceAccents()); } } logisim-2.7.1/src/com/cburch/logisim/gui/prefs/ExperimentalOptions.java0000644000175000017500000000346511455470226026135 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.prefs; import java.awt.BorderLayout; import java.awt.Font; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JLabel; import javax.swing.JPanel; import com.cburch.logisim.prefs.AppPreferences; class ExperimentalOptions extends OptionsPanel { private JLabel accelRestart = new JLabel(); private PrefOptionList accel; public ExperimentalOptions(PreferencesFrame window) { super(window); accel = new PrefOptionList(AppPreferences.GRAPHICS_ACCELERATION, Strings.getter("accelLabel"), new PrefOption[] { new PrefOption(AppPreferences.ACCEL_DEFAULT, Strings.getter("accelDefault")), new PrefOption(AppPreferences.ACCEL_NONE, Strings.getter("accelNone")), new PrefOption(AppPreferences.ACCEL_OPENGL, Strings.getter("accelOpenGL")), new PrefOption(AppPreferences.ACCEL_D3D, Strings.getter("accelD3D")), }); JPanel accelPanel = new JPanel(new BorderLayout()); accelPanel.add(accel.getJLabel(), BorderLayout.LINE_START); accelPanel.add(accel.getJComboBox(), BorderLayout.CENTER); accelPanel.add(accelRestart, BorderLayout.PAGE_END); accelRestart.setFont(accelRestart.getFont().deriveFont(Font.ITALIC)); JPanel accelPanel2 = new JPanel(); accelPanel2.add(accelPanel); setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); add(Box.createGlue()); add(accelPanel2); add(Box.createGlue()); } @Override public String getTitle() { return Strings.get("experimentTitle"); } @Override public String getHelpText() { return Strings.get("experimentHelp"); } @Override public void localeChanged() { accel.localeChanged(); accelRestart.setText(Strings.get("accelRestartLabel")); } } logisim-2.7.1/src/com/cburch/logisim/gui/opts/0000755000175000017500000000000011527624254021121 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/logisim/gui/opts/ToolbarOptions.java0000644000175000017500000001235311527624254024746 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.opts; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.ScrollPaneConstants; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import com.cburch.logisim.file.ToolbarData; import com.cburch.logisim.gui.main.ProjectExplorer; import com.cburch.logisim.gui.main.ProjectExplorer.Event; import com.cburch.logisim.tools.AddTool; import com.cburch.logisim.tools.Tool; import com.cburch.logisim.util.TableLayout; class ToolbarOptions extends OptionsPanel { private class Listener implements ProjectExplorer.Listener, ActionListener, ListSelectionListener { public void selectionChanged(Event event) { computeEnabled(); } public void doubleClicked(Event event) { Object target = event.getTarget(); if (target instanceof Tool) doAddTool((Tool) target); } public void moveRequested(Event event, AddTool dragged, AddTool target) { } public void deleteRequested(Event event) { } public JPopupMenu menuRequested(Event event) { return null; } public void actionPerformed(ActionEvent event) { Object src = event.getSource(); if (src == addTool) { doAddTool(explorer.getSelectedTool().cloneTool()); } else if (src == addSeparator) { getOptions().getToolbarData().addSeparator(); } else if (src == moveUp) { doMove(-1); } else if (src == moveDown) { doMove(1); } else if (src == remove) { int index = list.getSelectedIndex(); if (index >= 0) { getProject().doAction(ToolbarActions.removeTool(getOptions().getToolbarData(), index)); list.clearSelection(); } } } public void valueChanged(ListSelectionEvent event) { computeEnabled(); } private void computeEnabled() { int index = list.getSelectedIndex(); addTool.setEnabled(explorer.getSelectedTool() != null); moveUp.setEnabled(index > 0); moveDown.setEnabled(index >= 0 && index < list.getModel().getSize() - 1); remove.setEnabled(index >= 0); } private void doAddTool(Tool tool) { if (tool != null) { getProject().doAction(ToolbarActions.addTool(getOptions().getToolbarData(), tool)); } } private void doMove(int delta) { int oldIndex = list.getSelectedIndex(); int newIndex = oldIndex + delta; ToolbarData data = getOptions().getToolbarData(); if (oldIndex >= 0 && newIndex >= 0 && newIndex < data.size()) { getProject().doAction(ToolbarActions.moveTool(data, oldIndex, newIndex)); list.setSelectedIndex(newIndex); } } } private Listener listener = new Listener(); private ProjectExplorer explorer; private JButton addTool; private JButton addSeparator; private JButton moveUp; private JButton moveDown; private JButton remove; private ToolbarList list; public ToolbarOptions(OptionsFrame window) { super(window); explorer = new ProjectExplorer(getProject()); addTool = new JButton(); addSeparator = new JButton(); moveUp = new JButton(); moveDown = new JButton(); remove = new JButton(); list = new ToolbarList(getOptions().getToolbarData()); TableLayout middleLayout = new TableLayout(1); JPanel middle = new JPanel(middleLayout); middle.add(addTool); middle.add(addSeparator); middle.add(moveUp); middle.add(moveDown); middle.add(remove); middleLayout.setRowWeight(4, 1.0); explorer.setListener(listener); addTool.addActionListener(listener); addSeparator.addActionListener(listener); moveUp.addActionListener(listener); moveDown.addActionListener(listener); remove.addActionListener(listener); list.addListSelectionListener(listener); listener.computeEnabled(); GridBagLayout gridbag = new GridBagLayout(); GridBagConstraints gbc = new GridBagConstraints(); setLayout(gridbag); JScrollPane explorerPane = new JScrollPane(explorer, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); JScrollPane listPane = new JScrollPane(list, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); gbc.fill = GridBagConstraints.BOTH; gbc.weightx = 1.0; gbc.weighty = 1.0; gridbag.setConstraints(explorerPane, gbc); add(explorerPane); gbc.fill = GridBagConstraints.VERTICAL; gbc.anchor = GridBagConstraints.NORTH; gbc.weightx = 0.0; gridbag.setConstraints(middle, gbc); add(middle); gbc.fill = GridBagConstraints.BOTH; gbc.weightx = 1.0; gridbag.setConstraints(listPane, gbc); add(listPane); } @Override public String getTitle() { return Strings.get("toolbarTitle"); } @Override public String getHelpText() { return Strings.get("toolbarHelp"); } @Override public void localeChanged() { addTool.setText(Strings.get("toolbarAddTool")); addSeparator.setText(Strings.get("toolbarAddSeparator")); moveUp.setText(Strings.get("toolbarMoveUp")); moveDown.setText(Strings.get("toolbarMoveDown")); remove.setText(Strings.get("toolbarRemove")); list.localeChanged(); } } logisim-2.7.1/src/com/cburch/logisim/gui/opts/ToolbarList.java0000644000175000017500000000622711455470046024227 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.opts; import java.awt.Component; import java.awt.Graphics; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.swing.AbstractListModel; import javax.swing.DefaultListCellRenderer; import javax.swing.Icon; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.ListSelectionModel; import com.cburch.logisim.comp.ComponentDrawContext; import com.cburch.logisim.data.AttributeEvent; import com.cburch.logisim.data.AttributeListener; import com.cburch.logisim.file.ToolbarData; import com.cburch.logisim.file.ToolbarData.ToolbarListener; import com.cburch.logisim.prefs.AppPreferences; import com.cburch.logisim.tools.Tool; class ToolbarList extends JList { private static class ToolIcon implements Icon { private Tool tool; ToolIcon(Tool tool) { this.tool = tool; } public void paintIcon(Component comp, Graphics g, int x, int y) { Graphics gNew = g.create(); tool.paintIcon(new ComponentDrawContext(comp, null, null, g, gNew), x + 2, y + 2); gNew.dispose(); } public int getIconWidth() { return 20; } public int getIconHeight() { return 20; } } private static class ListRenderer extends DefaultListCellRenderer { @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { Component ret; Icon icon; if (value instanceof Tool) { Tool t = (Tool) value; ret = super.getListCellRendererComponent(list, t.getDisplayName(), index, isSelected, cellHasFocus); icon = new ToolIcon(t); } else if (value == null) { ret = super.getListCellRendererComponent(list, "---", index, isSelected, cellHasFocus); icon = null; } else { ret = super.getListCellRendererComponent(list, value.toString(), index, isSelected, cellHasFocus); icon = null; } if (ret instanceof JLabel) { ((JLabel) ret).setIcon(icon); } return ret; } } private class Model extends AbstractListModel implements ToolbarListener, AttributeListener, PropertyChangeListener { public int getSize() { return base.size(); } public Object getElementAt(int index) { return base.get(index); } public void toolbarChanged() { fireContentsChanged(this, 0, getSize()); } public void attributeListChanged(AttributeEvent e) { } public void attributeValueChanged(AttributeEvent e) { repaint(); } public void propertyChange(PropertyChangeEvent event) { if (AppPreferences.GATE_SHAPE.isSource(event)) { repaint(); } } } private ToolbarData base; private Model model; public ToolbarList(ToolbarData base) { this.base = base; this.model = new Model(); setModel(model); setCellRenderer(new ListRenderer()); setSelectionMode(ListSelectionModel.SINGLE_SELECTION); AppPreferences.GATE_SHAPE.addPropertyChangeListener(model); base.addToolbarListener(model); base.addToolAttributeListener(model); } public void localeChanged() { model.toolbarChanged(); } } logisim-2.7.1/src/com/cburch/logisim/gui/opts/ToolbarActions.java0000644000175000017500000000764111446034544024714 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.opts; import com.cburch.logisim.file.ToolbarData; import com.cburch.logisim.proj.Action; import com.cburch.logisim.proj.Project; import com.cburch.logisim.tools.Tool; class ToolbarActions { private ToolbarActions() { } public static Action addTool(ToolbarData toolbar, Tool tool) { return new AddTool(toolbar, tool); } public static Action removeTool(ToolbarData toolbar, int pos) { return new RemoveTool(toolbar, pos); } public static Action moveTool(ToolbarData toolbar, int src, int dest) { return new MoveTool(toolbar, src, dest); } public static Action addSeparator(ToolbarData toolbar, int pos) { return new AddSeparator(toolbar, pos); } public static Action removeSeparator(ToolbarData toolbar, int pos) { return new RemoveSeparator(toolbar, pos); } private static class AddTool extends Action { ToolbarData toolbar; Tool tool; int pos; AddTool(ToolbarData toolbar, Tool tool) { this.toolbar = toolbar; this.tool = tool; } @Override public String getName() { return Strings.get("toolbarAddAction"); } @Override public void doIt(Project proj) { pos = toolbar.getContents().size(); toolbar.addTool(pos, tool); } @Override public void undo(Project proj) { toolbar.remove(pos); } } private static class RemoveTool extends Action { ToolbarData toolbar; Object removed; int which; RemoveTool(ToolbarData toolbar, int which) { this.toolbar = toolbar; this.which = which; } @Override public String getName() { return Strings.get("toolbarRemoveAction"); } @Override public void doIt(Project proj) { removed = toolbar.remove(which); } @Override public void undo(Project proj) { if (removed instanceof Tool) { toolbar.addTool(which, (Tool) removed); } else if (removed == null) { toolbar.addSeparator(which); } } } private static class MoveTool extends Action { ToolbarData toolbar; int oldpos; int dest; MoveTool(ToolbarData toolbar, int oldpos, int dest) { this.toolbar = toolbar; this.oldpos = oldpos; this.dest = dest; } @Override public String getName() { return Strings.get("toolbarMoveAction"); } @Override public void doIt(Project proj) { toolbar.move(oldpos, dest); } @Override public void undo(Project proj) { toolbar.move(dest, oldpos); } @Override public boolean shouldAppendTo(Action other) { if (other instanceof MoveTool) { MoveTool o = (MoveTool) other; return this.toolbar == o.toolbar && o.dest == this.oldpos; } else { return false; } } @Override public Action append(Action other) { if (other instanceof MoveTool) { MoveTool o = (MoveTool) other; if (this.toolbar == o.toolbar && this.dest == o.oldpos) { // TODO if (this.oldpos == o.dest) return null; return new MoveTool(toolbar, this.oldpos, o.dest); } } return super.append(other); } } private static class AddSeparator extends Action { ToolbarData toolbar; int pos; AddSeparator(ToolbarData toolbar, int pos) { this.toolbar = toolbar; this.pos = pos; } @Override public String getName() { return Strings.get("toolbarInsertSepAction"); } @Override public void doIt(Project proj) { toolbar.addSeparator(pos); } @Override public void undo(Project proj) { toolbar.remove(pos); } } private static class RemoveSeparator extends Action { ToolbarData toolbar; int pos; RemoveSeparator(ToolbarData toolbar, int pos) { this.toolbar = toolbar; this.pos = pos; } @Override public String getName() { return Strings.get("toolbarRemoveSepAction"); } @Override public void doIt(Project proj) { toolbar.remove(pos); } @Override public void undo(Project proj) { toolbar.addSeparator(pos); } } } logisim-2.7.1/src/com/cburch/logisim/gui/opts/Strings.java0000644000175000017500000000103011451540106023374 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.opts; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.StringGetter; class Strings { private static LocaleManager source = new LocaleManager("resources/logisim", "opts"); public static String get(String key) { return source.get(key); } public static StringGetter getter(String key) { return source.getter(key); } } logisim-2.7.1/src/com/cburch/logisim/gui/opts/SimulateOptions.java0000644000175000017500000001074311447117142025122 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.opts; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ComboBoxModel; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JPanel; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeEvent; import com.cburch.logisim.data.AttributeListener; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.file.Options; import com.cburch.logisim.util.TableLayout; class SimulateOptions extends OptionsPanel { private class MyListener implements ActionListener, AttributeListener { public void actionPerformed(ActionEvent event) { Object source = event.getSource(); if (source == simLimit) { Integer opt = (Integer) simLimit.getSelectedItem(); if (opt != null) { AttributeSet attrs = getOptions().getAttributeSet(); getProject().doAction(OptionsActions.setAttribute(attrs, Options.sim_limit_attr, opt)); } } else if (source == simRandomness) { AttributeSet attrs = getOptions().getAttributeSet(); Object val = simRandomness.isSelected() ? Options.sim_rand_dflt : Integer.valueOf(0); getProject().doAction(OptionsActions.setAttribute(attrs, Options.sim_rand_attr, val)); } else if (source == gateUndefined) { ComboOption opt = (ComboOption) gateUndefined.getSelectedItem(); if (opt != null) { AttributeSet attrs = getOptions().getAttributeSet(); getProject().doAction(OptionsActions.setAttribute(attrs, Options.ATTR_GATE_UNDEFINED, opt.getValue())); } } } public void attributeListChanged(AttributeEvent e) { } public void attributeValueChanged(AttributeEvent e) { Attribute attr = e.getAttribute(); Object val = e.getValue(); if (attr == Options.sim_limit_attr) { loadSimLimit((Integer) val); } else if (attr == Options.sim_rand_attr) { loadSimRandomness((Integer) val); } } private void loadSimLimit(Integer val) { int value = val.intValue(); ComboBoxModel model = simLimit.getModel(); for (int i = 0; i < model.getSize(); i++) { Integer opt = (Integer) model.getElementAt(i); if (opt.intValue() == value) { simLimit.setSelectedItem(opt); } } } private void loadGateUndefined(Object val) { ComboOption.setSelected(gateUndefined, val); } private void loadSimRandomness(Integer val) { simRandomness.setSelected(val.intValue() > 0); } } private MyListener myListener = new MyListener(); private JLabel simLimitLabel = new JLabel(); private JComboBox simLimit = new JComboBox(new Integer[] { Integer.valueOf(200), Integer.valueOf(500), Integer.valueOf(1000), Integer.valueOf(2000), Integer.valueOf(5000), Integer.valueOf(10000), Integer.valueOf(20000), Integer.valueOf(50000), }); private JCheckBox simRandomness = new JCheckBox(); private JLabel gateUndefinedLabel = new JLabel(); private JComboBox gateUndefined = new JComboBox(new Object[] { new ComboOption(Options.GATE_UNDEFINED_IGNORE), new ComboOption(Options.GATE_UNDEFINED_ERROR) }); public SimulateOptions(OptionsFrame window) { super(window); JPanel simLimitPanel = new JPanel(); simLimitPanel.add(simLimitLabel); simLimitPanel.add(simLimit); simLimit.addActionListener(myListener); JPanel gateUndefinedPanel = new JPanel(); gateUndefinedPanel.add(gateUndefinedLabel); gateUndefinedPanel.add(gateUndefined); gateUndefined.addActionListener(myListener); simRandomness.addActionListener(myListener); setLayout(new TableLayout(1)); add(simLimitPanel); add(gateUndefinedPanel); add(simRandomness); window.getOptions().getAttributeSet().addAttributeListener(myListener); AttributeSet attrs = getOptions().getAttributeSet(); myListener.loadSimLimit(attrs.getValue(Options.sim_limit_attr)); myListener.loadGateUndefined(attrs.getValue(Options.ATTR_GATE_UNDEFINED)); myListener.loadSimRandomness(attrs.getValue(Options.sim_rand_attr)); } @Override public String getTitle() { return Strings.get("simulateTitle"); } @Override public String getHelpText() { return Strings.get("simulateHelp"); } @Override public void localeChanged() { simLimitLabel.setText(Strings.get("simulateLimit")); gateUndefinedLabel.setText(Strings.get("gateUndefined")); simRandomness.setText(Strings.get("simulateRandomness")); } } logisim-2.7.1/src/com/cburch/logisim/gui/opts/OptionsPanel.java0000644000175000017500000000202511446034544024373 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.opts; import java.awt.LayoutManager; import javax.swing.JPanel; import com.cburch.logisim.file.LogisimFile; import com.cburch.logisim.file.Options; import com.cburch.logisim.proj.Project; abstract class OptionsPanel extends JPanel { private OptionsFrame optionsFrame; public OptionsPanel(OptionsFrame frame) { super(); this.optionsFrame = frame; } public OptionsPanel(OptionsFrame frame, LayoutManager manager) { super(manager); this.optionsFrame = frame; } public abstract String getTitle(); public abstract String getHelpText(); public abstract void localeChanged(); OptionsFrame getOptionsFrame() { return optionsFrame; } Project getProject() { return optionsFrame.getProject(); } LogisimFile getLogisimFile() { return optionsFrame.getLogisimFile(); } Options getOptions() { return optionsFrame.getOptions(); } } logisim-2.7.1/src/com/cburch/logisim/gui/opts/OptionsFrame.java0000644000175000017500000001057411455470236024400 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.opts; import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowEvent; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTabbedPane; import com.cburch.logisim.file.LibraryEvent; import com.cburch.logisim.file.LibraryListener; import com.cburch.logisim.file.LogisimFile; import com.cburch.logisim.file.LogisimFileActions; import com.cburch.logisim.file.Options; import com.cburch.logisim.gui.generic.LFrame; import com.cburch.logisim.gui.menu.LogisimMenuBar; import com.cburch.logisim.proj.Project; import com.cburch.logisim.util.LocaleListener; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.StringUtil; import com.cburch.logisim.util.WindowMenuItemManager; public class OptionsFrame extends LFrame { private class WindowMenuManager extends WindowMenuItemManager implements LocaleListener { WindowMenuManager() { super(Strings.get("optionsFrameMenuItem"), false); } @Override public JFrame getJFrame(boolean create) { return OptionsFrame.this; } public void localeChanged() { String title = project.getLogisimFile().getDisplayName(); setText(StringUtil.format(Strings.get("optionsFrameMenuItem"), title)); } } private class MyListener implements ActionListener, LibraryListener, LocaleListener { public void actionPerformed(ActionEvent event) { Object src = event.getSource(); if (src == revert) { getProject().doAction(LogisimFileActions.revertDefaults()); } else if (src == close) { WindowEvent e = new WindowEvent(OptionsFrame.this, WindowEvent.WINDOW_CLOSING); OptionsFrame.this.processWindowEvent(e); } } public void libraryChanged(LibraryEvent event) { if (event.getAction() == LibraryEvent.SET_NAME) { setTitle(computeTitle(file)); windowManager.localeChanged(); } } public void localeChanged() { setTitle(computeTitle(file)); for (int i = 0; i < panels.length; i++) { tabbedPane.setTitleAt(i, panels[i].getTitle()); tabbedPane.setToolTipTextAt(i, panels[i].getToolTipText()); panels[i].localeChanged(); } revert.setText(Strings.get("revertButton")); close.setText(Strings.get("closeButton")); windowManager.localeChanged(); } } private Project project; private LogisimFile file; private MyListener myListener = new MyListener(); private WindowMenuManager windowManager = new WindowMenuManager(); private OptionsPanel[] panels; private JTabbedPane tabbedPane; private JButton revert = new JButton(); private JButton close = new JButton(); public OptionsFrame(Project project) { this.project = project; this.file = project.getLogisimFile(); file.addLibraryListener(myListener); setDefaultCloseOperation(HIDE_ON_CLOSE); setJMenuBar(new LogisimMenuBar(this, project)); panels = new OptionsPanel[] { new SimulateOptions(this), new ToolbarOptions(this), new MouseOptions(this), }; tabbedPane = new JTabbedPane(); for (int index = 0; index < panels.length; index++) { OptionsPanel panel = panels[index]; tabbedPane.addTab(panel.getTitle(), null, panel, panel.getToolTipText()); } JPanel buttonPanel = new JPanel(); buttonPanel.add(revert); buttonPanel.add(close); revert.addActionListener(myListener); close.addActionListener(myListener); Container contents = getContentPane(); tabbedPane.setPreferredSize(new Dimension(450, 300)); contents.add(tabbedPane, BorderLayout.CENTER); contents.add(buttonPanel, BorderLayout.SOUTH); LocaleManager.addLocaleListener(myListener); myListener.localeChanged(); pack(); } public Project getProject() { return project; } public LogisimFile getLogisimFile() { return file; } public Options getOptions() { return file.getOptions(); } @Override public void setVisible(boolean value) { if (value) { windowManager.frameOpened(this); } super.setVisible(value); } OptionsPanel[] getPrefPanels() { return panels; } private static String computeTitle(LogisimFile file) { String name = file == null ? "???" : file.getName(); return StringUtil.format(Strings.get("optionsFrameTitle"), name); } } logisim-2.7.1/src/com/cburch/logisim/gui/opts/OptionsActions.java0000644000175000017500000000534011446034544024737 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.opts; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.file.MouseMappings; import com.cburch.logisim.proj.Action; import com.cburch.logisim.proj.Project; import com.cburch.logisim.tools.Tool; import com.cburch.logisim.util.StringUtil; class OptionsActions { private OptionsActions() { } public static Action setAttribute(AttributeSet attrs, Attribute attr, Object value) { Object oldValue = attrs.getValue(attr); if (!oldValue.equals(value)) { return new SetAction(attrs, attr, value); } else { return null; } } public static Action setMapping(MouseMappings mm, Integer mods, Tool tool) { return new SetMapping(mm, mods, tool); } public static Action removeMapping(MouseMappings mm, Integer mods) { return new RemoveMapping(mm, mods); } private static class SetAction extends Action { private AttributeSet attrs; private Attribute attr; private Object newval; private Object oldval; SetAction(AttributeSet attrs, Attribute attr, Object value) { @SuppressWarnings("unchecked") Attribute a = (Attribute) attr; this.attrs = attrs; this.attr = a; this.newval = value; } @Override public String getName() { return StringUtil.format(Strings.get("setOptionAction"), attr.getDisplayName()); } @Override public void doIt(Project proj) { oldval = attrs.getValue(attr); attrs.setValue(attr, newval); } @Override public void undo(Project proj) { attrs.setValue(attr, oldval); } } private static class SetMapping extends Action { MouseMappings mm; Integer mods; Tool oldtool; Tool tool; SetMapping(MouseMappings mm, Integer mods, Tool tool) { this.mm = mm; this.mods = mods; this.tool = tool; } @Override public String getName() { return Strings.get("addMouseMappingAction"); } @Override public void doIt(Project proj) { oldtool = mm.getToolFor(mods); mm.setToolFor(mods, tool); } @Override public void undo(Project proj) { mm.setToolFor(mods, oldtool); } } private static class RemoveMapping extends Action { MouseMappings mm; Integer mods; Tool oldtool; RemoveMapping(MouseMappings mm, Integer mods) { this.mm = mm; this.mods = mods; } @Override public String getName() { return Strings.get("removeMouseMappingAction"); } @Override public void doIt(Project proj) { oldtool = mm.getToolFor(mods); mm.setToolFor(mods, null); } @Override public void undo(Project proj) { mm.setToolFor(mods, oldtool); } } } logisim-2.7.1/src/com/cburch/logisim/gui/opts/MouseOptions.java0000644000175000017500000002162411527624246024436 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.opts; import java.awt.Color; import java.awt.Dimension; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.ArrayList; import java.util.Collections; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.ScrollPaneConstants; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.AbstractTableModel; import com.cburch.logisim.file.MouseMappings; import com.cburch.logisim.gui.generic.AttrTable; import com.cburch.logisim.gui.generic.AttrTableModel; import com.cburch.logisim.gui.main.AttrTableToolModel; import com.cburch.logisim.gui.main.ProjectExplorer; import com.cburch.logisim.gui.main.ProjectExplorer.Event; import com.cburch.logisim.proj.Project; import com.cburch.logisim.tools.AddTool; import com.cburch.logisim.tools.Tool; import com.cburch.logisim.util.InputEventUtil; import com.cburch.logisim.util.StringUtil; class MouseOptions extends OptionsPanel { private class AddArea extends JPanel { public AddArea() { setPreferredSize(new Dimension(75, 60)); setMinimumSize(new Dimension(75, 60)); setBorder(BorderFactory.createCompoundBorder( BorderFactory.createEmptyBorder(10, 10, 10, 10), BorderFactory.createEtchedBorder())); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); Dimension sz = getSize(); g.setFont(remove.getFont()); String label1; String label2; if (curTool == null) { g.setColor(Color.GRAY); label1 = Strings.get("mouseMapNone"); label2 = null; } else { g.setColor(Color.BLACK); label1 = Strings.get("mouseMapText"); label2 = StringUtil.format(Strings.get("mouseMapText2"), curTool.getDisplayName()); } FontMetrics fm = g.getFontMetrics(); int x1 = (sz.width - fm.stringWidth(label1)) / 2; if (label2 == null) { int y = Math.max(0, (sz.height - fm.getHeight()) / 2 + fm.getAscent() - 2); g.drawString(label1, x1, y); } else { int x2 = (sz.width - fm.stringWidth(label2)) / 2; int y = Math.max(0, (sz.height - 2 * fm.getHeight()) / 2 + fm.getAscent() - 2); g.drawString(label1, x1, y); y += fm.getHeight(); g.drawString(label2, x2, y); } } } private class MyListener implements ActionListener, MouseListener, ListSelectionListener, MouseMappings.MouseMappingsListener, ProjectExplorer.Listener { // // ActionListener method // public void actionPerformed(ActionEvent e) { Object src = e.getSource(); if (src == remove) { int row = mappings.getSelectedRow(); getProject().doAction(OptionsActions.removeMapping(getOptions().getMouseMappings(), model.getKey(row))); row = Math.min(row, model.getRowCount() - 1); if (row >= 0) setSelectedRow(row); } } // // MouseListener methods // public void mouseClicked(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mousePressed(MouseEvent e) { if (e.getSource() == addArea && curTool != null) { Tool t = curTool.cloneTool(); Integer mods = Integer.valueOf(e.getModifiersEx()); getProject().doAction(OptionsActions.setMapping(getOptions().getMouseMappings(), mods, t)); setSelectedRow(model.getRow(mods)); } } public void mouseReleased(MouseEvent e) { } // // ListSelectionListener method // public void valueChanged(ListSelectionEvent e) { int row = mappings.getSelectedRow(); if (row < 0) { remove.setEnabled(false); attrTable.setAttrTableModel(null); } else { remove.setEnabled(true); Tool tool = model.getTool(row); Project proj = getProject(); AttrTableModel model; if (tool.getAttributeSet() == null) { model = null; } else { model = new AttrTableToolModel(proj, tool); } attrTable.setAttrTableModel(model); } } // // MouseMappingsListener method // public void mouseMappingsChanged() { model.fireTableStructureChanged(); } // // Explorer.Listener methods // public void selectionChanged(Event event) { Object target = event.getTarget(); if (target instanceof Tool) { setCurrentTool((Tool) event.getTarget()); } else { setCurrentTool(null); } } public void doubleClicked(Event event) { } public void moveRequested(Event event, AddTool dragged, AddTool target) { } public void deleteRequested(Event event) { } public JPopupMenu menuRequested(Event event) { return null; } } private class MappingsModel extends AbstractTableModel { ArrayList cur_keys; MappingsModel() { fireTableStructureChanged(); } // AbstractTableModel methods @Override public void fireTableStructureChanged() { cur_keys = new ArrayList(getOptions().getMouseMappings().getMappedModifiers()); Collections.sort(cur_keys); super.fireTableStructureChanged(); } public int getRowCount() { return cur_keys.size(); } public int getColumnCount() { return 2; } public Object getValueAt(int row, int column) { Integer key = cur_keys.get(row); if (column == 0) { return InputEventUtil.toDisplayString(key.intValue()); } else { Tool tool = getOptions().getMouseMappings().getToolFor(key); return tool.getDisplayName(); } } // other methods Integer getKey(int row) { return cur_keys.get(row); } Tool getTool(int row) { if (row < 0 || row >= cur_keys.size()) return null; Integer key = cur_keys.get(row); return getOptions().getMouseMappings().getToolFor(key.intValue()); } int getRow(Integer mods) { int row = Collections.binarySearch(cur_keys, mods); if (row < 0) row = -(row + 1); return row; } } private MyListener listener = new MyListener(); private Tool curTool = null; private MappingsModel model; private ProjectExplorer explorer; private JPanel addArea = new AddArea(); private JTable mappings = new JTable(); private AttrTable attrTable; private JButton remove = new JButton(); public MouseOptions(OptionsFrame window) { super(window, new GridLayout(1, 3)); explorer = new ProjectExplorer(getProject()); explorer.setListener(listener); // Area for adding mappings addArea.addMouseListener(listener); // Area for viewing current mappings model = new MappingsModel(); mappings.setTableHeader(null); mappings.setModel(model); mappings.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); mappings.getSelectionModel().addListSelectionListener(listener); mappings.clearSelection(); JScrollPane mapPane = new JScrollPane(mappings); // Button for removing current mapping JPanel removeArea = new JPanel(); remove.addActionListener(listener); remove.setEnabled(false); removeArea.add(remove); // Area for viewing/changing attributes attrTable = new AttrTable(getOptionsFrame()); GridBagLayout gridbag = new GridBagLayout(); GridBagConstraints gbc = new GridBagConstraints(); setLayout(gridbag); gbc.weightx = 1.0; gbc.weighty = 1.0; gbc.gridheight = 4; gbc.fill = GridBagConstraints.BOTH; JScrollPane explorerPane = new JScrollPane(explorer, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); gridbag.setConstraints(explorerPane, gbc); add(explorerPane); gbc.weightx = 0.0; JPanel gap = new JPanel(); gap.setPreferredSize(new Dimension(10, 10)); gridbag.setConstraints(gap, gbc); add(gap); gbc.weightx = 1.0; gbc.gridheight = 1; gbc.gridx = 2; gbc.gridy = GridBagConstraints.RELATIVE; gbc.weighty = 0.0; gridbag.setConstraints(addArea, gbc); add(addArea); gbc.weighty = 1.0; gridbag.setConstraints(mapPane, gbc); add(mapPane); gbc.weighty = 0.0; gridbag.setConstraints(removeArea, gbc); add(removeArea); gbc.weighty = 1.0; gridbag.setConstraints(attrTable, gbc); add(attrTable); getOptions().getMouseMappings().addMouseMappingsListener(listener); setCurrentTool(null); } @Override public String getTitle() { return Strings.get("mouseTitle"); } @Override public String getHelpText() { return Strings.get("mouseHelp"); } @Override public void localeChanged() { remove.setText(Strings.get("mouseRemoveButton")); addArea.repaint(); } private void setCurrentTool(Tool t) { curTool = t; localeChanged(); } private void setSelectedRow(int row) { if (row < 0) row = 0; if (row >= model.getRowCount()) row = model.getRowCount() - 1; if (row >= 0) { mappings.getSelectionModel().setSelectionInterval(row, row); } } } logisim-2.7.1/src/com/cburch/logisim/gui/opts/ComboOption.java0000644000175000017500000000215211446034544024211 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.opts; import javax.swing.JComboBox; import com.cburch.logisim.data.AttributeOption; import com.cburch.logisim.util.StringGetter; class ComboOption { private Object value; private StringGetter getter; ComboOption(String value, StringGetter getter) { this.value = value; this.getter = getter; } ComboOption(AttributeOption value) { this.value = value; this.getter = null; } @Override public String toString() { if (getter != null) return getter.get(); if (value instanceof AttributeOption) return ((AttributeOption) value).toDisplayString(); return "???"; } public Object getValue() { return value; } static void setSelected(JComboBox combo, Object value) { for (int i = combo.getItemCount() - 1; i >= 0; i--) { ComboOption opt = (ComboOption) combo.getItemAt(i); if (opt.getValue().equals(value)) { combo.setSelectedItem(opt); return; } } combo.setSelectedItem(combo.getItemAt(0)); } } logisim-2.7.1/src/com/cburch/logisim/gui/menu/0000755000175000017500000000000011541271670021074 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/logisim/gui/menu/WindowManagers.java0000644000175000017500000000560311520127062024660 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.menu; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import javax.swing.JFrame; import com.cburch.logisim.analyze.gui.AnalyzerManager; import com.cburch.logisim.file.LibraryEvent; import com.cburch.logisim.file.LibraryListener; import com.cburch.logisim.gui.prefs.PreferencesFrame; import com.cburch.logisim.proj.Project; import com.cburch.logisim.proj.ProjectEvent; import com.cburch.logisim.proj.ProjectListener; import com.cburch.logisim.proj.Projects; import com.cburch.logisim.util.WindowMenuItemManager; public class WindowManagers { private WindowManagers() { } public static void initialize() { if (!initialized) { initialized = true; AnalyzerManager.initialize(); PreferencesFrame.initializeManager(); Projects.addPropertyChangeListener(Projects.projectListProperty, myListener); computeListeners(); } } private static boolean initialized = false; private static MyListener myListener = new MyListener(); private static HashMap projectMap = new LinkedHashMap(); private static class MyListener implements PropertyChangeListener { public void propertyChange(PropertyChangeEvent event) { computeListeners(); } } private static class ProjectManager extends WindowMenuItemManager implements ProjectListener, LibraryListener { private Project proj; ProjectManager(Project proj) { super(proj.getLogisimFile().getName(), false); this.proj = proj; proj.addProjectListener(this); proj.addLibraryListener(this); frameOpened(proj.getFrame()); } @Override public JFrame getJFrame(boolean create) { return proj.getFrame(); } public void projectChanged(ProjectEvent event) { if (event.getAction() == ProjectEvent.ACTION_SET_FILE) { setText(proj.getLogisimFile().getName()); } } public void libraryChanged(LibraryEvent event) { if (event.getAction() == LibraryEvent.SET_NAME) { setText((String) event.getData()); } } } private static void computeListeners() { List nowOpen = Projects.getOpenProjects(); HashSet closed = new HashSet(projectMap.keySet()); closed.removeAll(nowOpen); for (Project proj : closed) { ProjectManager manager = projectMap.get(proj); manager.frameClosed(manager.getJFrame(false)); projectMap.remove(proj); } HashSet opened = new LinkedHashSet(nowOpen); opened.removeAll(projectMap.keySet()); for (Project proj : opened) { ProjectManager manager = new ProjectManager(proj); projectMap.put(proj, manager); } } } logisim-2.7.1/src/com/cburch/logisim/gui/menu/Strings.java0000644000175000017500000000103011451540066023360 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.menu; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.StringGetter; class Strings { private static LocaleManager source = new LocaleManager("resources/logisim", "menu"); public static String get(String key) { return source.get(key); } public static StringGetter getter(String key) { return source.getter(key); } } logisim-2.7.1/src/com/cburch/logisim/gui/menu/SimulateListener.java0000644000175000017500000000060411446034542025227 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.menu; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.circuit.Simulator; public interface SimulateListener { public void stateChangeRequested(Simulator sim, CircuitState state); } logisim-2.7.1/src/com/cburch/logisim/gui/menu/ProjectLibraryActions.java0000644000175000017500000001343011446034542026213 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.menu; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.jar.JarFile; import java.util.jar.Manifest; import javax.swing.JFileChooser; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JScrollPane; import com.cburch.logisim.file.Loader; import com.cburch.logisim.file.LogisimFile; import com.cburch.logisim.file.LogisimFileActions; import com.cburch.logisim.proj.Project; import com.cburch.logisim.tools.Library; public class ProjectLibraryActions { private ProjectLibraryActions() { } private static class BuiltinOption { Library lib; BuiltinOption(Library lib) { this.lib = lib; } @Override public String toString() { return lib.getDisplayName(); } } private static class LibraryJList extends JList { LibraryJList(List libraries) { ArrayList options = new ArrayList(); for (Library lib : libraries) { options.add(new BuiltinOption(lib)); } setListData(options.toArray()); } Library[] getSelectedLibraries() { Object[] selected = getSelectedValues(); if (selected != null && selected.length > 0) { Library[] libs = new Library[selected.length]; for (int i = 0; i < selected.length; i++) { libs[i] = ((BuiltinOption) selected[i]).lib; } return libs; } else { return null; } } } public static void doLoadBuiltinLibrary(Project proj) { LogisimFile file = proj.getLogisimFile(); List baseBuilt = file.getLoader().getBuiltin().getLibraries(); ArrayList builtins = new ArrayList(baseBuilt); builtins.removeAll(file.getLibraries()); if (builtins.isEmpty()) { JOptionPane.showMessageDialog(proj.getFrame(), Strings.get("loadBuiltinNoneError"), Strings.get("loadBuiltinErrorTitle"), JOptionPane.INFORMATION_MESSAGE); return; } LibraryJList list = new LibraryJList(builtins); JScrollPane listPane = new JScrollPane(list); int action = JOptionPane.showConfirmDialog(proj.getFrame(), listPane, Strings.get("loadBuiltinDialogTitle"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); if (action == JOptionPane.OK_OPTION) { Library[] libs = list.getSelectedLibraries(); if (libs != null) proj.doAction(LogisimFileActions.loadLibraries(libs)); } } public static void doLoadLogisimLibrary(Project proj) { Loader loader = proj.getLogisimFile().getLoader(); JFileChooser chooser = loader.createChooser(); chooser.setDialogTitle(Strings.get("loadLogisimDialogTitle")); chooser.setFileFilter(Loader.LOGISIM_FILTER); int check = chooser.showOpenDialog(proj.getFrame()); if (check == JFileChooser.APPROVE_OPTION) { File f = chooser.getSelectedFile(); Library lib = loader.loadLogisimLibrary(f); if (lib != null) { proj.doAction(LogisimFileActions.loadLibrary(lib)); } } } public static void doLoadJarLibrary(Project proj) { Loader loader = proj.getLogisimFile().getLoader(); JFileChooser chooser = loader.createChooser(); chooser.setDialogTitle(Strings.get("loadJarDialogTitle")); chooser.setFileFilter(Loader.JAR_FILTER); int check = chooser.showOpenDialog(proj.getFrame()); if (check == JFileChooser.APPROVE_OPTION) { File f = chooser.getSelectedFile(); String className = null; // try to retrieve the class name from the "Library-Class" // attribute in the manifest. This section of code was contributed // by Christophe Jacquet (Request Tracker #2024431). JarFile jarFile = null; try { jarFile = new JarFile(f); Manifest manifest = jarFile.getManifest(); className = manifest.getMainAttributes().getValue("Library-Class"); } catch (IOException e) { // if opening the JAR file failed, do nothing } finally { if (jarFile != null) { try { jarFile.close(); } catch (IOException e) { } } } // if the class name was not found, go back to the good old dialog if (className == null) { className = JOptionPane.showInputDialog(proj.getFrame(), Strings.get("jarClassNamePrompt"), Strings.get("jarClassNameTitle"), JOptionPane.QUESTION_MESSAGE); // if user canceled selection, abort if (className == null) return; } Library lib = loader.loadJarLibrary(f, className); if (lib != null) { proj.doAction(LogisimFileActions.loadLibrary(lib)); } } } public static void doUnloadLibraries(Project proj) { LogisimFile file = proj.getLogisimFile(); ArrayList canUnload = new ArrayList(); for (Library lib : file.getLibraries()) { String message = file.getUnloadLibraryMessage(lib); if (message == null) canUnload.add(lib); } if (canUnload.isEmpty()) { JOptionPane.showMessageDialog(proj.getFrame(), Strings.get("unloadNoneError"), Strings.get("unloadErrorTitle"), JOptionPane.INFORMATION_MESSAGE); return; } LibraryJList list = new LibraryJList(canUnload); JScrollPane listPane = new JScrollPane(list); int action = JOptionPane.showConfirmDialog(proj.getFrame(), listPane, Strings.get("unloadLibrariesDialogTitle"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); if (action == JOptionPane.OK_OPTION) { Library[] libs = list.getSelectedLibraries(); if (libs != null) proj.doAction(LogisimFileActions.unloadLibraries(libs)); } } public static void doUnloadLibrary(Project proj, Library lib) { String message = proj.getLogisimFile().getUnloadLibraryMessage(lib); if (message != null) { JOptionPane.showMessageDialog(proj.getFrame(), message, Strings.get("unloadErrorTitle"), JOptionPane.ERROR_MESSAGE); } else { proj.doAction(LogisimFileActions.unloadLibrary(lib)); } } } logisim-2.7.1/src/com/cburch/logisim/gui/menu/ProjectCircuitActions.java0000644000175000017500000001634211524651436026222 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.menu; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.WindowEvent; import java.awt.event.WindowFocusListener; import java.util.ArrayList; import java.util.Map; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import com.cburch.logisim.analyze.gui.Analyzer; import com.cburch.logisim.analyze.gui.AnalyzerManager; import com.cburch.logisim.analyze.model.AnalyzerModel; import com.cburch.logisim.circuit.Analyze; import com.cburch.logisim.circuit.AnalyzeException; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.file.LogisimFileActions; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.proj.Project; import com.cburch.logisim.std.wiring.Pin; import com.cburch.logisim.tools.AddTool; import com.cburch.logisim.tools.Library; import com.cburch.logisim.util.StringUtil; public class ProjectCircuitActions { private ProjectCircuitActions() { } public static void doAddCircuit(Project proj) { String name = promptForCircuitName(proj.getFrame(), proj.getLogisimFile(), ""); if (name != null) { Circuit circuit = new Circuit(name); proj.doAction(LogisimFileActions.addCircuit(circuit)); proj.setCurrentCircuit(circuit); } } private static String promptForCircuitName(JFrame frame, Library lib, String initialValue) { JLabel label = new JLabel(Strings.get("circuitNamePrompt")); final JTextField field = new JTextField(15); field.setText(initialValue); JLabel error = new JLabel(" "); GridBagLayout gb = new GridBagLayout(); GridBagConstraints gc = new GridBagConstraints(); JPanel strut = new JPanel(null); strut.setPreferredSize(new Dimension(3 * field.getPreferredSize().width / 2, 0)); JPanel panel = new JPanel(gb); gc.gridx = 0; gc.gridy = GridBagConstraints.RELATIVE; gc.weightx = 1.0; gc.fill = GridBagConstraints.NONE; gc.anchor = GridBagConstraints.LINE_START; gb.setConstraints(label, gc); panel.add(label); gb.setConstraints(field, gc); panel.add(field); gb.setConstraints(error, gc); panel.add(error); gb.setConstraints(strut, gc); panel.add(strut); JOptionPane pane = new JOptionPane(panel, JOptionPane.QUESTION_MESSAGE, JOptionPane.OK_CANCEL_OPTION); pane.setInitialValue(field); JDialog dlog = pane.createDialog(frame, Strings.get("circuitNameDialogTitle")); dlog.addWindowFocusListener(new WindowFocusListener() { public void windowGainedFocus(WindowEvent arg0) { field.requestFocus(); } public void windowLostFocus(WindowEvent arg0) { } }); while (true) { field.selectAll(); dlog.pack(); dlog.setVisible(true); field.requestFocusInWindow(); Object action = pane.getValue(); if (action == null || !(action instanceof Integer) || ((Integer) action).intValue() != JOptionPane.OK_OPTION) { return null; } String name = field.getText().trim(); if (name.equals("")) { error.setText(Strings.get("circuitNameMissingError")); } else { if (lib.getTool(name) == null) { return name; } else { error.setText(Strings.get("circuitNameDuplicateError")); } } } } public static void doMoveCircuit(Project proj, Circuit cur, int delta) { AddTool tool = proj.getLogisimFile().getAddTool(cur); if (tool != null) { int oldPos = proj.getLogisimFile().getCircuits().indexOf(cur); int newPos = oldPos + delta; int toolsCount = proj.getLogisimFile().getTools().size(); if (newPos >= 0 && newPos < toolsCount) { proj.doAction(LogisimFileActions.moveCircuit(tool, newPos)); } } } public static void doSetAsMainCircuit(Project proj, Circuit circuit) { proj.doAction(LogisimFileActions.setMainCircuit(circuit)); } public static void doRemoveCircuit(Project proj, Circuit circuit) { if (proj.getLogisimFile().getTools().size() == 1) { JOptionPane.showMessageDialog(proj.getFrame(), Strings.get("circuitRemoveLastError"), Strings.get("circuitRemoveErrorTitle"), JOptionPane.ERROR_MESSAGE); } else if (!proj.getDependencies().canRemove(circuit)) { JOptionPane.showMessageDialog(proj.getFrame(), Strings.get("circuitRemoveUsedError"), Strings.get("circuitRemoveErrorTitle"), JOptionPane.ERROR_MESSAGE); } else { proj.doAction(LogisimFileActions.removeCircuit(circuit)); } } public static void doAnalyze(Project proj, Circuit circuit) { Map pinNames = Analyze.getPinLabels(circuit); ArrayList inputNames = new ArrayList(); ArrayList outputNames = new ArrayList(); for (Map.Entry entry : pinNames.entrySet()) { Instance pin = entry.getKey(); boolean isInput = Pin.FACTORY.isInputPin(pin); if (isInput) { inputNames.add(entry.getValue()); } else { outputNames.add(entry.getValue()); } if (pin.getAttributeValue(StdAttr.WIDTH).getWidth() > 1) { if (isInput) { analyzeError(proj, Strings.get("analyzeMultibitInputError")); } else { analyzeError(proj, Strings.get("analyzeMultibitOutputError")); } return; } } if (inputNames.size() > AnalyzerModel.MAX_INPUTS) { analyzeError(proj, StringUtil.format(Strings.get("analyzeTooManyInputsError"), "" + AnalyzerModel.MAX_INPUTS)); return; } if (outputNames.size() > AnalyzerModel.MAX_OUTPUTS) { analyzeError(proj, StringUtil.format(Strings.get("analyzeTooManyOutputsError"), "" + AnalyzerModel.MAX_OUTPUTS)); return; } Analyzer analyzer = AnalyzerManager.getAnalyzer(); analyzer.getModel().setCurrentCircuit(proj, circuit); configureAnalyzer(proj, circuit, analyzer, pinNames, inputNames, outputNames); analyzer.setVisible(true); analyzer.toFront(); } private static void configureAnalyzer(Project proj, Circuit circuit, Analyzer analyzer, Map pinNames, ArrayList inputNames, ArrayList outputNames) { analyzer.getModel().setVariables(inputNames, outputNames); // If there are no inputs, we stop with that tab selected if (inputNames.size() == 0) { analyzer.setSelectedTab(Analyzer.INPUTS_TAB); return; } // If there are no outputs, we stop with that tab selected if (outputNames.size() == 0) { analyzer.setSelectedTab(Analyzer.OUTPUTS_TAB); return; } // Attempt to show the corresponding expression try { Analyze.computeExpression(analyzer.getModel(), circuit, pinNames); analyzer.setSelectedTab(Analyzer.EXPRESSION_TAB); return; } catch (AnalyzeException ex) { JOptionPane.showMessageDialog(proj.getFrame(), ex.getMessage(), Strings.get("analyzeNoExpressionTitle"), JOptionPane.INFORMATION_MESSAGE); } // As a backup measure, we compute a truth table. Analyze.computeTable(analyzer.getModel(), proj, circuit, pinNames); analyzer.setSelectedTab(Analyzer.TABLE_TAB); } private static void analyzeError(Project proj, String message) { JOptionPane.showMessageDialog(proj.getFrame(), message, Strings.get("analyzeErrorTitle"), JOptionPane.ERROR_MESSAGE); return; } } logisim-2.7.1/src/com/cburch/logisim/gui/menu/Popups.java0000644000175000017500000001330011532066770023225 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.menu; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import javax.swing.SwingUtilities; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.file.LoadedLibrary; import com.cburch.logisim.file.Loader; import com.cburch.logisim.file.LogisimFile; import com.cburch.logisim.gui.main.Frame; import com.cburch.logisim.gui.main.StatisticsDialog; import com.cburch.logisim.proj.Project; import com.cburch.logisim.tools.AddTool; import com.cburch.logisim.tools.Library; import com.cburch.logisim.tools.Tool; public class Popups { private static class ProjectPopup extends JPopupMenu implements ActionListener { Project proj; JMenuItem add = new JMenuItem(Strings.get("projectAddCircuitItem")); JMenu load = new JMenu(Strings.get("projectLoadLibraryItem")); JMenuItem loadBuiltin = new JMenuItem(Strings.get("projectLoadBuiltinItem")); JMenuItem loadLogisim = new JMenuItem(Strings.get("projectLoadLogisimItem")); JMenuItem loadJar = new JMenuItem(Strings.get("projectLoadJarItem")); ProjectPopup(Project proj) { super(Strings.get("projMenu")); this.proj = proj; load.add(loadBuiltin); loadBuiltin.addActionListener(this); load.add(loadLogisim); loadLogisim.addActionListener(this); load.add(loadJar); loadJar.addActionListener(this); add(add); add.addActionListener(this); add(load); } public void actionPerformed(ActionEvent e) { Object src = e.getSource(); if (src == add) { ProjectCircuitActions.doAddCircuit(proj); } else if (src == loadBuiltin) { ProjectLibraryActions.doLoadBuiltinLibrary(proj); } else if (src == loadLogisim) { ProjectLibraryActions.doLoadLogisimLibrary(proj); } else if (src == loadJar) { ProjectLibraryActions.doLoadJarLibrary(proj); } } } private static class LibraryPopup extends JPopupMenu implements ActionListener { Project proj; Library lib; JMenuItem unload = new JMenuItem(Strings.get("projectUnloadLibraryItem")); JMenuItem reload = new JMenuItem(Strings.get("projectReloadLibraryItem")); LibraryPopup(Project proj, Library lib, boolean is_top) { super(Strings.get("libMenu")); this.proj = proj; this.lib = lib; add(unload); unload.addActionListener(this); add(reload); reload.addActionListener(this); unload.setEnabled(is_top); reload.setEnabled(is_top && lib instanceof LoadedLibrary); } public void actionPerformed(ActionEvent e) { Object src = e.getSource(); if (src == unload) { ProjectLibraryActions.doUnloadLibrary(proj, lib); } else if (src == reload) { Loader loader = proj.getLogisimFile().getLoader(); loader.reload((LoadedLibrary) lib); } } } private static class CircuitPopup extends JPopupMenu implements ActionListener { Project proj; Tool tool; Circuit circuit; JMenuItem analyze = new JMenuItem(Strings.get("projectAnalyzeCircuitItem")); JMenuItem stats = new JMenuItem(Strings.get("projectGetCircuitStatisticsItem")); JMenuItem main = new JMenuItem(Strings.get("projectSetAsMainItem")); JMenuItem remove = new JMenuItem(Strings.get("projectRemoveCircuitItem")); JMenuItem editLayout = new JMenuItem(Strings.get("projectEditCircuitLayoutItem")); JMenuItem editAppearance = new JMenuItem(Strings.get("projectEditCircuitAppearanceItem")); CircuitPopup(Project proj, Tool tool, Circuit circuit) { super(Strings.get("circuitMenu")); this.proj = proj; this.tool = tool; this.circuit = circuit; add(editLayout); editLayout.addActionListener(this); add(editAppearance); editAppearance.addActionListener(this); add(analyze); analyze.addActionListener(this); add(stats); stats.addActionListener(this); addSeparator(); add(main); main.addActionListener(this); add(remove); remove.addActionListener(this); boolean canChange = proj.getLogisimFile().contains(circuit); LogisimFile file = proj.getLogisimFile(); if (circuit == proj.getCurrentCircuit()) { if (proj.getFrame().getEditorView().equals(Frame.EDIT_APPEARANCE)) { editAppearance.setEnabled(false); } else { editLayout.setEnabled(false); } } main.setEnabled(canChange && file.getMainCircuit() != circuit); remove.setEnabled(canChange && file.getCircuitCount() > 1 && proj.getDependencies().canRemove(circuit)); } public void actionPerformed(ActionEvent e) { Object source = e.getSource(); if (source == editLayout) { proj.setCurrentCircuit(circuit); proj.getFrame().setEditorView(Frame.EDIT_LAYOUT); } else if (source == editAppearance) { proj.setCurrentCircuit(circuit); proj.getFrame().setEditorView(Frame.EDIT_APPEARANCE); } else if (source == analyze) { ProjectCircuitActions.doAnalyze(proj, circuit); } else if (source == stats) { JFrame frame = (JFrame) SwingUtilities.getRoot(this); StatisticsDialog.show(frame, proj.getLogisimFile(), circuit); } else if (source == main) { ProjectCircuitActions.doSetAsMainCircuit(proj, circuit); } else if (source == remove) { ProjectCircuitActions.doRemoveCircuit(proj, circuit); } } } public static JPopupMenu forCircuit(Project proj, AddTool tool, Circuit circ) { return new CircuitPopup(proj, tool, circ); } public static JPopupMenu forTool(Project proj, Tool tool) { return null; } public static JPopupMenu forProject(Project proj) { return new ProjectPopup(proj); } public static JPopupMenu forLibrary(Project proj, Library lib, boolean isTop) { return new LibraryPopup(proj, lib, isTop); } } logisim-2.7.1/src/com/cburch/logisim/gui/menu/OpenRecent.java0000644000175000017500000000566611455470162024017 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.menu; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.swing.JMenu; import javax.swing.JMenuItem; import com.cburch.logisim.prefs.AppPreferences; import com.cburch.logisim.proj.Project; import com.cburch.logisim.proj.ProjectActions; class OpenRecent extends JMenu implements PropertyChangeListener { private static final int MAX_ITEM_LENGTH = 50; private class RecentItem extends JMenuItem implements ActionListener { private File file; RecentItem(File file) { super(getFileText(file)); this.file = file; setEnabled(file != null); addActionListener(this); } public void actionPerformed(ActionEvent event) { Project proj = menubar.getProject(); Component par = proj == null ? null : proj.getFrame().getCanvas(); ProjectActions.doOpen(par, proj, file); } } private LogisimMenuBar menubar; private List recentItems; OpenRecent(LogisimMenuBar menubar) { this.menubar = menubar; this.recentItems = new ArrayList(); AppPreferences.addPropertyChangeListener(AppPreferences.RECENT_PROJECTS, this); renewItems(); } private void renewItems() { for (int index = recentItems.size() - 1; index >= 0; index--) { RecentItem item = recentItems.get(index); remove(item); } recentItems.clear(); List files = AppPreferences.getRecentFiles(); if (files.isEmpty()) { recentItems.add(new RecentItem(null)); } else { for (File file : files) { recentItems.add(new RecentItem(file)); } } for (RecentItem item : recentItems) { add(item); } } private static String getFileText(File file) { if (file == null) { return Strings.get("fileOpenRecentNoChoices"); } else { String ret; try { ret = file.getCanonicalPath(); } catch (IOException e) { ret = file.toString(); } if (ret.length() <= MAX_ITEM_LENGTH) { return ret; } else { ret = ret.substring(ret.length() - MAX_ITEM_LENGTH + 3); int splitLoc = ret.indexOf(File.separatorChar); if (splitLoc >= 0) { ret = ret.substring(splitLoc); } return "..." + ret; } } } void localeChanged() { setText(Strings.get("fileOpenRecentItem")); for (RecentItem item : recentItems) { if (item.file == null) { item.setText(Strings.get("fileOpenRecentNoChoices")); } } } public void propertyChange(PropertyChangeEvent event) { if (event.getPropertyName().equals(AppPreferences.RECENT_PROJECTS)) { renewItems(); } } } logisim-2.7.1/src/com/cburch/logisim/gui/menu/MenuSimulate.java0000644000175000017500000002616111532066770024360 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.menu; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JRadioButtonMenuItem; import javax.swing.ButtonGroup; import javax.swing.KeyStroke; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.CircuitEvent; import com.cburch.logisim.circuit.CircuitListener; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.circuit.Simulator; import com.cburch.logisim.circuit.SimulatorEvent; import com.cburch.logisim.circuit.SimulatorListener; import com.cburch.logisim.gui.log.LogFrame; import com.cburch.logisim.proj.Project; import com.cburch.logisim.util.StringUtil; import java.util.ArrayList; class MenuSimulate extends Menu { private class TickFrequencyChoice extends JRadioButtonMenuItem implements ActionListener { private double freq; public TickFrequencyChoice(double value) { freq = value; addActionListener(this); } public void actionPerformed(ActionEvent e) { if (currentSim != null) currentSim.setTickFrequency(freq); } public void localeChanged() { double f = freq; if (f < 1000) { String hzStr; if (Math.abs(f - Math.round(f)) < 0.0001) { hzStr = "" + (int) Math.round(f); } else { hzStr = "" + f; } setText(StringUtil.format(Strings.get("simulateTickFreqItem"), hzStr)); } else { String kHzStr; double kf = Math.round(f / 100) / 10.0; if (kf == Math.round(kf)) { kHzStr = "" + (int) kf; } else { kHzStr = "" + kf; } setText(StringUtil.format(Strings.get("simulateTickKFreqItem"), kHzStr)); } } } private class CircuitStateMenuItem extends JMenuItem implements CircuitListener, ActionListener { private CircuitState circuitState; public CircuitStateMenuItem(CircuitState circuitState) { this.circuitState = circuitState; Circuit circuit = circuitState.getCircuit(); circuit.addCircuitListener(this); this.setText(circuit.getName()); addActionListener(this); } void unregister() { Circuit circuit = circuitState.getCircuit(); circuit.removeCircuitListener(this); } public void circuitChanged(CircuitEvent event) { if (event.getAction() == CircuitEvent.ACTION_SET_NAME) { this.setText(circuitState.getCircuit().getName()); } } public void actionPerformed(ActionEvent e) { menubar.fireStateChanged(currentSim, circuitState); } } private class MyListener implements ActionListener, SimulatorListener, ChangeListener { public void actionPerformed(ActionEvent e) { Object src = e.getSource(); Project proj = menubar.getProject(); Simulator sim = proj == null ? null : proj.getSimulator(); if (src == run || src == LogisimMenuBar.SIMULATE_ENABLE) { if (sim != null) { sim.setIsRunning(!sim.isRunning()); proj.repaintCanvas(); } } else if (src == reset) { if (sim != null) sim.requestReset(); } else if (src == step || src == LogisimMenuBar.SIMULATE_STEP) { if (sim != null) sim.step(); } else if (src == tickOnce || src == LogisimMenuBar.TICK_STEP) { if (sim != null) sim.tick(); } else if (src == ticksEnabled || src == LogisimMenuBar.TICK_ENABLE) { if (sim != null) sim.setIsTicking(!sim.isTicking()); } else if (src == log) { LogFrame frame = menubar.getProject().getLogFrame(true); frame.setVisible(true); } } public void propagationCompleted(SimulatorEvent e) { } public void tickCompleted(SimulatorEvent e) { } public void simulatorStateChanged(SimulatorEvent e) { Simulator sim = e.getSource(); if (sim != currentSim) return; computeEnabled(); run.setSelected(sim.isRunning()); ticksEnabled.setSelected(sim.isTicking()); double freq = sim.getTickFrequency(); for (int i = 0; i < tickFreqs.length; i++) { TickFrequencyChoice item = tickFreqs[i]; item.setSelected(freq == item.freq); } } public void stateChanged(ChangeEvent e) { step.setEnabled(run.isEnabled() && !run.isSelected()); } } private LogisimMenuBar menubar; private MyListener myListener = new MyListener(); private CircuitState currentState = null; private CircuitState bottomState = null; private Simulator currentSim = null; private MenuItemCheckImpl run; private JMenuItem reset = new JMenuItem(); private MenuItemImpl step; private MenuItemCheckImpl ticksEnabled; private MenuItemImpl tickOnce; private JMenu tickFreq = new JMenu(); private TickFrequencyChoice[] tickFreqs = { new TickFrequencyChoice(4096), new TickFrequencyChoice(2048), new TickFrequencyChoice(1024), new TickFrequencyChoice(512), new TickFrequencyChoice(256), new TickFrequencyChoice(128), new TickFrequencyChoice(64), new TickFrequencyChoice(32), new TickFrequencyChoice(16), new TickFrequencyChoice(8), new TickFrequencyChoice(4), new TickFrequencyChoice(2), new TickFrequencyChoice(1), new TickFrequencyChoice(0.5), new TickFrequencyChoice(0.25), }; private JMenu downStateMenu = new JMenu(); private ArrayList downStateItems = new ArrayList(); private JMenu upStateMenu = new JMenu(); private ArrayList upStateItems = new ArrayList(); private JMenuItem log = new JMenuItem(); public MenuSimulate(LogisimMenuBar menubar) { this.menubar = menubar; run = new MenuItemCheckImpl(this, LogisimMenuBar.SIMULATE_ENABLE); step = new MenuItemImpl(this, LogisimMenuBar.SIMULATE_STEP); ticksEnabled = new MenuItemCheckImpl(this, LogisimMenuBar.TICK_ENABLE); tickOnce = new MenuItemImpl(this, LogisimMenuBar.TICK_STEP); menubar.registerItem(LogisimMenuBar.SIMULATE_ENABLE, run); menubar.registerItem(LogisimMenuBar.SIMULATE_STEP, step); menubar.registerItem(LogisimMenuBar.TICK_ENABLE, ticksEnabled); menubar.registerItem(LogisimMenuBar.TICK_STEP, tickOnce); int menuMask = getToolkit().getMenuShortcutKeyMask(); run.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_E, menuMask)); reset.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_R, menuMask)); step.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_I, menuMask)); tickOnce.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_T, menuMask)); ticksEnabled.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_K, menuMask)); ButtonGroup bgroup = new ButtonGroup(); for (int i = 0; i < tickFreqs.length; i++) { bgroup.add(tickFreqs[i]); tickFreq.add(tickFreqs[i]); } add(run); add(reset); add(step); addSeparator(); add(upStateMenu); add(downStateMenu); addSeparator(); add(tickOnce); add(ticksEnabled); add(tickFreq); addSeparator(); add(log); setEnabled(false); run.setEnabled(false); reset.setEnabled(false); step.setEnabled(false); upStateMenu.setEnabled(false); downStateMenu.setEnabled(false); tickOnce.setEnabled(false); ticksEnabled.setEnabled(false); tickFreq.setEnabled(false); run.addChangeListener(myListener); menubar.addActionListener(LogisimMenuBar.SIMULATE_ENABLE, myListener); menubar.addActionListener(LogisimMenuBar.SIMULATE_STEP, myListener); menubar.addActionListener(LogisimMenuBar.TICK_ENABLE, myListener); menubar.addActionListener(LogisimMenuBar.TICK_STEP, myListener); // run.addActionListener(myListener); reset.addActionListener(myListener); // step.addActionListener(myListener); // tickOnce.addActionListener(myListener); // ticksEnabled.addActionListener(myListener); log.addActionListener(myListener); computeEnabled(); } public void localeChanged() { this.setText(Strings.get("simulateMenu")); run.setText(Strings.get("simulateRunItem")); reset.setText(Strings.get("simulateResetItem")); step.setText(Strings.get("simulateStepItem")); tickOnce.setText(Strings.get("simulateTickOnceItem")); ticksEnabled.setText(Strings.get("simulateTickItem")); tickFreq.setText(Strings.get("simulateTickFreqMenu")); for (int i = 0; i < tickFreqs.length; i++) { tickFreqs[i].localeChanged(); } downStateMenu.setText(Strings.get("simulateDownStateMenu")); upStateMenu.setText(Strings.get("simulateUpStateMenu")); log.setText(Strings.get("simulateLogItem")); } public void setCurrentState(Simulator sim, CircuitState value) { if (currentState == value) return; Simulator oldSim = currentSim; CircuitState oldState = currentState; currentSim = sim; currentState = value; if (bottomState == null) { bottomState = currentState; } else if (currentState == null) { bottomState = null; } else { CircuitState cur = bottomState; while (cur != null && cur != currentState) { cur = cur.getParentState(); } if (cur == null) bottomState = currentState; } boolean oldPresent = oldState != null; boolean present = currentState != null; if (oldPresent != present) { computeEnabled(); } if (currentSim != oldSim) { double freq = currentSim == null ? 1.0 : currentSim.getTickFrequency(); for (int i = 0; i < tickFreqs.length; i++) { tickFreqs[i].setSelected(Math.abs(tickFreqs[i].freq - freq) < 0.001); } if (oldSim != null) oldSim.removeSimulatorListener(myListener); if (currentSim != null) currentSim.addSimulatorListener(myListener); myListener.simulatorStateChanged(new SimulatorEvent(sim)); } clearItems(downStateItems); CircuitState cur = bottomState; while (cur != null && cur != currentState) { downStateItems.add(new CircuitStateMenuItem(cur)); cur = cur.getParentState(); } if (cur != null) cur = cur.getParentState(); clearItems(upStateItems); while (cur != null) { upStateItems.add(0, new CircuitStateMenuItem(cur)); cur = cur.getParentState(); } recreateStateMenus(); } private void clearItems(ArrayList items) { for (CircuitStateMenuItem item : items) { item.unregister(); } items.clear(); } private void recreateStateMenus() { recreateStateMenu(downStateMenu, downStateItems, KeyEvent.VK_RIGHT); recreateStateMenu(upStateMenu, upStateItems, KeyEvent.VK_LEFT); } private void recreateStateMenu(JMenu menu, ArrayList items, int code) { menu.removeAll(); menu.setEnabled(items.size() > 0); boolean first = true; int mask = getToolkit().getMenuShortcutKeyMask(); for (int i = items.size() - 1; i >= 0; i--) { JMenuItem item = items.get(i); menu.add(item); if (first) { item.setAccelerator(KeyStroke.getKeyStroke(code, mask)); first = false; } else { item.setAccelerator(null); } } } @Override void computeEnabled() { boolean present = currentState != null; Simulator sim = this.currentSim; boolean simRunning = sim != null && sim.isRunning(); setEnabled(present); run.setEnabled(present); reset.setEnabled(present); step.setEnabled(present && !simRunning); upStateMenu.setEnabled(present); downStateMenu.setEnabled(present); tickOnce.setEnabled(present); ticksEnabled.setEnabled(present && simRunning); tickFreq.setEnabled(present); menubar.fireEnableChanged(); } } logisim-2.7.1/src/com/cburch/logisim/gui/menu/MenuProject.java0000644000175000017500000001350411532066770024200 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.menu; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuItem; import com.cburch.logisim.proj.Project; class MenuProject extends Menu { private class MyListener implements ActionListener { public void actionPerformed(ActionEvent event) { Object src = event.getSource(); Project proj = menubar.getProject(); if (src == loadBuiltin) { ProjectLibraryActions.doLoadBuiltinLibrary(proj); } else if (src == loadLogisim) { ProjectLibraryActions.doLoadLogisimLibrary(proj); } else if (src == loadJar) { ProjectLibraryActions.doLoadJarLibrary(proj); } else if (src == unload) { ProjectLibraryActions.doUnloadLibraries(proj); } else if (src == options) { JFrame frame = proj.getOptionsFrame(true); frame.setVisible(true); } } } private LogisimMenuBar menubar; private MyListener myListener = new MyListener(); private MenuItemImpl addCircuit = new MenuItemImpl(this, LogisimMenuBar.ADD_CIRCUIT); private JMenu loadLibrary = new JMenu(); private JMenuItem loadBuiltin = new JMenuItem(); private JMenuItem loadLogisim = new JMenuItem(); private JMenuItem loadJar = new JMenuItem(); private JMenuItem unload = new JMenuItem(); private MenuItemImpl moveUp = new MenuItemImpl(this, LogisimMenuBar.MOVE_CIRCUIT_UP); private MenuItemImpl moveDown = new MenuItemImpl(this, LogisimMenuBar.MOVE_CIRCUIT_DOWN); private MenuItemImpl remove = new MenuItemImpl(this, LogisimMenuBar.REMOVE_CIRCUIT); private MenuItemImpl setAsMain = new MenuItemImpl(this, LogisimMenuBar.SET_MAIN_CIRCUIT); private MenuItemImpl revertAppearance = new MenuItemImpl(this, LogisimMenuBar.REVERT_APPEARANCE); private MenuItemImpl layout = new MenuItemImpl(this, LogisimMenuBar.EDIT_LAYOUT); private MenuItemImpl appearance = new MenuItemImpl(this, LogisimMenuBar.EDIT_APPEARANCE); private MenuItemImpl viewToolbox = new MenuItemImpl(this, LogisimMenuBar.VIEW_TOOLBOX); private MenuItemImpl viewSimulation = new MenuItemImpl(this, LogisimMenuBar.VIEW_SIMULATION); private MenuItemImpl analyze = new MenuItemImpl(this, LogisimMenuBar.ANALYZE_CIRCUIT); private MenuItemImpl stats = new MenuItemImpl(this, LogisimMenuBar.CIRCUIT_STATS); private JMenuItem options = new JMenuItem(); MenuProject(LogisimMenuBar menubar) { this.menubar = menubar; menubar.registerItem(LogisimMenuBar.ADD_CIRCUIT, addCircuit); loadBuiltin.addActionListener(myListener); loadLogisim.addActionListener(myListener); loadJar.addActionListener(myListener); unload.addActionListener(myListener); menubar.registerItem(LogisimMenuBar.MOVE_CIRCUIT_UP, moveUp); menubar.registerItem(LogisimMenuBar.MOVE_CIRCUIT_DOWN, moveDown); menubar.registerItem(LogisimMenuBar.SET_MAIN_CIRCUIT, setAsMain); menubar.registerItem(LogisimMenuBar.REMOVE_CIRCUIT, remove); menubar.registerItem(LogisimMenuBar.REVERT_APPEARANCE, revertAppearance); menubar.registerItem(LogisimMenuBar.EDIT_LAYOUT, layout); menubar.registerItem(LogisimMenuBar.EDIT_APPEARANCE, appearance); menubar.registerItem(LogisimMenuBar.VIEW_TOOLBOX, viewToolbox); menubar.registerItem(LogisimMenuBar.VIEW_SIMULATION, viewSimulation); menubar.registerItem(LogisimMenuBar.ANALYZE_CIRCUIT, analyze); menubar.registerItem(LogisimMenuBar.CIRCUIT_STATS, stats); options.addActionListener(myListener); loadLibrary.add(loadBuiltin); loadLibrary.add(loadLogisim); loadLibrary.add(loadJar); add(addCircuit); add(loadLibrary); add(unload); addSeparator(); add(moveUp); add(moveDown); add(setAsMain); add(remove); add(revertAppearance); addSeparator(); add(viewToolbox); add(viewSimulation); add(layout); add(appearance); addSeparator(); add(analyze); add(stats); addSeparator(); add(options); boolean known = menubar.getProject() != null; loadLibrary.setEnabled(known); loadBuiltin.setEnabled(known); loadLogisim.setEnabled(known); loadJar.setEnabled(known); unload.setEnabled(known); options.setEnabled(known); computeEnabled(); } public void localeChanged() { setText(Strings.get("projectMenu")); addCircuit.setText(Strings.get("projectAddCircuitItem")); loadLibrary.setText(Strings.get("projectLoadLibraryItem")); loadBuiltin.setText(Strings.get("projectLoadBuiltinItem")); loadLogisim.setText(Strings.get("projectLoadLogisimItem")); loadJar.setText(Strings.get("projectLoadJarItem")); unload.setText(Strings.get("projectUnloadLibrariesItem")); moveUp.setText(Strings.get("projectMoveCircuitUpItem")); moveDown.setText(Strings.get("projectMoveCircuitDownItem")); setAsMain.setText(Strings.get("projectSetAsMainItem")); remove.setText(Strings.get("projectRemoveCircuitItem")); revertAppearance.setText(Strings.get("projectRevertAppearanceItem")); layout.setText(Strings.get("projectEditCircuitLayoutItem")); appearance.setText(Strings.get("projectEditCircuitAppearanceItem")); viewToolbox.setText(Strings.get("projectViewToolboxItem")); viewSimulation.setText(Strings.get("projectViewSimulationItem")); analyze.setText(Strings.get("projectAnalyzeCircuitItem")); stats.setText(Strings.get("projectGetCircuitStatisticsItem")); options.setText(Strings.get("projectOptionsItem")); } @Override void computeEnabled() { setEnabled(menubar.getProject() != null || addCircuit.hasListeners() || moveUp.hasListeners() || moveDown.hasListeners() || setAsMain.hasListeners() || remove.hasListeners() || layout.hasListeners() || revertAppearance.hasListeners() || appearance.hasListeners() || viewToolbox.hasListeners() || viewSimulation.hasListeners() || analyze.hasListeners() || stats.hasListeners()); menubar.fireEnableChanged(); } } logisim-2.7.1/src/com/cburch/logisim/gui/menu/MenuItemImpl.java0000644000175000017500000000203611532066770024310 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.menu; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JMenuItem; class MenuItemImpl extends JMenuItem implements MenuItem { private MenuItemHelper helper; public MenuItemImpl(Menu menu, LogisimMenuItem menuItem) { helper = new MenuItemHelper(this, menu, menuItem); super.addActionListener(helper); setEnabled(true); } public boolean hasListeners() { return helper.hasListeners(); } @Override public void addActionListener(ActionListener l) { helper.addActionListener(l); } @Override public void removeActionListener(ActionListener l) { helper.removeActionListener(l); } @Override public void setEnabled(boolean value) { helper.setEnabled(value); super.setEnabled(value && helper.hasListeners()); } public void actionPerformed(ActionEvent event) { helper.actionPerformed(event); } } logisim-2.7.1/src/com/cburch/logisim/gui/menu/MenuItemHelper.java0000644000175000017500000000317411532066770024632 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.menu; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import javax.swing.JMenuItem; class MenuItemHelper implements ActionListener { private JMenuItem source; private LogisimMenuItem menuItem; private Menu menu; private boolean enabled; private boolean inActionListener; private ArrayList listeners; public MenuItemHelper(JMenuItem source, Menu menu, LogisimMenuItem menuItem) { this.source = source; this.menu = menu; this.menuItem = menuItem; this.enabled = true; this.inActionListener = false; this.listeners = new ArrayList(); } public boolean hasListeners() { return !listeners.isEmpty(); } public void addActionListener(ActionListener l) { listeners.add(l); computeEnabled(); } public void removeActionListener(ActionListener l) { listeners.remove(l); computeEnabled(); } public void setEnabled(boolean value) { if (!inActionListener) { enabled = value; } } private void computeEnabled() { inActionListener = true; try { source.setEnabled(enabled); menu.computeEnabled(); } finally { inActionListener = false; } } public void actionPerformed(ActionEvent event) { if (!listeners.isEmpty()) { ActionEvent e = new ActionEvent(menuItem, event.getID(), event.getActionCommand(), event.getWhen(), event.getModifiers()); for (ActionListener l : listeners) { l.actionPerformed(e); } } } } logisim-2.7.1/src/com/cburch/logisim/gui/menu/MenuItemCheckImpl.java0000644000175000017500000000207011532066770025244 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.menu; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JCheckBoxMenuItem; class MenuItemCheckImpl extends JCheckBoxMenuItem implements MenuItem { private MenuItemHelper helper; public MenuItemCheckImpl(Menu menu, LogisimMenuItem menuItem) { helper = new MenuItemHelper(this, menu, menuItem); super.addActionListener(helper); setEnabled(true); } public boolean hasListeners() { return helper.hasListeners(); } @Override public void addActionListener(ActionListener l) { helper.addActionListener(l); } @Override public void removeActionListener(ActionListener l) { helper.removeActionListener(l); } @Override public void setEnabled(boolean value) { helper.setEnabled(value); super.setEnabled(value && helper.hasListeners()); } public void actionPerformed(ActionEvent event) { helper.actionPerformed(event); } } logisim-2.7.1/src/com/cburch/logisim/gui/menu/MenuItem.java0000644000175000017500000000102311532066770023461 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.menu; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; interface MenuItem { boolean hasListeners(); public void addActionListener(ActionListener l); public void removeActionListener(ActionListener l); public boolean isEnabled(); public void setEnabled(boolean value); public void actionPerformed(ActionEvent event); } logisim-2.7.1/src/com/cburch/logisim/gui/menu/MenuHelp.java0000644000175000017500000000730711500267104023453 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.menu; import com.cburch.logisim.gui.generic.LFrame; import com.cburch.logisim.gui.start.About; import com.cburch.logisim.util.MacCompatibility; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.net.URL; import java.util.Locale; import javax.help.HelpSet; import javax.help.JHelp; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JOptionPane; class MenuHelp extends JMenu implements ActionListener { private LogisimMenuBar menubar; private JMenuItem tutorial = new JMenuItem(); private JMenuItem guide = new JMenuItem(); private JMenuItem library = new JMenuItem(); private JMenuItem about = new JMenuItem(); private HelpSet helpSet; private String helpSetUrl = ""; private JHelp helpComponent; private LFrame helpFrame; public MenuHelp(LogisimMenuBar menubar) { this.menubar = menubar; tutorial.addActionListener(this); guide.addActionListener(this); library.addActionListener(this); about.addActionListener(this); add(tutorial); add(guide); add(library); if (!MacCompatibility.isAboutAutomaticallyPresent()) { addSeparator(); add(about); } } public void localeChanged() { this.setText(Strings.get("helpMenu")); if (helpFrame != null) { helpFrame.setTitle(Strings.get("helpWindowTitle")); } tutorial.setText(Strings.get("helpTutorialItem")); guide.setText(Strings.get("helpGuideItem")); library.setText(Strings.get("helpLibraryItem")); about.setText(Strings.get("helpAboutItem")); if (helpFrame != null) { helpFrame.setLocale(Locale.getDefault()); loadBroker(); } } public void actionPerformed(ActionEvent e) { Object src = e.getSource(); if (src == guide) { showHelp("guide"); } else if (src == tutorial) { showHelp("tutorial"); } else if (src == library) { showHelp("libs"); } else if (src == about) { About.showAboutDialog(menubar.getParentWindow()); } } private void loadBroker() { String helpUrl = Strings.get("helpsetUrl"); if (helpUrl == null) helpUrl = "doc/doc_en.hs"; if (helpSet == null || helpFrame == null || !helpUrl.equals(helpSetUrl)) { ClassLoader loader = MenuHelp.class.getClassLoader(); try { URL hsURL = HelpSet.findHelpSet(loader, helpUrl); if (hsURL == null) { disableHelp(); JOptionPane.showMessageDialog(menubar.getParentWindow(), Strings.get("helpNotFoundError")); return; } helpSetUrl = helpUrl; helpSet = new HelpSet(null, hsURL); helpComponent = new JHelp(helpSet); if (helpFrame == null) { helpFrame = new LFrame(); helpFrame.setTitle(Strings.get("helpWindowTitle")); helpFrame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); helpFrame.getContentPane().add(helpComponent); helpFrame.pack(); } else { helpFrame.getContentPane().removeAll(); helpFrame.getContentPane().add(helpComponent); helpComponent.revalidate(); } } catch (Exception e) { disableHelp(); e.printStackTrace(); JOptionPane.showMessageDialog(menubar.getParentWindow(), Strings.get("helpUnavailableError")); return; } } } private void showHelp(String target) { loadBroker(); try { helpComponent.setCurrentID(target); helpFrame.toFront(); helpFrame.setVisible(true); } catch (Exception e) { disableHelp(); e.printStackTrace(); JOptionPane.showMessageDialog(menubar.getParentWindow(), Strings.get("helpDisplayError")); } } private void disableHelp() { guide.setEnabled(false); tutorial.setEnabled(false); library.setEnabled(false); } } logisim-2.7.1/src/com/cburch/logisim/gui/menu/MenuFile.java0000644000175000017500000001023311532066770023445 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.menu; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import javax.swing.JMenuItem; import javax.swing.KeyStroke; import com.cburch.logisim.gui.main.Frame; import com.cburch.logisim.gui.opts.OptionsFrame; import com.cburch.logisim.gui.prefs.PreferencesFrame; import com.cburch.logisim.proj.Project; import com.cburch.logisim.proj.ProjectActions; import com.cburch.logisim.util.MacCompatibility; class MenuFile extends Menu implements ActionListener { private LogisimMenuBar menubar; private JMenuItem newi = new JMenuItem(); private JMenuItem open = new JMenuItem(); private OpenRecent openRecent; private JMenuItem close = new JMenuItem(); private JMenuItem save = new JMenuItem(); private JMenuItem saveAs = new JMenuItem(); private MenuItemImpl print = new MenuItemImpl(this, LogisimMenuBar.PRINT); private MenuItemImpl exportImage = new MenuItemImpl(this, LogisimMenuBar.EXPORT_IMAGE); private JMenuItem prefs = new JMenuItem(); private JMenuItem quit = new JMenuItem(); public MenuFile(LogisimMenuBar menubar) { this.menubar = menubar; openRecent = new OpenRecent(menubar); int menuMask = getToolkit().getMenuShortcutKeyMask(); newi.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_N, menuMask)); open.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_O, menuMask)); close.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_W, menuMask | InputEvent.SHIFT_MASK)); save.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_S, menuMask)); saveAs.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_S, menuMask | InputEvent.SHIFT_MASK)); print.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_P, menuMask)); quit.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_Q, menuMask)); add(newi); add(open); add(openRecent); addSeparator(); add(close); add(save); add(saveAs); addSeparator(); add(exportImage); add(print); if (!MacCompatibility.isPreferencesAutomaticallyPresent()) { addSeparator(); add(prefs); } if (!MacCompatibility.isQuitAutomaticallyPresent()) { addSeparator(); add(quit); } Project proj = menubar.getProject(); newi.addActionListener(this); open.addActionListener(this); if (proj == null) { close.setEnabled(false); save.setEnabled(false); saveAs.setEnabled(false); } else { close.addActionListener(this); save.addActionListener(this); saveAs.addActionListener(this); } menubar.registerItem(LogisimMenuBar.EXPORT_IMAGE, exportImage); menubar.registerItem(LogisimMenuBar.PRINT, print); prefs.addActionListener(this); quit.addActionListener(this); } public void localeChanged() { this.setText(Strings.get("fileMenu")); newi.setText(Strings.get("fileNewItem")); open.setText(Strings.get("fileOpenItem")); openRecent.localeChanged(); close.setText(Strings.get("fileCloseItem")); save.setText(Strings.get("fileSaveItem")); saveAs.setText(Strings.get("fileSaveAsItem")); exportImage.setText(Strings.get("fileExportImageItem")); print.setText(Strings.get("filePrintItem")); prefs.setText(Strings.get("filePreferencesItem")); quit.setText(Strings.get("fileQuitItem")); } @Override void computeEnabled() { setEnabled(true); menubar.fireEnableChanged(); } public void actionPerformed(ActionEvent e) { Object src = e.getSource(); Project proj = menubar.getProject(); if (src == newi) { ProjectActions.doNew(proj); } else if (src == open) { ProjectActions.doOpen(proj == null ? null : proj.getFrame().getCanvas(), proj); } else if (src == close) { Frame frame = proj.getFrame(); if (frame.confirmClose()) { frame.dispose(); OptionsFrame f = proj.getOptionsFrame(false); if (f != null) f.dispose(); } } else if (src == save) { ProjectActions.doSave(proj); } else if (src == saveAs) { ProjectActions.doSaveAs(proj); } else if (src == prefs) { PreferencesFrame.showPreferences(); } else if (src == quit) { ProjectActions.doQuit(); } } } logisim-2.7.1/src/com/cburch/logisim/gui/menu/MenuEdit.java0000644000175000017500000001305311532066770023456 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.menu; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import javax.swing.JMenuItem; import javax.swing.KeyStroke; import com.cburch.logisim.proj.Action; import com.cburch.logisim.proj.Project; import com.cburch.logisim.proj.ProjectEvent; import com.cburch.logisim.proj.ProjectListener; import com.cburch.logisim.util.StringUtil; class MenuEdit extends Menu { private class MyListener implements ProjectListener, ActionListener { public void projectChanged(ProjectEvent e) { Project proj = menubar.getProject(); Action last = proj == null ? null : proj.getLastAction(); if (last == null) { undo.setText(Strings.get("editCantUndoItem")); undo.setEnabled(false); } else { undo.setText(StringUtil.format(Strings.get("editUndoItem"), last.getName())); undo.setEnabled(true); } } public void actionPerformed(ActionEvent e) { Object src = e.getSource(); Project proj = menubar.getProject(); if (src == undo) { if (proj != null) proj.undoAction(); } } } private LogisimMenuBar menubar; private JMenuItem undo = new JMenuItem(); private MenuItemImpl cut = new MenuItemImpl(this, LogisimMenuBar.CUT); private MenuItemImpl copy = new MenuItemImpl(this, LogisimMenuBar.COPY); private MenuItemImpl paste = new MenuItemImpl(this, LogisimMenuBar.PASTE); private MenuItemImpl delete = new MenuItemImpl(this, LogisimMenuBar.DELETE); private MenuItemImpl dup = new MenuItemImpl(this, LogisimMenuBar.DUPLICATE); private MenuItemImpl selall = new MenuItemImpl(this, LogisimMenuBar.SELECT_ALL); private MenuItemImpl raise = new MenuItemImpl(this, LogisimMenuBar.RAISE); private MenuItemImpl lower = new MenuItemImpl(this, LogisimMenuBar.LOWER); private MenuItemImpl raiseTop = new MenuItemImpl(this, LogisimMenuBar.RAISE_TOP); private MenuItemImpl lowerBottom = new MenuItemImpl(this, LogisimMenuBar.LOWER_BOTTOM); private MenuItemImpl addCtrl = new MenuItemImpl(this, LogisimMenuBar.ADD_CONTROL); private MenuItemImpl remCtrl = new MenuItemImpl(this, LogisimMenuBar.REMOVE_CONTROL); private MyListener myListener = new MyListener(); public MenuEdit(LogisimMenuBar menubar) { this.menubar = menubar; int menuMask = getToolkit().getMenuShortcutKeyMask(); undo.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_Z, menuMask)); cut.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_X, menuMask)); copy.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_C, menuMask)); paste.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_V, menuMask)); delete.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_DELETE, 0)); dup.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_D, menuMask)); selall.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_A, menuMask)); raise.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_UP, menuMask)); lower.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_DOWN, menuMask)); raiseTop.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_UP, menuMask | KeyEvent.SHIFT_DOWN_MASK)); lowerBottom.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_DOWN, menuMask | KeyEvent.SHIFT_DOWN_MASK)); add(undo); addSeparator(); add(cut); add(copy); add(paste); addSeparator(); add(delete); add(dup); add(selall); addSeparator(); add(raise); add(lower); add(raiseTop); add(lowerBottom); addSeparator(); add(addCtrl); add(remCtrl); Project proj = menubar.getProject(); if (proj != null) { proj.addProjectListener(myListener); undo.addActionListener(myListener); } undo.setEnabled(false); menubar.registerItem(LogisimMenuBar.CUT, cut); menubar.registerItem(LogisimMenuBar.COPY, copy); menubar.registerItem(LogisimMenuBar.PASTE, paste); menubar.registerItem(LogisimMenuBar.DELETE, delete); menubar.registerItem(LogisimMenuBar.DUPLICATE, dup); menubar.registerItem(LogisimMenuBar.SELECT_ALL, selall); menubar.registerItem(LogisimMenuBar.RAISE, raise); menubar.registerItem(LogisimMenuBar.LOWER, lower); menubar.registerItem(LogisimMenuBar.RAISE_TOP, raiseTop); menubar.registerItem(LogisimMenuBar.LOWER_BOTTOM, lowerBottom); menubar.registerItem(LogisimMenuBar.ADD_CONTROL, addCtrl); menubar.registerItem(LogisimMenuBar.REMOVE_CONTROL, remCtrl); computeEnabled(); } public void localeChanged() { this.setText(Strings.get("editMenu")); myListener.projectChanged(null); cut.setText(Strings.get("editCutItem")); copy.setText(Strings.get("editCopyItem")); paste.setText(Strings.get("editPasteItem")); delete.setText(Strings.get("editClearItem")); dup.setText(Strings.get("editDuplicateItem")); selall.setText(Strings.get("editSelectAllItem")); raise.setText(Strings.get("editRaiseItem")); lower.setText(Strings.get("editLowerItem")); raiseTop.setText(Strings.get("editRaiseTopItem")); lowerBottom.setText(Strings.get("editLowerBottomItem")); addCtrl.setText(Strings.get("editAddControlItem")); remCtrl.setText(Strings.get("editRemoveControlItem")); } @Override void computeEnabled() { setEnabled(menubar.getProject() != null || cut.hasListeners() || copy.hasListeners() || paste.hasListeners() || delete.hasListeners() || dup.hasListeners() || selall.hasListeners() || raise.hasListeners() || lower.hasListeners() || raiseTop.hasListeners() || lowerBottom.hasListeners() || addCtrl.hasListeners() || remCtrl.hasListeners()); } } logisim-2.7.1/src/com/cburch/logisim/gui/menu/Menu.java0000644000175000017500000000043411446034542022643 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.menu; import javax.swing.JMenu; abstract class Menu extends JMenu { abstract void computeEnabled(); } logisim-2.7.1/src/com/cburch/logisim/gui/menu/LogisimMenuItem.java0000644000175000017500000000054511446034542025011 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.menu; public class LogisimMenuItem { private String name; LogisimMenuItem(String name) { this.name = name; } @Override public String toString() { return name; } } logisim-2.7.1/src/com/cburch/logisim/gui/menu/LogisimMenuBar.java0000644000175000017500000001407311541271670024621 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.menu; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.HashMap; import javax.swing.JFrame; import javax.swing.JMenuBar; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.circuit.Simulator; import com.cburch.logisim.proj.Project; import com.cburch.logisim.util.LocaleListener; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.WindowMenu; public class LogisimMenuBar extends JMenuBar { public static final LogisimMenuItem PRINT = new LogisimMenuItem("Print"); public static final LogisimMenuItem EXPORT_IMAGE = new LogisimMenuItem("ExportImage"); public static final LogisimMenuItem CUT = new LogisimMenuItem("Cut"); public static final LogisimMenuItem COPY = new LogisimMenuItem("Copy"); public static final LogisimMenuItem PASTE = new LogisimMenuItem("Paste"); public static final LogisimMenuItem DELETE = new LogisimMenuItem("Delete"); public static final LogisimMenuItem DUPLICATE = new LogisimMenuItem("Duplicate"); public static final LogisimMenuItem SELECT_ALL = new LogisimMenuItem("SelectAll"); public static final LogisimMenuItem RAISE = new LogisimMenuItem("Raise"); public static final LogisimMenuItem LOWER = new LogisimMenuItem("Lower"); public static final LogisimMenuItem RAISE_TOP = new LogisimMenuItem("RaiseTop"); public static final LogisimMenuItem LOWER_BOTTOM = new LogisimMenuItem("LowerBottom"); public static final LogisimMenuItem ADD_CONTROL = new LogisimMenuItem("AddControl"); public static final LogisimMenuItem REMOVE_CONTROL = new LogisimMenuItem("RemoveControl"); public static final LogisimMenuItem ADD_CIRCUIT = new LogisimMenuItem("AddCircuit"); public static final LogisimMenuItem MOVE_CIRCUIT_UP = new LogisimMenuItem("MoveCircuitUp"); public static final LogisimMenuItem MOVE_CIRCUIT_DOWN = new LogisimMenuItem("MoveCircuitDown"); public static final LogisimMenuItem SET_MAIN_CIRCUIT = new LogisimMenuItem("SetMainCircuit"); public static final LogisimMenuItem REMOVE_CIRCUIT = new LogisimMenuItem("RemoveCircuit"); public static final LogisimMenuItem EDIT_LAYOUT = new LogisimMenuItem("EditLayout"); public static final LogisimMenuItem EDIT_APPEARANCE = new LogisimMenuItem("EditAppearance"); public static final LogisimMenuItem VIEW_TOOLBOX = new LogisimMenuItem("ViewToolbox"); public static final LogisimMenuItem VIEW_SIMULATION = new LogisimMenuItem("ViewSimulation"); public static final LogisimMenuItem REVERT_APPEARANCE = new LogisimMenuItem("RevertAppearance"); public static final LogisimMenuItem ANALYZE_CIRCUIT = new LogisimMenuItem("AnalyzeCircuit"); public static final LogisimMenuItem CIRCUIT_STATS = new LogisimMenuItem("GetCircuitStatistics"); public static final LogisimMenuItem SIMULATE_ENABLE = new LogisimMenuItem("SimulateEnable"); public static final LogisimMenuItem SIMULATE_STEP = new LogisimMenuItem("SimulateStep"); public static final LogisimMenuItem TICK_ENABLE = new LogisimMenuItem("TickEnable"); public static final LogisimMenuItem TICK_STEP = new LogisimMenuItem("TickStep"); private class MyListener implements LocaleListener { public void localeChanged() { file.localeChanged(); edit.localeChanged(); project.localeChanged(); simulate.localeChanged(); help.localeChanged(); } } private JFrame parent; private MyListener listener; private Project proj; private SimulateListener simulateListener = null; private HashMap menuItems = new HashMap(); private ArrayList enableListeners; private MenuFile file; private MenuEdit edit; private MenuProject project; private MenuSimulate simulate; private MenuHelp help; public LogisimMenuBar(JFrame parent, Project proj) { this.parent = parent; this.listener = new MyListener(); this.proj = proj; this.enableListeners = new ArrayList(); add(file = new MenuFile(this)); add(edit = new MenuEdit(this)); add(project = new MenuProject(this)); add(simulate = new MenuSimulate(this)); add(new WindowMenu(parent)); add(help = new MenuHelp(this)); LocaleManager.addLocaleListener(listener); listener.localeChanged(); } public void setEnabled(LogisimMenuItem which, boolean value) { MenuItem item = menuItems.get(which); if (item != null) item.setEnabled(value); } public void addActionListener(LogisimMenuItem which, ActionListener l) { MenuItem item = menuItems.get(which); if (item != null) item.addActionListener(l); } public void removeActionListener(LogisimMenuItem which, ActionListener l) { MenuItem item = menuItems.get(which); if (item != null) item.removeActionListener(l); } public void addEnableListener(ChangeListener l) { enableListeners.add(l); } public void removeEnableListener(ChangeListener l) { enableListeners.remove(l); } void fireEnableChanged() { ChangeEvent e = new ChangeEvent(this); for (ChangeListener listener : enableListeners) { listener.stateChanged(e); } } public void setSimulateListener(SimulateListener l) { simulateListener = l; } public void setCircuitState(Simulator sim, CircuitState state) { simulate.setCurrentState(sim, state); } public Project getProject() { return proj; } JFrame getParentWindow() { return parent; } void registerItem(LogisimMenuItem which, MenuItem item) { menuItems.put(which, item); } void fireStateChanged(Simulator sim, CircuitState state) { if (simulateListener != null) { simulateListener.stateChangeRequested(sim, state); } } public void doAction(LogisimMenuItem which) { MenuItem item = menuItems.get(which); item.actionPerformed(new ActionEvent(item, ActionEvent.ACTION_PERFORMED, which.toString())); } public boolean isEnabled(LogisimMenuItem item) { MenuItem menuItem = menuItems.get(item); return menuItem != null && menuItem.isEnabled(); } } logisim-2.7.1/src/com/cburch/logisim/gui/menu/EditPopup.java0000644000175000017500000000473011447117142023652 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.menu; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.HashMap; import java.util.Map; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; public abstract class EditPopup extends JPopupMenu { private class Listener implements ActionListener { public void actionPerformed(ActionEvent e) { Object source = e.getSource(); for (Map.Entry entry : items.entrySet()) { if (entry.getValue() == source) { fire(entry.getKey()); return; } } } } private Listener listener; private Map items; public EditPopup() { this(false); } public EditPopup(boolean waitForInitialize) { listener = new Listener(); items = new HashMap(); if (!waitForInitialize) initialize(); } protected void initialize() { boolean x = false; x |= add(LogisimMenuBar.CUT, Strings.get("editCutItem")); x |= add(LogisimMenuBar.COPY, Strings.get("editCopyItem")); if (x) { addSeparator(); x = false; } x |= add(LogisimMenuBar.DELETE, Strings.get("editClearItem")); x |= add(LogisimMenuBar.DUPLICATE, Strings.get("editDuplicateItem")); if (x) { addSeparator(); x = false; } x |= add(LogisimMenuBar.RAISE, Strings.get("editRaiseItem")); x |= add(LogisimMenuBar.LOWER, Strings.get("editLowerItem")); x |= add(LogisimMenuBar.RAISE_TOP, Strings.get("editRaiseTopItem")); x |= add(LogisimMenuBar.LOWER_BOTTOM, Strings.get("editLowerBottomItem")); if (x) { addSeparator(); x = false; } x |= add(LogisimMenuBar.ADD_CONTROL, Strings.get("editAddControlItem")); x |= add(LogisimMenuBar.REMOVE_CONTROL, Strings.get("editRemoveControlItem")); if (!x && getComponentCount() > 0) { remove(getComponentCount() - 1); } } private boolean add(LogisimMenuItem item, String display) { if (shouldShow(item)) { JMenuItem menu = new JMenuItem(display); items.put(item, menu); menu.setEnabled(isEnabled(item)); menu.addActionListener(listener); add(menu); return true; } else { return false; } } protected abstract boolean shouldShow(LogisimMenuItem item); protected abstract boolean isEnabled(LogisimMenuItem item); protected abstract void fire(LogisimMenuItem item); } logisim-2.7.1/src/com/cburch/logisim/gui/main/0000755000175000017500000000000011541661274021057 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/logisim/gui/main/ToolboxToolbarModel.java0000644000175000017500000000362311527624244025660 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.main; import java.util.List; import com.cburch.draw.toolbar.AbstractToolbarModel; import com.cburch.draw.toolbar.ToolbarItem; import com.cburch.logisim.gui.menu.LogisimMenuBar; import com.cburch.logisim.util.UnmodifiableList; class ToolboxToolbarModel extends AbstractToolbarModel implements MenuListener.EnabledListener { private LogisimToolbarItem itemAdd; private LogisimToolbarItem itemUp; private LogisimToolbarItem itemDown; private LogisimToolbarItem itemDelete; private List items; public ToolboxToolbarModel(MenuListener menu) { itemAdd = new LogisimToolbarItem(menu, "projadd.gif", LogisimMenuBar.ADD_CIRCUIT, Strings.getter("projectAddCircuitTip")); itemUp = new LogisimToolbarItem(menu, "projup.gif", LogisimMenuBar.MOVE_CIRCUIT_UP, Strings.getter("projectMoveCircuitUpTip")); itemDown = new LogisimToolbarItem(menu, "projdown.gif", LogisimMenuBar.MOVE_CIRCUIT_DOWN, Strings.getter("projectMoveCircuitDownTip")); itemDelete = new LogisimToolbarItem(menu, "projdel.gif", LogisimMenuBar.REMOVE_CIRCUIT, Strings.getter("projectRemoveCircuitTip")); items = UnmodifiableList.create(new ToolbarItem[] { itemAdd, itemUp, itemDown, itemDelete, }); menu.addEnabledListener(this); } @Override public List getItems() { return items; } @Override public boolean isSelected(ToolbarItem item) { return false; } @Override public void itemSelected(ToolbarItem item) { if (item instanceof LogisimToolbarItem) { ((LogisimToolbarItem) item).doAction(); } } // // EnabledListener methods // public void menuEnableChanged(MenuListener source) { fireToolbarAppearanceChanged(); } } logisim-2.7.1/src/com/cburch/logisim/gui/main/ToolboxManip.java0000644000175000017500000001523711537604342024343 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.main; import javax.swing.JPopupMenu; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.SubcircuitFactory; import com.cburch.logisim.comp.ComponentFactory; import com.cburch.logisim.data.AttributeEvent; import com.cburch.logisim.data.AttributeListener; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.file.LibraryEvent; import com.cburch.logisim.file.LibraryEventSource; import com.cburch.logisim.file.LibraryListener; import com.cburch.logisim.file.LogisimFile; import com.cburch.logisim.file.LogisimFileActions; import com.cburch.logisim.gui.generic.AttrTableModel; import com.cburch.logisim.gui.menu.ProjectCircuitActions; import com.cburch.logisim.gui.menu.ProjectLibraryActions; import com.cburch.logisim.gui.menu.Popups; import com.cburch.logisim.proj.Project; import com.cburch.logisim.proj.ProjectEvent; import com.cburch.logisim.proj.ProjectListener; import com.cburch.logisim.tools.AddTool; import com.cburch.logisim.tools.Library; import com.cburch.logisim.tools.Tool; class ToolboxManip implements ProjectExplorer.Listener { private class MyListener implements ProjectListener, LibraryListener, AttributeListener { private LogisimFile curFile = null; public void projectChanged(ProjectEvent event) { int action = event.getAction(); if (action == ProjectEvent.ACTION_SET_FILE) { setFile((LogisimFile) event.getOldData(), (LogisimFile) event.getData()); explorer.repaint(); } } private void setFile(LogisimFile oldFile, LogisimFile newFile) { if (oldFile != null) { removeLibrary(oldFile); for (Library lib : oldFile.getLibraries()) { removeLibrary(lib); } } curFile = newFile; if (newFile != null) { addLibrary(newFile); for (Library lib : newFile.getLibraries()) { addLibrary(lib); } } } public void libraryChanged(LibraryEvent event) { int action = event.getAction(); if (action == LibraryEvent.ADD_LIBRARY) { if (event.getSource() == curFile) { addLibrary((Library) event.getData()); } } else if (action == LibraryEvent.REMOVE_LIBRARY) { if (event.getSource() == curFile) { removeLibrary((Library) event.getData()); } } else if (action == LibraryEvent.ADD_TOOL) { Tool tool = (Tool) event.getData(); AttributeSet attrs = tool.getAttributeSet(); if (attrs != null) attrs.addAttributeListener(this); } else if (action == LibraryEvent.REMOVE_TOOL) { Tool tool = (Tool) event.getData(); AttributeSet attrs = tool.getAttributeSet(); if (attrs != null) attrs.removeAttributeListener(this); } explorer.repaint(); } private void addLibrary(Library lib) { if (lib instanceof LibraryEventSource) { ((LibraryEventSource) lib).addLibraryListener(this); } for (Tool tool : lib.getTools()) { AttributeSet attrs = tool.getAttributeSet(); if (attrs != null) attrs.addAttributeListener(this); } } private void removeLibrary(Library lib) { if (lib instanceof LibraryEventSource) { ((LibraryEventSource) lib).removeLibraryListener(this); } for (Tool tool : lib.getTools()) { AttributeSet attrs = tool.getAttributeSet(); if (attrs != null) attrs.removeAttributeListener(this); } } public void attributeListChanged(AttributeEvent e) { } public void attributeValueChanged(AttributeEvent e) { explorer.repaint(); } } private Project proj; private ProjectExplorer explorer; private MyListener myListener = new MyListener(); private Tool lastSelected = null; ToolboxManip(Project proj, ProjectExplorer explorer) { this.proj = proj; this.explorer = explorer; proj.addProjectListener(myListener); myListener.setFile(null, proj.getLogisimFile()); } public void selectionChanged(ProjectExplorer.Event event) { Object selected = event.getTarget(); if (selected instanceof Tool) { if (selected instanceof AddTool) { AddTool addTool = (AddTool) selected; ComponentFactory source = addTool.getFactory(); if (source instanceof SubcircuitFactory) { SubcircuitFactory circFact = (SubcircuitFactory) source; Circuit circ = circFact.getSubcircuit(); if (proj.getCurrentCircuit() == circ) { AttrTableModel m = new AttrTableCircuitModel(proj, circ); proj.getFrame().setAttrTableModel(m); return; } } } lastSelected = proj.getTool(); Tool tool = (Tool) selected; proj.setTool(tool); proj.getFrame().viewAttributes(tool); } } public void doubleClicked(ProjectExplorer.Event event) { Object clicked = event.getTarget(); if (clicked instanceof AddTool) { AddTool tool = (AddTool) clicked; ComponentFactory source = tool.getFactory(); if (source instanceof SubcircuitFactory) { SubcircuitFactory circFact = (SubcircuitFactory) source; proj.setCurrentCircuit(circFact.getSubcircuit()); proj.getFrame().setEditorView(Frame.EDIT_LAYOUT); if (lastSelected != null) proj.setTool(lastSelected); } } } public void moveRequested(ProjectExplorer.Event event, AddTool dragged, AddTool target) { LogisimFile file = proj.getLogisimFile(); int draggedIndex = file.getTools().indexOf(dragged); int targetIndex = file.getTools().indexOf(target); if (targetIndex > draggedIndex) targetIndex++; proj.doAction(LogisimFileActions.moveCircuit(dragged, targetIndex)); } public void deleteRequested(ProjectExplorer.Event event) { Object request = event.getTarget(); if (request instanceof Library) { ProjectLibraryActions.doUnloadLibrary(proj, (Library) request); } else if (request instanceof AddTool) { ComponentFactory factory = ((AddTool) request).getFactory(); if (factory instanceof SubcircuitFactory) { SubcircuitFactory circFact = (SubcircuitFactory) factory; ProjectCircuitActions.doRemoveCircuit(proj, circFact.getSubcircuit()); } } } public JPopupMenu menuRequested(ProjectExplorer.Event event) { Object clicked = event.getTarget(); if (clicked instanceof AddTool) { AddTool tool = (AddTool) clicked; ComponentFactory source = tool.getFactory(); if (source instanceof SubcircuitFactory) { Circuit circ = ((SubcircuitFactory) source).getSubcircuit(); return Popups.forCircuit(proj, tool, circ); } else { return null; } } else if (clicked instanceof Tool) { return null; } else if (clicked == proj.getLogisimFile()) { return Popups.forProject(proj); } else if (clicked instanceof Library) { boolean is_top = event.getTreePath().getPathCount() <= 2; return Popups.forLibrary(proj, (Library) clicked, is_top); } else { return null; } } } logisim-2.7.1/src/com/cburch/logisim/gui/main/Toolbox.java0000644000175000017500000000166711532066764023365 0ustar vincentvincent/* Copyright (c) 2011, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.main; import java.awt.BorderLayout; import javax.swing.JPanel; import javax.swing.JScrollPane; import com.cburch.draw.toolbar.Toolbar; import com.cburch.logisim.proj.Project; import com.cburch.logisim.tools.Tool; class Toolbox extends JPanel { private ProjectExplorer toolbox; Toolbox(Project proj, MenuListener menu) { super(new BorderLayout()); ToolboxToolbarModel toolbarModel = new ToolboxToolbarModel(menu); Toolbar toolbar = new Toolbar(toolbarModel); add(toolbar, BorderLayout.NORTH); toolbox = new ProjectExplorer(proj); toolbox.setListener(new ToolboxManip(proj, toolbox)); add(new JScrollPane(toolbox), BorderLayout.CENTER); } void setHaloedTool(Tool value) { toolbox.setHaloedTool(value); } } logisim-2.7.1/src/com/cburch/logisim/gui/main/ToolAttributeAction.java0000644000175000017500000000437011527054456025667 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.main; import java.util.HashMap; import java.util.Map; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.proj.Action; import com.cburch.logisim.proj.Project; import com.cburch.logisim.tools.Tool; import com.cburch.logisim.tools.key.KeyConfigurationEvent; import com.cburch.logisim.tools.key.KeyConfigurationResult; public class ToolAttributeAction extends Action { public static Action create(Tool tool, Attribute attr, Object value) { AttributeSet attrs = tool.getAttributeSet(); KeyConfigurationEvent e = new KeyConfigurationEvent(0, attrs, null, null); KeyConfigurationResult r = new KeyConfigurationResult(e, attr, value); return new ToolAttributeAction(r); } public static Action create(KeyConfigurationResult results) { return new ToolAttributeAction(results); } private KeyConfigurationResult config; private Map,Object> oldValues; private ToolAttributeAction(KeyConfigurationResult config) { this.config = config; this.oldValues = new HashMap,Object>(2); } @Override public String getName() { return Strings.get("changeToolAttrAction"); } @Override public void doIt(Project proj) { AttributeSet attrs = config.getEvent().getAttributeSet(); Map,Object> newValues = config.getAttributeValues(); Map,Object> oldValues = new HashMap,Object>(newValues.size()); for (Map.Entry,Object> entry : newValues.entrySet()) { @SuppressWarnings("unchecked") Attribute attr = (Attribute) entry.getKey(); oldValues.put(attr, attrs.getValue(attr)); attrs.setValue(attr, entry.getValue()); } this.oldValues = oldValues; } @Override public void undo(Project proj) { AttributeSet attrs = config.getEvent().getAttributeSet(); Map,Object> oldValues = this.oldValues; for (Map.Entry,Object> entry : oldValues.entrySet()) { @SuppressWarnings("unchecked") Attribute attr = (Attribute) entry.getKey(); attrs.setValue(attr, entry.getValue()); } } } logisim-2.7.1/src/com/cburch/logisim/gui/main/TickCounter.java0000644000175000017500000001043511455255500024152 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.main; import com.cburch.logisim.circuit.Simulator; import com.cburch.logisim.circuit.SimulatorEvent; import com.cburch.logisim.circuit.SimulatorListener; class TickCounter implements SimulatorListener { private static final int QUEUE_LENGTH = 1000; private long[] queueTimes; private double[] queueRates; private int queueStart; private int queueSize; private double tickFrequency; public TickCounter() { queueTimes = new long[QUEUE_LENGTH]; queueRates = new double[QUEUE_LENGTH]; queueSize = 0; } public void clear() { queueSize = 0; } public void propagationCompleted(SimulatorEvent e) { Simulator sim = e.getSource(); if (!sim.isTicking()) { queueSize = 0; } } public void simulatorStateChanged(SimulatorEvent e) { propagationCompleted(e); } public void tickCompleted(SimulatorEvent e) { Simulator sim = e.getSource(); if (!sim.isTicking()) { queueSize = 0; } else { double freq = sim.getTickFrequency(); if (freq != tickFrequency) { queueSize = 0; tickFrequency = freq; } int curSize = queueSize; int maxSize = queueTimes.length; int start = queueStart; int end; if (curSize < maxSize) { // new sample is added into queue end = start + curSize; if (end >= maxSize) { end -= maxSize; } curSize++; queueSize = curSize; } else { // new sample replaces oldest value in queue end = queueStart; if (end + 1 >= maxSize) { queueStart = 0; } else { queueStart = end + 1; } } long startTime = queueTimes[start]; long endTime = System.currentTimeMillis(); double rate; if (startTime == endTime || curSize <= 1) { rate = Double.MAX_VALUE; } else { rate = 1000.0 * (curSize - 1) / (endTime - startTime); } queueTimes[end] = endTime; queueRates[end] = rate; } } public String getTickRate() { int size = queueSize; if (size <= 1) { return ""; } else { int maxSize = queueTimes.length; int start = queueStart; int end = start + size - 1; if (end >= maxSize) { end -= maxSize; } double rate = queueRates[end]; if (rate <= 0 || rate == Double.MAX_VALUE) { return ""; } else { // Figure out the minimum over the previous 100 readings, and // base our rounding off of that. This is meant to provide some // stability in the rounding - we don't want the result to // oscillate rapidly between 990 Hz and 1 KHz - it's better for // it to oscillate between 990 Hz and 1005 Hz. int baseLen = size; if (baseLen > 100) baseLen = 100; int baseStart = end - baseLen + 1; double min = rate; if (baseStart < 0) { baseStart += maxSize; for (int i = baseStart + maxSize; i < maxSize; i++) { double x = queueRates[i]; if (x < min) min = x; } for (int i = 0; i < end; i++) { double x = queueRates[i]; if (x < min) min = x; } } else { for (int i = baseStart; i < end; i++) { double x = queueRates[i]; if (x < min) min = x; } } if (min < 0.9 * rate) min = rate; if (min >= 1000.0) { return Strings.get("tickRateKHz", roundString(rate / 1000.0, min / 1000.0)); } else { return Strings.get("tickRateHz", roundString(rate, min)); } } } } private String roundString(double val, double min) { // round so we have only three significant digits int i = 0; // invariant: a = 10^i double a = 1.0; // invariant: a * bm == min, a is power of 10 double bm = min; double bv = val; if (bm >= 1000) { while (bm >= 1000) { i++; a *= 10; bm /= 10; bv /= 10; } } else { while (bm < 100) { i--; a /= 10; bm *= 10; bv *= 10; } } // Examples: // 2.34: i = -2, a = .2, b = 234 // 20.1: i = -1, a = .1, b = 201 if (i >= 0) { // nothing after decimal point return "" + (int) Math.round(a * Math.round(bv)); } else { // keep some after decimal point return String.format("%." + (-i) + "f", Double.valueOf(a * bv)); } } } logisim-2.7.1/src/com/cburch/logisim/gui/main/Strings.java0000644000175000017500000000145111527054456023356 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.main; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.StringGetter; import com.cburch.logisim.util.StringUtil; class Strings { private static LocaleManager source = new LocaleManager("resources/logisim", "gui"); public static String get(String key) { return source.get(key); } public static String get(String key, String arg) { return StringUtil.format(source.get(key), arg); } public static String get(String key, String arg0, String arg1) { return StringUtil.format(source.get(key), arg0, arg1); } public static StringGetter getter(String key) { return source.getter(key); } } logisim-2.7.1/src/com/cburch/logisim/gui/main/StatisticsDialog.java0000644000175000017500000001315711446034540025175 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.main; import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Comparator; import java.util.List; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableColumn; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.file.FileStatistics; import com.cburch.logisim.file.LogisimFile; import com.cburch.logisim.tools.Library; import com.cburch.logisim.util.TableSorter; public class StatisticsDialog extends JDialog implements ActionListener { public static void show(JFrame parent, LogisimFile file, Circuit circuit) { FileStatistics stats = FileStatistics.compute(file, circuit); StatisticsDialog dlog = new StatisticsDialog(parent, circuit.getName(), new StatisticsTableModel(stats)); dlog.setVisible(true); } private static class StatisticsTableModel extends AbstractTableModel { private FileStatistics stats; StatisticsTableModel(FileStatistics stats) { this.stats = stats; } public int getColumnCount() { return 5; } public int getRowCount() { return stats.getCounts().size() + 2; } @Override public Class getColumnClass(int column) { return column < 2 ? String.class : Integer.class; } @Override public String getColumnName(int column) { switch (column) { case 0: return Strings.get("statsComponentColumn"); case 1: return Strings.get("statsLibraryColumn"); case 2: return Strings.get("statsSimpleCountColumn"); case 3: return Strings.get("statsUniqueCountColumn"); case 4: return Strings.get("statsRecursiveCountColumn"); default: return "??"; // should never happen } } public Object getValueAt(int row, int column) { List counts = stats.getCounts(); int countsLen = counts.size(); if (row < 0 || row >= countsLen + 2) return ""; FileStatistics.Count count; if (row < countsLen) count = counts.get(row); else if (row == countsLen) count = stats.getTotalWithoutSubcircuits(); else count = stats.getTotalWithSubcircuits(); switch (column) { case 0: if (row < countsLen) { return count.getFactory().getDisplayName(); } else if (row == countsLen) { return Strings.get("statsTotalWithout"); } else { return Strings.get("statsTotalWith"); } case 1: if (row < countsLen) { Library lib = count.getLibrary(); return lib == null ? "-" : lib.getDisplayName(); } else { return ""; } case 2: return Integer.valueOf(count.getSimpleCount()); case 3: return Integer.valueOf(count.getUniqueCount()); case 4: return Integer.valueOf(count.getRecursiveCount()); default: return ""; // should never happen } } } private static class CompareString implements Comparator { private String[] fixedAtBottom; public CompareString(String... fixedAtBottom) { this.fixedAtBottom = fixedAtBottom; } public int compare(String a, String b) { for (int i = fixedAtBottom.length - 1; i >= 0; i--) { String s = fixedAtBottom[i]; if (a.equals(s)) return b.equals(s) ? 0 : 1; if (b.equals(s)) return -1; } return a.compareToIgnoreCase(b); } } private static class StatisticsTable extends JTable { @Override public void setBounds(int x, int y, int width, int height) { super.setBounds(x, y, width, height); setPreferredColumnWidths(new double[] { 0.45, 0.25, 0.1, 0.1, 0.1 }); } protected void setPreferredColumnWidths(double[] percentages) { Dimension tableDim = getPreferredSize(); double total = 0; for (int i = 0; i < getColumnModel().getColumnCount(); i++) { total += percentages[i]; } for (int i = 0; i < getColumnModel().getColumnCount(); i++) { TableColumn column = getColumnModel().getColumn(i); double width = tableDim.width * (percentages[i] / total); column.setPreferredWidth((int) width); } } } private StatisticsDialog(JFrame parent, String circuitName, StatisticsTableModel model) { super(parent, true); setDefaultCloseOperation(DISPOSE_ON_CLOSE); setTitle(Strings.get("statsDialogTitle", circuitName)); JTable table = new StatisticsTable(); TableSorter mySorter = new TableSorter(model, table.getTableHeader()); Comparator comp = new CompareString("", Strings.get("statsTotalWithout"), Strings.get("statsTotalWith")); mySorter.setColumnComparator(String.class, comp); table.setModel(mySorter); JScrollPane tablePane = new JScrollPane(table); JButton button = new JButton(Strings.get("statsCloseButton")); button.addActionListener(this); JPanel buttonPanel = new JPanel(); buttonPanel.add(button); Container contents = this.getContentPane(); contents.setLayout(new BorderLayout()); contents.add(tablePane, BorderLayout.CENTER); contents.add(buttonPanel, BorderLayout.PAGE_END); this.pack(); Dimension pref = contents.getPreferredSize(); if (pref.width > 750 || pref.height > 550) { if (pref.width > 750) pref.width = 750; if (pref.height > 550) pref.height = 550; this.setSize(pref); } } public void actionPerformed(ActionEvent e) { this.dispose(); } } logisim-2.7.1/src/com/cburch/logisim/gui/main/SimulationTreeRenderer.java0000644000175000017500000000445711532066764026372 0ustar vincentvincent/* Copyright (c) 2011, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.main; import java.awt.Color; import java.awt.Component; import java.awt.Graphics; import javax.swing.Icon; import javax.swing.JLabel; import javax.swing.JTree; import javax.swing.tree.DefaultTreeCellRenderer; import com.cburch.logisim.comp.ComponentDrawContext; import com.cburch.logisim.comp.ComponentFactory; public class SimulationTreeRenderer extends DefaultTreeCellRenderer { private static class RendererIcon implements Icon { private ComponentFactory factory; private boolean isCurrentView; RendererIcon(ComponentFactory factory, boolean isCurrentView) { this.factory = factory; this.isCurrentView = isCurrentView; } public int getIconHeight() { return 20; } public int getIconWidth() { return 20; } public void paintIcon(Component c, Graphics g, int x, int y) { ComponentDrawContext context = new ComponentDrawContext(c, null, null, g, g); factory.paintIcon(context, x, y, factory.createAttributeSet()); // draw magnifying glass if appropriate if (isCurrentView) { int tx = x + 13; int ty = y + 13; int[] xp = { tx - 1, x + 18, x + 20, tx + 1 }; int[] yp = { ty + 1, y + 20, y + 18, ty - 1 }; g.setColor(ProjectExplorer.MAGNIFYING_INTERIOR); g.fillOval(x + 5, y + 5, 10, 10); g.setColor(Color.BLACK); g.drawOval(x + 5, y + 5, 10, 10); g.fillPolygon(xp, yp, xp.length); } } } @Override public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { Component ret = super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); SimulationTreeModel model = (SimulationTreeModel) tree.getModel(); if (ret instanceof JLabel) { JLabel label = (JLabel) ret; if (value instanceof SimulationTreeNode) { SimulationTreeNode node = (SimulationTreeNode) value; ComponentFactory factory = node.getComponentFactory(); if (factory != null) { label.setIcon(new RendererIcon(factory, node.isCurrentView(model))); } } } return ret; } } logisim-2.7.1/src/com/cburch/logisim/gui/main/SimulationTreeNode.java0000644000175000017500000000147611532066764025507 0ustar vincentvincent/* Copyright (c) 2011, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.main; import java.util.Enumeration; import javax.swing.tree.TreeNode; import com.cburch.logisim.comp.ComponentFactory; public abstract class SimulationTreeNode implements TreeNode { public abstract ComponentFactory getComponentFactory(); public boolean isCurrentView(SimulationTreeModel model) { return false; } public abstract Enumeration children(); public abstract boolean getAllowsChildren(); public abstract TreeNode getChildAt(int childIndex); public abstract int getChildCount(); public abstract int getIndex(TreeNode node); public abstract TreeNode getParent(); public abstract boolean isLeaf(); } logisim-2.7.1/src/com/cburch/logisim/gui/main/SimulationTreeModel.java0000644000175000017500000001115211532066764025652 0ustar vincentvincent/* Copyright (c) 2011, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.main; import java.util.ArrayList; import javax.swing.event.TreeModelEvent; import javax.swing.event.TreeModelListener; import javax.swing.tree.TreeModel; import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.comp.Component; public class SimulationTreeModel implements TreeModel { private ArrayList listeners; private SimulationTreeCircuitNode root; private CircuitState currentView; public SimulationTreeModel(CircuitState rootState) { this.listeners = new ArrayList(); this.root = new SimulationTreeCircuitNode(this, null, rootState, null); this.currentView = null; } public CircuitState getRootState() { return root.getCircuitState(); } public CircuitState getCurrentView() { return currentView; } public void setCurrentView(CircuitState value) { CircuitState oldView = currentView; if (oldView != value) { currentView = value; SimulationTreeCircuitNode node1 = mapToNode(oldView); if (node1 != null) fireNodeChanged(node1); SimulationTreeCircuitNode node2 = mapToNode(value); if (node2 != null) fireNodeChanged(node2); } } private SimulationTreeCircuitNode mapToNode(CircuitState state) { TreePath path = mapToPath(state); if (path == null) { return null; } else { return (SimulationTreeCircuitNode) path.getLastPathComponent(); } } public TreePath mapToPath(CircuitState state) { if (state == null) return null; ArrayList path = new ArrayList(); CircuitState current = state; CircuitState parent = current.getParentState(); while (parent != null && parent != state) { path.add(current); current = parent; parent = current.getParentState(); } Object[] pathNodes = new Object[path.size() + 1]; pathNodes[0] = root; int pathPos = 1; SimulationTreeCircuitNode node = root; for (int i = path.size() - 1; i >= 0; i--) { current = path.get(i); SimulationTreeCircuitNode oldNode = node; for (int j = 0, n = node.getChildCount(); j < n; j++) { Object child = node.getChildAt(j); if (child instanceof SimulationTreeCircuitNode) { SimulationTreeCircuitNode circNode = (SimulationTreeCircuitNode) child; if (circNode.getCircuitState() == current) { node = circNode; break; } } } if (node == oldNode) { return null; } pathNodes[pathPos] = node; pathPos++; } return new TreePath(pathNodes); } protected SimulationTreeNode mapComponentToNode(Component comp) { return null; } public void addTreeModelListener(TreeModelListener l) { listeners.add(l); } public void removeTreeModelListener(TreeModelListener l) { listeners.remove(l); } protected void fireNodeChanged(Object node) { TreeModelEvent e = new TreeModelEvent(this, findPath(node)); for (TreeModelListener l : listeners) { l.treeNodesChanged(e); } } protected void fireStructureChanged(Object node) { TreeModelEvent e = new TreeModelEvent(this, findPath(node)); for (TreeModelListener l : listeners) { l.treeStructureChanged(e); } } private TreePath findPath(Object node) { ArrayList path = new ArrayList(); Object current = node; while (current instanceof TreeNode) { path.add(0, current); current = ((TreeNode) current).getParent(); } if (current != null) { path.add(0, current); } return new TreePath(path.toArray()); } public Object getRoot() { return root; } public int getChildCount(Object parent) { if (parent instanceof TreeNode) { return ((TreeNode) parent).getChildCount(); } else { return 0; } } public Object getChild(Object parent, int index) { if (parent instanceof TreeNode) { return ((TreeNode) parent).getChildAt(index); } else { return null; } } public int getIndexOfChild(Object parent, Object child) { if (parent instanceof TreeNode && child instanceof TreeNode) { return ((TreeNode) parent).getIndex((TreeNode) child); } else { return -1; } } public boolean isLeaf(Object node) { if (node instanceof TreeNode) { return ((TreeNode) node).getChildCount() == 0; } else { return true; } } public void valueForPathChanged(TreePath path, Object newValue) { throw new UnsupportedOperationException(); } } logisim-2.7.1/src/com/cburch/logisim/gui/main/SimulationTreeCircuitNode.java0000644000175000017500000001245211532066764027026 0ustar vincentvincent/* Copyright (c) 2011, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.main; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Enumeration; import javax.swing.tree.TreeNode; import com.cburch.logisim.circuit.CircuitAttributes; import com.cburch.logisim.circuit.CircuitEvent; import com.cburch.logisim.circuit.CircuitListener; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.circuit.SubcircuitFactory; import com.cburch.logisim.comp.Component; import com.cburch.logisim.comp.ComponentFactory; import com.cburch.logisim.data.AttributeEvent; import com.cburch.logisim.data.AttributeListener; import com.cburch.logisim.instance.StdAttr; class SimulationTreeCircuitNode extends SimulationTreeNode implements CircuitListener, AttributeListener, Comparator { private static class CompareByName implements Comparator { public int compare(Object a, Object b) { return a.toString().compareToIgnoreCase(b.toString()); } } private SimulationTreeModel model; private SimulationTreeCircuitNode parent; private CircuitState circuitState; private Component subcircComp; private ArrayList children; public SimulationTreeCircuitNode(SimulationTreeModel model, SimulationTreeCircuitNode parent, CircuitState circuitState, Component subcircComp) { this.model = model; this.parent = parent; this.circuitState = circuitState; this.subcircComp = subcircComp; this.children = new ArrayList(); circuitState.getCircuit().addCircuitListener(this); if (subcircComp != null) { subcircComp.getAttributeSet().addAttributeListener(this); } else { circuitState.getCircuit().getStaticAttributes().addAttributeListener(this); } computeChildren(); } public CircuitState getCircuitState() { return circuitState; } @Override public ComponentFactory getComponentFactory() { return circuitState.getCircuit().getSubcircuitFactory(); } @Override public boolean isCurrentView(SimulationTreeModel model) { return model.getCurrentView() == circuitState; } @Override public String toString() { if (subcircComp != null) { String label = subcircComp.getAttributeSet().getValue(StdAttr.LABEL); if (label != null && !label.equals("")) { return label; } } String ret = circuitState.getCircuit().getName(); if (subcircComp != null) { ret += subcircComp.getLocation(); } return ret; } @Override public TreeNode getChildAt(int index) { return children.get(index); } @Override public int getChildCount() { return children.size(); } @Override public TreeNode getParent() { return parent; } @Override public int getIndex(TreeNode node) { return children.indexOf(node); } @Override public boolean getAllowsChildren() { return true; } @Override public boolean isLeaf() { return false; } @Override public Enumeration children() { return Collections.enumeration(children); } public void circuitChanged(CircuitEvent event) { int action = event.getAction(); if (action == CircuitEvent.ACTION_SET_NAME) { model.fireNodeChanged(this); } else { if (computeChildren()) { model.fireStructureChanged(this); } } } // returns true if changed private boolean computeChildren() { ArrayList newChildren = new ArrayList(); ArrayList subcircs = new ArrayList(); for (Component comp : circuitState.getCircuit().getNonWires()) { if (comp.getFactory() instanceof SubcircuitFactory) { subcircs.add(comp); } else { TreeNode toAdd = model.mapComponentToNode(comp); if (toAdd != null) { newChildren.add(toAdd); } } } Collections.sort(newChildren, new CompareByName()); Collections.sort(subcircs, this); for (Component comp : subcircs) { SubcircuitFactory factory = (SubcircuitFactory) comp.getFactory(); CircuitState state = factory.getSubstate(circuitState, comp); SimulationTreeCircuitNode toAdd = null; for (TreeNode o : children) { if (o instanceof SimulationTreeCircuitNode) { SimulationTreeCircuitNode n = (SimulationTreeCircuitNode) o; if (n.circuitState == state) { toAdd = n; break; } } } if (toAdd == null) { toAdd = new SimulationTreeCircuitNode(model, this, state, comp); } newChildren.add(toAdd); } if (!children.equals(newChildren)) { children = newChildren; return true; } else { return false; } } public int compare(Component a, Component b) { if (a != b) { String aName = a.getFactory().getDisplayName(); String bName = b.getFactory().getDisplayName(); int ret = aName.compareToIgnoreCase(bName); if (ret != 0) return ret; } return a.getLocation().toString().compareTo(b.getLocation().toString()); } // // AttributeListener methods public void attributeListChanged(AttributeEvent e) { } public void attributeValueChanged(AttributeEvent e) { Object attr = e.getAttribute(); if (attr == CircuitAttributes.CIRCUIT_LABEL_ATTR || attr == StdAttr.LABEL) { model.fireNodeChanged(this); } } } logisim-2.7.1/src/com/cburch/logisim/gui/main/SimulationToolbarModel.java0000644000175000017500000000523411532066764026361 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.main; import java.util.List; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import com.cburch.draw.toolbar.AbstractToolbarModel; import com.cburch.draw.toolbar.ToolbarItem; import com.cburch.logisim.circuit.Simulator; import com.cburch.logisim.gui.menu.LogisimMenuBar; import com.cburch.logisim.proj.Project; import com.cburch.logisim.util.UnmodifiableList; class SimulationToolbarModel extends AbstractToolbarModel implements ChangeListener { private Project project; private LogisimToolbarItem simEnable; private LogisimToolbarItem simStep; private LogisimToolbarItem tickEnable; private LogisimToolbarItem tickStep; private List items; public SimulationToolbarModel(Project project, MenuListener menu) { this.project = project; simEnable = new LogisimToolbarItem(menu, "simplay.png", LogisimMenuBar.SIMULATE_ENABLE, Strings.getter("simulateEnableStepsTip")); simStep = new LogisimToolbarItem(menu, "simstep.png", LogisimMenuBar.SIMULATE_STEP, Strings.getter("simulateStepTip")); tickEnable = new LogisimToolbarItem(menu, "simtplay.png", LogisimMenuBar.TICK_ENABLE, Strings.getter("simulateEnableTicksTip")); tickStep = new LogisimToolbarItem(menu, "simtstep.png", LogisimMenuBar.TICK_STEP, Strings.getter("simulateTickTip")); items = UnmodifiableList.create(new ToolbarItem[] { simEnable, simStep, tickEnable, tickStep, }); menu.getMenuBar().addEnableListener(this); stateChanged(null); } @Override public List getItems() { return items; } @Override public boolean isSelected(ToolbarItem item) { return false; } @Override public void itemSelected(ToolbarItem item) { if (item instanceof LogisimToolbarItem) { ((LogisimToolbarItem) item).doAction(); } } // // ChangeListener methods // public void stateChanged(ChangeEvent e) { Simulator sim = project.getSimulator(); boolean running = sim != null && sim.isRunning(); boolean ticking = sim != null && sim.isTicking(); simEnable.setIcon(running ? "simstop.png" : "simplay.png"); simEnable.setToolTip(running ? Strings.getter("simulateDisableStepsTip") : Strings.getter("simulateEnableStepsTip")); tickEnable.setIcon(ticking ? "simtstop.png" : "simtplay.png"); tickEnable.setToolTip(ticking ? Strings.getter("simulateDisableTicksTip") : Strings.getter("simulateEnableTicksTip")); fireToolbarAppearanceChanged(); } } logisim-2.7.1/src/com/cburch/logisim/gui/main/SimulationExplorer.java0000644000175000017500000000561211532066764025576 0ustar vincentvincent/* Copyright (c) 2011, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.main; import java.awt.BorderLayout; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.tree.TreePath; import com.cburch.draw.toolbar.Toolbar; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.circuit.Simulator; import com.cburch.logisim.proj.Project; import com.cburch.logisim.proj.ProjectEvent; import com.cburch.logisim.proj.ProjectListener; class SimulationExplorer extends JPanel implements ProjectListener, MouseListener { private Project project; private SimulationTreeModel model; private JTree tree; SimulationExplorer(Project proj, MenuListener menu) { super(new BorderLayout()); this.project = proj; SimulationToolbarModel toolbarModel = new SimulationToolbarModel(proj, menu); Toolbar toolbar = new Toolbar(toolbarModel); add(toolbar, BorderLayout.NORTH); model = new SimulationTreeModel(proj.getSimulator().getCircuitState()); model.setCurrentView(project.getCircuitState()); tree = new JTree(model); tree.setCellRenderer(new SimulationTreeRenderer()); tree.addMouseListener(this); tree.setToggleClickCount(3); add(new JScrollPane(tree), BorderLayout.CENTER); proj.addProjectListener(this); } // // ProjectListener methods // public void projectChanged(ProjectEvent event) { int action = event.getAction(); if (action == ProjectEvent.ACTION_SET_STATE) { Simulator sim = project.getSimulator(); CircuitState root = sim.getCircuitState(); if (model.getRootState() != root) { model = new SimulationTreeModel(root); tree.setModel(model); } model.setCurrentView(project.getCircuitState()); TreePath path = model.mapToPath(project.getCircuitState()); if (path != null) { tree.scrollPathToVisible(path); } } } // // MouseListener methods // // // MouseListener methods // public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mousePressed(MouseEvent e) { requestFocus(); checkForPopup(e); } public void mouseReleased(MouseEvent e) { checkForPopup(e); } private void checkForPopup(MouseEvent e) { if (e.isPopupTrigger()) { ; // do nothing } } public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { TreePath path = tree.getPathForLocation(e.getX(), e.getY()); if (path != null) { Object last = path.getLastPathComponent(); if (last instanceof SimulationTreeCircuitNode) { SimulationTreeCircuitNode node; node = (SimulationTreeCircuitNode) last; project.setCircuitState(node.getCircuitState()); } } } } } logisim-2.7.1/src/com/cburch/logisim/gui/main/SelectionSave.java0000644000175000017500000000440511446034540024463 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.main; import java.util.Collection; import java.util.HashSet; import com.cburch.logisim.comp.Component; class SelectionSave { public static SelectionSave create(Selection sel) { SelectionSave save = new SelectionSave(); Collection lifted = sel.getFloatingComponents(); if (!lifted.isEmpty()) { save.floating = lifted.toArray(new Component[lifted.size()]); } Collection selected = sel.getAnchoredComponents(); if (!selected.isEmpty()) { save.anchored = selected.toArray(new Component[selected.size()]); } return save; } private Component[] floating; private Component[] anchored; private SelectionSave() { } public Component[] getFloatingComponents() { return floating; } public Component[] getAnchoredComponents() { return anchored; } public boolean isSame(Selection sel) { return isSame(floating, sel.getFloatingComponents()) && isSame(anchored, sel.getAnchoredComponents()); } @Override public boolean equals(Object other) { if (other instanceof SelectionSave) { SelectionSave o = (SelectionSave) other; return isSame(this.floating, o.floating) && isSame(this.anchored, o.anchored); } else { return false; } } @Override public int hashCode() { int ret = 0; if (floating != null) { for (Component c : floating) ret += c.hashCode(); } if (anchored != null) { for (Component c : anchored) ret += c.hashCode(); } return ret; } private static boolean isSame(Component[] save, Collection sel) { if (save == null) { return sel.isEmpty(); } else { return toSet(save).equals(sel); } } private static boolean isSame(Component[] a, Component[] b) { if (a == null || a.length == 0) { return b == null || b.length == 0; } else if (b == null || b.length == 0) { return false; } else if (a.length != b.length) { return false; } else { return toSet(a).equals(toSet(b)); } } private static HashSet toSet(Component[] comps) { HashSet ret = new HashSet(comps.length); for (Component c : comps) ret.add(c); return ret; } } logisim-2.7.1/src/com/cburch/logisim/gui/main/SelectionBase.java0000644000175000017500000002235611541661274024452 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.main; import java.awt.Graphics; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.HashSet; import java.util.HashMap; import java.util.Map; import java.util.Set; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.CircuitMutation; import com.cburch.logisim.circuit.Wire; import com.cburch.logisim.comp.Component; import com.cburch.logisim.comp.ComponentFactory; import com.cburch.logisim.comp.EndData; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Location; import com.cburch.logisim.proj.Project; import com.cburch.logisim.util.CollectionUtil; class SelectionBase { static final Set NO_COMPONENTS = Collections.emptySet(); Project proj; private ArrayList listeners = new ArrayList(); final HashSet selected = new HashSet(); // of selected Components in circuit final HashSet lifted = new HashSet(); // of selected Components removed final HashSet suppressHandles = new HashSet(); // of Components final Set unionSet = CollectionUtil.createUnmodifiableSetUnion(selected, lifted); private Bounds bounds = Bounds.EMPTY_BOUNDS; private boolean shouldSnap = false; public SelectionBase(Project proj) { this.proj = proj; } // // listener methods // public void addListener(Selection.Listener l) { listeners.add(l); } public void removeListener(Selection.Listener l) { listeners.remove(l); } public void fireSelectionChanged() { bounds = null; computeShouldSnap(); Selection.Event e = new Selection.Event(this); for (Selection.Listener l : listeners) { l.selectionChanged(e); } } // // query methods // public Bounds getBounds() { if (bounds == null) { bounds = computeBounds(unionSet); } return bounds; } public Bounds getBounds(Graphics g) { Iterator it = unionSet.iterator(); if (it.hasNext()) { bounds = it.next().getBounds(g); while (it.hasNext()) { Component comp = it.next(); Bounds bds = comp.getBounds(g); bounds = bounds.add(bds); } } else { bounds = Bounds.EMPTY_BOUNDS; } return bounds; } public boolean shouldSnap() { return shouldSnap; } public boolean hasConflictWhenMoved(int dx, int dy) { return hasConflictTranslated(unionSet, dx, dy, false); } // // action methods // public void add(Component comp) { if (selected.add(comp)) { fireSelectionChanged(); } } public void addAll(Collection comps) { if (selected.addAll(comps)) { fireSelectionChanged(); } } // removes from selection - NOT from circuit void remove(CircuitMutation xn, Component comp) { boolean removed = selected.remove(comp); if (lifted.contains(comp)) { if (xn == null) { throw new IllegalStateException("cannot remove"); } else { lifted.remove(comp); removed = true; xn.add(comp); } } if (removed) { if (shouldSnapComponent(comp)) computeShouldSnap(); fireSelectionChanged(); } } void dropAll(CircuitMutation xn) { if (!lifted.isEmpty()) { xn.addAll(lifted); selected.addAll(lifted); lifted.clear(); } } void clear(CircuitMutation xn) { clear(xn, true); } // removes all from selection - NOT from circuit void clear(CircuitMutation xn, boolean dropLifted) { if (selected.isEmpty() && lifted.isEmpty()) return; if (dropLifted && !lifted.isEmpty()) { xn.addAll(lifted); } selected.clear(); lifted.clear(); shouldSnap = false; bounds = Bounds.EMPTY_BOUNDS; fireSelectionChanged(); } public void setSuppressHandles(Collection toSuppress) { suppressHandles.clear(); if (toSuppress != null) suppressHandles.addAll(toSuppress); } void duplicateHelper(CircuitMutation xn) { HashSet oldSelected = new HashSet(selected); oldSelected.addAll(lifted); pasteHelper(xn, oldSelected); } void pasteHelper(CircuitMutation xn, Collection comps) { clear(xn); Map newLifted = copyComponents(comps); lifted.addAll(newLifted.values()); fireSelectionChanged(); } void deleteAllHelper(CircuitMutation xn) { for (Component comp : selected) { xn.remove(comp); } selected.clear(); lifted.clear(); fireSelectionChanged(); } void translateHelper(CircuitMutation xn, int dx, int dy) { Map selectedAfter = copyComponents(selected, dx, dy); for (Map.Entry entry : selectedAfter.entrySet()) { xn.replace(entry.getKey(), entry.getValue()); } Map liftedAfter = copyComponents(lifted, dx, dy); lifted.clear(); for (Map.Entry entry : liftedAfter.entrySet()) { xn.add(entry.getValue()); selected.add(entry.getValue()); } fireSelectionChanged(); } // // private methods // private void computeShouldSnap() { shouldSnap = false; for (Component comp : unionSet) { if (shouldSnapComponent(comp)) { shouldSnap = true; return; } } } private static boolean shouldSnapComponent(Component comp) { Boolean shouldSnapValue = (Boolean) comp.getFactory().getFeature(ComponentFactory.SHOULD_SNAP, comp.getAttributeSet()); return shouldSnapValue == null ? true : shouldSnapValue.booleanValue(); } private boolean hasConflictTranslated(Collection components, int dx, int dy, boolean selfConflicts) { Circuit circuit = proj.getCurrentCircuit(); if (circuit == null) return false; for (Component comp : components) { if (!(comp instanceof Wire)) { for (EndData endData : comp.getEnds()) { if (endData != null && endData.isExclusive()) { Location endLoc = endData.getLocation().translate(dx, dy); Component conflict = circuit.getExclusive(endLoc); if (conflict != null) { if (selfConflicts || !components.contains(conflict)) return true; } } } Location newLoc = comp.getLocation().translate(dx, dy); Bounds newBounds = comp.getBounds().translate(dx, dy); for (Component comp2 : circuit.getAllContaining(newLoc)) { Bounds bds = comp2.getBounds(); if (bds.equals(newBounds)) { if (selfConflicts || !components.contains(comp2)) return true; } } } } return false; } private static Bounds computeBounds(Collection components) { if (components.isEmpty()) { return Bounds.EMPTY_BOUNDS; } else { Iterator it = components.iterator(); Bounds ret = it.next().getBounds(); while (it.hasNext()) { Component comp = it.next(); Bounds bds = comp.getBounds(); ret = ret.add(bds); } return ret; } } private HashMap copyComponents(Collection components) { // determine translation offset where we can legally place the clipboard int dx; int dy; Bounds bds = computeBounds(components); for (int index = 0; ; index++) { // compute offset to try: We try points along successively larger // squares radiating outward from 0,0 if (index == 0) { dx = 0; dy = 0; } else { int side = 1; while (side * side <= index) side += 2; int offs = index - (side - 2) * (side - 2); dx = side / 2; dy = side / 2; if (offs < side - 1) { // top edge of square dx -= offs; } else if (offs < 2 * (side - 1)) { // left edge offs -= side - 1; dx = -dx; dy -= offs; } else if (offs < 3 * (side - 1)) { // right edge offs -= 2 * (side - 1); dx = -dx + offs; dy = -dy; } else { offs -= 3 * (side - 1); dy = -dy + offs; } dx *= 10; dy *= 10; } if (bds.getX() + dx >= 0 && bds.getY() + dy >= 0 && !hasConflictTranslated(components, dx, dy, true)) { return copyComponents(components, dx, dy); } } } private HashMap copyComponents(Collection components, int dx, int dy) { HashMap ret = new HashMap(); for (Component comp : components) { Location oldLoc = comp.getLocation(); AttributeSet attrs = (AttributeSet) comp.getAttributeSet().clone(); int newX = oldLoc.getX() + dx; int newY = oldLoc.getY() + dy; Object snap = comp.getFactory().getFeature(ComponentFactory.SHOULD_SNAP, attrs); if (snap == null || ((Boolean) snap).booleanValue()) { newX = Canvas.snapXToGrid(newX); newY = Canvas.snapYToGrid(newY); } Location newLoc = Location.create(newX, newY); Component copy = comp.getFactory().createComponent(newLoc, attrs); ret.put(comp, copy); } return ret; } // debugging methods public void print() { System.err.println(" shouldSnap: " + shouldSnap()); //OK boolean hasPrinted = false; for (Component comp : selected) { System.err.println((hasPrinted ? " " : " select: ") //OK + comp + " [" + comp.hashCode() + "]"); hasPrinted = true; } hasPrinted = false; for (Component comp : lifted) { System.err.println((hasPrinted ? " " : " lifted: ") //OK + comp + " [" + comp.hashCode() + "]"); hasPrinted = true; } } } logisim-2.7.1/src/com/cburch/logisim/gui/main/SelectionAttributes.java0000644000175000017500000002154511527307524025724 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.main; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.Wire; import com.cburch.logisim.comp.Component; import com.cburch.logisim.data.AbstractAttributeSet; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeEvent; import com.cburch.logisim.data.AttributeListener; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.proj.Project; import com.cburch.logisim.util.UnmodifiableList; class SelectionAttributes extends AbstractAttributeSet { private static final Attribute[] EMPTY_ATTRIBUTES = new Attribute[0]; private static final Object[] EMPTY_VALUES = new Object[0]; private class Listener implements Selection.Listener, AttributeListener { public void selectionChanged(Selection.Event e) { updateList(true); } public void attributeListChanged(AttributeEvent e) { if (listening) { updateList(false); } } public void attributeValueChanged(AttributeEvent e) { if (listening) { updateList(false); } } } private Canvas canvas; private Selection selection; private Listener listener; private boolean listening; private Set selected; private Attribute[] attrs; private boolean[] readOnly; private Object[] values; private List> attrsView; public SelectionAttributes(Canvas canvas, Selection selection) { this.canvas = canvas; this.selection = selection; this.listener = new Listener(); this.listening = true; this.selected = Collections.emptySet(); this.attrs = EMPTY_ATTRIBUTES; this.values = EMPTY_VALUES; this.attrsView = Collections.emptyList(); selection.addListener(listener); updateList(true); setListening(true); } public Selection getSelection() { return selection; } void setListening(boolean value) { if (listening != value) { listening = value; if (value) { updateList(false); } } } private void updateList(boolean ignoreIfSelectionSame) { Selection sel = selection; Set oldSel = selected; Set newSel; if (sel == null) newSel = Collections.emptySet(); else newSel = createSet(sel.getComponents()); if (haveSameElements(newSel, oldSel)) { if (ignoreIfSelectionSame) return; newSel = oldSel; } else { for (Component o : oldSel) { if (!newSel.contains(o)) { o.getAttributeSet().removeAttributeListener(listener); } } for (Component o : newSel) { if (!oldSel.contains(o)) { o.getAttributeSet().addAttributeListener(listener); } } } LinkedHashMap,Object> attrMap = computeAttributes(newSel); boolean same = isSame(attrMap, this.attrs, this.values); if (same) { if (newSel != oldSel) this.selected = newSel; } else { Attribute[] oldAttrs = this.attrs; Object[] oldValues = this.values; Attribute[] newAttrs = new Attribute[attrMap.size()]; Object[] newValues = new Object[newAttrs.length]; boolean[] newReadOnly = new boolean[newAttrs.length]; int i = -1; for (Map.Entry,Object> entry : attrMap.entrySet()) { i++; newAttrs[i] = entry.getKey(); newValues[i] = entry.getValue(); newReadOnly[i] = computeReadOnly(newSel, newAttrs[i]); } if (newSel != oldSel) this.selected = newSel; this.attrs = newAttrs; this.attrsView = new UnmodifiableList>(newAttrs); this.values = newValues; this.readOnly = newReadOnly; boolean listSame = oldAttrs != null && oldAttrs.length == newAttrs.length; if (listSame) { for (i = 0; i < oldAttrs.length; i++) { if (!oldAttrs[i].equals(newAttrs[i])) { listSame = false; break; } } } if (listSame) { for (i = 0; i < oldValues.length; i++) { Object oldVal = oldValues[i]; Object newVal = newValues[i]; boolean sameVals = oldVal == null ? newVal == null : oldVal.equals(newVal); if (!sameVals) { @SuppressWarnings("unchecked") Attribute attr = (Attribute) oldAttrs[i]; fireAttributeValueChanged(attr, newVal); } } } else { fireAttributeListChanged(); } } } private static Set createSet(Collection comps) { boolean includeWires = true; for (Component comp : comps) { if (!(comp instanceof Wire)) { includeWires = false; break; } } if (includeWires) { return new HashSet(comps); } else { HashSet ret = new HashSet(); for (Component comp : comps) { if (!(comp instanceof Wire)) ret.add(comp); } return ret; } } private static boolean haveSameElements(Collection a, Collection b) { if (a == null) { return b == null ? true : b.size() == 0; } else if (b == null) { return a.size() == 0; } else if (a.size() != b.size()) { return false; } else { for (Component item : a) { if (!b.contains(item)) return false; } return true; } } private static LinkedHashMap,Object> computeAttributes(Collection newSel) { LinkedHashMap,Object> attrMap; attrMap = new LinkedHashMap,Object>(); Iterator sit = newSel.iterator(); if (sit.hasNext()) { AttributeSet first = sit.next().getAttributeSet(); for (Attribute attr : first.getAttributes()) { @SuppressWarnings("unchecked") Attribute attrObj = (Attribute) attr; attrMap.put(attrObj, first.getValue(attr)); } while (sit.hasNext()) { AttributeSet next = sit.next().getAttributeSet(); Iterator> ait = attrMap.keySet().iterator(); while (ait.hasNext()) { Attribute attr = ait.next(); if (next.containsAttribute(attr)) { Object v = attrMap.get(attr); if (v != null && !v.equals(next.getValue(attr))) { attrMap.put(attr, null); } } else { ait.remove(); } } } } return attrMap; } private static boolean isSame(LinkedHashMap,Object> attrMap, Attribute[] oldAttrs, Object[] oldValues) { if (oldAttrs.length != attrMap.size()) { return false; } else { int j = -1; for (Map.Entry,Object> entry : attrMap.entrySet()) { j++; Attribute a = entry.getKey(); if (!oldAttrs[j].equals(a) || j >= oldValues.length) return false; Object ov = oldValues[j]; Object nv = entry.getValue(); if (ov == null ? nv != null : !ov.equals(nv)) return false; } return true; } } private static boolean computeReadOnly(Collection sel, Attribute attr) { for (Component comp : sel) { AttributeSet attrs = comp.getAttributeSet(); if (attrs.isReadOnly(attr)) return true; } return false; } @Override protected void copyInto(AbstractAttributeSet dest) { throw new UnsupportedOperationException("SelectionAttributes.copyInto"); } @Override public List> getAttributes() { Circuit circ = canvas.getCircuit(); if (selected.isEmpty() && circ != null) { return circ.getStaticAttributes().getAttributes(); } else { return attrsView; } } @Override public boolean isReadOnly(Attribute attr) { Project proj = canvas.getProject(); Circuit circ = canvas.getCircuit(); if (!proj.getLogisimFile().contains(circ)) { return true; } else if (selected.isEmpty() && circ != null) { return circ.getStaticAttributes().isReadOnly(attr); } else { int i = findIndex(attr); boolean[] ro = readOnly; return i >= 0 && i < ro.length ? ro[i] : true; } } @Override public boolean isToSave(Attribute attr) { return false; } @Override public V getValue(Attribute attr) { Circuit circ = canvas.getCircuit(); if (selected.isEmpty() && circ != null) { return circ.getStaticAttributes().getValue(attr); } else { int i = findIndex(attr); Object[] vs = values; @SuppressWarnings("unchecked") V ret = (V) (i >= 0 && i < vs.length ? vs[i] : null); return ret; } } @Override public void setValue(Attribute attr, V value) { Circuit circ = canvas.getCircuit(); if (selected.isEmpty() && circ != null) { circ.getStaticAttributes().setValue(attr, value); } else { int i = findIndex(attr); Object[] vs = values; if (i >= 0 && i < vs.length) { vs[i] = value; for (Component comp : selected) { comp.getAttributeSet().setValue(attr, value); } } } } private int findIndex(Attribute attr) { if (attr == null) return -1; Attribute[] as = attrs; for (int i = 0; i < as.length; i++) { if (attr.equals(as[i])) return i; } return -1; } } logisim-2.7.1/src/com/cburch/logisim/gui/main/SelectionActions.java0000644000175000017500000003215511541271674025177 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.main; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import javax.swing.JOptionPane; import javax.swing.JScrollPane; import javax.swing.JTextArea; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.CircuitMutation; import com.cburch.logisim.circuit.CircuitTransaction; import com.cburch.logisim.circuit.CircuitTransactionResult; import com.cburch.logisim.circuit.ReplacementMap; import com.cburch.logisim.circuit.SubcircuitFactory; import com.cburch.logisim.circuit.Wire; import com.cburch.logisim.comp.Component; import com.cburch.logisim.comp.ComponentFactory; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Location; import com.cburch.logisim.file.LogisimFile; import com.cburch.logisim.proj.Action; import com.cburch.logisim.proj.JoinedAction; import com.cburch.logisim.proj.Project; import com.cburch.logisim.tools.AddTool; import com.cburch.logisim.tools.Library; import com.cburch.logisim.tools.Tool; public class SelectionActions { private SelectionActions() { } public static Action drop(Selection sel, Collection comps) { HashSet floating = new HashSet(sel.getFloatingComponents()); HashSet anchored = new HashSet(sel.getAnchoredComponents()); ArrayList toDrop = new ArrayList(); ArrayList toIgnore = new ArrayList(); for (Component comp : comps) { if (floating.contains(comp)) { toDrop.add(comp); } else if (anchored.contains(comp)) { toDrop.add(comp); toIgnore.add(comp); } } int numDrop = toDrop.size() - toIgnore.size(); if (numDrop == 0) { for (Component comp : toIgnore) { sel.remove(null, comp); } return null; } else { return new Drop(sel, toDrop, numDrop); } } public static Action dropAll(Selection sel) { return drop(sel, sel.getComponents()); } public static Action clear(Selection sel) { return new Delete(sel); } public static Action duplicate(Selection sel) { return new Duplicate(sel); } public static Action cut(Selection sel) { return new Cut(sel); } public static Action copy(Selection sel) { return new Copy(sel); } public static Action pasteMaybe(Project proj, Selection sel) { HashMap replacements = getReplacementMap(proj); return new Paste(sel, replacements); } public static Action translate(Selection sel, int dx, int dy, ReplacementMap repl) { return new Translate(sel, dx, dy, repl); } private static class Drop extends Action { private Selection sel; private Component[] drops; private int numDrops; private SelectionSave before; private CircuitTransaction xnReverse; Drop(Selection sel, Collection toDrop, int numDrops) { this.sel = sel; this.drops = new Component[toDrop.size()]; toDrop.toArray(this.drops); this.numDrops = numDrops; this.before = SelectionSave.create(sel); } @Override public String getName() { return numDrops == 1 ? Strings.get("dropComponentAction") : Strings.get("dropComponentsAction"); } @Override public void doIt(Project proj) { Circuit circuit = proj.getCurrentCircuit(); CircuitMutation xn = new CircuitMutation(circuit); for (Component comp : drops) { sel.remove(xn, comp); } CircuitTransactionResult result = xn.execute(); xnReverse = result.getReverseTransaction(); } @Override public void undo(Project proj) { xnReverse.execute(); } @Override public boolean shouldAppendTo(Action other) { Action last; if (other instanceof JoinedAction) last = ((JoinedAction) other).getLastAction(); else last = other; SelectionSave otherAfter = null; if (last instanceof Paste) { otherAfter = ((Paste) last).after; } else if (last instanceof Duplicate) { otherAfter = ((Duplicate) last).after; } return otherAfter != null && otherAfter.equals(this.before); } } private static class Delete extends Action { private Selection sel; private CircuitTransaction xnReverse; Delete(Selection sel) { this.sel = sel; } @Override public String getName() { return Strings.get("deleteSelectionAction"); } @Override public void doIt(Project proj) { Circuit circuit = proj.getCurrentCircuit(); CircuitMutation xn = new CircuitMutation(circuit); sel.deleteAllHelper(xn); CircuitTransactionResult result = xn.execute(); xnReverse = result.getReverseTransaction(); } @Override public void undo(Project proj) { xnReverse.execute(); } } private static class Duplicate extends Action { private Selection sel; private CircuitTransaction xnReverse; private SelectionSave after; Duplicate(Selection sel) { this.sel = sel; } @Override public String getName() { return Strings.get("duplicateSelectionAction"); } @Override public void doIt(Project proj) { Circuit circuit = proj.getCurrentCircuit(); CircuitMutation xn = new CircuitMutation(circuit); sel.duplicateHelper(xn); CircuitTransactionResult result = xn.execute(); xnReverse = result.getReverseTransaction(); after = SelectionSave.create(sel); } @Override public void undo(Project proj) { xnReverse.execute(); } } private static class Cut extends Action { private Action first; private Action second; Cut(Selection sel) { first = new Copy(sel); second = new Delete(sel); } @Override public String getName() { return Strings.get("cutSelectionAction"); } @Override public void doIt(Project proj) { first.doIt(proj); second.doIt(proj); } @Override public void undo(Project proj) { second.undo(proj); first.undo(proj); } } private static class Copy extends Action { private Selection sel; private Clipboard oldClip; Copy(Selection sel) { this.sel = sel; } @Override public boolean isModification() { return false; } @Override public String getName() { return Strings.get("copySelectionAction"); } @Override public void doIt(Project proj) { oldClip = Clipboard.get(); Clipboard.set(sel, sel.getAttributeSet()); } @Override public void undo(Project proj) { Clipboard.set(oldClip); } } private static HashMap getReplacementMap(Project proj) { HashMap replMap; replMap = new HashMap(); LogisimFile file = proj.getLogisimFile(); ArrayList libs = new ArrayList(); libs.add(file); libs.addAll(file.getLibraries()); ArrayList dropped = null; Clipboard clip = Clipboard.get(); Collection comps = clip.getComponents(); HashMap factoryReplacements; factoryReplacements = new HashMap(); for (Component comp : comps) { if (comp instanceof Wire) continue; ComponentFactory compFactory = comp.getFactory(); ComponentFactory copyFactory = findComponentFactory(compFactory, libs, false); if (factoryReplacements.containsKey(compFactory)) { copyFactory = factoryReplacements.get(compFactory); } else if (copyFactory == null) { ComponentFactory candidate = findComponentFactory(compFactory, libs, true); if (candidate == null) { if (dropped == null) { dropped = new ArrayList(); } dropped.add(compFactory.getDisplayName()); } else { String msg = Strings.get("pasteCloneQuery", compFactory.getName()); Object[] opts = { Strings.get("pasteCloneReplace"), Strings.get("pasteCloneIgnore"), Strings.get("pasteCloneCancel") }; int select = JOptionPane.showOptionDialog(proj.getFrame(), msg, Strings.get("pasteCloneTitle"), 0, JOptionPane.QUESTION_MESSAGE, null, opts, opts[0]); if (select == 0) { copyFactory = candidate; } else if (select == 1) { copyFactory = null; } else { return null; } factoryReplacements.put(compFactory, copyFactory); } } if (copyFactory == null) { replMap.put(comp, null); } else if (copyFactory != compFactory) { Location copyLoc = comp.getLocation(); AttributeSet copyAttrs = (AttributeSet) comp.getAttributeSet().clone(); Component copy = copyFactory.createComponent(copyLoc, copyAttrs); replMap.put(comp, copy); } } if (dropped != null) { Collections.sort(dropped); StringBuilder droppedStr = new StringBuilder(); droppedStr.append(Strings.get("pasteDropMessage")); String curName = dropped.get(0); int curCount = 1; int lines = 1; for (int i = 1; i <= dropped.size(); i++) { String nextName = i == dropped.size() ? "" : dropped.get(i); if (nextName.equals(curName)) { curCount++; } else { lines++; droppedStr.append("\n "); droppedStr.append(curName); if (curCount > 1) { droppedStr.append(" \u00d7 " + curCount); } curName = nextName; curCount = 1; } } lines = Math.max(3, Math.min(7, lines)); JTextArea area = new JTextArea(lines, 60); area.setEditable(false); area.setText(droppedStr.toString()); area.setCaretPosition(0); JScrollPane areaPane = new JScrollPane(area); JOptionPane.showMessageDialog(proj.getFrame(), areaPane, Strings.get("pasteDropTitle"), JOptionPane.WARNING_MESSAGE); } return replMap; } private static ComponentFactory findComponentFactory(ComponentFactory factory, ArrayList libs, boolean acceptNameMatch) { String name = factory.getName(); for (Library lib : libs) { for (Tool tool : lib.getTools()) { if (tool instanceof AddTool) { AddTool addTool = (AddTool) tool; if (name.equals(addTool.getName())) { ComponentFactory fact = addTool.getFactory(true); if (acceptNameMatch) { return fact; } else if (fact == factory) { return fact; } else if (fact.getClass() == factory.getClass() && !(fact instanceof SubcircuitFactory)) { return fact; } } } } } return null; } private static class Paste extends Action { private Selection sel; private CircuitTransaction xnReverse; private SelectionSave after; private HashMap componentReplacements; Paste(Selection sel, HashMap replacements) { this.sel = sel; this.componentReplacements = replacements; } @Override public String getName() { return Strings.get("pasteClipboardAction"); } @Override public void doIt(Project proj) { Clipboard clip = Clipboard.get(); Circuit circuit = proj.getCurrentCircuit(); CircuitMutation xn = new CircuitMutation(circuit); Collection comps = clip.getComponents(); Collection toAdd = computeAdditions(comps); if (toAdd.size() > 0) { sel.pasteHelper(xn, toAdd); CircuitTransactionResult result = xn.execute(); xnReverse = result.getReverseTransaction(); after = SelectionSave.create(sel); } else { xnReverse = null; } } private Collection computeAdditions(Collection comps) { HashMap replMap = componentReplacements; ArrayList toAdd = new ArrayList(comps.size()); for (Iterator it = comps.iterator(); it.hasNext(); ) { Component comp = it.next(); if (replMap.containsKey(comp)) { Component repl = replMap.get(comp); if (repl != null) { toAdd.add(repl); } } else { toAdd.add(comp); } } return toAdd; } @Override public void undo(Project proj) { if (xnReverse != null) { xnReverse.execute(); } } } private static class Translate extends Action { private Selection sel; private int dx; private int dy; private ReplacementMap replacements; private SelectionSave before; private CircuitTransaction xnReverse; Translate(Selection sel, int dx, int dy, ReplacementMap replacements) { this.sel = sel; this.dx = dx; this.dy = dy; this.replacements = replacements; this.before = SelectionSave.create(sel); } @Override public String getName() { return Strings.get("moveSelectionAction"); } @Override public void doIt(Project proj) { Circuit circuit = proj.getCurrentCircuit(); CircuitMutation xn = new CircuitMutation(circuit); sel.translateHelper(xn, dx, dy); if (replacements != null) { xn.replace(replacements); } CircuitTransactionResult result = xn.execute(); xnReverse = result.getReverseTransaction(); } @Override public void undo(Project proj) { xnReverse.execute(); } @Override public boolean shouldAppendTo(Action other) { Action last; if (other instanceof JoinedAction) last = ((JoinedAction) other).getLastAction(); else last = other; SelectionSave otherAfter = null; if (last instanceof Paste) { otherAfter = ((Paste) last).after; } else if (last instanceof Duplicate) { otherAfter = ((Duplicate) last).after; } return otherAfter != null && otherAfter.equals(this.before); } } } logisim-2.7.1/src/com/cburch/logisim/gui/main/Selection.java0000644000175000017500000001602311527054456023653 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.main; import java.awt.Color; import java.awt.Graphics; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Set; import java.util.WeakHashMap; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.CircuitEvent; import com.cburch.logisim.circuit.CircuitListener; import com.cburch.logisim.circuit.ReplacementMap; import com.cburch.logisim.comp.Component; import com.cburch.logisim.comp.ComponentDrawContext; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Location; import com.cburch.logisim.proj.Action; import com.cburch.logisim.proj.Project; import com.cburch.logisim.proj.ProjectEvent; import com.cburch.logisim.proj.ProjectListener; import com.cburch.logisim.tools.CustomHandles; public class Selection extends SelectionBase { public static class Event { Object source; Event(Object source) { this.source = source; } public Object getSource() { return source; } } public static interface Listener { public void selectionChanged(Selection.Event event); } private class MyListener implements ProjectListener, CircuitListener { private WeakHashMap savedSelections; MyListener() { savedSelections = new WeakHashMap(); } public void projectChanged(ProjectEvent event) { int type = event.getAction(); if (type == ProjectEvent.ACTION_START) { SelectionSave save = SelectionSave.create(Selection.this); savedSelections.put((Action) event.getData(), save); } else if (type == ProjectEvent.ACTION_COMPLETE) { SelectionSave save = savedSelections.get(event.getData()); if (save != null && save.isSame(Selection.this)) { savedSelections.remove(event.getData()); } } else if (type == ProjectEvent.ACTION_MERGE) { SelectionSave save = savedSelections.get(event.getOldData()); savedSelections.put((Action) event.getData(), save); } else if (type == ProjectEvent.UNDO_COMPLETE) { Circuit circ = event.getProject().getCurrentCircuit(); Action act = (Action) event.getData(); SelectionSave save = savedSelections.get(act); if (save != null) { lifted.clear(); selected.clear(); for (int i = 0; i < 2; i++) { Component[] cs; if (i == 0) cs = save.getFloatingComponents(); else cs = save.getAnchoredComponents(); if (cs != null) { for (Component c : cs) { if (circ.contains(c)) { selected.add(c); } else { lifted.add(c); } } } } fireSelectionChanged(); } } } public void circuitChanged(CircuitEvent event) { if (event.getAction() == CircuitEvent.TRANSACTION_DONE) { Circuit circuit = event.getCircuit(); ReplacementMap repl = event.getResult().getReplacementMap(circuit); boolean change = false; ArrayList oldAnchored; oldAnchored = new ArrayList(getComponents()); for (Component comp : oldAnchored) { Collection replacedBy = repl.get(comp); if (replacedBy != null) { change = true; selected.remove(comp); lifted.remove(comp); for (Component add : replacedBy) { if (circuit.contains(add)) { selected.add(add); } else { lifted.add(add); } } } } if (change) { fireSelectionChanged(); } } } } private MyListener myListener; private boolean isVisible = true; private SelectionAttributes attrs; public Selection(Project proj, Canvas canvas) { super(proj); myListener = new MyListener(); attrs = new SelectionAttributes(canvas, this); proj.addProjectListener(myListener); proj.addCircuitListener(myListener); } // // query methods // public boolean isEmpty() { return selected.isEmpty() && lifted.isEmpty(); } public AttributeSet getAttributeSet() { return attrs; } @Override public boolean equals(Object other) { if (!(other instanceof Selection)) return false; Selection otherSelection = (Selection) other; return this.selected.equals(otherSelection.selected) && this.lifted.equals(otherSelection.lifted); } public Set getComponents() { return unionSet; } public Collection getAnchoredComponents() { return selected; } public Collection getFloatingComponents() { return lifted; } public Collection getComponentsContaining(Location query) { HashSet ret = new HashSet(); for (Component comp : unionSet) { if (comp.contains(query)) ret.add(comp); } return ret; } public Collection getComponentsContaining(Location query, Graphics g) { HashSet ret = new HashSet(); for (Component comp : unionSet) { if (comp.contains(query, g)) ret.add(comp); } return ret; } public Collection getComponentsWithin(Bounds bds) { HashSet ret = new HashSet(); for (Component comp : unionSet) { if (bds.contains(comp.getBounds())) ret.add(comp); } return ret; } public Collection getComponentsWithin(Bounds bds, Graphics g) { HashSet ret = new HashSet(); for (Component comp : unionSet) { if (bds.contains(comp.getBounds(g))) ret.add(comp); } return ret; } public boolean contains(Component comp) { return unionSet.contains(comp); } // // graphics methods // public void draw(ComponentDrawContext context, Set hidden) { Graphics g = context.getGraphics(); for (Component c : lifted) { if (!hidden.contains(c)) { Location loc = c.getLocation(); Graphics g_new = g.create(); context.setGraphics(g_new); c.getFactory().drawGhost(context, Color.GRAY, loc.getX(), loc.getY(), c.getAttributeSet()); g_new.dispose(); } } for (Component comp : unionSet) { if (!suppressHandles.contains(comp) && !hidden.contains(comp)) { Graphics g_new = g.create(); context.setGraphics(g_new); CustomHandles handler = (CustomHandles) comp.getFeature(CustomHandles.class); if (handler == null) { context.drawHandles(comp); } else { handler.drawHandles(context); } g_new.dispose(); } } context.setGraphics(g); } public void drawGhostsShifted(ComponentDrawContext context, int dx, int dy) { if (shouldSnap()) { dx = Canvas.snapXToGrid(dx); dy = Canvas.snapYToGrid(dy); } Graphics g = context.getGraphics(); for (Component comp : unionSet) { AttributeSet attrs = comp.getAttributeSet(); Location loc = comp.getLocation(); int x = loc.getX() + dx; int y = loc.getY() + dy; context.setGraphics(g.create()); comp.getFactory().drawGhost(context, Color.gray, x, y, attrs); context.getGraphics().dispose(); } context.setGraphics(g); } @Override public void print() { System.err.println(" isVisible: " + isVisible); //OK super.print(); } } logisim-2.7.1/src/com/cburch/logisim/gui/main/ProjectToolbarModel.java0000644000175000017500000000522011532066764025636 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.main; import java.util.List; import com.cburch.draw.toolbar.AbstractToolbarModel; import com.cburch.draw.toolbar.ToolbarItem; import com.cburch.draw.toolbar.ToolbarSeparator; import com.cburch.logisim.gui.menu.LogisimMenuBar; import com.cburch.logisim.util.UnmodifiableList; class ProjectToolbarModel extends AbstractToolbarModel implements MenuListener.EnabledListener { private Frame frame; private LogisimToolbarItem itemAdd; private LogisimToolbarItem itemUp; private LogisimToolbarItem itemDown; private LogisimToolbarItem itemDelete; private LogisimToolbarItem itemLayout; private LogisimToolbarItem itemAppearance; private List items; public ProjectToolbarModel(Frame frame, MenuListener menu) { this.frame = frame; itemAdd = new LogisimToolbarItem(menu, "projadd.gif", LogisimMenuBar.ADD_CIRCUIT, Strings.getter("projectAddCircuitTip")); itemUp = new LogisimToolbarItem(menu, "projup.gif", LogisimMenuBar.MOVE_CIRCUIT_UP, Strings.getter("projectMoveCircuitUpTip")); itemDown = new LogisimToolbarItem(menu, "projdown.gif", LogisimMenuBar.MOVE_CIRCUIT_DOWN, Strings.getter("projectMoveCircuitDownTip")); itemDelete = new LogisimToolbarItem(menu, "projdel.gif", LogisimMenuBar.REMOVE_CIRCUIT, Strings.getter("projectRemoveCircuitTip")); itemLayout = new LogisimToolbarItem(menu, "projlayo.gif", LogisimMenuBar.EDIT_LAYOUT, Strings.getter("projectEditLayoutTip")); itemAppearance = new LogisimToolbarItem(menu, "projapp.gif", LogisimMenuBar.EDIT_APPEARANCE, Strings.getter("projectEditAppearanceTip")); items = UnmodifiableList.create(new ToolbarItem[] { itemAdd, itemUp, itemDown, itemDelete, new ToolbarSeparator(4), itemLayout, itemAppearance, }); menu.addEnabledListener(this); } @Override public List getItems() { return items; } @Override public boolean isSelected(ToolbarItem item) { String view = frame.getEditorView(); if (item == itemLayout) { return view.equals(Frame.EDIT_LAYOUT); } else if (item == itemAppearance) { return view.equals(Frame.EDIT_APPEARANCE); } else { return false; } } @Override public void itemSelected(ToolbarItem item) { if (item instanceof LogisimToolbarItem) { ((LogisimToolbarItem) item).doAction(); } } // // EnabledListener methods // public void menuEnableChanged(MenuListener source) { fireToolbarAppearanceChanged(); } } logisim-2.7.1/src/com/cburch/logisim/gui/main/ProjectExplorer.java0000644000175000017500000004365411532066764025070 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.main; import java.awt.Color; import java.awt.Graphics; import java.awt.Point; import java.awt.dnd.DnDConstants; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.swing.AbstractAction; import javax.swing.ActionMap; import javax.swing.Icon; import javax.swing.InputMap; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPopupMenu; import javax.swing.JTree; import javax.swing.KeyStroke; import javax.swing.ToolTipManager; import javax.swing.event.TreeModelEvent; import javax.swing.event.TreeModelListener; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.DefaultTreeSelectionModel; import javax.swing.tree.TreeModel; import javax.swing.tree.TreePath; import javax.swing.tree.TreeSelectionModel; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.CircuitEvent; import com.cburch.logisim.circuit.CircuitListener; import com.cburch.logisim.circuit.SubcircuitFactory; import com.cburch.logisim.comp.ComponentFactory; import com.cburch.logisim.comp.ComponentDrawContext; import com.cburch.logisim.file.LibraryEventSource; import com.cburch.logisim.file.LogisimFile; import com.cburch.logisim.file.LibraryEvent; import com.cburch.logisim.file.LibraryListener; import com.cburch.logisim.prefs.AppPreferences; import com.cburch.logisim.proj.Project; import com.cburch.logisim.proj.ProjectEvent; import com.cburch.logisim.proj.ProjectListener; import com.cburch.logisim.tools.AddTool; import com.cburch.logisim.tools.Library; import com.cburch.logisim.tools.Tool; import com.cburch.logisim.util.JTreeDragController; import com.cburch.logisim.util.JTreeUtil; import com.cburch.logisim.util.LocaleListener; import com.cburch.logisim.util.LocaleManager; public class ProjectExplorer extends JTree implements LocaleListener { private static final String DIRTY_MARKER = "*"; static final Color MAGNIFYING_INTERIOR = new Color(200, 200, 255, 64); public static class Event { private TreePath path; private Event(TreePath path) { this.path = path; } public TreePath getTreePath() { return path; } public Object getTarget() { return path == null ? null : path.getLastPathComponent(); } } public static interface Listener { public void selectionChanged(Event event); public void doubleClicked(Event event); public void moveRequested(Event event, AddTool dragged, AddTool target); public void deleteRequested(Event event); public JPopupMenu menuRequested(Event event); } private class MyModel implements TreeModel { ArrayList listeners = new ArrayList(); public void addTreeModelListener(TreeModelListener l) { listeners.add(l); } public void removeTreeModelListener(TreeModelListener l) { listeners.remove(l); } public Object getRoot() { return proj.getLogisimFile(); } private List getChildren(Object parent) { if (parent == proj.getLogisimFile()) { return ((Library) parent).getElements(); } else if (parent instanceof Library) { return ((Library) parent).getTools(); } else { return Collections.EMPTY_LIST; } } public Object getChild(Object parent, int index) { return getChildren(parent).get(index); } public int getChildCount(Object parent) { return getChildren(parent).size(); } public int getIndexOfChild(Object parent, Object query) { if (parent == null || query == null) return -1; int index = -1; for (Object child : getChildren(parent)) { index++; if (child == query) return index; } return -1; } public boolean isLeaf(Object node) { return node != proj && !(node instanceof Library); } public void valueForPathChanged(TreePath path, Object value) { TreeModelEvent e = new TreeModelEvent(ProjectExplorer.this, path); fireNodesChanged(Collections.singletonList(e)); } private void fireNodesChanged(List events) { for (TreeModelEvent e : events) { for (TreeModelListener l : listeners) { l.treeNodesChanged(e); } } } void fireStructureChanged() { TreeModelEvent e = new TreeModelEvent(ProjectExplorer.this, new Object[] { model.getRoot() }); for (TreeModelListener l : listeners) { l.treeStructureChanged(e); } ProjectExplorer.this.repaint(); } private ArrayList findPaths(Object value) { ArrayList ret = new ArrayList(); ArrayList stack = new ArrayList(); findPathsSub(value, getRoot(), stack, ret); return ret; } private void findPathsSub(Object value, Object node, ArrayList stack, ArrayList paths) { stack.add(node); if (node == value) { TreePath path = new TreePath(stack.toArray()); paths.add(new TreeModelEvent(ProjectExplorer.this, path)); } for (Object child : getChildren(node)) { findPathsSub(value, child, stack, paths); } stack.remove(stack.size() - 1); } private ArrayList findPathsForTools(Library value) { ArrayList ret = new ArrayList(); ArrayList stack = new ArrayList(); findPathsForToolsSub(value, getRoot(), stack, ret); return ret; } private void findPathsForToolsSub(Library value, Object node, ArrayList stack, ArrayList paths) { stack.add(node); if (node == value) { TreePath path = new TreePath(stack.toArray()); List toolList = value.getTools(); int[] indices = new int[toolList.size()]; Object[] tools = new Object[indices.length]; for (int i = 0; i < indices.length; i++) { indices[i] = i; tools[i] = toolList.get(i); } paths.add(new TreeModelEvent(ProjectExplorer.this, path, indices, tools)); } for (Object child : getChildren(node)) { findPathsForToolsSub(value, child, stack, paths); } stack.remove(stack.size() - 1); } } private class ToolIcon implements Icon { Tool tool; Circuit circ = null; ToolIcon(Tool tool) { this.tool = tool; if (tool instanceof AddTool) { ComponentFactory fact = ((AddTool) tool).getFactory(false); if (fact instanceof SubcircuitFactory) { circ = ((SubcircuitFactory) fact).getSubcircuit(); } } } public int getIconHeight() { return 20; } public int getIconWidth() { return 20; } public void paintIcon(java.awt.Component c, Graphics g, int x, int y) { // draw halo if appropriate if (tool == haloedTool && AppPreferences.ATTRIBUTE_HALO.getBoolean()) { g.setColor(Canvas.HALO_COLOR); g.fillRoundRect(x, y, 20, 20, 10, 10); g.setColor(Color.BLACK); } // draw tool icon Graphics gIcon = g.create(); ComponentDrawContext context = new ComponentDrawContext(ProjectExplorer.this, null, null, g, gIcon); tool.paintIcon(context, x, y); gIcon.dispose(); // draw magnifying glass if appropriate if (circ == proj.getCurrentCircuit()) { int tx = x + 13; int ty = y + 13; int[] xp = { tx - 1, x + 18, x + 20, tx + 1 }; int[] yp = { ty + 1, y + 20, y + 18, ty - 1 }; g.setColor(MAGNIFYING_INTERIOR); g.fillOval(x + 5, y + 5, 10, 10); g.setColor(Color.BLACK); g.drawOval(x + 5, y + 5, 10, 10); g.fillPolygon(xp, yp, xp.length); } } } private class MyCellRenderer extends DefaultTreeCellRenderer { @Override public java.awt.Component getTreeCellRendererComponent( JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { java.awt.Component ret; ret = super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); if (ret instanceof JComponent) { JComponent comp = (JComponent) ret; comp.setToolTipText(null); } if (value instanceof Tool) { Tool tool = (Tool) value; if (ret instanceof JLabel) { ((JLabel) ret).setText(tool.getDisplayName()); ((JLabel) ret).setIcon(new ToolIcon(tool)); ((JLabel) ret).setToolTipText(tool.getDescription()); } } else if (value instanceof Library) { if (ret instanceof JLabel) { Library lib = (Library) value; String text = lib.getDisplayName(); if (lib.isDirty()) text += DIRTY_MARKER; ((JLabel) ret).setText(text); } } return ret; } } private class MySelectionModel extends DefaultTreeSelectionModel { @Override public void addSelectionPath(TreePath path) { if (isPathValid(path)) super.addSelectionPath(path); } @Override public void setSelectionPath(TreePath path) { if (isPathValid(path)) super.setSelectionPath(path); } @Override public void addSelectionPaths(TreePath[] paths) { paths = getValidPaths(paths); if (paths != null) super.addSelectionPaths(paths); } @Override public void setSelectionPaths(TreePath[] paths) { paths = getValidPaths(paths); if (paths != null) super.setSelectionPaths(paths); } private TreePath[] getValidPaths(TreePath[] paths) { int count = 0; for (int i = 0; i < paths.length; i++) { if (isPathValid(paths[i])) ++count; } if (count == 0) { return null; } else if (count == paths.length) { return paths; } else { TreePath[] ret = new TreePath[count]; int j = 0; for (int i = 0; i < paths.length; i++) { if (isPathValid(paths[i])) ret[j++] = paths[i]; } return ret; } } private boolean isPathValid(TreePath path) { if (path == null || path.getPathCount() > 3) return false; Object last = path.getLastPathComponent(); return last instanceof Tool; } } private class DragController implements JTreeDragController { public boolean canPerformAction(JTree targetTree, Object draggedNode, int action, Point location) { TreePath pathTarget = targetTree.getPathForLocation(location.x, location.y); if (pathTarget == null) { targetTree.setSelectionPath(null); return false; } targetTree.setSelectionPath(pathTarget); if (action == DnDConstants.ACTION_COPY) { return false; } else if (action == DnDConstants.ACTION_MOVE) { Object targetNode = pathTarget.getLastPathComponent(); return canMove(draggedNode, targetNode); } else { return false; } } public boolean executeDrop(JTree targetTree, Object draggedNode, Object targetNode, int action) { if (action == DnDConstants.ACTION_COPY) { return false; } else if (action == DnDConstants.ACTION_MOVE) { if (canMove(draggedNode, targetNode)) { if (draggedNode == targetNode) return true; listener.moveRequested(new Event(null), (AddTool) draggedNode, (AddTool) targetNode); return true; } else { return false; } } else { return false; } } private boolean canMove(Object draggedNode, Object targetNode) { if (listener == null) return false; if (!(draggedNode instanceof AddTool) || !(targetNode instanceof AddTool)) return false; LogisimFile file = proj.getLogisimFile(); AddTool dragged = (AddTool) draggedNode; AddTool target = (AddTool) targetNode; int draggedIndex = file.getTools().indexOf(dragged); int targetIndex = file.getTools().indexOf(target); if (targetIndex < 0 || draggedIndex < 0) return false; return true; } } private class DeleteAction extends AbstractAction { public void actionPerformed(ActionEvent event) { TreePath path = getSelectionPath(); if (listener != null && path != null && path.getPathCount() == 2) { listener.deleteRequested(new Event(path)); } ProjectExplorer.this.requestFocus(); } } private class MyListener implements MouseListener, TreeSelectionListener, ProjectListener, LibraryListener, CircuitListener, PropertyChangeListener { // // MouseListener methods // public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mousePressed(MouseEvent e) { ProjectExplorer.this.requestFocus(); checkForPopup(e); } public void mouseReleased(MouseEvent e) { checkForPopup(e); } private void checkForPopup(MouseEvent e) { if (e.isPopupTrigger()) { TreePath path = getPathForLocation(e.getX(), e.getY()); if (path != null && listener != null) { JPopupMenu menu = listener.menuRequested(new Event(path)); if (menu != null) { menu.show(ProjectExplorer.this, e.getX(), e.getY()); } } } } public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { TreePath path = getPathForLocation(e.getX(), e.getY()); if (path != null && listener != null) { listener.doubleClicked(new Event(path)); } } } // // TreeSelectionListener methods // public void valueChanged(TreeSelectionEvent e) { TreePath path = e.getNewLeadSelectionPath(); if (listener != null) { listener.selectionChanged(new Event(path)); } } // // project/library file/circuit listener methods // public void projectChanged(ProjectEvent event) { int act = event.getAction(); if (act == ProjectEvent.ACTION_SET_TOOL) { TreePath path = getSelectionPath(); if (path != null && path.getLastPathComponent() != event.getTool()) { clearSelection(); } } else if (act == ProjectEvent.ACTION_SET_FILE) { setFile(event.getLogisimFile()); } else if (act == ProjectEvent.ACTION_SET_CURRENT) { ProjectExplorer.this.repaint(); } } public void libraryChanged(LibraryEvent event) { int act = event.getAction(); if (act == LibraryEvent.ADD_TOOL) { if (event.getData() instanceof AddTool) { AddTool tool = (AddTool) event.getData(); if (tool.getFactory() instanceof SubcircuitFactory) { SubcircuitFactory fact = (SubcircuitFactory) tool.getFactory(); fact.getSubcircuit().addCircuitListener(this); } } } else if (act == LibraryEvent.REMOVE_TOOL) { if (event.getData() instanceof AddTool) { AddTool tool = (AddTool) event.getData(); if (tool.getFactory() instanceof SubcircuitFactory) { SubcircuitFactory fact = (SubcircuitFactory) tool.getFactory(); fact.getSubcircuit().removeCircuitListener(this); } } } else if (act == LibraryEvent.ADD_LIBRARY) { if (event.getData() instanceof LibraryEventSource) { ((LibraryEventSource) event.getData()).addLibraryListener(subListener); } } else if (act == LibraryEvent.REMOVE_LIBRARY) { if (event.getData() instanceof LibraryEventSource) { ((LibraryEventSource) event.getData()).removeLibraryListener(subListener); } } Library lib = event.getSource(); switch (act) { case LibraryEvent.DIRTY_STATE: case LibraryEvent.SET_NAME: model.fireNodesChanged(model.findPaths(lib)); break; case LibraryEvent.MOVE_TOOL: model.fireNodesChanged(model.findPathsForTools(lib)); break; case LibraryEvent.SET_MAIN: break; default: model.fireStructureChanged(); } } public void circuitChanged(CircuitEvent event) { int act = event.getAction(); if (act == CircuitEvent.ACTION_SET_NAME) { model.fireStructureChanged(); // The following almost works - but the labels aren't made // bigger, so you get "..." behavior with longer names. // model.fireNodesChanged(model.findPaths(event.getCircuit())); } } private void setFile(LogisimFile lib) { model.fireStructureChanged(); expandRow(0); for (Circuit circ : lib.getCircuits()) { circ.addCircuitListener(this); } subListener = new SubListener(); // create new one so that old listeners die away for (Library sublib : lib.getLibraries()) { if (sublib instanceof LibraryEventSource) { ((LibraryEventSource) sublib).addLibraryListener(subListener); } } } // // PropertyChangeListener methods // public void propertyChange(PropertyChangeEvent event) { if (AppPreferences.GATE_SHAPE.isSource(event)) { repaint(); } } } private class SubListener implements LibraryListener { public void libraryChanged(LibraryEvent event) { model.fireStructureChanged(); } } private Project proj; private MyListener myListener = new MyListener(); private SubListener subListener = new SubListener(); private MyModel model = new MyModel(); private MyCellRenderer renderer = new MyCellRenderer(); private DeleteAction deleteAction = new DeleteAction(); private Listener listener = null; private Tool haloedTool = null; public ProjectExplorer(Project proj) { super(); this.proj = proj; setModel(model); setRootVisible(true); addMouseListener(myListener); ToolTipManager.sharedInstance().registerComponent(this); MySelectionModel selector = new MySelectionModel(); selector.setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); setSelectionModel(selector); setCellRenderer(renderer); JTreeUtil.configureDragAndDrop(this, new DragController()); addTreeSelectionListener(myListener); InputMap imap = getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); imap.put(KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, 0), deleteAction); ActionMap amap = getActionMap(); amap.put(deleteAction, deleteAction); proj.addProjectListener(myListener); proj.addLibraryListener(myListener); AppPreferences.GATE_SHAPE.addPropertyChangeListener(myListener); myListener.setFile(proj.getLogisimFile()); LocaleManager.addLocaleListener(this); } public Tool getSelectedTool() { TreePath path = getSelectionPath(); if (path == null) return null; Object last = path.getLastPathComponent(); return last instanceof Tool ? (Tool) last : null; } public void setListener(Listener value) { listener = value; } public void setHaloedTool(Tool t) { if (haloedTool == t) return; haloedTool = t; repaint(); } public void localeChanged() { model.fireStructureChanged(); } } logisim-2.7.1/src/com/cburch/logisim/gui/main/Print.java0000644000175000017500000001743311447117142023021 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.main; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.Rectangle; import java.awt.print.PageFormat; import java.awt.print.Printable; import java.awt.print.PrinterException; import java.awt.print.PrinterJob; import java.util.Collection; import java.util.Collections; import java.util.List; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextField; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.comp.Component; import com.cburch.logisim.comp.ComponentDrawContext; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.proj.Project; import com.cburch.logisim.util.StringUtil; public class Print { private Print() { } public static void doPrint(Project proj) { CircuitJList list = new CircuitJList(proj, true); Frame frame = proj.getFrame(); if (list.getModel().getSize() == 0) { JOptionPane.showMessageDialog(proj.getFrame(), Strings.get("printEmptyCircuitsMessage"), Strings.get("printEmptyCircuitsTitle"), JOptionPane.YES_NO_OPTION); return; } ParmsPanel parmsPanel = new ParmsPanel(list); int action = JOptionPane.showConfirmDialog(frame, parmsPanel, Strings.get("printParmsTitle"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); if (action != JOptionPane.OK_OPTION) return; List circuits = list.getSelectedCircuits(); if (circuits.isEmpty()) return; PageFormat format = new PageFormat(); Printable print = new MyPrintable(proj, circuits, parmsPanel.getHeader(), parmsPanel.getRotateToFit(), parmsPanel.getPrinterView()); PrinterJob job = PrinterJob.getPrinterJob(); job.setPrintable(print, format); if (job.printDialog() == false) return; try { job.print(); } catch (PrinterException e) { JOptionPane.showMessageDialog(proj.getFrame(), StringUtil.format(Strings.get("printError"), e.toString()), Strings.get("printErrorTitle"), JOptionPane.ERROR_MESSAGE); } } private static class ParmsPanel extends JPanel { JCheckBox rotateToFit; JCheckBox printerView; JTextField header; GridBagLayout gridbag; GridBagConstraints gbc; ParmsPanel(JList list) { // set up components rotateToFit = new JCheckBox(); rotateToFit.setSelected(true); printerView = new JCheckBox(); printerView.setSelected(true); header = new JTextField(20); header.setText("%n (%p of %P)"); // set up panel gridbag = new GridBagLayout(); gbc = new GridBagConstraints(); setLayout(gridbag); // now add components into panel gbc.gridy = 0; gbc.gridx = GridBagConstraints.RELATIVE; gbc.anchor = GridBagConstraints.NORTHWEST; gbc.insets = new Insets(5, 0, 5, 0); gbc.fill = GridBagConstraints.NONE; addGb(new JLabel(Strings.get("labelCircuits") + " ")); gbc.fill = GridBagConstraints.HORIZONTAL; addGb(new JScrollPane(list)); gbc.fill = GridBagConstraints.NONE; gbc.gridy++; addGb(new JLabel(Strings.get("labelHeader") + " ")); addGb(header); gbc.gridy++; addGb(new JLabel(Strings.get("labelRotateToFit") + " ")); addGb(rotateToFit); gbc.gridy++; addGb(new JLabel(Strings.get("labelPrinterView") + " ")); addGb(printerView); } private void addGb(JComponent comp) { gridbag.setConstraints(comp, gbc); add(comp); } boolean getRotateToFit() { return rotateToFit.isSelected(); } boolean getPrinterView() { return printerView.isSelected(); } String getHeader() { return header.getText(); } } private static class MyPrintable implements Printable { Project proj; List circuits; String header; boolean rotateToFit; boolean printerView; MyPrintable(Project proj, List circuits, String header, boolean rotateToFit, boolean printerView) { this.proj = proj; this.circuits = circuits; this.header = header; this.rotateToFit = rotateToFit; this.printerView = printerView; } public int print(Graphics base, PageFormat format, int pageIndex) { if (pageIndex >= circuits.size()) return Printable.NO_SUCH_PAGE; Circuit circ = circuits.get(pageIndex); CircuitState circState = proj.getCircuitState(circ); Graphics g = base.create(); Graphics2D g2 = g instanceof Graphics2D ? (Graphics2D) g : null; FontMetrics fm = g.getFontMetrics(); String head = (header != null && !header.equals("")) ? format(header, pageIndex + 1, circuits.size(), circ.getName()) : null; int headHeight = (head == null ? 0 : fm.getHeight()); // Compute image size double imWidth = format.getImageableWidth(); double imHeight = format.getImageableHeight(); // Correct coordinate system for page, including // translation and possible rotation. Bounds bds = circ.getBounds(g).expand(4); double scale = Math.min(imWidth / bds.getWidth(), (imHeight - headHeight) / bds.getHeight()); if (g2 != null) { g2.translate(format.getImageableX(), format.getImageableY()); if (rotateToFit && scale < 1.0 / 1.1) { double scale2 = Math.min(imHeight / bds.getWidth(), (imWidth - headHeight) / bds.getHeight()); if (scale2 >= scale * 1.1) { // will rotate scale = scale2; if (imHeight > imWidth) { // portrait -> landscape g2.translate(0, imHeight); g2.rotate(-Math.PI / 2); } else { // landscape -> portrait g2.translate(imWidth, 0); g2.rotate(Math.PI / 2); } double t = imHeight; imHeight = imWidth; imWidth = t; } } } // Draw the header line if appropriate if (head != null) { g.drawString(head, (int) Math.round((imWidth - fm.stringWidth(head)) / 2), fm.getAscent()); if (g2 != null) { imHeight -= headHeight; g2.translate(0, headHeight); } } // Now change coordinate system for circuit, including // translation and possible scaling if (g2 != null) { if (scale < 1.0) { g2.scale(scale, scale); imWidth /= scale; imHeight /= scale; } double dx = Math.max(0.0, (imWidth - bds.getWidth()) / 2); g2.translate(-bds.getX() + dx, -bds.getY()); } // Ensure that the circuit is eligible to be drawn Rectangle clip = g.getClipBounds(); clip.add(bds.getX(), bds.getY()); clip.add(bds.getX() + bds.getWidth(), bds.getY() + bds.getHeight()); g.setClip(clip); // And finally draw the circuit onto the page ComponentDrawContext context = new ComponentDrawContext( proj.getFrame().getCanvas(), circ, circState, base, g, printerView); Collection noComps = Collections.emptySet(); circ.draw(context, noComps); g.dispose(); return Printable.PAGE_EXISTS; } } private static String format(String header, int index, int max, String circName) { int mark = header.indexOf('%'); if (mark < 0) return header; StringBuilder ret = new StringBuilder(); int start = 0; for (; mark >= 0 && mark + 1 < header.length(); start = mark + 2, mark = header.indexOf('%', start)) { ret.append(header.substring(start, mark)); switch (header.charAt(mark + 1)) { case 'n': ret.append(circName); break; case 'p': ret.append("" + index); break; case 'P': ret.append("" + max); break; case '%': ret.append("%"); break; default: ret.append("%" + header.charAt(mark + 1)); } } if (start < header.length()) { ret.append(header.substring(start)); } return ret.toString(); } } logisim-2.7.1/src/com/cburch/logisim/gui/main/MenuListener.java0000644000175000017500000003017511532066764024345 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.main; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.List; import com.cburch.draw.model.CanvasModelEvent; import com.cburch.draw.model.CanvasModelListener; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.circuit.Simulator; import com.cburch.logisim.file.LibraryEvent; import com.cburch.logisim.file.LibraryListener; import com.cburch.logisim.file.LogisimFile; import com.cburch.logisim.gui.appear.RevertAppearanceAction; import com.cburch.logisim.gui.generic.CardPanel; import com.cburch.logisim.gui.menu.LogisimMenuItem; import com.cburch.logisim.gui.menu.ProjectCircuitActions; import com.cburch.logisim.gui.menu.LogisimMenuBar; import com.cburch.logisim.gui.menu.SimulateListener; import com.cburch.logisim.proj.Project; import com.cburch.logisim.proj.ProjectEvent; import com.cburch.logisim.proj.ProjectListener; class MenuListener { interface EnabledListener { public void menuEnableChanged(MenuListener source); } private class FileListener implements ActionListener { private void register() { menubar.addActionListener(LogisimMenuBar.EXPORT_IMAGE, this); menubar.addActionListener(LogisimMenuBar.PRINT, this); } public void actionPerformed(ActionEvent event) { Object src = event.getSource(); Project proj = frame.getProject(); if (src == LogisimMenuBar.EXPORT_IMAGE) { ExportImage.doExport(proj); } else if (src == LogisimMenuBar.PRINT) { Print.doPrint(proj); } } } private class EditListener implements ActionListener, EditHandler.Listener { private EditHandler handler = null; private void setHandler(EditHandler value) { handler = value; value.setListener(this); handler.computeEnabled(); } private void register() { menubar.addActionListener(LogisimMenuBar.CUT, this); menubar.addActionListener(LogisimMenuBar.COPY, this); menubar.addActionListener(LogisimMenuBar.PASTE, this); menubar.addActionListener(LogisimMenuBar.DELETE, this); menubar.addActionListener(LogisimMenuBar.DUPLICATE, this); menubar.addActionListener(LogisimMenuBar.SELECT_ALL, this); menubar.addActionListener(LogisimMenuBar.RAISE, this); menubar.addActionListener(LogisimMenuBar.LOWER, this); menubar.addActionListener(LogisimMenuBar.RAISE_TOP, this); menubar.addActionListener(LogisimMenuBar.LOWER_BOTTOM, this); menubar.addActionListener(LogisimMenuBar.ADD_CONTROL, this); menubar.addActionListener(LogisimMenuBar.REMOVE_CONTROL, this); if (handler != null) handler.computeEnabled(); } public void actionPerformed(ActionEvent e) { Object src = e.getSource(); EditHandler h = handler; if (src == LogisimMenuBar.CUT) { if (h != null) h.cut(); } else if (src == LogisimMenuBar.COPY) { if (h != null) h.copy(); } else if (src == LogisimMenuBar.PASTE) { if (h != null) h.paste(); } else if (src == LogisimMenuBar.DELETE) { if (h != null) h.delete(); } else if (src == LogisimMenuBar.DUPLICATE) { if (h != null) h.duplicate(); } else if (src == LogisimMenuBar.SELECT_ALL) { if (h != null) h.selectAll(); } else if (src == LogisimMenuBar.RAISE) { if (h != null) h.raise(); } else if (src == LogisimMenuBar.LOWER) { if (h != null) h.lower(); } else if (src == LogisimMenuBar.RAISE_TOP) { if (h != null) h.raiseTop(); } else if (src == LogisimMenuBar.LOWER_BOTTOM) { if (h != null) h.lowerBottom(); } else if (src == LogisimMenuBar.ADD_CONTROL) { if (h != null) h.addControlPoint(); } else if (src == LogisimMenuBar.REMOVE_CONTROL) { if (h != null) h.removeControlPoint(); } } public void enableChanged(EditHandler handler, LogisimMenuItem action, boolean value) { if (handler == this.handler) { menubar.setEnabled(action, value); fireEnableChanged(); } } } class ProjectMenuListener implements ProjectListener, LibraryListener, ActionListener, PropertyChangeListener, CanvasModelListener { void register() { Project proj = frame.getProject(); if (proj == null) { return; } proj.addProjectListener(this); proj.addLibraryListener(this); frame.addPropertyChangeListener(Frame.EDITOR_VIEW, this); frame.addPropertyChangeListener(Frame.EXPLORER_VIEW, this); Circuit circ = proj.getCurrentCircuit(); if (circ != null) { circ.getAppearance().addCanvasModelListener(this); } menubar.addActionListener(LogisimMenuBar.ADD_CIRCUIT, this); menubar.addActionListener(LogisimMenuBar.MOVE_CIRCUIT_UP, this); menubar.addActionListener(LogisimMenuBar.MOVE_CIRCUIT_DOWN, this); menubar.addActionListener(LogisimMenuBar.SET_MAIN_CIRCUIT, this); menubar.addActionListener(LogisimMenuBar.REMOVE_CIRCUIT, this); menubar.addActionListener(LogisimMenuBar.EDIT_LAYOUT, this); menubar.addActionListener(LogisimMenuBar.EDIT_APPEARANCE, this); menubar.addActionListener(LogisimMenuBar.VIEW_TOOLBOX, this); menubar.addActionListener(LogisimMenuBar.VIEW_SIMULATION, this); menubar.addActionListener(LogisimMenuBar.REVERT_APPEARANCE, this); menubar.addActionListener(LogisimMenuBar.ANALYZE_CIRCUIT, this); menubar.addActionListener(LogisimMenuBar.CIRCUIT_STATS, this); computeEnabled(); } public void modelChanged(CanvasModelEvent event) { computeRevertEnabled(); } public void projectChanged(ProjectEvent event) { int action = event.getAction(); if (action == ProjectEvent.ACTION_SET_CURRENT) { Circuit old = (Circuit) event.getOldData(); if (old != null) { old.getAppearance().removeCanvasModelListener(this); } Circuit circ = (Circuit) event.getData(); if (circ != null) { circ.getAppearance().addCanvasModelListener(this); } computeEnabled(); } else if (action == ProjectEvent.ACTION_SET_FILE) { computeEnabled(); } } public void libraryChanged(LibraryEvent event) { computeEnabled(); } public void actionPerformed(ActionEvent event) { Object src = event.getSource(); Project proj = frame.getProject(); Circuit cur = proj == null ? null : proj.getCurrentCircuit(); if (src == LogisimMenuBar.ADD_CIRCUIT) { ProjectCircuitActions.doAddCircuit(proj); } else if (src == LogisimMenuBar.MOVE_CIRCUIT_UP) { ProjectCircuitActions.doMoveCircuit(proj, cur, -1); } else if (src == LogisimMenuBar.MOVE_CIRCUIT_DOWN) { ProjectCircuitActions.doMoveCircuit(proj, cur, 1); } else if (src == LogisimMenuBar.SET_MAIN_CIRCUIT) { ProjectCircuitActions.doSetAsMainCircuit(proj, cur); } else if (src == LogisimMenuBar.REMOVE_CIRCUIT) { ProjectCircuitActions.doRemoveCircuit(proj, cur); } else if (src == LogisimMenuBar.EDIT_LAYOUT) { frame.setEditorView(Frame.EDIT_LAYOUT); } else if (src == LogisimMenuBar.EDIT_APPEARANCE) { frame.setEditorView(Frame.EDIT_APPEARANCE); } else if (src == LogisimMenuBar.VIEW_TOOLBOX) { frame.setExplorerView(Frame.VIEW_TOOLBOX); } else if (src == LogisimMenuBar.VIEW_SIMULATION) { frame.setExplorerView(Frame.VIEW_SIMULATION); } else if (src == LogisimMenuBar.REVERT_APPEARANCE) { proj.doAction(new RevertAppearanceAction(cur)); } else if (src == LogisimMenuBar.ANALYZE_CIRCUIT) { ProjectCircuitActions.doAnalyze(proj, cur); } else if (src == LogisimMenuBar.CIRCUIT_STATS) { StatisticsDialog.show(frame, proj.getLogisimFile(), cur); } } private void computeEnabled() { Project proj = frame.getProject(); LogisimFile file = proj.getLogisimFile(); Circuit cur = proj.getCurrentCircuit(); int curIndex = file.getCircuits().indexOf(cur); boolean isProjectCircuit = curIndex >= 0; String editorView = frame.getEditorView(); String explorerView = frame.getExplorerView(); boolean canSetMain = false; boolean canMoveUp = false; boolean canMoveDown = false; boolean canRemove = false; boolean canRevert = false; boolean viewAppearance = editorView.equals(Frame.EDIT_APPEARANCE); boolean viewLayout = editorView.equals(Frame.EDIT_LAYOUT); boolean viewToolbox = explorerView.equals(Frame.VIEW_TOOLBOX); boolean viewSimulation = explorerView.equals(Frame.VIEW_SIMULATION); if (isProjectCircuit) { List tools = proj.getLogisimFile().getTools(); canSetMain = proj.getLogisimFile().getMainCircuit() != cur; canMoveUp = curIndex > 0; canMoveDown = curIndex < tools.size() - 1; canRemove = tools.size() > 1; canRevert = viewAppearance && !cur.getAppearance().isDefaultAppearance(); } menubar.setEnabled(LogisimMenuBar.ADD_CIRCUIT, true); menubar.setEnabled(LogisimMenuBar.MOVE_CIRCUIT_UP, canMoveUp); menubar.setEnabled(LogisimMenuBar.MOVE_CIRCUIT_DOWN, canMoveDown); menubar.setEnabled(LogisimMenuBar.SET_MAIN_CIRCUIT, canSetMain); menubar.setEnabled(LogisimMenuBar.REMOVE_CIRCUIT, canRemove); menubar.setEnabled(LogisimMenuBar.VIEW_TOOLBOX, !viewToolbox); menubar.setEnabled(LogisimMenuBar.VIEW_SIMULATION, !viewSimulation); menubar.setEnabled(LogisimMenuBar.EDIT_LAYOUT, !viewLayout); menubar.setEnabled(LogisimMenuBar.EDIT_APPEARANCE, !viewAppearance); menubar.setEnabled(LogisimMenuBar.REVERT_APPEARANCE, canRevert); menubar.setEnabled(LogisimMenuBar.ANALYZE_CIRCUIT, true); menubar.setEnabled(LogisimMenuBar.CIRCUIT_STATS, true); fireEnableChanged(); } private void computeRevertEnabled() { // do this separately since it can happen rather often Project proj = frame.getProject(); LogisimFile file = proj.getLogisimFile(); Circuit cur = proj.getCurrentCircuit(); boolean isProjectCircuit = file.contains(cur); boolean viewAppearance = frame.getEditorView().equals(Frame.EDIT_APPEARANCE); boolean canRevert = isProjectCircuit && viewAppearance && !cur.getAppearance().isDefaultAppearance(); boolean oldValue = menubar.isEnabled(LogisimMenuBar.REVERT_APPEARANCE); if (canRevert != oldValue) { menubar.setEnabled(LogisimMenuBar.REVERT_APPEARANCE, canRevert); fireEnableChanged(); } } public void propertyChange(PropertyChangeEvent e) { computeEnabled(); } } class SimulateMenuListener implements ProjectListener, SimulateListener { void register() { Project proj = frame.getProject(); proj.addProjectListener(this); menubar.setSimulateListener(this); menubar.setCircuitState(proj.getSimulator(), proj.getCircuitState()); } public void projectChanged(ProjectEvent event) { if (event.getAction() == ProjectEvent.ACTION_SET_STATE) { menubar.setCircuitState(frame.getProject().getSimulator(), frame.getProject().getCircuitState()); } } public void stateChangeRequested(Simulator sim, CircuitState state) { if (state != null) frame.getProject().setCircuitState(state); } } private Frame frame; private LogisimMenuBar menubar; private ArrayList listeners; private FileListener fileListener = new FileListener(); private EditListener editListener = new EditListener(); private ProjectMenuListener projectListener = new ProjectMenuListener(); private SimulateMenuListener simulateListener = new SimulateMenuListener(); public MenuListener(Frame frame, LogisimMenuBar menubar) { this.frame = frame; this.menubar = menubar; this.listeners = new ArrayList(); } LogisimMenuBar getMenuBar() { return menubar; } public void register(CardPanel mainPanel) { fileListener.register(); editListener.register(); projectListener.register(); simulateListener.register(); } public void setEditHandler(EditHandler handler) { editListener.setHandler(handler); } public void addEnabledListener(EnabledListener listener) { listeners.add(listener); } public void removeEnabledListener(EnabledListener listener) { listeners.remove(listener); } public void doAction(LogisimMenuItem item) { menubar.doAction(item); } public boolean isEnabled(LogisimMenuItem item) { return menubar.isEnabled(item); } private void fireEnableChanged() { for (EnabledListener listener : listeners) { listener.menuEnableChanged(this); } } } logisim-2.7.1/src/com/cburch/logisim/gui/main/LogisimToolbarItem.java0000644000175000017500000000432411532066764025475 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.main; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Component; import java.awt.Composite; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import javax.swing.Icon; import com.cburch.draw.toolbar.ToolbarItem; import com.cburch.logisim.gui.menu.LogisimMenuItem; import com.cburch.logisim.util.Icons; import com.cburch.logisim.util.StringGetter; class LogisimToolbarItem implements ToolbarItem { private MenuListener menu; private Icon icon; private LogisimMenuItem action; private StringGetter toolTip; public LogisimToolbarItem(MenuListener menu, String iconName, LogisimMenuItem action, StringGetter toolTip) { this.menu = menu; this.icon = Icons.getIcon(iconName); this.action = action; this.toolTip = toolTip; } public void setIcon(String iconName) { this.icon = Icons.getIcon(iconName); } public void setToolTip(StringGetter toolTip) { this.toolTip = toolTip; } public void doAction() { if (menu != null && menu.isEnabled(action)) { menu.doAction(action); } } public boolean isSelectable() { return menu != null && menu.isEnabled(action); } public void paintIcon(Component destination, Graphics g) { if (!isSelectable() && g instanceof Graphics2D) { Composite c = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f); ((Graphics2D) g).setComposite(c); } if (icon == null) { g.setColor(new Color(255, 128, 128)); g.fillRect(4, 4, 8, 8); g.setColor(Color.BLACK); g.drawLine(4, 4, 12, 12); g.drawLine(4, 12, 12, 4); g.drawRect(4, 4, 8, 8); } else { icon.paintIcon(destination, g, 0, 1); } } public String getToolTip() { if (toolTip != null) { return toolTip.get(); } else { return null; } } public Dimension getDimension(Object orientation) { if (icon == null) { return new Dimension(16, 16); } else { int w = icon.getIconWidth(); int h = icon.getIconHeight(); return new Dimension(w, h + 2); } } } logisim-2.7.1/src/com/cburch/logisim/gui/main/LayoutToolbarModel.java0000644000175000017500000001306211455470044025502 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.main; import java.awt.Component; import java.awt.Graphics; import java.awt.Color; import java.awt.Dimension; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import com.cburch.draw.toolbar.AbstractToolbarModel; import com.cburch.draw.toolbar.ToolbarItem; import com.cburch.draw.toolbar.ToolbarSeparator; import com.cburch.logisim.comp.ComponentDrawContext; import com.cburch.logisim.data.AttributeEvent; import com.cburch.logisim.data.AttributeListener; import com.cburch.logisim.file.LogisimFile; import com.cburch.logisim.file.ToolbarData; import com.cburch.logisim.prefs.AppPreferences; import com.cburch.logisim.proj.Project; import com.cburch.logisim.proj.ProjectEvent; import com.cburch.logisim.proj.ProjectListener; import com.cburch.logisim.tools.Tool; import com.cburch.logisim.util.InputEventUtil; import java.util.ArrayList; import java.util.Collections; import java.util.List; class LayoutToolbarModel extends AbstractToolbarModel { private class ToolItem implements ToolbarItem { private Tool tool; ToolItem(Tool tool) { this.tool = tool; } public boolean isSelectable() { return true; } public void paintIcon(Component destination, Graphics g) { // draw halo if (tool == haloedTool && AppPreferences.ATTRIBUTE_HALO.getBoolean()) { g.setColor(Canvas.HALO_COLOR); g.fillRect(1, 1, 22, 22); } // draw tool icon g.setColor(Color.BLACK); Graphics g_copy = g.create(); ComponentDrawContext c = new ComponentDrawContext(destination, null, null, g, g_copy); tool.paintIcon(c, 2, 2); g_copy.dispose(); } public String getToolTip() { String ret = tool.getDescription(); int index = 1; for (ToolbarItem item : items) { if (item == this) break; if (item instanceof ToolItem) ++index; } if (index <= 10) { if (index == 10) index = 0; int mask = frame.getToolkit().getMenuShortcutKeyMask(); ret += " (" + InputEventUtil.toKeyDisplayString(mask) + "-" + index + ")"; } return ret; } public Dimension getDimension(Object orientation) { return new Dimension(24, 24); } } private class MyListener implements ProjectListener, AttributeListener, ToolbarData.ToolbarListener, PropertyChangeListener { // // ProjectListener methods // public void projectChanged(ProjectEvent e) { int act = e.getAction(); if (act == ProjectEvent.ACTION_SET_TOOL) { fireToolbarAppearanceChanged(); } else if (act == ProjectEvent.ACTION_SET_FILE) { LogisimFile old = (LogisimFile) e.getOldData(); if (old != null) { ToolbarData data = old.getOptions().getToolbarData(); data.removeToolbarListener(this); data.removeToolAttributeListener(this); } LogisimFile file = (LogisimFile) e.getData(); if (file != null) { ToolbarData data = file.getOptions().getToolbarData(); data.addToolbarListener(this); data.addToolAttributeListener(this); } buildContents(); } } // // ToolbarListener methods // public void toolbarChanged() { buildContents(); } // // AttributeListener methods // public void attributeListChanged(AttributeEvent e) { } public void attributeValueChanged(AttributeEvent e) { fireToolbarAppearanceChanged(); } // // PropertyChangeListener method // public void propertyChange(PropertyChangeEvent event) { if (AppPreferences.GATE_SHAPE.isSource(event)) { fireToolbarAppearanceChanged(); } } } private Frame frame; private Project proj; private MyListener myListener; private List items; private Tool haloedTool; public LayoutToolbarModel(Frame frame, Project proj) { this.frame = frame; this.proj = proj; myListener = new MyListener(); items = Collections.emptyList(); haloedTool = null; buildContents(); // set up listeners ToolbarData data = proj.getOptions().getToolbarData(); data.addToolbarListener(myListener); data.addToolAttributeListener(myListener); AppPreferences.GATE_SHAPE.addPropertyChangeListener(myListener); proj.addProjectListener(myListener); } @Override public List getItems() { return items; } @Override public boolean isSelected(ToolbarItem item) { if (item instanceof ToolItem) { Tool tool = ((ToolItem) item).tool; return tool == proj.getTool(); } else { return false; } } @Override public void itemSelected(ToolbarItem item) { if (item instanceof ToolItem) { Tool tool = ((ToolItem) item).tool; proj.setTool(tool); } } public void setHaloedTool(Tool t) { if (haloedTool != t) { haloedTool = t; fireToolbarAppearanceChanged(); } } private void buildContents() { List oldItems = items; List newItems = new ArrayList(); int pos = -1; ToolbarData data = proj.getLogisimFile().getOptions().getToolbarData(); for (Tool tool : data.getContents()) { ++pos; if (tool == null) { newItems.add(new ToolbarSeparator(4)); } else { ToolbarItem i = findItem(oldItems, tool); if (i == null) { newItems.add(new ToolItem(tool)); } else { newItems.add(i); } } } items = Collections.unmodifiableList(newItems); fireToolbarContentsChanged(); } private static ToolbarItem findItem(List items, Tool tool) { for (ToolbarItem item : items) { if (item instanceof ToolItem) { if (tool == ((ToolItem) item).tool) { return item; } } } return null; } } logisim-2.7.1/src/com/cburch/logisim/gui/main/LayoutEditHandler.java0000644000175000017500000001214011541271702025272 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.main; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.file.LibraryEvent; import com.cburch.logisim.file.LibraryListener; import com.cburch.logisim.gui.menu.LogisimMenuBar; import com.cburch.logisim.proj.Action; import com.cburch.logisim.proj.Project; import com.cburch.logisim.proj.ProjectEvent; import com.cburch.logisim.proj.ProjectListener; import com.cburch.logisim.std.base.Base; import com.cburch.logisim.tools.Library; import com.cburch.logisim.tools.Tool; public class LayoutEditHandler extends EditHandler implements ProjectListener, LibraryListener, PropertyChangeListener { private Frame frame; LayoutEditHandler(Frame frame) { this.frame = frame; Project proj = frame.getProject(); Clipboard.addPropertyChangeListener(Clipboard.contentsProperty, this); proj.addProjectListener(this); proj.addLibraryListener(this); } @Override public void computeEnabled() { Project proj = frame.getProject(); Selection sel = proj == null ? null : proj.getSelection(); boolean selEmpty = (sel == null ? true : sel.isEmpty()); boolean canChange = proj != null && proj.getLogisimFile().contains(proj.getCurrentCircuit()); boolean selectAvailable = false; for (Library lib : proj.getLogisimFile().getLibraries()) { if (lib instanceof Base) selectAvailable = true; } setEnabled(LogisimMenuBar.CUT, !selEmpty && selectAvailable && canChange); setEnabled(LogisimMenuBar.COPY, !selEmpty && selectAvailable); setEnabled(LogisimMenuBar.PASTE, selectAvailable && canChange && !Clipboard.isEmpty()); setEnabled(LogisimMenuBar.DELETE, !selEmpty && selectAvailable && canChange); setEnabled(LogisimMenuBar.DUPLICATE, !selEmpty && selectAvailable && canChange); setEnabled(LogisimMenuBar.SELECT_ALL, selectAvailable); setEnabled(LogisimMenuBar.RAISE, false); setEnabled(LogisimMenuBar.LOWER, false); setEnabled(LogisimMenuBar.RAISE_TOP, false); setEnabled(LogisimMenuBar.LOWER_BOTTOM, false); setEnabled(LogisimMenuBar.ADD_CONTROL, false); setEnabled(LogisimMenuBar.REMOVE_CONTROL, false); } @Override public void cut() { Project proj = frame.getProject(); Selection sel = frame.getCanvas().getSelection(); proj.doAction(SelectionActions.cut(sel)); } @Override public void copy() { Project proj = frame.getProject(); Selection sel = frame.getCanvas().getSelection(); proj.doAction(SelectionActions.copy(sel)); } @Override public void paste() { Project proj = frame.getProject(); Selection sel = frame.getCanvas().getSelection(); selectSelectTool(proj); Action action = SelectionActions.pasteMaybe(proj, sel); if (action != null) { proj.doAction(action); } } @Override public void delete() { Project proj = frame.getProject(); Selection sel = frame.getCanvas().getSelection(); proj.doAction(SelectionActions.clear(sel)); } @Override public void duplicate() { Project proj = frame.getProject(); Selection sel = frame.getCanvas().getSelection(); proj.doAction(SelectionActions.duplicate(sel)); } @Override public void selectAll() { Project proj = frame.getProject(); Selection sel = frame.getCanvas().getSelection(); selectSelectTool(proj); Circuit circ = proj.getCurrentCircuit(); sel.addAll(circ.getWires()); sel.addAll(circ.getNonWires()); proj.repaintCanvas(); } @Override public void raise() { ; // not yet supported in layout mode } @Override public void lower() { ; // not yet supported in layout mode } @Override public void raiseTop() { ; // not yet supported in layout mode } @Override public void lowerBottom() { ; // not yet supported in layout mode } @Override public void addControlPoint() { ; // not yet supported in layout mode } @Override public void removeControlPoint() { ; // not yet supported in layout mode } private void selectSelectTool(Project proj) { for (Library sub : proj.getLogisimFile().getLibraries()) { if (sub instanceof Base) { Base base = (Base) sub; Tool tool = base.getTool("Edit Tool"); if (tool != null) proj.setTool(tool); } } } public void projectChanged(ProjectEvent e) { int action = e.getAction(); if (action == ProjectEvent.ACTION_SET_FILE) { computeEnabled(); } else if (action == ProjectEvent.ACTION_SET_CURRENT) { computeEnabled(); } else if (action == ProjectEvent.ACTION_SELECTION) { computeEnabled(); } } public void libraryChanged(LibraryEvent e) { int action = e.getAction(); if (action == LibraryEvent.ADD_LIBRARY) { computeEnabled(); } else if (action == LibraryEvent.REMOVE_LIBRARY) { computeEnabled(); } } public void propertyChange(PropertyChangeEvent event) { if (event.getPropertyName().equals(Clipboard.contentsProperty)) { computeEnabled(); } } } logisim-2.7.1/src/com/cburch/logisim/gui/main/KeyboardToolSelection.java0000644000175000017500000000306611446034540026165 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.main; import java.awt.event.ActionEvent; import javax.swing.AbstractAction; import javax.swing.ActionMap; import javax.swing.InputMap; import javax.swing.JComponent; import javax.swing.KeyStroke; import com.cburch.draw.toolbar.Toolbar; import com.cburch.draw.toolbar.ToolbarItem; import com.cburch.draw.toolbar.ToolbarModel; public class KeyboardToolSelection extends AbstractAction { public static void register(Toolbar toolbar) { ActionMap amap = toolbar.getActionMap(); InputMap imap = toolbar.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); int mask = toolbar.getToolkit().getMenuShortcutKeyMask(); for (int i = 0; i < 10; i++) { KeyStroke keyStroke = KeyStroke.getKeyStroke((char) ('0' + i), mask); int j = (i == 0 ? 10 : i - 1); KeyboardToolSelection action = new KeyboardToolSelection(toolbar, j); String key = "ToolSelect" + i; amap.put(key, action); imap.put(keyStroke, key); } } private Toolbar toolbar; private int index; public KeyboardToolSelection(Toolbar toolbar, int index) { this.toolbar = toolbar; this.index = index; } public void actionPerformed(ActionEvent event) { ToolbarModel model = toolbar.getToolbarModel(); int i = -1; for (ToolbarItem item : model.getItems()) { if (item.isSelectable()) { i++; if (i == index) { model.itemSelected(item); } } } } } logisim-2.7.1/src/com/cburch/logisim/gui/main/Frame.java0000644000175000017500000004350311535206214022751 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.main; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.Dimension; import java.awt.GraphicsConfiguration; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; import java.awt.IllegalComponentStateException; import java.awt.Point; import java.awt.Rectangle; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.WindowConstants; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import com.cburch.draw.toolbar.Toolbar; import com.cburch.draw.toolbar.ToolbarModel; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.CircuitEvent; import com.cburch.logisim.circuit.CircuitListener; import com.cburch.logisim.comp.Component; import com.cburch.logisim.data.AttributeEvent; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Direction; import com.cburch.logisim.file.LibraryEvent; import com.cburch.logisim.file.LibraryListener; import com.cburch.logisim.gui.appear.AppearanceView; import com.cburch.logisim.gui.generic.AttrTable; import com.cburch.logisim.gui.generic.AttrTableModel; import com.cburch.logisim.gui.generic.BasicZoomModel; import com.cburch.logisim.gui.generic.CanvasPane; import com.cburch.logisim.gui.generic.CardPanel; import com.cburch.logisim.gui.generic.LFrame; import com.cburch.logisim.gui.generic.ZoomControl; import com.cburch.logisim.gui.generic.ZoomModel; import com.cburch.logisim.gui.menu.LogisimMenuBar; import com.cburch.logisim.prefs.AppPreferences; import com.cburch.logisim.proj.Project; import com.cburch.logisim.proj.ProjectActions; import com.cburch.logisim.proj.ProjectEvent; import com.cburch.logisim.proj.ProjectListener; import com.cburch.logisim.proj.Projects; import com.cburch.logisim.tools.Tool; import com.cburch.logisim.util.HorizontalSplitPane; import com.cburch.logisim.util.JFileChoosers; import com.cburch.logisim.util.LocaleListener; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.StringUtil; import com.cburch.logisim.util.VerticalSplitPane; public class Frame extends LFrame implements LocaleListener { public static final String EDITOR_VIEW = "editorView"; public static final String EXPLORER_VIEW = "explorerView"; public static final String EDIT_LAYOUT = "layout"; public static final String EDIT_APPEARANCE = "appearance"; public static final String VIEW_TOOLBOX = "toolbox"; public static final String VIEW_SIMULATION = "simulation"; private static final double[] ZOOM_OPTIONS = { 20, 50, 75, 100, 133, 150, 200, 250, 300, 400 }; class MyProjectListener implements ProjectListener, LibraryListener, CircuitListener, PropertyChangeListener, ChangeListener { public void projectChanged(ProjectEvent event) { int action = event.getAction(); if (action == ProjectEvent.ACTION_SET_FILE) { computeTitle(); proj.setTool(proj.getOptions().getToolbarData().getFirstTool()); placeToolbar(); } else if (action == ProjectEvent.ACTION_SET_CURRENT) { setEditorView(EDIT_LAYOUT); if (appearance != null) { appearance.setCircuit(proj, proj.getCircuitState()); } viewAttributes(proj.getTool()); computeTitle(); } else if (action == ProjectEvent.ACTION_SET_TOOL) { if (attrTable == null) return; // for startup Tool oldTool = (Tool) event.getOldData(); Tool newTool = (Tool) event.getData(); viewAttributes(oldTool, newTool, false); } } public void libraryChanged(LibraryEvent e) { if (e.getAction() == LibraryEvent.SET_NAME) { computeTitle(); } else if (e.getAction() == LibraryEvent.DIRTY_STATE) { enableSave(); } } public void circuitChanged(CircuitEvent event) { if (event.getAction() == CircuitEvent.ACTION_SET_NAME) { computeTitle(); } } private void enableSave() { Project proj = getProject(); boolean ok = proj.isFileDirty(); getRootPane().putClientProperty("windowModified", Boolean.valueOf(ok)); } public void attributeListChanged(AttributeEvent e) { } public void propertyChange(PropertyChangeEvent event) { if (AppPreferences.TOOLBAR_PLACEMENT.isSource(event)) { placeToolbar(); } } public void stateChanged(ChangeEvent event) { Object source = event.getSource(); if (source == explorerPane) { firePropertyChange(EXPLORER_VIEW, "???", getExplorerView()); } else if (source == mainPanel) { firePropertyChange(EDITOR_VIEW, "???", getEditorView()); } } } class MyWindowListener extends WindowAdapter { @Override public void windowClosing(WindowEvent e) { if (confirmClose(Strings.get("confirmCloseTitle"))) { layoutCanvas.closeCanvas(); Frame.this.dispose(); } } @Override public void windowOpened(WindowEvent e) { layoutCanvas.computeSize(true); } } private Project proj; private MyProjectListener myProjectListener = new MyProjectListener(); // GUI elements shared between views private LogisimMenuBar menubar; private MenuListener menuListener; private Toolbar toolbar; private HorizontalSplitPane leftRegion; private VerticalSplitPane mainRegion; private JPanel mainPanelSuper; private CardPanel mainPanel; // left-side elements private Toolbar projectToolbar; private CardPanel explorerPane; private Toolbox toolbox; private SimulationExplorer simExplorer; private AttrTable attrTable; private ZoomControl zoom; // for the Layout view private LayoutToolbarModel layoutToolbarModel; private Canvas layoutCanvas; private ZoomModel layoutZoomModel; private LayoutEditHandler layoutEditHandler; private AttrTableSelectionModel attrTableSelectionModel; // for the Appearance view private AppearanceView appearance; public Frame(Project proj) { this.proj = proj; setBackground(Color.white); setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); addWindowListener(new MyWindowListener()); proj.addProjectListener(myProjectListener); proj.addLibraryListener(myProjectListener); proj.addCircuitListener(myProjectListener); computeTitle(); // set up elements for the Layout view layoutToolbarModel = new LayoutToolbarModel(this, proj); layoutCanvas = new Canvas(proj); layoutZoomModel = new BasicZoomModel(AppPreferences.LAYOUT_SHOW_GRID, AppPreferences.LAYOUT_ZOOM, ZOOM_OPTIONS); layoutCanvas.getGridPainter().setZoomModel(layoutZoomModel); layoutEditHandler = new LayoutEditHandler(this); attrTableSelectionModel = new AttrTableSelectionModel(proj, this); // set up menu bar and toolbar menubar = new LogisimMenuBar(this, proj); menuListener = new MenuListener(this, menubar); menuListener.setEditHandler(layoutEditHandler); setJMenuBar(menubar); toolbar = new Toolbar(layoutToolbarModel); // set up the left-side components ToolbarModel projectToolbarModel = new ExplorerToolbarModel(this, menuListener); projectToolbar = new Toolbar(projectToolbarModel); toolbox = new Toolbox(proj, menuListener); simExplorer = new SimulationExplorer(proj, menuListener); explorerPane = new CardPanel(); explorerPane.addView(VIEW_TOOLBOX, toolbox); explorerPane.addView(VIEW_SIMULATION, simExplorer); explorerPane.setView(VIEW_TOOLBOX); attrTable = new AttrTable(this); zoom = new ZoomControl(layoutZoomModel); // set up the central area CanvasPane canvasPane = new CanvasPane(layoutCanvas); mainPanelSuper = new JPanel(new BorderLayout()); canvasPane.setZoomModel(layoutZoomModel); mainPanel = new CardPanel(); mainPanel.addView(EDIT_LAYOUT, canvasPane); mainPanel.setView(EDIT_LAYOUT); mainPanelSuper.add(mainPanel, BorderLayout.CENTER); // set up the contents, split down the middle, with the canvas // on the right and a split pane on the left containing the // explorer and attribute values. JPanel explPanel = new JPanel(new BorderLayout()); explPanel.add(projectToolbar, BorderLayout.NORTH); explPanel.add(explorerPane, BorderLayout.CENTER); JPanel attrPanel = new JPanel(new BorderLayout()); attrPanel.add(attrTable, BorderLayout.CENTER); attrPanel.add(zoom, BorderLayout.SOUTH); leftRegion = new HorizontalSplitPane(explPanel, attrPanel, AppPreferences.WINDOW_LEFT_SPLIT.get().doubleValue()); mainRegion = new VerticalSplitPane(leftRegion, mainPanelSuper, AppPreferences.WINDOW_MAIN_SPLIT.get().doubleValue()); getContentPane().add(mainRegion, BorderLayout.CENTER); computeTitle(); this.setSize(AppPreferences.WINDOW_WIDTH.get().intValue(), AppPreferences.WINDOW_HEIGHT.get().intValue()); Point prefPoint = getInitialLocation(); if (prefPoint != null) { this.setLocation(prefPoint); } this.setExtendedState(AppPreferences.WINDOW_STATE.get().intValue()); menuListener.register(mainPanel); KeyboardToolSelection.register(toolbar); proj.setFrame(this); if (proj.getTool() == null) { proj.setTool(proj.getOptions().getToolbarData().getFirstTool()); } mainPanel.addChangeListener(myProjectListener); explorerPane.addChangeListener(myProjectListener); AppPreferences.TOOLBAR_PLACEMENT.addPropertyChangeListener(myProjectListener); placeToolbar(); ((MenuListener.EnabledListener) projectToolbarModel).menuEnableChanged(menuListener); LocaleManager.addLocaleListener(this); } private void placeToolbar() { String loc = AppPreferences.TOOLBAR_PLACEMENT.get(); Container contents = getContentPane(); contents.remove(toolbar); mainPanelSuper.remove(toolbar); if (AppPreferences.TOOLBAR_HIDDEN.equals(loc)) { ; // don't place value anywhere } else if (AppPreferences.TOOLBAR_DOWN_MIDDLE.equals(loc)) { toolbar.setOrientation(Toolbar.VERTICAL); mainPanelSuper.add(toolbar, BorderLayout.WEST); } else { // it is a BorderLayout constant Object value = BorderLayout.NORTH; for (Direction dir : Direction.cardinals) { if (dir.toString().equals(loc)) { if (dir == Direction.EAST) value = BorderLayout.EAST; else if (dir == Direction.SOUTH) value = BorderLayout.SOUTH; else if (dir == Direction.WEST) value = BorderLayout.WEST; else value = BorderLayout.NORTH; } } contents.add(toolbar, value); boolean vertical = value == BorderLayout.WEST || value == BorderLayout.EAST; toolbar.setOrientation(vertical ? Toolbar.VERTICAL : Toolbar.HORIZONTAL); } contents.validate(); } public Project getProject() { return proj; } public void viewComponentAttributes(Circuit circ, Component comp) { if (comp == null) { setAttrTableModel(null); } else { setAttrTableModel(new AttrTableComponentModel(proj, circ, comp)); } } void setAttrTableModel(AttrTableModel value) { attrTable.setAttrTableModel(value); if (value instanceof AttrTableToolModel) { Tool tool = ((AttrTableToolModel) value).getTool(); toolbox.setHaloedTool(tool); layoutToolbarModel.setHaloedTool(tool); } else { toolbox.setHaloedTool(null); layoutToolbarModel.setHaloedTool(null); } if (value instanceof AttrTableComponentModel) { Circuit circ = ((AttrTableComponentModel) value).getCircuit(); Component comp = ((AttrTableComponentModel) value).getComponent(); layoutCanvas.setHaloedComponent(circ, comp); } else { layoutCanvas.setHaloedComponent(null, null); } } public void setExplorerView(String view) { explorerPane.setView(view); } public String getExplorerView() { return explorerPane.getView(); } public void setEditorView(String view) { String curView = mainPanel.getView(); if (curView.equals(view)) return; if (view.equals(EDIT_APPEARANCE)) { // appearance view AppearanceView app = appearance; if (app == null) { app = new AppearanceView(); app.setCircuit(proj, proj.getCircuitState()); mainPanel.addView(EDIT_APPEARANCE, app.getCanvasPane()); appearance = app; } toolbar.setToolbarModel(app.getToolbarModel()); app.getAttrTableDrawManager(attrTable).attributesSelected(); zoom.setZoomModel(app.getZoomModel()); menuListener.setEditHandler(app.getEditHandler()); mainPanel.setView(view); app.getCanvas().requestFocus(); } else { // layout view toolbar.setToolbarModel(layoutToolbarModel); zoom.setZoomModel(layoutZoomModel); menuListener.setEditHandler(layoutEditHandler); viewAttributes(proj.getTool(), true); mainPanel.setView(view); layoutCanvas.requestFocus(); } } public String getEditorView() { return mainPanel.getView(); } public Canvas getCanvas() { return layoutCanvas; } private void computeTitle() { String s; Circuit circuit = proj.getCurrentCircuit(); String name = proj.getLogisimFile().getName(); if (circuit != null) { s = StringUtil.format(Strings.get("titleCircFileKnown"), circuit.getName(), name); } else { s = StringUtil.format(Strings.get("titleFileKnown"), name); } this.setTitle(s); myProjectListener.enableSave(); } void viewAttributes(Tool newTool) { viewAttributes(null, newTool, false); } private void viewAttributes(Tool newTool, boolean force) { viewAttributes(null, newTool, force); } private void viewAttributes(Tool oldTool, Tool newTool, boolean force) { AttributeSet newAttrs; if (newTool == null) { newAttrs = null; if (!force) return; } else { newAttrs = newTool.getAttributeSet(layoutCanvas); } if (newAttrs == null) { AttrTableModel oldModel = attrTable.getAttrTableModel(); boolean same = oldModel instanceof AttrTableToolModel && ((AttrTableToolModel) oldModel).getTool() == oldTool; if (!force && !same && !(oldModel instanceof AttrTableCircuitModel)) { return; } } if (newAttrs == null) { Circuit circ = proj.getCurrentCircuit(); if (circ != null) { setAttrTableModel(new AttrTableCircuitModel(proj, circ)); } else if (force) { setAttrTableModel(null); } } else if (newAttrs instanceof SelectionAttributes) { setAttrTableModel(attrTableSelectionModel); } else { setAttrTableModel(new AttrTableToolModel(proj, newTool)); } } public void localeChanged() { computeTitle(); } public void savePreferences() { AppPreferences.TICK_FREQUENCY.set(Double.valueOf(proj.getSimulator().getTickFrequency())); AppPreferences.LAYOUT_SHOW_GRID.setBoolean(layoutZoomModel.getShowGrid()); AppPreferences.LAYOUT_ZOOM.set(Double.valueOf(layoutZoomModel.getZoomFactor())); if (appearance != null) { ZoomModel aZoom = appearance.getZoomModel(); AppPreferences.APPEARANCE_SHOW_GRID.setBoolean(aZoom.getShowGrid()); AppPreferences.APPEARANCE_ZOOM.set(Double.valueOf(aZoom.getZoomFactor())); } int state = getExtendedState() & ~JFrame.ICONIFIED; AppPreferences.WINDOW_STATE.set(Integer.valueOf(state)); Dimension dim = getSize(); AppPreferences.WINDOW_WIDTH.set(Integer.valueOf(dim.width)); AppPreferences.WINDOW_HEIGHT.set(Integer.valueOf(dim.height)); Point loc; try { loc = getLocationOnScreen(); } catch (IllegalComponentStateException e) { loc = Projects.getLocation(this); } if (loc != null) { AppPreferences.WINDOW_LOCATION.set(loc.x + "," + loc.y); } AppPreferences.WINDOW_LEFT_SPLIT.set(Double.valueOf(leftRegion.getFraction())); AppPreferences.WINDOW_MAIN_SPLIT.set(Double.valueOf(mainRegion.getFraction())); AppPreferences.DIALOG_DIRECTORY.set(JFileChoosers.getCurrentDirectory()); } public boolean confirmClose() { return confirmClose(Strings.get("confirmCloseTitle")); } // returns true if user is OK with proceeding public boolean confirmClose(String title) { String message = StringUtil.format(Strings.get("confirmDiscardMessage"), proj.getLogisimFile().getName()); if (!proj.isFileDirty()) return true; toFront(); String[] options = { Strings.get("saveOption"), Strings.get("discardOption"), Strings.get("cancelOption") }; int result = JOptionPane.showOptionDialog(this, message, title, 0, JOptionPane.QUESTION_MESSAGE, null, options, options[0]); boolean ret; if (result == 0) { ret = ProjectActions.doSave(proj); } else if (result == 1) { ret = true; } else { ret = false; } if (ret) { dispose(); } return ret; } private static Point getInitialLocation() { String s = AppPreferences.WINDOW_LOCATION.get(); if (s == null) return null; int comma = s.indexOf(','); if (comma < 0) return null; try { int x = Integer.parseInt(s.substring(0, comma)); int y = Integer.parseInt(s.substring(comma + 1)); while (isProjectFrameAt(x, y)) { x += 20; y += 20; } Rectangle desired = new Rectangle(x, y, 50, 50); int gcBestSize = 0; Point gcBestPoint = null; GraphicsEnvironment ge; ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); for (GraphicsDevice gd : ge.getScreenDevices()) { for (GraphicsConfiguration gc : gd.getConfigurations()) { Rectangle gcBounds = gc.getBounds(); if (gcBounds.intersects(desired)) { Rectangle inter = gcBounds.intersection(desired); int size = inter.width * inter.height; if (size > gcBestSize) { gcBestSize = size; int x2 = Math.max(gcBounds.x, Math.min(inter.x, inter.x + inter.width - 50)); int y2 = Math.max(gcBounds.y, Math.min(inter.y, inter.y + inter.height - 50)); gcBestPoint = new Point(x2, y2); } } } } if (gcBestPoint != null) { if (isProjectFrameAt(gcBestPoint.x, gcBestPoint.y)) { gcBestPoint = null; } } return gcBestPoint; } catch (Throwable t) { return null; } } private static boolean isProjectFrameAt(int x, int y) { for (Project current : Projects.getOpenProjects()) { Frame frame = current.getFrame(); if (frame != null) { Point loc = frame.getLocationOnScreen(); int d = Math.abs(loc.x - x) + Math.abs(loc.y - y); if (d <= 3) return true; } } return false; } } logisim-2.7.1/src/com/cburch/logisim/gui/main/ExportImage.java0000644000175000017500000002521111447117142024142 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.main; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.comp.ComponentDrawContext; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.file.Loader; import com.cburch.logisim.proj.Project; import com.cburch.logisim.util.GifEncoder; import com.cburch.logisim.util.StringGetter; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.image.BufferedImage; import java.io.File; import java.util.List; import javax.imageio.ImageIO; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.ButtonGroup; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JScrollPane; import javax.swing.JSlider; import javax.swing.ProgressMonitor; import javax.swing.SwingConstants; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.filechooser.FileFilter; class ExportImage { private static final int SLIDER_DIVISIONS = 6; private static final int FORMAT_GIF = 0; private static final int FORMAT_PNG = 1; private static final int FORMAT_JPG = 2; private static final int BORDER_SIZE = 5; private ExportImage() { } static void doExport(Project proj) { // First display circuit/parameter selection dialog Frame frame = proj.getFrame(); CircuitJList list = new CircuitJList(proj, true); if (list.getModel().getSize() == 0) { JOptionPane.showMessageDialog(proj.getFrame(), Strings.get("exportEmptyCircuitsMessage"), Strings.get("exportEmptyCircuitsTitle"), JOptionPane.YES_NO_OPTION); return; } OptionsPanel options = new OptionsPanel(list); int action = JOptionPane.showConfirmDialog(frame, options, Strings.get("exportImageSelect"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); if (action != JOptionPane.OK_OPTION) return; List circuits = list.getSelectedCircuits(); double scale = options.getScale(); boolean printerView = options.getPrinterView(); if (circuits.isEmpty()) return; ImageFileFilter filter; int fmt = options.getImageFormat(); switch (options.getImageFormat()) { case FORMAT_GIF: filter = new ImageFileFilter(fmt, Strings.getter("exportGifFilter"), new String[] { "gif" }); break; case FORMAT_PNG: filter = new ImageFileFilter(fmt, Strings.getter("exportPngFilter"), new String[] { "png" }); break; case FORMAT_JPG: filter = new ImageFileFilter(fmt, Strings.getter("exportJpgFilter"), new String[] { "jpg", "jpeg", "jpe", "jfi", "jfif", "jfi" }); break; default: System.err.println("unexpected format; aborted"); //OK return; } // Then display file chooser Loader loader = proj.getLogisimFile().getLoader(); JFileChooser chooser = loader.createChooser(); if (circuits.size() > 1) { chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); chooser.setDialogTitle(Strings.get("exportImageDirectorySelect")); } else { chooser.setFileFilter(filter); chooser.setDialogTitle(Strings.get("exportImageFileSelect")); } int returnVal = chooser.showDialog(frame, Strings.get("exportImageButton")); if (returnVal != JFileChooser.APPROVE_OPTION) return; // Determine whether destination is valid File dest = chooser.getSelectedFile(); chooser.setCurrentDirectory(dest.isDirectory() ? dest : dest.getParentFile()); if (dest.exists()) { if (!dest.isDirectory()) { int confirm = JOptionPane.showConfirmDialog(proj.getFrame(), Strings.get("confirmOverwriteMessage"), Strings.get("confirmOverwriteTitle"), JOptionPane.YES_NO_OPTION); if (confirm != JOptionPane.YES_OPTION) return; } } else { if (circuits.size() > 1) { boolean created = dest.mkdir(); if (!created) { JOptionPane.showMessageDialog(proj.getFrame(), Strings.get("exportNewDirectoryErrorMessage"), Strings.get("exportNewDirectoryErrorTitle"), JOptionPane.YES_NO_OPTION); return; } } } // Create the progress monitor ProgressMonitor monitor = new ProgressMonitor(frame, Strings.get("exportImageProgress"), null, 0, 10000); monitor.setMillisToDecideToPopup(100); monitor.setMillisToPopup(200); monitor.setProgress(0); // And start a thread to actually perform the operation // (This is run in a thread so that Swing will update the // monitor.) new ExportThread(frame, frame.getCanvas(), dest, filter, circuits, scale, printerView, monitor).start(); } private static class OptionsPanel extends JPanel implements ChangeListener { JSlider slider; JLabel curScale; JCheckBox printerView; JRadioButton formatPng; JRadioButton formatGif; JRadioButton formatJpg; GridBagLayout gridbag; GridBagConstraints gbc; Dimension curScaleDim; OptionsPanel(JList list) { // set up components formatPng = new JRadioButton("PNG"); formatGif = new JRadioButton("GIF"); formatJpg = new JRadioButton("JPEG"); ButtonGroup bgroup = new ButtonGroup(); bgroup.add(formatPng); bgroup.add(formatGif); bgroup.add(formatJpg); formatPng.setSelected(true); slider = new JSlider(JSlider.HORIZONTAL, -3 * SLIDER_DIVISIONS, 3 * SLIDER_DIVISIONS, 0); slider.setMajorTickSpacing(10); slider.addChangeListener(this); curScale = new JLabel("222%"); curScale.setHorizontalAlignment(SwingConstants.RIGHT); curScale.setVerticalAlignment(SwingConstants.CENTER); curScaleDim = new Dimension(curScale.getPreferredSize()); curScaleDim.height = Math.max(curScaleDim.height, slider.getPreferredSize().height); stateChanged(null); printerView = new JCheckBox(); printerView.setSelected(true); // set up panel gridbag = new GridBagLayout(); gbc = new GridBagConstraints(); setLayout(gridbag); // now add components into panel gbc.gridy = 0; gbc.gridx = GridBagConstraints.RELATIVE; gbc.anchor = GridBagConstraints.NORTHWEST; gbc.insets = new Insets(5, 0, 5, 0); gbc.fill = GridBagConstraints.NONE; addGb(new JLabel(Strings.get("labelCircuits") + " ")); gbc.fill = GridBagConstraints.HORIZONTAL; addGb(new JScrollPane(list)); gbc.fill = GridBagConstraints.NONE; gbc.gridy++; addGb(new JLabel(Strings.get("labelImageFormat") + " ")); Box formatsPanel = new Box(BoxLayout.Y_AXIS); formatsPanel.add(formatPng); formatsPanel.add(formatGif); formatsPanel.add(formatJpg); addGb(formatsPanel); gbc.gridy++; addGb(new JLabel(Strings.get("labelScale") + " ")); addGb(slider); addGb(curScale); gbc.gridy++; addGb(new JLabel(Strings.get("labelPrinterView") + " ")); addGb(printerView); } private void addGb(JComponent comp) { gridbag.setConstraints(comp, gbc); add(comp); } double getScale() { return Math.pow(2.0, (double) slider.getValue() / SLIDER_DIVISIONS); } boolean getPrinterView() { return printerView.isSelected(); } int getImageFormat() { if (formatGif.isSelected()) return FORMAT_GIF; if (formatJpg.isSelected()) return FORMAT_JPG; return FORMAT_PNG; } public void stateChanged(ChangeEvent e) { double scale = getScale(); curScale.setText((int) Math.round(100.0 * scale) + "%"); if (curScaleDim != null) curScale.setPreferredSize(curScaleDim); } } private static class ImageFileFilter extends FileFilter { private int type; private String[] extensions; private StringGetter desc; private ImageFileFilter(int type, StringGetter desc, String[] exts) { this.type = type; this.desc = desc; extensions = new String[exts.length]; for (int i = 0; i < exts.length; i++) { extensions[i] = "." + exts[i].toLowerCase(); } } @Override public boolean accept(File f) { String name = f.getName().toLowerCase(); for (int i = 0; i < extensions.length; i++) { if (name.endsWith(extensions[i])) return true; } return f.isDirectory(); } @Override public String getDescription() { return desc.get(); } } private static class ExportThread extends Thread { Frame frame; Canvas canvas; File dest; ImageFileFilter filter; List circuits; double scale; boolean printerView; ProgressMonitor monitor; ExportThread(Frame frame, Canvas canvas, File dest, ImageFileFilter f, List circuits, double scale, boolean printerView, ProgressMonitor monitor) { this.frame = frame; this.canvas = canvas; this.dest = dest; this.filter = f; this.circuits = circuits; this.scale = scale; this.printerView = printerView; this.monitor = monitor; } @Override public void run() { for (Circuit circ : circuits) { export(circ); } } private void export(Circuit circuit) { Bounds bds = circuit.getBounds(canvas.getGraphics()) .expand(BORDER_SIZE); int width = (int) Math.round(bds.getWidth() * scale); int height = (int) Math.round(bds.getHeight() * scale); BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics base = img.getGraphics(); Graphics g = base.create(); g.setColor(Color.white); g.fillRect(0, 0, width, height); g.setColor(Color.black); if (g instanceof Graphics2D) { ((Graphics2D) g).scale(scale, scale); ((Graphics2D) g).translate(-bds.getX(), -bds.getY()); } else { JOptionPane.showMessageDialog(frame, Strings.get("couldNotCreateImage")); monitor.close(); } CircuitState circuitState = canvas.getProject().getCircuitState(circuit); ComponentDrawContext context = new ComponentDrawContext(canvas, circuit, circuitState, base, g, printerView); circuit.draw(context, null); File where; if (dest.isDirectory()) { where = new File(dest, circuit.getName() + filter.extensions[0]); } else if (filter.accept(dest)) { where = dest; } else { String newName = dest.getName() + filter.extensions[0]; where = new File(dest.getParentFile(), newName); } try { switch (filter.type) { case FORMAT_GIF: GifEncoder.toFile(img, where, monitor); break; case FORMAT_PNG: ImageIO.write(img, "PNG", where); break; case FORMAT_JPG: ImageIO.write(img, "JPEG", where); break; } } catch (Exception e) { JOptionPane.showMessageDialog(frame, Strings.get("couldNotCreateFile")); monitor.close(); return; } g.dispose(); monitor.close(); } } } logisim-2.7.1/src/com/cburch/logisim/gui/main/ExplorerToolbarModel.java0000644000175000017500000000476711532066764026047 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.main; import java.util.List; import com.cburch.draw.toolbar.AbstractToolbarModel; import com.cburch.draw.toolbar.ToolbarItem; import com.cburch.draw.toolbar.ToolbarSeparator; import com.cburch.logisim.gui.menu.LogisimMenuBar; import com.cburch.logisim.util.UnmodifiableList; class ExplorerToolbarModel extends AbstractToolbarModel implements MenuListener.EnabledListener { private Frame frame; private LogisimToolbarItem itemToolbox; private LogisimToolbarItem itemSimulation; private LogisimToolbarItem itemLayout; private LogisimToolbarItem itemAppearance; private List items; public ExplorerToolbarModel(Frame frame, MenuListener menu) { this.frame = frame; itemToolbox = new LogisimToolbarItem(menu, "projtool.gif", LogisimMenuBar.VIEW_TOOLBOX, Strings.getter("projectViewToolboxTip")); itemSimulation = new LogisimToolbarItem(menu, "projsim.gif", LogisimMenuBar.VIEW_SIMULATION, Strings.getter("projectViewSimulationTip")); itemLayout = new LogisimToolbarItem(menu, "projlayo.gif", LogisimMenuBar.EDIT_LAYOUT, Strings.getter("projectEditLayoutTip")); itemAppearance = new LogisimToolbarItem(menu, "projapp.gif", LogisimMenuBar.EDIT_APPEARANCE, Strings.getter("projectEditAppearanceTip")); items = UnmodifiableList.create(new ToolbarItem[] { itemToolbox, itemSimulation, new ToolbarSeparator(4), itemLayout, itemAppearance, }); menu.addEnabledListener(this); } @Override public List getItems() { return items; } @Override public boolean isSelected(ToolbarItem item) { if (item == itemLayout) { return frame.getEditorView().equals(Frame.EDIT_LAYOUT); } else if (item == itemAppearance) { return frame.getEditorView().equals(Frame.EDIT_APPEARANCE); } else if (item == itemToolbox) { return frame.getExplorerView().equals(Frame.VIEW_TOOLBOX); } else if (item == itemSimulation) { return frame.getExplorerView().equals(Frame.VIEW_SIMULATION); } else { return false; } } @Override public void itemSelected(ToolbarItem item) { if (item instanceof LogisimToolbarItem) { ((LogisimToolbarItem) item).doAction(); } } // // EnabledListener methods // public void menuEnableChanged(MenuListener source) { fireToolbarAppearanceChanged(); } } logisim-2.7.1/src/com/cburch/logisim/gui/main/EditHandler.java0000644000175000017500000000221011447117142024073 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.main; import com.cburch.logisim.gui.menu.LogisimMenuItem; public abstract class EditHandler { public static interface Listener { void enableChanged(EditHandler handler, LogisimMenuItem action, boolean value); } private Listener listener; public void setListener(Listener listener) { this.listener = listener; } protected void setEnabled(LogisimMenuItem action, boolean value) { Listener l = listener; if (l != null) { l.enableChanged(this, action, value); } } public abstract void computeEnabled(); public abstract void cut(); public abstract void copy(); public abstract void paste(); public abstract void delete(); public abstract void duplicate(); public abstract void selectAll(); public abstract void raise(); public abstract void lower(); public abstract void raiseTop(); public abstract void lowerBottom(); public abstract void addControlPoint(); public abstract void removeControlPoint(); } logisim-2.7.1/src/com/cburch/logisim/gui/main/Clipboard.java0000644000175000017500000000523311446034540023616 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.main; import java.beans.PropertyChangeListener; import java.util.Collection; import java.util.HashSet; import com.cburch.logisim.comp.Component; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.util.PropertyChangeWeakSupport; class Clipboard { public static final String contentsProperty = "contents"; private static Clipboard current = null; private static PropertyChangeWeakSupport propertySupport = new PropertyChangeWeakSupport(Clipboard.class); public static boolean isEmpty() { return current == null || current.components.isEmpty(); } public static Clipboard get() { return current; } public static void set(Selection value, AttributeSet oldAttrs) { set(new Clipboard(value, oldAttrs)); } public static void set(Clipboard value) { Clipboard old = current; current = value; propertySupport.firePropertyChange(contentsProperty, old, current); } // // PropertyChangeSource methods // public static void addPropertyChangeListener(PropertyChangeListener listener) { propertySupport.addPropertyChangeListener(listener); } public static void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { propertySupport.addPropertyChangeListener(propertyName, listener); } public static void removePropertyChangeListener(PropertyChangeListener listener) { propertySupport.removePropertyChangeListener(listener); } public static void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) { propertySupport.removePropertyChangeListener(propertyName, listener); } // // instance variables and methods // private HashSet components; private AttributeSet oldAttrs; private AttributeSet newAttrs; private Clipboard(Selection sel, AttributeSet viewAttrs) { components = new HashSet(); oldAttrs = null; newAttrs = null; for (Component base : sel.getComponents()) { AttributeSet baseAttrs = base.getAttributeSet(); AttributeSet copyAttrs = (AttributeSet) baseAttrs.clone(); Component copy = base.getFactory().createComponent(base.getLocation(), copyAttrs); components.add(copy); if (baseAttrs == viewAttrs) { oldAttrs = baseAttrs; newAttrs = copyAttrs; } } } public Collection getComponents() { return components; } public AttributeSet getOldAttributeSet() { return oldAttrs; } public AttributeSet getNewAttributeSet() { return newAttrs; } void setOldAttributeSet(AttributeSet value) { oldAttrs = value; } } logisim-2.7.1/src/com/cburch/logisim/gui/main/CircuitJList.java0000644000175000017500000000265311446034540024272 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.main; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Vector; import javax.swing.JList; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.file.LogisimFile; import com.cburch.logisim.proj.Project; class CircuitJList extends JList { public CircuitJList(Project proj, boolean includeEmpty) { LogisimFile file = proj.getLogisimFile(); Circuit current = proj.getCurrentCircuit(); Vector options = new Vector(); boolean currentFound = false; for (Circuit circ : file.getCircuits()) { if (!includeEmpty || circ.getBounds() != Bounds.EMPTY_BOUNDS) { if (circ == current) currentFound = true; options.add(circ); } } setListData(options); if (currentFound) setSelectedValue(current, true); setVisibleRowCount(Math.min(6, options.size())); } public List getSelectedCircuits() { Object[] selected = getSelectedValues(); if (selected != null && selected.length > 0) { ArrayList ret = new ArrayList(selected.length); for (Object sel : selected) { if (sel instanceof Circuit) ret.add((Circuit) sel); } return ret; } else { return Collections.emptyList(); } } } logisim-2.7.1/src/com/cburch/logisim/gui/main/CanvasPaintThread.java0000644000175000017500000000340711447117142025260 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.main; import java.awt.Rectangle; class CanvasPaintThread extends Thread { private static final int REPAINT_TIMESPAN = 50; // 50 ms between repaints private Canvas canvas; private Object lock; private boolean repaintRequested; private long nextRepaint; private boolean alive; private Rectangle repaintRectangle; public CanvasPaintThread(Canvas canvas) { this.canvas = canvas; lock = new Object(); repaintRequested = false; alive = true; nextRepaint = System.currentTimeMillis(); } public void requestStop() { synchronized(lock) { alive = false; lock.notifyAll(); } } public void requentRepaint(Rectangle rect) { synchronized (lock) { if (repaintRequested) { if (repaintRectangle != null) { repaintRectangle.add(rect); } } else { repaintRequested = true; repaintRectangle = rect; lock.notifyAll(); } } } public void requestRepaint() { synchronized (lock) { if (!repaintRequested) { repaintRequested = true; repaintRectangle = null; lock.notifyAll(); } } } @Override public void run() { while (alive) { long now = System.currentTimeMillis(); synchronized (lock) { long wait = nextRepaint - now; while (alive && !(repaintRequested && wait <= 0)) { try { if (wait > 0) { lock.wait(wait); } else { lock.wait(); } } catch (InterruptedException e) { } now = System.currentTimeMillis(); wait = nextRepaint - now; } if (!alive) break; repaintRequested = false; nextRepaint = now + REPAINT_TIMESPAN; } canvas.repaint(); } } } logisim-2.7.1/src/com/cburch/logisim/gui/main/CanvasPainter.java0000644000175000017500000001531211455470220024453 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.main; import java.awt.Color; import java.awt.Dimension; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.Collections; import java.util.Set; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.circuit.WidthIncompatibilityData; import com.cburch.logisim.circuit.WireSet; import com.cburch.logisim.comp.Component; import com.cburch.logisim.comp.ComponentDrawContext; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.gui.generic.GridPainter; import com.cburch.logisim.prefs.AppPreferences; import com.cburch.logisim.proj.Project; import com.cburch.logisim.tools.Tool; import com.cburch.logisim.util.GraphicsUtil; class CanvasPainter implements PropertyChangeListener { private static final Set NO_COMPONENTS = Collections.emptySet(); private Canvas canvas; private GridPainter grid; private Component haloedComponent = null; private Circuit haloedCircuit = null; private WireSet highlightedWires = WireSet.EMPTY; CanvasPainter(Canvas canvas) { this.canvas = canvas; this.grid = new GridPainter(canvas); AppPreferences.PRINTER_VIEW.addPropertyChangeListener(this); AppPreferences.ATTRIBUTE_HALO.addPropertyChangeListener(this); } // // accessor methods // GridPainter getGridPainter() { return grid; } Component getHaloedComponent() { return haloedComponent; } // // mutator methods // void setHighlightedWires(WireSet value) { highlightedWires = value == null ? WireSet.EMPTY : value; } void setHaloedComponent(Circuit circ, Component comp) { if (comp == haloedComponent) return; Graphics g = canvas.getGraphics(); exposeHaloedComponent(g); haloedCircuit = circ; haloedComponent = comp; exposeHaloedComponent(g); } private void exposeHaloedComponent(Graphics g) { Component c = haloedComponent; if (c == null) return; Bounds bds = c.getBounds(g).expand(7); int w = bds.getWidth(); int h = bds.getHeight(); double a = Canvas.SQRT_2 * w; double b = Canvas.SQRT_2 * h; canvas.repaint((int) Math.round(bds.getX() + w/2.0 - a/2.0), (int) Math.round(bds.getY() + h/2.0 - b/2.0), (int) Math.round(a), (int) Math.round(b)); } public void propertyChange(PropertyChangeEvent event) { if (AppPreferences.PRINTER_VIEW.isSource(event) || AppPreferences.ATTRIBUTE_HALO.isSource(event)) { canvas.repaint(); } } // // painting methods // void paintContents(Graphics g, Project proj) { Rectangle clip = g.getClipBounds(); Dimension size = canvas.getSize(); double zoomFactor = canvas.getZoomFactor(); if (canvas.ifPaintDirtyReset() || clip == null) { clip = new Rectangle(0, 0, size.width, size.height); } g.setColor(Color.white); g.fillRect(clip.x, clip.y, clip.width, clip.height); grid.paintGrid(g); g.setColor(Color.black); Graphics gScaled = g.create(); if (zoomFactor != 1.0 && gScaled instanceof Graphics2D) { ((Graphics2D) gScaled).scale(zoomFactor, zoomFactor); } drawWithUserState(g, gScaled, proj); drawWidthIncompatibilityData(g, gScaled, proj); Circuit circ = proj.getCurrentCircuit(); CircuitState circState = proj.getCircuitState(); ComponentDrawContext ptContext = new ComponentDrawContext(canvas, circ, circState, g, gScaled); ptContext.setHighlightedWires(highlightedWires); gScaled.setColor(Color.RED); circState.drawOscillatingPoints(ptContext); gScaled.setColor(Color.BLUE); proj.getSimulator().drawStepPoints(ptContext); gScaled.dispose(); } private void drawWithUserState(Graphics base, Graphics g, Project proj) { Circuit circ = proj.getCurrentCircuit(); Selection sel = proj.getSelection(); Set hidden; Tool dragTool = canvas.getDragTool(); if (dragTool == null) { hidden = NO_COMPONENTS; } else { hidden = dragTool.getHiddenComponents(canvas); if (hidden == null) hidden = NO_COMPONENTS; } // draw halo around component whose attributes we are viewing boolean showHalo = AppPreferences.ATTRIBUTE_HALO.getBoolean(); if (showHalo && haloedComponent != null && haloedCircuit == circ && !hidden.contains(haloedComponent)) { GraphicsUtil.switchToWidth(g, 3); g.setColor(Canvas.HALO_COLOR); Bounds bds = haloedComponent.getBounds(g).expand(5); int w = bds.getWidth(); int h = bds.getHeight(); double a = Canvas.SQRT_2 * w; double b = Canvas.SQRT_2 * h; g.drawOval((int) Math.round(bds.getX() + w/2.0 - a/2.0), (int) Math.round(bds.getY() + h/2.0 - b/2.0), (int) Math.round(a), (int) Math.round(b)); GraphicsUtil.switchToWidth(g, 1); g.setColor(Color.BLACK); } // draw circuit and selection CircuitState circState = proj.getCircuitState(); boolean printerView = AppPreferences.PRINTER_VIEW.getBoolean(); ComponentDrawContext context = new ComponentDrawContext(canvas, circ, circState, base, g, printerView); context.setHighlightedWires(highlightedWires); circ.draw(context, hidden); sel.draw(context, hidden); // draw tool Tool tool = dragTool != null ? dragTool : proj.getTool(); if (tool != null && !canvas.isPopupMenuUp()) { Graphics gCopy = g.create(); context.setGraphics(gCopy); tool.draw(canvas, context); gCopy.dispose(); } } private void drawWidthIncompatibilityData(Graphics base, Graphics g, Project proj) { Set exceptions; exceptions = proj.getCurrentCircuit().getWidthIncompatibilityData(); if (exceptions == null || exceptions.size() == 0) return; g.setColor(Value.WIDTH_ERROR_COLOR); GraphicsUtil.switchToWidth(g, 2); FontMetrics fm = base.getFontMetrics(g.getFont()); for (WidthIncompatibilityData ex : exceptions) { for (int i = 0; i < ex.size(); i++) { Location p = ex.getPoint(i); BitWidth w = ex.getBitWidth(i); // ensure it hasn't already been drawn boolean drawn = false; for (int j = 0; j < i; j++) { if (ex.getPoint(j).equals(p)) { drawn = true; break; } } if (drawn) continue; // compute the caption combining all similar points String caption = "" + w.getWidth(); for (int j = i + 1; j < ex.size(); j++) { if (ex.getPoint(j).equals(p)) { caption += "/" + ex.getBitWidth(j); break; } } g.drawOval(p.getX() - 4, p.getY() - 4, 8, 8); g.drawString(caption, p.getX() + 5, p.getY() + 2 + fm.getAscent()); } } g.setColor(Color.BLACK); GraphicsUtil.switchToWidth(g, 1); } } logisim-2.7.1/src/com/cburch/logisim/gui/main/Canvas.java0000644000175000017500000006512511527054456023150 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.main; import java.awt.Color; import java.awt.Font; import java.awt.Cursor; import java.awt.Dimension; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Rectangle; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.CircuitEvent; import com.cburch.logisim.circuit.CircuitListener; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.circuit.Propagator; import com.cburch.logisim.circuit.SimulatorEvent; import com.cburch.logisim.circuit.SimulatorListener; import com.cburch.logisim.circuit.SubcircuitFactory; import com.cburch.logisim.circuit.WidthIncompatibilityData; import com.cburch.logisim.circuit.WireSet; import com.cburch.logisim.comp.Component; import com.cburch.logisim.comp.ComponentUserEvent; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeEvent; import com.cburch.logisim.data.AttributeListener; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.file.LibraryEvent; import com.cburch.logisim.file.LibraryListener; import com.cburch.logisim.file.LogisimFile; import com.cburch.logisim.file.MouseMappings; import com.cburch.logisim.file.Options; import com.cburch.logisim.gui.generic.CanvasPane; import com.cburch.logisim.gui.generic.CanvasPaneContents; import com.cburch.logisim.gui.generic.GridPainter; import com.cburch.logisim.prefs.AppPreferences; import com.cburch.logisim.proj.Project; import com.cburch.logisim.proj.ProjectEvent; import com.cburch.logisim.proj.ProjectListener; import com.cburch.logisim.tools.AddTool; import com.cburch.logisim.tools.EditTool; import com.cburch.logisim.tools.Library; import com.cburch.logisim.tools.Tool; import com.cburch.logisim.tools.ToolTipMaker; import com.cburch.logisim.util.GraphicsUtil; import com.cburch.logisim.util.LocaleListener; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.StringGetter; import java.util.List; import java.util.Set; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JViewport; import javax.swing.event.MouseInputListener; import javax.swing.event.PopupMenuEvent; import javax.swing.event.PopupMenuListener; public class Canvas extends JPanel implements LocaleListener, CanvasPaneContents { static final Color HALO_COLOR = new Color(192, 255, 255); private static final int BOUNDS_BUFFER = 70; // pixels shown in canvas beyond outermost boundaries private static final int THRESH_SIZE_UPDATE = 10; // don't bother to update the size if it hasn't changed more than this static final double SQRT_2 = Math.sqrt(2.0); private static final int BUTTONS_MASK = InputEvent.BUTTON1_DOWN_MASK | InputEvent.BUTTON2_DOWN_MASK | InputEvent.BUTTON3_DOWN_MASK; private static final Color DEFAULT_ERROR_COLOR = new Color(192, 0, 0); private static final Color TICK_RATE_COLOR = new Color(0, 0, 92, 92); private static final Font TICK_RATE_FONT = new Font("serif", Font.BOLD, 12); private class MyListener implements MouseInputListener, KeyListener, PopupMenuListener, PropertyChangeListener { boolean menu_on = false; // // MouseListener methods // public void mouseClicked(MouseEvent e) { } public void mouseMoved(MouseEvent e) { if ((e.getModifiersEx() & BUTTONS_MASK) != 0) { // If the control key is down while the mouse is being // dragged, mouseMoved is called instead. This may well be // an issue specific to the MacOS Java implementation, // but it exists there in the 1.4 and 5.0 versions. mouseDragged(e); return; } Tool tool = getToolFor(e); if (tool != null) { tool.mouseMoved(Canvas.this, getGraphics(), e); } } public void mouseDragged(MouseEvent e) { if (drag_tool != null) { drag_tool.mouseDragged(Canvas.this, getGraphics(), e); } } public void mouseEntered(MouseEvent e) { if (drag_tool != null) { drag_tool.mouseEntered(Canvas.this, getGraphics(), e); } else { Tool tool = getToolFor(e); if (tool != null) { tool.mouseEntered(Canvas.this, getGraphics(), e); } } } public void mouseExited(MouseEvent e) { if (drag_tool != null) { drag_tool.mouseExited(Canvas.this, getGraphics(), e); } else { Tool tool = getToolFor(e); if (tool != null) { tool.mouseExited(Canvas.this, getGraphics(), e); } } } public void mousePressed(MouseEvent e) { viewport.setErrorMessage(null, null); proj.setStartupScreen(false); Canvas.this.requestFocus(); drag_tool = getToolFor(e); if (drag_tool != null) { drag_tool.mousePressed(Canvas.this, getGraphics(), e); } completeAction(); } public void mouseReleased(MouseEvent e) { if (drag_tool != null) { drag_tool.mouseReleased(Canvas.this, getGraphics(), e); drag_tool = null; } Tool tool = proj.getTool(); if (tool != null) { tool.mouseMoved(Canvas.this, getGraphics(), e); } completeAction(); } private Tool getToolFor(MouseEvent e) { if (menu_on) return null; Tool ret = mappings.getToolFor(e); if (ret == null) return proj.getTool(); else return ret; } // // KeyListener methods // public void keyPressed(KeyEvent e) { Tool tool = proj.getTool(); if (tool != null) tool.keyPressed(Canvas.this, e); } public void keyReleased(KeyEvent e) { Tool tool = proj.getTool(); if (tool != null) tool.keyReleased(Canvas.this, e); } public void keyTyped(KeyEvent e) { Tool tool = proj.getTool(); if (tool != null) tool.keyTyped(Canvas.this, e); } // // PopupMenuListener mtehods // public void popupMenuCanceled(PopupMenuEvent e) { menu_on = false; } public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { menu_on = false; } public void popupMenuWillBecomeVisible(PopupMenuEvent e) {} public void propertyChange(PropertyChangeEvent event) { if (AppPreferences.GATE_SHAPE.isSource(event) || AppPreferences.SHOW_TICK_RATE.isSource(event)) { paintThread.requestRepaint(); } else if (AppPreferences.COMPONENT_TIPS.isSource(event)) { boolean showTips = AppPreferences.COMPONENT_TIPS.getBoolean(); setToolTipText(showTips ? "" : null); } } } private class MyProjectListener implements ProjectListener, LibraryListener, CircuitListener, AttributeListener, SimulatorListener, Selection.Listener { public void projectChanged(ProjectEvent event) { int act = event.getAction(); if (act == ProjectEvent.ACTION_SET_CURRENT) { viewport.setErrorMessage(null, null); if (painter.getHaloedComponent() != null) { proj.getFrame().viewComponentAttributes(null, null); } } else if (act == ProjectEvent.ACTION_SET_FILE) { LogisimFile old = (LogisimFile) event.getOldData(); if (old != null) old.getOptions().getAttributeSet().removeAttributeListener(this); LogisimFile file = (LogisimFile) event.getData(); if (file != null) { AttributeSet attrs = file.getOptions().getAttributeSet(); attrs.addAttributeListener(this); loadOptions(attrs); mappings = file.getOptions().getMouseMappings(); } } else if (act == ProjectEvent.ACTION_SET_TOOL) { viewport.setErrorMessage(null, null); Tool t = event.getTool(); if (t == null) setCursor(Cursor.getDefaultCursor()); else setCursor(t.getCursor()); } else if (act == ProjectEvent.ACTION_SET_STATE) { CircuitState oldState = (CircuitState) event.getOldData(); CircuitState newState = (CircuitState) event.getData(); if (oldState != null && newState != null) { Propagator oldProp = oldState.getPropagator(); Propagator newProp = newState.getPropagator(); if (oldProp != newProp) { tickCounter.clear(); } } } if (act != ProjectEvent.ACTION_SELECTION && act != ProjectEvent.ACTION_START && act != ProjectEvent.UNDO_START) { completeAction(); } } public void libraryChanged(LibraryEvent event) { if (event.getAction() == LibraryEvent.REMOVE_TOOL) { Object t = event.getData(); Circuit circ = null; if (t instanceof AddTool) { t = ((AddTool) t).getFactory(); if (t instanceof SubcircuitFactory) { circ = ((SubcircuitFactory) t).getSubcircuit(); } } if (t == proj.getCurrentCircuit() && t != null) { proj.setCurrentCircuit(proj.getLogisimFile().getMainCircuit()); } if (proj.getTool() == event.getData()) { Tool next = findTool(proj.getLogisimFile().getOptions() .getToolbarData().getContents()); if (next == null) { for (Library lib : proj.getLogisimFile().getLibraries()) { next = findTool(lib.getTools()); if (next != null) break; } } proj.setTool(next); } if (circ != null) { CircuitState state = getCircuitState(); CircuitState last = state; while (state != null && state.getCircuit() != circ) { last = state; state = state.getParentState(); } if (state != null) { getProject().setCircuitState(last.cloneState()); } } } } private Tool findTool(List opts) { Tool ret = null; for (Tool o : opts) { if (ret == null && o != null) ret = o; else if (o instanceof EditTool) ret = o; } return ret; } public void circuitChanged(CircuitEvent event) { int act = event.getAction(); if (act == CircuitEvent.ACTION_REMOVE) { Component c = (Component) event.getData(); if (c == painter.getHaloedComponent()) { proj.getFrame().viewComponentAttributes(null, null); } } else if (act == CircuitEvent.ACTION_CLEAR) { if (painter.getHaloedComponent() != null) { proj.getFrame().viewComponentAttributes(null, null); } } else if (act == CircuitEvent.ACTION_INVALIDATE) { completeAction(); } } public void propagationCompleted(SimulatorEvent e) { /* This was a good idea for a while... but it leads to problems * when a repaint is done just before a user action takes place. // repaint - but only if it's been a while since the last one long now = System.currentTimeMillis(); if (now > lastRepaint + repaintDuration) { lastRepaint = now; // (ensure that multiple requests aren't made repaintDuration = 15 + (int) (20 * Math.random()); // repaintDuration is for jittering the repaints to // reduce aliasing effects repaint(); } */ paintThread.requestRepaint(); } public void tickCompleted(SimulatorEvent e) { waitForRepaintDone(); } public void simulatorStateChanged(SimulatorEvent e) { } public void attributeListChanged(AttributeEvent e) { } public void attributeValueChanged(AttributeEvent e) { Attribute attr = e.getAttribute(); if (attr == Options.ATTR_GATE_UNDEFINED) { CircuitState circState = getCircuitState(); circState.markComponentsDirty(getCircuit().getNonWires()); // TODO actually, we'd want to mark all components in // subcircuits as dirty as well } } public void selectionChanged(Selection.Event event) { repaint(); } } private class MyViewport extends JViewport { StringGetter errorMessage = null; Color errorColor = DEFAULT_ERROR_COLOR; String widthMessage = null; boolean isNorth = false; boolean isSouth = false; boolean isWest = false; boolean isEast = false; boolean isNortheast = false; boolean isNorthwest = false; boolean isSoutheast = false; boolean isSouthwest = false; MyViewport() { } void setErrorMessage(StringGetter msg, Color color) { if (errorMessage != msg) { errorMessage = msg; errorColor = color == null ? DEFAULT_ERROR_COLOR : color; paintThread.requestRepaint(); } } void setWidthMessage(String msg) { widthMessage = msg; isNorth = false; isSouth = false; isWest = false; isEast = false; isNortheast = false; isNorthwest = false; isSoutheast = false; isSouthwest = false; } void setNorth(boolean value) { isNorth = value; } void setSouth(boolean value) { isSouth = value; } void setEast(boolean value) { isEast = value; } void setWest(boolean value) { isWest = value; } void setNortheast(boolean value) { isNortheast = value; } void setNorthwest(boolean value) { isNorthwest = value; } void setSoutheast(boolean value) { isSoutheast = value; } void setSouthwest(boolean value) { isSouthwest = value; } @Override public void paintChildren(Graphics g) { super.paintChildren(g); paintContents(g); } @Override public Color getBackground() { return getView() == null ? super.getBackground() : getView().getBackground(); } void paintContents(Graphics g) { /* TODO this is for the SimulatorPrototype class int speed = proj.getSimulator().getSimulationSpeed(); String speedStr; if (speed >= 10000000) { speedStr = (speed / 1000000) + " MHz"; } else if (speed >= 1000000) { speedStr = (speed / 100000) / 10.0 + " MHz"; } else if (speed >= 10000) { speedStr = (speed / 1000) + " KHz"; } else if (speed >= 10000) { speedStr = (speed / 100) / 10.0 + " KHz"; } else { speedStr = speed + " Hz"; } FontMetrics fm = g.getFontMetrics(); g.drawString(speedStr, getWidth() - 10 - fm.stringWidth(speedStr), getHeight() - 10); */ StringGetter message = errorMessage; if (message != null) { g.setColor(errorColor); paintString(g, message.get()); return; } if (proj.getSimulator().isOscillating()) { g.setColor(DEFAULT_ERROR_COLOR); paintString(g, Strings.get("canvasOscillationError")); return; } if (proj.getSimulator().isExceptionEncountered()) { g.setColor(DEFAULT_ERROR_COLOR); paintString(g, Strings.get("canvasExceptionError")); return; } computeViewportContents(); Dimension sz = getSize(); g.setColor(Value.WIDTH_ERROR_COLOR); if (widthMessage != null) { paintString(g, widthMessage); } GraphicsUtil.switchToWidth(g, 3); if (isNorth) GraphicsUtil.drawArrow(g, sz.width / 2, 20, sz.width / 2, 2, 10, 30); if (isSouth) GraphicsUtil.drawArrow(g, sz.width / 2, sz.height - 20, sz.width / 2, sz.height - 2, 10, 30); if (isEast) GraphicsUtil.drawArrow(g, sz.width - 20, sz.height / 2, sz.width - 2, sz.height / 2, 10, 30); if (isWest) GraphicsUtil.drawArrow(g, 20, sz.height / 2, 2, sz.height / 2, 10, 30); if (isNortheast) GraphicsUtil.drawArrow(g, sz.width - 14, 14, sz.width - 2, 2, 10, 30); if (isNorthwest) GraphicsUtil.drawArrow(g, 14, 14, 2, 2, 10, 30); if (isSoutheast) GraphicsUtil.drawArrow(g, sz.width - 14, sz.height - 14, sz.width - 2, sz.height - 2, 10, 30); if (isSouthwest) GraphicsUtil.drawArrow(g, 14, sz.height - 14, 2, sz.height - 2, 10, 30); if (AppPreferences.SHOW_TICK_RATE.getBoolean()) { String hz = tickCounter.getTickRate(); if (hz != null && !hz.equals("")) { g.setColor(TICK_RATE_COLOR); g.setFont(TICK_RATE_FONT); FontMetrics fm = g.getFontMetrics(); int x = getWidth() - fm.stringWidth(hz) - 5; int y = fm.getAscent() + 5; g.drawString(hz, x, y); } } GraphicsUtil.switchToWidth(g, 1); g.setColor(Color.BLACK); } private void paintString(Graphics g, String msg) { Font old = g.getFont(); g.setFont(old.deriveFont(Font.BOLD).deriveFont(18.0f)); FontMetrics fm = g.getFontMetrics(); int x = (getWidth() - fm.stringWidth(msg)) / 2; if (x < 0) x = 0; g.drawString(msg, x, getHeight() - 23); g.setFont(old); return; } } private Project proj; private Tool drag_tool; private Selection selection; private MouseMappings mappings; private CanvasPane canvasPane; private Bounds oldPreferredSize; private MyListener myListener = new MyListener(); private MyViewport viewport = new MyViewport(); private MyProjectListener myProjectListener = new MyProjectListener(); private TickCounter tickCounter; private CanvasPaintThread paintThread; private CanvasPainter painter; private boolean paintDirty = false; // only for within paintComponent private boolean inPaint = false; // only for within paintComponent private Object repaintLock = new Object(); // for waitForRepaintDone public Canvas(Project proj) { this.proj = proj; this.selection = new Selection(proj, this); this.painter = new CanvasPainter(this); this.oldPreferredSize = null; this.paintThread = new CanvasPaintThread(this); this.mappings = proj.getOptions().getMouseMappings(); this.canvasPane = null; this.tickCounter = new TickCounter(); setBackground(Color.white); addMouseListener(myListener); addMouseMotionListener(myListener); addKeyListener(myListener); proj.addProjectListener(myProjectListener); proj.addLibraryListener(myProjectListener); proj.addCircuitListener(myProjectListener); proj.getSimulator().addSimulatorListener(tickCounter); selection.addListener(myProjectListener); LocaleManager.addLocaleListener(this); AttributeSet options = proj.getOptions().getAttributeSet(); options.addAttributeListener(myProjectListener); AppPreferences.COMPONENT_TIPS.addPropertyChangeListener(myListener); AppPreferences.GATE_SHAPE.addPropertyChangeListener(myListener); AppPreferences.SHOW_TICK_RATE.addPropertyChangeListener(myListener); loadOptions(options); paintThread.start(); } public void closeCanvas() { paintThread.requestStop(); } private void loadOptions(AttributeSet options) { boolean showTips = AppPreferences.COMPONENT_TIPS.getBoolean(); setToolTipText(showTips ? "" : null); proj.getSimulator().removeSimulatorListener(myProjectListener); proj.getSimulator().addSimulatorListener(myProjectListener); } @Override public void repaint() { if (inPaint) paintDirty = true; else super.repaint(); } public StringGetter getErrorMessage() { return viewport.errorMessage; } public void setErrorMessage(StringGetter message) { viewport.setErrorMessage(message, null); } public void setErrorMessage(StringGetter message, Color color) { viewport.setErrorMessage(message, color); } // // access methods // public Circuit getCircuit() { return proj.getCurrentCircuit(); } public CircuitState getCircuitState() { return proj.getCircuitState(); } public Project getProject() { return proj; } public Selection getSelection() { return selection; } GridPainter getGridPainter() { return painter.getGridPainter(); } Tool getDragTool() { return drag_tool; } boolean isPopupMenuUp() { return myListener.menu_on; } // // graphics methods // double getZoomFactor() { CanvasPane pane = canvasPane; return pane == null ? 1.0 : pane.getZoomFactor(); } Component getHaloedComponent() { return painter.getHaloedComponent(); } void setHaloedComponent(Circuit circ, Component comp) { painter.setHaloedComponent(circ, comp); } public void setHighlightedWires(WireSet value) { painter.setHighlightedWires(value); } public void showPopupMenu(JPopupMenu menu, int x, int y) { double zoom = getZoomFactor(); if (zoom != 1.0) { x = (int) Math.round(x * zoom); y = (int) Math.round(y * zoom); } myListener.menu_on = true; menu.addPopupMenuListener(myListener); menu.show(this, x, y); } private void completeAction() { computeSize(false); // TODO for SimulatorPrototype: proj.getSimulator().releaseUserEvents(); proj.getSimulator().requestPropagate(); // repaint will occur after propagation completes } public void computeSize(boolean immediate) { Bounds bounds = proj.getCurrentCircuit().getBounds(); int width = bounds.getX() + bounds.getWidth() + BOUNDS_BUFFER; int height = bounds.getY() + bounds.getHeight() + BOUNDS_BUFFER; Dimension dim; if (canvasPane == null) { dim = new Dimension(width, height); } else { dim = canvasPane.supportPreferredSize(width, height); } if (!immediate) { Bounds old = oldPreferredSize; if (old != null && Math.abs(old.getWidth() - dim.width) < THRESH_SIZE_UPDATE && Math.abs(old.getHeight() - dim.height) < THRESH_SIZE_UPDATE) { return; } } oldPreferredSize = Bounds.create(0, 0, dim.width, dim.height); setPreferredSize(dim); revalidate(); } private void waitForRepaintDone() { synchronized(repaintLock) { try { while (inPaint) { repaintLock.wait(); } } catch (InterruptedException e) { } } } @Override public void paintComponent(Graphics g) { inPaint = true; try { super.paintComponent(g); do { painter.paintContents(g, proj); } while (paintDirty); if (canvasPane == null) viewport.paintContents(g); } finally { inPaint = false; synchronized(repaintLock) { repaintLock.notifyAll(); } } } boolean ifPaintDirtyReset() { if (paintDirty) { paintDirty = false; return false; } else { return true; } } private void computeViewportContents() { Set exceptions = proj.getCurrentCircuit().getWidthIncompatibilityData(); if (exceptions == null || exceptions.size() == 0) { viewport.setWidthMessage(null); return; } Rectangle viewableBase; Rectangle viewable; if (canvasPane != null) { viewableBase = canvasPane.getViewport().getViewRect(); } else { Bounds bds = proj.getCurrentCircuit().getBounds(); viewableBase = new Rectangle(0, 0, bds.getWidth(), bds.getHeight()); } double zoom = getZoomFactor(); if (zoom == 1.0) { viewable = viewableBase; } else { viewable = new Rectangle((int) (viewableBase.x / zoom), (int) (viewableBase.y / zoom), (int) (viewableBase.width / zoom), (int) (viewableBase.height / zoom)); } viewport.setWidthMessage(Strings.get("canvasWidthError") + (exceptions.size() == 1 ? "" : " (" + exceptions.size() + ")")); for (WidthIncompatibilityData ex : exceptions) { // See whether any of the points are on the canvas. boolean isWithin = false; for (int i = 0; i < ex.size(); i++) { Location p = ex.getPoint(i); int x = p.getX(); int y = p.getY(); if (x >= viewable.x && x < viewable.x + viewable.width && y >= viewable.y && y < viewable.y + viewable.height) { isWithin = true; break; } } // If none are, insert an arrow. if (!isWithin) { Location p = ex.getPoint(0); int x = p.getX(); int y = p.getY(); boolean isWest = x < viewable.x; boolean isEast = x >= viewable.x + viewable.width; boolean isNorth = y < viewable.y; boolean isSouth = y >= viewable.y + viewable.height; if (isNorth) { if (isEast) viewport.setNortheast(true); else if (isWest) viewport.setNorthwest(true); else viewport.setNorth(true); } else if (isSouth) { if (isEast) viewport.setSoutheast(true); else if (isWest) viewport.setSouthwest(true); else viewport.setSouth(true); } else { if (isEast) viewport.setEast(true); else if (isWest) viewport.setWest(true); } } } } @Override public void repaint(Rectangle r) { double zoom = getZoomFactor(); if (zoom == 1.0) { super.repaint(r); } else { this.repaint(r.x, r.y, r.width, r.height); } } @Override public void repaint(int x, int y, int width, int height) { double zoom = getZoomFactor(); if (zoom < 1.0) { int newX = (int) Math.floor(x * zoom); int newY = (int) Math.floor(y * zoom); width += x - newX; height += y - newY; x = newX; y = newY; } else if (zoom > 1.0) { int x1 = (int) Math.ceil((x + width) * zoom); int y1 = (int) Math.ceil((y + height) * zoom); width = x1 - x; height = y1 - y; } super.repaint(x, y, width, height); } @Override public String getToolTipText(MouseEvent event) { boolean showTips = AppPreferences.COMPONENT_TIPS.getBoolean(); if (showTips) { Canvas.snapToGrid(event); Location loc = Location.create(event.getX(), event.getY()); ComponentUserEvent e = null; for (Component comp : getCircuit().getAllContaining(loc)) { Object makerObj = comp.getFeature(ToolTipMaker.class); if (makerObj != null && makerObj instanceof ToolTipMaker) { ToolTipMaker maker = (ToolTipMaker) makerObj; if (e == null) { e = new ComponentUserEvent(this, loc.getX(), loc.getY()); } String ret = maker.getToolTip(e); if (ret != null) { unrepairMouseEvent(event); return ret; } } } } return null; } @Override protected void processMouseEvent(MouseEvent e) { repairMouseEvent(e); super.processMouseEvent(e); } @Override protected void processMouseMotionEvent(MouseEvent e) { repairMouseEvent(e); super.processMouseMotionEvent(e); } private void repairMouseEvent(MouseEvent e) { double zoom = getZoomFactor(); if (zoom != 1.0) zoomEvent(e, zoom); } private void unrepairMouseEvent(MouseEvent e) { double zoom = getZoomFactor(); if (zoom != 1.0) zoomEvent(e, 1.0 / zoom); } private void zoomEvent(MouseEvent e, double zoom) { int oldx = e.getX(); int oldy = e.getY(); int newx = (int) Math.round(e.getX() / zoom); int newy = (int) Math.round(e.getY() / zoom); e.translatePoint(newx - oldx, newy - oldy); } // // CanvasPaneContents methods // public void setCanvasPane(CanvasPane value) { canvasPane = value; canvasPane.setViewport(viewport); viewport.setView(this); setOpaque(false); computeSize(true); } public void recomputeSize() { computeSize(true); } public Dimension getPreferredScrollableViewportSize() { return getPreferredSize(); } public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) { return canvasPane.supportScrollableBlockIncrement(visibleRect, orientation, direction); } public boolean getScrollableTracksViewportHeight() { return false; } public boolean getScrollableTracksViewportWidth() { return false; } public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) { return canvasPane.supportScrollableUnitIncrement(visibleRect, orientation, direction); } // // static methods // public static int snapXToGrid(int x) { if (x < 0) { return -((-x + 5) / 10) * 10; } else { return ((x + 5) / 10) * 10; } } public static int snapYToGrid(int y) { if (y < 0) { return -((-y + 5) / 10) * 10; } else { return ((y + 5) / 10) * 10; } } public static void snapToGrid(MouseEvent e) { int old_x = e.getX(); int old_y = e.getY(); int new_x = snapXToGrid(old_x); int new_y = snapYToGrid(old_y); e.translatePoint(new_x - old_x, new_y - old_y); } public void localeChanged() { paintThread.requestRepaint(); } } logisim-2.7.1/src/com/cburch/logisim/gui/main/AttrTableToolModel.java0000644000175000017500000000164311527054456025431 0ustar vincentvincent/* Copyright (c) 2011, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.main; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.gui.generic.AttributeSetTableModel; import com.cburch.logisim.proj.Project; import com.cburch.logisim.tools.Tool; public class AttrTableToolModel extends AttributeSetTableModel { Project proj; Tool tool; public AttrTableToolModel(Project proj, Tool tool) { super(tool.getAttributeSet()); this.proj = proj; this.tool = tool; } @Override public String getTitle() { return Strings.get("toolAttrTitle", tool.getDisplayName()); } public Tool getTool() { return tool; } @Override public void setValueRequested(Attribute attr, Object value) { proj.doAction(ToolAttributeAction.create(tool, attr, value)); } } logisim-2.7.1/src/com/cburch/logisim/gui/main/AttrTableSelectionModel.java0000644000175000017500000000615211534737544026445 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.main; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.Wire; import com.cburch.logisim.comp.Component; import com.cburch.logisim.comp.ComponentFactory; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.gui.generic.AttrTableSetException; import com.cburch.logisim.gui.generic.AttributeSetTableModel; import com.cburch.logisim.gui.main.AttrTableCircuitModel; import com.cburch.logisim.gui.main.Selection; import com.cburch.logisim.gui.main.Selection.Event; import com.cburch.logisim.proj.Project; import com.cburch.logisim.tools.SetAttributeAction; class AttrTableSelectionModel extends AttributeSetTableModel implements Selection.Listener { private Project project; private Frame frame; public AttrTableSelectionModel(Project project, Frame frame) { super(frame.getCanvas().getSelection().getAttributeSet()); this.project = project; this.frame = frame; frame.getCanvas().getSelection().addListener(this); } @Override public String getTitle() { ComponentFactory wireFactory = null; ComponentFactory factory = null; int factoryCount = 0; int totalCount = 0; boolean variousFound = false; Selection selection = frame.getCanvas().getSelection(); for (Component comp : selection.getComponents()) { ComponentFactory fact = comp.getFactory(); if (fact == factory) { factoryCount++; } else if (comp instanceof Wire) { wireFactory = fact; if (factory == null) { factoryCount++; } } else if (factory == null) { factory = fact; factoryCount = 1; } else { variousFound = true; } if (!(comp instanceof Wire)) { totalCount++; } } if (factory == null) { factory = wireFactory; } if (variousFound) { return Strings.get("selectionVarious", "" + totalCount); } else if (factoryCount == 0) { String circName = frame.getCanvas().getCircuit().getName(); return Strings.get("circuitAttrTitle", circName); } else if (factoryCount == 1) { return Strings.get("selectionOne", factory.getDisplayName()); } else { return Strings.get("selectionMultiple", factory.getDisplayName(), "" + factoryCount); } } @Override public void setValueRequested(Attribute attr, Object value) throws AttrTableSetException { Selection selection = frame.getCanvas().getSelection(); Circuit circuit = frame.getCanvas().getCircuit(); if (selection.isEmpty() && circuit != null) { AttrTableCircuitModel circuitModel = new AttrTableCircuitModel(project, circuit); circuitModel.setValueRequested(attr, value); } else { SetAttributeAction act = new SetAttributeAction(circuit, Strings.getter("selectionAttributeAction")); for (Component comp : selection.getComponents()) { if (!(comp instanceof Wire)) { act.set(comp, attr, value); } } project.doAction(act); } } // // Selection.Listener methods public void selectionChanged(Event event) { fireTitleChanged(); frame.setAttrTableModel(this); } } logisim-2.7.1/src/com/cburch/logisim/gui/main/AttrTableComponentModel.java0000644000175000017500000000272711534737550026463 0ustar vincentvincent/* Copyright (c) 2011, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.main; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.comp.Component; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.gui.generic.AttrTableSetException; import com.cburch.logisim.gui.generic.AttributeSetTableModel; import com.cburch.logisim.proj.Project; import com.cburch.logisim.tools.SetAttributeAction; class AttrTableComponentModel extends AttributeSetTableModel { Project proj; Circuit circ; Component comp; AttrTableComponentModel(Project proj, Circuit circ, Component comp) { super(comp.getAttributeSet()); this.proj = proj; this.circ = circ; this.comp = comp; } public Circuit getCircuit() { return circ; } public Component getComponent() { return comp; } @Override public String getTitle() { return comp.getFactory().getDisplayName(); } @Override public void setValueRequested(Attribute attr, Object value) throws AttrTableSetException { if (!proj.getLogisimFile().contains(circ)) { String msg = Strings.get("cannotModifyCircuitError"); throw new AttrTableSetException(msg); } else { SetAttributeAction act = new SetAttributeAction(circ, Strings.getter("changeAttributeAction")); act.set(comp, attr, value); proj.doAction(act); } } } logisim-2.7.1/src/com/cburch/logisim/gui/main/AttrTableCircuitModel.java0000644000175000017500000000240411527054456026112 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.main; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.CircuitMutation; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.gui.generic.AttrTableSetException; import com.cburch.logisim.gui.generic.AttributeSetTableModel; import com.cburch.logisim.proj.Project; public class AttrTableCircuitModel extends AttributeSetTableModel { private Project proj; private Circuit circ; public AttrTableCircuitModel(Project proj, Circuit circ) { super(circ.getStaticAttributes()); this.proj = proj; this.circ = circ; } @Override public String getTitle() { return Strings.get("circuitAttrTitle", circ.getName()); } @Override public void setValueRequested(Attribute attr, Object value) throws AttrTableSetException { if (!proj.getLogisimFile().contains(circ)) { String msg = Strings.get("cannotModifyCircuitError"); throw new AttrTableSetException(msg); } else { CircuitMutation xn = new CircuitMutation(circ); xn.setForCircuit(attr, value); proj.doAction(xn.toAction(Strings.getter("changeCircuitAttrAction"))); } } } logisim-2.7.1/src/com/cburch/logisim/gui/log/0000755000175000017500000000000011535206226020707 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/logisim/gui/log/ValueLog.java0000644000175000017500000000173211446034534023275 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.log; import com.cburch.logisim.data.Value; class ValueLog { private static final int LOG_SIZE = 400; private Value[] log; private short curSize; private short firstIndex; public ValueLog() { log = new Value[LOG_SIZE]; curSize = 0; firstIndex = 0; } public int size() { return curSize; } public Value get(int index) { int i = firstIndex + index; if (i >= LOG_SIZE) i -= LOG_SIZE; return log[i]; } public Value getLast() { return curSize < LOG_SIZE ? (curSize == 0 ? null : log[curSize - 1]) : (firstIndex == 0 ? log[curSize - 1] : log[firstIndex - 1]); } public void append(Value val) { if (curSize < LOG_SIZE) { log[curSize] = val; curSize++; } else { log[firstIndex] = val; firstIndex++; if (firstIndex >= LOG_SIZE) firstIndex = 0; } } } logisim-2.7.1/src/com/cburch/logisim/gui/log/TablePanel.java0000644000175000017500000001621511446034534023570 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.log; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Rectangle; import java.awt.event.MouseEvent; import javax.swing.JScrollBar; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import com.cburch.logisim.data.Value; import com.cburch.logisim.util.GraphicsUtil; class TablePanel extends LogPanel { private static final Font HEAD_FONT = new Font("Serif", Font.BOLD, 14); private static final Font BODY_FONT = new Font("Serif", Font.PLAIN, 14); private static final int COLUMN_SEP = 8; private static final int HEADER_SEP = 4; private class MyListener implements ModelListener { public void selectionChanged(ModelEvent event) { computeRowCount(); } public void entryAdded(ModelEvent event, Value[] values) { int oldCount = rowCount; computeRowCount(); if (oldCount == rowCount) { int value = vsb.getValue(); if (value > vsb.getMinimum() && value < vsb.getMaximum() - vsb.getVisibleAmount()) { vsb.setValue(vsb.getValue() - vsb.getUnitIncrement(-1)); } else { repaint(); } } } public void filePropertyChanged(ModelEvent event) { } private void computeRowCount() { Model model = getModel(); Selection sel = model.getSelection(); int rows = 0; for (int i = sel.size() - 1; i >= 0; i--) { int x = model.getValueLog(sel.get(i)).size(); if (x > rows) rows = x; } if (rowCount != rows) { rowCount = rows; computePreferredSize(); } } } private class VerticalScrollBar extends JScrollBar implements ChangeListener { private int oldMaximum = -1; private int oldExtent = -1; public VerticalScrollBar() { getModel().addChangeListener(this); } @Override public int getUnitIncrement(int direction) { int curY = getValue(); if (direction > 0) { return curY > 0 ? cellHeight : cellHeight + HEADER_SEP; } else { return curY > cellHeight + HEADER_SEP ? cellHeight : cellHeight + HEADER_SEP; } } @Override public int getBlockIncrement(int direction) { int curY = getValue(); int curHeight = getVisibleAmount(); int numCells = curHeight / cellHeight - 1; if (numCells <= 0) numCells = 1; if (direction > 0) { return curY > 0 ? numCells * cellHeight : numCells * cellHeight + HEADER_SEP; } else { return curY > cellHeight + HEADER_SEP ? numCells * cellHeight : numCells * cellHeight + HEADER_SEP; } } public void stateChanged(ChangeEvent event) { int newMaximum = getMaximum(); int newExtent = getVisibleAmount(); if (oldMaximum != newMaximum || oldExtent != newExtent) { if (getValue() + oldExtent >= oldMaximum) { setValue(newMaximum - newExtent); } oldMaximum = newMaximum; oldExtent = newExtent; } } } private MyListener myListener = new MyListener(); private int cellWidth = 25; // reasonable start values private int cellHeight = 15; private int rowCount = 0; private int tableWidth; private int tableHeight; private VerticalScrollBar vsb; public TablePanel(LogFrame frame) { super(frame); vsb = new VerticalScrollBar(); modelChanged(null, getModel()); } @Override public String getTitle() { return Strings.get("tableTab"); } @Override public String getHelpText() { return Strings.get("tableHelp"); } @Override public void localeChanged() { computePreferredSize(); repaint(); } @Override public void modelChanged(Model oldModel, Model newModel) { if (oldModel != null) oldModel.removeModelListener(myListener); if (newModel != null) newModel.addModelListener(myListener); } public int getColumn(MouseEvent event) { int x = event.getX() - (getWidth() - tableWidth) / 2; if (x < 0) return -1; Selection sel = getModel().getSelection(); int ret = (x + COLUMN_SEP / 2) / (cellWidth + COLUMN_SEP); return ret >= 0 && ret < sel.size() ? ret : -1; } public int getRow(MouseEvent event) { int y = event.getY() - (getHeight() - tableHeight) / 2; if (y < cellHeight + HEADER_SEP) return -1; int ret = (y - cellHeight - HEADER_SEP) / cellHeight; return ret >= 0 && ret < rowCount ? ret : -1; } @Override public void paintComponent(Graphics g) { super.paintComponent(g); Dimension sz = getSize(); int top = Math.max(0, (sz.height - tableHeight) / 2); int left = Math.max(0, (sz.width - tableWidth) / 2); Model model = getModel(); if (model == null) return; Selection sel = model.getSelection(); int columns = sel.size(); if (columns == 0) { g.setFont(BODY_FONT); GraphicsUtil.drawCenteredText(g, Strings.get("tableEmptyMessage"), sz.width / 2, sz.height / 2); return; } g.setColor(Color.GRAY); int lineY = top + cellHeight + HEADER_SEP / 2; g.drawLine(left, lineY, left + tableWidth, lineY); g.setColor(Color.BLACK); g.setFont(HEAD_FONT); FontMetrics headerMetric = g.getFontMetrics(); int x = left; int y = top + headerMetric.getAscent() + 1; for (int i = 0; i < columns; i++) { x = paintHeader(sel.get(i).toShortString(), x, y, g, headerMetric); } g.setFont(BODY_FONT); FontMetrics bodyMetric = g.getFontMetrics(); Rectangle clip = g.getClipBounds(); int firstRow = Math.max(0, (clip.y - y) / cellHeight - 1); int lastRow = Math.min(rowCount, 2 + (clip.y + clip.height - y) / cellHeight); int y0 = top + cellHeight + HEADER_SEP; x = left; for (int col = 0; col < columns; col++) { SelectionItem item = sel.get(col); ValueLog log = model.getValueLog(item); int radix = item.getRadix(); int offs = rowCount - log.size(); y = y0 + Math.max(offs, firstRow) * cellHeight; for (int row = Math.max(offs, firstRow); row < lastRow; row++) { Value val = log.get(row - offs); String label = val.toDisplayString(radix); int width = bodyMetric.stringWidth(label); g.drawString(label, x + (cellWidth - width) / 2, y + bodyMetric.getAscent()); y += cellHeight; } x += cellWidth + COLUMN_SEP; } } private int paintHeader(String header, int x, int y, Graphics g, FontMetrics fm) { int width = fm.stringWidth(header); g.drawString(header, x + (cellWidth - width) / 2, y); return x + cellWidth + COLUMN_SEP; } private void computePreferredSize() { Model model = getModel(); Selection sel = model.getSelection(); int columns = sel.size(); if (columns == 0) { setPreferredSize(new Dimension(0, 0)); return; } Graphics g = getGraphics(); if (g == null) { cellHeight = 16; cellWidth = 24; } else { FontMetrics fm = g.getFontMetrics(HEAD_FONT); cellHeight = fm.getHeight(); cellWidth = 24; for (int i = 0; i < columns; i++) { String header = sel.get(i).toShortString(); cellWidth = Math.max(cellWidth, fm.stringWidth(header)); } } tableWidth = (cellWidth + COLUMN_SEP) * columns - COLUMN_SEP; tableHeight = cellHeight * (1 + rowCount) + HEADER_SEP; setPreferredSize(new Dimension(tableWidth, tableHeight)); revalidate(); repaint(); } JScrollBar getVerticalScrollBar() { return vsb; } } logisim-2.7.1/src/com/cburch/logisim/gui/log/Strings.java0000644000175000017500000000102611451540054023177 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.log; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.StringGetter; class Strings { private static LocaleManager source = new LocaleManager("resources/logisim", "log"); public static String get(String key) { return source.get(key); } public static StringGetter getter(String key) { return source.getter(key); } } logisim-2.7.1/src/com/cburch/logisim/gui/log/SelectionPanel.java0000644000175000017500000001357011446034534024467 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.log; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.List; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.ScrollPaneConstants; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.TreePath; class SelectionPanel extends LogPanel { private class Listener extends MouseAdapter implements ActionListener, TreeSelectionListener, ListSelectionListener { @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { TreePath path = selector.getPathForLocation(e.getX(), e.getY()); if (path != null && listener != null) { doAdd(selector.getSelectedItems()); } } } public void actionPerformed(ActionEvent event) { Object src = event.getSource(); if (src == addTool) { doAdd(selector.getSelectedItems()); } else if (src == changeBase) { SelectionItem sel = (SelectionItem) list.getSelectedValue(); if (sel != null) { int radix = sel.getRadix(); switch (radix) { case 2: sel.setRadix(10); break; case 10: sel.setRadix(16); break; default: sel.setRadix(2); } } } else if (src == moveUp) { doMove(-1); } else if (src == moveDown) { doMove(1); } else if (src == remove) { Selection sel = getSelection(); Object[] toRemove = list.getSelectedValues(); boolean changed = false; for (int i = 0; i < toRemove.length; i++) { int index = sel.indexOf((SelectionItem) toRemove[i]); if (index >= 0) { sel.remove(index); changed = true; } } if (changed) { list.clearSelection(); } } } public void valueChanged(TreeSelectionEvent event) { computeEnabled(); } public void valueChanged(ListSelectionEvent event) { computeEnabled(); } private void computeEnabled() { int index = list.getSelectedIndex(); addTool.setEnabled(selector.hasSelectedItems()); changeBase.setEnabled(index >= 0); moveUp.setEnabled(index > 0); moveDown.setEnabled(index >= 0 && index < list.getModel().getSize() - 1); remove.setEnabled(index >= 0); } private void doAdd(List selectedItems) { if (selectedItems != null && selectedItems.size() > 0) { SelectionItem last = null; for (SelectionItem item : selectedItems) { getSelection().add(item); last = item; } list.setSelectedValue(last, true); } } private void doMove(int delta) { Selection sel = getSelection(); int oldIndex = list.getSelectedIndex(); int newIndex = oldIndex + delta; if (oldIndex >= 0 && newIndex >= 0 && newIndex < sel.size()) { sel.move(oldIndex, newIndex); list.setSelectedIndex(newIndex); } } } private Listener listener = new Listener(); private ComponentSelector selector; private JButton addTool; private JButton changeBase; private JButton moveUp; private JButton moveDown; private JButton remove; private SelectionList list; public SelectionPanel(LogFrame window) { super(window); selector = new ComponentSelector(getModel()); addTool = new JButton(); changeBase = new JButton(); moveUp = new JButton(); moveDown = new JButton(); remove = new JButton(); list = new SelectionList(); list.setSelection(getSelection()); JPanel buttons = new JPanel(new GridLayout(5, 1)); buttons.add(addTool); buttons.add(changeBase); buttons.add(moveUp); buttons.add(moveDown); buttons.add(remove); addTool.addActionListener(listener); changeBase.addActionListener(listener); moveUp.addActionListener(listener); moveDown.addActionListener(listener); remove.addActionListener(listener); selector.addMouseListener(listener); selector.addTreeSelectionListener(listener); list.addListSelectionListener(listener); listener.computeEnabled(); GridBagLayout gridbag = new GridBagLayout(); GridBagConstraints gbc = new GridBagConstraints(); setLayout(gridbag); JScrollPane explorerPane = new JScrollPane(selector, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); JScrollPane listPane = new JScrollPane(list, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); gbc.fill = GridBagConstraints.BOTH; gbc.weightx = 1.0; gbc.weighty = 1.0; gridbag.setConstraints(explorerPane, gbc); add(explorerPane); gbc.fill = GridBagConstraints.NONE; gbc.anchor = GridBagConstraints.NORTH; gbc.weightx = 0.0; gridbag.setConstraints(buttons, gbc); add(buttons); gbc.fill = GridBagConstraints.BOTH; gbc.weightx = 1.0; gridbag.setConstraints(listPane, gbc); add(listPane); } @Override public String getTitle() { return Strings.get("selectionTab"); } @Override public String getHelpText() { return Strings.get("selectionHelp"); } @Override public void localeChanged() { addTool.setText(Strings.get("selectionAdd")); changeBase.setText(Strings.get("selectionChangeBase")); moveUp.setText(Strings.get("selectionMoveUp")); moveDown.setText(Strings.get("selectionMoveDown")); remove.setText(Strings.get("selectionRemove")); selector.localeChanged(); list.localeChanged(); } @Override public void modelChanged(Model oldModel, Model newModel) { if (getModel() == null) { selector.setLogModel(newModel); list.setSelection(null); } else { selector.setLogModel(newModel); list.setSelection(getSelection()); } listener.computeEnabled(); } } logisim-2.7.1/src/com/cburch/logisim/gui/log/SelectionList.java0000644000175000017500000000414211446034534024336 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.log; import javax.swing.AbstractListModel; import javax.swing.DefaultListCellRenderer; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.ListSelectionModel; import com.cburch.logisim.comp.Component; import com.cburch.logisim.data.Value; class SelectionList extends JList { private class Model extends AbstractListModel implements ModelListener { public int getSize() { return selection == null ? 0 : selection.size(); } public Object getElementAt(int index) { return selection.get(index); } public void selectionChanged(ModelEvent event) { fireContentsChanged(this, 0, getSize()); } public void entryAdded(ModelEvent event, Value[] values) { } public void filePropertyChanged(ModelEvent event) { } } private class MyCellRenderer extends DefaultListCellRenderer { @Override public java.awt.Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean hasFocus) { java.awt.Component ret = super.getListCellRendererComponent(list, value, index, isSelected, hasFocus); if (ret instanceof JLabel && value instanceof SelectionItem) { JLabel label = (JLabel) ret; SelectionItem item = (SelectionItem) value; Component comp = item.getComponent(); label.setIcon(new ComponentIcon(comp)); label.setText(item.toString() + " - " + item.getRadix()); } return ret; } } private Selection selection; public SelectionList() { selection = null; setModel(new Model()); setCellRenderer(new MyCellRenderer()); setSelectionMode(ListSelectionModel.SINGLE_SELECTION); } public void setSelection(Selection value) { if (selection != value) { Model model = (Model) getModel(); if (selection != null) selection.removeModelListener(model); selection = value; if (selection != null) selection.addModelListener(model); model.selectionChanged(null); } } public void localeChanged() { repaint(); } } logisim-2.7.1/src/com/cburch/logisim/gui/log/SelectionItem.java0000644000175000017500000001055011520127242024311 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.log; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.CircuitEvent; import com.cburch.logisim.circuit.CircuitListener; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.circuit.SubcircuitFactory; import com.cburch.logisim.comp.Component; import com.cburch.logisim.data.AttributeEvent; import com.cburch.logisim.data.AttributeListener; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.StdAttr; class SelectionItem implements AttributeListener, CircuitListener { private Model model; private Component[] path; private Component comp; private Object option; private int radix = 2; private String shortDescriptor; private String longDescriptor; public SelectionItem(Model model, Component[] path, Component comp, Object option) { this.model = model; this.path = path; this.comp = comp; this.option = option; computeDescriptors(); if (path != null) { model.getCircuitState().getCircuit().addCircuitListener(this); for (int i = 0; i < path.length; i++) { path[i].getAttributeSet().addAttributeListener(this); SubcircuitFactory circFact = (SubcircuitFactory) path[i].getFactory(); circFact.getSubcircuit().addCircuitListener(this); } } comp.getAttributeSet().addAttributeListener(this); } private boolean computeDescriptors() { boolean changed = false; Loggable log = (Loggable) comp.getFeature(Loggable.class); String newShort = log.getLogName(option); if (newShort == null || newShort.equals("")) { newShort = comp.getFactory().getDisplayName() + comp.getLocation().toString(); if (option != null) { newShort += "." + option.toString(); } } if (!newShort.equals(shortDescriptor)) { changed = true; shortDescriptor = newShort; } StringBuilder buf = new StringBuilder(); for (int i = 0; i < path.length; i++) { if (i > 0) buf.append("."); String label = path[i].getAttributeSet().getValue(StdAttr.LABEL); if (label != null && !label.equals("")) { buf.append(label); } else { buf.append(path[i].getFactory().getDisplayName()); buf.append(path[i].getLocation()); } buf.append("."); } buf.append(shortDescriptor); String newLong = buf.toString(); if (!newLong.equals(longDescriptor)) { changed = true; longDescriptor = newLong; } return changed; } public Component[] getPath() { return path; } public Component getComponent() { return comp; } public Object getOption() { return option; } public int getRadix() { return radix; } public void setRadix(int value) { radix = value; model.fireSelectionChanged(new ModelEvent()); } public String toShortString() { return shortDescriptor; } @Override public String toString() { return longDescriptor; } public Value fetchValue(CircuitState root) { CircuitState cur = root; for (int i = 0; i < path.length; i++) { SubcircuitFactory circFact = (SubcircuitFactory) path[i].getFactory(); cur = circFact.getSubstate(cur, path[i]); } Loggable log = (Loggable) comp.getFeature(Loggable.class); return log == null ? Value.NIL : log.getLogValue(cur, option); } public void attributeListChanged(AttributeEvent e) { } public void attributeValueChanged(AttributeEvent e) { if (computeDescriptors()) { model.fireSelectionChanged(new ModelEvent()); } } public void circuitChanged(CircuitEvent event) { int action = event.getAction(); if (action == CircuitEvent.ACTION_CLEAR || action == CircuitEvent.ACTION_REMOVE) { Circuit circ = event.getCircuit(); Component circComp = null; if (circ == model.getCircuitState().getCircuit()) { circComp = path != null && path.length > 0 ? path[0] : comp; } else if (path != null) { for (int i = 0; i < path.length; i++) { SubcircuitFactory circFact = (SubcircuitFactory) path[i].getFactory(); if (circ == circFact.getSubcircuit()) { circComp = i + 1 < path.length ? path[i + 1] : comp; } } } if (circComp == null) return; if (action == CircuitEvent.ACTION_REMOVE && event.getData() != circComp) { return; } int index = model.getSelection().indexOf(this); if (index < 0) return; model.getSelection().remove(index); } } } logisim-2.7.1/src/com/cburch/logisim/gui/log/Selection.java0000644000175000017500000000260111446034534023500 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.log; import java.util.ArrayList; import com.cburch.logisim.circuit.CircuitState; class Selection { private CircuitState root; private Model model; private ArrayList components; public Selection(CircuitState root, Model model) { this.root = root; this.model = model; components = new ArrayList(); } public void addModelListener(ModelListener l) { model.addModelListener(l); } public void removeModelListener(ModelListener l) { model.removeModelListener(l); } public CircuitState getCircuitState() { return root; } public int size() { return components.size(); } public SelectionItem get(int index) { return components.get(index); } public int indexOf(SelectionItem value) { return components.indexOf(value); } public void add(SelectionItem item) { components.add(item); model.fireSelectionChanged(new ModelEvent()); } public void remove(int index) { components.remove(index); model.fireSelectionChanged(new ModelEvent()); } public void move(int fromIndex, int toIndex) { if (fromIndex == toIndex) return; SelectionItem o = components.remove(fromIndex); components.add(toIndex, o); model.fireSelectionChanged(new ModelEvent()); } } logisim-2.7.1/src/com/cburch/logisim/gui/log/ScrollPanel.java0000644000175000017500000000173411446034534023777 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.log; import java.awt.BorderLayout; import javax.swing.JScrollPane; class ScrollPanel extends LogPanel { private TablePanel table; public ScrollPanel(LogFrame frame) { super(frame); this.table = new TablePanel(frame); JScrollPane pane = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); pane.setVerticalScrollBar(table.getVerticalScrollBar()); setLayout(new BorderLayout()); add(pane); } @Override public String getTitle() { return table.getTitle(); } @Override public String getHelpText() { return table.getHelpText(); } @Override public void localeChanged() { table.localeChanged(); } @Override public void modelChanged(Model oldModel, Model newModel) { table.modelChanged(oldModel, newModel); } } logisim-2.7.1/src/com/cburch/logisim/gui/log/ModelListener.java0000644000175000017500000000063411446034534024325 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.log; import com.cburch.logisim.data.Value; interface ModelListener { public void selectionChanged(ModelEvent event); public void entryAdded(ModelEvent event, Value[] values); public void filePropertyChanged(ModelEvent event); } logisim-2.7.1/src/com/cburch/logisim/gui/log/ModelEvent.java0000644000175000017500000000031711446034534023617 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.log; class ModelEvent { } logisim-2.7.1/src/com/cburch/logisim/gui/log/Model.java0000644000175000017500000000715611446034534022625 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.log; import java.io.File; import java.util.HashMap; import java.util.Iterator; import javax.swing.JFrame; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.data.Value; import com.cburch.logisim.util.EventSourceWeakSupport; class Model { private EventSourceWeakSupport listeners; private Selection selection; private HashMap log; private boolean fileEnabled = false; private File file = null; private boolean fileHeader = true; private boolean selected = false; private LogThread logger = null; public Model(CircuitState circuitState) { listeners = new EventSourceWeakSupport(); selection = new Selection(circuitState, this); log = new HashMap(); } public boolean isSelected() { return selected; } public void addModelListener(ModelListener l) { listeners.add(l); } public void removeModelListener(ModelListener l) { listeners.remove(l); } public CircuitState getCircuitState() { return selection.getCircuitState(); } public Selection getSelection() { return selection; } public ValueLog getValueLog(SelectionItem item) { ValueLog ret = log.get(item); if (ret == null && selection.indexOf(item) >= 0) { ret = new ValueLog(); log.put(item, ret); } return ret; } public boolean isFileEnabled() { return fileEnabled; } public File getFile() { return file; } public boolean getFileHeader() { return fileHeader; } public void setFileEnabled(boolean value) { if (fileEnabled == value) return; fileEnabled = value; fireFilePropertyChanged(new ModelEvent()); } public void setFile(File value) { if (file == null ? value == null : file.equals(value)) return; file = value; fileEnabled = file != null; fireFilePropertyChanged(new ModelEvent()); } public void setFileHeader(boolean value) { if (fileHeader == value) return; fileHeader = value; fireFilePropertyChanged(new ModelEvent()); } public void propagationCompleted() { CircuitState circuitState = getCircuitState(); Value[] vals = new Value[selection.size()]; boolean changed = false; for (int i = selection.size() - 1; i >= 0; i--) { SelectionItem item = selection.get(i); vals[i] = item.fetchValue(circuitState); if (!changed) { Value v = getValueLog(item).getLast(); changed = v == null ? vals[i] != null : !v.equals(vals[i]); } } if (changed) { for (int i = selection.size() - 1; i >= 0; i--) { SelectionItem item = selection.get(i); getValueLog(item).append(vals[i]); } fireEntryAdded(new ModelEvent(), vals); } } public void setSelected(JFrame frame, boolean value) { if (selected == value) return; selected = value; if (selected) { logger = new LogThread(this); logger.start(); } else { if (logger != null) logger.cancel(); logger = null; fileEnabled = false; } fireFilePropertyChanged(new ModelEvent()); } void fireSelectionChanged(ModelEvent e) { for (Iterator it = log.keySet().iterator(); it.hasNext(); ) { SelectionItem i = it.next(); if (selection.indexOf(i) < 0) { it.remove(); } } for (ModelListener l : listeners) { l.selectionChanged(e); } } private void fireEntryAdded(ModelEvent e, Value[] values) { for (ModelListener l : listeners) { l.entryAdded(e, values); } } private void fireFilePropertyChanged(ModelEvent e) { for (ModelListener l : listeners) { l.filePropertyChanged(e); } } } logisim-2.7.1/src/com/cburch/logisim/gui/log/LogThread.java0000644000175000017500000000642311446034534023432 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.log; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import com.cburch.logisim.data.Value; class LogThread extends Thread implements ModelListener { // file will be flushed with at least this frequency private static final int FLUSH_FREQUENCY = 500; // file will be closed after waiting this many milliseconds between writes private static final int IDLE_UNTIL_CLOSE = 10000; private Model model; private boolean canceled = false; private Object lock = new Object(); private PrintWriter writer = null; private boolean headerDirty = true; private long lastWrite = 0; public LogThread(Model model) { this.model = model; model.addModelListener(this); } @Override public void run() { while (!canceled) { synchronized(lock) { if (writer != null) { if (System.currentTimeMillis() - lastWrite > IDLE_UNTIL_CLOSE) { writer.close(); writer = null; } else { writer.flush(); } } } try { Thread.sleep(FLUSH_FREQUENCY); } catch (InterruptedException e) { } } synchronized(lock) { if (writer != null) { writer.close(); writer = null; } } } public void cancel() { synchronized(lock) { canceled = true; if (writer != null) { writer.close(); writer = null; } } } public void selectionChanged(ModelEvent event) { headerDirty = true; } public void entryAdded(ModelEvent event, Value[] values) { synchronized(lock) { if (isFileEnabled()) addEntry(values); } } public void filePropertyChanged(ModelEvent event) { synchronized(lock) { if (isFileEnabled()) { if (writer == null) { Selection sel = model.getSelection(); Value[] values = new Value[sel.size()]; boolean found = false; for (int i = 0; i < values.length; i++) { values[i] = model.getValueLog(sel.get(i)).getLast(); if (values[i] != null) found = true; } if (found) addEntry(values); } } else { if (writer != null) { writer.close(); writer = null; } } } } private boolean isFileEnabled() { return !canceled && model.isSelected() && model.isFileEnabled() && model.getFile() != null; } // Should hold lock and have verified that isFileEnabled() before // entering this method. private void addEntry(Value[] values) { if (writer == null) { try { writer = new PrintWriter(new FileWriter(model.getFile(), true)); } catch (IOException e) { model.setFile(null); return; } } Selection sel = model.getSelection(); if (headerDirty) { if (model.getFileHeader()) { StringBuilder buf = new StringBuilder(); for (int i = 0; i < sel.size(); i++) { if (i > 0) buf.append("\t"); buf.append(sel.get(i).toString()); } writer.println(buf.toString()); } headerDirty = false; } StringBuilder buf = new StringBuilder(); for (int i = 0; i < values.length; i++) { if (i > 0) buf.append("\t"); if (values[i] != null) { int radix = sel.get(i).getRadix(); buf.append(values[i].toDisplayString(radix)); } } writer.println(buf.toString()); lastWrite = System.currentTimeMillis(); } } logisim-2.7.1/src/com/cburch/logisim/gui/log/LogPanel.java0000644000175000017500000000170711446034534023262 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.log; import java.awt.LayoutManager; import javax.swing.JPanel; import com.cburch.logisim.proj.Project; abstract class LogPanel extends JPanel { private LogFrame logFrame; public LogPanel(LogFrame frame) { super(); this.logFrame = frame; } public LogPanel(LogFrame frame, LayoutManager manager) { super(manager); this.logFrame = frame; } public abstract String getTitle(); public abstract String getHelpText(); public abstract void localeChanged(); public abstract void modelChanged(Model oldModel, Model newModel); LogFrame getLogFrame() { return logFrame; } Project getProject() { return logFrame.getProject(); } Model getModel() { return logFrame.getModel(); } Selection getSelection() { return logFrame.getModel().getSelection(); } } logisim-2.7.1/src/com/cburch/logisim/gui/log/Loggable.java0000644000175000017500000000071211446034534023270 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.log; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.data.Value; public interface Loggable { public Object[] getLogOptions(CircuitState state); public String getLogName(Object option); public Value getLogValue(CircuitState state, Object option); } logisim-2.7.1/src/com/cburch/logisim/gui/log/LogFrame.java0000644000175000017500000001516711535206226023260 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.log; import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowEvent; import java.util.HashMap; import java.util.Map; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTabbedPane; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.circuit.Simulator; import com.cburch.logisim.circuit.SimulatorEvent; import com.cburch.logisim.circuit.SimulatorListener; import com.cburch.logisim.file.LibraryEvent; import com.cburch.logisim.file.LibraryListener; import com.cburch.logisim.gui.generic.LFrame; import com.cburch.logisim.gui.menu.LogisimMenuBar; import com.cburch.logisim.proj.Project; import com.cburch.logisim.proj.ProjectEvent; import com.cburch.logisim.proj.ProjectListener; import com.cburch.logisim.util.LocaleListener; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.StringUtil; import com.cburch.logisim.util.WindowMenuItemManager; public class LogFrame extends LFrame { // TODO should automatically repaint icons when component attr change // TODO ? moving a component using Select tool removes it from selection private class WindowMenuManager extends WindowMenuItemManager implements LocaleListener, ProjectListener, LibraryListener { WindowMenuManager() { super(Strings.get("logFrameMenuItem"), false); project.addProjectListener(this); project.addLibraryListener(this); } @Override public JFrame getJFrame(boolean create) { return LogFrame.this; } public void localeChanged() { String title = project.getLogisimFile().getDisplayName(); setText(StringUtil.format(Strings.get("logFrameMenuItem"), title)); } public void projectChanged(ProjectEvent event) { if (event.getAction() == ProjectEvent.ACTION_SET_FILE) { localeChanged(); } } public void libraryChanged(LibraryEvent event) { if (event.getAction() == LibraryEvent.SET_NAME) { localeChanged(); } } } private class MyListener implements ActionListener, ProjectListener, LibraryListener, SimulatorListener, LocaleListener { public void actionPerformed(ActionEvent event) { Object src = event.getSource(); if (src == close) { WindowEvent e = new WindowEvent(LogFrame.this, WindowEvent.WINDOW_CLOSING); LogFrame.this.processWindowEvent(e); } } public void projectChanged(ProjectEvent event) { int action = event.getAction(); if (action == ProjectEvent.ACTION_SET_STATE) { setSimulator(event.getProject().getSimulator(), event.getProject().getCircuitState()); } else if (action == ProjectEvent.ACTION_SET_FILE) { setTitle(computeTitle(curModel, project)); } } public void libraryChanged(LibraryEvent event) { int action = event.getAction(); if (action == LibraryEvent.SET_NAME) { setTitle(computeTitle(curModel, project)); } } public void localeChanged() { setTitle(computeTitle(curModel, project)); for (int i = 0; i < panels.length; i++) { tabbedPane.setTitleAt(i, panels[i].getTitle()); tabbedPane.setToolTipTextAt(i, panels[i].getToolTipText()); panels[i].localeChanged(); } close.setText(Strings.get("closeButton")); windowManager.localeChanged(); } public void propagationCompleted(SimulatorEvent e) { curModel.propagationCompleted(); } public void tickCompleted(SimulatorEvent e) { } public void simulatorStateChanged(SimulatorEvent e) { } } private Project project; private Simulator curSimulator = null; private Model curModel; private Map modelMap = new HashMap(); private MyListener myListener = new MyListener(); private WindowMenuManager windowManager; private LogPanel[] panels; private JTabbedPane tabbedPane; private JButton close = new JButton(); public LogFrame(Project project) { this.project = project; this.windowManager = new WindowMenuManager(); project.addProjectListener(myListener); project.addLibraryListener(myListener); setDefaultCloseOperation(HIDE_ON_CLOSE); setJMenuBar(new LogisimMenuBar(this, project)); setSimulator(project.getSimulator(), project.getCircuitState()); panels = new LogPanel[] { new SelectionPanel(this), new ScrollPanel(this), new FilePanel(this), }; tabbedPane = new JTabbedPane(); for (int index = 0; index < panels.length; index++) { LogPanel panel = panels[index]; tabbedPane.addTab(panel.getTitle(), null, panel, panel.getToolTipText()); } JPanel buttonPanel = new JPanel(); buttonPanel.add(close); close.addActionListener(myListener); Container contents = getContentPane(); tabbedPane.setPreferredSize(new Dimension(450, 300)); contents.add(tabbedPane, BorderLayout.CENTER); contents.add(buttonPanel, BorderLayout.SOUTH); LocaleManager.addLocaleListener(myListener); myListener.localeChanged(); pack(); } public Project getProject() { return project; } Model getModel() { return curModel; } private void setSimulator(Simulator value, CircuitState state) { if ((value == null) == (curModel == null)) { if (value == null || value.getCircuitState() == curModel.getCircuitState()) return; } LogisimMenuBar menubar = (LogisimMenuBar) getJMenuBar(); menubar.setCircuitState(value, state); if (curSimulator != null) curSimulator.removeSimulatorListener(myListener); if (curModel != null) curModel.setSelected(this, false); Model oldModel = curModel; Model data = null; if (value != null) { data = modelMap.get(value.getCircuitState()); if (data == null) { data = new Model(value.getCircuitState()); modelMap.put(data.getCircuitState(), data); } } curSimulator = value; curModel = data; if (curSimulator != null) curSimulator.addSimulatorListener(myListener); if (curModel != null) curModel.setSelected(this, true); setTitle(computeTitle(curModel, project)); if (panels != null) { for (int i = 0; i < panels.length; i++) { panels[i].modelChanged(oldModel, curModel); } } } @Override public void setVisible(boolean value) { if (value) { windowManager.frameOpened(this); } super.setVisible(value); } LogPanel[] getPrefPanels() { return panels; } private static String computeTitle(Model data, Project proj) { String name = data == null ? "???" : data.getCircuitState().getCircuit().getName(); return StringUtil.format(Strings.get("logFrameTitle"), name, proj.getLogisimFile().getDisplayName()); } } logisim-2.7.1/src/com/cburch/logisim/gui/log/FilePanel.java0000644000175000017500000001334311447117136023420 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.log; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.FileWriter; import java.io.IOException; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import com.cburch.logisim.data.Value; import com.cburch.logisim.util.JFileChoosers; import com.cburch.logisim.util.StringUtil; class FilePanel extends LogPanel { private class Listener implements ActionListener, ModelListener { public void selectionChanged(ModelEvent event) { } public void entryAdded(ModelEvent event, Value[] values) { } public void filePropertyChanged(ModelEvent event) { Model model = getModel(); computeEnableItems(model); File file = model.getFile(); fileField.setText(file == null ? "" : file.getPath()); enableButton.setEnabled(file != null); headerCheckBox.setSelected(model.getFileHeader()); } private void computeEnableItems(Model model) { if (model.isFileEnabled()) { enableLabel.setText(Strings.get("fileEnabled")); enableButton.setText(Strings.get("fileDisableButton")); } else { enableLabel.setText(Strings.get("fileDisabled")); enableButton.setText(Strings.get("fileEnableButton")); } } public void actionPerformed(ActionEvent event) { Object src = event.getSource(); if (src == enableButton) { getModel().setFileEnabled(!getModel().isFileEnabled()); } else if (src == selectButton) { int result = chooser.showSaveDialog(getLogFrame()); if (result != JFileChooser.APPROVE_OPTION) return; File file = chooser.getSelectedFile(); if (file.exists() && (!file.canWrite() || file.isDirectory())) { JOptionPane.showMessageDialog(getLogFrame(), StringUtil.format(Strings.get("fileCannotWriteMessage"), file.getName()), Strings.get("fileCannotWriteTitle"), JOptionPane.OK_OPTION); return; } if (file.exists() && file.length() > 0) { String[] options = { Strings.get("fileOverwriteOption"), Strings.get("fileAppendOption"), Strings.get("fileCancelOption"), }; int option = JOptionPane.showOptionDialog(getLogFrame(), StringUtil.format(Strings.get("fileExistsMessage"), file.getName()), Strings.get("fileExistsTitle"), 0, JOptionPane.QUESTION_MESSAGE, null, options, options[0]); if (option == 0) { try { FileWriter delete = new FileWriter(file); delete.close(); } catch (IOException e) { } } else if (option == 1) { // do nothing } else { return; } } getModel().setFile(file); } else if (src == headerCheckBox) { getModel().setFileHeader(headerCheckBox.isSelected()); } } } private Listener listener = new Listener(); private JLabel enableLabel = new JLabel(); private JButton enableButton = new JButton(); private JLabel fileLabel = new JLabel(); private JTextField fileField = new JTextField(); private JButton selectButton = new JButton(); private JCheckBox headerCheckBox = new JCheckBox(); private JFileChooser chooser = JFileChoosers.create(); public FilePanel(LogFrame frame) { super(frame); JPanel filePanel = new JPanel(new GridBagLayout()); GridBagLayout gb = (GridBagLayout) filePanel.getLayout(); GridBagConstraints gc = new GridBagConstraints(); gc.fill = GridBagConstraints.HORIZONTAL; gb.setConstraints(fileLabel, gc); filePanel.add(fileLabel); gc.weightx = 1.0; gb.setConstraints(fileField, gc); filePanel.add(fileField); gc.weightx = 0.0; gb.setConstraints(selectButton, gc); filePanel.add(selectButton); fileField.setEditable(false); fileField.setEnabled(false); setLayout(new GridBagLayout()); gb = (GridBagLayout) getLayout(); gc = new GridBagConstraints(); gc.gridx = 0; gc.weightx = 1.0; gc.gridy = GridBagConstraints.RELATIVE; JComponent glue; glue = new JPanel(); gc.weighty = 1.0; gb.setConstraints(glue, gc); add(glue); gc.weighty = 0.0; gb.setConstraints(enableLabel, gc); add(enableLabel); gb.setConstraints(enableButton, gc); add(enableButton); glue = new JPanel(); gc.weighty = 1.0; gb.setConstraints(glue, gc); add(glue); gc.weighty = 0.0; gc.fill = GridBagConstraints.HORIZONTAL; gb.setConstraints(filePanel, gc); add(filePanel); gc.fill = GridBagConstraints.NONE; glue = new JPanel(); gc.weighty = 1.0; gb.setConstraints(glue, gc); add(glue); gc.weighty = 0.0; gb.setConstraints(headerCheckBox, gc); add(headerCheckBox); glue = new JPanel(); gc.weighty = 1.0; gb.setConstraints(glue, gc); add(glue); gc.weighty = 0.0; enableButton.addActionListener(listener); selectButton.addActionListener(listener); headerCheckBox.addActionListener(listener); modelChanged(null, getModel()); localeChanged(); } @Override public String getTitle() { return Strings.get("fileTab"); } @Override public String getHelpText() { return Strings.get("fileHelp"); } @Override public void localeChanged() { listener.computeEnableItems(getModel()); fileLabel.setText(Strings.get("fileLabel") + " "); selectButton.setText(Strings.get("fileSelectButton")); headerCheckBox.setText(Strings.get("fileHeaderCheck")); } @Override public void modelChanged(Model oldModel, Model newModel) { if (oldModel != null) oldModel.removeModelListener(listener); if (newModel != null) { newModel.addModelListener(listener); listener.filePropertyChanged(null); } } } logisim-2.7.1/src/com/cburch/logisim/gui/log/ComponentSelector.java0000644000175000017500000002431311520127056025215 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.log; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.Enumeration; import java.util.List; import javax.swing.JLabel; import javax.swing.JTree; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; import com.cburch.logisim.circuit.CircuitEvent; import com.cburch.logisim.circuit.CircuitListener; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.circuit.SubcircuitFactory; import com.cburch.logisim.comp.Component; import com.cburch.logisim.instance.StdAttr; class ComponentSelector extends JTree { private static class CompareByName implements Comparator { public int compare(Object a, Object b) { return a.toString().compareToIgnoreCase(b.toString()); } } private class CircuitNode implements TreeNode, CircuitListener, Comparator { private CircuitNode parent; private CircuitState circuitState; private Component subcircComp; private ArrayList children; public CircuitNode(CircuitNode parent, CircuitState circuitState, Component subcircComp) { this.parent = parent; this.circuitState = circuitState; this.subcircComp = subcircComp; this.children = new ArrayList(); circuitState.getCircuit().addCircuitListener(this); computeChildren(); } @Override public String toString() { if (subcircComp != null) { String label = subcircComp.getAttributeSet().getValue(StdAttr.LABEL); if (label != null && !label.equals("")) { return label; } } String ret = circuitState.getCircuit().getName(); if (subcircComp != null) { ret += subcircComp.getLocation(); } return ret; } public TreeNode getChildAt(int index) { return children.get(index); } public int getChildCount() { return children.size(); } public TreeNode getParent() { return parent; } public int getIndex(TreeNode node) { return children.indexOf(node); } public boolean getAllowsChildren() { return true; } public boolean isLeaf() { return false; } public Enumeration children() { return Collections.enumeration(children); } public void circuitChanged(CircuitEvent event) { int action = event.getAction(); DefaultTreeModel model = (DefaultTreeModel) getModel(); if (action == CircuitEvent.ACTION_SET_NAME) { model.nodeChanged(this); } else { if (computeChildren()) { model.nodeStructureChanged(this); } else if (action == CircuitEvent.ACTION_INVALIDATE) { Object o = event.getData(); for (int i = children.size() - 1; i >= 0; i--) { Object o2 = children.get(i); if (o2 instanceof ComponentNode) { ComponentNode n = (ComponentNode) o2; if (n.comp == o) { int[] changed = { i }; children.remove(i); model.nodesWereRemoved(this, changed, new Object[] { n }); children.add(i, new ComponentNode(this, n.comp)); model.nodesWereInserted(this, changed); } } } } } } // returns true if changed private boolean computeChildren() { ArrayList newChildren = new ArrayList(); ArrayList subcircs = new ArrayList(); for (Component comp : circuitState.getCircuit().getNonWires()) { if (comp.getFactory() instanceof SubcircuitFactory) { subcircs.add(comp); } else { Object o = comp.getFeature(Loggable.class); if (o != null) { ComponentNode toAdd = null; for (TreeNode o2 : children) { if (o2 instanceof ComponentNode) { ComponentNode n = (ComponentNode) o2; if (n.comp == comp) { toAdd = n; break; } } } if (toAdd == null) toAdd = new ComponentNode(this, comp); newChildren.add(toAdd); } } } Collections.sort(newChildren, new CompareByName()); Collections.sort(subcircs, this); for (Component comp : subcircs) { SubcircuitFactory factory = (SubcircuitFactory) comp.getFactory(); CircuitState state = factory.getSubstate(circuitState, comp); CircuitNode toAdd = null; for (TreeNode o : children) { if (o instanceof CircuitNode) { CircuitNode n = (CircuitNode) o; if (n.circuitState == state) { toAdd = n; break; } } } if (toAdd == null) { toAdd = new CircuitNode(this, state, comp); } newChildren.add(toAdd); } if (!children.equals(newChildren)) { children = newChildren; return true; } else { return false; } } public int compare(Component a, Component b) { if (a != b) { String aName = a.getFactory().getDisplayName(); String bName = b.getFactory().getDisplayName(); int ret = aName.compareToIgnoreCase(bName); if (ret != 0) return ret; } return a.getLocation().toString().compareTo(b.getLocation().toString()); } } private class ComponentNode implements TreeNode { private CircuitNode parent; private Component comp; private OptionNode[] opts; public ComponentNode(CircuitNode parent, Component comp) { this.parent = parent; this.comp = comp; this.opts = null; Loggable log = (Loggable) comp.getFeature(Loggable.class); if (log != null) { Object[] opts = log.getLogOptions(parent.circuitState); if (opts != null && opts.length > 0) { this.opts = new OptionNode[opts.length]; for (int i = 0; i < opts.length; i++) { this.opts[i] = new OptionNode(this, opts[i]); } } } } @Override public String toString() { Loggable log = (Loggable) comp.getFeature(Loggable.class); if (log != null) { String ret = log.getLogName(null); if (ret != null && !ret.equals("")) return ret; } return comp.getFactory().getDisplayName() + " " + comp.getLocation(); } public TreeNode getChildAt(int index) { return opts[index]; } public int getChildCount() { return opts == null ? 0 : opts.length; } public TreeNode getParent() { return parent; } public int getIndex(TreeNode n) { for (int i = 0; i < opts.length; i++) { if (opts[i] == n) return i; } return -1; } public boolean getAllowsChildren() { return false; } public boolean isLeaf() { return opts == null || opts.length == 0; } public Enumeration children() { return Collections.enumeration(Arrays.asList(opts)); } } private class OptionNode implements TreeNode { private ComponentNode parent; private Object option; public OptionNode(ComponentNode parent, Object option) { this.parent = parent; this.option = option; } @Override public String toString() { return option.toString(); } public TreeNode getChildAt(int arg0) { return null; } public int getChildCount() { return 0; } public TreeNode getParent() { return parent; } public int getIndex(TreeNode n) { return -1; } public boolean getAllowsChildren() { return false; } public boolean isLeaf() { return true; } public Enumeration children() { return Collections.enumeration(Collections.emptySet()); } } private class MyCellRenderer extends DefaultTreeCellRenderer { @Override public java.awt.Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { java.awt.Component ret = super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); if (ret instanceof JLabel && value instanceof ComponentNode) { ComponentNode node = (ComponentNode) value; ComponentIcon icon = new ComponentIcon(node.comp); if (node.getChildCount() > 0) { icon.setTriangleState(expanded ? ComponentIcon.TRIANGLE_OPEN : ComponentIcon.TRIANGLE_CLOSED); } ((JLabel) ret).setIcon(icon); } return ret; } } private Model logModel; public ComponentSelector(Model logModel) { DefaultTreeModel model = new DefaultTreeModel(null); model.setAsksAllowsChildren(false); setModel(model); setRootVisible(false); setLogModel(logModel); setCellRenderer(new MyCellRenderer()); } public void setLogModel(Model value) { this.logModel = value; DefaultTreeModel model = (DefaultTreeModel) getModel(); CircuitNode curRoot = (CircuitNode) model.getRoot(); CircuitState state = logModel == null ? null : logModel.getCircuitState(); if (state == null) { if (curRoot != null) model.setRoot(null); return; } if (curRoot == null || curRoot.circuitState != state) { curRoot = new CircuitNode(null, state, null); model.setRoot(curRoot); } } public List getSelectedItems() { TreePath[] sel = getSelectionPaths(); if (sel == null || sel.length == 0) return Collections.emptyList(); ArrayList ret = new ArrayList(); for (int i = 0; i < sel.length; i++) { TreePath path = sel[i]; Object last = path.getLastPathComponent(); ComponentNode n = null; Object opt = null; if (last instanceof OptionNode) { OptionNode o = (OptionNode) last; n = o.parent; opt = o.option; } else if (last instanceof ComponentNode) { n = (ComponentNode) last; if (n.opts != null) n = null; } if (n != null) { int count = 0; for (CircuitNode cur = n.parent; cur != null; cur = cur.parent) { count++; } Component[] nPath = new Component[count - 1]; CircuitNode cur = n.parent; for (int j = nPath.length - 1; j >= 0; j--) { nPath[j] = cur.subcircComp; cur = cur.parent; } ret.add(new SelectionItem(logModel, nPath, n.comp, opt)); } } return ret.size() == 0 ? null : ret; } public boolean hasSelectedItems() { TreePath[] sel = getSelectionPaths(); if (sel == null || sel.length == 0) return false; for (int i = 0; i < sel.length; i++) { Object last = sel[i].getLastPathComponent(); if (last instanceof OptionNode) { return true; } else if (last instanceof ComponentNode) { if (((ComponentNode) last).opts == null) return true; } } return false; } public void localeChanged() { repaint(); } } logisim-2.7.1/src/com/cburch/logisim/gui/log/ComponentIcon.java0000644000175000017500000000304411446034534024330 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.log; import java.awt.Color; import java.awt.Graphics; import javax.swing.Icon; import com.cburch.logisim.comp.Component; import com.cburch.logisim.comp.ComponentDrawContext; class ComponentIcon implements Icon { public static final int TRIANGLE_NONE = 0; public static final int TRIANGLE_CLOSED = 1; public static final int TRIANGLE_OPEN = 2; private Component comp; private int triangleState = TRIANGLE_NONE; ComponentIcon(Component comp) { this.comp = comp; } public void setTriangleState(int value) { triangleState = value; } public int getIconHeight() { return 20; } public int getIconWidth() { return 20; } public void paintIcon(java.awt.Component c, Graphics g, int x, int y) { // draw tool icon Graphics gIcon = g.create(); ComponentDrawContext context = new ComponentDrawContext(c, null, null, g, gIcon); comp.getFactory().paintIcon(context, x, y, comp.getAttributeSet()); gIcon.dispose(); if (triangleState != TRIANGLE_NONE) { int[] xp; int[] yp; if (triangleState == TRIANGLE_CLOSED) { xp = new int[] { x + 13, x + 13, x + 17 }; yp = new int[] { y + 11, y + 19, y + 15 }; } else { xp = new int[] { x + 11, x + 19, x + 15 }; yp = new int[] { y + 13, y + 13, y + 17 }; } g.setColor(Color.LIGHT_GRAY); g.fillPolygon(xp, yp, 3); g.setColor(Color.DARK_GRAY); g.drawPolygon(xp, yp, 3); } } } logisim-2.7.1/src/com/cburch/logisim/gui/hex/0000755000175000017500000000000011455470056020717 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/logisim/gui/hex/Strings.java0000644000175000017500000000102611451540062023201 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.hex; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.StringGetter; class Strings { private static LocaleManager source = new LocaleManager("resources/logisim", "hex"); public static String get(String key) { return source.get(key); } public static StringGetter getter(String key) { return source.getter(key); } } logisim-2.7.1/src/com/cburch/logisim/gui/hex/HexFrame.java0000644000175000017500000001475311455470056023273 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.hex; import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowEvent; import java.io.File; import java.io.IOException; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import com.cburch.hex.HexEditor; import com.cburch.hex.HexModel; import com.cburch.logisim.gui.generic.LFrame; import com.cburch.logisim.gui.menu.LogisimMenuBar; import com.cburch.logisim.proj.Project; import com.cburch.logisim.util.JFileChoosers; import com.cburch.logisim.util.LocaleListener; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.WindowMenuItemManager; public class HexFrame extends LFrame { private class WindowMenuManager extends WindowMenuItemManager implements LocaleListener { WindowMenuManager() { super(Strings.get("hexFrameMenuItem"), false); LocaleManager.addLocaleListener(this); } @Override public JFrame getJFrame(boolean create) { return HexFrame.this; } public void localeChanged() { setText(Strings.get("hexFrameMenuItem")); } } private class MyListener implements ActionListener, LocaleListener { private File lastFile = null; public void actionPerformed(ActionEvent event) { Object src = event.getSource(); if (src == open) { JFileChooser chooser = JFileChoosers.createSelected(lastFile); chooser.setDialogTitle(Strings.get("openButton")); int choice = chooser.showOpenDialog(HexFrame.this); if (choice == JFileChooser.APPROVE_OPTION) { File f = chooser.getSelectedFile(); try { HexFile.open(model, f); lastFile = f; } catch (IOException e) { JOptionPane.showMessageDialog(HexFrame.this, e.getMessage(), Strings.get("hexOpenErrorTitle"), JOptionPane.ERROR_MESSAGE); } } } else if (src == save) { JFileChooser chooser = JFileChoosers.createSelected(lastFile); chooser.setDialogTitle(Strings.get("saveButton")); int choice = chooser.showSaveDialog(HexFrame.this); if (choice == JFileChooser.APPROVE_OPTION) { File f = chooser.getSelectedFile(); try { HexFile.save(f, model); lastFile = f; } catch (IOException e) { JOptionPane.showMessageDialog(HexFrame.this, e.getMessage(), Strings.get("hexSaveErrorTitle"), JOptionPane.ERROR_MESSAGE); } } } else if (src == close) { WindowEvent e = new WindowEvent(HexFrame.this, WindowEvent.WINDOW_CLOSING); HexFrame.this.processWindowEvent(e); } } public void localeChanged() { setTitle(Strings.get("hexFrameTitle")); open.setText(Strings.get("openButton")); save.setText(Strings.get("saveButton")); close.setText(Strings.get("closeButton")); } } private class EditListener implements ActionListener, ChangeListener { private Clip clip = null; private Clip getClip() { if (clip == null) clip = new Clip(editor); return clip; } private void register(LogisimMenuBar menubar) { menubar.addActionListener(LogisimMenuBar.CUT, this); menubar.addActionListener(LogisimMenuBar.COPY, this); menubar.addActionListener(LogisimMenuBar.PASTE, this); menubar.addActionListener(LogisimMenuBar.DELETE, this); menubar.addActionListener(LogisimMenuBar.SELECT_ALL, this); enableItems(menubar); } public void actionPerformed(ActionEvent e) { Object src = e.getSource(); if (src == LogisimMenuBar.CUT) { getClip().copy(); editor.delete(); } else if (src == LogisimMenuBar.COPY) { getClip().copy(); } else if (src == LogisimMenuBar.PASTE) { getClip().paste(); } else if (src == LogisimMenuBar.DELETE) { editor.delete(); } else if (src == LogisimMenuBar.SELECT_ALL) { editor.selectAll(); } } private void enableItems(LogisimMenuBar menubar) { boolean sel = editor.selectionExists(); boolean clip = true; //TODO editor.clipboardExists(); menubar.setEnabled(LogisimMenuBar.CUT, sel); menubar.setEnabled(LogisimMenuBar.COPY, sel); menubar.setEnabled(LogisimMenuBar.PASTE, clip); menubar.setEnabled(LogisimMenuBar.DELETE, sel); menubar.setEnabled(LogisimMenuBar.SELECT_ALL, true); } public void stateChanged(ChangeEvent e) { enableItems((LogisimMenuBar) getJMenuBar()); } } private WindowMenuManager windowManager = new WindowMenuManager(); private EditListener editListener = new EditListener(); private MyListener myListener = new MyListener(); private HexModel model; private HexEditor editor; private JButton open = new JButton(); private JButton save = new JButton(); private JButton close = new JButton(); public HexFrame(Project proj, HexModel model) { setDefaultCloseOperation(HIDE_ON_CLOSE); LogisimMenuBar menubar = new LogisimMenuBar(this, proj); setJMenuBar(menubar); this.model = model; this.editor = new HexEditor(model); JPanel buttonPanel = new JPanel(); buttonPanel.add(open); buttonPanel.add(save); buttonPanel.add(close); open.addActionListener(myListener); save.addActionListener(myListener); close.addActionListener(myListener); Dimension pref = editor.getPreferredSize(); JScrollPane scroll = new JScrollPane(editor, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); pref.height = Math.min(pref.height, pref.width * 3 / 2); scroll.setPreferredSize(pref); scroll.getViewport().setBackground(editor.getBackground()); Container contents = getContentPane(); contents.add(scroll, BorderLayout.CENTER); contents.add(buttonPanel, BorderLayout.SOUTH); LocaleManager.addLocaleListener(myListener); myListener.localeChanged(); pack(); Dimension size = getSize(); Dimension screen = getToolkit().getScreenSize(); if (size.width > screen.width || size.height > screen.height) { size.width = Math.min(size.width, screen.width); size.height = Math.min(size.height, screen.height); setSize(size); } editor.getCaret().addChangeListener(editListener); editor.getCaret().setDot(0, false); editListener.register(menubar); } @Override public void setVisible(boolean value) { if (value && !isVisible()) { windowManager.frameOpened(this); } super.setVisible(value); } } logisim-2.7.1/src/com/cburch/logisim/gui/hex/HexFile.java0000644000175000017500000001410311451010350023064 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.hex; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.Reader; import java.io.Writer; import java.util.Arrays; import java.util.StringTokenizer; import com.cburch.hex.HexModel; public class HexFile { private HexFile() { } private static final String RAW_IMAGE_HEADER = "v2.0 raw"; private static final String COMMENT_MARKER = "#"; private static class HexReader { private BufferedReader in; private int[] data; private StringTokenizer curLine; private long leftCount; private long leftValue; public HexReader(BufferedReader in) throws IOException { this.in = in; data = new int[4096]; curLine = findNonemptyLine(); } private StringTokenizer findNonemptyLine() throws IOException { String line = in.readLine(); while (line != null) { int index = line.indexOf(COMMENT_MARKER); if (index >= 0) { line = line.substring(0, index); } StringTokenizer ret = new StringTokenizer(line); if (ret.hasMoreTokens()) return ret; line = this.in.readLine(); } return null; } private String nextToken() throws IOException { if (curLine != null && curLine.hasMoreTokens()) { return curLine.nextToken(); } else { curLine = findNonemptyLine(); return curLine == null ? null : curLine.nextToken(); } } public boolean hasNext() throws IOException { if (leftCount > 0) { return true; } else if (curLine != null && curLine.hasMoreTokens()) { return true; } else { curLine = findNonemptyLine(); return curLine != null; } } public int[] next() throws IOException { int pos = 0; if (leftCount > 0) { int n = (int) Math.min(data.length - pos, leftCount); if (n == 1) { data[pos] = (int) leftValue; pos++; leftCount--; } else { Arrays.fill(data, pos, pos + n, (int) leftValue); pos += n; leftCount -= n; } } if (pos >= data.length) return data; for (String tok = nextToken(); tok != null; tok = nextToken()) { try { int star = tok.indexOf("*"); if (star < 0) { leftCount = 1; leftValue = Long.parseLong(tok, 16); } else { leftCount = Long.parseLong(tok.substring(0, star)); leftValue = Long.parseLong(tok.substring(star + 1), 16); } } catch (NumberFormatException e) { throw new IOException(Strings.get("hexNumberFormatError")); } int n = (int) Math.min(data.length - pos, leftCount); if (n == 1) { data[pos] = (int) leftValue; pos++; leftCount--; } else { Arrays.fill(data, pos, pos + n, (int) leftValue); pos += n; leftCount -= n; } if (pos >= data.length) return data; } if (pos >= data.length) { return data; } else { int[] ret = new int[pos]; System.arraycopy(data, 0, ret, 0, pos); return ret; } } } public static void save(Writer out, HexModel src) throws IOException { long first = src.getFirstOffset(); long last = src.getLastOffset(); while (last > first && src.get(last) == 0) last--; int tokens = 0; long cur = 0; while (cur <= last) { int val = src.get(cur); long start = cur; cur++; while (cur <= last && src.get(cur) == val) cur++; long len = cur - start; if (len < 4) { cur = start + 1; len = 1; } try { if (tokens > 0) out.write(tokens % 8 == 0 ? '\n' : ' '); if (cur != start + 1) out.write((cur - start) + "*"); out.write(Integer.toHexString(val)); } catch (IOException e) { throw new IOException(Strings.get("hexFileWriteError")); } tokens++; } if (tokens > 0) out.write('\n'); } public static void open(HexModel dst, Reader in) throws IOException { HexReader reader = new HexReader(new BufferedReader(in)); long offs = dst.getFirstOffset(); while (reader.hasNext()) { int[] values = reader.next(); if (offs + values.length - 1 > dst.getLastOffset()) { throw new IOException(Strings.get("hexFileSizeError")); } dst.set(offs, values); offs += values.length; } dst.fill(offs, dst.getLastOffset() - offs + 1, 0); } public static int[] parse(Reader in) throws IOException { HexReader reader = new HexReader(new BufferedReader(in)); int cur = 0; int[] data = new int[4096]; while (reader.hasNext()) { int[] values = reader.next(); if (cur + values.length > data.length) { int[] oldData = data; data = new int[Math.max(cur + values.length, 3 * data.length / 2)]; System.arraycopy(oldData, 0, data, 0, cur); } System.arraycopy(values, 0, data, cur, values.length); cur += values.length; } if (cur != data.length) { int[] oldData = data; data = new int[cur]; System.arraycopy(oldData, 0, data, 0, cur); } return data; } public static void open(HexModel dst, File src) throws IOException { BufferedReader in; try { in = new BufferedReader(new FileReader(src)); } catch (IOException e) { throw new IOException(Strings.get("hexFileOpenError")); } try { String header = in.readLine(); if (!header.equals(RAW_IMAGE_HEADER)) { throw new IOException(Strings.get("hexHeaderFormatError")); } open(dst, in); try { BufferedReader oldIn = in; in = null; oldIn.close(); } catch (IOException e) { throw new IOException(Strings.get("hexFileReadError")); } } finally { try { if (in != null) in.close(); } catch (IOException e) { } } } public static void save(File dst, HexModel src) throws IOException { FileWriter out; try { out = new FileWriter(dst); } catch (IOException e) { throw new IOException(Strings.get("hexFileOpenError")); } try { try { out.write(RAW_IMAGE_HEADER + "\n"); } catch (IOException e) { throw new IOException(Strings.get("hexFileWriteError")); } save(out, src); } finally { try { out.close(); } catch (IOException e) { throw new IOException(Strings.get("hexFileWriteError")); } } } } logisim-2.7.1/src/com/cburch/logisim/gui/hex/Clip.java0000644000175000017500000001110711446034536022450 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.hex; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.ClipboardOwner; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.io.IOException; import java.io.StringReader; import javax.swing.JOptionPane; import com.cburch.hex.Caret; import com.cburch.hex.HexEditor; import com.cburch.hex.HexModel; class Clip implements ClipboardOwner { private static final DataFlavor binaryFlavor = new DataFlavor(int[].class, "Binary data"); private static class Data implements Transferable { private int[] data; Data(int[] data) { this.data = data; } public DataFlavor[] getTransferDataFlavors() { return new DataFlavor[] { binaryFlavor, DataFlavor.stringFlavor }; } public boolean isDataFlavorSupported(DataFlavor flavor) { return flavor == binaryFlavor || flavor == DataFlavor.stringFlavor; } public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { if (flavor == binaryFlavor) { return data; } else if (flavor == DataFlavor.stringFlavor) { int bits = 1; for (int i = 0; i < data.length; i++) { int k = data[i] >> bits; while (k != 0 && bits < 32) { bits++; k >>= 1; } } int chars = (bits + 3) / 4; StringBuilder buf = new StringBuilder(); for (int i = 0; i < data.length; i++) { if (i > 0) { buf.append(i % 8 == 0 ? '\n' : ' '); } String s = Integer.toHexString(data[i]); while (s.length() < chars) s = "0" + s; buf.append(s); } return buf.toString(); } else { throw new UnsupportedFlavorException(flavor); } } } private HexEditor editor; Clip(HexEditor editor) { this.editor = editor; } public void copy() { Caret caret = editor.getCaret(); long p0 = caret.getMark(); long p1 = caret.getDot(); if (p0 < 0 || p1 < 0) return; if (p0 > p1) { long t = p0; p0 = p1; p1 = t; } p1++; int[] data = new int[(int) (p1 - p0)]; HexModel model = editor.getModel(); for (long i = p0; i < p1; i++) { data[(int) (i - p0)] = model.get(i); } Clipboard clip = editor.getToolkit().getSystemClipboard(); clip.setContents(new Data(data), this); } public boolean canPaste() { Clipboard clip = editor.getToolkit().getSystemClipboard(); Transferable xfer = clip.getContents(this); return xfer.isDataFlavorSupported(binaryFlavor); } public void paste() { Clipboard clip = editor.getToolkit().getSystemClipboard(); Transferable xfer = clip.getContents(this); int[] data; if (xfer.isDataFlavorSupported(binaryFlavor)) { try { data = (int[]) xfer.getTransferData(binaryFlavor); } catch (UnsupportedFlavorException e) { return; } catch (IOException e) { return; } } else if (xfer.isDataFlavorSupported(DataFlavor.stringFlavor)) { String buf; try { buf = (String) xfer.getTransferData(DataFlavor.stringFlavor); } catch (UnsupportedFlavorException e) { return; } catch (IOException e) { return; } try { data = HexFile.parse(new StringReader(buf)); } catch (IOException e) { JOptionPane.showMessageDialog(editor.getRootPane(), e.getMessage(), // Strings.get("hexPasteSupportedError"), Strings.get("hexPasteErrorTitle"), JOptionPane.ERROR_MESSAGE); return; } } else { JOptionPane.showMessageDialog(editor.getRootPane(), Strings.get("hexPasteSupportedError"), Strings.get("hexPasteErrorTitle"), JOptionPane.ERROR_MESSAGE); return; } Caret caret = editor.getCaret(); long p0 = caret.getMark(); long p1 = caret.getDot(); if (p0 == p1) { HexModel model = editor.getModel(); if (p0 + data.length - 1 <= model.getLastOffset()) { model.set(p0, data); } else { JOptionPane.showMessageDialog(editor.getRootPane(), Strings.get("hexPasteEndError"), Strings.get("hexPasteErrorTitle"), JOptionPane.ERROR_MESSAGE); } } else { if (p0 < 0 || p1 < 0) return; if (p0 > p1) { long t = p0; p0 = p1; p1 = t; } p1++; HexModel model = editor.getModel(); if (p1 - p0 == data.length) { model.set(p0, data); } else { JOptionPane.showMessageDialog(editor.getRootPane(), Strings.get("hexPasteSizeError"), Strings.get("hexPasteErrorTitle"), JOptionPane.ERROR_MESSAGE); } } } public void lostOwnership(Clipboard clip, Transferable transfer) { } } logisim-2.7.1/src/com/cburch/logisim/gui/generic/0000755000175000017500000000000011541271702021540 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/logisim/gui/generic/ZoomModelListener.java0000644000175000017500000000035111446034546026024 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.generic; public class ZoomModelListener { } logisim-2.7.1/src/com/cburch/logisim/gui/generic/ZoomModel.java0000644000175000017500000000131511446034546024317 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.generic; import java.beans.PropertyChangeListener; public interface ZoomModel { public static final String ZOOM = "zoom"; public static final String SHOW_GRID = "grid"; public void addPropertyChangeListener(String prop, PropertyChangeListener l); public void removePropertyChangeListener(String prop, PropertyChangeListener l); public boolean getShowGrid(); public double getZoomFactor(); public double[] getZoomOptions(); public void setShowGrid(boolean value); public void setZoomFactor(double value); } logisim-2.7.1/src/com/cburch/logisim/gui/generic/ZoomControl.java0000644000175000017500000001057611447117142024703 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.generic; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.swing.AbstractSpinnerModel; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.JSpinner; public class ZoomControl extends JPanel { private class SpinnerModel extends AbstractSpinnerModel implements PropertyChangeListener { public Object getNextValue() { double zoom = model.getZoomFactor(); double[] choices = model.getZoomOptions(); double factor = zoom * 100.0 * 1.001; for (int i = 0; i < choices.length; i++) { if (choices[i] > factor) return toString(choices[i]); } return null; } public Object getPreviousValue() { double zoom = model.getZoomFactor(); double[] choices = model.getZoomOptions(); double factor = zoom * 100.0 * 0.999; for (int i = choices.length - 1; i >= 0; i--) { if (choices[i] < factor) return toString(choices[i]); } return null; } public Object getValue() { double zoom = model.getZoomFactor(); return toString(zoom * 100.0); } private String toString(double factor) { if (factor > 10) { return (int) (factor + 0.5) + "%"; } else if (factor > 0.1) { return (int) (factor * 100 + 0.5) / 100.0 + "%"; } else { return factor + "%"; } } public void setValue(Object value) { if (value instanceof String) { String s = (String) value; if (s.endsWith("%")) s = s.substring(0, s.length() - 1); s = s.trim(); try { double zoom = Double.parseDouble(s) / 100.0; model.setZoomFactor(zoom); } catch (NumberFormatException e) { } } } public void propertyChange(PropertyChangeEvent evt) { fireStateChanged(); } } private class GridIcon extends JComponent implements MouseListener, PropertyChangeListener { boolean state = true; public GridIcon() { addMouseListener(this); setPreferredSize(new Dimension(15, 15)); setToolTipText(""); setFocusable(true); } @Override public String getToolTipText(MouseEvent e) { return Strings.get("zoomShowGrid"); } private void update() { boolean grid = model.getShowGrid(); if (grid != state) { state = grid; repaint(); } } @Override protected void paintComponent(Graphics g) { int width = getWidth(); int height = getHeight(); g.setColor(state ? Color.black : getBackground().darker()); int dim = (Math.min(width, height) - 4) / 3 * 3 + 1; int xoff = (width - dim) / 2; int yoff = (height - dim) / 2; for (int x = 0; x < dim; x += 3) { for (int y = 0; y < dim; y += 3) { g.drawLine(x + xoff, y + yoff, x + xoff, y + yoff); } } } public void mouseClicked(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void mousePressed(MouseEvent e) { model.setShowGrid(!state); } public void propertyChange(PropertyChangeEvent evt) { update(); } } private ZoomModel model; private JSpinner spinner; private SpinnerModel spinnerModel; private GridIcon grid; public ZoomControl(ZoomModel model) { super(new BorderLayout()); this.model = model; spinnerModel = new SpinnerModel(); spinner = new JSpinner(); spinner.setModel(spinnerModel); this.add(spinner, BorderLayout.CENTER); grid = new GridIcon(); this.add(grid, BorderLayout.EAST); grid.update(); model.addPropertyChangeListener(ZoomModel.SHOW_GRID, grid); model.addPropertyChangeListener(ZoomModel.ZOOM, spinnerModel); } public void setZoomModel(ZoomModel value) { ZoomModel oldModel = model; if (oldModel != value) { if (oldModel != null) { oldModel.removePropertyChangeListener(ZoomModel.SHOW_GRID, grid); oldModel.removePropertyChangeListener(ZoomModel.ZOOM, spinnerModel); } model = value; spinnerModel = new SpinnerModel(); spinner.setModel(spinnerModel); grid.update(); if (value != null) { value.addPropertyChangeListener(ZoomModel.SHOW_GRID, grid); value.addPropertyChangeListener(ZoomModel.ZOOM, spinnerModel); } } } } logisim-2.7.1/src/com/cburch/logisim/gui/generic/Strings.java0000644000175000017500000000125611451540052024035 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.generic; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.StringGetter; import com.cburch.logisim.util.StringUtil; class Strings { private static LocaleManager source = new LocaleManager("resources/logisim", "gui"); public static String get(String key) { return source.get(key); } public static String get(String key, String arg) { return StringUtil.format(source.get(key), arg); } public static StringGetter getter(String key) { return source.getter(key); } } logisim-2.7.1/src/com/cburch/logisim/gui/generic/LFrame.java0000644000175000017500000000360411541271664023563 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.generic; import java.awt.Image; import java.awt.Window; import java.awt.event.WindowEvent; import java.lang.reflect.Method; import java.net.URL; import java.util.ArrayList; import java.util.List; import javax.swing.ImageIcon; import javax.swing.JFrame; import com.cburch.logisim.util.WindowClosable; public class LFrame extends JFrame implements WindowClosable { private static final String PATH = "resources/logisim/img/logisim-icon-"; private static final int[] SIZES = { 16, 20, 24, 48, 64, 128 }; private static List ICONS = null; private static final int DEFAULT_SIZE = 48; private static Image DEFAULT_ICON = null; public static void attachIcon(Window frame) { if (ICONS == null) { List loadedIcons = new ArrayList(); ClassLoader loader = LFrame.class.getClassLoader(); for (int size : SIZES) { URL url = loader.getResource(PATH + size + ".png"); if (url != null) { ImageIcon icon = new ImageIcon(url); loadedIcons.add(icon.getImage()); if (size == DEFAULT_SIZE) { DEFAULT_ICON = icon.getImage(); } } } ICONS = loadedIcons; } boolean success = false; try { if (ICONS != null && !ICONS.isEmpty()) { Method set = frame.getClass().getMethod("setIconImages", List.class); set.invoke(frame, ICONS); success = true; } } catch (Exception e) { } if (!success && frame instanceof JFrame && DEFAULT_ICON != null) { ((JFrame) frame).setIconImage(DEFAULT_ICON); } } public LFrame() { LFrame.attachIcon(this); } public void requestClose() { WindowEvent closing = new WindowEvent(this, WindowEvent.WINDOW_CLOSING); processWindowEvent(closing); } } logisim-2.7.1/src/com/cburch/logisim/gui/generic/LDialog.java0000644000175000017500000000071411500267106023716 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.generic; import java.awt.Frame; import javax.swing.JDialog; public class LDialog extends JDialog { public LDialog(Frame owner, String title, boolean modal) { super(owner, title, modal); init(); } private void init() { LFrame.attachIcon(this); } } logisim-2.7.1/src/com/cburch/logisim/gui/generic/GridPainter.java0000644000175000017500000001676011447117142024627 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.generic; import java.awt.Color; import java.awt.Component; import java.awt.Graphics; import java.awt.Image; import java.awt.Rectangle; import java.awt.image.MemoryImageSource; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.util.Arrays; public class GridPainter { public static final String ZOOM_PROPERTY = "zoom"; public static final String SHOW_GRID_PROPERTY = "showgrid"; private static final int GRID_DOT_COLOR = 0xFF777777; private static final int GRID_DOT_ZOOMED_COLOR = 0xFFCCCCCC; private static final Color GRID_ZOOMED_OUT_COLOR = new Color(210, 210, 210); private class Listener implements PropertyChangeListener { public void propertyChange(PropertyChangeEvent event) { String prop = event.getPropertyName(); Object val = event.getNewValue(); if (prop.equals(ZoomModel.ZOOM)) { setZoomFactor(((Double) val).doubleValue()); destination.repaint(); } else if (prop.equals(ZoomModel.SHOW_GRID)) { setShowGrid(((Boolean) val).booleanValue()); destination.repaint(); } } } private Component destination; private PropertyChangeSupport support; private Listener listener; private ZoomModel zoomModel; private boolean showGrid; private int gridSize; private double zoomFactor; private Image gridImage; private int gridImageWidth; public GridPainter(Component destination) { this.destination = destination; support = new PropertyChangeSupport(this); showGrid = true; gridSize = 10; zoomFactor = 1.0; updateGridImage(gridSize, zoomFactor); } public void addPropertyChangeListener(String prop, PropertyChangeListener listener) { support.addPropertyChangeListener(prop, listener); } public void removePropertyChangeListener(String prop, PropertyChangeListener listener) { support.removePropertyChangeListener(prop, listener); } public boolean getShowGrid() { return showGrid; } public void setShowGrid(boolean value) { if (showGrid != value) { showGrid = value; support.firePropertyChange(SHOW_GRID_PROPERTY, !value, value); } } public double getZoomFactor() { return zoomFactor; } public void setZoomFactor(double value) { double oldValue = zoomFactor; if (oldValue != value) { zoomFactor = value; updateGridImage(gridSize, value); support.firePropertyChange(ZOOM_PROPERTY, Double.valueOf(oldValue), Double.valueOf(value)); } } public ZoomModel getZoomModel() { return zoomModel; } public void setZoomModel(ZoomModel model) { ZoomModel old = zoomModel; if (model != old) { if (listener == null) { listener = new Listener(); } if (old != null) { old.removePropertyChangeListener(ZoomModel.ZOOM, listener); old.removePropertyChangeListener(ZoomModel.SHOW_GRID, listener); } zoomModel = model; if (model != null) { model.addPropertyChangeListener(ZoomModel.ZOOM, listener); model.addPropertyChangeListener(ZoomModel.SHOW_GRID, listener); } setShowGrid(model.getShowGrid()); setZoomFactor(model.getZoomFactor()); destination.repaint(); } } public void paintGrid(Graphics g) { Rectangle clip = g.getClipBounds(); Component dest = destination; double zoom = zoomFactor; int size = gridSize; if (!showGrid) return; Image img = gridImage; int w = gridImageWidth; if (img == null) { paintGridOld(g, size, zoom, clip); return; } int x0 = (clip.x / w) * w; // round down to multiple of w int y0 = (clip.y / w) * w; for (int x = 0; x < clip.width + w; x += w) { for (int y = 0; y < clip.height + w; y += w) { g.drawImage(img, x0 + x, y0 + y, dest); } } } private void paintGridOld(Graphics g, int size, double f, Rectangle clip) { g.setColor(Color.GRAY); if (f == 1.0) { int start_x = ((clip.x + 9) / size) * size; int start_y = ((clip.y + 9) / size) * size; for (int x = 0; x < clip.width; x += size) { for (int y = 0; y < clip.height; y += size) { g.fillRect(start_x + x, start_y + y, 1, 1); } } } else { /* Kevin Walsh of Cornell suggested the code below instead. */ int x0 = size * (int) Math.ceil(clip.x / f / size); int x1 = x0 + (int) (clip.width / f); int y0 = size * (int) Math.ceil(clip.y / f / size); int y1 = y0 + (int) (clip.height / f); if (f <= 0.5) g.setColor(GRID_ZOOMED_OUT_COLOR); for (double x = x0; x < x1; x += size) { for (double y = y0; y < y1; y += size) { int sx = (int) Math.round(f * x); int sy = (int) Math.round(f * y); g.fillRect(sx, sy, 1, 1); } } if (f <= 0.5) { // make every 5th pixel darker int size5 = 5 * size; g.setColor(Color.GRAY); x0 = size5 * (int) Math.ceil(clip.x / f / size5); y0 = size5 * (int) Math.ceil(clip.y / f / size5); for (double x = x0; x < x1; x += size5) { for (double y = y0; y < y1; y += size5) { int sx = (int) Math.round(f * x); int sy = (int) Math.round(f * y); g.fillRect(sx, sy, 1, 1); } } } /* Original code by Carl Burch int x0 = 10 * (int) Math.ceil(clip.x / f / 10); int x1 = x0 + (int)(clip.width / f); int y0 = 10 * (int) Math.ceil(clip.y / f / 10); int y1 = y0 + (int) (clip.height / f); int s = f > 0.5 ? 1 : f > 0.25 ? 2 : 3; int i0 = s - ((x0 + 10*s - 1) % (s * 10)) / 10 - 1; int j0 = s - ((y1 + 10*s - 1) % (s * 10)) / 10 - 1; for (int i = 0; i < s; i++) { for (int x = x0+i*10; x < x1; x += s*10) { for (int j = 0; j < s; j++) { g.setColor(i == i0 && j == j0 ? Color.gray : GRID_ZOOMED_OUT_COLOR); for (int y = y0+j*10; y < y1; y += s*10) { int sx = (int) Math.round(f * x); int sy = (int) Math.round(f * y); g.fillRect(sx, sy, 1, 1); } } } } */ } } // // creating the grid image // private void updateGridImage(int size, double f) { double ww = f * size * 5; while (2 * ww < 150) ww *= 2; int w = (int) Math.round(ww); int[] pix = new int[w * w]; Arrays.fill(pix, 0xFFFFFF); if (f == 1.0) { int lineStep = size * w; for (int j = 0; j < pix.length; j += lineStep) { for (int i = 0; i < w; i += size) { pix[i + j] = GRID_DOT_COLOR; } } } else { int off0 = 0; int off1 = 1; if (f >= 2.0) { // we'll draw several pixels for each grid point int num = (int) (f + 0.001); off0 = -(num / 2); off1 = off0 + num; } int dotColor = f <= 0.5 ? GRID_DOT_ZOOMED_COLOR : GRID_DOT_COLOR; for (int j = 0; true; j += size) { int y = (int) Math.round(f * j); if (y + off0 >= w) break; for (int yo = y + off0; yo < y + off1; yo++) { if (yo >= 0 && yo < w) { int base = yo * w; for (int i = 0; true; i += size) { int x = (int) Math.round(f * i); if (x + off0 >= w) break; for (int xo = x + off0; xo < x + off1; xo++) { if (xo >= 0 && xo < w) { pix[base + xo] = dotColor; } } } } } } if (f <= 0.5) { // repaint over every 5th pixel so it is darker int size5 = size * 5; for (int j = 0; true; j += size5) { int y = (int) Math.round(f * j); if (y >= w) break; y *= w; for (int i = 0; true; i += size5) { int x = (int) Math.round(f * i); if (x >= w) break; pix[y + x] = GRID_DOT_COLOR; } } } } gridImage = destination.createImage(new MemoryImageSource(w, w, pix, 0, w)); gridImageWidth = w; } } logisim-2.7.1/src/com/cburch/logisim/gui/generic/CardPanel.java0000644000175000017500000000230211446034546024240 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.generic; import java.awt.CardLayout; import java.awt.Component; import java.util.ArrayList; import javax.swing.JPanel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; public class CardPanel extends JPanel { private ArrayList listeners; private String current; public CardPanel() { super(new CardLayout()); listeners = new ArrayList(); current = ""; } public void addChangeListener(ChangeListener listener) { listeners.add(listener); } public void addView(String name, Component comp) { add(comp, name); } public String getView() { return current; } public void setView(String choice) { if (choice == null) choice = ""; String oldChoice = current; if (!oldChoice.equals(choice)) { current = choice; ((CardLayout) getLayout()).show(this, choice); ChangeEvent e = new ChangeEvent(this); for (ChangeListener listener : listeners) { listener.stateChanged(e); } } } } logisim-2.7.1/src/com/cburch/logisim/gui/generic/CanvasPaneContents.java0000644000175000017500000000145511446034546026154 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.generic; import java.awt.Dimension; import java.awt.Rectangle; import javax.swing.Scrollable; public interface CanvasPaneContents extends Scrollable { public void setCanvasPane(CanvasPane pane); public void recomputeSize(); // from Scrollable public Dimension getPreferredScrollableViewportSize(); public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction); public boolean getScrollableTracksViewportHeight(); public boolean getScrollableTracksViewportWidth(); public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction); } logisim-2.7.1/src/com/cburch/logisim/gui/generic/CanvasPane.java0000644000175000017500000000722211446034546024434 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.generic; import java.awt.Component; import java.awt.Dimension; import java.awt.Rectangle; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.swing.JScrollPane; import javax.swing.SwingConstants; import com.cburch.logisim.util.MacCompatibility; public class CanvasPane extends JScrollPane { private class Listener implements ComponentListener, PropertyChangeListener { // // ComponentListener methods // public void componentResized(ComponentEvent e) { contents.recomputeSize(); } public void componentMoved(ComponentEvent e) { } public void componentShown(ComponentEvent e) { } public void componentHidden(ComponentEvent e) { } public void propertyChange(PropertyChangeEvent e) { String prop = e.getPropertyName(); if (prop.equals(ZoomModel.ZOOM)) { double oldZoom = ((Double) e.getOldValue()).doubleValue(); Rectangle r = getViewport().getViewRect(); double cx = (r.x + r.width / 2) / oldZoom; double cy = (r.y + r.height / 2) / oldZoom; double newZoom = ((Double) e.getNewValue()).doubleValue(); contents.recomputeSize(); r = getViewport().getViewRect(); int hv = (int) (cx * newZoom) - r.width / 2; int vv = (int) (cy * newZoom) - r.height / 2; getHorizontalScrollBar().setValue(hv); getVerticalScrollBar().setValue(vv); } } } private CanvasPaneContents contents; private Listener listener; private ZoomModel zoomModel; public CanvasPane(CanvasPaneContents contents) { super((Component) contents); this.contents = contents; this.listener = new Listener(); this.zoomModel = null; if (MacCompatibility.mrjVersion >= 0.0) { setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); } addComponentListener(listener); contents.setCanvasPane(this); } public void setZoomModel(ZoomModel model) { ZoomModel oldModel = zoomModel; if (oldModel != null) { oldModel.removePropertyChangeListener(ZoomModel.ZOOM, listener); } zoomModel = model; if (model != null) { model.addPropertyChangeListener(ZoomModel.ZOOM, listener); } } public double getZoomFactor() { ZoomModel model = zoomModel; return model == null ? 1.0 : model.getZoomFactor(); } public Dimension getViewportSize() { Dimension size = new Dimension(); getViewport().getSize(size); return size; } public int supportScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) { int unit = supportScrollableUnitIncrement(visibleRect, orientation, direction); if (direction == SwingConstants.VERTICAL) { return visibleRect.height / unit * unit; } else { return visibleRect.width / unit * unit; } } public int supportScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) { double zoom = getZoomFactor(); return (int) Math.round(10 * zoom); } public Dimension supportPreferredSize(int width, int height) { double zoom = getZoomFactor(); if (zoom != 1.0) { width = (int) Math.ceil(width * zoom); height = (int) Math.ceil(height * zoom); } Dimension minSize = getViewportSize(); if (minSize.width > width) width = minSize.width; if (minSize.height > height) height = minSize.height; return new Dimension(width, height); } } logisim-2.7.1/src/com/cburch/logisim/gui/generic/BasicZoomModel.java0000644000175000017500000000334711455255502025265 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.generic; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import com.cburch.logisim.gui.generic.ZoomModel; import com.cburch.logisim.prefs.PrefMonitor; public class BasicZoomModel implements ZoomModel { private double[] zoomOptions; private PropertyChangeSupport support; private double zoomFactor; private boolean showGrid; public BasicZoomModel(PrefMonitor gridPref, PrefMonitor zoomPref, double[] zoomOpts) { zoomOptions = zoomOpts; support = new PropertyChangeSupport(this); zoomFactor = 1.0; showGrid = true; setZoomFactor(zoomPref.get().doubleValue()); setShowGrid(gridPref.getBoolean()); } public void addPropertyChangeListener(String prop, PropertyChangeListener l) { support.addPropertyChangeListener(prop, l); } public void removePropertyChangeListener(String prop, PropertyChangeListener l) { support.removePropertyChangeListener(prop, l); } public boolean getShowGrid() { return showGrid; } public double getZoomFactor() { return zoomFactor; } public double[] getZoomOptions() { return zoomOptions; } public void setShowGrid(boolean value) { if (value != showGrid) { showGrid = value; support.firePropertyChange(ZoomModel.SHOW_GRID, !value, value); } } public void setZoomFactor(double value) { double oldValue = zoomFactor; if (value != oldValue) { zoomFactor = value; support.firePropertyChange(ZoomModel.ZOOM, Double.valueOf(oldValue), Double.valueOf(value)); } } } logisim-2.7.1/src/com/cburch/logisim/gui/generic/AttrTableSetException.java0000644000175000017500000000047511527054450026631 0ustar vincentvincent/* Copyright (c) 2011, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.generic; public class AttrTableSetException extends Exception { public AttrTableSetException(String msg) { super(msg); } } logisim-2.7.1/src/com/cburch/logisim/gui/generic/AttrTableModelRow.java0000644000175000017500000000075611527054450025751 0ustar vincentvincent/* Copyright (c) 2011, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.generic; import java.awt.Component; import java.awt.Window; public interface AttrTableModelRow { public String getLabel(); public String getValue(); public boolean isValueEditable(); public Component getEditor(Window parent); public void setValue(Object value) throws AttrTableSetException; } logisim-2.7.1/src/com/cburch/logisim/gui/generic/AttrTableModelListener.java0000644000175000017500000000064511527054450026764 0ustar vincentvincent/* Copyright (c) 2011, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.generic; public interface AttrTableModelListener { public void attrTitleChanged(AttrTableModelEvent event); public void attrStructureChanged(AttrTableModelEvent event); public void attrValueChanged(AttrTableModelEvent event); } logisim-2.7.1/src/com/cburch/logisim/gui/generic/AttrTableModelEvent.java0000644000175000017500000000121311527054450026250 0ustar vincentvincent/* Copyright (c) 2011, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.generic; public class AttrTableModelEvent { private AttrTableModel model; private int index; public AttrTableModelEvent(AttrTableModel model) { this(model, -1); } public AttrTableModelEvent(AttrTableModel model, int index) { this.model = model; this.index = index; } public Object getSource() { return model; } public AttrTableModel getModel() { return model; } public int getRowIndex() { return index; } } logisim-2.7.1/src/com/cburch/logisim/gui/generic/AttrTableModel.java0000644000175000017500000000075311527054450025256 0ustar vincentvincent/* Copyright (c) 2011, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.generic; public interface AttrTableModel { public void addAttrTableModelListener(AttrTableModelListener listener); public void removeAttrTableModelListener(AttrTableModelListener listener); public String getTitle(); public int getRowCount(); public AttrTableModelRow getRow(int rowIndex); } logisim-2.7.1/src/com/cburch/logisim/gui/generic/AttrTable.java0000644000175000017500000002726711541271702024303 0ustar vincentvincent/* Copyright (c) 2011, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.generic; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Font; import java.awt.Window; import java.awt.Dialog; import java.awt.Frame; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.awt.event.FocusListener; import java.awt.event.FocusEvent; import javax.swing.BorderFactory; import javax.swing.JComponent; import javax.swing.JOptionPane; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JLabel; import javax.swing.JTextField; import javax.swing.JPanel; import javax.swing.JComboBox; import javax.swing.SwingConstants; import javax.swing.event.CellEditorListener; import javax.swing.event.ChangeEvent; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.TableCellEditor; import javax.swing.table.TableModel; import com.cburch.logisim.util.JDialogOk; import com.cburch.logisim.util.JInputComponent; import com.cburch.logisim.util.LocaleListener; import com.cburch.logisim.util.LocaleManager; import java.util.ArrayList; import java.util.EventObject; import java.util.LinkedList; public class AttrTable extends JPanel implements LocaleListener { private static final AttrTableModel NULL_ATTR_MODEL = new NullAttrModel(); private static class NullAttrModel implements AttrTableModel { public void addAttrTableModelListener(AttrTableModelListener listener) { } public void removeAttrTableModelListener(AttrTableModelListener listener) { } public String getTitle() { return null; } public int getRowCount() { return 0; } public AttrTableModelRow getRow(int rowIndex) { return null; } } private static class TitleLabel extends JLabel { @Override public Dimension getMinimumSize() { Dimension ret = super.getMinimumSize(); return new Dimension(1, ret.height); } } private static class MyDialog extends JDialogOk { JInputComponent input; Object value; public MyDialog(Dialog parent, JInputComponent input) { super(parent, Strings.get("attributeDialogTitle"), true); configure(input); } public MyDialog(Frame parent, JInputComponent input) { super(parent, Strings.get("attributeDialogTitle"), true); configure(input); } private void configure(JInputComponent input) { this.input = input; this.value = input.getValue(); // Thanks to Christophe Jacquet, who contributed a fix to this // so that when the dialog is resized, the component within it // is resized as well. (Tracker #2024479) JPanel p = new JPanel(new BorderLayout()); p.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); p.add((JComponent) input, BorderLayout.CENTER); getContentPane().add(p, BorderLayout.CENTER); pack(); } @Override public void okClicked() { value = input.getValue(); } public Object getValue() { return value; } } private class TableModelAdapter implements TableModel, AttrTableModelListener { Window parent; LinkedList listeners; AttrTableModel attrModel; TableModelAdapter(Window parent, AttrTableModel attrModel) { this.parent = parent; this.listeners = new LinkedList(); this.attrModel = attrModel; } void setAttrTableModel(AttrTableModel value) { if (attrModel != value) { TableCellEditor editor = table.getCellEditor(); if (editor != null) editor.cancelCellEditing(); attrModel.removeAttrTableModelListener(this); attrModel = value; attrModel.addAttrTableModelListener(this); fireTableChanged(); } } public void addTableModelListener(TableModelListener l) { listeners.add(l); } public void removeTableModelListener(TableModelListener l) { listeners.remove(l); } void fireTableChanged() { TableModelEvent e = new TableModelEvent(this); for (TableModelListener l : new ArrayList(listeners)) { l.tableChanged(e); } } public int getColumnCount() { return 2; } public String getColumnName(int columnIndex) { if (columnIndex == 0) return "Attribute"; else return "Value"; } public Class getColumnClass(int columnIndex) { return String.class; } public int getRowCount() { return attrModel.getRowCount(); } public Object getValueAt(int rowIndex, int columnIndex) { if (columnIndex == 0) { return attrModel.getRow(rowIndex).getLabel(); } else { return attrModel.getRow(rowIndex).getValue(); } } public boolean isCellEditable(int rowIndex, int columnIndex) { return columnIndex > 0 && attrModel.getRow(rowIndex).isValueEditable(); } public void setValueAt(Object value, int rowIndex, int columnIndex) { if (columnIndex > 0) { try { attrModel.getRow(rowIndex).setValue(value); } catch (AttrTableSetException e) { JOptionPane.showMessageDialog(parent, e.getMessage(), Strings.get("attributeChangeInvalidTitle"), JOptionPane.WARNING_MESSAGE); } } } // // AttrTableModelListener methods // public void attrTitleChanged(AttrTableModelEvent e) { if (e.getSource() != attrModel) { attrModel.removeAttrTableModelListener(this); return; } updateTitle(); } public void attrStructureChanged(AttrTableModelEvent e) { if (e.getSource() != attrModel) { attrModel.removeAttrTableModelListener(this); return; } fireTableChanged(); } public void attrValueChanged(AttrTableModelEvent e) { if (e.getSource() != attrModel) { attrModel.removeAttrTableModelListener(this); return; } fireTableChanged(); } } private class CellEditor implements TableCellEditor, FocusListener, ActionListener { LinkedList listeners = new LinkedList(); AttrTableModelRow currentRow; Component currentEditor; // // TableCellListener management // public void addCellEditorListener(CellEditorListener l) { // Adds a listener to the list that's notified when the // editor stops, or cancels editing. listeners.add(l); } public void removeCellEditorListener(CellEditorListener l) { // Removes a listener from the list that's notified listeners.remove(l); } public void fireEditingCanceled() { ChangeEvent e = new ChangeEvent(AttrTable.this); for (CellEditorListener l : new ArrayList(listeners)) { l.editingCanceled(e); } } public void fireEditingStopped() { ChangeEvent e = new ChangeEvent(AttrTable.this); for (CellEditorListener l : new ArrayList(listeners)) { l.editingStopped(e); } } // // other TableCellEditor methods // public void cancelCellEditing() { // Tells the editor to cancel editing and not accept any // partially edited value. fireEditingCanceled(); } public boolean stopCellEditing() { // Tells the editor to stop editing and accept any partially // edited value as the value of the editor. fireEditingStopped(); return true; } public Object getCellEditorValue() { // Returns the value contained in the editor. Component comp = currentEditor; if (comp instanceof JTextField) { return ((JTextField) comp).getText(); } else if (comp instanceof JComboBox) { return ((JComboBox) comp).getSelectedItem(); } else { return null; } } public boolean isCellEditable(EventObject anEvent) { // Asks the editor if it can start editing using anEvent. return true; } public boolean shouldSelectCell(EventObject anEvent) { // Returns true if the editing cell should be selected, // false otherwise. return true; } public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int rowIndex, int columnIndex) { AttrTableModel attrModel = tableModel.attrModel; AttrTableModelRow row = attrModel.getRow(rowIndex); if (columnIndex == 0) { return new JLabel(row.getLabel()); } else { if (currentEditor != null) currentEditor.transferFocus(); Component editor = row.getEditor(parent); if (editor instanceof JComboBox) { ((JComboBox) editor).addActionListener(this); editor.addFocusListener(this); } else if (editor instanceof JInputComponent) { JInputComponent input = (JInputComponent) editor; MyDialog dlog; Window parent = AttrTable.this.parent; if (parent instanceof Frame) { dlog = new MyDialog((Frame) parent, input); } else { dlog = new MyDialog((Dialog) parent, input); } dlog.setVisible(true); Object retval = dlog.getValue(); try { row.setValue(retval); } catch (AttrTableSetException e) { JOptionPane.showMessageDialog(parent, e.getMessage(), Strings.get("attributeChangeInvalidTitle"), JOptionPane.WARNING_MESSAGE); } editor = new JLabel(row.getValue()); } else { editor.addFocusListener(this); } currentRow = row; currentEditor = editor; return editor; } } // // FocusListener methods // public void focusLost(FocusEvent e) { Object dst = e.getOppositeComponent(); if (dst instanceof Component) { Component p = (Component) dst; while (p != null && !(p instanceof Window)) { if (p == AttrTable.this) { // switch to another place in this table, // no problem return; } p = p.getParent(); } // focus transferred outside table; stop editing editor.stopCellEditing(); } } public void focusGained(FocusEvent e) { } // // ActionListener methods // public void actionPerformed(ActionEvent e) { stopCellEditing(); } } private Window parent; private boolean titleEnabled; private JLabel title; private JTable table; private TableModelAdapter tableModel; private CellEditor editor = new CellEditor(); public AttrTable(Window parent) { super(new BorderLayout()); this.parent = parent; titleEnabled = true; title = new TitleLabel(); title.setHorizontalAlignment(SwingConstants.CENTER); title.setVerticalAlignment(SwingConstants.CENTER); tableModel = new TableModelAdapter(parent, NULL_ATTR_MODEL); table = new JTable(tableModel); table.setDefaultEditor(Object.class, editor); table.setTableHeader(null); table.setRowHeight(20); Font baseFont = title.getFont(); int titleSize = Math.round(baseFont.getSize() * 1.2f); Font titleFont = baseFont.deriveFont((float) titleSize).deriveFont(Font.BOLD); title.setFont(titleFont); Color bgColor = new Color(240, 240, 240); setBackground(bgColor); table.setBackground(bgColor); Object renderer = table.getDefaultRenderer(String.class); if (renderer instanceof JComponent) { ((JComponent) renderer).setBackground(Color.WHITE); } JScrollPane tableScroll = new JScrollPane(table); this.add(title, BorderLayout.PAGE_START); this.add(tableScroll, BorderLayout.CENTER); LocaleManager.addLocaleListener(this); localeChanged(); } public void setTitleEnabled(boolean value) { titleEnabled = value; updateTitle(); } public boolean getTitleEnabled() { return titleEnabled; } public void setAttrTableModel(AttrTableModel value) { tableModel.setAttrTableModel(value == null ? NULL_ATTR_MODEL : value); updateTitle(); } public AttrTableModel getAttrTableModel() { return tableModel.attrModel; } public void localeChanged() { updateTitle(); tableModel.fireTableChanged(); } private void updateTitle() { if (titleEnabled) { String text = tableModel.attrModel.getTitle(); if (text == null) { title.setVisible(false); } else { title.setText(text); title.setVisible(true); } } else { title.setVisible(false); } } } logisim-2.7.1/src/com/cburch/logisim/gui/generic/AttributeSetTableModel.java0000644000175000017500000001306511527307540026764 0ustar vincentvincent/* Copyright (c) 2011, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.generic; import java.awt.Component; import java.awt.Window; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeEvent; import com.cburch.logisim.data.AttributeListener; import com.cburch.logisim.data.AttributeSet; public abstract class AttributeSetTableModel implements AttrTableModel, AttributeListener { private class AttrRow implements AttrTableModelRow { private Attribute attr; AttrRow(Attribute attr) { @SuppressWarnings("unchecked") Attribute objAttr = (Attribute) attr; this.attr = objAttr; } public String getLabel() { return attr.getDisplayName(); } public String getValue() { Object value = attrs.getValue(attr); if (value == null) { return ""; } else { try { return attr.toDisplayString(value); } catch (Exception e) { return "???"; } } } public boolean isValueEditable() { return !attrs.isReadOnly(attr); } public Component getEditor(Window parent) { Object value = attrs.getValue(attr); return attr.getCellEditor(parent, value); } public void setValue(Object value) throws AttrTableSetException { Attribute attr = this.attr; if (attr == null || value == null) return; try { if (value instanceof String) { value = attr.parse((String) value); } setValueRequested(attr, value); } catch (ClassCastException e) { String msg = Strings.get("attributeChangeInvalidError") + ": " + e; throw new AttrTableSetException(msg); } catch (NumberFormatException e) { String msg = Strings.get("attributeChangeInvalidError"); String emsg = e.getMessage(); if (emsg != null && emsg.length() > 0) msg += ": " + emsg; msg += "."; throw new AttrTableSetException(msg); } } } private ArrayList listeners; private AttributeSet attrs; private HashMap, AttrRow> rowMap; private ArrayList rows; public AttributeSetTableModel(AttributeSet attrs) { this.attrs = attrs; this.listeners = new ArrayList(); this.rowMap = new HashMap, AttrRow>(); this.rows = new ArrayList(); if (attrs != null) { for (Attribute attr : attrs.getAttributes()) { AttrRow row = new AttrRow(attr); rowMap.put(attr, row); rows.add(row); } } } public abstract String getTitle(); public AttributeSet getAttributeSet() { return attrs; } public void setAttributeSet(AttributeSet value) { if (attrs != value) { if (!listeners.isEmpty()) { attrs.removeAttributeListener(this); } attrs = value; if (!listeners.isEmpty()) { attrs.addAttributeListener(this); } attributeListChanged(null); } } public void addAttrTableModelListener(AttrTableModelListener listener) { if (listeners.isEmpty() && attrs != null) { attrs.addAttributeListener(this); } listeners.add(listener); } public void removeAttrTableModelListener(AttrTableModelListener listener) { listeners.remove(listener); if (listeners.isEmpty() && attrs != null) { attrs.removeAttributeListener(this); } } protected void fireTitleChanged() { AttrTableModelEvent event = new AttrTableModelEvent(this); for (AttrTableModelListener l : listeners) { l.attrTitleChanged(event); } } protected void fireStructureChanged() { AttrTableModelEvent event = new AttrTableModelEvent(this); for (AttrTableModelListener l : listeners) { l.attrStructureChanged(event); } } protected void fireValueChanged(int index) { AttrTableModelEvent event = new AttrTableModelEvent(this, index); for (AttrTableModelListener l : listeners) { l.attrValueChanged(event); } } public int getRowCount() { return rows.size(); } public AttrTableModelRow getRow(int rowIndex) { return rows.get(rowIndex); } protected abstract void setValueRequested(Attribute attr, Object value) throws AttrTableSetException; // // AttributeListener methods // public void attributeListChanged(AttributeEvent e) { // if anything has changed, don't do anything int index = 0; boolean match = true; int rowsSize = rows.size(); for (Attribute attr : attrs.getAttributes()) { if (index >= rowsSize || rows.get(index).attr != attr) { match = false; break; } index++; } if (match && index == rows.size()) return; // compute the new list of rows, possible adding into hash map ArrayList newRows = new ArrayList(); HashSet> missing = new HashSet>(rowMap.keySet()); for (Attribute attr : attrs.getAttributes()) { AttrRow row = rowMap.get(attr); if (row == null) { row = new AttrRow(attr); rowMap.put(attr, row); } else { missing.remove(attr); } newRows.add(row); } rows = newRows; for (Attribute attr : missing) { rowMap.remove(attr); } fireStructureChanged(); } public void attributeValueChanged(AttributeEvent e) { Attribute attr = e.getAttribute(); AttrTableModelRow row = rowMap.get(attr); if (row != null) { int index = rows.indexOf(row); if (index >= 0) { fireValueChanged(index); } } } } logisim-2.7.1/src/com/cburch/logisim/gui/appear/0000755000175000017500000000000011541661300021371 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/logisim/gui/appear/Strings.java0000644000175000017500000000143311451540106023666 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.appear; import java.util.Locale; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.StringGetter; import com.cburch.logisim.util.StringUtil; class Strings { private static LocaleManager source = new LocaleManager("resources/logisim", "gui"); public static String get(String key) { return source.get(key); } public static String get(String key, String arg) { return StringUtil.format(source.get(key), arg); } public static StringGetter getter(String key) { return source.getter(key); } public static Locale[] getLocaleOptions() { return source.getLocaleOptions(); } } logisim-2.7.1/src/com/cburch/logisim/gui/appear/SelectionAction.java0000644000175000017500000000712611541661300025325 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.appear; import java.util.ArrayList; import java.util.Collection; import java.util.Map; import com.cburch.draw.canvas.Selection; import com.cburch.draw.model.CanvasModel; import com.cburch.draw.model.CanvasObject; import com.cburch.draw.util.ZOrder; import com.cburch.logisim.circuit.appear.AppearanceAnchor; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.proj.Action; import com.cburch.logisim.proj.Project; import com.cburch.logisim.util.StringGetter; class SelectionAction extends Action { private StringGetter displayName; private AppearanceCanvas canvas; private CanvasModel canvasModel; private Map toRemove; private Collection toAdd; private Collection oldSelection; private Collection newSelection; private Location anchorNewLocation; private Direction anchorNewFacing; private Location anchorOldLocation; private Direction anchorOldFacing; public SelectionAction(AppearanceCanvas canvas, StringGetter displayName, Collection toRemove, Collection toAdd, Collection newSelection, Location anchorLocation, Direction anchorFacing) { this.canvas = canvas; this.canvasModel = canvas.getModel(); this.displayName = displayName; this.toRemove = toRemove == null ? null : ZOrder.getZIndex(toRemove, canvasModel); this.toAdd = toAdd; this.oldSelection = new ArrayList(canvas.getSelection().getSelected()); this.newSelection = newSelection; this.anchorNewLocation = anchorLocation; this.anchorNewFacing = anchorFacing; } @Override public String getName() { return displayName.get(); } @Override public void doIt(Project proj) { Selection sel = canvas.getSelection(); sel.clearSelected(); if (toRemove != null) canvasModel.removeObjects(toRemove.keySet()); int dest = AppearanceCanvas.getMaxIndex(canvasModel) + 1; if (toAdd != null) canvasModel.addObjects(dest, toAdd); AppearanceAnchor anchor = findAnchor(canvasModel); if (anchor != null && anchorNewLocation != null) { anchorOldLocation = anchor.getLocation(); anchor.translate(anchorNewLocation.getX() - anchorOldLocation.getX(), anchorNewLocation.getY() - anchorOldLocation.getY()); } if (anchor != null && anchorNewFacing != null) { anchorOldFacing = anchor.getFacing(); anchor.setValue(AppearanceAnchor.FACING, anchorNewFacing); } sel.setSelected(newSelection, true); canvas.repaint(); } private AppearanceAnchor findAnchor(CanvasModel canvasModel) { for (Object o : canvasModel.getObjectsFromTop()) { if (o instanceof AppearanceAnchor) { return (AppearanceAnchor) o; } } return null; } @Override public void undo(Project proj) { AppearanceAnchor anchor = findAnchor(canvasModel); if (anchor != null && anchorOldLocation != null) { anchor.translate(anchorOldLocation.getX() - anchorNewLocation.getX(), anchorOldLocation.getY() - anchorNewLocation.getY()); } if (anchor != null && anchorOldFacing != null) { anchor.setValue(AppearanceAnchor.FACING, anchorOldFacing); } Selection sel = canvas.getSelection(); sel.clearSelected(); if (toAdd != null) canvasModel.removeObjects(toAdd); if (toRemove != null) canvasModel.addObjects(toRemove); sel.setSelected(oldSelection, true); canvas.repaint(); } } logisim-2.7.1/src/com/cburch/logisim/gui/appear/RevertAppearanceAction.java0000644000175000017500000000232311446453770026637 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.appear; import java.util.ArrayList; import com.cburch.draw.model.CanvasObject; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.appear.CircuitAppearance; import com.cburch.logisim.proj.Action; import com.cburch.logisim.proj.Project; public class RevertAppearanceAction extends Action { private Circuit circuit; private ArrayList old; private boolean wasDefault; public RevertAppearanceAction(Circuit circuit) { this.circuit = circuit; } @Override public String getName() { return Strings.get("revertAppearanceAction"); } @Override public void doIt(Project proj) { CircuitAppearance appear = circuit.getAppearance(); wasDefault = appear.isDefaultAppearance(); old = new ArrayList(appear.getObjectsFromBottom()); appear.setDefaultAppearance(true); } @Override public void undo(Project proj) { CircuitAppearance appear = circuit.getAppearance(); appear.setObjectsForce(old); appear.setDefaultAppearance(wasDefault); } } logisim-2.7.1/src/com/cburch/logisim/gui/appear/LayoutThumbnail.java0000644000175000017500000000604311524651222025363 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.appear; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.util.Collection; import java.util.Collections; import javax.swing.JComponent; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.circuit.appear.AppearancePort; import com.cburch.logisim.comp.Component; import com.cburch.logisim.comp.ComponentDrawContext; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.std.wiring.Pin; import com.cburch.logisim.util.GraphicsUtil; public class LayoutThumbnail extends JComponent { private static final int BORDER = 10; private CircuitState circuitState; private Collection ports; public LayoutThumbnail() { circuitState = null; ports = null; setBackground(Color.LIGHT_GRAY); setPreferredSize(new Dimension(200, 200)); } public void setCircuit(CircuitState circuitState, Collection ports) { this.circuitState = circuitState; this.ports = ports; repaint(); } @Override protected void paintComponent(Graphics g) { if (circuitState != null) { Circuit circuit = circuitState.getCircuit(); Bounds bds = circuit.getBounds(g); Dimension size = getSize(); double scaleX = (double) (size.width - 2 * BORDER) / bds.getWidth(); double scaleY = (double) (size.height - 2 * BORDER) / bds.getHeight(); double scale = Math.min(1.0, Math.min(scaleX, scaleY)); Graphics gCopy = g.create(); int borderX = (int) ((size.width - bds.getWidth() * scale) / 2); int borderY = (int) ((size.height - bds.getHeight() * scale) / 2); gCopy.translate(borderX, borderY); if (scale != 1.0 && g instanceof Graphics2D) { ((Graphics2D) gCopy).scale(scale, scale); } gCopy.translate(-bds.getX(), -bds.getY()); ComponentDrawContext context = new ComponentDrawContext(this, circuit, circuitState, g, gCopy); context.setShowState(false); context.setShowColor(false); circuit.draw(context, Collections.emptySet()); if (ports != null) { gCopy.setColor(AppearancePort.COLOR); int width = Math.max(4, (int) ((2 / scale) + 0.5)); GraphicsUtil.switchToWidth(gCopy, width); for (Instance port : ports) { Bounds b = port.getBounds(); int x = b.getX(); int y = b.getY(); int w = b.getWidth(); int h = b.getHeight(); if (Pin.FACTORY.isInputPin(port)) { gCopy.drawRect(x, y, w, h); } else { if (b.getWidth() > 25) { gCopy.drawRoundRect(x, y, w, h, 4, 4); } else { gCopy.drawOval(x, y, w, h); } } } } gCopy.dispose(); g.setColor(Color.BLACK); GraphicsUtil.switchToWidth(g, 2); g.drawRect(0, 0, size.width - 2, size.height - 2); } } } logisim-2.7.1/src/com/cburch/logisim/gui/appear/LayoutPopupManager.java0000644000175000017500000001136611446034544026047 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.appear; import java.awt.Dimension; import java.awt.Point; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Set; import javax.swing.JViewport; import javax.swing.Popup; import javax.swing.PopupFactory; import com.cburch.draw.canvas.SelectionEvent; import com.cburch.draw.canvas.SelectionListener; import com.cburch.draw.model.CanvasObject; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.circuit.appear.AppearancePort; import com.cburch.logisim.data.Location; import com.cburch.logisim.gui.generic.CanvasPane; import com.cburch.logisim.instance.Instance; class LayoutPopupManager implements SelectionListener, MouseListener, MouseMotionListener { private CanvasPane canvasPane; private AppearanceCanvas canvas; private Popup curPopup; private long curPopupTime; private Location dragStart; public LayoutPopupManager(CanvasPane canvasPane, AppearanceCanvas canvas) { this.canvasPane = canvasPane; this.canvas = canvas; this.curPopup = null; this.dragStart = null; canvas.getSelection().addSelectionListener(this); canvas.addMouseListener(this); canvas.addMouseMotionListener(this); } public void hideCurrentPopup() { Popup cur = curPopup; if (cur != null) { curPopup = null; dragStart = null; cur.hide(); } } public void selectionChanged(SelectionEvent e) { int act = e.getAction(); if (act == SelectionEvent.ACTION_ADDED) { Set ports = shouldShowPopup(e.getAffected()); if (ports == null) { hideCurrentPopup(); } else { showPopup(ports); } } } private Set shouldShowPopup(Collection add) { boolean found = false; for (CanvasObject o : add) { if (o instanceof AppearancePort) { found = true; break; } } if (found) { Set ports = getSelectedPorts(); if (!ports.isEmpty() && isPortUnselected(ports)) { return ports; } } return null; } // returns all the ports in the current selection private Set getSelectedPorts() { HashSet ports = new HashSet(); for (CanvasObject o : canvas.getSelection().getSelected()) { if (o instanceof AppearancePort) { ports.add((AppearancePort) o); } } return ports; } // returns true if the canvas contains any port not in the given set private boolean isPortUnselected(Set selected) { for (CanvasObject o : canvas.getModel().getObjectsFromBottom()) { if (o instanceof AppearancePort) { if (!selected.contains(o)) { return true; } } } return false; } private void showPopup(Set portObjects) { dragStart = null; CircuitState circuitState = canvas.getCircuitState(); if (circuitState == null) return; ArrayList ports = new ArrayList(portObjects.size()); for (AppearancePort portObject : portObjects) { ports.add(portObject.getPin()); } hideCurrentPopup(); LayoutThumbnail layout = new LayoutThumbnail(); layout.setCircuit(circuitState, ports); JViewport owner = canvasPane.getViewport(); Point ownerLoc = owner.getLocationOnScreen(); Dimension ownerDim = owner.getSize(); Dimension layoutDim = layout.getPreferredSize(); int x = ownerLoc.x + Math.max(0, ownerDim.width - layoutDim.width - 5); int y = ownerLoc.y + Math.max(0, ownerDim.height - layoutDim.height - 5); PopupFactory factory = PopupFactory.getSharedInstance(); Popup popup = factory.getPopup(canvasPane.getViewport(), layout, x, y); popup.show(); curPopup = popup; curPopupTime = System.currentTimeMillis(); } public void mouseClicked(MouseEvent e) { } public void mouseEntered(MouseEvent e) { hideCurrentPopup(); } public void mouseExited(MouseEvent e) { long sincePopup = System.currentTimeMillis() - curPopupTime; if (sincePopup > 50) hideCurrentPopup(); } public void mousePressed(MouseEvent e) { long sincePopup = System.currentTimeMillis() - curPopupTime; if (sincePopup > 50) hideCurrentPopup(); dragStart = Location.create(e.getX(), e.getY()); } public void mouseReleased(MouseEvent e) { } public void mouseDragged(MouseEvent e) { Location start = dragStart; if (start != null && start.manhattanDistanceTo(e.getX(), e.getY()) > 4) { hideCurrentPopup(); } } public void mouseMoved(MouseEvent arg0) { } } logisim-2.7.1/src/com/cburch/logisim/gui/appear/ClipboardContents.java0000644000175000017500000000226511541661300025656 0ustar vincentvincent/* Copyright (c) 2011, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.appear; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import com.cburch.draw.model.CanvasObject; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; class ClipboardContents { static final ClipboardContents EMPTY = new ClipboardContents(Collections.emptySet(), null, null); private Collection onClipboard; private Location anchorLocation; private Direction anchorFacing; public ClipboardContents(Collection onClipboard, Location anchorLocation, Direction anchorFacing) { this.onClipboard = Collections.unmodifiableList(new ArrayList(onClipboard)); this.anchorLocation = anchorLocation; this.anchorFacing = anchorFacing; } public Collection getElements() { return onClipboard; } public Location getAnchorLocation() { return anchorLocation; } public Direction getAnchorFacing() { return anchorFacing; } } logisim-2.7.1/src/com/cburch/logisim/gui/appear/ClipboardActions.java0000644000175000017500000000501711541661300025457 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.appear; import java.util.ArrayList; import java.util.Map; import com.cburch.draw.model.CanvasModel; import com.cburch.draw.model.CanvasObject; import com.cburch.draw.util.ZOrder; import com.cburch.logisim.circuit.appear.AppearanceAnchor; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.proj.Action; import com.cburch.logisim.proj.Project; public class ClipboardActions extends Action { public static Action cut(AppearanceCanvas canvas) { return new ClipboardActions(true, canvas); } public static Action copy(AppearanceCanvas canvas) { return new ClipboardActions(false, canvas); } private boolean remove; private AppearanceCanvas canvas; private CanvasModel canvasModel; private ClipboardContents oldClipboard; private Map affected; private ClipboardContents newClipboard; private ClipboardActions(boolean remove, AppearanceCanvas canvas) { this.remove = remove; this.canvas = canvas; this.canvasModel = canvas.getModel(); ArrayList contents = new ArrayList(); Direction anchorFacing = null; Location anchorLocation = null; ArrayList aff = new ArrayList(); for (CanvasObject o : canvas.getSelection().getSelected()) { if (o.canRemove()) { aff.add(o); contents.add(o.clone()); } else if (o instanceof AppearanceAnchor) { AppearanceAnchor anch = (AppearanceAnchor) o; anchorFacing = anch.getFacing(); anchorLocation = anch.getLocation(); } } contents.trimToSize(); affected = ZOrder.getZIndex(aff, canvasModel); newClipboard = new ClipboardContents(contents, anchorLocation, anchorFacing); } @Override public String getName() { if (remove) { return Strings.get("cutSelectionAction"); } else { return Strings.get("copySelectionAction"); } } @Override public void doIt(Project proj) { oldClipboard = Clipboard.get(); Clipboard.set(newClipboard); if (remove) { canvasModel.removeObjects(affected.keySet()); } } @Override public void undo(Project proj) { if (remove) { canvasModel.addObjects(affected); canvas.getSelection().clearSelected(); canvas.getSelection().setSelected(affected.keySet(), true); } Clipboard.set(oldClipboard); } } logisim-2.7.1/src/com/cburch/logisim/gui/appear/Clipboard.java0000644000175000017500000000310511541661300024132 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.appear; import java.beans.PropertyChangeListener; import com.cburch.logisim.util.PropertyChangeWeakSupport; class Clipboard { private Clipboard() { } public static final String contentsProperty = "appearance"; private static ClipboardContents current = ClipboardContents.EMPTY; private static PropertyChangeWeakSupport propertySupport = new PropertyChangeWeakSupport(Clipboard.class); public static boolean isEmpty() { return current == null || current.getElements().isEmpty(); } public static ClipboardContents get() { return current; } public static void set(ClipboardContents value) { ClipboardContents old = current; current = value; propertySupport.firePropertyChange(contentsProperty, old, current); } // // PropertyChangeSource methods // public static void addPropertyChangeListener(PropertyChangeListener listener) { propertySupport.addPropertyChangeListener(listener); } public static void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { propertySupport.addPropertyChangeListener(propertyName, listener); } public static void removePropertyChangeListener(PropertyChangeListener listener) { propertySupport.removePropertyChangeListener(listener); } public static void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) { propertySupport.removePropertyChangeListener(propertyName, listener); } } logisim-2.7.1/src/com/cburch/logisim/gui/appear/CanvasActionAdapter.java0000644000175000017500000000452711446453770026134 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.appear; import java.util.HashMap; import java.util.Map; import com.cburch.draw.actions.ModelAction; import com.cburch.draw.model.CanvasObject; import com.cburch.draw.undo.Action; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.CircuitMutator; import com.cburch.logisim.circuit.CircuitTransaction; import com.cburch.logisim.circuit.appear.AppearanceElement; import com.cburch.logisim.proj.Project; public class CanvasActionAdapter extends com.cburch.logisim.proj.Action { private Circuit circuit; private Action canvasAction; private boolean wasDefault; public CanvasActionAdapter(Circuit circuit, Action action) { this.circuit = circuit; this.canvasAction = action; } @Override public String getName() { return canvasAction.getName(); } @Override public void doIt(Project proj) { wasDefault = circuit.getAppearance().isDefaultAppearance(); if (affectsPorts()) { ActionTransaction xn = new ActionTransaction(true); xn.execute(); } else { canvasAction.doIt(); } } @Override public void undo(Project proj) { if (affectsPorts()) { ActionTransaction xn = new ActionTransaction(false); xn.execute(); } else { canvasAction.undo(); } circuit.getAppearance().setDefaultAppearance(wasDefault); } private boolean affectsPorts() { if (canvasAction instanceof ModelAction) { for (CanvasObject o : ((ModelAction) canvasAction).getObjects()) { if (o instanceof AppearanceElement) { return true; } } } return false; } private class ActionTransaction extends CircuitTransaction { private boolean forward; ActionTransaction(boolean forward) { this.forward = forward; } @Override protected Map getAccessedCircuits() { Map accessMap = new HashMap(); for (Circuit supercirc : circuit.getCircuitsUsingThis()) { accessMap.put(supercirc, READ_WRITE); } return accessMap; } @Override protected void run(CircuitMutator mutator) { if (forward) { canvasAction.doIt(); } else { canvasAction.undo(); } } } } logisim-2.7.1/src/com/cburch/logisim/gui/appear/AppearanceView.java0000644000175000017500000000505111527054440025134 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.appear; import com.cburch.draw.canvas.Canvas; import com.cburch.draw.gui.AttrTableDrawManager; import com.cburch.draw.toolbar.ToolbarModel; import com.cburch.draw.tools.DrawingAttributeSet; import com.cburch.draw.tools.SelectTool; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.gui.generic.AttrTable; import com.cburch.logisim.gui.generic.BasicZoomModel; import com.cburch.logisim.gui.generic.CanvasPane; import com.cburch.logisim.gui.generic.ZoomModel; import com.cburch.logisim.gui.main.EditHandler; import com.cburch.logisim.prefs.AppPreferences; import com.cburch.logisim.proj.Project; public class AppearanceView { private static final double[] ZOOM_OPTIONS = { 100, 150, 200, 300, 400, 600, 800 }; private DrawingAttributeSet attrs; private AppearanceCanvas canvas; private CanvasPane canvasPane; private AppearanceToolbarModel toolbarModel; private AttrTableDrawManager attrTableManager; private ZoomModel zoomModel; private AppearanceEditHandler editHandler; public AppearanceView() { attrs = new DrawingAttributeSet(); SelectTool selectTool = new SelectTool(); canvas = new AppearanceCanvas(selectTool); toolbarModel = new AppearanceToolbarModel(selectTool, canvas, attrs); zoomModel = new BasicZoomModel(AppPreferences.APPEARANCE_SHOW_GRID, AppPreferences.APPEARANCE_ZOOM, ZOOM_OPTIONS); canvas.getGridPainter().setZoomModel(zoomModel); attrTableManager = null; canvasPane = new CanvasPane(canvas); canvasPane.setZoomModel(zoomModel); editHandler = new AppearanceEditHandler(canvas); } public Canvas getCanvas() { return canvas; } public CanvasPane getCanvasPane() { return canvasPane; } public ToolbarModel getToolbarModel() { return toolbarModel; } public ZoomModel getZoomModel() { return zoomModel; } public EditHandler getEditHandler() { return editHandler; } public AttributeSet getAttributeSet() { return attrs; } public AttrTableDrawManager getAttrTableDrawManager(AttrTable table) { AttrTableDrawManager ret = attrTableManager; if (ret == null) { ret = new AttrTableDrawManager(canvas, table, attrs); attrTableManager = ret; } return ret; } public void setCircuit(Project proj, CircuitState circuitState) { canvas.setCircuit(proj, circuitState); } } logisim-2.7.1/src/com/cburch/logisim/gui/appear/AppearanceToolbarModel.java0000644000175000017500000000516511446034544026616 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.appear; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.Collections; import java.util.List; import com.cburch.draw.canvas.Canvas; import com.cburch.draw.toolbar.AbstractToolbarModel; import com.cburch.draw.toolbar.ToolbarItem; import com.cburch.draw.tools.AbstractTool; import com.cburch.draw.tools.CurveTool; import com.cburch.draw.tools.DrawingAttributeSet; import com.cburch.draw.tools.LineTool; import com.cburch.draw.tools.OvalTool; import com.cburch.draw.tools.PolyTool; import com.cburch.draw.tools.RectangleTool; import com.cburch.draw.tools.RoundRectangleTool; import com.cburch.draw.tools.TextTool; import com.cburch.draw.tools.ToolbarToolItem; class AppearanceToolbarModel extends AbstractToolbarModel implements PropertyChangeListener { private Canvas canvas; private List items; public AppearanceToolbarModel(AbstractTool selectTool, Canvas canvas, DrawingAttributeSet attrs) { this.canvas = canvas; AbstractTool[] tools = { selectTool, new TextTool(attrs), new LineTool(attrs), new CurveTool(attrs), new PolyTool(false, attrs), new RectangleTool(attrs), new RoundRectangleTool(attrs), new OvalTool(attrs), new PolyTool(true, attrs), }; ArrayList rawItems = new ArrayList(); for (AbstractTool tool : tools) { rawItems.add(new ToolbarToolItem(tool)); } items = Collections.unmodifiableList(rawItems); canvas.addPropertyChangeListener(Canvas.TOOL_PROPERTY, this); } AbstractTool getFirstTool() { ToolbarToolItem item = (ToolbarToolItem) items.get(0); return item.getTool(); } @Override public List getItems() { return items; } @Override public boolean isSelected(ToolbarItem item) { if (item instanceof ToolbarToolItem) { AbstractTool tool = ((ToolbarToolItem) item).getTool(); return canvas != null && tool == canvas.getTool(); } else { return false; } } @Override public void itemSelected(ToolbarItem item) { if (item instanceof ToolbarToolItem) { AbstractTool tool = ((ToolbarToolItem) item).getTool(); canvas.setTool(tool); fireToolbarAppearanceChanged(); } } public void propertyChange(PropertyChangeEvent e) { String prop = e.getPropertyName(); if (Canvas.TOOL_PROPERTY.equals(prop)) { fireToolbarAppearanceChanged(); } } } logisim-2.7.1/src/com/cburch/logisim/gui/appear/AppearanceSelection.java0000644000175000017500000000206111446034544026150 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.appear; import java.util.Collection; import com.cburch.draw.canvas.Selection; import com.cburch.draw.model.CanvasObject; import com.cburch.logisim.circuit.appear.AppearanceElement; public class AppearanceSelection extends Selection { @Override public void setMovingShapes(Collection shapes, int dx, int dy) { if (shouldSnap(shapes)) { dx = (dx + 5) / 10 * 10; dy = (dy + 5) / 10 * 10; } super.setMovingShapes(shapes, dx, dy); } @Override public void setMovingDelta(int dx, int dy) { if (shouldSnap(getSelected())) { dx = (dx + 5) / 10 * 10; dy = (dy + 5) / 10 * 10; } super.setMovingDelta(dx, dy); } private boolean shouldSnap(Collection shapes) { for (CanvasObject o : shapes) { if (o instanceof AppearanceElement) { return true; } } return false; } } logisim-2.7.1/src/com/cburch/logisim/gui/appear/AppearanceEditPopup.java0000644000175000017500000000436611447117142026143 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.appear; import java.util.HashMap; import java.util.Map; import com.cburch.logisim.gui.main.EditHandler; import com.cburch.logisim.gui.menu.EditPopup; import com.cburch.logisim.gui.menu.LogisimMenuBar; import com.cburch.logisim.gui.menu.LogisimMenuItem; public class AppearanceEditPopup extends EditPopup implements EditHandler.Listener { private AppearanceCanvas canvas; private EditHandler handler; private Map enabled; public AppearanceEditPopup(AppearanceCanvas canvas) { super(true); this.canvas = canvas; handler = new AppearanceEditHandler(canvas); handler.setListener(this); enabled = new HashMap(); handler.computeEnabled(); initialize(); } public void enableChanged(EditHandler handler, LogisimMenuItem action, boolean value) { enabled.put(action, Boolean.valueOf(value)); } @Override protected boolean shouldShow(LogisimMenuItem item) { if (item == LogisimMenuBar.ADD_CONTROL || item == LogisimMenuBar.REMOVE_CONTROL) { return canvas.getSelection().getSelectedHandle() != null; } else { return true; } } @Override protected boolean isEnabled(LogisimMenuItem item) { Boolean value = enabled.get(item); return value != null && value.booleanValue(); } @Override protected void fire(LogisimMenuItem item) { if (item == LogisimMenuBar.CUT) { handler.cut(); } else if (item == LogisimMenuBar.COPY) { handler.copy(); } else if (item == LogisimMenuBar.DELETE) { handler.delete(); } else if (item == LogisimMenuBar.DUPLICATE) { handler.duplicate(); } else if (item == LogisimMenuBar.RAISE) { handler.raise(); } else if (item == LogisimMenuBar.LOWER) { handler.lower(); } else if (item == LogisimMenuBar.RAISE_TOP) { handler.raiseTop(); } else if (item == LogisimMenuBar.LOWER_BOTTOM) { handler.lowerBottom(); } else if (item == LogisimMenuBar.ADD_CONTROL) { handler.addControlPoint(); } else if (item == LogisimMenuBar.REMOVE_CONTROL) { handler.removeControlPoint(); } } } logisim-2.7.1/src/com/cburch/logisim/gui/appear/AppearanceEditHandler.java0000644000175000017500000002236011541661300026402 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.appear; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; import com.cburch.draw.actions.ModelDeleteHandleAction; import com.cburch.draw.actions.ModelInsertHandleAction; import com.cburch.draw.actions.ModelReorderAction; import com.cburch.draw.canvas.Canvas; import com.cburch.draw.canvas.Selection; import com.cburch.draw.canvas.SelectionEvent; import com.cburch.draw.canvas.SelectionListener; import com.cburch.draw.model.CanvasModel; import com.cburch.draw.model.CanvasModelEvent; import com.cburch.draw.model.CanvasModelListener; import com.cburch.draw.model.CanvasObject; import com.cburch.draw.model.Handle; import com.cburch.draw.util.MatchingSet; import com.cburch.draw.util.ZOrder; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.appear.AppearanceAnchor; import com.cburch.logisim.circuit.appear.AppearanceElement; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.gui.main.EditHandler; import com.cburch.logisim.gui.menu.LogisimMenuBar; import com.cburch.logisim.proj.Project; public class AppearanceEditHandler extends EditHandler implements SelectionListener, PropertyChangeListener, CanvasModelListener { private AppearanceCanvas canvas; AppearanceEditHandler(AppearanceCanvas canvas) { this.canvas = canvas; canvas.getSelection().addSelectionListener(this); CanvasModel model = canvas.getModel(); if (model != null) model.addCanvasModelListener(this); canvas.addPropertyChangeListener(Canvas.MODEL_PROPERTY, this); } @Override public void computeEnabled() { Project proj = canvas.getProject(); Circuit circ = canvas.getCircuit(); Selection sel = canvas.getSelection(); boolean selEmpty = sel.isEmpty(); boolean canChange = proj.getLogisimFile().contains(circ); boolean clipExists = !Clipboard.isEmpty(); boolean selHasRemovable = false; for (CanvasObject o : sel.getSelected()) { if (!(o instanceof AppearanceElement)) { selHasRemovable = true; } } boolean canRaise; boolean canLower; if (!selEmpty && canChange) { Map zs = ZOrder.getZIndex(sel.getSelected(), canvas.getModel()); int zmin = Integer.MAX_VALUE; int zmax = Integer.MIN_VALUE; int count = 0; for (Map.Entry entry : zs.entrySet()) { if (!(entry.getKey() instanceof AppearanceElement)) { count++; int z = entry.getValue().intValue(); if (z < zmin) zmin = z; if (z > zmax) zmax = z; } } int maxPoss = AppearanceCanvas.getMaxIndex(canvas.getModel()); if (count > 0 && count <= maxPoss) { canRaise = zmin <= maxPoss - count; canLower = zmax >= count; } else { canRaise = false; canLower = false; } } else { canRaise = false; canLower = false; } boolean canAddCtrl = false; boolean canRemCtrl = false; Handle handle = sel.getSelectedHandle(); if (handle != null && canChange) { CanvasObject o = handle.getObject(); canAddCtrl = o.canInsertHandle(handle.getLocation()) != null; canRemCtrl = o.canDeleteHandle(handle.getLocation()) != null; } setEnabled(LogisimMenuBar.CUT, selHasRemovable && canChange); setEnabled(LogisimMenuBar.COPY, !selEmpty); setEnabled(LogisimMenuBar.PASTE, canChange && clipExists); setEnabled(LogisimMenuBar.DELETE, selHasRemovable && canChange); setEnabled(LogisimMenuBar.DUPLICATE, !selEmpty && canChange); setEnabled(LogisimMenuBar.SELECT_ALL, true); setEnabled(LogisimMenuBar.RAISE, canRaise); setEnabled(LogisimMenuBar.LOWER, canLower); setEnabled(LogisimMenuBar.RAISE_TOP, canRaise); setEnabled(LogisimMenuBar.LOWER_BOTTOM, canLower); setEnabled(LogisimMenuBar.ADD_CONTROL, canAddCtrl); setEnabled(LogisimMenuBar.REMOVE_CONTROL, canRemCtrl); } @Override public void cut() { if (!canvas.getSelection().isEmpty()) { canvas.getProject().doAction(ClipboardActions.cut(canvas)); } } @Override public void copy() { if (!canvas.getSelection().isEmpty()) { canvas.getProject().doAction(ClipboardActions.copy(canvas)); } } @Override public void paste() { ClipboardContents clip = Clipboard.get(); Collection contents = clip.getElements(); List add = new ArrayList(contents.size()); for (CanvasObject o : contents) { add.add(o.clone()); } if (add.isEmpty()) return; // find how far we have to translate shapes so that at least one of the // pasted shapes doesn't match what's already in the model Collection raw = canvas.getModel().getObjectsFromBottom(); MatchingSet cur = new MatchingSet(raw); int dx = 0; while (true) { // if any shapes in "add" aren't in canvas, we are done boolean allMatch = true; for (CanvasObject o : add) { if (!cur.contains(o)) { allMatch = false; break; } } if (!allMatch) break; // otherwise translate everything by 10 pixels and repeat test for (CanvasObject o : add) { o.translate(10, 10); } dx += 10; } Location anchorLocation = clip.getAnchorLocation(); if (anchorLocation != null && dx != 0) { anchorLocation = anchorLocation.translate(dx, dx); } canvas.getProject().doAction(new SelectionAction(canvas, Strings.getter("pasteClipboardAction"), null, add, add, anchorLocation, clip.getAnchorFacing())); } @Override public void delete() { Selection sel = canvas.getSelection(); int n = sel.getSelected().size(); List select = new ArrayList(n); List remove = new ArrayList(n); Location anchorLocation = null; Direction anchorFacing = null; for (CanvasObject o : sel.getSelected()) { if (o.canRemove()) { remove.add(o); } else { select.add(o); if (o instanceof AppearanceAnchor) { AppearanceAnchor anchor = (AppearanceAnchor) o; anchorLocation = anchor.getLocation(); anchorFacing = anchor.getFacing(); } } } if (!remove.isEmpty()) { canvas.getProject().doAction(new SelectionAction(canvas, Strings.getter("deleteSelectionAction"), remove, null, select, anchorLocation, anchorFacing)); } } @Override public void duplicate() { Selection sel = canvas.getSelection(); int n = sel.getSelected().size(); List select = new ArrayList(n); List clones = new ArrayList(n); for (CanvasObject o : sel.getSelected()) { if (o.canRemove()) { CanvasObject copy = o.clone(); copy.translate(10, 10); clones.add(copy); select.add(copy); } else { select.add(o); } } if (!clones.isEmpty()) { canvas.getProject().doAction(new SelectionAction(canvas, Strings.getter("duplicateSelectionAction"), null, clones, select, null, null)); } } @Override public void selectAll() { Selection sel = canvas.getSelection(); sel.setSelected(canvas.getModel().getObjectsFromBottom(), true); canvas.repaint(); } @Override public void raise() { ModelReorderAction act = ModelReorderAction.createRaise(canvas.getModel(), canvas.getSelection().getSelected()); if (act != null) { canvas.doAction(act); } } @Override public void lower() { ModelReorderAction act = ModelReorderAction.createLower(canvas.getModel(), canvas.getSelection().getSelected()); if (act != null) { canvas.doAction(act); } } @Override public void raiseTop() { ModelReorderAction act = ModelReorderAction.createRaiseTop(canvas.getModel(), canvas.getSelection().getSelected()); if (act != null) { canvas.doAction(act); } } @Override public void lowerBottom() { ModelReorderAction act = ModelReorderAction.createLowerBottom(canvas.getModel(), canvas.getSelection().getSelected()); if (act != null) { canvas.doAction(act); } } @Override public void addControlPoint() { Selection sel = canvas.getSelection(); Handle handle = sel.getSelectedHandle(); canvas.doAction(new ModelInsertHandleAction(canvas.getModel(), handle)); } @Override public void removeControlPoint() { Selection sel = canvas.getSelection(); Handle handle = sel.getSelectedHandle(); canvas.doAction(new ModelDeleteHandleAction(canvas.getModel(), handle)); } public void selectionChanged(SelectionEvent e) { computeEnabled(); } public void propertyChange(PropertyChangeEvent e) { String prop = e.getPropertyName(); if (prop.equals(Canvas.MODEL_PROPERTY)) { CanvasModel oldModel = (CanvasModel) e.getOldValue(); if (oldModel != null) { oldModel.removeCanvasModelListener(this); } CanvasModel newModel = (CanvasModel) e.getNewValue(); if (newModel != null) { newModel.addCanvasModelListener(this); } } } public void modelChanged(CanvasModelEvent event) { computeEnabled(); } } logisim-2.7.1/src/com/cburch/logisim/gui/appear/AppearanceCanvas.java0000644000175000017500000002356611447117142025450 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.gui.appear; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.event.MouseEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.List; import javax.swing.JPopupMenu; import com.cburch.draw.actions.ModelAddAction; import com.cburch.draw.actions.ModelReorderAction; import com.cburch.draw.canvas.ActionDispatcher; import com.cburch.draw.canvas.Canvas; import com.cburch.draw.canvas.CanvasTool; import com.cburch.draw.model.CanvasModel; import com.cburch.draw.model.CanvasModelEvent; import com.cburch.draw.model.CanvasModelListener; import com.cburch.draw.model.CanvasObject; import com.cburch.draw.model.ReorderRequest; import com.cburch.draw.undo.Action; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.circuit.appear.AppearanceElement; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.gui.generic.CanvasPane; import com.cburch.logisim.gui.generic.CanvasPaneContents; import com.cburch.logisim.gui.generic.GridPainter; import com.cburch.logisim.proj.Project; public class AppearanceCanvas extends Canvas implements CanvasPaneContents, ActionDispatcher { private static final int BOUNDS_BUFFER = 70; // pixels shown in canvas beyond outermost boundaries private static final int THRESH_SIZE_UPDATE = 10; // don't bother to update the size if it hasn't changed more than this private class Listener implements CanvasModelListener, PropertyChangeListener { public void modelChanged(CanvasModelEvent event) { computeSize(false); } public void propertyChange(PropertyChangeEvent evt) { String prop = evt.getPropertyName(); if (prop.equals(GridPainter.ZOOM_PROPERTY)) { CanvasTool t = getTool(); if (t != null) { t.zoomFactorChanged(AppearanceCanvas.this); } } } } private CanvasTool selectTool; private Project proj; private CircuitState circuitState; private Listener listener; private GridPainter grid; private CanvasPane canvasPane; private Bounds oldPreferredSize; private LayoutPopupManager popupManager; public AppearanceCanvas(CanvasTool selectTool) { this.selectTool = selectTool; this.grid = new GridPainter(this); this.listener = new Listener(); this.oldPreferredSize = null; setSelection(new AppearanceSelection()); setTool(selectTool); CanvasModel model = super.getModel(); if (model != null) model.addCanvasModelListener(listener); grid.addPropertyChangeListener(GridPainter.ZOOM_PROPERTY, listener); } @Override public void setTool(CanvasTool value) { hidePopup(); super.setTool(value); } @Override public void toolGestureComplete(CanvasTool tool, CanvasObject created) { if (tool == getTool() && tool != selectTool) { setTool(selectTool); if (created != null) { getSelection().clearSelected(); getSelection().setSelected(created, true); } } } @Override public void setModel(CanvasModel value, ActionDispatcher dispatcher) { CanvasModel oldModel = super.getModel(); if (oldModel != null) { oldModel.removeCanvasModelListener(listener); } super.setModel(value, dispatcher); if (value != null) { value.addCanvasModelListener(listener); } } public void setCircuit(Project proj, CircuitState circuitState) { this.proj = proj; this.circuitState = circuitState; Circuit circuit = circuitState.getCircuit(); setModel(circuit.getAppearance(), this); } Project getProject() { return proj; } Circuit getCircuit() { return circuitState.getCircuit(); } CircuitState getCircuitState() { return circuitState; } GridPainter getGridPainter() { return grid; } @Override public void doAction(Action canvasAction) { Circuit circuit = circuitState.getCircuit(); if (!proj.getLogisimFile().contains(circuit)) { return; } if (canvasAction instanceof ModelReorderAction) { int max = getMaxIndex(getModel()); ModelReorderAction reorder = (ModelReorderAction) canvasAction; List rs = reorder.getReorderRequests(); List mod = new ArrayList(rs.size()); boolean changed = false; boolean movedToMax = false; for (ReorderRequest r : rs) { CanvasObject o = r.getObject(); if (o instanceof AppearanceElement) { changed = true; } else { if (r.getToIndex() > max) { int from = r.getFromIndex(); changed = true; movedToMax = true; if (from == max && !movedToMax) { ; // this change is ineffective - don't add it } else { mod.add(new ReorderRequest(o, from, max)); } } else { if (r.getToIndex() == max) movedToMax = true; mod.add(r); } } } if (changed) { if (mod.isEmpty()) { return; } canvasAction = new ModelReorderAction(getModel(), mod); } } if (canvasAction instanceof ModelAddAction) { ModelAddAction addAction = (ModelAddAction) canvasAction; int cur = addAction.getDestinationIndex(); int max = getMaxIndex(getModel()); if (cur > max) { canvasAction = new ModelAddAction(getModel(), addAction.getObjects(), max + 1); } } proj.doAction(new CanvasActionAdapter(circuit, canvasAction)); } @Override public double getZoomFactor() { return grid.getZoomFactor(); } @Override public int snapX(int x) { if (x < 0) { return -((-x + 5) / 10 * 10); } else { return (x + 5) / 10 * 10; } } @Override public int snapY(int y) { if (y < 0) { return -((-y + 5) / 10 * 10); } else { return (y + 5) / 10 * 10; } } @Override protected void paintBackground(Graphics g) { super.paintBackground(g); grid.paintGrid(g); } @Override protected void paintForeground(Graphics g) { double zoom = grid.getZoomFactor(); Graphics gScaled = g.create(); if (zoom != 1.0 && zoom != 0.0 && gScaled instanceof Graphics2D) { ((Graphics2D) gScaled).scale(zoom, zoom); } super.paintForeground(gScaled); gScaled.dispose(); } @Override public void repaintCanvasCoords(int x, int y, int width, int height) { double zoom = grid.getZoomFactor(); if (zoom != 1.0) { x = (int) (x * zoom - 1); y = (int) (y * zoom - 1); width = (int) (width * zoom + 4); height = (int) (height * zoom + 4); } super.repaintCanvasCoords(x, y, width, height); } @Override protected void processMouseEvent(MouseEvent e) { repairEvent(e, grid.getZoomFactor()); super.processMouseEvent(e); } @Override public JPopupMenu showPopupMenu(MouseEvent e, CanvasObject clicked) { double zoom = grid.getZoomFactor(); int x = (int) Math.round(e.getX() * zoom); int y = (int) Math.round(e.getY() * zoom); if (clicked != null && getSelection().isSelected(clicked)) { AppearanceEditPopup popup = new AppearanceEditPopup(this); popup.show(this, x, y); return popup; } return null; } @Override protected void processMouseMotionEvent(MouseEvent e) { repairEvent(e, grid.getZoomFactor()); super.processMouseMotionEvent(e); } private void hidePopup() { LayoutPopupManager man = popupManager; if (man != null) { man.hideCurrentPopup(); } } private void repairEvent(MouseEvent e, double zoom) { if (zoom != 1.0) { int oldx = e.getX(); int oldy = e.getY(); int newx = (int) Math.round(e.getX() / zoom); int newy = (int) Math.round(e.getY() / zoom); e.translatePoint(newx - oldx, newy - oldy); } } private void computeSize(boolean immediate) { hidePopup(); Bounds bounds; CircuitState circState = circuitState; if (circState == null) { bounds = Bounds.create(0, 0, 50, 50); } else { bounds = circState.getCircuit().getAppearance().getAbsoluteBounds(); } int width = bounds.getX() + bounds.getWidth() + BOUNDS_BUFFER; int height = bounds.getY() + bounds.getHeight() + BOUNDS_BUFFER; Dimension dim; if (canvasPane == null) { dim = new Dimension(width, height); } else { dim = canvasPane.supportPreferredSize(width, height); } if (!immediate) { Bounds old = oldPreferredSize; if (old != null && Math.abs(old.getWidth() - dim.width) < THRESH_SIZE_UPDATE && Math.abs(old.getHeight() - dim.height) < THRESH_SIZE_UPDATE) { return; } } oldPreferredSize = Bounds.create(0, 0, dim.width, dim.height); setPreferredSize(dim); revalidate(); } // // CanvasPaneContents methods // public void setCanvasPane(CanvasPane value) { canvasPane = value; computeSize(true); popupManager = new LayoutPopupManager(value, this); } public void recomputeSize() { computeSize(true); repaint(); } public Dimension getPreferredScrollableViewportSize() { return getPreferredSize(); } public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) { return canvasPane.supportScrollableBlockIncrement(visibleRect, orientation, direction); } public boolean getScrollableTracksViewportHeight() { return false; } public boolean getScrollableTracksViewportWidth() { return false; } public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) { return canvasPane.supportScrollableUnitIncrement(visibleRect, orientation, direction); } static int getMaxIndex(CanvasModel model) { List objects = model.getObjectsFromBottom(); for (int i = objects.size() - 1; i >= 0; i--) { if (!(objects.get(i) instanceof AppearanceElement)) { return i; } } return -1; } } logisim-2.7.1/src/com/cburch/logisim/file/0000755000175000017500000000000011541271676020271 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/logisim/file/XmlWriter.java0000644000175000017500000002205511447117122023063 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.file; import java.io.OutputStream; import java.util.HashMap; import java.util.Map; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.OutputKeys; import javax.xml.transform.Result; import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Element; import com.cburch.draw.model.AbstractCanvasObject; import com.cburch.logisim.LogisimVersion; import com.cburch.logisim.Main; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.Wire; import com.cburch.logisim.comp.Component; import com.cburch.logisim.comp.ComponentFactory; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeDefaultProvider; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.tools.Library; import com.cburch.logisim.tools.Tool; import com.cburch.logisim.util.InputEventUtil; import com.cburch.logisim.util.StringUtil; class XmlWriter { static void write(LogisimFile file, OutputStream out, LibraryLoader loader) throws ParserConfigurationException, TransformerConfigurationException, TransformerException { DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); Document doc = docBuilder.newDocument(); XmlWriter context = new XmlWriter(file, doc, loader); context.fromLogisimFile(); TransformerFactory tfFactory = TransformerFactory.newInstance(); try { tfFactory.setAttribute("indent-number", Integer.valueOf(2)); } catch (IllegalArgumentException e) { } Transformer tf = tfFactory.newTransformer(); tf.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); tf.setOutputProperty(OutputKeys.INDENT, "yes"); try { tf.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); } catch (IllegalArgumentException e) { } Source src = new DOMSource(doc); Result dest = new StreamResult(out); tf.transform(src, dest); } private LogisimFile file; private Document doc; private LibraryLoader loader; private HashMap libs = new HashMap(); private XmlWriter(LogisimFile file, Document doc, LibraryLoader loader) { this.file = file; this.doc = doc; this.loader = loader; } Element fromLogisimFile() { Element ret = doc.createElement("project"); doc.appendChild(ret); ret.appendChild(doc.createTextNode("\nThis file is intended to be " + "loaded by Logisim (http://www.cburch.com/logisim/).\n")); ret.setAttribute("version", "1.0"); ret.setAttribute("source", Main.VERSION_NAME); for (Library lib : file.getLibraries()) { Element elt = fromLibrary(lib); if (elt != null) ret.appendChild(elt); } if (file.getMainCircuit() != null) { Element mainElt = doc.createElement("main"); mainElt.setAttribute("name", file.getMainCircuit().getName()); ret.appendChild(mainElt); } ret.appendChild(fromOptions()); ret.appendChild(fromMouseMappings()); ret.appendChild(fromToolbarData()); for (Circuit circ : file.getCircuits()) { ret.appendChild(fromCircuit(circ)); } return ret; } Element fromLibrary(Library lib) { Element ret = doc.createElement("lib"); if (libs.containsKey(lib)) return null; String name = "" + libs.size(); String desc = loader.getDescriptor(lib); if (desc == null) { loader.showError("library location unknown: " + lib.getName()); return null; } libs.put(lib, name); ret.setAttribute("name", name); ret.setAttribute("desc", desc); for (Tool t : lib.getTools()) { AttributeSet attrs = t.getAttributeSet(); if (attrs != null) { Element toAdd = doc.createElement("tool"); toAdd.setAttribute("name", t.getName()); addAttributeSetContent(toAdd, attrs, t); if (toAdd.getChildNodes().getLength() > 0) { ret.appendChild(toAdd); } } } return ret; } Element fromOptions() { Element elt = doc.createElement("options"); addAttributeSetContent(elt, file.getOptions().getAttributeSet(), null); return elt; } Element fromMouseMappings() { Element elt = doc.createElement("mappings"); MouseMappings map = file.getOptions().getMouseMappings(); for (Map.Entry entry : map.getMappings().entrySet()) { Integer mods = entry.getKey(); Tool tool = entry.getValue(); Element toolElt = fromTool(tool); String mapValue = InputEventUtil.toString(mods.intValue()); toolElt.setAttribute("map", mapValue); elt.appendChild(toolElt); } return elt; } Element fromToolbarData() { Element elt = doc.createElement("toolbar"); ToolbarData toolbar = file.getOptions().getToolbarData(); for (Tool tool : toolbar.getContents()) { if (tool == null) { elt.appendChild(doc.createElement("sep")); } else { elt.appendChild(fromTool(tool)); } } return elt; } Element fromTool(Tool tool) { Library lib = findLibrary(tool); String lib_name; if (lib == null) { loader.showError(StringUtil.format("tool `%s' not found", tool.getDisplayName())); return null; } else if (lib == file) { lib_name = null; } else { lib_name = libs.get(lib); if (lib_name == null) { loader.showError("unknown library within file"); return null; } } Element elt = doc.createElement("tool"); if (lib_name != null) elt.setAttribute("lib", lib_name); elt.setAttribute("name", tool.getName()); addAttributeSetContent(elt, tool.getAttributeSet(), tool); return elt; } Element fromCircuit(Circuit circuit) { Element ret = doc.createElement("circuit"); ret.setAttribute("name", circuit.getName()); addAttributeSetContent(ret, circuit.getStaticAttributes(), null); if (!circuit.getAppearance().isDefaultAppearance()) { Element appear = doc.createElement("appear"); for (Object o : circuit.getAppearance().getObjectsFromBottom()) { if (o instanceof AbstractCanvasObject) { Element elt = ((AbstractCanvasObject) o).toSvgElement(doc); if (elt != null) { appear.appendChild(elt); } } } ret.appendChild(appear); } for (Wire w : circuit.getWires()) { ret.appendChild(fromWire(w)); } for (Component comp : circuit.getNonWires()) { Element elt = fromComponent(comp); if (elt != null) ret.appendChild(elt); } return ret; } Element fromComponent(Component comp) { ComponentFactory source = comp.getFactory(); Library lib = findLibrary(source); String lib_name; if (lib == null) { loader.showError(source.getName() + " component not found"); return null; } else if (lib == file) { lib_name = null; } else { lib_name = libs.get(lib); if (lib_name == null) { loader.showError("unknown library within file"); return null; } } Element ret = doc.createElement("comp"); if (lib_name != null) ret.setAttribute("lib", lib_name); ret.setAttribute("name", source.getName()); ret.setAttribute("loc", comp.getLocation().toString()); addAttributeSetContent(ret, comp.getAttributeSet(), comp.getFactory()); return ret; } Element fromWire(Wire w) { Element ret = doc.createElement("wire"); ret.setAttribute("from", w.getEnd0().toString()); ret.setAttribute("to", w.getEnd1().toString()); return ret; } void addAttributeSetContent(Element elt, AttributeSet attrs, AttributeDefaultProvider source) { if (attrs == null) return; LogisimVersion ver = Main.VERSION; if (source != null && source.isAllDefaultValues(attrs, ver)) return; for (Attribute attrBase : attrs.getAttributes()) { @SuppressWarnings("unchecked") Attribute attr = (Attribute) attrBase; Object val = attrs.getValue(attr); if (attrs.isToSave(attr) && val != null) { Object dflt = source == null ? null : source.getDefaultAttributeValue(attr, ver); if (dflt == null || !dflt.equals(val)) { Element a = doc.createElement("a"); a.setAttribute("name", attr.getName()); String value = attr.toStandardString(val); if (value.indexOf("\n") >= 0) { a.appendChild(doc.createTextNode(value)); } else { a.setAttribute("val", attr.toStandardString(val)); } elt.appendChild(a); } } } } Library findLibrary(Tool tool) { if (libraryContains(file, tool)) { return file; } for (Library lib : file.getLibraries()) { if (libraryContains(lib, tool)) return lib; } return null; } Library findLibrary(ComponentFactory source) { if (file.contains(source)) { return file; } for (Library lib : file.getLibraries()) { if (lib.contains(source)) return lib; } return null; } boolean libraryContains(Library lib, Tool query) { for (Tool tool : lib.getTools()) { if (tool.sharesSource(query)) return true; } return false; } } logisim-2.7.1/src/com/cburch/logisim/file/XmlReaderException.java0000644000175000017500000000121711541271676024677 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.file; import java.util.Collections; import java.util.List; class XmlReaderException extends Exception { private List messages; public XmlReaderException(String message) { this(Collections.singletonList(message)); } public XmlReaderException(List messages) { this.messages = messages; } @Override public String getMessage() { return messages.get(0); } public List getMessages() { return messages; } } logisim-2.7.1/src/com/cburch/logisim/file/XmlReader.java0000644000175000017500000004526311541271676023031 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.file; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.xml.sax.SAXException; import com.cburch.draw.model.AbstractCanvasObject; import com.cburch.logisim.LogisimVersion; import com.cburch.logisim.Main; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.appear.AppearanceSvgReader; import com.cburch.logisim.comp.Component; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeDefaultProvider; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Location; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.std.wiring.Pin; import com.cburch.logisim.tools.Library; import com.cburch.logisim.tools.Tool; import com.cburch.logisim.util.InputEventUtil; import com.cburch.logisim.util.StringUtil; class XmlReader { static class CircuitData { Element circuitElement; Circuit circuit; Map knownComponents; List appearance; public CircuitData(Element circuitElement, Circuit circuit) { this.circuitElement = circuitElement; this.circuit = circuit; } } class ReadContext { LogisimFile file; LogisimVersion sourceVersion; HashMap libs = new HashMap(); private ArrayList messages; ReadContext(LogisimFile file) { this.file = file; this.messages = new ArrayList(); } void addError(String message, String context) { messages.add(message + " [" + context + "]"); } void addErrors(XmlReaderException exception, String context) { for (String msg : exception.getMessages()) { messages.add(msg + " [" + context + "]"); } } private void toLogisimFile(Element elt) { // determine the version producing this file String versionString = elt.getAttribute("source"); if (versionString.equals("")) { sourceVersion = Main.VERSION; } else { sourceVersion = LogisimVersion.parse(versionString); } // first, load the sublibraries for (Element o : XmlIterator.forChildElements(elt, "lib")) { Library lib = toLibrary(o); if (lib != null) file.addLibrary(lib); } // second, create the circuits - empty for now List circuitsData = new ArrayList(); for (Element circElt : XmlIterator.forChildElements(elt, "circuit")) { String name = circElt.getAttribute("name"); if (name == null || name.equals("")) { addError(Strings.get("circNameMissingError"), "C??"); } CircuitData circData = new CircuitData(circElt, new Circuit(name)); file.addCircuit(circData.circuit); circData.knownComponents = loadKnownComponents(circElt); for (Element appearElt : XmlIterator.forChildElements(circElt, "appear")) { loadAppearance(appearElt, circData, name + ".appear"); } circuitsData.add(circData); } // third, process the other child elements for (Element sub_elt : XmlIterator.forChildElements(elt)) { String name = sub_elt.getTagName(); if (name.equals("circuit") || name.equals("lib")) { ; // Nothing to do: Done earlier. } else if (name.equals("options")) { try { initAttributeSet(sub_elt, file.getOptions().getAttributeSet(), null); } catch (XmlReaderException e) { addErrors(e, "options"); } } else if (name.equals("mappings")) { initMouseMappings(sub_elt); } else if (name.equals("toolbar")) { initToolbarData(sub_elt); } else if (name.equals("main")) { String main = sub_elt.getAttribute("name"); Circuit circ = file.getCircuit(main); if (circ != null) { file.setMainCircuit(circ); } } else if (name.equals("message")) { file.addMessage(sub_elt.getAttribute("value")); } } // fourth, execute a transaction that initializes all the circuits XmlCircuitReader builder; builder = new XmlCircuitReader(this, circuitsData); builder.execute(); } private Library toLibrary(Element elt) { if (!elt.hasAttribute("name")) { loader.showError(Strings.get("libNameMissingError")); return null; } if (!elt.hasAttribute("desc")) { loader.showError(Strings.get("libDescMissingError")); return null; } String name = elt.getAttribute("name"); String desc = elt.getAttribute("desc"); Library ret = loader.loadLibrary(desc); if (ret == null) return null; libs.put(name, ret); for (Element sub_elt : XmlIterator.forChildElements(elt, "tool")) { if (!sub_elt.hasAttribute("name")) { loader.showError(Strings.get("toolNameMissingError")); } else { String tool_str = sub_elt.getAttribute("name"); Tool tool = ret.getTool(tool_str); if (tool != null) { try { initAttributeSet(sub_elt, tool.getAttributeSet(), tool); } catch (XmlReaderException e) { addErrors(e, "lib." + name + "." + tool_str); } } } } return ret; } private Map loadKnownComponents(Element elt) { Map known = new HashMap(); for (Element sub : XmlIterator.forChildElements(elt, "comp")) { try { Component comp = XmlCircuitReader.getComponent(sub, this); known.put(sub, comp); } catch (XmlReaderException e) { } } return known; } private void loadAppearance(Element appearElt, CircuitData circData, String context) { Map pins = new HashMap(); for (Component comp : circData.knownComponents.values()) { if (comp.getFactory() == Pin.FACTORY) { Instance instance = Instance.getInstanceFor(comp); pins.put(comp.getLocation(), instance); } } List shapes = new ArrayList(); for (Element sub : XmlIterator.forChildElements(appearElt)) { try { AbstractCanvasObject m = AppearanceSvgReader.createShape(sub, pins); if (m == null) { addError(Strings.get("fileAppearanceNotFound", sub.getTagName()), context + "." + sub.getTagName()); } else { shapes.add(m); } } catch (RuntimeException e) { addError(Strings.get("fileAppearanceError", sub.getTagName()), context + "." + sub.getTagName()); } } if (!shapes.isEmpty()) { if (circData.appearance == null) { circData.appearance = shapes; } else { circData.appearance.addAll(shapes); } } } private void initMouseMappings(Element elt) { MouseMappings map = file.getOptions().getMouseMappings(); for (Element sub_elt : XmlIterator.forChildElements(elt, "tool")) { Tool tool; try { tool = toTool(sub_elt); } catch (XmlReaderException e) { addErrors(e, "mapping"); continue; } String mods_str = sub_elt.getAttribute("map"); if (mods_str == null || mods_str.equals("")) { loader.showError(Strings.get("mappingMissingError")); continue; } int mods; try { mods = InputEventUtil.fromString(mods_str); } catch (NumberFormatException e) { loader.showError(StringUtil.format( Strings.get("mappingBadError"), mods_str)); continue; } tool = tool.cloneTool(); try { initAttributeSet(sub_elt, tool.getAttributeSet(), tool); } catch (XmlReaderException e) { addErrors(e, "mapping." + tool.getName()); } map.setToolFor(mods, tool); } } private void initToolbarData(Element elt) { ToolbarData toolbar = file.getOptions().getToolbarData(); for (Element sub_elt : XmlIterator.forChildElements(elt)) { if (sub_elt.getTagName().equals("sep")) { toolbar.addSeparator(); } else if (sub_elt.getTagName().equals("tool")) { Tool tool; try { tool = toTool(sub_elt); } catch (XmlReaderException e) { addErrors(e, "toolbar"); continue; } if (tool != null) { tool = tool.cloneTool(); try { initAttributeSet(sub_elt, tool.getAttributeSet(), tool); } catch (XmlReaderException e) { addErrors(e, "toolbar." + tool.getName()); } toolbar.addTool(tool); } } } } Tool toTool(Element elt) throws XmlReaderException { Library lib = findLibrary(elt.getAttribute("lib")); String name = elt.getAttribute("name"); if (name == null || name.equals("")) { throw new XmlReaderException(Strings.get("toolNameMissing")); } Tool tool = lib.getTool(name); if (tool == null) { throw new XmlReaderException(Strings.get("toolNotFound")); } return tool; } void initAttributeSet(Element parentElt, AttributeSet attrs, AttributeDefaultProvider defaults) throws XmlReaderException { ArrayList messages = null; HashMap attrsDefined = new HashMap(); for (Element attrElt : XmlIterator.forChildElements(parentElt, "a")) { if (!attrElt.hasAttribute("name")) { if (messages == null) messages = new ArrayList(); messages.add(Strings.get("attrNameMissingError")); } else { String attrName = attrElt.getAttribute("name"); String attrVal; if (attrElt.hasAttribute("val")) { attrVal = attrElt.getAttribute("val"); } else { attrVal = attrElt.getTextContent(); } attrsDefined.put(attrName, attrVal); } } if (attrs == null) return; LogisimVersion ver = sourceVersion; boolean setDefaults = defaults != null && !defaults.isAllDefaultValues(attrs, ver); // We need to process this in order, and we have to refetch the // attribute list each time because it may change as we iterate // (as it will for a splitter). for (int i = 0; true; i++) { List> attrList = attrs.getAttributes(); if (i >= attrList.size()) break; @SuppressWarnings("unchecked") Attribute attr = (Attribute) attrList.get(i); String attrName = attr.getName(); String attrVal = attrsDefined.get(attrName); if (attrVal == null) { if (setDefaults) { Object val = defaults.getDefaultAttributeValue(attr, ver); if (val != null) { attrs.setValue(attr, val); } } } else { try { Object val = attr.parse(attrVal); attrs.setValue(attr, val); } catch (NumberFormatException e) { if (messages == null) messages = new ArrayList(); messages.add(StringUtil.format( Strings.get("attrValueInvalidError"), attrVal, attrName)); } } } if (messages != null) { throw new XmlReaderException(messages); } } Library findLibrary(String lib_name) throws XmlReaderException { if (lib_name == null || lib_name.equals("")) { return file; } Library ret = libs.get(lib_name); if (ret == null) { throw new XmlReaderException(StringUtil.format( Strings.get("libMissingError"), lib_name)); } else { return ret; } } } private LibraryLoader loader; XmlReader(Loader loader) { this.loader = loader; } LogisimFile readLibrary(InputStream is) throws IOException, SAXException { Document doc = loadXmlFrom(is); Element elt = doc.getDocumentElement(); considerRepairs(doc, elt); LogisimFile file = new LogisimFile((Loader) loader); ReadContext context = new ReadContext(file); context.toLogisimFile(elt); if (file.getCircuitCount() == 0) { file.addCircuit(new Circuit("main")); } if (context.messages.size() > 0) { StringBuilder all = new StringBuilder(); for (String msg : context.messages) { all.append(msg); all.append("\n"); } loader.showError(all.substring(0, all.length() - 1)); } return file; } private Document loadXmlFrom(InputStream is) throws SAXException, IOException { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); DocumentBuilder builder = null; try { builder = factory.newDocumentBuilder(); } catch (ParserConfigurationException ex) { } return builder.parse(is); } private void considerRepairs(Document doc, Element root) { LogisimVersion version = LogisimVersion.parse(root.getAttribute("source")); if (version.compareTo(LogisimVersion.get(2, 3, 0)) < 0) { // This file was saved before an Edit tool existed. Most likely // we should replace the Select and Wiring tools in the toolbar // with the Edit tool instead. for (Element toolbar : XmlIterator.forChildElements(root, "toolbar")) { Element wiring = null; Element select = null; Element edit = null; for (Element elt : XmlIterator.forChildElements(toolbar, "tool")) { String eltName = elt.getAttribute("name"); if (eltName != null && !eltName.equals("")) { if (eltName.equals("Select Tool")) select = elt; if (eltName.equals("Wiring Tool")) wiring = elt; if (eltName.equals("Edit Tool")) edit = elt; } } if (select != null && wiring != null && edit == null) { select.setAttribute("name", "Edit Tool"); toolbar.removeChild(wiring); } } } if (version.compareTo(LogisimVersion.get(2, 6, 3)) < 0) { for (Element circElt : XmlIterator.forChildElements(root, "circuit")) { for (Element attrElt : XmlIterator.forChildElements(circElt, "a")) { String name = attrElt.getAttribute("name"); if (name != null && name.startsWith("label")) { attrElt.setAttribute("name", "c" + name); } } } repairForWiringLibrary(doc, root); repairForLegacyLibrary(doc, root); } } private void repairForWiringLibrary(Document doc, Element root) { Element oldBaseElt = null; String oldBaseLabel = null; Element gatesElt = null; String gatesLabel = null; int maxLabel = -1; Element firstLibElt = null; Element lastLibElt = null; for (Element libElt : XmlIterator.forChildElements(root, "lib")) { String desc = libElt.getAttribute("desc"); String label = libElt.getAttribute("name"); if (desc == null) { // skip these tests } else if (desc.equals("#Base")) { oldBaseElt = libElt; oldBaseLabel = label; } else if (desc.equals("#Wiring")) { // Wiring library already in file. This shouldn't happen, but if // somehow it does, we don't want to add it again. return; } else if (desc.equals("#Gates")) { gatesElt = libElt; gatesLabel = label; } if (firstLibElt == null) firstLibElt = libElt; lastLibElt = libElt; try { if (label != null) { int thisLabel = Integer.parseInt(label); if (thisLabel > maxLabel) maxLabel = thisLabel; } } catch (NumberFormatException e) { } } Element wiringElt; String wiringLabel; Element newBaseElt; String newBaseLabel; if (oldBaseElt != null) { wiringLabel = oldBaseLabel; wiringElt = oldBaseElt; wiringElt.setAttribute("desc", "#Wiring"); newBaseLabel = "" + (maxLabel + 1); newBaseElt = doc.createElement("lib"); newBaseElt.setAttribute("desc", "#Base"); newBaseElt.setAttribute("name", newBaseLabel); root.insertBefore(newBaseElt, lastLibElt.getNextSibling()); } else { wiringLabel = "" + (maxLabel + 1); wiringElt = doc.createElement("lib"); wiringElt.setAttribute("desc", "#Wiring"); wiringElt.setAttribute("name", wiringLabel); root.insertBefore(wiringElt, lastLibElt.getNextSibling()); newBaseLabel = null; newBaseElt = null; } HashMap labelMap = new HashMap(); addToLabelMap(labelMap, oldBaseLabel, newBaseLabel, "Poke Tool;" + "Edit Tool;Select Tool;Wiring Tool;Text Tool;Menu Tool;Text"); addToLabelMap(labelMap, oldBaseLabel, wiringLabel, "Splitter;Pin;" + "Probe;Tunnel;Clock;Pull Resistor;Bit Extender"); addToLabelMap(labelMap, gatesLabel, wiringLabel, "Constant"); relocateTools(oldBaseElt, newBaseElt, labelMap); relocateTools(oldBaseElt, wiringElt, labelMap); relocateTools(gatesElt, wiringElt, labelMap); updateFromLabelMap(XmlIterator.forDescendantElements(root, "comp"), labelMap); updateFromLabelMap(XmlIterator.forDescendantElements(root, "tool"), labelMap); } private void addToLabelMap(HashMap labelMap, String srcLabel, String dstLabel, String toolNames) { if (srcLabel != null && dstLabel != null) { for (String tool : toolNames.split(";")) { labelMap.put(srcLabel + ":" + tool, dstLabel); } } } private void relocateTools(Element src, Element dest, HashMap labelMap) { if (src == null || src == dest) return; String srcLabel = src.getAttribute("name"); if (srcLabel == null) return; ArrayList toRemove = new ArrayList(); for (Element elt : XmlIterator.forChildElements(src, "tool")) { String name = elt.getAttribute("name"); if (name != null && labelMap.containsKey(srcLabel + ":" + name)) { toRemove.add(elt); } } for (Element elt : toRemove) { src.removeChild(elt); if (dest != null) { dest.appendChild(elt); } } } private void updateFromLabelMap(Iterable elts, HashMap labelMap) { for (Element elt : elts) { String oldLib = elt.getAttribute("lib"); String name = elt.getAttribute("name"); if (oldLib != null && name != null) { String newLib = labelMap.get(oldLib + ":" + name); if (newLib != null) { elt.setAttribute("lib", newLib); } } } } private void repairForLegacyLibrary(Document doc, Element root) { Element legacyElt = null; String legacyLabel = null; for (Element libElt : XmlIterator.forChildElements(root, "lib")) { String desc = libElt.getAttribute("desc"); String label = libElt.getAttribute("name"); if (desc != null && desc.equals("#Legacy")) { legacyElt = libElt; legacyLabel = label; } } if (legacyElt != null) { root.removeChild(legacyElt); ArrayList toRemove = new ArrayList(); findLibraryUses(toRemove, legacyLabel, XmlIterator.forDescendantElements(root, "comp")); boolean componentsRemoved = !toRemove.isEmpty(); findLibraryUses(toRemove, legacyLabel, XmlIterator.forDescendantElements(root, "tool")); for (Element elt : toRemove) { elt.getParentNode().removeChild(elt); } if (componentsRemoved) { String error = "Some components have been deleted;" + " the Legacy library is no longer supported."; Element elt = doc.createElement("message"); elt.setAttribute("value", error); root.appendChild(elt); } } } private static void findLibraryUses(ArrayList dest, String label, Iterable candidates) { for (Element elt : candidates) { String lib = elt.getAttribute("lib"); if (lib.equals(label)) { dest.add(elt); } } } } logisim-2.7.1/src/com/cburch/logisim/file/XmlIterator.java0000644000175000017500000000445611524651242023407 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.file; import java.util.ArrayList; import java.util.Iterator; import java.util.NoSuchElementException; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class XmlIterator implements Iterable, Iterator, Cloneable { public static XmlIterator forChildren(Element node) { return new XmlIterator(node.getChildNodes()); } public static Iterable forChildElements(Element node) { NodeList nodes = node.getChildNodes(); ArrayList ret = new ArrayList(); for (int i = 0, n = nodes.getLength(); i < n; i++) { Node sub = nodes.item(i); if (sub.getNodeType() == Node.ELEMENT_NODE) { ret.add((Element) sub); } } return ret; } public static Iterable forChildElements(Element node, String tagName) { NodeList nodes = node.getChildNodes(); ArrayList ret = new ArrayList(); for (int i = 0, n = nodes.getLength(); i < n; i++) { Node sub = nodes.item(i); if (sub.getNodeType() == Node.ELEMENT_NODE) { Element elt = (Element) sub; if (elt.getTagName().equals(tagName)) ret.add(elt); } } return ret; } public static Iterable forDescendantElements(Element node, String tagName) { return new XmlIterator(node.getElementsByTagName(tagName)); } private NodeList list; private int index; public XmlIterator(NodeList nodes) { list = nodes; index = 0; } @Override public XmlIterator clone() { try { @SuppressWarnings("unchecked") XmlIterator ret = (XmlIterator) super.clone(); return ret; } catch (CloneNotSupportedException e) { return this; } } public Iterator iterator() { XmlIterator ret = this.clone(); ret.index = 0; return ret; } public boolean hasNext() { return list != null && index < list.getLength(); } public E next() { Node ret = list.item(index); if (ret == null) { throw new NoSuchElementException(); } else { index++; @SuppressWarnings("unchecked") E ret2 = (E) ret; return ret2; } } public void remove() { throw new UnsupportedOperationException("XmlChildIterator.remove"); } } logisim-2.7.1/src/com/cburch/logisim/file/XmlCircuitReader.java0000644000175000017500000001273611541271676024353 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.file; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import org.w3c.dom.Element; import com.cburch.draw.model.AbstractCanvasObject; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.CircuitMutator; import com.cburch.logisim.circuit.CircuitTransaction; import com.cburch.logisim.circuit.Wire; import com.cburch.logisim.comp.Component; import com.cburch.logisim.comp.ComponentFactory; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Location; import com.cburch.logisim.tools.AddTool; import com.cburch.logisim.tools.Library; import com.cburch.logisim.tools.Tool; public class XmlCircuitReader extends CircuitTransaction { private XmlReader.ReadContext reader; private List circuitsData; public XmlCircuitReader(XmlReader.ReadContext reader, List circDatas) { this.reader = reader; this.circuitsData = circDatas; } @Override protected Map getAccessedCircuits() { HashMap access = new HashMap(); for (XmlReader.CircuitData data : circuitsData) { access.put(data.circuit, READ_WRITE); } return access; } @Override protected void run(CircuitMutator mutator) { for (XmlReader.CircuitData circuitData : circuitsData) { buildCircuit(circuitData, mutator); } } private void buildCircuit(XmlReader.CircuitData circData, CircuitMutator mutator) { Element elt = circData.circuitElement; Circuit dest = circData.circuit; Map knownComponents = circData.knownComponents; if (knownComponents == null) knownComponents = Collections.emptyMap(); try { reader.initAttributeSet(circData.circuitElement, dest.getStaticAttributes(), null); } catch (XmlReaderException e) { reader.addErrors(e, circData.circuit.getName() + ".static"); } for (Element sub_elt : XmlIterator.forChildElements(elt)) { String sub_elt_name = sub_elt.getTagName(); if (sub_elt_name.equals("comp")) { try { Component comp = knownComponents.get(sub_elt); if (comp == null) { comp = getComponent(sub_elt, reader); } mutator.add(dest, comp); } catch (XmlReaderException e) { reader.addErrors(e, circData.circuit.getName() + "." + toComponentString(sub_elt)); } } else if (sub_elt_name.equals("wire")) { try { addWire(dest, mutator, sub_elt); } catch (XmlReaderException e) { reader.addErrors(e, circData.circuit.getName() + "." + toWireString(sub_elt)); } } } List appearance = circData.appearance; if (appearance != null && !appearance.isEmpty()) { dest.getAppearance().setObjectsForce(appearance); dest.getAppearance().setDefaultAppearance(false); } } private String toComponentString(Element elt) { String name = elt.getAttribute("name"); String loc = elt.getAttribute("loc"); return name + "(" + loc + ")"; } private String toWireString(Element elt) { String from = elt.getAttribute("from"); String to = elt.getAttribute("to"); return "w" + from + "-" + to; } void addWire(Circuit dest, CircuitMutator mutator, Element elt) throws XmlReaderException { Location pt0; try { String str = elt.getAttribute("from"); if (str == null || str.equals("")) { throw new XmlReaderException(Strings.get("wireStartMissingError")); } pt0 = Location.parse(str); } catch (NumberFormatException e) { throw new XmlReaderException(Strings.get("wireStartInvalidError")); } Location pt1; try { String str = elt.getAttribute("to"); if (str == null || str.equals("")) { throw new XmlReaderException(Strings.get("wireEndMissingError")); } pt1 = Location.parse(str); } catch (NumberFormatException e) { throw new XmlReaderException(Strings.get("wireEndInvalidError")); } mutator.add(dest, Wire.create(pt0, pt1)); } static Component getComponent(Element elt, XmlReader.ReadContext reader) throws XmlReaderException { // Determine the factory that creates this element String name = elt.getAttribute("name"); if (name == null || name.equals("")) { throw new XmlReaderException(Strings.get("compNameMissingError")); } String libName = elt.getAttribute("lib"); Library lib = reader.findLibrary(libName); if (lib == null) { throw new XmlReaderException(Strings.get("compUnknownError", "no-lib")); } Tool tool = lib.getTool(name); if (tool == null || !(tool instanceof AddTool)) { if (libName == null || libName.equals("")) { throw new XmlReaderException(Strings.get("compUnknownError", name)); } else { throw new XmlReaderException(Strings.get("compAbsentError", name, libName)); } } ComponentFactory source = ((AddTool) tool).getFactory(); // Determine attributes String loc_str = elt.getAttribute("loc"); AttributeSet attrs = source.createAttributeSet(); reader.initAttributeSet(elt, attrs, source); // Create component if location known if (loc_str == null || loc_str.equals("")) { throw new XmlReaderException(Strings.get("compLocMissingError", source.getName())); } else { try { Location loc = Location.parse(loc_str); return source.createComponent(loc, attrs); } catch (NumberFormatException e) { throw new XmlReaderException(Strings.get("compLocInvalidError", source.getName(), loc_str)); } } } } logisim-2.7.1/src/com/cburch/logisim/file/ToolbarData.java0000644000175000017500000001123211447117122023315 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.file; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; import java.util.Map; import com.cburch.logisim.data.AttributeListener; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.AttributeSets; import com.cburch.logisim.tools.Tool; import com.cburch.logisim.util.EventSourceWeakSupport; public class ToolbarData { public static interface ToolbarListener { public void toolbarChanged(); } private EventSourceWeakSupport listeners; private EventSourceWeakSupport toolListeners; private ArrayList contents; public ToolbarData() { listeners = new EventSourceWeakSupport(); toolListeners = new EventSourceWeakSupport(); contents = new ArrayList(); } // // listener methods // public void addToolbarListener(ToolbarListener l) { listeners.add(l); } public void removeToolbarListener(ToolbarListener l) { listeners.remove(l); } public void addToolAttributeListener(AttributeListener l) { for (Tool tool : contents) { if (tool != null) { AttributeSet attrs = tool.getAttributeSet(); if (attrs != null) attrs.addAttributeListener(l); } } toolListeners.add(l); } public void removeToolAttributeListener(AttributeListener l) { for (Tool tool : contents) { if (tool != null) { AttributeSet attrs = tool.getAttributeSet(); if (attrs != null) attrs.removeAttributeListener(l); } } toolListeners.remove(l); } private void addAttributeListeners(Tool tool) { for (AttributeListener l : toolListeners) { AttributeSet attrs = tool.getAttributeSet(); if (attrs != null) attrs.addAttributeListener(l); } } private void removeAttributeListeners(Tool tool) { for (AttributeListener l : toolListeners) { AttributeSet attrs = tool.getAttributeSet(); if (attrs != null) attrs.removeAttributeListener(l); } } public void fireToolbarChanged() { for (ToolbarListener l : listeners) { l.toolbarChanged(); } } // // query methods // public List getContents() { return contents; } public Tool getFirstTool() { for (Tool tool : contents) { if (tool != null) return tool; } return null; } public int size() { return contents.size(); } public Object get(int index) { return contents.get(index); } // // modification methods // public void copyFrom(ToolbarData other, LogisimFile file) { if (this == other) return; for (Tool tool : contents) { if (tool != null) { removeAttributeListeners(tool); } } this.contents.clear(); for (Tool srcTool : other.contents) { if (srcTool == null) { this.addSeparator(); } else { Tool toolCopy = file.findTool(srcTool); if (toolCopy != null) { Tool dstTool = toolCopy.cloneTool(); AttributeSets.copy(srcTool.getAttributeSet(), dstTool.getAttributeSet()); this.addTool(dstTool); addAttributeListeners(toolCopy); } } } fireToolbarChanged(); } public void addSeparator() { contents.add(null); fireToolbarChanged(); } public void addTool(Tool tool) { contents.add(tool); addAttributeListeners(tool); fireToolbarChanged(); } public void addTool(int pos, Tool tool) { contents.add(pos, tool); addAttributeListeners(tool); fireToolbarChanged(); } public void addSeparator(int pos) { contents.add(pos, null); fireToolbarChanged(); } public Object move(int from, int to) { Tool moved = contents.remove(from); contents.add(to, moved); fireToolbarChanged(); return moved; } public Object remove(int pos) { Object ret = contents.remove(pos); if (ret instanceof Tool) removeAttributeListeners((Tool) ret); fireToolbarChanged(); return ret; } boolean usesToolFromSource(Tool query) { for (Tool tool : contents) { if (tool != null && tool.sharesSource(query)) return true; } return false; } // // package-protected methods // void replaceAll(Map toolMap) { boolean changed = false; for (ListIterator it = contents.listIterator(); it.hasNext(); ) { Object old = it.next(); if (toolMap.containsKey(old)) { changed = true; removeAttributeListeners((Tool) old); Tool newTool = toolMap.get(old); if (newTool == null) { it.remove(); } else { Tool addedTool = newTool.cloneTool(); addAttributeListeners(addedTool); LoadedLibrary.copyAttributes(addedTool.getAttributeSet(), ((Tool) old).getAttributeSet()); it.set(addedTool); } } } if (changed) fireToolbarChanged(); } } logisim-2.7.1/src/com/cburch/logisim/file/Strings.java0000644000175000017500000000144611446034512022560 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.file; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.StringGetter; import com.cburch.logisim.util.StringUtil; class Strings { private static LocaleManager source = new LocaleManager("resources/logisim", "file"); public static String get(String key) { return source.get(key); } public static String get(String key, String arg) { return StringUtil.format(source.get(key), arg); } public static String get(String key, String arg0, String arg1) { return StringUtil.format(source.get(key), arg0, arg1); } public static StringGetter getter(String key) { return source.getter(key); } } logisim-2.7.1/src/com/cburch/logisim/file/ReaderInputStream.java0000644000175000017500000001134211447117122024521 0ustar vincentvincent/* * Copyright 2004-2005 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package com.cburch.logisim.file; import java.io.IOException; import java.io.InputStream; import java.io.Reader; /** * Adapts a Reader as an InputStream. * Adapted from StringInputStream. * */ public class ReaderInputStream extends InputStream { /** Source Reader */ private Reader in; private String encoding = System.getProperty("file.encoding"); private byte[] slack; private int begin; /** * Construct a ReaderInputStream * for the specified Reader. * * @param reader Reader. Must not be null. */ public ReaderInputStream(Reader reader) { in = reader; } /** * Construct a ReaderInputStream * for the specified Reader, * with the specified encoding. * * @param reader non-null Reader. * @param encoding non-null String encoding. */ public ReaderInputStream(Reader reader, String encoding) { this(reader); if (encoding == null) { throw new IllegalArgumentException("encoding must not be null"); } else { this.encoding = encoding; } } /** * Reads from the Reader, returning the same value. * * @return the value of the next character in the Reader. * * @exception IOException if the original Reader fails to be read */ @Override public synchronized int read() throws IOException { if (in == null) { throw new IOException("Stream Closed"); } byte result; if (slack != null && begin < slack.length) { result = slack[begin]; if (++begin == slack.length) { slack = null; } } else { byte[] buf = new byte[1]; if (read(buf, 0, 1) <= 0) { result = -1; } result = buf[0]; } if (result < -1) { result += 256; } return result; } /** * Reads from the Reader into a byte array * * @param b the byte array to read into * @param off the offset in the byte array * @param len the length in the byte array to fill * @return the actual number read into the byte array, -1 at * the end of the stream * @exception IOException if an error occurs */ @Override public synchronized int read(byte[] b, int off, int len) throws IOException { if (in == null) { throw new IOException("Stream Closed"); } while (slack == null) { char[] buf = new char[len]; // might read too much int n = in.read(buf); if (n == -1) { return -1; } if (n > 0) { slack = new String(buf, 0, n).getBytes(encoding); begin = 0; } } if (len > slack.length - begin) { len = slack.length - begin; } System.arraycopy(slack, begin, b, off, len); if ((begin += len) >= slack.length) { slack = null; } return len; } /** * Marks the read limit of the StringReader. * * @param limit the maximum limit of bytes that can be read before the * mark position becomes invalid */ @Override public synchronized void mark(final int limit) { try { in.mark(limit); } catch (IOException ioe) { throw new RuntimeException(ioe.getMessage()); } } /** * @return the current number of bytes ready for reading * @exception IOException if an error occurs */ @Override public synchronized int available() throws IOException { if (in == null) { throw new IOException("Stream Closed"); } if (slack != null) { return slack.length - begin; } if (in.ready()) { return 1; } else { return 0; } } /** * @return false - mark is not supported */ @Override public boolean markSupported () { return false; // would be imprecise } /** * Resets the StringReader. * * @exception IOException if the StringReader fails to be reset */ @Override public synchronized void reset() throws IOException { if (in == null) { throw new IOException("Stream Closed"); } slack = null; in.reset(); } /** * Closes the Stringreader. * * @exception IOException if the original StringReader fails to be closed */ @Override public synchronized void close() throws IOException { if (in != null) { in.close(); slack = null; in = null; } } }logisim-2.7.1/src/com/cburch/logisim/file/ProjectsDirty.java0000644000175000017500000000326611446034512023736 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.file; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; import java.util.ArrayList; import com.cburch.logisim.proj.Project; import com.cburch.logisim.proj.Projects; class ProjectsDirty { private ProjectsDirty() { } private static class DirtyListener implements LibraryListener { Project proj; DirtyListener(Project proj) { this.proj = proj; } public void libraryChanged(LibraryEvent event) { if (event.getAction() == LibraryEvent.DIRTY_STATE) { LogisimFile lib = proj.getLogisimFile(); File file = lib.getLoader().getMainFile(); LibraryManager.instance.setDirty(file, lib.isDirty()); } } } private static class ProjectListListener implements PropertyChangeListener { public synchronized void propertyChange(PropertyChangeEvent event) { for (DirtyListener l : listeners) { l.proj.removeLibraryListener(l); } listeners.clear(); for (Project proj : Projects.getOpenProjects()) { DirtyListener l = new DirtyListener(proj); proj.addLibraryListener(l); listeners.add(l); LogisimFile lib = proj.getLogisimFile(); LibraryManager.instance.setDirty(lib.getLoader().getMainFile(), lib.isDirty()); } } } private static ProjectListListener projectListListener = new ProjectListListener(); private static ArrayList listeners = new ArrayList(); public static void initialize() { Projects.addPropertyChangeListener(Projects.projectListProperty, projectListListener); } } logisim-2.7.1/src/com/cburch/logisim/file/Options.java0000644000175000017500000000407411500267114022557 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.file; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeOption; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.AttributeSets; import com.cburch.logisim.data.Attributes; public class Options { public static final AttributeOption GATE_UNDEFINED_IGNORE = new AttributeOption("ignore", Strings.getter("gateUndefinedIgnore")); public static final AttributeOption GATE_UNDEFINED_ERROR = new AttributeOption("error", Strings.getter("gateUndefinedError")); public static final Attribute sim_limit_attr = Attributes.forInteger("simlimit", Strings.getter("simLimitOption")); public static final Attribute sim_rand_attr = Attributes.forInteger("simrand", Strings.getter("simRandomOption")); public static final Attribute ATTR_GATE_UNDEFINED = Attributes.forOption("gateUndefined", Strings.getter("gateUndefinedOption"), new AttributeOption[] { GATE_UNDEFINED_IGNORE, GATE_UNDEFINED_ERROR }); public static final Integer sim_rand_dflt = Integer.valueOf(32); private static final Attribute[] ATTRIBUTES = { ATTR_GATE_UNDEFINED, sim_limit_attr, sim_rand_attr, }; private static final Object[] DEFAULTS = { GATE_UNDEFINED_IGNORE, Integer.valueOf(1000), Integer.valueOf(0), }; private AttributeSet attrs; private MouseMappings mmappings; private ToolbarData toolbar; public Options() { attrs = AttributeSets.fixedSet(ATTRIBUTES, DEFAULTS); mmappings = new MouseMappings(); toolbar = new ToolbarData(); } public AttributeSet getAttributeSet() { return attrs; } public MouseMappings getMouseMappings() { return mmappings; } public ToolbarData getToolbarData() { return toolbar; } public void copyFrom(Options other, LogisimFile dest) { AttributeSets.copy(other.attrs, this.attrs); this.toolbar.copyFrom(other.toolbar, dest); this.mmappings.copyFrom(other.mmappings, dest); } } logisim-2.7.1/src/com/cburch/logisim/file/MouseMappings.java0000644000175000017500000001071511447117122023715 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.file; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.HashMap; import java.util.Set; import java.util.Map; import com.cburch.logisim.comp.ComponentFactory; import com.cburch.logisim.data.AttributeSets; import com.cburch.logisim.tools.AddTool; import com.cburch.logisim.tools.SelectTool; import com.cburch.logisim.tools.Tool; public class MouseMappings { public static interface MouseMappingsListener { public void mouseMappingsChanged(); } private ArrayList listeners; private HashMap map; private int cache_mods; private Tool cache_tool; public MouseMappings() { listeners = new ArrayList(); map = new HashMap(); } // // listener methods // public void addMouseMappingsListener(MouseMappingsListener l) { listeners.add(l); } public void removeMouseMappingsListener(MouseMappingsListener l) { listeners.add(l); } private void fireMouseMappingsChanged() { for (MouseMappingsListener l : listeners) { l.mouseMappingsChanged(); } } // // query methods // public Map getMappings() { return map; } public Set getMappedModifiers() { return map.keySet(); } public Tool getToolFor(MouseEvent e) { return getToolFor(e.getModifiersEx()); } public Tool getToolFor(int mods) { if (mods == cache_mods) { return cache_tool; } else { Tool ret = map.get(Integer.valueOf(mods)); cache_mods = mods; cache_tool = ret; return ret; } } public Tool getToolFor(Integer mods) { if (mods.intValue() == cache_mods) { return cache_tool; } else { Tool ret = map.get(mods); cache_mods = mods.intValue(); cache_tool = ret; return ret; } } public boolean usesToolFromSource(Tool query) { for (Tool tool : map.values()) { if (tool.sharesSource(query)) { return true; } } return false; } public boolean containsSelectTool() { for (Tool tool : map.values()) { if (tool instanceof SelectTool) return true; } return false; } // // modification methods // public void copyFrom(MouseMappings other, LogisimFile file) { if (this == other) return; cache_mods = -1; this.map.clear(); for (Integer mods : other.map.keySet()) { Tool srcTool = other.map.get(mods); Tool dstTool = file.findTool(srcTool); if (dstTool != null) { dstTool = dstTool.cloneTool(); AttributeSets.copy(srcTool.getAttributeSet(), dstTool.getAttributeSet()); this.map.put(mods, dstTool); } } fireMouseMappingsChanged(); } public void setToolFor(MouseEvent e, Tool tool) { setToolFor(e.getModifiersEx(), tool); } public void setToolFor(int mods, Tool tool) { if (mods == cache_mods) cache_mods = -1; if (tool == null) { Object old = map.remove(Integer.valueOf(mods)); if (old != null) fireMouseMappingsChanged(); } else { Object old = map.put(Integer.valueOf(mods), tool); if (old != tool) fireMouseMappingsChanged(); } } public void setToolFor(Integer mods, Tool tool) { if (mods.intValue() == cache_mods) cache_mods = -1; if (tool == null) { Object old = map.remove(mods); if (old != null) fireMouseMappingsChanged(); } else { Object old = map.put(mods, tool); if (old != tool) fireMouseMappingsChanged(); } } // // package-protected methods // void replaceAll(Map toolMap) { boolean changed = false; for (Map.Entry entry : map.entrySet()) { Integer key = entry.getKey(); Tool tool = entry.getValue(); if (tool instanceof AddTool) { ComponentFactory factory = ((AddTool) tool).getFactory(); if (toolMap.containsKey(factory)) { changed = true; Tool newTool = toolMap.get(factory); if (newTool == null) { map.remove(key); } else { Tool clone = newTool.cloneTool(); LoadedLibrary.copyAttributes(clone.getAttributeSet(), tool.getAttributeSet()); map.put(key, clone); } } } else { if (toolMap.containsKey(tool)) { changed = true; Tool newTool = toolMap.get(tool); if (newTool == null) { map.remove(key); } else { Tool clone = newTool.cloneTool(); LoadedLibrary.copyAttributes(clone.getAttributeSet(), tool.getAttributeSet()); map.put(key, clone); } } } } if (changed) fireMouseMappingsChanged(); } } logisim-2.7.1/src/com/cburch/logisim/file/LogisimFileActions.java0000644000175000017500000001721011447117122024647 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.file; import java.util.ArrayList; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.proj.Action; import com.cburch.logisim.proj.Project; import com.cburch.logisim.proj.ProjectActions; import com.cburch.logisim.tools.AddTool; import com.cburch.logisim.tools.Library; import com.cburch.logisim.tools.Tool; public class LogisimFileActions { private LogisimFileActions() { } public static Action addCircuit(Circuit circuit) { return new AddCircuit(circuit); } public static Action removeCircuit(Circuit circuit) { return new RemoveCircuit(circuit); } public static Action moveCircuit(AddTool tool, int toIndex) { return new MoveCircuit(tool, toIndex); } public static Action loadLibrary(Library lib) { return new LoadLibraries(new Library[] { lib }); } public static Action loadLibraries(Library[] libs) { return new LoadLibraries(libs); } public static Action unloadLibrary(Library lib) { return new UnloadLibraries(new Library[] { lib }); } public static Action unloadLibraries(Library[] libs) { return new UnloadLibraries(libs); } public static Action setMainCircuit(Circuit circuit) { return new SetMainCircuit(circuit); } public static Action revertDefaults() { return new RevertDefaults(); } private static class AddCircuit extends Action { private Circuit circuit; AddCircuit(Circuit circuit) { this.circuit = circuit; } @Override public String getName() { return Strings.get("addCircuitAction"); } @Override public void doIt(Project proj) { proj.getLogisimFile().addCircuit(circuit); } @Override public void undo(Project proj) { proj.getLogisimFile().removeCircuit(circuit); } } private static class RemoveCircuit extends Action { private Circuit circuit; private int index; RemoveCircuit(Circuit circuit) { this.circuit = circuit; } @Override public String getName() { return Strings.get("removeCircuitAction"); } @Override public void doIt(Project proj) { index = proj.getLogisimFile().getCircuits().indexOf(circuit); proj.getLogisimFile().removeCircuit(circuit); } @Override public void undo(Project proj) { proj.getLogisimFile().addCircuit(circuit, index); } } private static class MoveCircuit extends Action { private AddTool tool; private int fromIndex; private int toIndex; MoveCircuit(AddTool tool, int toIndex) { this.tool = tool; this.toIndex = toIndex; } @Override public String getName() { return Strings.get("moveCircuitAction"); } @Override public void doIt(Project proj) { fromIndex = proj.getLogisimFile().getTools().indexOf(tool); proj.getLogisimFile().moveCircuit(tool, toIndex); } @Override public void undo(Project proj) { proj.getLogisimFile().moveCircuit(tool, fromIndex); } @Override public boolean shouldAppendTo(Action other) { return other instanceof MoveCircuit && ((MoveCircuit) other).tool == this.tool; } @Override public Action append(Action other) { MoveCircuit ret = new MoveCircuit(tool, ((MoveCircuit) other).toIndex); ret.fromIndex = this.fromIndex; return ret.fromIndex == ret.toIndex ? null : ret; } } private static class LoadLibraries extends Action { private Library[] libs; LoadLibraries(Library[] libs) { this.libs = libs; } @Override public String getName() { if (libs.length == 1) { return Strings.get("loadLibraryAction"); } else { return Strings.get("loadLibrariesAction"); } } @Override public void doIt(Project proj) { for (int i = 0; i < libs.length; i++) { proj.getLogisimFile().addLibrary(libs[i]); } } @Override public void undo(Project proj) { for (int i = libs.length - 1; i >= 0; i--) { proj.getLogisimFile().removeLibrary(libs[i]); } } } private static class UnloadLibraries extends Action { private Library[] libs; UnloadLibraries(Library[] libs) { this.libs = libs; } @Override public String getName() { if (libs.length == 1) { return Strings.get("unloadLibraryAction"); } else { return Strings.get("unloadLibrariesAction"); } } @Override public void doIt(Project proj) { for (int i = libs.length - 1; i >= 0; i--) { proj.getLogisimFile().removeLibrary(libs[i]); } } @Override public void undo(Project proj) { for (int i = 0; i < libs.length; i++) { proj.getLogisimFile().addLibrary(libs[i]); } } } private static class SetMainCircuit extends Action { private Circuit oldval; private Circuit newval; SetMainCircuit(Circuit circuit) { newval = circuit; } @Override public String getName() { return Strings.get("setMainCircuitAction"); } @Override public void doIt(Project proj) { oldval = proj.getLogisimFile().getMainCircuit(); proj.getLogisimFile().setMainCircuit(newval); } @Override public void undo(Project proj) { proj.getLogisimFile().setMainCircuit(oldval); } } private static class RevertAttributeValue { private AttributeSet attrs; private Attribute attr; private Object value; RevertAttributeValue(AttributeSet attrs, Attribute attr, Object value) { this.attrs = attrs; this.attr = attr; this.value = value; } } private static class RevertDefaults extends Action { private Options oldOpts; private ArrayList libraries = null; private ArrayList attrValues; RevertDefaults() { libraries = null; attrValues = new ArrayList(); } @Override public String getName() { return Strings.get("revertDefaultsAction"); } @Override public void doIt(Project proj) { LogisimFile src = ProjectActions.createNewFile(proj); LogisimFile dst = proj.getLogisimFile(); copyToolAttributes(src, dst); for (Library srcLib : src.getLibraries()) { Library dstLib = dst.getLibrary(srcLib.getName()); if (dstLib == null) { String desc = src.getLoader().getDescriptor(srcLib); dstLib = dst.getLoader().loadLibrary(desc); proj.getLogisimFile().addLibrary(dstLib); if (libraries == null) libraries = new ArrayList(); libraries.add(dstLib); } copyToolAttributes(srcLib, dstLib); } Options newOpts = proj.getOptions(); oldOpts = new Options(); oldOpts.copyFrom(newOpts, dst); newOpts.copyFrom(src.getOptions(), dst); } private void copyToolAttributes(Library srcLib, Library dstLib) { for (Tool srcTool : srcLib.getTools()) { AttributeSet srcAttrs = srcTool.getAttributeSet(); Tool dstTool = dstLib.getTool(srcTool.getName()); if (srcAttrs != null && dstTool != null) { AttributeSet dstAttrs = dstTool.getAttributeSet(); for (Attribute attrBase : srcAttrs.getAttributes()) { @SuppressWarnings("unchecked") Attribute attr = (Attribute) attrBase; Object srcValue = srcAttrs.getValue(attr); Object dstValue = dstAttrs.getValue(attr); if (!dstValue.equals(srcValue)) { dstAttrs.setValue(attr, srcValue); attrValues.add(new RevertAttributeValue(dstAttrs, attr, dstValue)); } } } } } @Override public void undo(Project proj) { proj.getOptions().copyFrom(oldOpts, proj.getLogisimFile()); for (RevertAttributeValue attrValue : attrValues) { attrValue.attrs.setValue(attrValue.attr, attrValue.value); } if (libraries != null) { for (Library lib : libraries) { proj.getLogisimFile().removeLibrary(lib); } } } } } logisim-2.7.1/src/com/cburch/logisim/file/LogisimFile.java0000644000175000017500000002613011540557316023336 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.file; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileReader; import java.io.InputStream; import java.io.OutputStream; import java.io.PipedInputStream; import java.io.PipedOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import org.xml.sax.SAXException; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.SubcircuitFactory; import com.cburch.logisim.comp.Component; import com.cburch.logisim.comp.ComponentFactory; import com.cburch.logisim.proj.Projects; import com.cburch.logisim.tools.AddTool; import com.cburch.logisim.tools.Library; import com.cburch.logisim.tools.Tool; import com.cburch.logisim.util.EventSourceWeakSupport; import com.cburch.logisim.util.ListUtil; import com.cburch.logisim.util.StringUtil; public class LogisimFile extends Library implements LibraryEventSource { private static class WritingThread extends Thread { OutputStream out; LogisimFile file; WritingThread(OutputStream out, LogisimFile file) { this.out = out; this.file = file; } @Override public void run() { try { file.write(out, file.loader); } catch (IOException e) { file.loader.showError(StringUtil.format( Strings.get("fileDuplicateError"), e.toString())); } try { out.close(); } catch (IOException e) { file.loader.showError(StringUtil.format( Strings.get("fileDuplicateError"), e.toString())); } } } private EventSourceWeakSupport listeners = new EventSourceWeakSupport(); private Loader loader; private LinkedList messages = new LinkedList(); private Options options = new Options(); private LinkedList tools = new LinkedList(); private LinkedList libraries = new LinkedList(); private Circuit main = null; private String name; private boolean dirty = false; LogisimFile(Loader loader) { this.loader = loader; name = Strings.get("defaultProjectName"); if (Projects.windowNamed(name)) { for (int i = 2; true; i++) { if (!Projects.windowNamed(name + " " + i)) { name += " " + i; break; } } } } // // access methods // @Override public String getName() { return name; } @Override public boolean isDirty() { return dirty; } public String getMessage() { if (messages.size() == 0) return null; return messages.removeFirst(); } public Loader getLoader() { return loader; } public Options getOptions() { return options; } @Override public List getTools() { return tools; } @Override public List getLibraries() { return libraries; } @Override public List getElements() { return ListUtil.joinImmutableLists(tools, libraries); } public Circuit getCircuit(String name) { if (name == null) return null; for (AddTool tool : tools) { SubcircuitFactory factory = (SubcircuitFactory) tool.getFactory(); if (name.equals(factory.getName())) return factory.getSubcircuit(); } return null; } public boolean contains(Circuit circ) { for (AddTool tool : tools) { SubcircuitFactory factory = (SubcircuitFactory) tool.getFactory(); if (factory.getSubcircuit() == circ) return true; } return false; } public List getCircuits() { List ret = new ArrayList(tools.size()); for (AddTool tool : tools) { SubcircuitFactory factory = (SubcircuitFactory) tool.getFactory(); ret.add(factory.getSubcircuit()); } return ret; } public AddTool getAddTool(Circuit circ) { for (AddTool tool : tools) { SubcircuitFactory factory = (SubcircuitFactory) tool.getFactory(); if (factory.getSubcircuit() == circ) { return tool; } } return null; } public Circuit getMainCircuit() { return main; } public int getCircuitCount() { return tools.size(); } // // listener methods // public void addLibraryListener(LibraryListener what) { listeners.add(what); } public void removeLibraryListener(LibraryListener what) { listeners.remove(what); } private void fireEvent(int action, Object data) { LibraryEvent e = new LibraryEvent(this, action, data); for (LibraryListener l : listeners) { l.libraryChanged(e); } } // // modification actions // public void addMessage(String msg) { messages.addLast(msg); } public void setDirty(boolean value) { if (dirty != value) { dirty = value; fireEvent(LibraryEvent.DIRTY_STATE, value ? Boolean.TRUE : Boolean.FALSE); } } public void setName(String name) { this.name = name; fireEvent(LibraryEvent.SET_NAME, name); } public void addCircuit(Circuit circuit) { addCircuit(circuit, tools.size()); } public void addCircuit(Circuit circuit, int index) { AddTool tool = new AddTool(circuit.getSubcircuitFactory()); tools.add(index, tool); if (tools.size() == 1) setMainCircuit(circuit); fireEvent(LibraryEvent.ADD_TOOL, tool); } public void removeCircuit(Circuit circuit) { if (tools.size() <= 1) { throw new RuntimeException("Cannot remove last circuit"); } int index = getCircuits().indexOf(circuit); if (index >= 0) { Tool circuitTool = tools.remove(index); if (main == circuit) { AddTool dflt_tool = tools.get(0); SubcircuitFactory factory = (SubcircuitFactory) dflt_tool.getFactory(); setMainCircuit(factory.getSubcircuit()); } fireEvent(LibraryEvent.REMOVE_TOOL, circuitTool); } } public void moveCircuit(AddTool tool, int index) { int oldIndex = tools.indexOf(tool); if (oldIndex < 0) { tools.add(index, tool); fireEvent(LibraryEvent.ADD_TOOL, tool); } else { AddTool value = tools.remove(oldIndex); tools.add(index, value); fireEvent(LibraryEvent.MOVE_TOOL, tool); } } public void addLibrary(Library lib) { libraries.add(lib); fireEvent(LibraryEvent.ADD_LIBRARY, lib); } public void removeLibrary(Library lib) { libraries.remove(lib); fireEvent(LibraryEvent.REMOVE_LIBRARY, lib); } public String getUnloadLibraryMessage(Library lib) { HashSet factories = new HashSet(); for (Tool tool : lib.getTools()) { if (tool instanceof AddTool) { factories.add(((AddTool) tool).getFactory()); } } for (Circuit circuit : getCircuits()) { for (Component comp : circuit.getNonWires()) { if (factories.contains(comp.getFactory())) { return StringUtil.format(Strings.get("unloadUsedError"), circuit.getName()); } } } ToolbarData tb = options.getToolbarData(); MouseMappings mm = options.getMouseMappings(); for (Tool t : lib.getTools()) { if (tb.usesToolFromSource(t)) { return Strings.get("unloadToolbarError"); } if (mm.usesToolFromSource(t)) { return Strings.get("unloadMappingError"); } } return null; } public void setMainCircuit(Circuit circuit) { if (circuit == null) return; this.main = circuit; fireEvent(LibraryEvent.SET_MAIN, circuit); } // // other methods // void write(OutputStream out, LibraryLoader loader) throws IOException { try { XmlWriter.write(this, out, loader); } catch (TransformerConfigurationException e) { loader.showError("internal error configuring transformer"); } catch (ParserConfigurationException e) { loader.showError("internal error configuring parser"); } catch (TransformerException e) { String msg = e.getMessage(); String err = Strings.get("xmlConversionError"); if (msg == null) err += ": " + msg; loader.showError(err); } } public LogisimFile cloneLogisimFile(Loader newloader) { PipedInputStream reader = new PipedInputStream(); PipedOutputStream writer = new PipedOutputStream(); try { reader.connect(writer); } catch (IOException e) { newloader.showError(StringUtil.format( Strings.get("fileDuplicateError"), e.toString())); return null; } new WritingThread(writer, this).start(); try { return LogisimFile.load(reader, newloader); } catch (IOException e) { newloader.showError(StringUtil.format( Strings.get("fileDuplicateError"), e.toString())); return null; } } Tool findTool(Tool query) { for (Library lib : getLibraries()) { Tool ret = findTool(lib, query); if (ret != null) return ret; } return null; } private Tool findTool(Library lib, Tool query) { for (Tool tool : lib.getTools()) { if (tool.equals(query)) return tool; } return null; } // // creation methods // public static LogisimFile createNew(Loader loader) { LogisimFile ret = new LogisimFile(loader); ret.main = new Circuit("main"); // The name will be changed in LogisimPreferences ret.tools.add(new AddTool(ret.main.getSubcircuitFactory())); return ret; } public static LogisimFile load(File file, Loader loader) throws IOException { InputStream in = new FileInputStream(file); SAXException firstExcept = null; try { return loadSub(in, loader); } catch (SAXException e) { firstExcept = e; } finally { in.close(); } if (firstExcept != null) { // We'll now try to do it using a reader. This is to work around // Logisim versions prior to 2.5.1, when files were not saved using // UTF-8 as the encoding (though the XML file reported otherwise). try { in = new ReaderInputStream(new FileReader(file), "UTF8"); return loadSub(in, loader); } catch (Throwable t) { loader.showError(StringUtil.format( Strings.get("xmlFormatError"), firstExcept.toString())); } finally { try { in.close(); } catch (Throwable t) { } } } return null; } public static LogisimFile load(InputStream in, Loader loader) throws IOException { try { return loadSub(in, loader); } catch (SAXException e) { loader.showError(StringUtil.format( Strings.get("xmlFormatError"), e.toString())); return null; } } public static LogisimFile loadSub(InputStream in, Loader loader) throws IOException, SAXException { // fetch first line and then reset BufferedInputStream inBuffered = new BufferedInputStream(in); String firstLine = getFirstLine(inBuffered); if (firstLine == null) { throw new IOException("File is empty"); } else if (firstLine.equals("Logisim v1.0")) { // if this is a 1.0 file, then set up a pipe to translate to // 2.0 and then interpret as a 2.0 file throw new IOException("Version 1.0 files no longer supported"); } XmlReader xmlReader = new XmlReader(loader); LogisimFile ret = xmlReader.readLibrary(inBuffered); ret.loader = loader; return ret; } private static String getFirstLine(BufferedInputStream in) throws IOException { byte[] first = new byte[512]; in.mark(first.length - 1); in.read(first); in.reset(); int lineBreak = first.length; for (int i = 0; i < lineBreak; i++) { if (first[i] == '\n') { lineBreak = i; } } return new String(first, 0, lineBreak, "UTF-8"); } } logisim-2.7.1/src/com/cburch/logisim/file/LoadFailedException.java0000644000175000017500000000072011541271676024776 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.file; public class LoadFailedException extends Exception { private boolean shown; LoadFailedException(String desc) { this(desc, false); } LoadFailedException(String desc, boolean shown) { super(desc); this.shown = shown; } public boolean isShown() { return shown; } }logisim-2.7.1/src/com/cburch/logisim/file/LoaderException.java0000644000175000017500000000071311541271676024222 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.file; public class LoaderException extends RuntimeException { private boolean shown; LoaderException(String desc) { this(desc, false); } LoaderException(String desc, boolean shown) { super(desc); this.shown = shown; } public boolean isShown() { return shown; } }logisim-2.7.1/src/com/cburch/logisim/file/Loader.java0000644000175000017500000003022311541271676022342 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.file; import java.awt.Component; import java.awt.Dimension; import java.io.FileOutputStream; import java.io.InputStream; import java.io.File; import java.io.IOException; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Stack; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.filechooser.FileFilter; import com.cburch.logisim.std.Builtin; import com.cburch.logisim.tools.Library; import com.cburch.logisim.util.JFileChoosers; import com.cburch.logisim.util.MacCompatibility; import com.cburch.logisim.util.StringUtil; import com.cburch.logisim.util.ZipClassLoader; public class Loader implements LibraryLoader { public static final String LOGISIM_EXTENSION = ".circ"; public static final FileFilter LOGISIM_FILTER = new LogisimFileFilter(); public static final FileFilter JAR_FILTER = new JarFileFilter(); private static class LogisimFileFilter extends FileFilter { @Override public boolean accept(File f) { return f.isDirectory() || f.getName().endsWith(LOGISIM_EXTENSION); } @Override public String getDescription() { return Strings.get("logisimFileFilter"); } } private static class JarFileFilter extends FileFilter { @Override public boolean accept(File f) { return f.isDirectory() || f.getName().endsWith(".jar"); } @Override public String getDescription() { return Strings.get("jarFileFilter"); } } // fixed private Component parent; private Builtin builtin = new Builtin(); // to be cleared with each new file private File mainFile = null; private Stack filesOpening = new Stack(); private Map substitutions = new HashMap(); public Loader(Component parent) { this.parent = parent; clear(); } public Builtin getBuiltin() { return builtin; } public void setParent(Component value) { parent = value; } private File getSubstitution(File source) { File ret = substitutions.get(source); return ret == null ? source : ret; } // // file chooser related methods // public File getMainFile() { return mainFile; } public JFileChooser createChooser() { return JFileChoosers.createAt(getCurrentDirectory()); } // used here and in LibraryManager only File getCurrentDirectory() { File ref; if (!filesOpening.empty()) { ref = filesOpening.peek(); } else { ref = mainFile; } return ref == null ? null : ref.getParentFile(); } private void setMainFile(File value) { mainFile = value; } // // more substantive methods accessed from outside this package // public void clear() { filesOpening.clear(); mainFile = null; } public LogisimFile openLogisimFile(File file, Map substitutions) throws LoadFailedException { this.substitutions = substitutions; try { return openLogisimFile(file); } finally { this.substitutions = Collections.emptyMap(); } } public LogisimFile openLogisimFile(File file) throws LoadFailedException { try { LogisimFile ret = loadLogisimFile(file); if (ret != null) setMainFile(file); showMessages(ret); return ret; } catch (LoaderException e) { throw new LoadFailedException(e.getMessage(), e.isShown()); } } public LogisimFile openLogisimFile(InputStream reader) throws LoadFailedException, IOException { LogisimFile ret = null; try { ret = LogisimFile.load(reader, this); } catch (LoaderException e) { return null; } showMessages(ret); return ret; } public Library loadLogisimLibrary(File file) { File actual = getSubstitution(file); LoadedLibrary ret = LibraryManager.instance.loadLogisimLibrary(this, actual); if (ret != null) { LogisimFile retBase = (LogisimFile) ret.getBase(); showMessages(retBase); } return ret; } public Library loadJarLibrary(File file, String className) { File actual = getSubstitution(file); return LibraryManager.instance.loadJarLibrary(this, actual, className); } public void reload(LoadedLibrary lib) { LibraryManager.instance.reload(this, lib); } public boolean save(LogisimFile file, File dest) { Library reference = LibraryManager.instance.findReference(file, dest); if (reference != null) { JOptionPane.showMessageDialog(parent, StringUtil.format(Strings.get("fileCircularError"), reference.getDisplayName()), Strings.get("fileSaveErrorTitle"), JOptionPane.ERROR_MESSAGE); return false; } File backup = determineBackupName(dest); boolean backupCreated = backup != null && dest.renameTo(backup); FileOutputStream fwrite = null; try { try { MacCompatibility.setFileCreatorAndType(dest, "LGSM", "circ"); } catch (IOException e) { } fwrite = new FileOutputStream(dest); file.write(fwrite, this); file.setName(toProjectName(dest)); File oldFile = getMainFile(); setMainFile(dest); LibraryManager.instance.fileSaved(this, dest, oldFile, file); } catch (IOException e) { if (backupCreated) recoverBackup(backup, dest); if (dest.exists() && dest.length() == 0) dest.delete(); JOptionPane.showMessageDialog(parent, StringUtil.format(Strings.get("fileSaveError"), e.toString()), Strings.get("fileSaveErrorTitle"), JOptionPane.ERROR_MESSAGE); return false; } finally { if (fwrite != null) { try { fwrite.close(); } catch (IOException e) { if (backupCreated) recoverBackup(backup, dest); if (dest.exists() && dest.length() == 0) dest.delete(); JOptionPane.showMessageDialog(parent, StringUtil.format(Strings.get("fileSaveCloseError"), e.toString()), Strings.get("fileSaveErrorTitle"), JOptionPane.ERROR_MESSAGE); return false; } } } if (!dest.exists() || dest.length() == 0) { if (backupCreated && backup != null && backup.exists()) { recoverBackup(backup, dest); } else { dest.delete(); } JOptionPane.showMessageDialog(parent, Strings.get("fileSaveZeroError"), Strings.get("fileSaveErrorTitle"), JOptionPane.ERROR_MESSAGE); return false; } if (backupCreated && backup.exists()) { backup.delete(); } return true; } private static File determineBackupName(File base) { File dir = base.getParentFile(); String name = base.getName(); if (name.endsWith(LOGISIM_EXTENSION)) { name = name.substring(0, name.length() - LOGISIM_EXTENSION.length()); } for (int i = 1; i <= 20; i++) { String ext = i == 1 ? ".bak" : (".bak" + i); File candidate = new File(dir, name + ext); if (!candidate.exists()) return candidate; } return null; } private static void recoverBackup(File backup, File dest) { if (backup != null && backup.exists()) { if (dest.exists()) dest.delete(); backup.renameTo(dest); } } // // methods for LibraryManager // LogisimFile loadLogisimFile(File request) throws LoadFailedException { File actual = getSubstitution(request); for (File fileOpening : filesOpening) { if (fileOpening.equals(actual)) { throw new LoadFailedException(StringUtil.format(Strings.get("logisimCircularError"), toProjectName(actual))); } } LogisimFile ret = null; filesOpening.push(actual); try { ret = LogisimFile.load(actual, this); } catch (IOException e) { throw new LoadFailedException(StringUtil.format(Strings.get("logisimLoadError"), toProjectName(actual), e.toString())); } finally { filesOpening.pop(); } ret.setName(toProjectName(actual)); return ret; } Library loadJarFile(File request, String className) throws LoadFailedException { File actual = getSubstitution(request); // Up until 2.1.8, this was written to use a URLClassLoader, which // worked pretty well, except that the class never releases its file // handles. For this reason, with 2.2.0, it's been switched to use // a custom-written class ZipClassLoader instead. The ZipClassLoader // is based on something downloaded off a forum, and I'm not as sure // that it works as well. It certainly does more file accesses. // Anyway, here's the line for this new version: ZipClassLoader loader = new ZipClassLoader(actual); // And here's the code that was present up until 2.1.8, and which I // know to work well except for the closing-files bit. If necessary, we // can revert by deleting the above declaration and reinstating the below. /* URL url; try { url = new URL("file", "localhost", file.getCanonicalPath()); } catch (MalformedURLException e1) { throw new LoadFailedException("Internal error: Malformed URL"); } catch (IOException e1) { throw new LoadFailedException(Strings.get("jarNotOpenedError")); } URLClassLoader loader = new URLClassLoader(new URL[] { url }); */ // load library class from loader Class retClass; try { retClass = loader.loadClass(className); } catch (ClassNotFoundException e) { throw new LoadFailedException(StringUtil.format(Strings.get("jarClassNotFoundError"), className)); } if (!(Library.class.isAssignableFrom(retClass))) { throw new LoadFailedException(StringUtil.format(Strings.get("jarClassNotLibraryError"), className)); } // instantiate library Library ret; try { ret = (Library) retClass.newInstance(); } catch (Exception e) { throw new LoadFailedException(StringUtil.format(Strings.get("jarLibraryNotCreatedError"), className)); } return ret; } // // Library methods // public Library loadLibrary(String desc) { return LibraryManager.instance.loadLibrary(this, desc); } public String getDescriptor(Library lib) { return LibraryManager.instance.getDescriptor(this, lib); } public void showError(String description) { if (!filesOpening.empty()) { File top = filesOpening.peek(); String init = toProjectName(top) + ":"; if (description.contains("\n")) { description = init + "\n" + description; } else { description = init + " " + description; } } if (description.contains("\n") || description.length() > 60) { int lines = 1; for (int pos = description.indexOf('\n'); pos >= 0; pos = description.indexOf('\n', pos + 1)) { lines++; } lines = Math.max(4, Math.min(lines, 7)); JTextArea textArea = new JTextArea(lines, 60); textArea.setEditable(false); textArea.setText(description); textArea.setCaretPosition(0); JScrollPane scrollPane = new JScrollPane(textArea); scrollPane.setPreferredSize(new Dimension(350, 150)); JOptionPane.showMessageDialog(parent, scrollPane, Strings.get("fileErrorTitle"), JOptionPane.ERROR_MESSAGE); } else { JOptionPane.showMessageDialog(parent, description, Strings.get("fileErrorTitle"), JOptionPane.ERROR_MESSAGE); } } private void showMessages(LogisimFile source) { if (source == null) return; String message = source.getMessage(); while (message != null) { JOptionPane.showMessageDialog(parent, message, Strings.get("fileMessageTitle"), JOptionPane.INFORMATION_MESSAGE); message = source.getMessage(); } } // // helper methods // File getFileFor(String name, FileFilter filter) { // Determine the actual file name. File file = new File(name); if (!file.isAbsolute()) { File currentDirectory = getCurrentDirectory(); if (currentDirectory != null) file = new File(currentDirectory, name); } while (!file.canRead()) { // It doesn't exist. Figure it out from the user. JOptionPane.showMessageDialog(parent, StringUtil.format(Strings.get("fileLibraryMissingError"), file.getName())); JFileChooser chooser = createChooser(); chooser.setFileFilter(filter); chooser.setDialogTitle(StringUtil.format(Strings.get("fileLibraryMissingTitle"), file.getName())); int action = chooser.showDialog(parent, Strings.get("fileLibraryMissingButton")); if (action != JFileChooser.APPROVE_OPTION) { throw new LoaderException(Strings.get("fileLoadCanceledError")); } file = chooser.getSelectedFile(); } return file; } private String toProjectName(File file) { String ret = file.getName(); if (ret.endsWith(LOGISIM_EXTENSION)) { return ret.substring(0, ret.length() - LOGISIM_EXTENSION.length()); } else { return ret; } } } logisim-2.7.1/src/com/cburch/logisim/file/LoadedLibrary.java0000644000175000017500000001605111446034512023642 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.file; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.CircuitMutation; import com.cburch.logisim.circuit.SubcircuitFactory; import com.cburch.logisim.comp.Component; import com.cburch.logisim.comp.ComponentFactory; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.proj.Project; import com.cburch.logisim.proj.Projects; import com.cburch.logisim.tools.AddTool; import com.cburch.logisim.tools.Library; import com.cburch.logisim.tools.Tool; import com.cburch.logisim.util.EventSourceWeakSupport; public class LoadedLibrary extends Library implements LibraryEventSource { private class MyListener implements LibraryListener { public void libraryChanged(LibraryEvent event) { fireLibraryEvent(event); } } private Library base; private boolean dirty; private MyListener myListener; private EventSourceWeakSupport listeners; LoadedLibrary(Library base) { dirty = false; myListener = new MyListener(); listeners = new EventSourceWeakSupport(); while (base instanceof LoadedLibrary) base = ((LoadedLibrary) base).base; this.base = base; if (base instanceof LibraryEventSource) { ((LibraryEventSource) base).addLibraryListener(myListener); } } public void addLibraryListener(LibraryListener l) { listeners.add(l); } public void removeLibraryListener(LibraryListener l) { listeners.remove(l); } @Override public String getName() { return base.getName(); } @Override public String getDisplayName() { return base.getDisplayName(); } @Override public boolean isDirty() { return dirty || base.isDirty(); } @Override public List getTools() { return base.getTools(); } @Override public List getLibraries() { return base.getLibraries(); } void setDirty(boolean value) { if (dirty != value) { dirty = value; fireLibraryEvent(LibraryEvent.DIRTY_STATE, isDirty() ? Boolean.TRUE : Boolean.FALSE); } } Library getBase() { return base; } void setBase(Library value) { if (base instanceof LibraryEventSource) { ((LibraryEventSource) base).removeLibraryListener(myListener); } Library old = base; base = value; resolveChanges(old); if (base instanceof LibraryEventSource) { ((LibraryEventSource) base).addLibraryListener(myListener); } } private void fireLibraryEvent(int action, Object data) { fireLibraryEvent(new LibraryEvent(this, action, data)); } private void fireLibraryEvent(LibraryEvent event) { if (event.getSource() != this) { event = new LibraryEvent(this, event.getAction(), event.getData()); } for (LibraryListener l : listeners) { l.libraryChanged(event); } } private void resolveChanges(Library old) { if (listeners.isEmpty()) return; if (!base.getDisplayName().equals(old.getDisplayName())) { fireLibraryEvent(LibraryEvent.SET_NAME, base.getDisplayName()); } HashSet changes = new HashSet(old.getLibraries()); changes.removeAll(base.getLibraries()); for (Library lib : changes) { fireLibraryEvent(LibraryEvent.REMOVE_LIBRARY, lib); } changes.clear(); changes.addAll(base.getLibraries()); changes.removeAll(old.getLibraries()); for (Library lib : changes) { fireLibraryEvent(LibraryEvent.ADD_LIBRARY, lib); } HashMap componentMap; HashMap toolMap; componentMap = new HashMap(); toolMap = new HashMap(); for (Tool oldTool : old.getTools()) { Tool newTool = base.getTool(oldTool.getName()); toolMap.put(oldTool, newTool); if (oldTool instanceof AddTool) { ComponentFactory oldFactory = ((AddTool) oldTool).getFactory(); if (newTool != null && newTool instanceof AddTool) { ComponentFactory newFactory = ((AddTool) newTool).getFactory(); componentMap.put(oldFactory, newFactory); } else { componentMap.put(oldFactory, null); } } } replaceAll(componentMap, toolMap); HashSet toolChanges = new HashSet(old.getTools()); toolChanges.removeAll(toolMap.keySet()); for (Tool tool : toolChanges) { fireLibraryEvent(LibraryEvent.REMOVE_TOOL, tool); } toolChanges = new HashSet(base.getTools()); toolChanges.removeAll(toolMap.values()); for (Tool tool : toolChanges) { fireLibraryEvent(LibraryEvent.ADD_TOOL, tool); } } private static void replaceAll(Map compMap, Map toolMap) { for (Project proj : Projects.getOpenProjects()) { Tool oldTool = proj.getTool(); Circuit oldCircuit = proj.getCurrentCircuit(); if (toolMap.containsKey(oldTool)) { proj.setTool(toolMap.get(oldTool)); } SubcircuitFactory oldFactory = oldCircuit.getSubcircuitFactory(); if (compMap.containsKey(oldFactory)) { SubcircuitFactory newFactory; newFactory = (SubcircuitFactory) compMap.get(oldFactory); proj.setCurrentCircuit(newFactory.getSubcircuit()); } replaceAll(proj.getLogisimFile(), compMap, toolMap); } for (LogisimFile file : LibraryManager.instance.getLogisimLibraries()) { replaceAll(file, compMap, toolMap); } } private static void replaceAll(LogisimFile file, Map compMap, Map toolMap) { file.getOptions().getToolbarData().replaceAll(toolMap); file.getOptions().getMouseMappings().replaceAll(toolMap); for (Circuit circuit : file.getCircuits()) { replaceAll(circuit, compMap); } } private static void replaceAll(Circuit circuit, Map compMap) { ArrayList toReplace = null; for (Component comp : circuit.getNonWires()) { if (compMap.containsKey(comp.getFactory())) { if (toReplace == null) toReplace = new ArrayList(); toReplace.add(comp); } } if (toReplace != null) { CircuitMutation xn = new CircuitMutation(circuit); for (Component comp : toReplace) { xn.remove(comp); ComponentFactory factory = compMap.get(comp.getFactory()); if (factory != null) { AttributeSet newAttrs = createAttributes(factory, comp.getAttributeSet()); xn.add(factory.createComponent(comp.getLocation(), newAttrs)); } } xn.execute(); } } private static AttributeSet createAttributes(ComponentFactory factory, AttributeSet src) { AttributeSet dest = factory.createAttributeSet(); copyAttributes(dest, src); return dest; } static void copyAttributes(AttributeSet dest, AttributeSet src) { for (Attribute destAttr : dest.getAttributes()) { Attribute srcAttr = src.getAttribute(destAttr.getName()); if (srcAttr != null) { @SuppressWarnings("unchecked") Attribute destAttr2 = (Attribute) destAttr; dest.setValue(destAttr2, src.getValue(srcAttr)); } } } } logisim-2.7.1/src/com/cburch/logisim/file/LibraryManager.java0000644000175000017500000002012111446034512024015 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.file; import java.io.File; import java.io.IOException; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.WeakHashMap; import com.cburch.logisim.tools.Library; import com.cburch.logisim.util.StringUtil; class LibraryManager { public static final LibraryManager instance = new LibraryManager(); private static char desc_sep = '#'; private static abstract class LibraryDescriptor { abstract boolean concernsFile(File query); abstract String toDescriptor(Loader loader); abstract void setBase(Loader loader, LoadedLibrary lib) throws LoadFailedException; } private static class LogisimProjectDescriptor extends LibraryDescriptor { private File file; LogisimProjectDescriptor(File file) { this.file = file; } @Override boolean concernsFile(File query) { return file.equals(query); } @Override String toDescriptor(Loader loader) { return "file#" + toRelative(loader, file); } @Override void setBase(Loader loader, LoadedLibrary lib) throws LoadFailedException { lib.setBase(loader.loadLogisimFile(file)); } @Override public boolean equals(Object other) { if (!(other instanceof LogisimProjectDescriptor)) return false; LogisimProjectDescriptor o = (LogisimProjectDescriptor) other; return this.file.equals(o.file); } @Override public int hashCode() { return file.hashCode(); } } private static class JarDescriptor extends LibraryDescriptor { private File file; private String className; JarDescriptor(File file, String className) { this.file = file; this.className = className; } @Override boolean concernsFile(File query) { return file.equals(query); } @Override String toDescriptor(Loader loader) { return "jar#" + toRelative(loader, file) + desc_sep + className; } @Override void setBase(Loader loader, LoadedLibrary lib) throws LoadFailedException { lib.setBase(loader.loadJarFile(file, className)); } @Override public boolean equals(Object other) { if (!(other instanceof JarDescriptor)) return false; JarDescriptor o = (JarDescriptor) other; return this.file.equals(o.file) && this.className.equals(o.className); } @Override public int hashCode() { return file.hashCode() * 31 + className.hashCode(); } } private HashMap> fileMap; private WeakHashMap invMap; private LibraryManager() { fileMap = new HashMap>(); invMap = new WeakHashMap(); ProjectsDirty.initialize(); } void setDirty(File file, boolean dirty) { LoadedLibrary lib = findKnown(file); if (lib != null) { lib.setDirty(dirty); } } Collection getLogisimLibraries() { ArrayList ret = new ArrayList(); for (LoadedLibrary lib : invMap.keySet()) { if (lib.getBase() instanceof LogisimFile) { ret.add((LogisimFile) lib.getBase()); } } return ret; } public Library loadLibrary(Loader loader, String desc) { // It may already be loaded. // Otherwise we'll have to decode it. int sep = desc.indexOf(desc_sep); if (sep < 0) { loader.showError(StringUtil.format(Strings.get("fileDescriptorError"), desc)); return null; } String type = desc.substring(0, sep); String name = desc.substring(sep + 1); if (type.equals("")) { Library ret = loader.getBuiltin().getLibrary(name); if (ret == null) { loader.showError(StringUtil.format(Strings.get("fileBuiltinMissingError"), name)); return null; } return ret; } else if (type.equals("file")) { File toRead = loader.getFileFor(name, Loader.LOGISIM_FILTER); return loadLogisimLibrary(loader, toRead); } else if (type.equals("jar")) { int sepLoc = name.lastIndexOf(desc_sep); String fileName = name.substring(0, sepLoc); String className = name.substring(sepLoc + 1); File toRead = loader.getFileFor(fileName, Loader.JAR_FILTER); return loadJarLibrary(loader, toRead, className); } else { loader.showError(StringUtil.format(Strings.get("fileTypeError"), type, desc)); return null; } } public LoadedLibrary loadLogisimLibrary(Loader loader, File toRead) { LoadedLibrary ret = findKnown(toRead); if (ret != null) return ret; try { ret = new LoadedLibrary(loader.loadLogisimFile(toRead)); } catch (LoadFailedException e) { loader.showError(e.getMessage()); return null; } LogisimProjectDescriptor desc = new LogisimProjectDescriptor(toRead); fileMap.put(desc, new WeakReference(ret)); invMap.put(ret, desc); return ret; } public LoadedLibrary loadJarLibrary(Loader loader, File toRead, String className) { JarDescriptor jarDescriptor = new JarDescriptor(toRead, className); LoadedLibrary ret = findKnown(jarDescriptor); if (ret != null) return ret; try { ret = new LoadedLibrary(loader.loadJarFile(toRead, className)); } catch (LoadFailedException e) { loader.showError(e.getMessage()); return null; } fileMap.put(jarDescriptor, new WeakReference(ret)); invMap.put(ret, jarDescriptor); return ret; } public void reload(Loader loader, LoadedLibrary lib) { LibraryDescriptor descriptor = invMap.get(lib); if (descriptor == null) { loader.showError(StringUtil.format(Strings.get("unknownLibraryFileError"), lib.getDisplayName())); } else { try { descriptor.setBase(loader, lib); } catch (LoadFailedException e) { loader.showError(e.getMessage()); } } } public Library findReference(LogisimFile file, File query) { for (Library lib : file.getLibraries()) { LibraryDescriptor desc = invMap.get(lib); if (desc != null && desc.concernsFile(query)) { return lib; } if (lib instanceof LoadedLibrary) { LoadedLibrary loadedLib = (LoadedLibrary) lib; if (loadedLib.getBase() instanceof LogisimFile) { LogisimFile loadedProj = (LogisimFile) loadedLib.getBase(); Library ret = findReference(loadedProj, query); if (ret != null) return lib; } } } return null; } public void fileSaved(Loader loader, File dest, File oldFile, LogisimFile file) { LoadedLibrary old = findKnown(oldFile); if (old != null) { old.setDirty(false); } LoadedLibrary lib = findKnown(dest); if (lib != null) { LogisimFile clone = file.cloneLogisimFile(loader); clone.setName(file.getName()); clone.setDirty(false); lib.setBase(clone); } } public String getDescriptor(Loader loader, Library lib) { if (loader.getBuiltin().getLibraries().contains(lib)) { return desc_sep + lib.getName(); } else { LibraryDescriptor desc = invMap.get(lib); if (desc != null) { return desc.toDescriptor(loader); } else { throw new LoaderException(StringUtil.format( Strings.get("fileDescriptorUnknownError"), lib.getDisplayName())); } } } private LoadedLibrary findKnown(Object key) { WeakReference retLibRef; retLibRef = fileMap.get(key); if (retLibRef == null) { return null; } else { LoadedLibrary retLib = retLibRef.get(); if (retLib == null) { fileMap.remove(key); return null; } else { return retLib; } } } private static String toRelative(Loader loader, File file) { File currentDirectory = loader.getCurrentDirectory(); if (currentDirectory == null) { try { return file.getCanonicalPath(); } catch (IOException e) { return file.toString(); } } File fileDir = file.getParentFile(); if (fileDir != null) { if (currentDirectory.equals(fileDir)) { return file.getName(); } else if (currentDirectory.equals(fileDir.getParentFile())) { return fileDir.getName() + "/" + file.getName(); } else if (fileDir.equals(currentDirectory.getParentFile())) { return "../" + file.getName(); } } try { return file.getCanonicalPath(); } catch (IOException e) { return file.toString(); } } }logisim-2.7.1/src/com/cburch/logisim/file/LibraryLoader.java0000644000175000017500000000057511446034512023664 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.file; import com.cburch.logisim.tools.Library; interface LibraryLoader { public Library loadLibrary(String desc); public String getDescriptor(Library lib); public void showError(String description); } logisim-2.7.1/src/com/cburch/logisim/file/LibraryListener.java0000644000175000017500000000041411446034512024233 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.file; public interface LibraryListener { public void libraryChanged(LibraryEvent event); } logisim-2.7.1/src/com/cburch/logisim/file/LibraryEventSource.java0000644000175000017500000000052711446034512024715 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.file; public interface LibraryEventSource { public void addLibraryListener(LibraryListener listener); public void removeLibraryListener(LibraryListener listener); } logisim-2.7.1/src/com/cburch/logisim/file/LibraryEvent.java0000644000175000017500000000163611446034512023536 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.file; import com.cburch.logisim.tools.Library; public class LibraryEvent { public final static int ADD_TOOL = 0; public final static int REMOVE_TOOL = 1; public final static int MOVE_TOOL = 2; public final static int ADD_LIBRARY = 3; public final static int REMOVE_LIBRARY = 4; public final static int SET_MAIN = 5; public final static int SET_NAME = 6; public static final int DIRTY_STATE = 7; private Library source; private int action; private Object data; LibraryEvent(Library source, int action, Object data) { this.source = source; this.action = action; this.data = data; } public Library getSource() { return source; } public int getAction() { return action; } public Object getData() { return data; } } logisim-2.7.1/src/com/cburch/logisim/file/FileStatistics.java0000644000175000017500000001337611451540066024070 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.file; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.SubcircuitFactory; import com.cburch.logisim.comp.Component; import com.cburch.logisim.comp.ComponentFactory; import com.cburch.logisim.tools.AddTool; import com.cburch.logisim.tools.Library; import com.cburch.logisim.tools.Tool; public class FileStatistics { public static class Count { private Library library; private ComponentFactory factory; private int simpleCount; private int uniqueCount; private int recursiveCount; private Count(ComponentFactory factory) { this.library = null; this.factory = factory; this.simpleCount = 0; this.uniqueCount = 0; this.recursiveCount = 0; } public Library getLibrary() { return library; } public ComponentFactory getFactory() { return factory; } public int getSimpleCount() { return simpleCount; } public int getUniqueCount() { return uniqueCount; } public int getRecursiveCount() { return recursiveCount; } } public static FileStatistics compute(LogisimFile file, Circuit circuit) { Set include = new HashSet(file.getCircuits()); Map> countMap; countMap = new HashMap>(); doRecursiveCount(circuit, include, countMap); doUniqueCounts(countMap.get(circuit), countMap); List countList = sortCounts(countMap.get(circuit), file); return new FileStatistics(countList, getTotal(countList, include), getTotal(countList, null)); } private static Map doRecursiveCount(Circuit circuit, Set include, Map> countMap) { if (countMap.containsKey(circuit)) { return countMap.get(circuit); } Map counts = doSimpleCount(circuit); countMap.put(circuit, counts); for (Count count : counts.values()) { count.uniqueCount = count.simpleCount; count.recursiveCount = count.simpleCount; } for (Circuit sub : include) { SubcircuitFactory subFactory = sub.getSubcircuitFactory(); if (counts.containsKey(subFactory)) { int multiplier = counts.get(subFactory).simpleCount; Map subCount; subCount = doRecursiveCount(sub, include, countMap); for (Count subcount : subCount.values()) { ComponentFactory subfactory = subcount.factory; Count supercount = counts.get(subfactory); if (supercount == null) { supercount = new Count(subfactory); counts.put(subfactory, supercount); } supercount.recursiveCount += multiplier * subcount.recursiveCount; } } } return counts; } private static Map doSimpleCount(Circuit circuit) { Map counts; counts = new HashMap(); for (Component comp : circuit.getNonWires()) { ComponentFactory factory = comp.getFactory(); Count count = counts.get(factory); if (count == null) { count = new Count(factory); counts.put(factory, count); } count.simpleCount++; } return counts; } private static void doUniqueCounts(Map counts, Map> circuitCounts) { for (Count count : counts.values()) { ComponentFactory factory = count.getFactory(); int unique = 0; for (Circuit circ : circuitCounts.keySet()) { Count subcount = circuitCounts.get(circ).get(factory); if (subcount != null) { unique += subcount.simpleCount; } } count.uniqueCount = unique; } } private static List sortCounts(Map counts, LogisimFile file) { List ret = new ArrayList(); for (AddTool tool : file.getTools()) { ComponentFactory factory = tool.getFactory(); Count count = counts.get(factory); if (count != null) { count.library = file; ret.add(count); } } for (Library lib : file.getLibraries()) { for (Tool tool : lib.getTools()) { if (tool instanceof AddTool) { ComponentFactory factory = ((AddTool) tool).getFactory(); Count count = counts.get(factory); if (count != null) { count.library = lib; ret.add(count); } } } } return ret; } private static Count getTotal(List counts, Set exclude) { Count ret = new Count(null); for (Count count : counts) { ComponentFactory factory = count.getFactory(); Circuit factoryCirc = null; if (factory instanceof SubcircuitFactory) { factoryCirc = ((SubcircuitFactory) factory).getSubcircuit(); } if (exclude == null || !exclude.contains(factoryCirc)) { ret.simpleCount += count.simpleCount; ret.uniqueCount += count.uniqueCount; ret.recursiveCount += count.recursiveCount; } } return ret; } private List counts; private Count totalWithout; private Count totalWith; private FileStatistics(List counts, Count totalWithout, Count totalWith) { this.counts = Collections.unmodifiableList(counts); this.totalWithout = totalWithout; this.totalWith = totalWith; } public List getCounts() { return counts; } public Count getTotalWithoutSubcircuits() { return totalWithout; } public Count getTotalWithSubcircuits() { return totalWith; } } logisim-2.7.1/src/com/cburch/logisim/data/0000755000175000017500000000000011527054436020260 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/logisim/data/Value.java0000644000175000017500000002757711520127134022206 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.data; import java.awt.Color; import java.util.Arrays; import com.cburch.logisim.util.Cache; public class Value { public static final Value FALSE = new Value(1, 0, 0, 0); public static final Value TRUE = new Value(1, 0, 0, 1); public static final Value UNKNOWN = new Value(1, 0, 1, 0); public static final Value ERROR = new Value(1, 1, 0, 0); public static final Value NIL = new Value(0, 0, 0, 0); public static final int MAX_WIDTH = 32; public static final Color NIL_COLOR = Color.GRAY; public static final Color FALSE_COLOR = new Color(0, 100, 0); public static final Color TRUE_COLOR = new Color(0, 210, 0); public static final Color UNKNOWN_COLOR = new Color(40, 40, 255); public static final Color ERROR_COLOR = new Color(192, 0, 0); public static final Color WIDTH_ERROR_COLOR = new Color(255, 123, 0); public static final Color MULTI_COLOR = Color.BLACK; private static final Cache cache = new Cache(); public static Value create(Value[] values) { if (values.length == 0) return NIL; if (values.length == 1) return values[0]; if (values.length > MAX_WIDTH) throw new RuntimeException( "Cannot have more than " + MAX_WIDTH + " bits in a value"); int width = values.length; int value = 0; int unknown = 0; int error = 0; for (int i = 0; i < values.length; i++) { int mask = 1 << i; if (values[i] == TRUE) value |= mask; else if (values[i] == FALSE) /* do nothing */; else if (values[i] == UNKNOWN) unknown |= mask; else if (values[i] == ERROR) error |= mask; else { throw new RuntimeException("unrecognized value " + values[i]); } } return Value.create(width, error, unknown, value); } public static Value createKnown(BitWidth bits, int value) { return Value.create(bits.getWidth(), 0, 0, value); } public static Value createUnknown(BitWidth bits) { return Value.create(bits.getWidth(), 0, -1, 0); } public static Value createError(BitWidth bits) { return Value.create(bits.getWidth(), -1, 0, 0); } private static Value create(int width, int error, int unknown, int value) { if (width == 0) { return Value.NIL; } else if (width == 1) { if ((error & 1) != 0) return Value.ERROR; else if ((unknown & 1) != 0) return Value.UNKNOWN; else if ((value & 1) != 0) return Value.TRUE; else return Value.FALSE; } else { int mask = (width == 32 ? -1 : ~(-1 << width)); error = error & mask; unknown = unknown & mask & ~error; value = value & mask & ~unknown & ~error; int hashCode = 31 * (31 * (31 * width + error) + unknown) + value; Object cached = cache.get(hashCode); if (cached != null) { Value val = (Value) cached; if (val.value == value && val.width == width && val.error == error && val.unknown == unknown) return val; } Value ret= new Value(width, error, unknown, value); cache.put(hashCode, ret); return ret; } } public static Value repeat(Value base, int bits) { if (base.getWidth() != 1) { throw new IllegalArgumentException("first parameter must be one bit"); } if (bits == 1) { return base; } else { Value[] ret = new Value[bits]; Arrays.fill(ret, base); return create(ret); } } private final int width; private final int error; private final int unknown; private final int value; private Value(int width, int error, int unknown, int value) { // To ensure that the one-bit values are unique, this should be called only // for the one-bit values and by the private create method this.width = width; this.error = error; this.unknown = unknown; this.value = value; } public boolean isErrorValue() { return error != 0; } public Value extendWidth(int newWidth, Value others) { if (width == newWidth) return this; int maskInverse = (width == 32 ? 0 : (-1 << width)); if (others == Value.ERROR) { return Value.create(newWidth, error | maskInverse, unknown, value); } else if (others == Value.FALSE) { return Value.create(newWidth, error, unknown, value); } else if (others == Value.TRUE) { return Value.create(newWidth, error, unknown, value | maskInverse); } else { return Value.create(newWidth, error, unknown | maskInverse, value); } } public boolean isUnknown() { if (width == 32) { return error == 0 && unknown == -1; } else { return error == 0 && unknown == ((1 << width) - 1); } } public boolean isFullyDefined() { return width > 0 && error == 0 && unknown == 0; } public Value set(int which, Value val) { if (val.width != 1) { throw new RuntimeException("Cannot set multiple values"); } else if (which < 0 || which >= width) { throw new RuntimeException("Attempt to set outside value's width"); } else if (width == 1) { return val; } else { int mask = ~(1 << which); return Value.create(this.width, (this.error & mask) | (val.error << which), (this.unknown & mask) | (val.unknown << which), (this.value & mask) | (val.value << which)); } } public Value[] getAll() { Value[] ret = new Value[width]; for (int i = 0; i < ret.length; i++) { ret[i] = get(i); } return ret; } public Value get(int which) { if (which < 0 || which >= width) return ERROR; int mask = 1 << which; if ((error & mask) != 0) return ERROR; else if ((unknown & mask) != 0) return UNKNOWN; else if ((value & mask) != 0) return TRUE; else return FALSE; } public BitWidth getBitWidth() { return BitWidth.create(width); } public int getWidth() { return width; } @Override public boolean equals(Object other_obj) { if (!(other_obj instanceof Value)) return false; Value other = (Value) other_obj; boolean ret = this.width == other.width && this.error == other.error && this.unknown == other.unknown && this.value == other.value; return ret; } @Override public int hashCode() { int ret = width; ret = 31 * ret + error; ret = 31 * ret + unknown; ret = 31 * ret + value; return ret; } public int toIntValue() { if (error != 0) return -1; if (unknown != 0) return -1; return value; } @Override public String toString() { switch (width) { case 0: return "-"; case 1: if (error != 0) return "E"; else if (unknown != 0) return "x"; else if (value != 0) return "1"; else return "0"; default: StringBuilder ret = new StringBuilder(); for (int i = width - 1; i >= 0; i--) { ret.append(get(i).toString()); if (i % 4 == 0 && i != 0) ret.append(" "); } return ret.toString(); } } public String toOctalString() { if (width <= 1) { return toString(); } else { Value[] vals = getAll(); char[] c = new char[(vals.length + 2) / 3]; for (int i = 0; i < c.length; i++) { int k = c.length - 1 - i; int frst = 3 * k; int last = Math.min(vals.length, 3 * (k + 1)); int v = 0; c[i] = '?'; for (int j = last - 1; j >= frst; j--) { if (vals[j] == Value.ERROR) { c[i] = 'E'; break; } if (vals[j] == Value.UNKNOWN) { c[i] = 'x'; break; } v = 2 * v; if (vals[j] == Value.TRUE) v++; } if (c[i] == '?') c[i] = Character.forDigit(v, 8); } return new String(c); } } public String toHexString() { if (width <= 1) { return toString(); } else { Value[] vals = getAll(); char[] c = new char[(vals.length + 3) / 4]; for (int i = 0; i < c.length; i++) { int k = c.length - 1 - i; int frst = 4 * k; int last = Math.min(vals.length, 4 * (k + 1)); int v = 0; c[i] = '?'; for (int j = last - 1; j >= frst; j--) { if (vals[j] == Value.ERROR) { c[i] = 'E'; break; } if (vals[j] == Value.UNKNOWN) { c[i] = 'x'; break; } v = 2 * v; if (vals[j] == Value.TRUE) v++; } if (c[i] == '?') c[i] = Character.forDigit(v, 16); } return new String(c); } } public String toDecimalString(boolean signed) { if (width == 0) return "-"; if (isErrorValue()) return Strings.get("valueError"); if (!isFullyDefined()) return Strings.get("valueUnknown"); int value = toIntValue(); if (signed) { if (width < 32 && (value >> (width - 1)) != 0) { value |= (-1) << width; } return "" + value; } else { return "" + ((long) value & 0xFFFFFFFFL); } } public String toDisplayString(int radix) { switch (radix) { case 2: return toDisplayString(); case 8: return toOctalString(); case 16: return toHexString(); default: if (width == 0) return "-"; if (isErrorValue()) return Strings.get("valueError"); if (!isFullyDefined()) return Strings.get("valueUnknown"); return Integer.toString(toIntValue(), radix); } } public String toDisplayString() { switch (width) { case 0: return "-"; case 1: if (error != 0) return Strings.get("valueErrorSymbol"); else if (unknown != 0) return Strings.get("valueUnknownSymbol"); else if (value != 0) return "1"; else return "0"; default: StringBuilder ret = new StringBuilder(); for (int i = width - 1; i >= 0; i--) { ret.append(get(i).toString()); if (i % 4 == 0 && i != 0) ret.append(" "); } return ret.toString(); } } public Value combine(Value other) { if (other == null) return this; if (this == NIL) return other; if (other == NIL) return this; if (this.width == 1 && other.width == 1) { if (this == other) return this; if (this == UNKNOWN) return other; if (other == UNKNOWN) return this; return ERROR; } else { int disagree = (this.value ^ other.value) & ~(this.unknown | other.unknown); return Value.create(Math.max(this.width, other.width), this.error | other.error | disagree, this.unknown & other.unknown, (this.value & ~this.unknown) | (other.value & ~other.unknown)); } } public Value and(Value other) { if (other == null) return this; if (this.width == 1 && other.width == 1) { if (this == FALSE || other == FALSE) return FALSE; if (this == TRUE && other == TRUE ) return TRUE; return ERROR; } else { int false0 = ~this.value & ~this.error & ~this.unknown; int false1 = ~other.value & ~other.error & ~other.unknown; int falses = false0 | false1; return Value.create(Math.max(this.width, other.width), (this.error | other.error | this.unknown | other.unknown) & ~falses, 0, this.value & other.value); } } public Value or(Value other) { if (other == null) return this; if (this.width == 1 && other.width == 1) { if (this == TRUE || other == TRUE ) return TRUE; if (this == FALSE && other == FALSE) return FALSE; return ERROR; } else { int true0 = this.value & ~this.error & ~this.unknown; int true1 = other.value & ~other.error & ~other.unknown; int trues = true0 | true1; return Value.create(Math.max(this.width, other.width), (this.error | other.error | this.unknown | other.unknown) & ~trues, 0, this.value | other.value); } } public Value xor(Value other) { if (other == null) return this; if (this.width <= 1 && other.width <= 1) { if (this == ERROR || other == ERROR) return ERROR; if (this == UNKNOWN || other == UNKNOWN) return ERROR; if (this == NIL || other == NIL) return ERROR; if ((this == TRUE) == (other == TRUE)) return FALSE; return TRUE; } else { return Value.create(Math.max(this.width, other.width), this.error | other.error | this.unknown | other.unknown, 0, this.value ^ other.value); } } public Value not() { if (width <= 1) { if (this == TRUE) return FALSE; if (this == FALSE) return TRUE; return ERROR; } else { return Value.create(this.width, this.error | this.unknown, 0, ~this.value); } } public Color getColor() { if (error != 0) { return ERROR_COLOR; } else if (width == 0) { return NIL_COLOR; } else if (width == 1) { if (this == UNKNOWN) return UNKNOWN_COLOR; else if (this == TRUE) return TRUE_COLOR; else return FALSE_COLOR; } else { return MULTI_COLOR; } } } logisim-2.7.1/src/com/cburch/logisim/data/Strings.java0000644000175000017500000000102411446034552022546 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.data; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.StringGetter; class Strings { private static LocaleManager source = new LocaleManager("resources/logisim", "data"); public static String get(String key) { return source.get(key); } public static StringGetter getter(String key) { return source.getter(key); } } logisim-2.7.1/src/com/cburch/logisim/data/Size.java0000644000175000017500000000266611446034552022044 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.data; /** * Represents the dimensions of a rectangle. This is analogous to * java.awt's Dimension class, except that objects of this type * are immutable. */ public class Size { public static Size create(int wid, int ht) { return new Size(wid, ht); } private final int wid; private final int ht; private Size(int wid, int ht) { this.wid = wid; this.ht = ht; } @Override public boolean equals(Object other_obj) { if (!(other_obj instanceof Size)) return false; Size other = (Size) other_obj; return wid == other.wid && ht == other.ht; } @Override public String toString() { return wid + "x" + ht; } public int getWidth() { return wid; } public int getHeight() { return ht; } public java.awt.Dimension toAwtDimension() { return new java.awt.Dimension(wid, ht); } public boolean contains(Location p) { return contains(p.getX(), p.getY()); } public boolean contains(int x, int y) { return x >= 0 && y >= 0 && x < this.wid && y < this.ht; } public boolean contains(int x, int y, int wid, int ht) { int oth_x = (wid <= 0 ? x : x + wid - 1); int oth_y = (ht <= 0 ? y : y + wid - 1); return contains(x, y) && contains(oth_x, oth_y); } public boolean contains(Size bd) { return contains(bd.wid, bd.ht); } } logisim-2.7.1/src/com/cburch/logisim/data/Location.java0000644000175000017500000000724711446034552022702 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.data; import com.cburch.logisim.util.Cache; /** * Represents an immutable rectangular bounding box. This is analogous to * java.awt's Point class, except that objects of this type * are immutable. */ public class Location implements Comparable { private static final Cache cache = new Cache(); private final int hashCode; private final int x; private final int y; private Location(int hashCode, int x, int y) { this.hashCode = hashCode; this.x = x; this.y = y; } public int getX() { return x; } public int getY() { return y; } public int manhattanDistanceTo(Location o) { return Math.abs(o.x - this.x) + Math.abs(o.y - this.y); } public int manhattanDistanceTo(int x, int y) { return Math.abs(x - this.x) + Math.abs(y - this.y); } public Location translate(int dx, int dy) { if (dx == 0 && dy == 0) return this; return Location.create(x + dx, y + dy); } public Location translate(Direction dir, int dist) { return translate(dir, dist, 0); } public Location translate(Direction dir, int dist, int right) { if (dist == 0 && right == 0) return this; if (dir == Direction.EAST) return Location.create(x + dist, y + right); if (dir == Direction.WEST) return Location.create(x - dist, y - right); if (dir == Direction.SOUTH) return Location.create(x - right, y + dist); if (dir == Direction.NORTH) return Location.create(x + right, y - dist); return Location.create(x + dist, y + right); } // rotates this around (xc,yc) assuming that this is facing in the // from direction and the returned bounds should face in the to direction. public Location rotate(Direction from, Direction to, int xc, int yc) { int degrees = to.toDegrees() - from.toDegrees(); while (degrees >= 360) degrees -= 360; while (degrees < 0) degrees += 360; int dx = x - xc; int dy = y - yc; if (degrees == 90) { return create(xc + dy, yc - dx); } else if (degrees == 180) { return create(xc - dx, yc - dy); } else if (degrees == 270) { return create(xc - dy, yc + dx); } else { return this; } } @Override public boolean equals(Object other_obj) { if (!(other_obj instanceof Location)) return false; Location other = (Location) other_obj; return this.x == other.x && this.y == other.y; } @Override public int hashCode() { return hashCode; } public int compareTo(Location other) { if (this.x != other.x) return this.x - other.x; else return this.y - other.y; } @Override public String toString() { return "(" + x + "," + y + ")"; } public static Location create(int x, int y) { int hashCode = 31 * x + y; Object ret = cache.get(hashCode); if (ret != null) { Location loc = (Location) ret; if (loc.x == x && loc.y == y) return loc; } Location loc = new Location(hashCode, x, y); cache.put(hashCode, loc); return loc; } public static Location parse(String value) { String base = value; value = value.trim(); if (value.charAt(0) == '(') { int len = value.length(); if (value.charAt(len - 1) != ')') { throw new NumberFormatException("invalid point '" + base + "'"); } value = value.substring(1, len - 1); } value = value.trim(); int comma = value.indexOf(','); if (comma < 0) { comma = value.indexOf(' '); if (comma < 0) { throw new NumberFormatException("invalid point '" + base + "'"); } } int x = Integer.parseInt(value.substring(0, comma).trim()); int y = Integer.parseInt(value.substring(comma + 1).trim()); return Location.create(x, y); } } logisim-2.7.1/src/com/cburch/logisim/data/Direction.java0000644000175000017500000000616511455255502023050 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.data; import com.cburch.logisim.util.StringGetter; public class Direction implements AttributeOptionInterface { public static final Direction EAST = new Direction("east", Strings.getter("directionEastOption"), Strings.getter("directionEastVertical"), 0); public static final Direction WEST = new Direction("west", Strings.getter("directionWestOption"), Strings.getter("directionWestVertical"), 1); public static final Direction NORTH = new Direction("north", Strings.getter("directionNorthOption"), Strings.getter("directionNorthVertical"), 2); public static final Direction SOUTH = new Direction("south", Strings.getter("directionSouthOption"), Strings.getter("directionSouthVertical"), 3); public static final Direction[] cardinals = { NORTH, EAST, SOUTH, WEST }; public static Direction parse(String str) { if (str.equals(EAST.name)) return EAST; if (str.equals(WEST.name)) return WEST; if (str.equals(NORTH.name)) return NORTH; if (str.equals(SOUTH.name)) return SOUTH; throw new NumberFormatException("illegal direction '" + str + "'"); } private String name; private StringGetter disp; private StringGetter vert; private int id; private Direction(String name, StringGetter disp, StringGetter vert, int id) { this.name = name; this.disp = disp; this.vert = vert; this.id = id; } @Override public String toString() { return name; } public String toDisplayString() { return disp.get(); } public StringGetter getDisplayGetter() { return disp; } public String toVerticalDisplayString() { return vert.get(); } @Override public int hashCode() { return id; } public double toRadians() { if (this == Direction.EAST) return 0.0; if (this == Direction.WEST) return Math.PI; if (this == Direction.NORTH) return Math.PI / 2.0; if (this == Direction.SOUTH) return -Math.PI / 2.0; return 0.0; } public int toDegrees() { if (this == Direction.EAST) return 0; if (this == Direction.WEST) return 180; if (this == Direction.NORTH) return 90; if (this == Direction.SOUTH) return 270; return 0; } public Direction reverse() { if (this == Direction.EAST) return Direction.WEST; if (this == Direction.WEST) return Direction.EAST; if (this == Direction.NORTH) return Direction.SOUTH; if (this == Direction.SOUTH) return Direction.NORTH; return Direction.WEST; } public Direction getRight() { if (this == Direction.EAST) return Direction.SOUTH; if (this == Direction.WEST) return Direction.NORTH; if (this == Direction.NORTH) return Direction.EAST; if (this == Direction.SOUTH) return Direction.WEST; return Direction.WEST; } public Direction getLeft() { if (this == Direction.EAST) return Direction.NORTH; if (this == Direction.WEST) return Direction.SOUTH; if (this == Direction.NORTH) return Direction.WEST; if (this == Direction.SOUTH) return Direction.EAST; return Direction.WEST; } // for AttributeOptionInterface public Object getValue() { return this; } } logisim-2.7.1/src/com/cburch/logisim/data/Bounds.java0000644000175000017500000001477411446034552022367 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.data; import java.awt.Rectangle; import com.cburch.logisim.util.Cache; /** * Represents an immutable rectangular bounding box. This is analogous to * java.awt's Rectangle class, except that objects of this type * are immutable. */ public class Bounds { public static Bounds EMPTY_BOUNDS = new Bounds(0, 0, 0, 0); private static final Cache cache = new Cache(); public static Bounds create(int x, int y, int wid, int ht) { int hashCode = 13 * (31 * (31 * x + y) + wid) + ht; Object cached = cache.get(hashCode); if (cached != null) { Bounds bds = (Bounds) cached; if (bds.x == x && bds.y == y && bds.wid == wid && bds.ht == ht) return bds; } Bounds ret = new Bounds(x, y, wid, ht); cache.put(hashCode, ret); return ret; } public static Bounds create(java.awt.Rectangle rect) { return create(rect.x, rect.y, rect.width, rect.height); } public static Bounds create(Location pt) { return create(pt.getX(), pt.getY(), 1, 1); } private final int x; private final int y; private final int wid; private final int ht; private Bounds(int x, int y, int wid, int ht) { this.x = x; this.y = y; this.wid = wid; this.ht = ht; if (wid < 0) { x += wid / 2; wid = 0; } if (ht < 0) { y += ht / 2; ht = 0; } } @Override public boolean equals(Object other_obj) { if (!(other_obj instanceof Bounds)) return false; Bounds other = (Bounds) other_obj; return x == other.x && y == other.y && wid == other.wid && ht == other.ht; } @Override public int hashCode() { int ret = 31 * x + y; ret = 31 * ret + wid; ret = 31 * ret + ht; return ret; } @Override public String toString() { return "(" + x + "," + y + "): " + wid + "x" + ht; } public int getX() { return x; } public int getY() { return y; } public int getWidth() { return wid; } public int getHeight() { return ht; } public Rectangle toRectangle() { return new Rectangle(x, y, wid, ht); } public boolean contains(Location p) { return contains(p.getX(), p.getY(), 0); } public boolean contains(Location p, int allowedError) { return contains(p.getX(), p.getY(), allowedError); } public boolean contains(int px, int py) { return contains(px, py, 0); } public boolean contains(int px, int py, int allowedError) { return px >= x - allowedError && px < x + wid + allowedError && py >= y - allowedError && py < y + ht + allowedError; } public boolean contains(int x, int y, int wid, int ht) { int oth_x = (wid <= 0 ? x : x + wid - 1); int oth_y = (ht <= 0 ? y : y + ht - 1); return contains(x, y) && contains(oth_x, oth_y); } public boolean contains(Bounds bd) { return contains(bd.x, bd.y, bd.wid, bd.ht); } public boolean borderContains(Location p, int fudge) { return borderContains(p.getX(), p.getY(), fudge); } public boolean borderContains(int px, int py, int fudge) { int x1 = x + wid - 1; int y1 = y + ht - 1; if (Math.abs(px - x) <= fudge || Math.abs(px - x1) <= fudge) { // maybe on east or west border? return y - fudge >= py && py <= y1 + fudge; } if (Math.abs(py - y) <= fudge || Math.abs(py - y1) <= fudge) { // maybe on north or south border? return x - fudge >= px && px <= x1 + fudge; } return false; } public Bounds add(Location p) { return add(p.getX(), p.getY()); } public Bounds add(int x, int y) { if (this == EMPTY_BOUNDS) return Bounds.create(x, y, 1, 1); if (contains(x, y)) return this; int new_x = this.x; int new_wid = this.wid; int new_y = this.y; int new_ht = this.ht; if (x < this.x) { new_x = x; new_wid = (this.x + this.wid) - x; } else if (x >= this.x + this.wid) { new_x = this.x; new_wid = x - this.x + 1; } if (y < this.y) { new_y = y; new_ht = (this.y + this.ht) - y; } else if (y >= this.y + this.ht) { new_y = this.y; new_ht = y - this.y + 1; } return create(new_x, new_y, new_wid, new_ht); } public Bounds add(int x, int y, int wid, int ht) { if (this == EMPTY_BOUNDS) return Bounds.create(x, y, wid, ht); int retX = Math.min(x, this.x); int retY = Math.min(y, this.y); int retWidth = Math.max(x + wid, this.x + this.wid) - retX; int retHeight = Math.max(y + ht, this.y + this.ht) - retY; if (retX == this.x && retY == this.y && retWidth == this.wid && retHeight == this.ht) { return this; } else { return Bounds.create(retX, retY, retWidth, retHeight); } } public Bounds add(Bounds bd) { if (this == EMPTY_BOUNDS) return bd; if (bd == EMPTY_BOUNDS) return this; int retX = Math.min(bd.x, this.x); int retY = Math.min(bd.y, this.y); int retWidth = Math.max(bd.x + bd.wid, this.x + this.wid) - retX; int retHeight = Math.max(bd.y + bd.ht, this.y + this.ht) - retY; if (retX == this.x && retY == this.y && retWidth == this.wid && retHeight == this.ht) { return this; } else if (retX == bd.x && retY == bd.y && retWidth == bd.wid && retHeight == bd.ht) { return bd; } else { return Bounds.create(retX, retY, retWidth, retHeight); } } public Bounds expand(int d) { // d pixels in each direction if (this == EMPTY_BOUNDS) return this; if (d == 0) return this; return create(x - d, y - d, wid + 2 * d, ht + 2 * d); } public Bounds translate(int dx, int dy) { if (this == EMPTY_BOUNDS) return this; if (dx == 0 && dy == 0) return this; return create(x + dx, y + dy, wid, ht); } // rotates this around (xc,yc) assuming that this is facing in the // from direction and the returned bounds should face in the to direction. public Bounds rotate(Direction from, Direction to, int xc, int yc) { int degrees = to.toDegrees() - from.toDegrees(); while (degrees >= 360) degrees -= 360; while (degrees < 0) degrees += 360; int dx = x - xc; int dy = y - yc; if (degrees == 90) { return create(xc + dy, yc - dx - wid, ht, wid); } else if (degrees == 180) { return create(xc - dx - wid, yc - dy - ht, wid, ht); } else if (degrees == 270) { return create(xc - dy - ht, yc + dx, ht, wid); } else { return this; } } public Bounds intersect(Bounds other) { int x0 = this.x; int y0 = this.y; int x1 = x0 + this.wid; int y1 = y0 + this.ht; int x2 = other.x; int y2 = other.y; int x3 = x2 + other.wid; int y3 = y2 + other.ht; if (x2 > x0) x0 = x2; if (y2 > y0) y0 = y2; if (x3 < x1) x1 = x3; if (y3 < y1) y1 = y3; if (x1 < x0 || y1 < y0) { return EMPTY_BOUNDS; } else { return create(x0, y0, x1 - x0, y1 - y0); } } } logisim-2.7.1/src/com/cburch/logisim/data/BitWidth.java0000644000175000017500000000541111446034552022637 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.data; import javax.swing.JComboBox; import com.cburch.logisim.util.StringGetter; public class BitWidth implements Comparable { public static final BitWidth UNKNOWN = new BitWidth(0); public static final BitWidth ONE = new BitWidth(1); private static BitWidth[] prefab = null; static class Attribute extends com.cburch.logisim.data.Attribute { private BitWidth[] choices; public Attribute(String name, StringGetter disp) { super(name, disp); ensurePrefab(); choices = prefab; } public Attribute(String name, StringGetter disp, int min, int max) { super(name, disp); choices = new BitWidth[max - min + 1]; for (int i = 0; i < choices.length; i++) { choices[i] = BitWidth.create(min + i); } } @Override public BitWidth parse(String value) { return BitWidth.parse(value); } @Override public java.awt.Component getCellEditor(BitWidth value) { JComboBox combo = new JComboBox(choices); if (value != null) { int wid = value.getWidth(); if (wid <= 0 || wid > prefab.length) { combo.addItem(value); } combo.setSelectedItem(value); } return combo; } } final int width; private BitWidth(int width) { this.width = width; } public int getWidth() { return width; } public int getMask() { if (width == 0) return 0; else if (width == 32) return -1; else return (1 << width) - 1; } @Override public boolean equals(Object other_obj) { if (!(other_obj instanceof BitWidth)) return false; BitWidth other = (BitWidth) other_obj; return this.width == other.width; } public int compareTo(BitWidth other) { return this.width - other.width; } @Override public int hashCode() { return width; } @Override public String toString() { return "" + width; } public static BitWidth create(int width) { ensurePrefab(); if (width <= 0) { if (width == 0) { return UNKNOWN; } else { throw new IllegalArgumentException("width " + width + " must be positive"); } } else if (width - 1 < prefab.length) { return prefab[width - 1]; } else { return new BitWidth(width); } } public static BitWidth parse(String str) { if (str == null || str.length() == 0) { throw new NumberFormatException("Width string cannot be null"); } if (str.charAt(0) == '/') str = str.substring(1); return create(Integer.parseInt(str)); } private static void ensurePrefab() { if (prefab == null) { prefab = new BitWidth[Math.min(32, Value.MAX_WIDTH)]; prefab[0] = ONE; for (int i = 1; i < prefab.length; i++) { prefab[i] = new BitWidth(i + 1); } } } } logisim-2.7.1/src/com/cburch/logisim/data/AttributeSets.java0000644000175000017500000001236211520127046023720 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.data; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; public class AttributeSets { private AttributeSets() { } public static final AttributeSet EMPTY = new AttributeSet() { @Override public Object clone() { return this; } public void addAttributeListener(AttributeListener l) { } public void removeAttributeListener(AttributeListener l) { } public List> getAttributes() { return Collections.emptyList(); } public boolean containsAttribute(Attribute attr) { return false; } public Attribute getAttribute(String name) { return null; } public boolean isReadOnly(Attribute attr) { return true; } public void setReadOnly(Attribute attr, boolean value) { throw new UnsupportedOperationException(); } public boolean isToSave(Attribute attr) { return true; } public V getValue(Attribute attr) { return null; } public void setValue(Attribute attr, V value) { } }; public static AttributeSet fixedSet(Attribute attr, V initValue) { return new SingletonSet(attr, initValue); } public static AttributeSet fixedSet(Attribute[] attrs, Object[] initValues) { if (attrs.length > 1) { return new FixedSet(attrs, initValues); } else if (attrs.length == 1) { return new SingletonSet(attrs[0], initValues[0]); } else { return EMPTY; } } public static void copy(AttributeSet src, AttributeSet dst) { if (src == null || src.getAttributes() == null) return; for (Attribute attr : src.getAttributes()) { @SuppressWarnings("unchecked") Attribute attrObj = (Attribute) attr; Object value = src.getValue(attr); dst.setValue(attrObj, value); } } private static class SingletonSet extends AbstractAttributeSet { private List> attrs; private Object value; private boolean readOnly = false; SingletonSet(Attribute attr, Object initValue) { this.attrs = new ArrayList>(1); this.attrs.add(attr); this.value = initValue; } @Override protected void copyInto(AbstractAttributeSet destSet) { SingletonSet dest = (SingletonSet) destSet; dest.attrs = this.attrs; dest.value = this.value; dest.readOnly = this.readOnly; } @Override public List> getAttributes() { return attrs; } @Override public boolean isReadOnly(Attribute attr) { return readOnly; } @Override public void setReadOnly(Attribute attr, boolean value) { int index = attrs.indexOf(attr); if (index < 0) throw new IllegalArgumentException("attribute " + attr.getName() + " absent"); readOnly = value; } @Override public V getValue(Attribute attr) { int index = attrs.indexOf(attr); @SuppressWarnings("unchecked") V ret = (V) (index >= 0 ? value : null); return ret; } @Override public void setValue(Attribute attr, V value) { int index = attrs.indexOf(attr); if (index < 0) throw new IllegalArgumentException("attribute " + attr.getName() + " absent"); if (readOnly) throw new IllegalArgumentException("read only"); this.value = value; fireAttributeValueChanged(attr, value); } } private static class FixedSet extends AbstractAttributeSet { private List> attrs; private Object[] values; private int readOnly = 0; FixedSet(Attribute[] attrs, Object[] initValues) { if (attrs.length != initValues.length) { throw new IllegalArgumentException("attribute and value arrays must have same length"); } if (attrs.length > 32) { throw new IllegalArgumentException("cannot handle more than 32 attributes"); } this.attrs = Arrays.asList(attrs); this.values = initValues.clone(); } @Override protected void copyInto(AbstractAttributeSet destSet) { FixedSet dest = (FixedSet) destSet; dest.attrs = this.attrs; dest.values = this.values.clone(); dest.readOnly = this.readOnly; } @Override public List> getAttributes() { return attrs; } @Override public boolean isReadOnly(Attribute attr) { int index = attrs.indexOf(attr); if (index < 0) return true; return isReadOnly(index); } @Override public void setReadOnly(Attribute attr, boolean value) { int index = attrs.indexOf(attr); if (index < 0) throw new IllegalArgumentException("attribute " + attr.getName() + " absent"); if (value) readOnly |= (1 << index); else readOnly &= ~(1 << index); } @Override public V getValue(Attribute attr) { int index = attrs.indexOf(attr); if (index < 0) { return null; } else { @SuppressWarnings("unchecked") V ret = (V) values[index]; return ret; } } @Override public void setValue(Attribute attr, V value) { int index = attrs.indexOf(attr); if (index < 0) throw new IllegalArgumentException("attribute " + attr.getName() + " absent"); if (isReadOnly(index)) throw new IllegalArgumentException("read only"); values[index] = value; fireAttributeValueChanged(attr, value); } private boolean isReadOnly(int index) { return ((readOnly >> index) & 1) == 1; } } } logisim-2.7.1/src/com/cburch/logisim/data/AttributeSetImpl.java0000644000175000017500000001221511446034552024362 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.data; import java.util.AbstractList; import java.util.Iterator; import java.util.List; public class AttributeSetImpl extends AbstractAttributeSet { private static class Node { Attribute attr; Object value; boolean is_read_only; Node next; Node(Attribute attr, Object value, boolean is_read_only, Node next) { this.attr = attr; this.value = value; this.is_read_only = is_read_only; this.next = next; } Node(Node other) { this.attr = other.attr; this.value = other.value; this.is_read_only = other.is_read_only; this.next = other.next; } } private class AttrIterator implements Iterator> { Node n; AttrIterator(Node n) { this.n = n; } public boolean hasNext() { return n != null; } public Attribute next() { Node ret = n; n = n.next; return ret.attr; } public void remove() { throw new UnsupportedOperationException(); } } private class AttrList extends AbstractList> { @Override public Iterator> iterator() { return new AttrIterator(head); } @Override public Attribute get(int i) { Node n = head; int remaining = i; while (remaining != 0 && n != null) { n = n.next; --remaining; } if (remaining != 0 || n == null) { throw new IndexOutOfBoundsException(i + " not in list " + " [" + count + " elements]"); } return n.attr; } @Override public boolean contains(Object o) { return indexOf(o) != -1; } @Override public int indexOf(Object o) { Node n = head; int ret = 0; while (n != null) { if (o.equals(n.attr)) return ret; n = n.next; ++ret; } return -1; } @Override public int size() { return count; } } private AttrList list = new AttrList(); private Node head = null; private Node tail = null; private int count = 0; public AttributeSetImpl() { } public AttributeSetImpl(Attribute[] attrs, Object[] values) { if (attrs.length != values.length) { throw new IllegalArgumentException("arrays must have same length"); } for (int i = 0; i < attrs.length; i++) { addAttribute(attrs[i], values[i]); } } @Override protected void copyInto(AbstractAttributeSet destObj) { AttributeSetImpl dest = (AttributeSetImpl) destObj; if (this.head != null) { dest.head = new Node(head); Node copy_prev = dest.head; Node cur = this.head.next; while (cur != null) { Node copy_cur = new Node(cur); copy_prev.next = copy_cur; copy_prev = copy_cur; cur = cur.next; } dest.tail = copy_prev; dest.count = this.count; } } // // attribute access methods // @Override public List> getAttributes() { return list; } public void addAttribute(Attribute attr, V value) { if (attr == null) { throw new IllegalArgumentException("Adding null attribute"); } if (findNode(attr) != null) { throw new IllegalArgumentException("Attribute " + attr + " already created"); } Node n = new Node(attr, value, false, null); if (head == null) head = n; else tail.next = n; tail = n; ++count; fireAttributeListChanged(); } public void removeAttribute(Attribute attr) { Node prev = null; Node n = head; while (n != null) { if (n.attr.equals(attr)) { if (tail == n) tail = prev; if (prev == null) head = n.next; else prev.next = n.next; --count; fireAttributeListChanged(); return; } prev = n; n = n.next; } throw new IllegalArgumentException("Attribute " + attr + " absent"); } // // read-only methods // @Override public boolean isReadOnly(Attribute attr) { Node n = findNode(attr); if (n == null) { throw new IllegalArgumentException("Unknown attribute " + attr); } return n.is_read_only; } @Override public void setReadOnly(Attribute attr, boolean value) { Node n = findNode(attr); if (n == null) { throw new IllegalArgumentException("Unknown attribute " + attr); } n.is_read_only = value; } // // value access methods // @Override public V getValue(Attribute attr) { Node n = findNode(attr); if (n == null) { throw new IllegalArgumentException("Unknown attribute " + attr); } @SuppressWarnings("unchecked") V ret = (V) n.value; return ret; } @Override public void setValue(Attribute attr, V value) { if (value instanceof String) { value = attr.parse((String) value); } Node n = findNode(attr); if (n == null) { throw new IllegalArgumentException("Unknown attribute " + attr); } if (n.is_read_only) { throw new IllegalArgumentException("Attribute " + attr + " is read-only"); } if (value.equals(n.value)) { ; // do nothing - why change what's already there? } else { n.value = value; fireAttributeValueChanged(attr, value); } } // // private helper methods // private Node findNode(Attribute attr) { for (Node n = head; n != null; n = n.next) { if (n.attr.equals(attr)) return n; } return null; } } logisim-2.7.1/src/com/cburch/logisim/data/AttributeSet.java0000644000175000017500000000143111446034552023536 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.data; import java.util.List; public interface AttributeSet { public Object clone(); public void addAttributeListener(AttributeListener l); public void removeAttributeListener(AttributeListener l); public List> getAttributes(); public boolean containsAttribute(Attribute attr); public Attribute getAttribute(String name); public boolean isReadOnly(Attribute attr); public void setReadOnly(Attribute attr, boolean value); // optional public boolean isToSave(Attribute attr); public V getValue(Attribute attr); public void setValue(Attribute attr, V value); } logisim-2.7.1/src/com/cburch/logisim/data/Attributes.java0000644000175000017500000003012311527054436023250 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.data; import java.awt.Color; import java.awt.Component; import java.awt.Font; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.plaf.basic.BasicComboBoxRenderer; import com.bric.swing.ColorPicker; import com.cburch.logisim.util.FontUtil; import com.cburch.logisim.util.JInputComponent; import com.cburch.logisim.util.StringGetter; import com.connectina.swing.fontchooser.JFontChooser; public class Attributes { private Attributes() { } private static class ConstantGetter implements StringGetter { private String str; public ConstantGetter(String str) { this.str = str; } public String get() { return str; } @Override public String toString() { return get(); } } private static StringGetter getter(String s) { return new ConstantGetter(s); } // // methods with display name == standard name // public static Attribute forString(String name) { return forString(name, getter(name)); } public static Attribute forOption(String name, Object[] vals) { return forOption(name, getter(name), vals); } public static Attribute forInteger(String name) { return forInteger(name, getter(name)); } public static Attribute forHexInteger(String name) { return forHexInteger(name, getter(name)); } public static Attribute forIntegerRange(String name, int start, int end) { return forIntegerRange(name, getter(name), start, end); } public static Attribute forDouble(String name) { return forDouble(name, getter(name)); } public static Attribute forBoolean(String name) { return forBoolean(name, getter(name)); } public static Attribute forDirection(String name) { return forDirection(name, getter(name)); } public static Attribute forBitWidth(String name) { return forBitWidth(name, getter(name)); } public static Attribute forBitWidth(String name, int min, int max) { return forBitWidth(name, getter(name), min, max); } public static Attribute forFont(String name) { return forFont(name, getter(name)); } public static Attribute forLocation(String name) { return forLocation(name, getter(name)); } public static Attribute forColor(String name) { return forColor(name, getter(name)); } // // methods with internationalization support // public static Attribute forString(String name, StringGetter disp) { return new StringAttribute(name, disp); } public static Attribute forOption(String name, StringGetter disp, V[] vals) { return new OptionAttribute(name, disp, vals); } public static Attribute forInteger(String name, StringGetter disp) { return new IntegerAttribute(name, disp); } public static Attribute forHexInteger(String name, StringGetter disp) { return new HexIntegerAttribute(name, disp); } public static Attribute forIntegerRange(String name, StringGetter disp, int start, int end) { return new IntegerRangeAttribute(name, disp, start, end); } public static Attribute forDouble(String name, StringGetter disp) { return new DoubleAttribute(name, disp); } public static Attribute forBoolean(String name, StringGetter disp) { return new BooleanAttribute(name, disp); } public static Attribute forDirection(String name, StringGetter disp) { return new DirectionAttribute(name, disp); } public static Attribute forBitWidth(String name, StringGetter disp) { return new BitWidth.Attribute(name, disp); } public static Attribute forBitWidth(String name, StringGetter disp, int min, int max) { return new BitWidth.Attribute(name, disp, min, max); } public static Attribute forFont(String name, StringGetter disp) { return new FontAttribute(name, disp); } public static Attribute forLocation(String name, StringGetter disp) { return new LocationAttribute(name, disp); } public static Attribute forColor(String name, StringGetter disp) { return new ColorAttribute(name, disp); } private static class StringAttribute extends Attribute { private StringAttribute(String name, StringGetter disp) { super(name, disp); } @Override public String parse(String value) { return value; } } private static class OptionComboRenderer extends BasicComboBoxRenderer { Attribute attr; OptionComboRenderer(Attribute attr) { this.attr = attr; } @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { Component ret = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); if (ret instanceof JLabel) { @SuppressWarnings("unchecked") V val = (V) value; ((JLabel) ret).setText(value == null ? "" : attr.toDisplayString(val)); } return ret; } } private static class OptionAttribute extends Attribute { private V[] vals; private OptionAttribute(String name, StringGetter disp, V[] vals) { super(name, disp); this.vals = vals; } @Override public String toDisplayString(V value) { if (value instanceof AttributeOptionInterface) { return ((AttributeOptionInterface) value).toDisplayString(); } else { return value.toString(); } } @Override public V parse(String value) { for (int i = 0; i < vals.length; i++) { if (value.equals(vals[i].toString())) { return vals[i]; } } throw new NumberFormatException("value not among choices"); } @Override public java.awt.Component getCellEditor(Object value) { JComboBox combo = new JComboBox(vals); combo.setRenderer(new OptionComboRenderer(this)); if (value == null) combo.setSelectedIndex(-1); else combo.setSelectedItem(value); return combo; } } private static class IntegerAttribute extends Attribute { private IntegerAttribute(String name, StringGetter disp) { super(name, disp); } @Override public Integer parse(String value) { return Integer.valueOf(value); } } private static class HexIntegerAttribute extends Attribute { private HexIntegerAttribute(String name, StringGetter disp) { super(name, disp); } @Override public String toDisplayString(Integer value) { int val = value.intValue(); return "0x" + Integer.toHexString(val); } @Override public String toStandardString(Integer value) { return toDisplayString(value); } @Override public Integer parse(String value) { value = value.toLowerCase(); if (value.startsWith("0x")) { value = value.substring(2); return Integer.valueOf((int) Long.parseLong(value, 16)); } else if (value.startsWith("0b")) { value = value.substring(2); return Integer.valueOf((int) Long.parseLong(value, 2)); } else if (value.startsWith("0")) { value = value.substring(1); return Integer.valueOf((int) Long.parseLong(value, 8)); } else { return Integer.valueOf((int) Long.parseLong(value, 10)); } } } private static class DoubleAttribute extends Attribute { private DoubleAttribute(String name, StringGetter disp) { super(name, disp); } @Override public Double parse(String value) { return Double.valueOf(value); } } private static class BooleanAttribute extends OptionAttribute { private static Boolean[] vals = { Boolean.TRUE, Boolean.FALSE }; private BooleanAttribute(String name, StringGetter disp) { super(name, disp, vals); } @Override public String toDisplayString(Boolean value) { if (value.booleanValue()) return Strings.get("booleanTrueOption"); else return Strings.get("booleanFalseOption"); } @Override public Boolean parse(String value) { Boolean b = Boolean.valueOf(value); return vals[b.booleanValue() ? 0 : 1]; } } private static class IntegerRangeAttribute extends Attribute { Integer[] options = null; int start; int end; private IntegerRangeAttribute(String name, StringGetter disp, int start, int end) { super(name, disp); this.start = start; this.end = end; } @Override public Integer parse(String value) { int v = (int) Long.parseLong(value); if (v < start) throw new NumberFormatException("integer too small"); if (v > end) throw new NumberFormatException("integer too large"); return Integer.valueOf(v); } @Override public java.awt.Component getCellEditor(Integer value) { if (end - start + 1 > 32) { return super.getCellEditor(value); } else { if (options == null) { options = new Integer[end - start + 1]; for (int i = start; i <= end; i++) { options[i - start] = Integer.valueOf(i); } } JComboBox combo = new JComboBox(options); if (value == null) combo.setSelectedIndex(-1); else combo.setSelectedItem(value); return combo; } } } private static class DirectionAttribute extends OptionAttribute { private static Direction[] vals = { Direction.NORTH, Direction.SOUTH, Direction.EAST, Direction.WEST, }; public DirectionAttribute(String name, StringGetter disp) { super(name, disp, vals); } @Override public String toDisplayString(Direction value) { return value == null ? "???" : value.toDisplayString(); } @Override public Direction parse(String value) { return Direction.parse(value); } } private static class FontAttribute extends Attribute { private FontAttribute(String name, StringGetter disp) { super(name, disp); } @Override public String toDisplayString(Font f) { if (f == null) return "???"; return f.getFamily() + " " + FontUtil.toStyleDisplayString(f.getStyle()) + " " + f.getSize(); } @Override public String toStandardString(Font f) { return f.getFamily() + " " + FontUtil.toStyleStandardString(f.getStyle()) + " " + f.getSize(); } @Override public Font parse(String value) { return Font.decode(value); } @Override public java.awt.Component getCellEditor(Font value) { return new FontChooser(value); } } private static class FontChooser extends JFontChooser implements JInputComponent { FontChooser(Font initial) { super(initial); } public Object getValue() { return getSelectedFont(); } public void setValue(Object value) { setSelectedFont((Font) value); } } private static class LocationAttribute extends Attribute { public LocationAttribute(String name, StringGetter desc) { super(name, desc); } @Override public Location parse(String value) { return Location.parse(value); } } private static class ColorAttribute extends Attribute { public ColorAttribute(String name, StringGetter desc) { super(name, desc); } @Override public String toDisplayString(Color value) { return toStandardString(value); } @Override public String toStandardString(Color c) { String ret = "#" + hex(c.getRed()) + hex(c.getGreen()) + hex(c.getBlue()); return c.getAlpha() == 255 ? ret : ret + hex(c.getAlpha()); } private String hex(int value) { if (value >= 16) return Integer.toHexString(value); else return "0" + Integer.toHexString(value); } @Override public Color parse(String value) { if (value.length() == 9) { int r = Integer.parseInt(value.substring(1, 3), 16); int g = Integer.parseInt(value.substring(3, 5), 16); int b = Integer.parseInt(value.substring(5, 7), 16); int a = Integer.parseInt(value.substring(7, 9), 16); return new Color(r, g, b, a); } else { return Color.decode(value); } } @Override public java.awt.Component getCellEditor(Color value) { Color init = value == null ? Color.BLACK : value; return new ColorChooser(init); } } private static class ColorChooser extends ColorPicker implements JInputComponent { ColorChooser(Color initial) { if (initial != null) setColor(initial); setOpacityVisible(true); } public Object getValue() { return getColor(); } public void setValue(Object value) { setColor((Color) value); } } } logisim-2.7.1/src/com/cburch/logisim/data/AttributeOptionInterface.java0000644000175000017500000000047411446034552026102 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.data; public interface AttributeOptionInterface { public Object getValue(); public String toString(); public String toDisplayString(); } logisim-2.7.1/src/com/cburch/logisim/data/AttributeOption.java0000644000175000017500000000144211446034552024255 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.data; import com.cburch.logisim.util.StringGetter; public class AttributeOption implements AttributeOptionInterface { private Object value; private String name; private StringGetter desc; public AttributeOption(Object value, StringGetter desc) { this.value = value; this.name = value.toString(); this.desc = desc; } public AttributeOption(Object value, String name, StringGetter desc) { this.value = value; this.name = name; this.desc = desc; } public Object getValue() { return value; } @Override public String toString() { return name; } public String toDisplayString() { return desc.get(); } } logisim-2.7.1/src/com/cburch/logisim/data/AttributeListener.java0000644000175000017500000000051011446034552024565 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.data; public interface AttributeListener { public void attributeListChanged(AttributeEvent e); public void attributeValueChanged(AttributeEvent e); } logisim-2.7.1/src/com/cburch/logisim/data/AttributeEvent.java0000644000175000017500000000124511446034552024067 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.data; public class AttributeEvent { private AttributeSet source; private Attribute attr; private Object value; public AttributeEvent(AttributeSet source, Attribute attr, Object value) { this.source = source; this.attr = attr; this.value = value; } public AttributeEvent(AttributeSet source) { this(source, null, null); } public Attribute getAttribute() { return attr; } public AttributeSet getSource() { return source; } public Object getValue() { return value; } } logisim-2.7.1/src/com/cburch/logisim/data/AttributeDefaultProvider.java0000644000175000017500000000065311446034552026107 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.data; import com.cburch.logisim.LogisimVersion; public interface AttributeDefaultProvider { public boolean isAllDefaultValues(AttributeSet attrs, LogisimVersion ver); public Object getDefaultAttributeValue(Attribute attr, LogisimVersion ver); } logisim-2.7.1/src/com/cburch/logisim/data/Attribute.java0000644000175000017500000000203411446034552023062 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.data; import java.awt.Window; import javax.swing.JTextField; import com.cburch.logisim.util.StringGetter; public abstract class Attribute { private String name; private StringGetter disp; public Attribute(String name, StringGetter disp) { this.name = name; this.disp = disp; } @Override public String toString() { return name; } public String getName() { return name; } public String getDisplayName() { return disp.get(); } public java.awt.Component getCellEditor(Window source, V value) { return getCellEditor(value); } protected java.awt.Component getCellEditor(V value) { return new JTextField(toDisplayString(value)); } public String toDisplayString(V value) { return value == null ? "" : value.toString(); } public String toStandardString(V value) { return value.toString(); } public abstract V parse(String value); } logisim-2.7.1/src/com/cburch/logisim/data/AbstractAttributeSet.java0000644000175000017500000000450711503771120025222 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.data; import java.util.ArrayList; import java.util.List; public abstract class AbstractAttributeSet implements Cloneable, AttributeSet { private ArrayList listeners = null; public AbstractAttributeSet() { } @Override public Object clone() { AbstractAttributeSet ret; try { ret = (AbstractAttributeSet) super.clone(); } catch (CloneNotSupportedException ex) { throw new UnsupportedOperationException(); } ret.listeners = new ArrayList(); this.copyInto(ret); return ret; } public void addAttributeListener(AttributeListener l) { if (listeners == null) listeners = new ArrayList(); listeners.add(l); } public void removeAttributeListener(AttributeListener l) { listeners.remove(l); if (listeners.isEmpty()) listeners = null; } protected void fireAttributeValueChanged(Attribute attr, V value) { if (listeners != null) { AttributeEvent event = new AttributeEvent(this, attr, value); List ls = new ArrayList(listeners); for (AttributeListener l : ls) { l.attributeValueChanged(event); } } } protected void fireAttributeListChanged() { if (listeners != null) { AttributeEvent event = new AttributeEvent(this); List ls = new ArrayList(listeners); for (AttributeListener l : ls) { l.attributeListChanged(event); } } } public boolean containsAttribute(Attribute attr) { return getAttributes().contains(attr); } public Attribute getAttribute(String name) { for (Attribute attr : getAttributes()) { if (attr.getName().equals(name)) { return attr; } } return null; } public boolean isReadOnly(Attribute attr) { return false; } public void setReadOnly(Attribute attr, boolean value) { throw new UnsupportedOperationException(); } public boolean isToSave(Attribute attr) { return true; } protected abstract void copyInto(AbstractAttributeSet dest); public abstract List> getAttributes(); public abstract V getValue(Attribute attr); public abstract void setValue(Attribute attr, V value); } logisim-2.7.1/src/com/cburch/logisim/comp/0000755000175000017500000000000011455470076020307 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/logisim/comp/TextFieldListener.java0000644000175000017500000000041111446034572024541 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.comp; public interface TextFieldListener { public void textChanged(TextFieldEvent e); } logisim-2.7.1/src/com/cburch/logisim/comp/TextFieldEvent.java0000644000175000017500000000110011446034572024031 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.comp; public class TextFieldEvent { private TextField field; private String oldval; private String newval; public TextFieldEvent(TextField field, String old, String val) { this.field = field; this.oldval = old; this.newval = val; } public TextField getTextField() { return field; } public String getOldText() { return oldval; } public String getText() { return newval; } } logisim-2.7.1/src/com/cburch/logisim/comp/TextFieldCaret.java0000644000175000017500000001456011446034572024024 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.comp; import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.LinkedList; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.tools.Caret; import com.cburch.logisim.tools.CaretEvent; import com.cburch.logisim.tools.CaretListener; class TextFieldCaret implements Caret, TextFieldListener { private LinkedList listeners = new LinkedList(); private TextField field; private Graphics g; private String oldText; private String curText; private int pos; public TextFieldCaret(TextField field, Graphics g, int pos) { this.field = field; this.g = g; this.oldText = field.getText(); this.curText = field.getText(); this.pos = pos; field.addTextFieldListener(this); } public TextFieldCaret(TextField field, Graphics g, int x, int y) { this(field, g, 0); moveCaret(x, y); } public void addCaretListener(CaretListener l) { listeners.add(l); } public void removeCaretListener(CaretListener l) { listeners.remove(l); } public String getText() { return curText; } public void commitText(String text) { curText = text; pos = curText.length(); field.setText(text); } public void draw(Graphics g) { if (field.getFont() != null) g.setFont(field.getFont()); // draw boundary Bounds bds = getBounds(g); g.setColor(Color.white); g.fillRect(bds.getX(), bds.getY(), bds.getWidth(), bds.getHeight()); g.setColor(Color.black); g.drawRect(bds.getX(), bds.getY(), bds.getWidth(), bds.getHeight()); // draw text int x = field.getX(); int y = field.getY(); FontMetrics fm = g.getFontMetrics(); int width = fm.stringWidth(curText); int ascent = fm.getAscent(); int descent = fm.getDescent(); switch (field.getHAlign()) { case TextField.H_CENTER: x -= width / 2; break; case TextField.H_RIGHT: x -= width; break; default: break; } switch (field.getVAlign()) { case TextField.V_TOP: y += ascent; break; case TextField.V_CENTER: y += (ascent - descent) / 2; break; case TextField.V_BOTTOM: y -= descent; break; default: break; } g.drawString(curText, x, y); // draw cursor if (pos > 0) x += fm.stringWidth(curText.substring(0, pos)); g.drawLine(x, y, x, y - ascent); } public Bounds getBounds(Graphics g) { int x = field.getX(); int y = field.getY(); Font font = field.getFont(); FontMetrics fm; if (font == null) fm = g.getFontMetrics(); else fm = g.getFontMetrics(font); int width = fm.stringWidth(curText); int ascent = fm.getAscent(); int descent = fm.getDescent(); int height = ascent + descent; switch (field.getHAlign()) { case TextField.H_CENTER: x -= width / 2; break; case TextField.H_RIGHT: x -= width; break; default: break; } switch (field.getVAlign()) { case TextField.V_TOP: y += ascent; break; case TextField.V_CENTER: y += (ascent - descent) / 2; break; case TextField.V_BOTTOM: y -= descent; break; default: break; } return Bounds.create(x, y - ascent, width, height) .add(field.getBounds(g)) .expand(3); } public void cancelEditing() { CaretEvent e = new CaretEvent(this, oldText, oldText); curText = oldText; pos = curText.length(); for (CaretListener l : new ArrayList(listeners)) { l.editingCanceled(e); } field.removeTextFieldListener(this); } public void stopEditing() { CaretEvent e = new CaretEvent(this, oldText, curText); field.setText(curText); for (CaretListener l : new ArrayList(listeners)) { l.editingStopped(e); } field.removeTextFieldListener(this); } public void mousePressed(MouseEvent e) { //TODO: enhance label editing moveCaret(e.getX(), e.getY()); } public void mouseDragged(MouseEvent e) { //TODO: enhance label editing } public void mouseReleased(MouseEvent e) { //TODO: enhance label editing moveCaret(e.getX(), e.getY()); } public void keyPressed(KeyEvent e) { int ign = InputEvent.ALT_MASK | InputEvent.CTRL_MASK | InputEvent.META_MASK; if ((e.getModifiers() & ign) != 0) return; switch (e.getKeyCode()) { case KeyEvent.VK_LEFT: case KeyEvent.VK_KP_LEFT: if (pos > 0) --pos; break; case KeyEvent.VK_RIGHT: case KeyEvent.VK_KP_RIGHT: if (pos < curText.length()) ++pos; break; case KeyEvent.VK_HOME: pos = 0; break; case KeyEvent.VK_END: pos = curText.length(); break; case KeyEvent.VK_ESCAPE: case KeyEvent.VK_CANCEL: cancelEditing(); break; case KeyEvent.VK_CLEAR: curText = ""; pos = 0; break; case KeyEvent.VK_ENTER: stopEditing(); break; case KeyEvent.VK_BACK_SPACE: if (pos > 0) { curText = curText.substring(0, pos - 1) + curText.substring(pos); --pos; } break; case KeyEvent.VK_DELETE: if (pos < curText.length()) { curText = curText.substring(0, pos) + curText.substring(pos + 1); } break; case KeyEvent.VK_INSERT: case KeyEvent.VK_COPY: case KeyEvent.VK_CUT: case KeyEvent.VK_PASTE: //TODO: enhance label editing break; default: ; // ignore } } public void keyReleased(KeyEvent e) { } public void keyTyped(KeyEvent e) { int ign = InputEvent.ALT_MASK | InputEvent.CTRL_MASK | InputEvent.META_MASK; if ((e.getModifiers() & ign) != 0) return; char c = e.getKeyChar(); if (c == '\n') { stopEditing(); } else if (c != KeyEvent.CHAR_UNDEFINED && !Character.isISOControl(c)) { if (pos < curText.length()) { curText = curText.substring(0, pos) + c + curText.substring(pos); } else { curText += c; } ++pos; } } private void moveCaret(int x, int y) { Bounds bds = getBounds(g); FontMetrics fm = g.getFontMetrics(); x -= bds.getX(); int last = 0; for (int i = 0; i < curText.length(); i++) { int cur = fm.stringWidth(curText.substring(0, i + 1)); if (x <= (last + cur) / 2) { pos = i; return; } last = cur; } pos = curText.length(); } public void textChanged(TextFieldEvent e) { curText = field.getText(); oldText = curText; pos = curText.length(); } } logisim-2.7.1/src/com/cburch/logisim/comp/TextField.java0000644000175000017500000001072511446034572023044 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.comp; import java.awt.Graphics; import java.awt.Font; import java.awt.FontMetrics; import java.util.ArrayList; import java.util.LinkedList; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.util.GraphicsUtil; public class TextField { public static final int H_LEFT = GraphicsUtil.H_LEFT; public static final int H_CENTER = GraphicsUtil.H_CENTER; public static final int H_RIGHT = GraphicsUtil.H_RIGHT; public static final int V_TOP = GraphicsUtil.V_TOP; public static final int V_CENTER = GraphicsUtil.V_CENTER; public static final int V_CENTER_OVERALL = GraphicsUtil.V_CENTER_OVERALL; public static final int V_BASELINE = GraphicsUtil.V_BASELINE; public static final int V_BOTTOM = GraphicsUtil.V_BOTTOM; private int x; private int y; private int halign; private int valign; private Font font; private String text = ""; private LinkedList listeners = new LinkedList(); public TextField(int x, int y, int halign, int valign) { this(x, y, halign, valign, null); } public TextField(int x, int y, int halign, int valign, Font font) { this.x = x; this.y = y; this.halign = halign; this.valign = valign; this.font = font; } // // listener methods // public void addTextFieldListener(TextFieldListener l) { listeners.add(l); } public void removeTextFieldListener(TextFieldListener l) { listeners.remove(l); } public void fireTextChanged(TextFieldEvent e) { for (TextFieldListener l : new ArrayList(listeners)) { l.textChanged(e); } } // // access methods // public int getX() { return x; } public int getY() { return y; } public int getHAlign() { return halign; } public int getVAlign() { return valign; } public Font getFont() { return font; } public String getText() { return text; } public TextFieldCaret getCaret(Graphics g, int pos) { return new TextFieldCaret(this, g, pos); } // // modification methods // public void setText(String text) { if (!text.equals(this.text)) { TextFieldEvent e = new TextFieldEvent(this, this.text, text); this.text = text; fireTextChanged(e); } } public void setLocation(int x, int y) { this.x = x; this.y = y; } public void setLocation(int x, int y, int halign, int valign) { this.x = x; this.y = y; this.halign = halign; this.valign = valign; } public void setAlign(int halign, int valign) { this.halign = halign; this.valign = valign; } public void setHorzAlign(int halign) { this.halign = halign; } public void setVertAlign(int valign) { this.valign = valign; } public void setFont(Font font) { this.font = font; } // // graphics methods // public TextFieldCaret getCaret(Graphics g, int x, int y) { return new TextFieldCaret(this, g, x, y); } public Bounds getBounds(Graphics g) { int x = this.x; int y = this.y; FontMetrics fm; if (font == null) fm = g.getFontMetrics(); else fm = g.getFontMetrics(font); int width = fm.stringWidth(text); int ascent = fm.getAscent(); int descent = fm.getDescent(); switch (halign) { case TextField.H_CENTER: x -= width / 2; break; case TextField.H_RIGHT: x -= width; break; default: break; } switch (valign) { case TextField.V_TOP: y += ascent; break; case TextField.V_CENTER: y += ascent/ 2; break; case TextField.V_CENTER_OVERALL: y += (ascent - descent) / 2; break; case TextField.V_BOTTOM: y -= descent; break; default: break; } return Bounds.create(x, y - ascent, width, ascent + descent); } public void draw(Graphics g) { Font old = g.getFont(); if (font != null) g.setFont(font); int x = this.x; int y = this.y; FontMetrics fm = g.getFontMetrics(); int width = fm.stringWidth(text); int ascent = fm.getAscent(); int descent = fm.getDescent(); switch (halign) { case TextField.H_CENTER: x -= width / 2; break; case TextField.H_RIGHT: x -= width; break; default: break; } switch (valign) { case TextField.V_TOP: y += ascent; break; case TextField.V_CENTER: y += ascent/ 2; break; case TextField.V_CENTER_OVERALL: y += (ascent - descent) / 2; break; case TextField.V_BOTTOM: y -= descent; break; default: break; } g.drawString(text, x, y); g.setFont(old); } } logisim-2.7.1/src/com/cburch/logisim/comp/ManagedComponent.java0000644000175000017500000001145311446034572024372 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.comp; import java.util.ArrayList; import java.util.Collections; import java.util.List; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Location; import com.cburch.logisim.util.EventSourceWeakSupport; public abstract class ManagedComponent extends AbstractComponent { private EventSourceWeakSupport listeners = new EventSourceWeakSupport(); private Location loc; private AttributeSet attrs; private ArrayList ends; private List endsView; private Bounds bounds = null; public ManagedComponent(Location loc, AttributeSet attrs, int num_ends) { this.loc = loc; this.attrs = attrs; this.ends = new ArrayList(num_ends); this.endsView = Collections.unmodifiableList(ends); } // // abstract AbstractComponent methods // @Override public abstract ComponentFactory getFactory(); public void addComponentListener(ComponentListener l) { listeners.add(l); } public void removeComponentListener(ComponentListener l) { listeners.remove(l); } protected void fireEndChanged(ComponentEvent e) { ComponentEvent copy = null; for (ComponentListener l : listeners) { if (copy == null) { copy = new ComponentEvent(e.getSource(), Collections.singletonList(e.getOldData()), Collections.singletonList(e.getData())); } l.endChanged(copy); } } protected void fireEndsChanged(List oldEnds, List newEnds) { ComponentEvent e = null; for (ComponentListener l : listeners) { if (e == null) e = new ComponentEvent(this, oldEnds, newEnds); l.endChanged(e); } } protected void fireComponentInvalidated(ComponentEvent e) { for (ComponentListener l : listeners) { l.componentInvalidated(e); } } @Override public Location getLocation() { return loc; } public AttributeSet getAttributeSet() { return attrs; } @Override public Bounds getBounds() { if (bounds == null) { Location loc = getLocation(); Bounds offBounds = getFactory().getOffsetBounds(getAttributeSet()); bounds = offBounds.translate(loc.getX(), loc.getY()); } return bounds; } protected void recomputeBounds() { bounds = null; } @Override public List getEnds() { return endsView; } public int getEndCount() { return ends.size(); } @Override public abstract void propagate(CircuitState state); // // methods for altering data // public void clearManager() { for (EndData end : ends) { fireEndChanged(new ComponentEvent(this, end, null)); } ends.clear(); bounds = null; } public void setBounds(Bounds bounds) { this.bounds = bounds; } public void setAttributeSet(AttributeSet value) { attrs = value; } public void removeEnd(int index) { ends.remove(index); } public void setEnd(int i, EndData data) { if (i == ends.size()) { ends.add(data); fireEndChanged(new ComponentEvent(this, null, data)); } else { EndData old = ends.get(i); if (old == null || !old.equals(data)) { ends.set(i, data); fireEndChanged(new ComponentEvent(this, old, data)); } } } public void setEnd(int i, Location end, BitWidth width, int type) { setEnd(i, new EndData(end, width, type)); } public void setEnd(int i, Location end, BitWidth width, int type, boolean exclusive) { setEnd(i, new EndData(end, width, type, exclusive)); } public void setEnds(EndData[] newEnds) { List oldEnds = ends; int minLen = Math.min(oldEnds.size(), newEnds.length); ArrayList changesOld = new ArrayList(); ArrayList changesNew = new ArrayList(); for (int i = 0; i < minLen; i++) { EndData old = oldEnds.get(i); if (newEnds[i] != null && !newEnds[i].equals(old)) { changesOld.add(old); changesNew.add(newEnds[i]); oldEnds.set(i, newEnds[i]); } } for (int i = oldEnds.size() - 1; i >= minLen; i--) { changesOld.add(oldEnds.remove(i)); changesNew.add(null); } for (int i = minLen; i < newEnds.length; i++) { oldEnds.add(newEnds[i]); changesOld.add(null); changesNew.add(newEnds[i]); } fireEndsChanged(changesOld, changesNew); } public Location getEndLocation(int i) { return getEnd(i).getLocation(); } // // user interface methods // public void expose(ComponentDrawContext context) { Bounds bounds = getBounds(); java.awt.Component dest = context.getDestination(); if (bounds != null) { dest.repaint(bounds.getX() - 5, bounds.getY() - 5, bounds.getWidth() + 10, bounds.getHeight() + 10); } } public Object getFeature(Object key) { return null; } } logisim-2.7.1/src/com/cburch/logisim/comp/EndData.java0000644000175000017500000000255411446034572022455 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.comp; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Location; public class EndData { public static final int INPUT_ONLY = 1; public static final int OUTPUT_ONLY = 2; public static final int INPUT_OUTPUT = 3; private Location loc; private BitWidth width; private int i_o; private boolean exclusive; public EndData(Location loc, BitWidth width, int type, boolean exclusive) { this.loc = loc; this.width = width; this.i_o = type; this.exclusive = exclusive; } public EndData(Location loc, BitWidth width, int type) { this(loc, width, type, type == OUTPUT_ONLY); } public boolean isExclusive() { return exclusive; } public boolean isInput() { return (i_o & INPUT_ONLY) != 0; } public boolean isOutput() { return (i_o & OUTPUT_ONLY) != 0; } public Location getLocation() { return loc; } public BitWidth getWidth() { return width; } public int getType() { return i_o; } @Override public boolean equals(Object other) { if (!(other instanceof EndData)) return false; if (other == this) return true; EndData o = (EndData) other; return o.loc.equals(this.loc) && o.width.equals(this.width) && o.i_o == this.i_o && o.exclusive == this.exclusive; } } logisim-2.7.1/src/com/cburch/logisim/comp/ComponentUserEvent.java0000644000175000017500000000136611446034572024760 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.comp; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.gui.main.Canvas; public class ComponentUserEvent { private Canvas canvas; private int x = 0; private int y = 0; ComponentUserEvent(Canvas canvas) { this.canvas = canvas; } public ComponentUserEvent(Canvas canvas, int x, int y) { this.canvas = canvas; this.x = x; this.y = y; } public Canvas getCanvas() { return canvas; } public CircuitState getCircuitState() { return canvas.getCircuitState(); } public int getX() { return x; } public int getY() { return y; } } logisim-2.7.1/src/com/cburch/logisim/comp/ComponentState.java0000644000175000017500000000036211446034572024113 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.comp; public interface ComponentState { public Object clone(); } logisim-2.7.1/src/com/cburch/logisim/comp/ComponentListener.java0000644000175000017500000000047511446034572024625 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.comp; public interface ComponentListener { public void endChanged(ComponentEvent e); public void componentInvalidated(ComponentEvent e); } logisim-2.7.1/src/com/cburch/logisim/comp/ComponentFactory.java0000644000175000017500000000521111446034572024440 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.comp; import java.awt.Color; import com.cburch.logisim.LogisimVersion; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeDefaultProvider; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Location; import com.cburch.logisim.util.StringGetter; /** * Represents a category of components that appear in a circuit. This class * and Component share the same sort of relationship as the * relation between classes and instances in Java. Normally, * there is only one ComponentFactory created for any particular category. */ public interface ComponentFactory extends AttributeDefaultProvider { public static final Object SHOULD_SNAP = new Object(); public static final Object TOOL_TIP = new Object(); public static final Object FACING_ATTRIBUTE_KEY = new Object(); public String getName(); public String getDisplayName(); public StringGetter getDisplayGetter(); public Component createComponent(Location loc, AttributeSet attrs); public Bounds getOffsetBounds(AttributeSet attrs); public AttributeSet createAttributeSet(); public boolean isAllDefaultValues(AttributeSet attrs, LogisimVersion ver); public Object getDefaultAttributeValue(Attribute attr, LogisimVersion ver); public void drawGhost(ComponentDrawContext context, Color color, int x, int y, AttributeSet attrs); public void paintIcon(ComponentDrawContext context, int x, int y, AttributeSet attrs); /** * Retrieves special-purpose features for this factory. This technique * allows for future Logisim versions to add new features * for components without requiring changes to existing components. * It also removes the necessity for the Component API to directly * declare methods for each individual feature. * In most cases, the key is a Class object * corresponding to an interface, and the method should return an * implementation of that interface if it supports the feature. * * As of this writing, possible values for key include: * TOOL_TIP (return a String) and * SHOULD_SNAP (return a Boolean). * * @param key an object representing a feature. * @return an object representing information about how the component * supports the feature, or null if it does not support * the feature. */ public Object getFeature(Object key, AttributeSet attrs); } logisim-2.7.1/src/com/cburch/logisim/comp/ComponentEvent.java0000644000175000017500000000124411446034572024114 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.comp; public class ComponentEvent { private Component source; private Object oldData; private Object newData; public ComponentEvent(Component source) { this(source, null, null); } public ComponentEvent(Component source, Object oldData, Object newData) { this.source = source; this.oldData = oldData; this.newData = newData; } public Component getSource() { return source; } public Object getData() { return newData; } public Object getOldData() { return oldData; } } logisim-2.7.1/src/com/cburch/logisim/comp/ComponentDrawContext.java0000644000175000017500000001772611455470076025314 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.comp; import java.awt.Color; import java.awt.FontMetrics; import java.awt.Graphics; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.circuit.WireSet; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.prefs.AppPreferences; import com.cburch.logisim.util.GraphicsUtil; public class ComponentDrawContext { private static final int PIN_OFFS = 2; private static final int PIN_RAD = 4; private java.awt.Component dest; private Circuit circuit; private CircuitState circuitState; private Graphics base; private Graphics g; private boolean showState; private boolean showColor; private boolean printView; private WireSet highlightedWires; private InstancePainter instancePainter; public ComponentDrawContext(java.awt.Component dest, Circuit circuit, CircuitState circuitState, Graphics base, Graphics g, boolean printView) { this.dest = dest; this.circuit = circuit; this.circuitState = circuitState; this.base = base; this.g = g; this.showState = true; this.showColor = true; this.printView = printView; this.highlightedWires = WireSet.EMPTY; this.instancePainter = new InstancePainter(this, null); } public ComponentDrawContext(java.awt.Component dest, Circuit circuit, CircuitState circuitState, Graphics base, Graphics g) { this(dest, circuit, circuitState, base, g, false); } public void setShowState(boolean value) { showState = value; } public void setShowColor(boolean value) { showColor = value; } public InstancePainter getInstancePainter() { return instancePainter; } public void setHighlightedWires(WireSet value) { this.highlightedWires = value == null ? WireSet.EMPTY : value; } public WireSet getHighlightedWires() { return highlightedWires; } public boolean getShowState() { return !printView && showState; } public boolean isPrintView() { return printView; } public boolean shouldDrawColor() { return !printView && showColor; } public java.awt.Component getDestination() { return dest; } public Graphics getGraphics() { return g; } public Circuit getCircuit() { return circuit; } public CircuitState getCircuitState() { return circuitState; } public void setGraphics(Graphics g) { this.g = g; } public Object getGateShape() { return AppPreferences.GATE_SHAPE.get(); } // // helper methods // public void drawBounds(Component comp) { GraphicsUtil.switchToWidth(g, 2); g.setColor(Color.BLACK); Bounds bds = comp.getBounds(); g.drawRect(bds.getX(), bds.getY(), bds.getWidth(), bds.getHeight()); GraphicsUtil.switchToWidth(g, 1); } public void drawRectangle(Component comp) { drawRectangle(comp, ""); } public void drawRectangle(Component comp, String label) { Bounds bds = comp.getBounds(g); drawRectangle(bds.getX(), bds.getY(), bds.getWidth(), bds.getHeight(), label); } public void drawRectangle(int x, int y, int width, int height, String label) { GraphicsUtil.switchToWidth(g, 2); g.drawRect(x, y, width, height); if (label != null && !label.equals("")) { FontMetrics fm = base.getFontMetrics(g.getFont()); int lwid = fm.stringWidth(label); if (height > 20) { // centered at top edge g.drawString(label, x + (width - lwid) / 2, y + 2 + fm.getAscent()); } else { // centered overall g.drawString(label, x + (width - lwid) / 2, y + (height + fm.getAscent()) / 2 - 1); } } } public void drawRectangle(ComponentFactory source, int x, int y, AttributeSet attrs, String label) { Bounds bds = source.getOffsetBounds(attrs); drawRectangle(source, x + bds.getX(), y + bds.getY(), bds.getWidth(), bds.getHeight(), label); } public void drawRectangle(ComponentFactory source, int x, int y, int width, int height, String label) { GraphicsUtil.switchToWidth(g, 2); g.drawRect(x + 1, y + 1, width - 1, height - 1); if (label != null && !label.equals("")) { FontMetrics fm = base.getFontMetrics(g.getFont()); int lwid = fm.stringWidth(label); if (height > 20) { // centered at top edge g.drawString(label, x + (width - lwid) / 2, y + 2 + fm.getAscent()); } else { // centered overall g.drawString(label, x + (width - lwid) / 2, y + (height + fm.getAscent()) / 2 - 1); } } } public void drawDongle(int x, int y) { GraphicsUtil.switchToWidth(g, 2); g.drawOval(x - 4, y - 4, 9, 9); } public void drawPin(Component comp, int i, String label, Direction dir) { Color curColor = g.getColor(); if (i < 0 || i >= comp.getEnds().size()) return; EndData e = comp.getEnd(i); Location pt = e.getLocation(); int x = pt.getX(); int y = pt.getY(); if (getShowState()) { CircuitState state = getCircuitState(); g.setColor(state.getValue(pt).getColor()); } else { g.setColor(Color.BLACK); } g.fillOval(x - PIN_OFFS, y - PIN_OFFS, PIN_RAD, PIN_RAD); g.setColor(curColor); if (dir == Direction.EAST) { GraphicsUtil.drawText(g, label, x + 3, y, GraphicsUtil.H_LEFT, GraphicsUtil.V_CENTER); } else if (dir == Direction.WEST) { GraphicsUtil.drawText(g, label, x - 3, y, GraphicsUtil.H_RIGHT, GraphicsUtil.V_CENTER); } else if (dir == Direction.SOUTH) { GraphicsUtil.drawText(g, label, x, y - 3, GraphicsUtil.H_CENTER, GraphicsUtil.V_BASELINE); } else if (dir == Direction.NORTH) { GraphicsUtil.drawText(g, label, x, y + 3, GraphicsUtil.H_CENTER, GraphicsUtil.V_TOP); } } public void drawPin(Component comp, int i) { EndData e = comp.getEnd(i); Location pt = e.getLocation(); Color curColor = g.getColor(); if (getShowState()) { CircuitState state = getCircuitState(); g.setColor(state.getValue(pt).getColor()); } else { g.setColor(Color.BLACK); } g.fillOval(pt.getX() - PIN_OFFS, pt.getY() - PIN_OFFS, PIN_RAD, PIN_RAD); g.setColor(curColor); } public void drawPins(Component comp) { Color curColor = g.getColor(); for (EndData e : comp.getEnds()) { Location pt = e.getLocation(); if (getShowState()) { CircuitState state = getCircuitState(); g.setColor(state.getValue(pt).getColor()); } else { g.setColor(Color.BLACK); } g.fillOval(pt.getX() - PIN_OFFS, pt.getY() - PIN_OFFS, PIN_RAD, PIN_RAD); } g.setColor(curColor); } public void drawClock(Component comp, int i, Direction dir) { Color curColor = g.getColor(); g.setColor(Color.BLACK); GraphicsUtil.switchToWidth(g, 2); EndData e = comp.getEnd(i); Location pt = e.getLocation(); int x = pt.getX(); int y = pt.getY(); final int CLK_SZ = 4; final int CLK_SZD = CLK_SZ - 1; if (dir == Direction.NORTH) { g.drawLine(x - CLK_SZD, y - 1, x, y - CLK_SZ); g.drawLine(x + CLK_SZD, y - 1, x, y - CLK_SZ); } else if (dir == Direction.SOUTH) { g.drawLine(x - CLK_SZD, y + 1, x, y + CLK_SZ); g.drawLine(x + CLK_SZD, y + 1, x, y + CLK_SZ); } else if (dir == Direction.EAST) { g.drawLine(x + 1, y - CLK_SZD, x + CLK_SZ, y); g.drawLine(x + 1, y + CLK_SZD, x + CLK_SZ, y); } else if (dir == Direction.WEST) { g.drawLine(x - 1, y - CLK_SZD, x - CLK_SZ, y); g.drawLine(x - 1, y + CLK_SZD, x - CLK_SZ, y); } g.setColor(curColor); GraphicsUtil.switchToWidth(g, 1); } public void drawHandles(Component comp) { Bounds b = comp.getBounds(g); int left = b.getX(); int right = left + b.getWidth(); int top = b.getY(); int bot = top + b.getHeight(); drawHandle(right, top); drawHandle(left, bot); drawHandle(right, bot); drawHandle(left, top); } public void drawHandle(Location loc) { drawHandle(loc.getX(), loc.getY()); } public void drawHandle(int x, int y) { g.setColor(Color.white); g.fillRect(x - 3, y - 3, 7, 7); g.setColor(Color.black); g.drawRect(x - 3, y - 3, 7, 7); } } logisim-2.7.1/src/com/cburch/logisim/comp/Component.java0000644000175000017500000000452011446034572023112 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.comp; import java.awt.Graphics; import java.util.List; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Location; public interface Component { // listener methods public void addComponentListener(ComponentListener l); public void removeComponentListener(ComponentListener l); // basic information methods public ComponentFactory getFactory(); public AttributeSet getAttributeSet(); // location/extent methods public Location getLocation(); public Bounds getBounds(); public Bounds getBounds(Graphics g); public boolean contains(Location pt); public boolean contains(Location pt, Graphics g); // user interface methods public void expose(ComponentDrawContext context); public void draw(ComponentDrawContext context); /** * Retrieves information about a special-purpose feature for this * component. This technique allows future Logisim versions to add * new features for components without requiring changes to existing * components. It also removes the necessity for the Component API to * directly declare methods for each individual feature. * In most cases, the key is a Class object * corresponding to an interface, and the method should return an * implementation of that interface if it supports the feature. * * As of this writing, possible values for key include: * Pokable.class, CustomHandles.class, * WireRepair.class, TextEditable.class, * MenuExtender.class, ToolTipMaker.class, * ExpressionComputer.class, and Loggable.class. * * @param key an object representing a feature. * @return an object representing information about how the component * supports the feature, or null if it does not support * the feature. */ public Object getFeature(Object key); // propagation methods public List getEnds(); // list of EndDatas public EndData getEnd(int index); public boolean endsAt(Location pt); public void propagate(CircuitState state); } logisim-2.7.1/src/com/cburch/logisim/comp/AbstractComponentFactory.java0000644000175000017500000000540611446034572026132 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.comp; import java.awt.Color; import java.awt.Graphics; import javax.swing.Icon; import com.cburch.logisim.LogisimVersion; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.AttributeSets; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.util.GraphicsUtil; import com.cburch.logisim.util.Icons; import com.cburch.logisim.util.StringGetter; import com.cburch.logisim.util.StringUtil; public abstract class AbstractComponentFactory implements ComponentFactory { private static final Icon toolIcon = Icons.getIcon("subcirc.gif"); private AttributeSet defaultSet; protected AbstractComponentFactory() { defaultSet = null; } @Override public String toString() { return getName(); } public abstract String getName(); public String getDisplayName() { return getDisplayGetter().get(); } public StringGetter getDisplayGetter() { return StringUtil.constantGetter(getName()); } public abstract Component createComponent(Location loc, AttributeSet attrs); public abstract Bounds getOffsetBounds(AttributeSet attrs); public AttributeSet createAttributeSet() { return AttributeSets.EMPTY; } public boolean isAllDefaultValues(AttributeSet attrs, LogisimVersion ver) { return false; } public Object getDefaultAttributeValue(Attribute attr, LogisimVersion ver) { AttributeSet dfltSet = defaultSet; if (dfltSet == null) { dfltSet = (AttributeSet) createAttributeSet().clone(); defaultSet = dfltSet; } return dfltSet.getValue(attr); } // // user interface methods // public void drawGhost(ComponentDrawContext context, Color color, int x, int y, AttributeSet attrs) { Graphics g = context.getGraphics(); Bounds bds = getOffsetBounds(attrs); g.setColor(color); GraphicsUtil.switchToWidth(g, 2); g.drawRect(x + bds.getX(), y + bds.getY(), bds.getWidth(), bds.getHeight()); } public void paintIcon(ComponentDrawContext context, int x, int y, AttributeSet attrs) { Graphics g = context.getGraphics(); if (toolIcon != null) { toolIcon.paintIcon(context.getDestination(), g, x + 2, y + 2); } else { g.setColor(Color.black); g.drawRect(x + 5, y + 2, 11, 17); Value[] v = { Value.TRUE, Value.FALSE }; for (int i = 0; i < 3; i++) { g.setColor(v[i % 2].getColor()); g.fillOval(x + 5 - 1, y + 5 + 5 * i - 1, 3, 3); g.setColor(v[(i + 1) % 2].getColor()); g.fillOval(x + 16 - 1, y + 5 + 5 * i - 1, 3, 3); } } } public Object getFeature(Object key, AttributeSet attrs) { return null; } } logisim-2.7.1/src/com/cburch/logisim/comp/AbstractComponent.java0000644000175000017500000000251511446034572024600 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.comp; import java.awt.Graphics; import java.util.List; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Location; public abstract class AbstractComponent implements Component { protected AbstractComponent() { } // // basic information methods // public abstract ComponentFactory getFactory(); // // location/extent methods // public abstract Location getLocation(); public abstract Bounds getBounds(); public Bounds getBounds(Graphics g) { return getBounds(); } public boolean contains(Location pt) { Bounds bds = getBounds(); if (bds == null) return false; return bds.contains(pt, 1); } public boolean contains(Location pt, Graphics g) { Bounds bds = getBounds(g); if (bds == null) return false; return bds.contains(pt, 1); } // // propagation methods // public abstract List getEnds(); public EndData getEnd(int index) { return getEnds().get(index); } public boolean endsAt(Location pt) { for (EndData data : getEnds()) { if (data.getLocation().equals(pt)) return true; } return false; } public abstract void propagate(CircuitState state); } logisim-2.7.1/src/com/cburch/logisim/circuit/0000755000175000017500000000000011541661312021002 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/logisim/circuit/WireUtil.java0000644000175000017500000000404311446034526023417 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import com.cburch.logisim.comp.Component; import com.cburch.logisim.data.Location; public class WireUtil { private WireUtil() { } static CircuitPoints computeCircuitPoints(Collection components) { CircuitPoints points = new CircuitPoints(); for (Component comp : components) { points.add(comp); } return points; } // Merge all parallel endpoint-to-endpoint wires within the given set. public static Collection mergeExclusive(Collection toMerge) { if (toMerge.size() <= 1) return toMerge; HashSet ret = new HashSet(toMerge); CircuitPoints points = computeCircuitPoints(toMerge); HashSet wires = new HashSet(); for (Location loc : points.getSplitLocations()) { Collection at = points.getComponents(loc); if (at.size() == 2) { Iterator atIt = at.iterator(); Component o0 = atIt.next(); Component o1 = atIt.next(); if (o0 instanceof Wire && o1 instanceof Wire) { Wire w0 = (Wire) o0; Wire w1 = (Wire) o1; if (w0.is_x_equal == w1.is_x_equal) { wires.add(w0); wires.add(w1); } } } } points = null; ret.removeAll(wires); while (!wires.isEmpty()) { Iterator it = wires.iterator(); Wire w = it.next(); Location e0 = w.e0; Location e1 = w.e1; it.remove(); boolean found; do { found = false; for (it = wires.iterator(); it.hasNext(); ) { Wire cand = it.next(); if (cand.e0.equals(e1)) { e1 = cand.e1; found = true; it.remove(); } else if (cand.e1.equals(e0)) { e0 = cand.e0; found = true; it.remove(); } } } while (found); ret.add(Wire.create(e0, e1)); } return ret; } } logisim-2.7.1/src/com/cburch/logisim/circuit/WireThread.java0000644000175000017500000000144711446034526023716 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; import com.cburch.logisim.util.SmallSet; class WireThread { private WireThread parent; private SmallSet bundles = new SmallSet(); WireThread() { parent = this; } SmallSet getBundles() { return bundles; } void unite(WireThread other) { WireThread group = this.find(); WireThread group2 = other.find(); if (group != group2) group.parent = group2; } WireThread find() { WireThread ret = this; if (ret.parent != ret) { do ret = ret.parent; while (ret.parent != ret); this.parent = ret; } return ret; } } logisim-2.7.1/src/com/cburch/logisim/circuit/WireSet.java0000644000175000017500000000166611446034526023245 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; import java.util.Collections; import java.util.HashSet; import java.util.Set; import com.cburch.logisim.data.Location; public class WireSet { private static final Set NULL_WIRES = Collections.emptySet(); public static final WireSet EMPTY = new WireSet(NULL_WIRES); private Set wires; private Set points; WireSet(Set wires) { if (wires.isEmpty()) { this.wires = NULL_WIRES; points = Collections.emptySet(); } else { this.wires = wires; points = new HashSet(); for (Wire w : wires) { points.add(w.e0); points.add(w.e1); } } } public boolean containsWire(Wire w) { return wires.contains(w); } public boolean containsLocation(Location loc) { return points.contains(loc); } } logisim-2.7.1/src/com/cburch/logisim/circuit/WireRepair.java0000644000175000017500000001467111451540054023726 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.IdentityHashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.TreeSet; import com.cburch.logisim.comp.Component; import com.cburch.logisim.data.Location; class WireRepair extends CircuitTransaction { private static class MergeSets { private final HashMap> map; MergeSets() { map = new HashMap>(); } void merge(Wire a, Wire b) { ArrayList set0 = map.get(a); ArrayList set1 = map.get(b); if (set0 == null && set1 == null) { set0 = new ArrayList(2); set0.add(a); set0.add(b); map.put(a, set0); map.put(b, set0); } else if (set0 == null && set1 != null) { set1.add(a); map.put(a, set1); } else if (set0 != null && set1 == null) { set0.add(b); map.put(b, set0); } else if (set0 != set1) { // neither is null, and they are different if (set0.size() > set1.size()) { // ensure set1 is the larger ArrayList temp = set0; set0 = set1; set1 = temp; } set1.addAll(set0); for (Wire w : set0) { map.put(w, set1); } } } Collection> getMergeSets() { IdentityHashMap,Boolean> lists; lists = new IdentityHashMap,Boolean>(); for (ArrayList list : map.values()) { lists.put(list, Boolean.TRUE); } return lists.keySet(); } } private Circuit circuit; public WireRepair(Circuit circuit) { this.circuit = circuit; } @Override protected Map getAccessedCircuits() { return Collections.singletonMap(circuit, READ_WRITE); } @Override protected void run(CircuitMutator mutator) { doMerges(mutator); doOverlaps(mutator); doSplits(mutator); } /* for debugging: private void printWires(String prefix, PrintStream out) { boolean first = true; for (Wire w : circuit.getWires()) { if (first) { out.println(prefix + ": " + w); first = false; } else { out.println(" " + w); } } out.println(prefix + ": none"); } */ private void doMerges(CircuitMutator mutator) { MergeSets sets = new MergeSets(); for (Location loc : circuit.wires.points.getSplitLocations()) { Collection at = circuit.getComponents(loc); if (at.size() == 2) { Iterator atit = at.iterator(); Object at0 = atit.next(); Object at1 = atit.next(); if (at0 instanceof Wire && at1 instanceof Wire) { Wire w0 = (Wire) at0; Wire w1 = (Wire) at1; if (w0.isParallel(w1)) { sets.merge(w0, w1); } } } } ReplacementMap repl = new ReplacementMap(); for (ArrayList mergeSet : sets.getMergeSets()) { if (mergeSet.size() > 1) { ArrayList locs = new ArrayList(2 * mergeSet.size()); for (Wire w : mergeSet) { locs.add(w.getEnd0()); locs.add(w.getEnd1()); } Collections.sort(locs); Location e0 = locs.get(0); Location e1 = locs.get(locs.size() - 1); Wire wnew = Wire.create(e0, e1); Collection wset = Collections.singleton(wnew); for (Wire w : mergeSet) { if (!w.equals(wset)) { repl.put(w, wset); } } } } mutator.replace(circuit, repl); } private void doOverlaps(CircuitMutator mutator) { HashMap> wirePoints; wirePoints = new HashMap>(); for (Wire w : circuit.getWires()) { for (Location loc : w) { ArrayList locWires = wirePoints.get(loc); if (locWires == null) { locWires = new ArrayList(3); wirePoints.put(loc, locWires); } locWires.add(w); } } MergeSets mergeSets = new MergeSets(); for (ArrayList locWires : wirePoints.values()) { if (locWires.size() > 1) { for (int i = 0, n = locWires.size(); i < n; i++) { Wire w0 = locWires.get(i); for (int j = i + 1; j < n; j++) { Wire w1 = locWires.get(j); if (w0.overlaps(w1, false)) { mergeSets.merge(w0, w1); } } } } } ReplacementMap replacements = new ReplacementMap(); Set splitLocs = circuit.wires.points.getSplitLocations(); for (ArrayList mergeSet : mergeSets.getMergeSets()) { if (mergeSet.size() > 1) { doMergeSet(mergeSet, replacements, splitLocs); } } mutator.replace(circuit, replacements); } private void doMergeSet(ArrayList mergeSet, ReplacementMap replacements, Set splitLocs) { TreeSet ends = new TreeSet(); for (Wire w : mergeSet) { ends.add(w.getEnd0()); ends.add(w.getEnd1()); } Wire whole = Wire.create(ends.first(), ends.last()); TreeSet mids = new TreeSet(); mids.add(whole.getEnd0()); mids.add(whole.getEnd1()); for (Location loc : whole) { if (splitLocs.contains(loc)) { for (Component comp : circuit.getComponents(loc)) { if (!mergeSet.contains(comp)) { mids.add(loc); break; } } } } ArrayList mergeResult = new ArrayList(); if (mids.size() == 2) { mergeResult.add(whole); } else { Location e0 = mids.first(); for (Location e1 : mids) { mergeResult.add(Wire.create(e0, e1)); e0 = e1; } } for (Wire w : mergeSet) { ArrayList wRepl = new ArrayList(2); for (Wire w2 : mergeResult) { if (w2.overlaps(w, false)) { wRepl.add(w2); } } replacements.put(w, wRepl); } } private void doSplits(CircuitMutator mutator) { Set splitLocs = circuit.wires.points.getSplitLocations(); ReplacementMap repl = new ReplacementMap(); for (Wire w : circuit.getWires()) { Location w0 = w.getEnd0(); Location w1 = w.getEnd1(); ArrayList splits = null; for (Location loc : splitLocs) { if (w.contains(loc) && !loc.equals(w0) && !loc.equals(w1)) { if (splits == null) splits = new ArrayList(); splits.add(loc); } } if (splits != null) { splits.add(w1); Collections.sort(splits); Location e0 = w0; ArrayList subs = new ArrayList(splits.size()); for (Location e1 : splits) { subs.add(Wire.create(e0, e1)); e0 = e1; } repl.put(w, subs); } } mutator.replace(circuit, repl); } } logisim-2.7.1/src/com/cburch/logisim/circuit/WireIterator.java0000644000175000017500000000261011500267076024270 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; import java.util.Iterator; import com.cburch.logisim.data.Location; class WireIterator implements Iterator { private int curX; private int curY; private int destX; private int destY; private int deltaX; private int deltaY; private boolean destReturned; public WireIterator(Location e0, Location e1) { curX = e0.getX(); curY = e0.getY(); destX = e1.getX(); destY = e1.getY(); destReturned = false; if (curX < destX) deltaX = 10; else if (curX > destX) deltaX = -10; else deltaX = 0; if (curY < destY) deltaY = 10; else if (curY > destY) deltaY = -10; else deltaY = 0; int offX = (destX - curX) % 10; if (offX != 0) { // should not happen, but in case it does... destX = curX + deltaX * ((destX - curX) / 10); } int offY = (destY - curY) % 10; if (offY != 0) { // should not happen, but in case it does... destY = curY + deltaY * ((destY - curY) / 10); } } public boolean hasNext() { return !destReturned; } public Location next() { Location ret = Location.create(curX, curY); destReturned |= curX == destX && curY == destY; curX += deltaX; curY += deltaY; return ret; } public void remove() { throw new UnsupportedOperationException(); } } logisim-2.7.1/src/com/cburch/logisim/circuit/WireFactory.java0000644000175000017500000000412011446034526024105 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; import java.awt.Graphics; import java.awt.Color; import com.cburch.logisim.comp.Component; import com.cburch.logisim.comp.AbstractComponentFactory; import com.cburch.logisim.comp.ComponentDrawContext; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Location; import com.cburch.logisim.util.GraphicsUtil; import com.cburch.logisim.util.StringGetter; class WireFactory extends AbstractComponentFactory { public static final WireFactory instance = new WireFactory(); private WireFactory() { } @Override public String getName() { return "Wire"; } @Override public StringGetter getDisplayGetter() { return Strings.getter("wireComponent"); } @Override public AttributeSet createAttributeSet() { return Wire.create(Location.create(0, 0), Location.create(100, 0)); } @Override public Component createComponent(Location loc, AttributeSet attrs) { Object dir = attrs.getValue(Wire.dir_attr); int len = attrs.getValue(Wire.len_attr).intValue(); if (dir == Wire.VALUE_HORZ) { return Wire.create(loc, loc.translate(len, 0)); } else { return Wire.create(loc, loc.translate(0, len)); } } @Override public Bounds getOffsetBounds(AttributeSet attrs) { Object dir = attrs.getValue(Wire.dir_attr); int len = attrs.getValue(Wire.len_attr).intValue(); if (dir == Wire.VALUE_HORZ) { return Bounds.create(0, -2, len, 5); } else { return Bounds.create(-2, 0, 5, len); } } // // user interface methods // @Override public void drawGhost(ComponentDrawContext context, Color color, int x, int y, AttributeSet attrs) { Graphics g = context.getGraphics(); Object dir = attrs.getValue(Wire.dir_attr); int len = attrs.getValue(Wire.len_attr).intValue(); g.setColor(color); GraphicsUtil.switchToWidth(g, 3); if (dir == Wire.VALUE_HORZ) { g.drawLine(x, y, x + len, y); } else { g.drawLine(x, y, x, y + len); } } } logisim-2.7.1/src/com/cburch/logisim/circuit/WireBundle.java0000644000175000017500000000456011446034526023717 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.util.SmallSet; class WireBundle { private BitWidth width = BitWidth.UNKNOWN; private Value pullValue = Value.UNKNOWN; private WireBundle parent; private Location widthDeterminant = null; WireThread[] threads = null; SmallSet points = new SmallSet(); // points bundle hits private WidthIncompatibilityData incompatibilityData = null; WireBundle() { parent = this; } boolean isValid() { return incompatibilityData == null; } void setWidth(BitWidth width, Location det) { if (width == BitWidth.UNKNOWN) return; if (incompatibilityData != null) { incompatibilityData.add(det, width); return; } if (this.width != BitWidth.UNKNOWN) { if (width.equals(this.width)) { return; // the widths match, and the bundle is already set; nothing to do } else { // the widths are broken: Create incompatibilityData holding this info incompatibilityData = new WidthIncompatibilityData(); incompatibilityData.add(widthDeterminant, this.width); incompatibilityData.add(det, width); return; } } this.width = width; this.widthDeterminant = det; this.threads = new WireThread[width.getWidth()]; for (int i = 0; i < threads.length; i++) { threads[i] = new WireThread(); } } BitWidth getWidth() { if (incompatibilityData != null) { return BitWidth.UNKNOWN; } else { return width; } } Location getWidthDeterminant() { if (incompatibilityData != null) { return null; } else { return widthDeterminant; } } WidthIncompatibilityData getWidthIncompatibilityData() { return incompatibilityData; } void isolate() { parent = this; } void unite(WireBundle other) { WireBundle group = this.find(); WireBundle group2 = other.find(); if (group != group2) group.parent = group2; } WireBundle find() { WireBundle ret = this; if (ret.parent != ret) { do ret = ret.parent; while (ret.parent != ret); this.parent = ret; } return ret; } void addPullValue(Value val) { pullValue = pullValue.combine(val); } Value getPullValue() { return pullValue; } } logisim-2.7.1/src/com/cburch/logisim/circuit/Wire.java0000644000175000017500000001767711446034526022602 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; import java.awt.Graphics; import java.util.AbstractList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import com.cburch.logisim.comp.Component; import com.cburch.logisim.comp.ComponentFactory; import com.cburch.logisim.comp.ComponentDrawContext; import com.cburch.logisim.comp.ComponentListener; import com.cburch.logisim.comp.EndData; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeListener; import com.cburch.logisim.data.AttributeOption; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Attributes; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Location; import com.cburch.logisim.tools.CustomHandles; import com.cburch.logisim.util.Cache; import com.cburch.logisim.util.GraphicsUtil; public final class Wire implements Component, AttributeSet, CustomHandles, Iterable { /** Stroke width when drawing wires. */ public static final int WIDTH = 3; public static final AttributeOption VALUE_HORZ = new AttributeOption("horz", Strings.getter("wireDirectionHorzOption")); public static final AttributeOption VALUE_VERT = new AttributeOption("vert", Strings.getter("wireDirectionVertOption")); public static final Attribute dir_attr = Attributes.forOption("direction", Strings.getter("wireDirectionAttr"), new AttributeOption[] { VALUE_HORZ, VALUE_VERT }); public static final Attribute len_attr = Attributes.forInteger("length", Strings.getter("wireLengthAttr")); private static final List> ATTRIBUTES = Arrays.asList(new Attribute[] { dir_attr, len_attr }); private static final Cache cache = new Cache(); public static Wire create(Location e0, Location e1) { return (Wire) cache.get(new Wire(e0, e1)); } private class EndList extends AbstractList { @Override public EndData get(int i) { return getEnd(i); } @Override public int size() { return 2; } } final Location e0; final Location e1; final boolean is_x_equal; private Wire(Location e0, Location e1) { this.is_x_equal = e0.getX() == e1.getX(); if (is_x_equal) { if (e0.getY() > e1.getY()) { this.e0 = e1; this.e1 = e0; } else { this.e0 = e0; this.e1 = e1; } } else { if (e0.getX() > e1.getX()) { this.e0 = e1; this.e1 = e0; } else { this.e0 = e0; this.e1 = e1; } } } @Override public boolean equals(Object other) { if (!(other instanceof Wire)) return false; Wire w = (Wire) other; return w.e0.equals(this.e0) && w.e1.equals(this.e1); } @Override public int hashCode() { return e0.hashCode() * 31 + e1.hashCode(); } public int getLength() { return (e1.getY() - e0.getY()) + (e1.getX() - e0.getX()); } @Override public String toString() { return "Wire[" + e0 + "-" + e1 + "]"; } // // Component methods // // (Wire never issues ComponentEvents, so we don't need to track listeners) public void addComponentListener(ComponentListener e) { } public void removeComponentListener(ComponentListener e) { } public ComponentFactory getFactory() { return WireFactory.instance; } public AttributeSet getAttributeSet() { return this; } // location/extent methods public Location getLocation() { return e0; } public Bounds getBounds() { int x0 = e0.getX(); int y0 = e0.getY(); return Bounds.create(x0 - 2, y0 - 2, e1.getX() - x0 + 5, e1.getY() - y0 + 5); } public Bounds getBounds(Graphics g) { return getBounds(); } public boolean contains(Location q) { int qx = q.getX(); int qy = q.getY(); if (is_x_equal) { int wx = e0.getX(); return qx >= wx - 2 && qx <= wx + 2 && e0.getY() <= qy && qy <= e1.getY(); } else { int wy = e0.getY(); return qy >= wy - 2 && qy <= wy + 2 && e0.getX() <= qx && qx <= e1.getX(); } } public boolean contains(Location pt, Graphics g) { return contains(pt); } // // propagation methods // public List getEnds() { return new EndList(); } public EndData getEnd(int index) { Location loc = getEndLocation(index); return new EndData(loc, BitWidth.UNKNOWN, EndData.INPUT_OUTPUT); } public boolean endsAt(Location pt) { return e0.equals(pt) || e1.equals(pt); } public void propagate(CircuitState state) { // Normally this is handled by CircuitWires, and so it won't get // called. The exception is when a wire is added or removed state.markPointAsDirty(e0); state.markPointAsDirty(e1); } // // user interface methods // public void expose(ComponentDrawContext context) { java.awt.Component dest = context.getDestination(); int x0 = e0.getX(); int y0 = e0.getY(); dest.repaint(x0 - 5, y0 - 5, e1.getX() - x0 + 10, e1.getY() - y0 + 10); } public void draw(ComponentDrawContext context) { CircuitState state = context.getCircuitState(); Graphics g = context.getGraphics(); GraphicsUtil.switchToWidth(g, WIDTH); g.setColor(state.getValue(e0).getColor()); g.drawLine(e0.getX(), e0.getY(), e1.getX(), e1.getY()); } public Object getFeature(Object key) { if (key == CustomHandles.class) return this; return null; } // // AttributeSet methods // // It makes some sense for a wire to be its own attribute, since // after all it is immutable. // @Override public Object clone() { return this; } public void addAttributeListener(AttributeListener l) { } public void removeAttributeListener(AttributeListener l) { } public List> getAttributes() { return ATTRIBUTES; } public boolean containsAttribute(Attribute attr) { return ATTRIBUTES.contains(attr); } public Attribute getAttribute(String name) { for (Attribute attr : ATTRIBUTES) { if (name.equals(attr.getName())) return attr; } return null; } public boolean isReadOnly(Attribute attr) { return true; } public void setReadOnly(Attribute attr, boolean value) { throw new UnsupportedOperationException(); } public boolean isToSave(Attribute attr) { return false; } @SuppressWarnings("unchecked") public V getValue(Attribute attr) { if (attr == dir_attr) { return (V) (is_x_equal ? VALUE_VERT : VALUE_HORZ); } else if (attr == len_attr) { return (V) Integer.valueOf(getLength()); } else { return null; } } public void setValue(Attribute attr, V value) { throw new IllegalArgumentException("read only attribute"); } // // other methods // public boolean isVertical() { return is_x_equal; } public Location getEndLocation(int index) { return index == 0 ? e0 : e1; } public Location getEnd0() { return e0; } public Location getEnd1() { return e1; } public Location getOtherEnd(Location loc) { return (loc.equals(e0) ? e1 : e0); } public boolean sharesEnd(Wire other) { return this.e0.equals(other.e0) || this.e1.equals(other.e0) || this.e0.equals(other.e1) || this.e1.equals(other.e1); } public boolean overlaps(Wire other, boolean includeEnds) { return overlaps(other.e0, other.e1, includeEnds); } private boolean overlaps(Location q0, Location q1, boolean includeEnds) { if (is_x_equal) { int x0 = q0.getX(); if (x0 != q1.getX() || x0 != e0.getX()) return false; if (includeEnds) { return e1.getY() >= q0.getY() && e0.getY() <= q1.getY(); } else { return e1.getY() > q0.getY() && e0.getY() < q1.getY(); } } else { int y0 = q0.getY(); if (y0 != q1.getY() || y0 != e0.getY()) return false; if (includeEnds) { return e1.getX() >= q0.getX() && e0.getX() <= q1.getX(); } else { return e1.getX() > q0.getX() && e0.getX() < q1.getX(); } } } public boolean isParallel(Wire other) { return this.is_x_equal == other.is_x_equal; } public Iterator iterator() { return new WireIterator(e0, e1); } public void drawHandles(ComponentDrawContext context) { context.drawHandle(e0); context.drawHandle(e1); } } logisim-2.7.1/src/com/cburch/logisim/circuit/WidthIncompatibilityData.java0000644000175000017500000000300511446034526026602 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; import java.util.ArrayList; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Location; public class WidthIncompatibilityData { private ArrayList points; private ArrayList widths; public WidthIncompatibilityData() { points = new ArrayList(); widths = new ArrayList(); } public void add(Location p, BitWidth w) { for (int i = 0; i < points.size(); i++) { if (p.equals(points.get(i)) && w.equals(widths.get(i))) return; } points.add(p); widths.add(w); } public int size() { return points.size(); } public Location getPoint(int i) { return points.get(i); } public BitWidth getBitWidth(int i) { return widths.get(i); } @Override public boolean equals(Object other) { if (!(other instanceof WidthIncompatibilityData)) return false; if (this == other) return true; WidthIncompatibilityData o = (WidthIncompatibilityData) other; if (this.size() != o.size()) return false; for (int i = 0; i < this.size(); i++) { Location p = this.getPoint(i); BitWidth w = this.getBitWidth(i); boolean matched = false; for (int j = 0; j < o.size(); j++) { Location q = this.getPoint(j); BitWidth x = this.getBitWidth(j); if (p.equals(q) && w.equals(x)) { matched = true; break; } } if (!matched) return false; } return true; } } logisim-2.7.1/src/com/cburch/logisim/circuit/SubcircuitPoker.java0000644000175000017500000000517211446663002024771 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; import java.awt.Color; import java.awt.Graphics; import java.awt.event.MouseEvent; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.gui.main.Canvas; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstancePoker; import com.cburch.logisim.instance.InstanceState; public class SubcircuitPoker extends InstancePoker { private static final Color MAGNIFYING_INTERIOR = new Color(200, 200, 255, 64); private static final Color MAGNIFYING_INTERIOR_DOWN = new Color(128, 128, 255, 192); private boolean mouseDown; @Override public Bounds getBounds(InstancePainter painter) { Bounds bds = painter.getInstance().getBounds(); int cx = bds.getX() + bds.getWidth() / 2; int cy = bds.getY() + bds.getHeight() / 2; return Bounds.create(cx - 5, cy - 5, 15, 15); } @Override public void paint(InstancePainter painter) { if (painter.getDestination() instanceof Canvas && painter.getData() instanceof CircuitState) { Bounds bds = painter.getInstance().getBounds(); int cx = bds.getX() + bds.getWidth() / 2; int cy = bds.getY() + bds.getHeight() / 2; int tx = cx + 3; int ty = cy + 3; int[] xp = { tx - 1, cx + 8, cx + 10, tx + 1 }; int[] yp = { ty + 1, cy + 10, cy + 8, ty - 1 }; Graphics g = painter.getGraphics(); if (mouseDown) { g.setColor(MAGNIFYING_INTERIOR_DOWN); } else { g.setColor(MAGNIFYING_INTERIOR); } g.fillOval(cx - 5, cy - 5, 10, 10); g.setColor(Color.BLACK); g.drawOval(cx - 5, cy - 5, 10, 10); g.fillPolygon(xp, yp, xp.length); } } @Override public void mousePressed(InstanceState state, MouseEvent e) { if (isWithin(state, e)) { mouseDown = true; state.getInstance().fireInvalidated(); } } @Override public void mouseReleased(InstanceState state, MouseEvent e) { if (mouseDown) { mouseDown = false; Object sub = state.getData(); if (e.getClickCount() == 2 && isWithin(state, e) && sub instanceof CircuitState) { state.getProject().setCircuitState((CircuitState) sub); } else { state.getInstance().fireInvalidated(); } } } private boolean isWithin(InstanceState state, MouseEvent e) { Bounds bds = state.getInstance().getBounds(); int cx = bds.getX() + bds.getWidth() / 2; int cy = bds.getY() + bds.getHeight() / 2; int dx = e.getX() - cx; int dy = e.getY() - cy; return dx * dx + dy * dy <= 60; } } logisim-2.7.1/src/com/cburch/logisim/circuit/SubcircuitFactory.java0000644000175000017500000002473511524651526025333 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Composite; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.util.Map; import javax.swing.JPopupMenu; import javax.swing.JMenuItem; import com.cburch.logisim.comp.Component; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.proj.Project; import com.cburch.logisim.std.wiring.Pin; import com.cburch.logisim.tools.MenuExtender; import com.cburch.logisim.util.GraphicsUtil; import com.cburch.logisim.util.StringGetter; import com.cburch.logisim.util.StringUtil; public class SubcircuitFactory extends InstanceFactory { private class CircuitFeature implements StringGetter, MenuExtender, ActionListener { private Instance instance; private Project proj; public CircuitFeature(Instance instance) { this.instance = instance; } public String get() { return source.getName(); } public void configureMenu(JPopupMenu menu, Project proj) { this.proj = proj; String name = instance.getFactory().getDisplayName(); String text = Strings.get("subcircuitViewItem", name); JMenuItem item = new JMenuItem(text); item.addActionListener(this); menu.add(item); } public void actionPerformed(ActionEvent e) { CircuitState superState = proj.getCircuitState(); if (superState == null) return; CircuitState subState = getSubstate(superState, instance); if (subState == null) return; proj.setCircuitState(subState); } } private Circuit source; public SubcircuitFactory(Circuit source) { super("", null); this.source = source; setFacingAttribute(StdAttr.FACING); setDefaultToolTip(new CircuitFeature(null)); setInstancePoker(SubcircuitPoker.class); } public Circuit getSubcircuit() { return source; } @Override public String getName() { return source.getName(); } @Override public StringGetter getDisplayGetter() { return StringUtil.constantGetter(source.getName()); } @Override public Bounds getOffsetBounds(AttributeSet attrs) { Direction facing = attrs.getValue(StdAttr.FACING); Direction defaultFacing = source.getAppearance().getFacing(); Bounds bds = source.getAppearance().getOffsetBounds(); return bds.rotate(defaultFacing, facing, 0, 0); } @Override public AttributeSet createAttributeSet() { return new CircuitAttributes(source); } // // methods for configuring instances // @Override public void configureNewInstance(Instance instance) { CircuitAttributes attrs = (CircuitAttributes) instance.getAttributeSet(); attrs.setSubcircuit(instance); instance.addAttributeListener(); computePorts(instance); // configureLabel(instance); already done in computePorts } @Override public void instanceAttributeChanged(Instance instance, Attribute attr) { if (attr == StdAttr.FACING) { computePorts(instance); } else if (attr == CircuitAttributes.LABEL_LOCATION_ATTR) { configureLabel(instance); } } @Override public Object getInstanceFeature(Instance instance, Object key) { if (key == MenuExtender.class) return new CircuitFeature(instance); return super.getInstanceFeature(instance, key); } void computePorts(Instance instance) { Direction facing = instance.getAttributeValue(StdAttr.FACING); Map portLocs = source.getAppearance().getPortOffsets(facing); Port[] ports = new Port[portLocs.size()]; Instance[] pins = new Instance[portLocs.size()]; int i = -1; for (Map.Entry portLoc : portLocs.entrySet()) { i++; Location loc = portLoc.getKey(); Instance pin = portLoc.getValue(); String type = Pin.FACTORY.isInputPin(pin) ? Port.INPUT : Port.OUTPUT; BitWidth width = pin.getAttributeValue(StdAttr.WIDTH); ports[i] = new Port(loc.getX(), loc.getY(), type, width); pins[i] = pin; String label = pin.getAttributeValue(StdAttr.LABEL); if (label != null && label.length() > 0) { ports[i].setToolTip(StringUtil.constantGetter(label)); } } CircuitAttributes attrs = (CircuitAttributes) instance.getAttributeSet(); attrs.setPinInstances(pins); instance.setPorts(ports); instance.recomputeBounds(); configureLabel(instance); // since this affects the circuit's bounds } private void configureLabel(Instance instance) { Bounds bds = instance.getBounds(); Direction loc = instance.getAttributeValue(CircuitAttributes.LABEL_LOCATION_ATTR); int x = bds.getX() + bds.getWidth() / 2; int y = bds.getY() + bds.getHeight() / 2; int ha = GraphicsUtil.H_CENTER; int va = GraphicsUtil.V_CENTER; if (loc == Direction.EAST) { x = bds.getX() + bds.getWidth() + 2; ha = GraphicsUtil.H_LEFT; } else if (loc == Direction.WEST) { x = bds.getX() - 2; ha = GraphicsUtil.H_RIGHT; } else if (loc == Direction.SOUTH) { y = bds.getY() + bds.getHeight() + 2; va = GraphicsUtil.V_TOP; } else { y = bds.getY() - 2; va = GraphicsUtil.V_BASELINE; } instance.setTextField(StdAttr.LABEL, StdAttr.LABEL_FONT, x, y, ha, va); } // // propagation-oriented methods // public CircuitState getSubstate(CircuitState superState, Instance instance) { return getSubstate(createInstanceState(superState, instance)); } public CircuitState getSubstate(CircuitState superState, Component comp) { return getSubstate(createInstanceState(superState, comp)); } private CircuitState getSubstate(InstanceState instanceState) { CircuitState subState = (CircuitState) instanceState.getData(); if (subState == null) { subState = new CircuitState(instanceState.getProject(), source); instanceState.setData(subState); instanceState.fireInvalidated(); } return subState; } @Override public void propagate(InstanceState superState) { CircuitState subState = getSubstate(superState); CircuitAttributes attrs = (CircuitAttributes) superState.getAttributeSet(); Instance[] pins = attrs.getPinInstances(); for (int i = 0; i < pins.length; i++) { Instance pin = pins[i]; InstanceState pinState = subState.getInstanceState(pin); if (Pin.FACTORY.isInputPin(pin)) { Value newVal = superState.getPort(i); Value oldVal = Pin.FACTORY.getValue(pinState); if (!newVal.equals(oldVal)) { Pin.FACTORY.setValue(pinState, newVal); Pin.FACTORY.propagate(pinState); } } else { // it is output-only Value val = pinState.getPort(0); superState.setPort(i, val, 1); } } } // // user interface features // @Override public void paintGhost(InstancePainter painter) { Graphics g = painter.getGraphics(); Color fg = g.getColor(); int v = fg.getRed() + fg.getGreen() + fg.getBlue(); Composite oldComposite = null; if (g instanceof Graphics2D && v > 50) { oldComposite = ((Graphics2D) g).getComposite(); Composite c = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f); ((Graphics2D) g).setComposite(c); } paintBase(painter, g); if (oldComposite != null) { ((Graphics2D) g).setComposite(oldComposite); } } @Override public void paintInstance(InstancePainter painter) { paintBase(painter, painter.getGraphics()); painter.drawPorts(); } private void paintBase(InstancePainter painter, Graphics g) { CircuitAttributes attrs = (CircuitAttributes) painter.getAttributeSet(); Direction facing = attrs.getFacing(); Direction defaultFacing = source.getAppearance().getFacing(); Location loc = painter.getLocation(); g.translate(loc.getX(), loc.getY()); source.getAppearance().paintSubcircuit(g, facing); drawCircuitLabel(painter, getOffsetBounds(attrs), facing, defaultFacing); g.translate(-loc.getX(), -loc.getY()); painter.drawLabel(); } private void drawCircuitLabel(InstancePainter painter, Bounds bds, Direction facing, Direction defaultFacing) { AttributeSet staticAttrs = source.getStaticAttributes(); String label = staticAttrs.getValue(CircuitAttributes.CIRCUIT_LABEL_ATTR); if (label != null && !label.equals("")) { Direction up = staticAttrs.getValue(CircuitAttributes.CIRCUIT_LABEL_FACING_ATTR); Font font = staticAttrs.getValue(CircuitAttributes.CIRCUIT_LABEL_FONT_ATTR); int back = label.indexOf('\\'); int lines = 1; boolean backs = false; while (back >= 0 && back <= label.length() - 2) { char c = label.charAt(back + 1); if (c == 'n') lines++; else if (c == '\\') backs = true; back = label.indexOf('\\', back + 2); } int x = bds.getX() + bds.getWidth() / 2; int y = bds.getY() + bds.getHeight() / 2; Graphics g = painter.getGraphics().create(); double angle = Math.PI / 2 - (up.toRadians() - defaultFacing.toRadians()) - facing.toRadians(); if (g instanceof Graphics2D && Math.abs(angle) > 0.01) { Graphics2D g2 = (Graphics2D) g; g2.rotate(angle, x, y); } g.setFont(font); if (lines == 1 && !backs) { GraphicsUtil.drawCenteredText(g, label, x, y); } else { FontMetrics fm = g.getFontMetrics(); int height = fm.getHeight(); y = y - (height * lines - fm.getLeading()) / 2 + fm.getAscent(); back = label.indexOf('\\'); while (back >= 0 && back <= label.length() - 2) { char c = label.charAt(back + 1); if (c == 'n') { String line = label.substring(0, back); GraphicsUtil.drawText(g, line, x, y, GraphicsUtil.H_CENTER, GraphicsUtil.V_BASELINE); y += height; label = label.substring(back + 2); back = label.indexOf('\\'); } else if (c == '\\') { label = label.substring(0, back) + label.substring(back + 1); back = label.indexOf('\\', back + 1); } else { back = label.indexOf('\\', back + 2); } } GraphicsUtil.drawText(g, label, x, y, GraphicsUtil.H_CENTER, GraphicsUtil.V_BASELINE); } g.dispose(); } } /* TODO public String getToolTip(ComponentUserEvent e) { return StringUtil.format(Strings.get("subcircuitCircuitTip"), source.getDisplayName()); } */ } logisim-2.7.1/src/com/cburch/logisim/circuit/Strings.java0000644000175000017500000000161611527054320023301 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.StringGetter; import com.cburch.logisim.util.StringUtil; class Strings { private static LocaleManager source = new LocaleManager("resources/logisim", "circuit"); public static String get(String key) { return source.get(key); } public static String get(String key, String arg) { return StringUtil.format(source.get(key), arg); } public static String get(String key, String arg0, String arg1) { return StringUtil.format(source.get(key), arg0, arg1); } public static StringGetter getter(String key) { return source.getter(key); } public static StringGetter getter(String key, String arg) { return source.getter(key, arg); } } logisim-2.7.1/src/com/cburch/logisim/circuit/SplitterParameters.java0000644000175000017500000000632211533246320025501 0ustar vincentvincent/* Copyright (c) 2011, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; import com.cburch.logisim.data.Direction; import com.cburch.logisim.util.GraphicsUtil; class SplitterParameters { private int dxEnd0; // location of split end 0 relative to origin private int dyEnd0; private int ddxEnd; // distance from split end i to split end (i + 1) private int ddyEnd; private int dxEndSpine; // distance from split end to spine private int dyEndSpine; private int dxSpine0; // distance from origin to far end of spine private int dySpine0; private int dxSpine1; // distance from origin to near end of spine private int dySpine1; private int textAngle; // angle to rotate text private int halign; // justification of text private int valign; SplitterParameters(SplitterAttributes attrs) { Object appear = attrs.appear; int fanout = attrs.fanout; Direction facing = attrs.facing; int justify; if (appear == SplitterAttributes.APPEAR_CENTER || appear == SplitterAttributes.APPEAR_LEGACY) { justify = 0; } else if (appear == SplitterAttributes.APPEAR_RIGHT) { justify = 1; } else { justify = -1; } int width = 20; int offs = 6; if (facing == Direction.NORTH || facing == Direction.SOUTH) { // ^ or V int m = facing == Direction.NORTH ? 1 : -1; dxEnd0 = justify == 0 ? 10 * ((fanout + 1) / 2 - 1) : m * justify < 0 ? -10 : 10 * fanout; dyEnd0 = -m * width; ddxEnd = -10; ddyEnd = 0; dxEndSpine = 0; dyEndSpine = m * (width - offs); dxSpine0 = m * justify * (10 * fanout - 1); dySpine0 = -m * offs; dxSpine1 = m * justify * offs; dySpine1 = -m * offs; textAngle = 90; halign = m > 0 ? GraphicsUtil.H_RIGHT : GraphicsUtil.H_LEFT; valign = m * justify <= 0 ? GraphicsUtil.V_BASELINE : GraphicsUtil.V_TOP; } else { // > or < int m = facing == Direction.WEST ? -1 : 1; dxEnd0 = m * width; dyEnd0 = justify == 0 ? -10 * (fanout / 2) : m * justify > 0 ? 10 : -10 * fanout; ddxEnd = 0; ddyEnd = 10; dxEndSpine = -m * (width - offs); dyEndSpine = 0; dxSpine0 = m * offs; dySpine0 = m * justify * (10 * fanout - 1); dxSpine1 = m * offs; dySpine1 = m * justify * offs; textAngle = 0; halign = m > 0 ? GraphicsUtil.H_LEFT : GraphicsUtil.H_RIGHT; valign = m * justify < 0 ? GraphicsUtil.V_TOP : GraphicsUtil.V_BASELINE; } } public int getEnd0X() { return dxEnd0; } public int getEnd0Y() { return dyEnd0; } public int getEndToEndDeltaX() { return ddxEnd; } public int getEndToEndDeltaY() { return ddyEnd; } public int getEndToSpineDeltaX() { return dxEndSpine; } public int getEndToSpineDeltaY() { return dyEndSpine; } public int getSpine0X() { return dxSpine0; } public int getSpine0Y() { return dySpine0; } public int getSpine1X() { return dxSpine1; } public int getSpine1Y() { return dySpine1; } public int getTextAngle() { return textAngle; } public int getTextHorzAlign() { return halign; } public int getTextVertAlign() { return valign; } } logisim-2.7.1/src/com/cburch/logisim/circuit/SplitterPainter.java0000644000175000017500000001535111533632424025006 0ustar vincentvincent/* Copyright (c) 2011, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.circuit.Wire; import com.cburch.logisim.comp.ComponentDrawContext; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.util.GraphicsUtil; class SplitterPainter { private static final int SPINE_WIDTH = Wire.WIDTH + 2; private static final int SPINE_DOT = Wire.WIDTH + 4; static void drawLines(ComponentDrawContext context, SplitterAttributes attrs, Location origin) { boolean showState = context.getShowState(); CircuitState state = showState ? context.getCircuitState() : null; if (state == null) showState = false; SplitterParameters parms = attrs.getParameters(); int x0 = origin.getX(); int y0 = origin.getY(); int x = x0 + parms.getEnd0X(); int y = y0 + parms.getEnd0Y(); int dx = parms.getEndToEndDeltaX(); int dy = parms.getEndToEndDeltaY(); int dxEndSpine = parms.getEndToSpineDeltaX(); int dyEndSpine = parms.getEndToSpineDeltaY(); Graphics g = context.getGraphics(); Color oldColor = g.getColor(); GraphicsUtil.switchToWidth(g, Wire.WIDTH); for (int i = 0, n = attrs.fanout; i < n; i++) { if (showState) { Value val = state.getValue(Location.create(x, y)); g.setColor(val.getColor()); } g.drawLine(x, y, x + dxEndSpine, y + dyEndSpine); x += dx; y += dy; } GraphicsUtil.switchToWidth(g, SPINE_WIDTH); g.setColor(oldColor); int spine0x = x0 + parms.getSpine0X(); int spine0y = y0 + parms.getSpine0Y(); int spine1x = x0 + parms.getSpine1X(); int spine1y = y0 + parms.getSpine1Y(); if (spine0x == spine1x && spine0y == spine1y) { // centered int fanout = attrs.fanout; spine0x = x0 + parms.getEnd0X() + parms.getEndToSpineDeltaX(); spine0y = y0 + parms.getEnd0Y() + parms.getEndToSpineDeltaY(); spine1x = spine0x + (fanout - 1) * parms.getEndToEndDeltaX(); spine1y = spine0y + (fanout - 1) * parms.getEndToEndDeltaY(); if (parms.getEndToEndDeltaX() == 0) { // vertical spine if (spine0y < spine1y) { spine0y++; spine1y--; } else { spine0y--; spine1y++; } g.drawLine(x0 + parms.getSpine1X() / 4, y0, spine0x, y0); } else { if (spine0x < spine1x) { spine0x++; spine1x--; } else { spine0x--; spine1x++; } g.drawLine(x0, y0 + parms.getSpine1Y() / 4, x0, spine0y); } if (fanout <= 1) { // spine is empty int diam = SPINE_DOT; g.fillOval(spine0x - diam / 2, spine0y - diam / 2, diam, diam); } else { g.drawLine(spine0x, spine0y, spine1x, spine1y); } } else { int[] xSpine = { spine0x, spine1x, x0 + parms.getSpine1X() / 4 }; int[] ySpine = { spine0y, spine1y, y0 + parms.getSpine1Y() / 4 }; g.drawPolyline(xSpine, ySpine, 3); } } static void drawLabels(ComponentDrawContext context, SplitterAttributes attrs, Location origin) { // compute labels String[] ends = new String[attrs.fanout + 1]; int curEnd = -1; int cur0 = 0; for (int i = 0, n = attrs.bit_end.length; i <= n; i++) { int bit = i == n ? -1 : attrs.bit_end[i]; if (bit != curEnd) { int cur1 = i - 1; String toAdd; if (curEnd <= 0) { toAdd = null; } else if (cur0 == cur1) { toAdd = "" + cur0; } else { toAdd = cur0 + "-" + cur1; } if (toAdd != null) { String old = ends[curEnd]; if (old == null) { ends[curEnd] = toAdd; } else { ends[curEnd] = old + "," + toAdd; } } curEnd = bit; cur0 = i; } } Graphics g = context.getGraphics().create(); Font font = g.getFont(); g.setFont(font.deriveFont(7.0f)); SplitterParameters parms = attrs.getParameters(); int x = origin.getX() + parms.getEnd0X() + parms.getEndToSpineDeltaX(); int y = origin.getY() + parms.getEnd0Y() + parms.getEndToSpineDeltaY(); int dx = parms.getEndToEndDeltaX(); int dy = parms.getEndToEndDeltaY(); if (parms.getTextAngle() != 0) { ((Graphics2D) g).rotate(Math.PI / 2.0); int t; t = -x; x = y; y = t; t = -dx; dx = dy; dy = t; } int halign = parms.getTextHorzAlign(); int valign = parms.getTextVertAlign(); x += (halign == GraphicsUtil.H_RIGHT ? -1 : 1) * (SPINE_WIDTH / 2 + 1); y += valign == GraphicsUtil.V_TOP ? 0 : -3; for (int i = 0, n = attrs.fanout; i < n; i++) { String text = ends[i + 1]; if (text != null) { GraphicsUtil.drawText(g, text, x, y, halign, valign); } x += dx; y += dy; } g.dispose(); } static void drawLegacy(ComponentDrawContext context, SplitterAttributes attrs, Location origin) { Graphics g = context.getGraphics(); CircuitState state = context.getCircuitState(); Direction facing = attrs.facing; int fanout = attrs.fanout; SplitterParameters parms = attrs.getParameters(); g.setColor(Color.BLACK); int x0 = origin.getX(); int y0 = origin.getY(); int x1 = x0 + parms.getEnd0X(); int y1 = y0 + parms.getEnd0Y(); int dx = parms.getEndToEndDeltaX(); int dy = parms.getEndToEndDeltaY(); if (facing == Direction.NORTH || facing == Direction.SOUTH) { int ySpine = (y0 + y1) / 2; GraphicsUtil.switchToWidth(g, Wire.WIDTH); g.drawLine(x0, y0, x0, ySpine); int xi = x1; int yi = y1; for (int i = 1; i <= fanout; i++) { if (context.getShowState()) { g.setColor(state.getValue(Location.create(xi, yi)).getColor()); } int xSpine = xi + (xi == x0 ? 0 : (xi < x0 ? 10 : -10)); g.drawLine(xi, yi, xSpine, ySpine); xi += dx; yi += dy; } if (fanout > 3) { GraphicsUtil.switchToWidth(g, SPINE_WIDTH); g.setColor(Color.BLACK); g.drawLine(x1 + dx, ySpine, x1 + (fanout - 2) * dx, ySpine); } else { g.setColor(Color.BLACK); g.fillOval(x0 - SPINE_DOT / 2, ySpine - SPINE_DOT / 2, SPINE_DOT, SPINE_DOT); } } else { int xSpine = (x0 + x1) / 2; GraphicsUtil.switchToWidth(g, Wire.WIDTH); g.drawLine(x0, y0, xSpine, y0); int xi = x1; int yi = y1; for (int i = 1; i <= fanout; i++) { if (context.getShowState()) { g.setColor(state.getValue(Location.create(xi, yi)).getColor()); } int ySpine = yi + (yi == y0 ? 0 : (yi < y0 ? 10 : -10)); g.drawLine(xi, yi, xSpine, ySpine); xi += dx; yi += dy; } if (fanout >= 3) { GraphicsUtil.switchToWidth(g, SPINE_WIDTH); g.setColor(Color.BLACK); g.drawLine(xSpine, y1 + dy, xSpine, y1 + (fanout - 2) * dy); } else { g.setColor(Color.BLACK); g.fillOval(xSpine - SPINE_DOT / 2, y0 - SPINE_DOT / 2, SPINE_DOT, SPINE_DOT); } } GraphicsUtil.switchToWidth(g, 1); } }logisim-2.7.1/src/com/cburch/logisim/circuit/SplitterFactory.java0000644000175000017500000000772611533632424025022 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; import java.awt.Graphics; import java.awt.Color; import java.awt.event.InputEvent; import javax.swing.Icon; import com.cburch.logisim.LogisimVersion; import com.cburch.logisim.circuit.Strings; import com.cburch.logisim.comp.AbstractComponentFactory; import com.cburch.logisim.comp.Component; import com.cburch.logisim.comp.ComponentDrawContext; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Location; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.tools.key.BitWidthConfigurator; import com.cburch.logisim.tools.key.IntegerConfigurator; import com.cburch.logisim.tools.key.JoinedConfigurator; import com.cburch.logisim.tools.key.KeyConfigurator; import com.cburch.logisim.tools.key.ParallelConfigurator; import com.cburch.logisim.util.Icons; import com.cburch.logisim.util.StringGetter; public class SplitterFactory extends AbstractComponentFactory { public static final SplitterFactory instance = new SplitterFactory(); private static final Icon toolIcon = Icons.getIcon("splitter.gif"); private SplitterFactory() { } @Override public String getName() { return "Splitter"; } @Override public StringGetter getDisplayGetter() { return Strings.getter("splitterComponent"); } @Override public AttributeSet createAttributeSet() { return new SplitterAttributes(); } @Override public Object getDefaultAttributeValue(Attribute attr, LogisimVersion ver) { if (attr == SplitterAttributes.ATTR_APPEARANCE) { if (ver.compareTo(LogisimVersion.get(2, 6, 3, 202)) < 0) { return SplitterAttributes.APPEAR_LEGACY; } else { return SplitterAttributes.APPEAR_LEFT; } } else if (attr instanceof SplitterAttributes.BitOutAttribute) { SplitterAttributes.BitOutAttribute a; a = (SplitterAttributes.BitOutAttribute) attr; return a.getDefault(); } else { return super.getDefaultAttributeValue(attr, ver); } } @Override public Component createComponent(Location loc, AttributeSet attrs) { return new Splitter(loc, attrs); } @Override public Bounds getOffsetBounds(AttributeSet attrsBase) { SplitterAttributes attrs = (SplitterAttributes) attrsBase; int fanout = attrs.fanout; SplitterParameters parms = attrs.getParameters(); int xEnd0 = parms.getEnd0X(); int yEnd0 = parms.getEnd0Y(); Bounds bds = Bounds.create(0, 0, 1, 1); bds = bds.add(xEnd0, yEnd0); bds = bds.add(xEnd0 + (fanout - 1) * parms.getEndToEndDeltaX(), yEnd0 + (fanout - 1) * parms.getEndToEndDeltaY()); return bds; } // // user interface methods // @Override public void drawGhost(ComponentDrawContext context, Color color, int x, int y, AttributeSet attrsBase) { SplitterAttributes attrs = (SplitterAttributes) attrsBase; context.getGraphics().setColor(color); Location loc = Location.create(x, y); if (attrs.appear == SplitterAttributes.APPEAR_LEGACY) { SplitterPainter.drawLegacy(context, attrs, loc); } else { SplitterPainter.drawLines(context, attrs, loc); } } @Override public void paintIcon(ComponentDrawContext c, int x, int y, AttributeSet attrs) { Graphics g = c.getGraphics(); if (toolIcon != null) { toolIcon.paintIcon(c.getDestination(), g, x + 2, y + 2); } } @Override public Object getFeature(Object key, AttributeSet attrs) { if (key == FACING_ATTRIBUTE_KEY) { return StdAttr.FACING; } else if (key == KeyConfigurator.class) { KeyConfigurator altConfig = ParallelConfigurator.create( new BitWidthConfigurator(SplitterAttributes.ATTR_WIDTH), new IntegerConfigurator(SplitterAttributes.ATTR_FANOUT, 1, 32, InputEvent.ALT_DOWN_MASK)); return JoinedConfigurator.create( new IntegerConfigurator(SplitterAttributes.ATTR_FANOUT, 1, 32, 0), altConfig); } return super.getFeature(key, attrs); } } logisim-2.7.1/src/com/cburch/logisim/circuit/SplitterDistributeItem.java0000644000175000017500000000356511533632424026345 0ustar vincentvincent/* Copyright (c) 2011, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JMenuItem; import com.cburch.logisim.proj.Project; import com.cburch.logisim.util.StringGetter; class SplitterDistributeItem extends JMenuItem implements ActionListener { private Project proj; private Splitter splitter; private int order; public SplitterDistributeItem(Project proj, Splitter splitter, int order) { this.proj = proj; this.splitter = splitter; this.order = order; addActionListener(this); SplitterAttributes attrs = (SplitterAttributes) splitter.getAttributeSet(); byte[] actual = attrs.bit_end; byte[] desired = SplitterAttributes.computeDistribution(attrs.fanout, actual.length, order); boolean same = actual.length == desired.length; for (int i = 0; same && i < desired.length; i++) { if (actual[i] != desired[i]) { same = false; } } setEnabled(!same); setText(toGetter().get()); } private StringGetter toGetter() { if (order > 0) { return Strings.getter("splitterDistributeAscending"); } else { return Strings.getter("splitterDistributeDescending"); } } public void actionPerformed(ActionEvent e) { SplitterAttributes attrs = (SplitterAttributes) splitter.getAttributeSet(); byte[] actual = attrs.bit_end; byte[] desired = SplitterAttributes.computeDistribution(attrs.fanout, actual.length, order); CircuitMutation xn = new CircuitMutation(proj.getCircuitState().getCircuit()); for (int i = 0, n = Math.min(actual.length, desired.length); i < n; i++) { if (actual[i] != desired[i]) { xn.set(splitter, attrs.getBitOutAttribute(i), Integer.valueOf(desired[i])); } } proj.doAction(xn.toAction(toGetter())); } } logisim-2.7.1/src/com/cburch/logisim/circuit/SplitterAttributes.java0000644000175000017500000002316211534737552025542 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import com.cburch.logisim.circuit.Strings; import com.cburch.logisim.data.AbstractAttributeSet; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeOption; import com.cburch.logisim.data.Attributes; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Direction; import com.cburch.logisim.instance.StdAttr; class SplitterAttributes extends AbstractAttributeSet { public static final AttributeOption APPEAR_LEGACY = new AttributeOption("legacy", Strings.getter("splitterAppearanceLegacy")); public static final AttributeOption APPEAR_LEFT = new AttributeOption("left", Strings.getter("splitterAppearanceLeft")); public static final AttributeOption APPEAR_RIGHT = new AttributeOption("right", Strings.getter("splitterAppearanceRight")); public static final AttributeOption APPEAR_CENTER = new AttributeOption("center", Strings.getter("splitterAppearanceCenter")); public static final Attribute ATTR_APPEARANCE = Attributes.forOption("appear", Strings.getter("splitterAppearanceAttr"), new AttributeOption[] { APPEAR_LEFT, APPEAR_RIGHT, APPEAR_CENTER, APPEAR_LEGACY}); public static final Attribute ATTR_WIDTH = Attributes.forBitWidth("incoming", Strings.getter("splitterBitWidthAttr")); public static final Attribute ATTR_FANOUT = Attributes.forIntegerRange("fanout", Strings.getter("splitterFanOutAttr"), 1, 32); private static final List> INIT_ATTRIBUTES = Arrays.asList(new Attribute[] { StdAttr.FACING, ATTR_FANOUT, ATTR_WIDTH, ATTR_APPEARANCE, }); private static final String unchosen_val = "none"; private static class BitOutOption { int value; boolean isVertical; boolean isLast; BitOutOption(int value, boolean isVertical, boolean isLast) { this.value = value; this.isVertical = isVertical; this.isLast = isLast; } @Override public String toString() { if (value < 0) { return Strings.get("splitterBitNone"); } else { String ret = "" + value; Direction noteDir; if (value == 0) { noteDir = isVertical ? Direction.NORTH : Direction.EAST; } else if (isLast) { noteDir = isVertical ? Direction.SOUTH : Direction.WEST; } else { noteDir = null; } if (noteDir != null) { ret += " (" + noteDir.toVerticalDisplayString() + ")"; } return ret; } } } static class BitOutAttribute extends Attribute { int which; BitOutOption[] options; private BitOutAttribute(int which, BitOutOption[] options) { super("bit" + which, Strings.getter("splitterBitAttr", "" + which)); this.which = which; this.options = options; } private BitOutAttribute createCopy() { return new BitOutAttribute(which, options); } public Object getDefault() { return Integer.valueOf(which + 1); } @Override public Integer parse(String value) { if (value.equals(unchosen_val)) { return Integer.valueOf(0); } else { return Integer.valueOf(1 + Integer.parseInt(value)); } } @Override public String toDisplayString(Integer value) { int index = value.intValue(); return options[index].toString(); } @Override public String toStandardString(Integer value) { int index = value.intValue(); if (index == 0) { return unchosen_val; } else { return "" + (index - 1); } } @Override public java.awt.Component getCellEditor(Integer value) { int index = value.intValue(); javax.swing.JComboBox combo = new javax.swing.JComboBox(options); combo.setSelectedIndex(index); return combo; } } private ArrayList> attrs = new ArrayList>(INIT_ATTRIBUTES); private SplitterParameters parameters; AttributeOption appear = APPEAR_LEFT; Direction facing = Direction.EAST; byte fanout = 2; // number of ends this splits into byte[] bit_end = new byte[2]; // how each bit maps to an end (0 if nowhere); // other values will be between 1 and fanout BitOutOption[] options = null; SplitterAttributes() { configureOptions(); configureDefaults(); parameters = new SplitterParameters(this); } Attribute getBitOutAttribute(int index) { return attrs.get(INIT_ATTRIBUTES.size() + index); } @Override protected void copyInto(AbstractAttributeSet destObj) { SplitterAttributes dest = (SplitterAttributes) destObj; dest.parameters = this.parameters; dest.attrs = new ArrayList>(this.attrs.size()); dest.attrs.addAll(INIT_ATTRIBUTES); for (int i = INIT_ATTRIBUTES.size(), n = this.attrs.size(); i < n; i++) { BitOutAttribute attr = (BitOutAttribute) this.attrs.get(i); dest.attrs.add(attr.createCopy()); } dest.facing = this.facing; dest.fanout = this.fanout; dest.appear = this.appear; dest.bit_end = this.bit_end.clone(); dest.options = this.options; } public SplitterParameters getParameters() { SplitterParameters ret = parameters; if (ret == null) { ret = new SplitterParameters(this); parameters = ret; } return ret; } @Override public List> getAttributes() { return attrs; } @Override @SuppressWarnings("unchecked") public V getValue(Attribute attr) { if (attr == StdAttr.FACING) { return (V) facing; } else if (attr == ATTR_FANOUT) { return (V) Integer.valueOf(fanout); } else if (attr == ATTR_WIDTH) { return (V) BitWidth.create(bit_end.length); } else if (attr == ATTR_APPEARANCE) { return (V) appear; } else if (attr instanceof BitOutAttribute) { BitOutAttribute bitOut = (BitOutAttribute) attr; return (V) Integer.valueOf(bit_end[bitOut.which]); } else { return null; } } @Override public void setValue(Attribute attr, V value) { if (attr == StdAttr.FACING) { facing = (Direction) value; configureOptions(); parameters = null; } else if (attr == ATTR_FANOUT) { int newValue = ((Integer) value).intValue(); byte[] bits = bit_end; for (int i = 0; i < bits.length; i++) { if (bits[i] >= newValue) bits[i] = (byte) (newValue - 1); } fanout = (byte) newValue; configureOptions(); configureDefaults(); parameters = null; } else if (attr == ATTR_WIDTH) { BitWidth width = (BitWidth) value; bit_end = new byte[width.getWidth()]; configureOptions(); configureDefaults(); } else if (attr == ATTR_APPEARANCE) { appear = (AttributeOption) value; parameters = null; } else if (attr instanceof BitOutAttribute) { BitOutAttribute bitOutAttr = (BitOutAttribute) attr; int val; if (value instanceof Integer) { val = ((Integer) value).intValue(); } else { val= ((BitOutOption) value).value + 1; } if (val >= 0 && val <= fanout) { bit_end[bitOutAttr.which] = (byte) val; } } else { throw new IllegalArgumentException("unknown attribute " + attr); } fireAttributeValueChanged(attr, value); } private void configureOptions() { // compute the set of options for BitOutAttributes options = new BitOutOption[fanout + 1]; boolean isVertical = facing == Direction.EAST || facing == Direction.WEST; for (int i = -1; i < fanout; i++) { options[i + 1] = new BitOutOption(i, isVertical, i == fanout - 1); } // go ahead and set the options for the existing attributes int offs = INIT_ATTRIBUTES.size(); int curNum = attrs.size() - offs; for (int i = 0; i < curNum; i++) { BitOutAttribute attr = (BitOutAttribute) attrs.get(offs + i); attr.options = options; } } private void configureDefaults() { int offs = INIT_ATTRIBUTES.size(); int curNum = attrs.size() - offs; // compute default values byte[] dflt = computeDistribution(fanout, bit_end.length, 1); boolean changed = curNum != bit_end.length; // remove excess attributes while (curNum > bit_end.length) { curNum--; attrs.remove(offs + curNum); } // set existing attributes for (int i = 0; i < curNum; i++) { if (bit_end[i] != dflt[i]) { BitOutAttribute attr = (BitOutAttribute) attrs.get(offs + i); bit_end[i] = dflt[i]; fireAttributeValueChanged(attr, Integer.valueOf(bit_end[i])); } } // add new attributes for (int i = curNum; i < bit_end.length; i++) { BitOutAttribute attr = new BitOutAttribute(i, options); bit_end[i] = dflt[i]; attrs.add(attr); } if (changed) fireAttributeListChanged(); } static byte[] computeDistribution(int fanout, int bits, int order) { byte[] ret = new byte[bits]; if (order >= 0) { if (fanout >= bits) { for (int i = 0; i < bits; i++) ret[i] = (byte) (i + 1); } else { int threads_per_end = bits / fanout; int ends_with_extra = bits % fanout; int cur_end = -1; // immediately increments int left_in_end = 0; for (int i = 0; i < bits; i++) { if (left_in_end == 0) { ++cur_end; left_in_end = threads_per_end; if (ends_with_extra > 0) { ++left_in_end; --ends_with_extra; } } ret[i] = (byte) (1 + cur_end); --left_in_end; } } } else { if (fanout >= bits) { for (int i = 0; i < bits; i++) ret[i] = (byte) (fanout - i); } else { int threads_per_end = bits / fanout; int ends_with_extra = bits % fanout; int cur_end = -1; int left_in_end = 0; for (int i = bits - 1; i >= 0; i--) { if (left_in_end == 0) { ++cur_end; left_in_end = threads_per_end; if (ends_with_extra > 0) { ++left_in_end; --ends_with_extra; } } ret[i] = (byte) (1 + cur_end); --left_in_end; } } } return ret; } } logisim-2.7.1/src/com/cburch/logisim/circuit/Splitter.java0000644000175000017500000001377011533632424023466 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; import javax.swing.JPopupMenu; import com.cburch.logisim.circuit.CircuitState; import com.cburch.logisim.circuit.CircuitWires; import com.cburch.logisim.comp.ComponentEvent; import com.cburch.logisim.comp.ComponentFactory; import com.cburch.logisim.comp.ComponentDrawContext; import com.cburch.logisim.comp.ComponentUserEvent; import com.cburch.logisim.comp.EndData; import com.cburch.logisim.comp.ManagedComponent; import com.cburch.logisim.data.AttributeEvent; import com.cburch.logisim.data.AttributeListener; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.proj.Project; import com.cburch.logisim.tools.MenuExtender; import com.cburch.logisim.tools.ToolTipMaker; import com.cburch.logisim.tools.WireRepair; import com.cburch.logisim.tools.WireRepairData; import com.cburch.logisim.util.StringUtil; public class Splitter extends ManagedComponent implements WireRepair, ToolTipMaker, MenuExtender, AttributeListener { // basic data byte[] bit_thread; // how each bit maps to thread within end // derived data CircuitWires.SplitterData wire_data; public Splitter(Location loc, AttributeSet attrs) { super(loc, attrs, 3); configureComponent(); attrs.addAttributeListener(this); } // // abstract ManagedComponent methods // @Override public ComponentFactory getFactory() { return SplitterFactory.instance; } @Override public void propagate(CircuitState state) { ; // handled by CircuitWires, nothing to do } @Override public boolean contains(Location loc) { if (super.contains(loc)) { Location myLoc = getLocation(); Direction facing = getAttributeSet().getValue(StdAttr.FACING); if (facing == Direction.EAST || facing == Direction.WEST) { return Math.abs(loc.getX() - myLoc.getX()) > 5 || loc.manhattanDistanceTo(myLoc) <= 5; } else { return Math.abs(loc.getY() - myLoc.getY()) > 5 || loc.manhattanDistanceTo(myLoc) <= 5; } } else { return false; } } private synchronized void configureComponent() { SplitterAttributes attrs = (SplitterAttributes) getAttributeSet(); SplitterParameters parms = attrs.getParameters(); int fanout = attrs.fanout; byte[] bit_end = attrs.bit_end; // compute width of each end bit_thread = new byte[bit_end.length]; byte[] end_width = new byte[fanout + 1]; end_width[0] = (byte) bit_end.length; for (int i = 0; i < bit_end.length; i++) { byte thr = bit_end[i]; if (thr > 0) { bit_thread[i] = end_width[thr]; end_width[thr]++; } else { bit_thread[i] = -1; } } // compute end positions Location origin = getLocation(); int x = origin.getX() + parms.getEnd0X(); int y = origin.getY() + parms.getEnd0Y(); int dx = parms.getEndToEndDeltaX(); int dy = parms.getEndToEndDeltaY(); EndData[] ends = new EndData[fanout + 1]; ends[0] = new EndData(origin, BitWidth.create(bit_end.length), EndData.INPUT_OUTPUT); for (int i = 0; i < fanout; i++) { ends[i + 1] = new EndData(Location.create(x, y), BitWidth.create(end_width[i + 1]), EndData.INPUT_OUTPUT); x += dx; y += dy; } wire_data = new CircuitWires.SplitterData(fanout); setEnds(ends); recomputeBounds(); fireComponentInvalidated(new ComponentEvent(this)); } // // user interface methods // public void draw(ComponentDrawContext context) { SplitterAttributes attrs = (SplitterAttributes) getAttributeSet(); if (attrs.appear == SplitterAttributes.APPEAR_LEGACY) { SplitterPainter.drawLegacy(context, attrs, getLocation()); } else { Location loc = getLocation(); SplitterPainter.drawLines(context, attrs, loc); SplitterPainter.drawLabels(context, attrs, loc); context.drawPins(this); } } @Override public Object getFeature(Object key) { if (key == WireRepair.class) return this; if (key == ToolTipMaker.class) return this; if (key == MenuExtender.class) return this; else return super.getFeature(key); } public boolean shouldRepairWire(WireRepairData data) { return true; } public String getToolTip(ComponentUserEvent e) { int end = -1; for (int i = getEnds().size() - 1; i >= 0; i--) { if (getEndLocation(i).manhattanDistanceTo(e.getX(), e.getY()) < 10) { end = i; break; } } if (end == 0) { return Strings.get("splitterCombinedTip"); } else if (end > 0){ int bits = 0; StringBuilder buf = new StringBuilder(); SplitterAttributes attrs = (SplitterAttributes) getAttributeSet(); byte[] bit_end = attrs.bit_end; boolean inString = false; int beginString = 0; for (int i = 0; i < bit_end.length; i++) { if (bit_end[i] == end) { bits++; if (!inString) { inString = true; beginString = i; } } else { if (inString) { appendBuf(buf, beginString, i - 1); inString = false; } } } if (inString) appendBuf(buf, beginString, bit_end.length - 1); String base; switch (bits) { case 0: base = Strings.get("splitterSplit0Tip"); break; case 1: base = Strings.get("splitterSplit1Tip"); break; default: base = Strings.get("splitterSplitManyTip"); break; } return StringUtil.format(base, buf.toString()); } else { return null; } } private static void appendBuf(StringBuilder buf, int start, int end) { if (buf.length() > 0) buf.append(","); if (start == end) { buf.append(start); } else { buf.append(start + "-" + end); } } public void configureMenu(JPopupMenu menu, Project proj) { menu.addSeparator(); menu.add(new SplitterDistributeItem(proj, this, 1)); menu.add(new SplitterDistributeItem(proj, this, -1)); } // // AttributeListener methods // public void attributeListChanged(AttributeEvent e) { } public void attributeValueChanged(AttributeEvent e) { configureComponent(); } }logisim-2.7.1/src/com/cburch/logisim/circuit/SimulatorTicker.java0000644000175000017500000000473411453523770025005 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; class SimulatorTicker extends Thread { private Simulator.PropagationManager manager; private int ticksPerTickPhase; private int millisPerTickPhase; private boolean shouldTick; private int ticksPending; private boolean complete; public SimulatorTicker(Simulator.PropagationManager manager) { this.manager = manager; ticksPerTickPhase = 1; millisPerTickPhase = 1000; shouldTick = false; ticksPending = 0; complete = false; } public synchronized void setTickFrequency(int millis, int ticks) { millisPerTickPhase = millis; ticksPerTickPhase = ticks; } synchronized void setAwake(boolean value) { shouldTick = value; if (shouldTick) notifyAll(); } public synchronized void shutDown() { complete = true; notifyAll(); } public synchronized void tickOnce() { ticksPending++; notifyAll(); } @Override public void run() { long lastTick = System.currentTimeMillis(); while (true) { boolean curShouldTick = shouldTick; int millis = millisPerTickPhase; int ticks = ticksPerTickPhase; try { synchronized(this) { curShouldTick = shouldTick; millis = millisPerTickPhase; ticks = ticksPerTickPhase; while (!curShouldTick && ticksPending == 0 && !complete) { wait(); curShouldTick = shouldTick; millis = millisPerTickPhase; ticks = ticksPerTickPhase; } } } catch (InterruptedException e) { } if (complete) break; int toTick; long now = System.currentTimeMillis(); if (curShouldTick && now - lastTick >= millis) { toTick = ticks; } else { toTick = ticksPending; } if (toTick > 0) { lastTick = now; for (int i = 0; i < toTick; i++) { manager.requestTick(); } synchronized(this) { if (ticksPending > toTick) ticksPending -= toTick; else ticksPending = 0; } // we fire tickCompleted in this thread so that other // objects (in particular the repaint process) can slow // the thread down. } try { long nextTick = lastTick + millis; int wait = (int) (nextTick - System.currentTimeMillis()); if (wait < 1) wait = 1; if (wait > 100) wait = 100; Thread.sleep(wait); } catch (InterruptedException e) { } } } } logisim-2.7.1/src/com/cburch/logisim/circuit/SimulatorListener.java0000644000175000017500000000057111446034526025342 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; public interface SimulatorListener { public void propagationCompleted(SimulatorEvent e); public void tickCompleted(SimulatorEvent e); public void simulatorStateChanged(SimulatorEvent e); } logisim-2.7.1/src/com/cburch/logisim/circuit/SimulatorEvent.java0000644000175000017500000000056011446034526024634 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; public class SimulatorEvent { private Simulator source; public SimulatorEvent(Simulator source) { this.source = source; } public Simulator getSource() { return source; } } logisim-2.7.1/src/com/cburch/logisim/circuit/Simulator.java0000644000175000017500000001611611540557310023632 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; import java.util.ArrayList; import com.cburch.logisim.comp.ComponentDrawContext; import com.cburch.logisim.prefs.AppPreferences; public class Simulator { /*begin DEBUGGING private static PrintWriter debug_log; static { try { debug_log = new PrintWriter(new BufferedWriter(new FileWriter("DEBUG"))); } catch (IOException e) { System.err.println("Could not open debug log"); //OK } } public static void log(String msg) { debug_log.println(msg); } public static void flushLog() { debug_log.flush(); } //end DEBUGGING*/ class PropagationManager extends Thread { private Propagator propagator = null; private PropagationPoints stepPoints = new PropagationPoints(); private volatile int ticksRequested = 0; private volatile int stepsRequested = 0; private volatile boolean resetRequested = false; private volatile boolean propagateRequested = false; private volatile boolean complete = false; // These variables apply only if PRINT_TICK_RATE is set int tickRateTicks = 0; long tickRateStart = System.currentTimeMillis(); public Propagator getPropagator() { return propagator; } public void setPropagator(Propagator value) { propagator = value; } public synchronized void requestPropagate() { if (!propagateRequested) { propagateRequested = true; notifyAll(); } } public synchronized void requestReset() { if (!resetRequested) { resetRequested = true; notifyAll(); } } public synchronized void requestTick() { if (ticksRequested < 16) { ticksRequested++; } notifyAll(); } public synchronized void shutDown() { complete = true; notifyAll(); } @Override public void run() { while (!complete) { synchronized(this) { while (!complete && !propagateRequested && !resetRequested && ticksRequested == 0 && stepsRequested == 0) { try { wait(); } catch (InterruptedException e) { } } } if (resetRequested) { resetRequested = false; if (propagator != null) propagator.reset(); firePropagationCompleted(); propagateRequested |= isRunning; } if (propagateRequested || ticksRequested > 0 || stepsRequested > 0) { boolean ticked = false; propagateRequested = false; if (isRunning) { stepPoints.clear(); stepsRequested = 0; if (propagator == null) { ticksRequested = 0; } else { ticked = ticksRequested > 0; if (ticked) doTick(); do { propagateRequested = false; try { exceptionEncountered = false; propagator.propagate(); } catch (Throwable thr) { thr.printStackTrace(); exceptionEncountered = true; setIsRunning(false); } } while (propagateRequested); if (isOscillating()) { setIsRunning(false); ticksRequested = 0; propagateRequested = false; } } } else { if (stepsRequested > 0) { if (ticksRequested > 0) { ticksRequested = 1; doTick(); } synchronized(this) { stepsRequested--; } exceptionEncountered = false; try { stepPoints.clear(); propagator.step(stepPoints); } catch (Throwable thr) { thr.printStackTrace(); exceptionEncountered = true; } } } if (ticked) fireTickCompleted(); firePropagationCompleted(); } } } private void doTick() { synchronized(this) { ticksRequested--; } propagator.tick(); } } private boolean isRunning = true; private boolean isTicking = false; private boolean exceptionEncountered = false; private double tickFrequency = 1.0; private PropagationManager manager; private SimulatorTicker ticker; private ArrayList listeners = new ArrayList(); public Simulator() { manager = new PropagationManager(); ticker = new SimulatorTicker(manager); try { manager.setPriority(manager.getPriority() - 1); ticker.setPriority(ticker.getPriority() - 1); } catch (SecurityException e) { } catch (IllegalArgumentException e) { } manager.start(); ticker.start(); tickFrequency = 0.0; setTickFrequency(AppPreferences.TICK_FREQUENCY.get().doubleValue()); } public void shutDown() { ticker.shutDown(); manager.shutDown(); } public void setCircuitState(CircuitState state) { manager.setPropagator(state.getPropagator()); renewTickerAwake(); } public CircuitState getCircuitState() { Propagator prop = manager.getPropagator(); return prop == null ? null : prop.getRootState(); } public void requestReset() { manager.requestReset(); } public void tick() { ticker.tickOnce(); } public void step() { synchronized(manager) { manager.stepsRequested++; manager.notifyAll(); } } public void drawStepPoints(ComponentDrawContext context) { manager.stepPoints.draw(context); } public boolean isExceptionEncountered() { return exceptionEncountered; } public boolean isRunning() { return isRunning; } public void setIsRunning(boolean value) { if (isRunning != value) { isRunning = value; renewTickerAwake(); /*DEBUGGING - comment out: if (!value) flushLog(); //*/ fireSimulatorStateChanged(); } } public boolean isTicking() { return isTicking; } public void setIsTicking(boolean value) { if (isTicking != value) { isTicking = value; renewTickerAwake(); fireSimulatorStateChanged(); } } private void renewTickerAwake() { ticker.setAwake(isRunning && isTicking && tickFrequency > 0); } public double getTickFrequency() { return tickFrequency; } public void setTickFrequency(double freq) { if (tickFrequency != freq) { int millis = (int) Math.round(1000 / freq); int ticks; if (millis > 0) { ticks = 1; } else { millis = 1; ticks = (int) Math.round(freq / 1000); } tickFrequency = freq; ticker.setTickFrequency(millis, ticks); renewTickerAwake(); fireSimulatorStateChanged(); } } public void requestPropagate() { manager.requestPropagate(); } public boolean isOscillating() { Propagator prop = manager.getPropagator(); return prop != null && prop.isOscillating(); } public void addSimulatorListener(SimulatorListener l) { listeners.add(l); } public void removeSimulatorListener(SimulatorListener l) { listeners.remove(l); } void firePropagationCompleted() { SimulatorEvent e = new SimulatorEvent(this); for (SimulatorListener l : new ArrayList(listeners)) { l.propagationCompleted(e); } } void fireTickCompleted() { SimulatorEvent e = new SimulatorEvent(this); for (SimulatorListener l : new ArrayList(listeners)) { l.tickCompleted(e); } } void fireSimulatorStateChanged() { SimulatorEvent e = new SimulatorEvent(this); for (SimulatorListener l : new ArrayList(listeners)) { l.simulatorStateChanged(e); } } } logisim-2.7.1/src/com/cburch/logisim/circuit/ReplacementMap.java0000644000175000017500000001112711500267112024537 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; import java.io.PrintStream; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import com.cburch.logisim.comp.Component; public class ReplacementMap { private boolean frozen; private HashMap> map; private HashMap> inverse; public ReplacementMap(Component oldComp, Component newComp) { this(new HashMap>(), new HashMap>()); HashSet oldSet = new HashSet(3); oldSet.add(oldComp); HashSet newSet = new HashSet(3); newSet.add(newComp); map.put(oldComp, newSet); inverse.put(newComp, oldSet); } public ReplacementMap() { this(new HashMap>(), new HashMap>()); } private ReplacementMap(HashMap> map, HashMap> inverse) { this.map = map; this.inverse = inverse; } public void reset() { map.clear(); inverse.clear(); } public boolean isEmpty() { return map.isEmpty() && inverse.isEmpty(); } public Collection getReplacedComponents() { return map.keySet(); } public Collection get(Component prev) { return map.get(prev); } void freeze() { frozen = true; } public void add(Component comp) { if (frozen) { throw new IllegalStateException("cannot change map after frozen"); } inverse.put(comp, new HashSet(3)); } public void remove(Component comp) { if (frozen) { throw new IllegalStateException("cannot change map after frozen"); } map.put(comp, new HashSet(3)); } public void replace(Component prev, Component next) { put(prev, Collections.singleton(next)); } public void put(Component prev, Collection next) { if (frozen) { throw new IllegalStateException("cannot change map after frozen"); } HashSet repl = map.get(prev); if (repl == null) { repl = new HashSet(next.size()); map.put(prev, repl); } repl.addAll(next); for (Component n : next) { repl = inverse.get(n); if (repl == null) { repl = new HashSet(3); inverse.put(n, repl); } repl.add(prev); } } void append(ReplacementMap next) { for (Map.Entry> e : next.map.entrySet()) { Component b = e.getKey(); HashSet cs = e.getValue(); // what b is replaced by HashSet as = this.inverse.remove(b); // what was replaced to get b if (as == null) { // b pre-existed replacements so as = new HashSet(3); // we say it replaces itself. as.add(b); } for (Component a : as) { HashSet aDst = this.map.get(a); if (aDst == null) { // should happen when b pre-existed only aDst = new HashSet(cs.size()); this.map.put(a, aDst); } aDst.remove(b); aDst.addAll(cs); } for (Component c : cs) { HashSet cSrc = this.inverse.get(c); // should always be null if (cSrc == null) { cSrc = new HashSet(as.size()); this.inverse.put(c, cSrc); } cSrc.addAll(as); } } for (Map.Entry> e : next.inverse.entrySet()) { Component c = e.getKey(); if (!inverse.containsKey(c)) { HashSet bs = e.getValue(); if (!bs.isEmpty()) { System.err.println("internal error: component replaced but not represented"); //OK } inverse.put(c, new HashSet(3)); } } } ReplacementMap getInverseMap() { return new ReplacementMap(inverse, map); } public Collection getComponentsReplacing(Component comp) { return map.get(comp); } public Collection getRemovals() { return map.keySet(); } public Collection getAdditions() { return inverse.keySet(); } public void print(PrintStream out) { boolean found = false; for (Component c : getRemovals()) { if (!found) out.println(" removals:"); found = true; out.println(" " + c.toString()); } if (!found) out.println(" removals: none"); found = false; for (Component c : getAdditions()) { if (!found) out.println(" additions:"); found = true; out.println(" " + c.toString()); } if (!found) out.println(" additions: none"); } } logisim-2.7.1/src/com/cburch/logisim/circuit/RadixOption.java0000644000175000017500000001165411500267064024115 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeOption; import com.cburch.logisim.data.Attributes; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Value; import com.cburch.logisim.util.StringGetter; public abstract class RadixOption extends AttributeOption { public static final RadixOption RADIX_2 = new Radix2(); public static final RadixOption RADIX_8 = new Radix8(); public static final RadixOption RADIX_10_UNSIGNED = new Radix10Unsigned(); public static final RadixOption RADIX_10_SIGNED = new Radix10Signed(); public static final RadixOption RADIX_16 = new Radix16(); public static final RadixOption[] OPTIONS = { RADIX_2, RADIX_8, RADIX_10_SIGNED, RADIX_10_UNSIGNED, RADIX_16 }; public static final Attribute ATTRIBUTE = Attributes.forOption("radix", Strings.getter("radixAttr"), OPTIONS); public static RadixOption decode(String value) { for (RadixOption opt : OPTIONS) { if (value.equals(opt.saveName)) { return opt; } } return RADIX_2; } private String saveName; private StringGetter displayGetter; private RadixOption(String saveName, StringGetter displayGetter) { super(saveName, displayGetter); this.saveName = saveName; this.displayGetter = displayGetter; } public StringGetter getDisplayGetter() { return displayGetter; } public String getSaveString() { return saveName; } @Override public String toDisplayString() { return displayGetter.get(); } @Override public String toString() { return saveName; } public abstract String toString(Value value); public abstract int getMaxLength(BitWidth width); public int getMaxLength(Value value) { return getMaxLength(value.getBitWidth()); } private static class Radix2 extends RadixOption { private Radix2() { super("2", Strings.getter("radix2")); } @Override public String toString(Value value) { return value.toDisplayString(2); } @Override public int getMaxLength(Value value) { return value.toDisplayString(2).length(); } @Override public int getMaxLength(BitWidth width) { int bits = width.getWidth(); if (bits <= 1) return 1; return bits + ((bits - 1) / 4); } } private static class Radix10Signed extends RadixOption { private Radix10Signed() { super("10signed", Strings.getter("radix10Signed")); } @Override public String toString(Value value) { return value.toDecimalString(true); } @Override public int getMaxLength(BitWidth width) { switch (width.getWidth()) { case 2: case 3: case 4: return 2; // 2..8 case 5: case 6: case 7: return 3; // 16..64 case 8: case 9: case 10: return 4; // 128..512 case 11: case 12: case 13: case 14: return 5; // 1K..8K case 15: case 16: case 17: return 6; // 16K..64K case 18: case 19: case 20: return 7; // 128K..256K case 21: case 22: case 23: case 24: return 8; // 1M..8M case 25: case 26: case 27: return 9; // 16M..64M case 28: case 29: case 30: return 10; // 128M..512M case 31: case 32: return 11; // 1G..2G default: return 1; } } } private static class Radix10Unsigned extends RadixOption { private Radix10Unsigned() { super("10unsigned", Strings.getter("radix10Unsigned")); } @Override public String toString(Value value) { return value.toDecimalString(false); } @Override public int getMaxLength(BitWidth width) { switch (width.getWidth()) { case 4: case 5: case 6: return 2; case 7: case 8: case 9: return 3; case 10: case 11: case 12: case 13: return 4; case 14: case 15: case 16: return 5; case 17: case 18: case 19: return 6; case 20: case 21: case 22: case 23: return 7; case 24: case 25: case 26: return 8; case 27: case 28: case 29: return 9; case 30: case 31: case 32: return 10; default: return 1; } } } private static class Radix8 extends RadixOption { private Radix8() { super("8", Strings.getter("radix8")); } @Override public String toString(Value value) { return value.toDisplayString(8); } @Override public int getMaxLength(Value value) { return value.toDisplayString(8).length(); } @Override public int getMaxLength(BitWidth width) { return Math.max(1, (width.getWidth() + 2) / 3); } } private static class Radix16 extends RadixOption { private Radix16() { super("16", Strings.getter("radix16")); } @Override public String toString(Value value) { return value.toDisplayString(16); } @Override public int getMaxLength(BitWidth width) { return Math.max(1, (width.getWidth() + 3) / 4); } } } logisim-2.7.1/src/com/cburch/logisim/circuit/Propagator.java0000644000175000017500000002720611446034526023777 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; import java.lang.ref.WeakReference; import java.util.HashMap; import java.util.HashSet; import java.util.PriorityQueue; import java.util.Random; import com.cburch.logisim.comp.Component; import com.cburch.logisim.comp.ComponentDrawContext; import com.cburch.logisim.comp.EndData; import com.cburch.logisim.data.AttributeEvent; import com.cburch.logisim.data.AttributeListener; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.file.Options; public class Propagator { static class SetData implements Comparable { int time; int serialNumber; CircuitState state; // state of circuit containing component Component cause; // component emitting the value Location loc; // the location at which value is emitted Value val; // value being emitted SetData next = null; private SetData(int time, int serialNumber, CircuitState state, Location loc, Component cause, Value val) { this.time = time; this.serialNumber = serialNumber; this.state = state; this.cause = cause; this.loc = loc; this.val = val; } public int compareTo(SetData o) { // Yes, these subtractions may overflow. This is intentional, as it // avoids potential wraparound problems as the counters increment. int ret = this.time - o.time; if (ret != 0) return ret; return this.serialNumber - o.serialNumber; } public SetData cloneFor(CircuitState newState) { Propagator newProp = newState.getPropagator(); int dtime = newProp.clock - state.getPropagator().clock; SetData ret = new SetData(time + dtime, newProp.setDataSerialNumber, newState, loc, cause, val); newProp.setDataSerialNumber++; if (this.next != null) ret.next = this.next.cloneFor(newState); return ret; } @Override public String toString() { return loc + ":" + val + "(" + cause + ")"; } } private static class ComponentPoint { Component cause; Location loc; public ComponentPoint(Component cause, Location loc) { this.cause = cause; this.loc = loc; } @Override public int hashCode() { return 31 * cause.hashCode() + loc.hashCode(); } @Override public boolean equals(Object other) { if (!(other instanceof ComponentPoint)) return false; ComponentPoint o = (ComponentPoint) other; return this.cause.equals(o.cause) && this.loc.equals(o.loc); } } private static class Listener implements AttributeListener { WeakReference prop; public Listener(Propagator propagator) { prop = new WeakReference(propagator); } public void attributeListChanged(AttributeEvent e) { } public void attributeValueChanged(AttributeEvent e) { Propagator p = prop.get(); if (p == null) { e.getSource().removeAttributeListener(this); } else if (e.getAttribute().equals(Options.sim_rand_attr)) { p.updateRandomness(); } } } private CircuitState root; // root of state tree /** The number of clock cycles to let pass before deciding that the * circuit is oscillating. */ private int simLimit = 1000; /** On average, one out of every 2**simRandomShift propagations * through a component is delayed one step more than the component * requests. This noise is intended to address some circuits that would * otherwise oscillate within Logisim (though they wouldn't oscillate in * practice). */ private volatile int simRandomShift; private PriorityQueue toProcess = new PriorityQueue(); private int clock = 0; private boolean isOscillating = false; private boolean oscAdding = false; private PropagationPoints oscPoints = new PropagationPoints(); private int ticks = 0; private Random noiseSource = new Random(); private int noiseCount = 0; private int setDataSerialNumber = 0; static int lastId = 0; int id = lastId++; public Propagator(CircuitState root) { this.root = root; Listener l = new Listener(this); root.getProject().getOptions().getAttributeSet().addAttributeListener(l); updateRandomness(); } private void updateRandomness() { Options opts = root.getProject().getOptions(); Object rand = opts.getAttributeSet().getValue(Options.sim_rand_attr); int val = ((Integer) rand).intValue(); int logVal = 0; while ((1 << logVal) < val) logVal++; simRandomShift = logVal; } public boolean isOscillating() { return isOscillating; } @Override public String toString() { return "Prop" + id; } public void drawOscillatingPoints(ComponentDrawContext context) { if (isOscillating) oscPoints.draw(context); } // // public methods // CircuitState getRootState() { return root; } void reset() { toProcess.clear(); root.reset(); isOscillating = false; } public void propagate() { oscPoints.clear(); clearDirtyPoints(); clearDirtyComponents(); int oscThreshold = simLimit; int logThreshold = 3 * oscThreshold / 4; int iters = 0; while (!toProcess.isEmpty()) { iters++; if (iters < logThreshold) { stepInternal(null); } else if (iters < oscThreshold) { oscAdding = true; stepInternal(oscPoints); } else { isOscillating = true; oscAdding = false; return; } } isOscillating = false; oscAdding = false; oscPoints.clear(); } void step(PropagationPoints changedPoints) { oscPoints.clear(); clearDirtyPoints(); clearDirtyComponents(); PropagationPoints oldOsc = oscPoints; oscAdding = changedPoints != null; oscPoints = changedPoints; stepInternal(changedPoints); oscAdding = false; oscPoints = oldOsc; } private void stepInternal(PropagationPoints changedPoints) { if (toProcess.isEmpty()) return; // update clock clock = toProcess.peek().time; // propagate all values for this clock tick HashMap> visited = new HashMap>(); while (true) { SetData data = toProcess.peek(); if (data == null || data.time != clock) break; toProcess.remove(); CircuitState state = data.state; // if it's already handled for this clock tick, continue HashSet handled = visited.get(state); if (handled != null) { if (!handled.add(new ComponentPoint(data.cause, data.loc))) continue; } else { handled = new HashSet(); visited.put(state, handled); handled.add(new ComponentPoint(data.cause, data.loc)); } /*DEBUGGING - comment out Simulator.log(data.time + ": proc " + data.loc + " in " + data.state + " to " + data.val + " by " + data.cause); // */ if (changedPoints != null) changedPoints.add(state, data.loc); // change the information about value SetData oldHead = state.causes.get(data.loc); Value oldVal = computeValue(oldHead); SetData newHead = addCause(state, oldHead, data); Value newVal = computeValue(newHead); // if the value at point has changed, propagate it if (!newVal.equals(oldVal)) { state.markPointAsDirty(data.loc); } } clearDirtyPoints(); clearDirtyComponents(); } boolean isPending() { return !toProcess.isEmpty(); } /*TODO for the SimulatorPrototype class void step() { clock++; // propagate all values for this clock tick HashMap visited = new HashMap(); // State -> set of ComponentPoints handled while (!toProcess.isEmpty()) { SetData data; data = (SetData) toProcess.peek(); if (data.time != clock) break; toProcess.remove(); CircuitState state = data.state; // if it's already handled for this clock tick, continue HashSet handled = (HashSet) visited.get(state); if (handled != null) { if (!handled.add(new ComponentPoint(data.cause, data.loc))) continue; } else { handled = new HashSet(); visited.put(state, handled); handled.add(new ComponentPoint(data.cause, data.loc)); } if (oscAdding) oscPoints.add(state, data.loc); // change the information about value SetData oldHead = (SetData) state.causes.get(data.loc); Value oldVal = computeValue(oldHead); SetData newHead = addCause(state, oldHead, data); Value newVal = computeValue(newHead); // if the value at point has changed, propagate it if (!newVal.equals(oldVal)) { state.markPointAsDirty(data.loc); } } clearDirtyPoints(); clearDirtyComponents(); } */ void locationTouched(CircuitState state, Location loc) { if (oscAdding) oscPoints.add(state, loc); } // // package-protected helper methods // void setValue(CircuitState state, Location pt, Value val, Component cause, int delay) { if (cause instanceof Wire || cause instanceof Splitter) return; if (delay <= 0) { delay = 1; } int randomShift = simRandomShift; if (randomShift > 0) { // random noise is turned on // multiply the delay by 32 so that the random noise // only changes the delay by 3%. delay <<= randomShift; if (!(cause.getFactory() instanceof SubcircuitFactory)) { if (noiseCount > 0) { noiseCount--; } else { delay++; noiseCount = noiseSource.nextInt(1 << randomShift); } } } toProcess.add(new SetData(clock + delay, setDataSerialNumber, state, pt, cause, val)); /*DEBUGGING - comment out Simulator.log(clock + ": set " + pt + " in " + state + " to " + val + " by " + cause + " after " + delay); //*/ setDataSerialNumber++; } public boolean tick() { ticks++; return root.tick(ticks); } public int getTickCount() { return ticks; } // // private methods // void checkComponentEnds(CircuitState state, Component comp) { for (EndData end : comp.getEnds()) { Location loc = end.getLocation(); SetData oldHead = state.causes.get(loc); Value oldVal = computeValue(oldHead); SetData newHead = removeCause(state, oldHead, loc, comp); Value newVal = computeValue(newHead); Value wireVal = state.getValueByWire(loc); if (!newVal.equals(oldVal) || wireVal != null) { state.markPointAsDirty(loc); } if (wireVal != null) state.setValueByWire(loc, Value.NIL); } } private void clearDirtyPoints() { root.processDirtyPoints(); } private void clearDirtyComponents() { root.processDirtyComponents(); } private SetData addCause(CircuitState state, SetData head, SetData data) { if (data.val == null) { // actually, it should be removed return removeCause(state, head, data.loc, data.cause); } HashMap causes = state.causes; // first check whether this is change of previous info. boolean replaced = false; for (SetData n = head; n != null; n = n.next) { if (n.cause == data.cause) { n.val = data.val; replaced = true; break; } } // otherwise, insert to list of causes if (!replaced) { if (head == null) { causes.put(data.loc, data); head = data; } else { data.next = head.next; head.next = data; } } return head; } private SetData removeCause(CircuitState state, SetData head, Location loc, Component cause) { HashMap causes = state.causes; if (head == null) { ; } else if (head.cause == cause) { head = head.next; if (head == null) causes.remove(loc); else causes.put(loc, head); } else { SetData prev = head; SetData cur = head.next; while (cur != null) { if (cur.cause == cause) { prev.next = cur.next; break; } prev = cur; cur = cur.next; } } return head; } // // static methods // static Value computeValue(SetData causes) { if (causes == null) return Value.NIL; Value ret = causes.val; for (SetData n = causes.next; n != null; n = n.next) { ret = ret.combine(n.val); } return ret; } } logisim-2.7.1/src/com/cburch/logisim/circuit/PropagationPoints.java0000644000175000017500000000435711446034526025343 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; import java.awt.Graphics; import java.util.HashMap; import java.util.HashSet; import com.cburch.logisim.comp.Component; import com.cburch.logisim.comp.ComponentDrawContext; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Location; import com.cburch.logisim.util.GraphicsUtil; class PropagationPoints { private static class Entry { private CircuitState state; private Location loc; private Entry(CircuitState state, Location loc) { this.state = state; this.loc = loc; } @Override public boolean equals(Object other) { if (!(other instanceof Entry)) return false; Entry o = (Entry) other; return state.equals(o.state) && loc.equals(o.loc); } @Override public int hashCode() { return state.hashCode() * 31 + loc.hashCode(); } } private HashSet data; PropagationPoints() { this.data = new HashSet(); } void add(CircuitState state, Location loc) { data.add(new Entry(state, loc)); } void clear() { data.clear(); } boolean isEmpty() { return data.isEmpty(); } void draw(ComponentDrawContext context) { if (data.isEmpty()) return; CircuitState state = context.getCircuitState(); HashMap stateMap = new HashMap(); for (CircuitState s : state.getSubstates()) { addSubstates(stateMap, s, s); } Graphics g = context.getGraphics(); GraphicsUtil.switchToWidth(g, 2); for (Entry e : data) { if (e.state == state) { Location p = e.loc; g.drawOval(p.getX() - 4, p.getY() - 4, 8, 8); } else if (stateMap.containsKey(e.state)) { CircuitState substate = stateMap.get(e.state); Component subcirc = substate.getSubcircuit(); Bounds b = subcirc.getBounds(); g.drawRect(b.getX(), b.getY(), b.getWidth(), b.getHeight()); } } GraphicsUtil.switchToWidth(g, 1); } private void addSubstates(HashMap map, CircuitState source, CircuitState value) { map.put(source, value); for (CircuitState s : source.getSubstates()) { addSubstates(map, s, value); } } } logisim-2.7.1/src/com/cburch/logisim/circuit/ExpressionComputer.java0000644000175000017500000000152011446034526025526 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; import java.util.Map; import com.cburch.logisim.analyze.model.Expression; import com.cburch.logisim.data.Location; public interface ExpressionComputer { /** * Propagates expression computation through a circuit. * The parameter is a map from Points to * Expressions. The method will use this to * determine the expressions coming into the component, * and it should place any output expressions into * the component. * * If, in fact, no valid expression exists for the component, * it throws UnsupportedOperationException. */ public void computeExpression(Map expressionMap); } logisim-2.7.1/src/com/cburch/logisim/circuit/CircuitWires.java0000644000175000017500000005265411533246320024274 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; import java.awt.Color; import java.awt.Graphics; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import com.cburch.logisim.comp.Component; import com.cburch.logisim.comp.ComponentDrawContext; import com.cburch.logisim.comp.EndData; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeEvent; import com.cburch.logisim.data.AttributeListener; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.std.wiring.PullResistor; import com.cburch.logisim.std.wiring.Tunnel; import com.cburch.logisim.util.GraphicsUtil; import com.cburch.logisim.util.IteratorUtil; import com.cburch.logisim.util.SmallSet; class CircuitWires { static class SplitterData { WireBundle[] end_bundle; // PointData associated with each end SplitterData(int fan_out) { end_bundle = new WireBundle[fan_out + 1]; } } static class ThreadBundle { int loc; WireBundle b; ThreadBundle(int loc, WireBundle b) { this.loc = loc; this.b = b; } } static class State { BundleMap bundleMap; HashMap thr_values = new HashMap(); State(BundleMap bundleMap) { this.bundleMap = bundleMap; } @Override public Object clone() { State ret = new State(this.bundleMap); ret.thr_values.putAll(this.thr_values); return ret; } } private class TunnelListener implements AttributeListener { public void attributeListChanged(AttributeEvent e) { } public void attributeValueChanged(AttributeEvent e) { Attribute attr = e.getAttribute(); if (attr == StdAttr.LABEL || attr == PullResistor.ATTR_PULL_TYPE) { voidBundleMap(); } } } static class BundleMap { boolean computed = false; HashMap pointBundles = new HashMap(); HashSet bundles = new HashSet(); boolean isValid = true; // NOTE: It would make things more efficient if we also had // a set of just the first bundle in each tree. HashSet incompatibilityData = null; HashSet getWidthIncompatibilityData() { return incompatibilityData; } void addWidthIncompatibilityData(WidthIncompatibilityData e) { if (incompatibilityData == null) { incompatibilityData = new HashSet(); } incompatibilityData.add(e); } WireBundle getBundleAt(Location p) { return pointBundles.get(p); } WireBundle createBundleAt(Location p) { WireBundle ret = pointBundles.get(p); if (ret == null) { ret = new WireBundle(); pointBundles.put(p, ret); ret.points.add(p); bundles.add(ret); } return ret; } boolean isValid() { return isValid; } void invalidate() { isValid = false; } void setBundleAt(Location p, WireBundle b) { pointBundles.put(p, b); } Set getBundlePoints() { return pointBundles.keySet(); } Set getBundles() { return bundles; } synchronized void markComputed() { computed = true; notifyAll(); } synchronized void waitUntilComputed() { while (!computed) { try { wait(); } catch (InterruptedException e) { } } } } // user-given data private HashSet wires = new HashSet(); private HashSet splitters = new HashSet(); private HashSet tunnels = new HashSet(); // of Components with Tunnel factory private TunnelListener tunnelListener = new TunnelListener(); private HashSet pulls = new HashSet(); // of Components with PullResistor factory final CircuitPoints points = new CircuitPoints(); // derived data private Bounds bounds = Bounds.EMPTY_BOUNDS; private BundleMap bundleMap = null; CircuitWires() { } // // query methods // boolean isMapVoided() { return bundleMap == null; } Set getWidthIncompatibilityData() { return getBundleMap().getWidthIncompatibilityData(); } void ensureComputed() { getBundleMap(); } BitWidth getWidth(Location q) { BitWidth det = points.getWidth(q); if (det != BitWidth.UNKNOWN) return det; BundleMap bmap = getBundleMap(); if (!bmap.isValid()) return BitWidth.UNKNOWN; WireBundle qb = bmap.getBundleAt(q); if (qb != null && qb.isValid()) return qb.getWidth(); return BitWidth.UNKNOWN; } Location getWidthDeterminant(Location q) { BitWidth det = points.getWidth(q); if (det != BitWidth.UNKNOWN) return q; WireBundle qb = getBundleMap().getBundleAt(q); if (qb != null && qb.isValid()) return qb.getWidthDeterminant(); return q; } Iterator getComponents() { return IteratorUtil.createJoinedIterator(splitters.iterator(), wires.iterator()); } Set getWires() { return wires; } Bounds getWireBounds() { Bounds bds = bounds; if (bds == Bounds.EMPTY_BOUNDS) { bds = recomputeBounds(); } return bds; } WireBundle getWireBundle(Location query) { BundleMap bmap = getBundleMap(); return bmap.getBundleAt(query); } WireSet getWireSet(Wire start) { WireBundle bundle = getWireBundle(start.e0); if (bundle == null) return WireSet.EMPTY; HashSet wires = new HashSet(); for (Location loc : bundle.points) { wires.addAll(points.getWires(loc)); } return new WireSet(wires); } // // action methods // // NOTE: this could be made much more efficient in most cases to // avoid voiding the bundle map. boolean add(Component comp) { boolean added = true; if (comp instanceof Wire) { added = addWire((Wire) comp); } else if (comp instanceof Splitter) { splitters.add((Splitter) comp); } else { Object factory = comp.getFactory(); if (factory instanceof Tunnel) { tunnels.add(comp); comp.getAttributeSet().addAttributeListener(tunnelListener); } else if (factory instanceof PullResistor) { pulls.add(comp); comp.getAttributeSet().addAttributeListener(tunnelListener); } } if (added) { points.add(comp); voidBundleMap(); } return added; } void remove(Component comp) { if (comp instanceof Wire) { removeWire((Wire) comp); } else if (comp instanceof Splitter) { splitters.remove(comp); } else { Object factory = comp.getFactory(); if (factory instanceof Tunnel) { tunnels.remove(comp); comp.getAttributeSet().removeAttributeListener(tunnelListener); } else if (factory instanceof PullResistor) { pulls.remove(comp); comp.getAttributeSet().removeAttributeListener(tunnelListener); } } points.remove(comp); voidBundleMap(); } void add(Component comp, EndData end) { points.add(comp, end); voidBundleMap(); } void remove(Component comp, EndData end) { points.remove(comp, end); voidBundleMap(); } void replace(Component comp, EndData oldEnd, EndData newEnd) { points.remove(comp, oldEnd); points.add(comp, newEnd); voidBundleMap(); } private boolean addWire(Wire w) { boolean added = wires.add(w); if (!added) return false; if (bounds != Bounds.EMPTY_BOUNDS) { // update bounds bounds = bounds.add(w.e0).add(w.e1); } return true; } private void removeWire(Wire w) { boolean removed = wires.remove(w); if (!removed) return; if (bounds != Bounds.EMPTY_BOUNDS) { // bounds is valid - invalidate if endpoint on border Bounds smaller = bounds.expand(-2); if (!smaller.contains(w.e0) || !smaller.contains(w.e1)) { bounds = Bounds.EMPTY_BOUNDS; } } } // // utility methods // void propagate(CircuitState circState, Set points) { BundleMap map = getBundleMap(); SmallSet dirtyThreads = new SmallSet(); // affected threads // get state, or create a new one if current state is outdated State s = circState.getWireData(); if (s == null || s.bundleMap != map) { // if it is outdated, we need to compute for all threads s = new State(map); for (WireBundle b : map.getBundles()) { WireThread[] th = b.threads; if (b.isValid() && th != null) { for (WireThread t : th) { dirtyThreads.add(t); } } } circState.setWireData(s); } // determine affected threads, and set values for unwired points for (Location p : points) { WireBundle pb = map.getBundleAt(p); if (pb == null) { // point is not wired circState.setValueByWire(p, circState.getComponentOutputAt(p)); } else { WireThread[] th = pb.threads; if (!pb.isValid() || th == null) { // immediately propagate NILs across invalid bundles SmallSet pbPoints = pb.points; if (pbPoints == null) { circState.setValueByWire(p, Value.NIL); } else { for (Location loc2 : pbPoints) { circState.setValueByWire(loc2, Value.NIL); } } } else { for (WireThread t : th) { dirtyThreads.add(t); } } } } if (dirtyThreads.isEmpty()) return; // determine values of affected threads HashSet bundles = new HashSet(); for (WireThread t : dirtyThreads) { Value v = getThreadValue(circState, t); s.thr_values.put(t, v); bundles.addAll(t.getBundles()); } // now propagate values through circuit for (ThreadBundle tb : bundles) { WireBundle b = tb.b; Value bv = null; if (!b.isValid() || b.threads == null) { ; // do nothing } else if (b.threads.length == 1) { bv = s.thr_values.get(b.threads[0]); } else { Value[] tvs = new Value[b.threads.length]; boolean tvs_valid = true; for (int i = 0; i < tvs.length; i++) { Value tv = s.thr_values.get(b.threads[i]); if (tv == null) { tvs_valid = false; break; } tvs[i] = tv; } if (tvs_valid) bv = Value.create(tvs); } if (bv != null) { for (Location p : b.points) { circState.setValueByWire(p, bv); } } } } void draw(ComponentDrawContext context, Collection hidden) { boolean showState = context.getShowState(); CircuitState state = context.getCircuitState(); Graphics g = context.getGraphics(); g.setColor(Color.BLACK); GraphicsUtil.switchToWidth(g, Wire.WIDTH); WireSet highlighted = context.getHighlightedWires(); BundleMap bmap = getBundleMap(); boolean isValid = bmap.isValid(); if (hidden == null || hidden.size() == 0) { for (Wire w : wires) { Location s = w.e0; Location t = w.e1; WireBundle wb = bmap.getBundleAt(s); if (!wb.isValid()) { g.setColor(Value.WIDTH_ERROR_COLOR); } else if (showState) { if (!isValid) g.setColor(Value.NIL_COLOR); else g.setColor(state.getValue(s).getColor()); } else { g.setColor(Color.BLACK); } if (highlighted.containsWire(w)) { GraphicsUtil.switchToWidth(g, Wire.WIDTH + 2); g.drawLine(s.getX(), s.getY(), t.getX(), t.getY()); GraphicsUtil.switchToWidth(g, Wire.WIDTH); } else { g.drawLine(s.getX(), s.getY(), t.getX(), t.getY()); } } for (Location loc : points.getSplitLocations()) { if (points.getComponentCount(loc) > 2) { WireBundle wb = bmap.getBundleAt(loc); if (wb != null) { if (!wb.isValid()) { g.setColor(Value.WIDTH_ERROR_COLOR); } else if (showState) { if (!isValid) g.setColor(Value.NIL_COLOR); else g.setColor(state.getValue(loc).getColor()); } else { g.setColor(Color.BLACK); } if (highlighted.containsLocation(loc)) { g.fillOval(loc.getX() - 5, loc.getY() - 5, 10, 10); } else { g.fillOval(loc.getX() - 4, loc.getY() - 4, 8, 8); } } } } } else { for (Wire w : wires) { if (!hidden.contains(w)) { Location s = w.e0; Location t = w.e1; WireBundle wb = bmap.getBundleAt(s); if (!wb.isValid()) { g.setColor(Value.WIDTH_ERROR_COLOR); } else if (showState) { if (!isValid) g.setColor(Value.NIL_COLOR); else g.setColor(state.getValue(s).getColor()); } else { g.setColor(Color.BLACK); } if (highlighted.containsWire(w)) { GraphicsUtil.switchToWidth(g, Wire.WIDTH + 2); g.drawLine(s.getX(), s.getY(), t.getX(), t.getY()); GraphicsUtil.switchToWidth(g, Wire.WIDTH); } else { g.drawLine(s.getX(), s.getY(), t.getX(), t.getY()); } } } // this is just an approximation, but it's good enough since // the problem is minor, and hidden only exists for a short // while at a time anway. for (Location loc : points.getSplitLocations()) { if (points.getComponentCount(loc) > 2) { int icount = 0; for (Component comp : points.getComponents(loc)) { if (!hidden.contains(comp)) ++icount; } if (icount > 2) { WireBundle wb = bmap.getBundleAt(loc); if (wb != null) { if (!wb.isValid()) { g.setColor(Value.WIDTH_ERROR_COLOR); } else if (showState) { if (!isValid) g.setColor(Value.NIL_COLOR); else g.setColor(state.getValue(loc).getColor()); } else { g.setColor(Color.BLACK); } if (highlighted.containsLocation(loc)) { g.fillOval(loc.getX() - 5, loc.getY() - 5, 10, 10); } else { g.fillOval(loc.getX() - 4, loc.getY() - 4, 8, 8); } } } } } } } // // helper methods // private void voidBundleMap() { bundleMap = null; } private BundleMap getBundleMap() { // Maybe we already have a valid bundle map (or maybe // one is in progress). BundleMap ret = bundleMap; if (ret != null) { ret.waitUntilComputed(); return ret; } try { // Ok, we have to create our own. for (int tries = 4; tries >= 0; tries--) { try { ret = new BundleMap(); computeBundleMap(ret); bundleMap = ret; break; } catch (Throwable t) { if (tries == 0) { t.printStackTrace(); bundleMap = ret; } } } } catch (RuntimeException ex) { ret.invalidate(); ret.markComputed(); throw ex; } finally { // Mark the BundleMap as computed in case anybody is waiting for the result. ret.markComputed(); } return ret; } // To be called by getBundleMap only private void computeBundleMap(BundleMap ret) { // create bundles corresponding to wires and tunnels connectWires(ret); connectTunnels(ret); connectPullResistors(ret); // merge any WireBundle objects united by previous steps for (Iterator it = ret.getBundles().iterator(); it.hasNext(); ) { WireBundle b = it.next(); WireBundle bpar = b.find(); if (bpar != b) { // b isn't group's representative for (Location pt : b.points) { ret.setBundleAt(pt, bpar); bpar.points.add(pt); } bpar.addPullValue(b.getPullValue()); it.remove(); } } // make a WireBundle object for each end of a splitter for (Splitter spl : splitters) { List ends = new ArrayList(spl.getEnds()); for (EndData end : ends) { Location p = end.getLocation(); WireBundle pb = ret.createBundleAt(p); pb.setWidth(end.getWidth(), p); } } // set the width for each bundle whose size is known // based on components for (Location p : ret.getBundlePoints()) { WireBundle pb = ret.getBundleAt(p); BitWidth width = points.getWidth(p); if (width != BitWidth.UNKNOWN) { pb.setWidth(width, p); } } // determine the bundles at the end of each splitter for (Splitter spl : splitters) { List ends = new ArrayList(spl.getEnds()); int index = -1; for (EndData end : ends) { index++; Location p = end.getLocation(); WireBundle pb = ret.getBundleAt(p); if (pb != null) { pb.setWidth(end.getWidth(), p); spl.wire_data.end_bundle[index] = pb; } } } // unite threads going through splitters for (Splitter spl : splitters) { synchronized(spl) { SplitterAttributes spl_attrs = (SplitterAttributes) spl.getAttributeSet(); byte[] bit_end = spl_attrs.bit_end; SplitterData spl_data = spl.wire_data; WireBundle from_bundle = spl_data.end_bundle[0]; if (from_bundle == null || !from_bundle.isValid()) continue; for (int i = 0; i < bit_end.length; i++) { int j = bit_end[i]; if (j > 0) { int thr = spl.bit_thread[i]; WireBundle to_bundle = spl_data.end_bundle[j]; WireThread[] to_threads = to_bundle.threads; if (to_threads != null && to_bundle.isValid()) { WireThread[] from_threads = from_bundle.threads; if (i >= from_threads.length) { throw new ArrayIndexOutOfBoundsException("from " + i + " of " + from_threads.length); } if (thr >= to_threads.length) { throw new ArrayIndexOutOfBoundsException("to " + thr + " of " + to_threads.length); } from_threads[i].unite(to_threads[thr]); } } } } } // merge any threads united by previous step for (WireBundle b : ret.getBundles()) { if (b.isValid() && b.threads != null) { for (int i = 0; i < b.threads.length; i++) { WireThread thr = b.threads[i].find(); b.threads[i] = thr; thr.getBundles().add(new ThreadBundle(i, b)); } } } // All threads are sewn together! Compute the exception set before leaving Collection exceptions = points.getWidthIncompatibilityData(); if (exceptions != null && exceptions.size() > 0) { for (WidthIncompatibilityData wid : exceptions) { ret.addWidthIncompatibilityData(wid); } } for (WireBundle b : ret.getBundles()) { WidthIncompatibilityData e = b.getWidthIncompatibilityData(); if (e != null) ret.addWidthIncompatibilityData(e); } } private void connectWires(BundleMap ret) { // make a WireBundle object for each tree of connected wires for (Wire w : wires) { WireBundle b0 = ret.getBundleAt(w.e0); if (b0 == null) { WireBundle b1 = ret.createBundleAt(w.e1); b1.points.add(w.e0); ret.setBundleAt(w.e0, b1); } else { WireBundle b1 = ret.getBundleAt(w.e1); if (b1 == null) { // t1 doesn't exist b0.points.add(w.e1); ret.setBundleAt(w.e1, b0); } else { b1.unite(b0); // unite b0 and b1 } } } } private void connectTunnels(BundleMap ret) { // determine the sets of tunnels HashMap> tunnelSets = new HashMap>(); for (Component comp : tunnels) { String label = comp.getAttributeSet().getValue(StdAttr.LABEL); label = label.trim(); if (!label.equals("")) { ArrayList tunnelSet = tunnelSets.get(label); if (tunnelSet == null) { tunnelSet = new ArrayList(3); tunnelSets.put(label, tunnelSet); } tunnelSet.add(comp.getLocation()); } } // now connect the bundles that are tunnelled together for (ArrayList tunnelSet : tunnelSets.values()) { WireBundle foundBundle = null; Location foundLocation = null; for (Location loc : tunnelSet) { WireBundle b = ret.getBundleAt(loc); if (b != null) { foundBundle = b; foundLocation = loc; break; } } if (foundBundle == null) { foundLocation = tunnelSet.get(0); foundBundle = ret.createBundleAt(foundLocation); } for (Location loc : tunnelSet) { if (loc != foundLocation) { WireBundle b = ret.getBundleAt(loc); if (b == null) { foundBundle.points.add(loc); ret.setBundleAt(loc, foundBundle); } else { b.unite(foundBundle); } } } } } private void connectPullResistors(BundleMap ret) { for (Component comp : pulls) { Location loc = comp.getEnd(0).getLocation(); WireBundle b = ret.getBundleAt(loc); if (b == null) { b = ret.createBundleAt(loc); b.points.add(loc); ret.setBundleAt(loc, b); } Instance instance = Instance.getInstanceFor(comp); b.addPullValue(PullResistor.getPullValue(instance)); } } private Value getThreadValue(CircuitState state, WireThread t) { Value ret = Value.UNKNOWN; Value pull = Value.UNKNOWN; for (ThreadBundle tb : t.getBundles()) { for (Location p : tb.b.points) { Value val = state.getComponentOutputAt(p); if (val != null && val != Value.NIL) { ret = ret.combine(val.get(tb.loc)); } } Value pullHere = tb.b.getPullValue(); if (pullHere != Value.UNKNOWN) pull = pull.combine(pullHere); } if (pull != Value.UNKNOWN) { ret = pullValue(ret, pull); } return ret; } private static Value pullValue(Value base, Value pullTo) { if (base.isFullyDefined()) { return base; } else if (base.getWidth() == 1) { if (base == Value.UNKNOWN) return pullTo; else return base; } else { Value[] ret = base.getAll(); for (int i = 0; i < ret.length; i++) { if (ret[i] == Value.UNKNOWN) ret[i] = pullTo; } return Value.create(ret); } } private Bounds recomputeBounds() { Iterator it = wires.iterator(); if (!it.hasNext()) { bounds = Bounds.EMPTY_BOUNDS; return Bounds.EMPTY_BOUNDS; } Wire w = it.next(); int xmin = w.e0.getX(); int ymin = w.e0.getY(); int xmax = w.e1.getX(); int ymax = w.e1.getY(); while (it.hasNext()) { w = it.next(); int x0 = w.e0.getX(); if (x0 < xmin) xmin = x0; int x1 = w.e1.getX(); if (x1 > xmax) xmax = x1; int y0 = w.e0.getY(); if (y0 < ymin) ymin = y0; int y1 = w.e1.getY(); if (y1 > ymax) ymax = y1; } Bounds bds = Bounds.create(xmin, ymin, xmax - xmin + 1, ymax - ymin + 1); bounds = bds; return bds; } } logisim-2.7.1/src/com/cburch/logisim/circuit/CircuitTransactionResult.java0000644000175000017500000000136111446034526026662 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; import java.util.Collection; public class CircuitTransactionResult { private CircuitMutatorImpl mutator; CircuitTransactionResult(CircuitMutatorImpl mutator) { this.mutator = mutator; } public CircuitTransaction getReverseTransaction() { return mutator.getReverseTransaction(); } public ReplacementMap getReplacementMap(Circuit circuit) { ReplacementMap ret = mutator.getReplacementMap(circuit); return ret == null ? new ReplacementMap() : ret; } public Collection getModifiedCircuits() { return mutator.getModifiedCircuits(); } } logisim-2.7.1/src/com/cburch/logisim/circuit/CircuitTransaction.java0000644000175000017500000000426711446034526025473 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; import java.util.Collection; import java.util.Map; import java.util.concurrent.locks.Lock; import com.cburch.logisim.circuit.appear.CircuitPins; public abstract class CircuitTransaction { public static final Integer READ_ONLY = Integer.valueOf(1); public static final Integer READ_WRITE = Integer.valueOf(2); protected abstract Map getAccessedCircuits(); protected abstract void run(CircuitMutator mutator); public final CircuitTransactionResult execute() { CircuitMutatorImpl mutator = new CircuitMutatorImpl(); Map locks = CircuitLocker.acquireLocks(this, mutator); CircuitTransactionResult result; try { this.run(mutator); // Let the port locations of each subcircuit's appearance be // updated to reflect the changes - this needs to happen before // wires are repaired because it could lead to some wires being // split Collection modified = mutator.getModifiedCircuits(); for (Circuit circuit : modified) { CircuitMutatorImpl circMutator = circuit.getLocker().getMutator(); if (circMutator == mutator) { CircuitPins pins = circuit.getAppearance().getCircuitPins(); ReplacementMap repl = mutator.getReplacementMap(circuit); if (repl != null) { pins.transactionCompleted(repl); } } } // Now go through each affected circuit and repair its wires for (Circuit circuit : modified) { CircuitMutatorImpl circMutator = circuit.getLocker().getMutator(); if (circMutator == mutator) { WireRepair repair = new WireRepair(circuit); repair.run(mutator); } else { // this is a transaction executed within a transaction - // wait to repair wires until overall transaction is done circMutator.markModified(circuit); } } result = new CircuitTransactionResult(mutator); for (Circuit circuit : result.getModifiedCircuits()) { circuit.fireEvent(CircuitEvent.TRANSACTION_DONE, result); } } finally { CircuitLocker.releaseLocks(locks); } return result; } } logisim-2.7.1/src/com/cburch/logisim/circuit/CircuitState.java0000644000175000017500000003316211541661312024255 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; import java.util.Collection; import java.util.ConcurrentModificationException; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Set; import com.cburch.logisim.circuit.Propagator.SetData; import com.cburch.logisim.comp.Component; import com.cburch.logisim.comp.ComponentDrawContext; import com.cburch.logisim.comp.ComponentState; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceData; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.proj.Project; import com.cburch.logisim.std.wiring.Clock; import com.cburch.logisim.std.wiring.Pin; import com.cburch.logisim.util.ArraySet; import com.cburch.logisim.util.SmallSet; public class CircuitState implements InstanceData { private class MyCircuitListener implements CircuitListener { public void circuitChanged(CircuitEvent event) { int action = event.getAction(); if (action == CircuitEvent.ACTION_ADD) { Component comp = (Component) event.getData(); if (comp instanceof Wire) { Wire w = (Wire) comp; markPointAsDirty(w.getEnd0()); markPointAsDirty(w.getEnd1()); } else { markComponentAsDirty(comp); } } else if (action == CircuitEvent.ACTION_REMOVE) { Component comp = (Component) event.getData(); if (comp.getFactory() instanceof SubcircuitFactory) { // disconnect from tree CircuitState substate = (CircuitState) getData(comp); if (substate != null && substate.parentComp == comp) { substates.remove(substate); substate.parentState = null; substate.parentComp = null; } } if (comp instanceof Wire) { Wire w = (Wire) comp; markPointAsDirty(w.getEnd0()); markPointAsDirty(w.getEnd1()); } else { if (base != null) base.checkComponentEnds(CircuitState.this, comp); dirtyComponents.remove(comp); } } else if (action == CircuitEvent.ACTION_CLEAR) { substates.clear(); wireData = null; componentData.clear(); values.clear(); dirtyComponents.clear(); dirtyPoints.clear(); causes.clear(); } else if (action == CircuitEvent.ACTION_CHANGE) { Object data = event.getData(); if (data instanceof Collection) { @SuppressWarnings("unchecked") Collection comps = (Collection) data; markComponentsDirty(comps); if (base != null) { for (Component comp : comps) { base.checkComponentEnds(CircuitState.this, comp); } } } else { Component comp = (Component) event.getData(); markComponentAsDirty(comp); if (base != null) base.checkComponentEnds(CircuitState.this, comp); } } else if (action == CircuitEvent.ACTION_INVALIDATE) { Component comp = (Component) event.getData(); markComponentAsDirty(comp); // TODO detemine if this should really be missing if (base != null) base.checkComponentEnds(CircuitState.this, comp); } else if (action == CircuitEvent.TRANSACTION_DONE) { ReplacementMap map = event.getResult().getReplacementMap(circuit); if (map != null) { for (Component comp : map.getReplacedComponents()) { Object compState = componentData.remove(comp); if (compState != null) { Class compFactory = comp.getFactory().getClass(); boolean found = false; for (Component repl : map.get(comp)) { if (repl.getFactory().getClass() == compFactory) { found = true; setData(repl, compState); break; } } if (!found && compState instanceof CircuitState) { CircuitState sub = (CircuitState) compState; sub.parentState = null; substates.remove(sub); } } } } } } } private MyCircuitListener myCircuitListener = new MyCircuitListener(); private Propagator base = null; // base of tree of CircuitStates private Project proj; // project where circuit lies private Circuit circuit; // circuit being simulated private CircuitState parentState = null; // parent in tree of CircuitStates private Component parentComp = null; // subcircuit component containing this state private ArraySet substates = new ArraySet(); private CircuitWires.State wireData = null; private HashMap componentData = new HashMap(); private Map values = new HashMap(); private SmallSet dirtyComponents = new SmallSet(); private SmallSet dirtyPoints = new SmallSet(); HashMap causes = new HashMap(); private static int lastId = 0; private int id = lastId++; public CircuitState(Project proj, Circuit circuit) { this.proj = proj; this.circuit = circuit; circuit.addCircuitListener(myCircuitListener); } public Project getProject() { return proj; } Component getSubcircuit() { return parentComp; } @Override public CircuitState clone() { return cloneState(); } public CircuitState cloneState() { CircuitState ret = new CircuitState(proj, circuit); ret.copyFrom(this, new Propagator(ret)); ret.parentComp = null; ret.parentState = null; return ret; } private void copyFrom(CircuitState src, Propagator base) { this.base = base; this.parentComp = src.parentComp; this.parentState = src.parentState; HashMap substateData = new HashMap(); this.substates = new ArraySet(); for (CircuitState oldSub : src.substates) { CircuitState newSub = new CircuitState(src.proj, oldSub.circuit); newSub.copyFrom(oldSub, base); newSub.parentState = this; this.substates.add(newSub); substateData.put(oldSub, newSub); } for (Component key : src.componentData.keySet()) { Object oldValue = src.componentData.get(key); if (oldValue instanceof CircuitState) { Object newValue = substateData.get(oldValue); if (newValue != null) this.componentData.put(key, newValue); else this.componentData.remove(key); } else { Object newValue; if (oldValue instanceof ComponentState) { newValue = ((ComponentState) oldValue).clone(); } else { newValue = oldValue; } this.componentData.put(key, newValue); } } for (Location key : src.causes.keySet()) { Propagator.SetData oldValue = src.causes.get(key); Propagator.SetData newValue = oldValue.cloneFor(this); this.causes.put(key, newValue); } if (src.wireData != null) { this.wireData = (CircuitWires.State) src.wireData.clone(); } this.values.putAll(src.values); this.dirtyComponents.addAll(src.dirtyComponents); this.dirtyPoints.addAll(src.dirtyPoints); } @Override public String toString() { return "State" + id + "[" + circuit.getName() + "]"; } // // public methods // public Circuit getCircuit() { return circuit; } public CircuitState getParentState() { return parentState; } public Set getSubstates() { // returns Set of CircuitStates return substates; } public Propagator getPropagator() { if (base == null) { base = new Propagator(this); markAllComponentsDirty(); } return base; } public void drawOscillatingPoints(ComponentDrawContext context) { if (base != null) base.drawOscillatingPoints(context); } public Object getData(Component comp) { return componentData.get(comp); } public void setData(Component comp, Object data) { if (data instanceof CircuitState) { CircuitState oldState = (CircuitState) componentData.get(comp); CircuitState newState = (CircuitState) data; if (oldState != newState) { // There's something new going on with this subcircuit. // Maybe the subcircuit is new, or perhaps it's being // removed. if (oldState != null && oldState.parentComp == comp) { // it looks like it's being removed substates.remove(oldState); oldState.parentState = null; oldState.parentComp = null; } if (newState != null && newState.parentState != this) { // this is the first time I've heard about this CircuitState substates.add(newState); newState.base = this.base; newState.parentState = this; newState.parentComp = comp; newState.markAllComponentsDirty(); } } } componentData.put(comp, data); } public Value getValue(Location pt) { Value ret = values.get(pt); if (ret != null) return ret; BitWidth wid = circuit.getWidth(pt); return Value.createUnknown(wid); } public void setValue(Location pt, Value val, Component cause, int delay) { if (base != null) base.setValue(this, pt, val, cause, delay); } public void markComponentAsDirty(Component comp) { try { dirtyComponents.add(comp); } catch (RuntimeException e) { SmallSet set = new SmallSet(); set.add(comp); dirtyComponents = set; } } public void markComponentsDirty(Collection comps) { dirtyComponents.addAll(comps); } public void markPointAsDirty(Location pt) { dirtyPoints.add(pt); } public InstanceState getInstanceState(Component comp) { Object factory = comp.getFactory(); if (factory instanceof InstanceFactory) { return ((InstanceFactory) factory).createInstanceState(this, comp); } else { throw new RuntimeException("getInstanceState requires instance component"); } } public InstanceState getInstanceState(Instance instance) { Object factory = instance.getFactory(); if (factory instanceof InstanceFactory) { return ((InstanceFactory) factory).createInstanceState(this, instance); } else { throw new RuntimeException("getInstanceState requires instance component"); } } // // methods for other classes within package // public boolean isSubstate() { return parentState != null; } void processDirtyComponents() { if (!dirtyComponents.isEmpty()) { // This seeming wasted copy is to avoid ConcurrentModifications // if we used an iterator instead. Object[] toProcess; RuntimeException firstException = null; for (int tries = 4; true; tries--) { try { toProcess = dirtyComponents.toArray(); break; } catch (RuntimeException e) { if (firstException == null) firstException = e; if (tries == 0) { toProcess = new Object[0]; dirtyComponents = new SmallSet(); throw firstException; } } } dirtyComponents.clear(); for (Object compObj : toProcess) { if (compObj instanceof Component) { Component comp = (Component) compObj; comp.propagate(this); if (comp.getFactory() instanceof Pin && parentState != null) { // should be propagated in superstate parentComp.propagate(parentState); } } } } CircuitState[] subs = new CircuitState[substates.size()]; for (CircuitState substate : substates.toArray(subs)) { substate.processDirtyComponents(); } } void processDirtyPoints() { HashSet dirty = new HashSet(dirtyPoints); dirtyPoints.clear(); if (circuit.wires.isMapVoided()) { for (int i = 3; i >= 0; i--) { try { dirty.addAll(circuit.wires.points.getSplitLocations()); break; } catch (ConcurrentModificationException e) { // try again... try { Thread.sleep(1); } catch (InterruptedException e2) { } if (i == 0) e.printStackTrace(); } } } if (!dirty.isEmpty()) { circuit.wires.propagate(this, dirty); } CircuitState[] subs = new CircuitState[substates.size()]; for (CircuitState substate : substates.toArray(subs)) { substate.processDirtyPoints(); } } void reset() { wireData = null; for (Iterator it = componentData.keySet().iterator(); it.hasNext(); ) { Component comp = it.next(); if (!(comp.getFactory() instanceof SubcircuitFactory)) it.remove(); } values.clear(); dirtyComponents.clear(); dirtyPoints.clear(); causes.clear(); markAllComponentsDirty(); for (CircuitState sub : substates) { sub.reset(); } } boolean tick(int ticks) { boolean ret = false; for (Component clock : circuit.getClocks()) { ret |= Clock.tick(this, ticks, clock); } CircuitState[] subs = new CircuitState[substates.size()]; for (CircuitState substate : substates.toArray(subs)) { ret |= substate.tick(ticks); } return ret; } CircuitWires.State getWireData() { return wireData; } void setWireData(CircuitWires.State data) { wireData = data; } Value getComponentOutputAt(Location p) { // for CircuitWires - to get values, ignoring wires' contributions Propagator.SetData cause_list = causes.get(p); return Propagator.computeValue(cause_list); } Value getValueByWire(Location p) { return values.get(p); } void setValueByWire(Location p, Value v) { // for CircuitWires - to set value at point boolean changed; if (v == Value.NIL) { Object old = values.remove(p); changed = (old != null && old != Value.NIL); } else { Object old = values.put(p, v); changed = !v.equals(old); } if (changed) { boolean found = false; for (Component comp : circuit.getComponents(p)) { if (!(comp instanceof Wire) && !(comp instanceof Splitter)) { found = true; markComponentAsDirty(comp); } } // NOTE: this will cause a double-propagation on components // whose outputs have just changed. if (found && base != null) base.locationTouched(this, p); } } // // private methods // private void markAllComponentsDirty() { dirtyComponents.addAll(circuit.getNonWires()); } } logisim-2.7.1/src/com/cburch/logisim/circuit/CircuitPoints.java0000644000175000017500000001337711447117130024456 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Set; import com.cburch.logisim.comp.Component; import com.cburch.logisim.comp.EndData; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Location; class CircuitPoints { private static class LocationData { BitWidth width = BitWidth.UNKNOWN; ArrayList components = new ArrayList(4); ArrayList ends = new ArrayList(4); // these lists are parallel - ends corresponding to wires are null } private HashMap map = new HashMap(); private HashMap incompatibilityData = new HashMap(); public CircuitPoints() { } // // access methods // Set getSplitLocations() { return map.keySet(); } BitWidth getWidth(Location loc) { LocationData locData = map.get(loc); return locData == null ? BitWidth.UNKNOWN : locData.width; } int getComponentCount(Location loc) { LocationData locData = map.get(loc); return locData == null ? 0 : locData.components.size(); } Component getExclusive(Location loc) { LocationData locData = map.get(loc); if (locData == null) return null; int i = -1; for (EndData endData : locData.ends) { i++; if (endData != null && endData.isExclusive()) { return locData.components.get(i); } } return null; } Collection getComponents(Location loc) { LocationData locData = map.get(loc); if (locData == null) return Collections.emptySet(); else return locData.components; } Collection getSplitCauses(Location loc) { return getComponents(loc); } Collection getWires(Location loc) { @SuppressWarnings("unchecked") Collection ret = (Collection) find(loc, true); return ret; } Collection getNonWires(Location loc) { return find(loc, false); } private Collection find(Location loc, boolean isWire) { LocationData locData = map.get(loc); if (locData == null) return Collections.emptySet(); // first see how many elements we have; we can handle some simple // cases without creating any new lists ArrayList list = locData.components; int retSize = 0; Component retValue = null; for (Component o : list) { if ((o instanceof Wire) == isWire) { retValue = o; retSize++; } } if (retSize == list.size()) return list; if (retSize == 0) return Collections.emptySet(); if (retSize == 1) return Collections.singleton(retValue); // otherwise we have to create our own list Component[] ret = new Component[retSize]; int retPos = 0; for (Component o : list) { if ((o instanceof Wire) == isWire) { ret[retPos] = o; retPos++; } } return Arrays.asList(ret); } Collection getWidthIncompatibilityData() { return incompatibilityData.values(); } boolean hasConflict(Component comp) { if (comp instanceof Wire) { return false; } else { for (EndData endData : comp.getEnds()) { if (endData != null && endData.isExclusive() && getExclusive(endData.getLocation()) != null) { return true; } } return false; } } // // update methods // void add(Component comp) { if (comp instanceof Wire) { Wire w = (Wire) comp; addSub(w.getEnd0(), w, null); addSub(w.getEnd1(), w, null); } else { for (EndData endData : comp.getEnds()) { if (endData != null) { addSub(endData.getLocation(), comp, endData); } } } } void add(Component comp, EndData endData) { if (endData != null) addSub(endData.getLocation(), comp, endData); } void remove(Component comp) { if (comp instanceof Wire) { Wire w = (Wire) comp; removeSub(w.getEnd0(), w); removeSub(w.getEnd1(), w); } else { for (EndData endData : comp.getEnds()) { if (endData != null) { removeSub(endData.getLocation(), comp); } } } } void remove(Component comp, EndData endData) { if (endData != null) removeSub(endData.getLocation(), comp); } private void addSub(Location loc, Component comp, EndData endData) { LocationData locData = map.get(loc); if (locData == null) { locData = new LocationData(); map.put(loc, locData); } locData.components.add(comp); locData.ends.add(endData); computeIncompatibilityData(loc, locData); } private void removeSub(Location loc, Component comp) { LocationData locData = map.get(loc); if (locData == null) return; int index = locData.components.indexOf(comp); if (index < 0) return; if (locData.components.size() == 1) { map.remove(loc); incompatibilityData.remove(loc); } else { locData.components.remove(index); locData.ends.remove(index); computeIncompatibilityData(loc, locData); } } private void computeIncompatibilityData(Location loc, LocationData locData) { WidthIncompatibilityData error = null; if (locData != null) { BitWidth width = BitWidth.UNKNOWN; for (EndData endData : locData.ends) { if (endData != null) { BitWidth endWidth = endData.getWidth(); if (width == BitWidth.UNKNOWN) { width = endWidth; } else if (width != endWidth && endWidth != BitWidth.UNKNOWN) { if (error == null) { error = new WidthIncompatibilityData(); error.add(loc, width); } error.add(loc, endWidth); } } } locData.width = width; } if (error == null) { incompatibilityData.remove(loc); } else { incompatibilityData.put(loc, error); } } } logisim-2.7.1/src/com/cburch/logisim/circuit/CircuitMutatorImpl.java0000644000175000017500000000736011446034526025460 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import com.cburch.logisim.comp.Component; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; class CircuitMutatorImpl implements CircuitMutator { private ArrayList log; private HashMap replacements; private HashSet modified; public CircuitMutatorImpl() { log = new ArrayList(); replacements = new HashMap(); modified = new HashSet(); } public void clear(Circuit circuit) { HashSet comps = new HashSet(circuit.getNonWires()); comps.addAll(circuit.getWires()); if (!comps.isEmpty()) modified.add(circuit); log.add(CircuitChange.clear(circuit, comps)); ReplacementMap repl = new ReplacementMap(); for (Component comp : comps) repl.remove(comp); getMap(circuit).append(repl); circuit.mutatorClear(); } public void add(Circuit circuit, Component comp) { modified.add(circuit); log.add(CircuitChange.add(circuit, comp)); ReplacementMap repl = new ReplacementMap(); repl.add(comp); getMap(circuit).append(repl); circuit.mutatorAdd(comp); } public void remove(Circuit circuit, Component comp) { if (circuit.contains(comp)) { modified.add(circuit); log.add(CircuitChange.remove(circuit, comp)); ReplacementMap repl = new ReplacementMap(); repl.remove(comp); getMap(circuit).append(repl); circuit.mutatorRemove(comp); } } public void replace(Circuit circuit, Component prev, Component next) { replace(circuit, new ReplacementMap(prev, next)); } public void replace(Circuit circuit, ReplacementMap repl) { if (!repl.isEmpty()) { modified.add(circuit); log.add(CircuitChange.replace(circuit, repl)); repl.freeze(); getMap(circuit).append(repl); for (Component c : repl.getRemovals()) { circuit.mutatorRemove(c); } for (Component c : repl.getAdditions()) { circuit.mutatorAdd(c); } } } public void set(Circuit circuit, Component comp, Attribute attr, Object newValue) { if (circuit.contains(comp)) { modified.add(circuit); @SuppressWarnings("unchecked") Attribute a = (Attribute) attr; AttributeSet attrs = comp.getAttributeSet(); Object oldValue = attrs.getValue(a); log.add(CircuitChange.set(circuit, comp, attr, oldValue, newValue)); attrs.setValue(a, newValue); } } public void setForCircuit(Circuit circuit, Attribute attr, Object newValue) { @SuppressWarnings("unchecked") Attribute a = (Attribute) attr; AttributeSet attrs = circuit.getStaticAttributes(); Object oldValue = attrs.getValue(a); log.add(CircuitChange.setForCircuit(circuit, attr, oldValue, newValue)); attrs.setValue(a, newValue); } private ReplacementMap getMap(Circuit circuit) { ReplacementMap ret = replacements.get(circuit); if (ret == null) { ret = new ReplacementMap(); replacements.put(circuit, ret); } return ret; } CircuitTransaction getReverseTransaction() { CircuitMutation ret = new CircuitMutation(); ArrayList log = this.log; for (int i = log.size() - 1; i >= 0; i--) { ret.change(log.get(i).getReverseChange()); } return ret; } ReplacementMap getReplacementMap(Circuit circuit) { return replacements.get(circuit); } void markModified(Circuit circuit) { modified.add(circuit); } Collection getModifiedCircuits() { return Collections.unmodifiableSet(modified); } } logisim-2.7.1/src/com/cburch/logisim/circuit/CircuitMutator.java0000644000175000017500000000137511446034526024636 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; import com.cburch.logisim.comp.Component; import com.cburch.logisim.data.Attribute; public interface CircuitMutator { public void clear(Circuit circuit); public void add(Circuit circuit, Component comp); public void remove(Circuit circuit, Component comp); public void replace(Circuit circuit, Component oldComponent, Component newComponent); public void replace(Circuit circuit, ReplacementMap replacements); public void set(Circuit circuit, Component comp, Attribute attr, Object value); public void setForCircuit(Circuit circuit, Attribute attr, Object value); } logisim-2.7.1/src/com/cburch/logisim/circuit/CircuitMutation.java0000644000175000017500000000641411500267110024766 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import com.cburch.logisim.comp.Component; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.proj.Action; import com.cburch.logisim.util.StringGetter; public final class CircuitMutation extends CircuitTransaction { private Circuit primary; private List changes; public CircuitMutation(Circuit circuit) { this.primary = circuit; this.changes = new ArrayList(); } CircuitMutation() { this(null); } public boolean isEmpty() { return changes.isEmpty(); } public void clear() { changes.add(CircuitChange.clear(primary, null)); } public void add(Component comp) { changes.add(CircuitChange.add(primary, comp)); } public void addAll(Collection comps) { changes.add(CircuitChange.addAll(primary, comps)); } public void remove(Component comp) { changes.add(CircuitChange.remove(primary, comp)); } public void removeAll(Collection comps) { changes.add(CircuitChange.removeAll(primary, comps)); } public void replace(Component oldComp, Component newComp) { ReplacementMap repl = new ReplacementMap(oldComp, newComp); changes.add(CircuitChange.replace(primary, repl)); } public void replace(ReplacementMap replacements) { if (!replacements.isEmpty()) { replacements.freeze(); changes.add(CircuitChange.replace(primary, replacements)); } } public void set(Component comp, Attribute attr, Object value) { changes.add(CircuitChange.set(primary, comp, attr, value)); } public void setForCircuit(Attribute attr, Object value) { changes.add(CircuitChange.setForCircuit(primary, attr, value)); } void change(CircuitChange change) { changes.add(change); } public Action toAction(StringGetter name) { if (name == null) name = Strings.getter("unknownChangeAction"); return new CircuitAction(name, this); } @Override protected Map getAccessedCircuits() { HashMap accessMap = new HashMap(); HashSet supercircsDone = new HashSet(); for (CircuitChange change : changes) { Circuit circ = change.getCircuit(); accessMap.put(circ, READ_WRITE); if (change.concernsSupercircuit()) { boolean isFirstForCirc = supercircsDone.add(circ); if (isFirstForCirc) { for (Circuit supercirc : circ.getCircuitsUsingThis()) { accessMap.put(supercirc, READ_WRITE); } } } } return accessMap; } @Override protected void run(CircuitMutator mutator) { Circuit curCircuit = null; ReplacementMap curReplacements = null; for (CircuitChange change : changes) { Circuit circ = change.getCircuit(); if (circ != curCircuit) { if (curCircuit != null) { mutator.replace(curCircuit, curReplacements); } curCircuit = circ; curReplacements = new ReplacementMap(); } change.execute(mutator, curReplacements); } if (curCircuit != null) { mutator.replace(curCircuit, curReplacements); } } }logisim-2.7.1/src/com/cburch/logisim/circuit/CircuitLocker.java0000644000175000017500000000642411447117130024414 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; class CircuitLocker { private static AtomicInteger NEXT_SERIAL_NUMBER = new AtomicInteger(0); private int serialNumber; private ReadWriteLock circuitLock; private transient Thread mutatingThread; private CircuitMutatorImpl mutatingMutator; CircuitLocker() { serialNumber = NEXT_SERIAL_NUMBER.getAndIncrement(); circuitLock = new ReentrantReadWriteLock(); mutatingThread = null; mutatingMutator = null; } public boolean hasWriteLock() { return mutatingThread == Thread.currentThread(); } CircuitMutatorImpl getMutator() { return mutatingMutator; } void checkForWritePermission(String operationName) { if (mutatingThread != Thread.currentThread()) { throw new IllegalStateException(operationName + " outside transaction"); } } void execute(CircuitTransaction xn) { if (mutatingThread == Thread.currentThread()) { xn.run(mutatingMutator); } else { xn.execute(); } } private static class CircuitComparator implements Comparator { public int compare(Circuit a, Circuit b) { int an = a.getLocker().serialNumber; int bn = b.getLocker().serialNumber; return an - bn; } } static Map acquireLocks(CircuitTransaction xn, CircuitMutatorImpl mutator) { Map requests = xn.getAccessedCircuits(); Map circuitLocks = new HashMap(); // Acquire locks in serial-number order to avoid deadlock Circuit[] lockOrder = requests.keySet().toArray(new Circuit[0]); Arrays.sort(lockOrder, new CircuitComparator()); try { for (Circuit circ : lockOrder) { Integer access = requests.get(circ); CircuitLocker locker = circ.getLocker(); if (access == CircuitTransaction.READ_ONLY) { Lock lock = locker.circuitLock.readLock(); lock.lock(); circuitLocks.put(circ, lock); } else if (access == CircuitTransaction.READ_WRITE) { Thread curThread = Thread.currentThread(); if (locker.mutatingThread == curThread) { ; // nothing to do - thread already has lock } else { Lock lock = locker.circuitLock.writeLock(); lock.lock(); circuitLocks.put(circ, lock); locker.mutatingThread = Thread.currentThread(); if (mutator == null) { mutator = new CircuitMutatorImpl(); } locker.mutatingMutator = mutator; } } } } catch (RuntimeException t) { releaseLocks(circuitLocks); throw t; } return circuitLocks; } static void releaseLocks(Map locks) { Thread curThread = Thread.currentThread(); for (Map.Entry entry : locks.entrySet()) { Circuit circ = entry.getKey(); Lock lock = entry.getValue(); CircuitLocker locker = circ.getLocker(); if (locker.mutatingThread == curThread) { locker.mutatingThread = null; locker.mutatingMutator = null; } lock.unlock(); } } } logisim-2.7.1/src/com/cburch/logisim/circuit/CircuitListener.java0000644000175000017500000000041711446034526024764 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; public interface CircuitListener { public void circuitChanged(CircuitEvent event); } logisim-2.7.1/src/com/cburch/logisim/circuit/CircuitException.java0000644000175000017500000000045411446034526025136 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; public class CircuitException extends RuntimeException { public CircuitException(String msg) { super(msg); } } logisim-2.7.1/src/com/cburch/logisim/circuit/CircuitEvent.java0000644000175000017500000000217711446034526024265 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; public class CircuitEvent { public final static int ACTION_SET_NAME = 0; // name changed public final static int ACTION_ADD = 1; // component added public final static int ACTION_REMOVE = 2; // component removed public final static int ACTION_CHANGE = 3; // component changed public final static int ACTION_INVALIDATE = 4; // component invalidated (pin types changed) public final static int ACTION_CLEAR = 5; // entire circuit cleared public final static int TRANSACTION_DONE = 6; private int action; private Circuit circuit; private Object data; CircuitEvent(int action, Circuit circuit, Object data) { this.action = action; this.circuit = circuit; this.data = data; } // access methods public int getAction() { return action; } public Circuit getCircuit() { return circuit; } public Object getData() { return data; } public CircuitTransactionResult getResult() { return (CircuitTransactionResult) data; } } logisim-2.7.1/src/com/cburch/logisim/circuit/CircuitChange.java0000644000175000017500000001323011524651344024361 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; import java.util.Collection; import com.cburch.logisim.comp.Component; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.std.wiring.Pin; class CircuitChange { static final int CLEAR = 0; static final int ADD = 1; static final int ADD_ALL = 2; static final int REMOVE = 3; static final int REMOVE_ALL = 4; static final int REPLACE = 5; static final int SET = 6; static final int SET_FOR_CIRCUIT = 7; public static CircuitChange clear(Circuit circuit, Collection oldComponents) { return new CircuitChange(circuit, CLEAR, oldComponents); } public static CircuitChange add(Circuit circuit, Component comp) { return new CircuitChange(circuit, ADD, comp); } public static CircuitChange addAll(Circuit circuit, Collection comps) { return new CircuitChange(circuit, ADD_ALL, comps); } public static CircuitChange remove(Circuit circuit, Component comp) { return new CircuitChange(circuit, REMOVE, comp); } public static CircuitChange removeAll(Circuit circuit, Collection comps) { return new CircuitChange(circuit, REMOVE_ALL, comps); } public static CircuitChange replace(Circuit circuit, ReplacementMap replMap) { return new CircuitChange(circuit, REPLACE, null, null, null, replMap); } public static CircuitChange set(Circuit circuit, Component comp, Attribute attr, Object value) { return new CircuitChange(circuit, SET, comp, attr, null, value); } public static CircuitChange set(Circuit circuit, Component comp, Attribute attr, Object oldValue, Object newValue) { return new CircuitChange(circuit, SET, comp, attr, oldValue, newValue); } public static CircuitChange setForCircuit(Circuit circuit, Attribute attr, Object v) { return new CircuitChange(circuit, SET_FOR_CIRCUIT, null, attr, null, v); } public static CircuitChange setForCircuit(Circuit circuit, Attribute attr, Object oldValue, Object newValue) { return new CircuitChange(circuit, SET_FOR_CIRCUIT, null, attr, oldValue, newValue); } private Circuit circuit; private int type; private Component comp; private Collection comps; private Attribute attr; private Object oldValue; private Object newValue; private CircuitChange(Circuit circuit, int type, Component comp) { this(circuit, type, comp, null, null, null); } private CircuitChange(Circuit circuit, int type, Collection comps) { this(circuit, type, null, null, null, null); this.comps = comps; } private CircuitChange(Circuit circuit, int type, Component comp, Attribute attr, Object oldValue, Object newValue) { this.circuit = circuit; this.type = type; this.comp = comp; this.attr = attr; this.oldValue = oldValue; this.newValue = newValue; } public Circuit getCircuit() { return circuit; } public int getType() { return type; } public Component getComponent() { return comp; } public Attribute getAttribute() { return attr; } public Object getOldValue() { return oldValue; } public Object getNewValue() { return newValue; } CircuitChange getReverseChange() { switch (type) { case CLEAR: return CircuitChange.addAll(circuit, comps); case ADD: return CircuitChange.remove(circuit, comp); case ADD_ALL: return CircuitChange.removeAll(circuit, comps); case REMOVE: return CircuitChange.add(circuit, comp); case REMOVE_ALL: return CircuitChange.addAll(circuit, comps); case SET: return CircuitChange.set(circuit, comp, attr, newValue, oldValue); case SET_FOR_CIRCUIT: return CircuitChange.setForCircuit(circuit, attr, newValue, oldValue); case REPLACE: return CircuitChange.replace(circuit, ((ReplacementMap) newValue).getInverseMap()); default: throw new IllegalArgumentException("unknown change type " + type); } } void execute(CircuitMutator mutator, ReplacementMap prevReplacements) { switch (type) { case CLEAR: mutator.clear(circuit); prevReplacements.reset(); break; case ADD: prevReplacements.add(comp); break; case ADD_ALL: for (Component comp : comps) prevReplacements.add(comp); break; case REMOVE: prevReplacements.remove(comp); break; case REMOVE_ALL: for (Component comp : comps) prevReplacements.remove(comp); break; case REPLACE: prevReplacements.append((ReplacementMap) newValue); break; case SET: mutator.replace(circuit, prevReplacements); prevReplacements.reset(); mutator.set(circuit, comp, attr, newValue); break; case SET_FOR_CIRCUIT: mutator.replace(circuit, prevReplacements); prevReplacements.reset(); mutator.setForCircuit(circuit, attr, newValue); break; default: throw new IllegalArgumentException("unknown change type " + type); } } boolean concernsSupercircuit() { switch (type) { case CLEAR: return true; case ADD: case REMOVE: return comp.getFactory() instanceof Pin; case ADD_ALL: case REMOVE_ALL: for (Component comp : comps) { if (comp.getFactory() instanceof Pin) return true; } return false; case REPLACE: ReplacementMap repl = (ReplacementMap) newValue; for (Component comp : repl.getRemovals()) { if (comp.getFactory() instanceof Pin) return true; } for (Component comp : repl.getAdditions()) { if (comp.getFactory() instanceof Pin) return true; } return false; case SET: return comp.getFactory() instanceof Pin && (attr == StdAttr.WIDTH || attr == Pin.ATTR_TYPE); default: return false; } } }logisim-2.7.1/src/com/cburch/logisim/circuit/CircuitAttributes.java0000644000175000017500000001415311520127122025313 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; import java.awt.Font; import java.util.Arrays; import java.util.List; import com.cburch.logisim.circuit.appear.CircuitAppearanceEvent; import com.cburch.logisim.circuit.appear.CircuitAppearanceListener; import com.cburch.logisim.data.AbstractAttributeSet; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeEvent; import com.cburch.logisim.data.AttributeListener; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.AttributeSets; import com.cburch.logisim.data.Attributes; import com.cburch.logisim.data.Direction; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.StdAttr; public class CircuitAttributes extends AbstractAttributeSet { public static final Attribute NAME_ATTR = Attributes.forString("circuit", Strings.getter("circuitName")); public static final Attribute LABEL_LOCATION_ATTR = Attributes.forDirection("labelloc", Strings.getter("circuitLabelLocAttr")); public static final Attribute CIRCUIT_LABEL_ATTR = Attributes.forString("clabel", Strings.getter("circuitLabelAttr")); public static final Attribute CIRCUIT_LABEL_FACING_ATTR = Attributes.forDirection("clabelup", Strings.getter("circuitLabelDirAttr")); public static final Attribute CIRCUIT_LABEL_FONT_ATTR = Attributes.forFont("clabelfont", Strings.getter("circuitLabelFontAttr")); private static final Attribute[] STATIC_ATTRS = { NAME_ATTR, CIRCUIT_LABEL_ATTR, CIRCUIT_LABEL_FACING_ATTR, CIRCUIT_LABEL_FONT_ATTR, }; private static final Object[] STATIC_DEFAULTS = { "", "", Direction.EAST, StdAttr.DEFAULT_LABEL_FONT, }; private static final List> INSTANCE_ATTRS = Arrays.asList(new Attribute[] { StdAttr.FACING, StdAttr.LABEL, LABEL_LOCATION_ATTR, StdAttr.LABEL_FONT, CircuitAttributes.NAME_ATTR, CIRCUIT_LABEL_ATTR, CIRCUIT_LABEL_FACING_ATTR, CIRCUIT_LABEL_FONT_ATTR, }); private static class StaticListener implements AttributeListener { private Circuit source; private StaticListener(Circuit s) { source = s; } public void attributeListChanged(AttributeEvent e) { } public void attributeValueChanged(AttributeEvent e) { if (e.getAttribute() == NAME_ATTR) { source.fireEvent(CircuitEvent.ACTION_SET_NAME, e.getValue()); } } } private class MyListener implements AttributeListener, CircuitAppearanceListener { public void attributeListChanged(AttributeEvent e) { } public void attributeValueChanged(AttributeEvent e) { @SuppressWarnings("unchecked") Attribute a = (Attribute) e.getAttribute(); fireAttributeValueChanged(a, e.getValue()); } public void circuitAppearanceChanged(CircuitAppearanceEvent e) { SubcircuitFactory factory; factory = (SubcircuitFactory) subcircInstance.getFactory(); if (e.isConcerning(CircuitAppearanceEvent.PORTS)) { factory.computePorts(subcircInstance); } if (e.isConcerning(CircuitAppearanceEvent.BOUNDS)) { subcircInstance.recomputeBounds(); } subcircInstance.fireInvalidated(); } } static AttributeSet createBaseAttrs(Circuit source, String name) { AttributeSet ret = AttributeSets.fixedSet(STATIC_ATTRS, STATIC_DEFAULTS); ret.setValue(CircuitAttributes.NAME_ATTR, name); ret.addAttributeListener(new StaticListener(source)); return ret; } private Circuit source; private Instance subcircInstance; private Direction facing; private String label; private Direction labelLocation; private Font labelFont; private MyListener listener; private Instance[] pinInstances; public CircuitAttributes(Circuit source) { this.source = source; subcircInstance = null; facing = source.getAppearance().getFacing(); label = ""; labelLocation = Direction.NORTH; labelFont = StdAttr.DEFAULT_LABEL_FONT; pinInstances = new Instance[0]; } void setSubcircuit(Instance value) { subcircInstance = value; if (subcircInstance != null && listener == null) { listener = new MyListener(); source.getStaticAttributes().addAttributeListener(listener); source.getAppearance().addCircuitAppearanceListener(listener); } } Instance[] getPinInstances() { return pinInstances; } void setPinInstances(Instance[] value) { pinInstances = value; } public Direction getFacing() { return facing; } @Override protected void copyInto(AbstractAttributeSet dest) { CircuitAttributes other = (CircuitAttributes) dest; other.subcircInstance = null; other.listener = null; } @Override public boolean isToSave(Attribute attr) { Attribute[] statics = STATIC_ATTRS; for (int i = 0; i < statics.length; i++) { if (statics[i] == attr) return false; } return true; } @Override public List> getAttributes() { return INSTANCE_ATTRS; } @Override @SuppressWarnings("unchecked") public E getValue(Attribute attr) { if (attr == StdAttr.FACING) return (E) facing; if (attr == StdAttr.LABEL) return (E) label; if (attr == StdAttr.LABEL_FONT) return (E) labelFont; if (attr == LABEL_LOCATION_ATTR) return (E) labelLocation; else return source.getStaticAttributes().getValue(attr); } @Override public void setValue(Attribute attr, E value) { if (attr == StdAttr.FACING) { Direction val = (Direction) value; facing = val; fireAttributeValueChanged(StdAttr.FACING, val); if (subcircInstance != null) subcircInstance.recomputeBounds(); } else if (attr == StdAttr.LABEL) { String val = (String) value; label = val; fireAttributeValueChanged(StdAttr.LABEL, val); } else if (attr == StdAttr.LABEL_FONT) { Font val = (Font) value; labelFont = val; fireAttributeValueChanged(StdAttr.LABEL_FONT, val); } else if (attr == LABEL_LOCATION_ATTR) { Direction val = (Direction) value; labelLocation = val; fireAttributeValueChanged(LABEL_LOCATION_ATTR, val); } else { source.getStaticAttributes().setValue(attr, value); if (attr == NAME_ATTR) { source.fireEvent(CircuitEvent.ACTION_SET_NAME, value); } } } } logisim-2.7.1/src/com/cburch/logisim/circuit/CircuitAction.java0000644000175000017500000000161611446034526024416 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; import com.cburch.logisim.proj.Action; import com.cburch.logisim.proj.Project; import com.cburch.logisim.util.StringGetter; public class CircuitAction extends Action { private StringGetter name; private CircuitTransaction forward; private CircuitTransaction reverse; CircuitAction(StringGetter name, CircuitMutation forward) { this.name = name; this.forward = forward; } @Override public String getName() { return name.get(); } @Override public void doIt(Project proj) { CircuitTransactionResult result = forward.execute(); if (result != null) { reverse = result.getReverseTransaction(); } } @Override public void undo(Project proj) { if (reverse != null) { reverse.execute(); } } } logisim-2.7.1/src/com/cburch/logisim/circuit/Circuit.java0000644000175000017500000003030411524651254023254 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; import java.awt.Graphics; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; import java.util.WeakHashMap; import com.cburch.logisim.circuit.appear.CircuitAppearance; import com.cburch.logisim.comp.Component; import com.cburch.logisim.comp.ComponentDrawContext; import com.cburch.logisim.comp.ComponentEvent; import com.cburch.logisim.comp.ComponentFactory; import com.cburch.logisim.comp.ComponentListener; import com.cburch.logisim.comp.EndData; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Location; import com.cburch.logisim.std.wiring.Clock; import com.cburch.logisim.util.CollectionUtil; import com.cburch.logisim.util.EventSourceWeakSupport; public class Circuit { private class EndChangedTransaction extends CircuitTransaction { private Component comp; private Map toRemove; private Map toAdd; EndChangedTransaction(Component comp, Map toRemove, Map toAdd) { this.comp = comp; this.toRemove = toRemove; this.toAdd = toAdd; } @Override protected Map getAccessedCircuits() { return Collections.singletonMap(Circuit.this, READ_WRITE); } @Override protected void run(CircuitMutator mutator) { for (Location loc : toRemove.keySet()) { EndData removed = toRemove.get(loc); EndData replaced = toAdd.remove(loc); if (replaced == null) { wires.remove(comp, removed); } else if (!replaced.equals(removed)) { wires.replace(comp, removed, replaced); } } for (EndData end : toAdd.values()) { wires.add(comp, end); } ((CircuitMutatorImpl) mutator).markModified(Circuit.this); } } private class MyComponentListener implements ComponentListener { public void endChanged(ComponentEvent e) { locker.checkForWritePermission("ends changed"); Component comp = e.getSource(); HashMap toRemove = toMap(e.getOldData()); HashMap toAdd = toMap(e.getData()); EndChangedTransaction xn = new EndChangedTransaction(comp, toRemove, toAdd); locker.execute(xn); fireEvent(CircuitEvent.ACTION_INVALIDATE, comp); } private HashMap toMap(Object val) { HashMap map = new HashMap(); if (val instanceof List) { @SuppressWarnings("unchecked") List valList = (List) val; int i = -1; for (EndData end : valList) { i++; if (end != null) { map.put(end.getLocation(), end); } } } else if (val instanceof EndData) { EndData end = (EndData) val; map.put(end.getLocation(), end); } return map; } public void componentInvalidated(ComponentEvent e) { fireEvent(CircuitEvent.ACTION_INVALIDATE, e.getSource()); } } private MyComponentListener myComponentListener = new MyComponentListener(); private CircuitAppearance appearance; private AttributeSet staticAttrs; private SubcircuitFactory subcircuitFactory; private EventSourceWeakSupport listeners = new EventSourceWeakSupport(); private HashSet comps = new HashSet(); // doesn't include wires CircuitWires wires = new CircuitWires(); // wires is package-protected for CircuitState and Analyze only. private ArrayList clocks = new ArrayList(); private CircuitLocker locker; private WeakHashMap circuitsUsingThis; public Circuit(String name) { appearance = new CircuitAppearance(this); staticAttrs = CircuitAttributes.createBaseAttrs(this, name); subcircuitFactory = new SubcircuitFactory(this); locker = new CircuitLocker(); circuitsUsingThis = new WeakHashMap(); } CircuitLocker getLocker() { return locker; } public Collection getCircuitsUsingThis() { return circuitsUsingThis.values(); } public void mutatorClear() { locker.checkForWritePermission("clear"); Set oldComps = comps; comps = new HashSet(); wires = new CircuitWires(); clocks.clear(); for (Component comp : oldComps) { if (comp.getFactory() instanceof SubcircuitFactory) { SubcircuitFactory sub = (SubcircuitFactory) comp.getFactory(); sub.getSubcircuit().circuitsUsingThis.remove(comp); } } fireEvent(CircuitEvent.ACTION_CLEAR, oldComps); } @Override public String toString() { return staticAttrs.getValue(CircuitAttributes.NAME_ATTR); } public AttributeSet getStaticAttributes() { return staticAttrs; } // // Listener methods // public void addCircuitListener(CircuitListener what) { listeners.add(what); } public void removeCircuitListener(CircuitListener what) { listeners.remove(what); } void fireEvent(int action, Object data) { fireEvent(new CircuitEvent(action, this, data)); } private void fireEvent(CircuitEvent event) { for (CircuitListener l : listeners) { l.circuitChanged(event); } } // // access methods // public String getName() { return staticAttrs.getValue(CircuitAttributes.NAME_ATTR); } public CircuitAppearance getAppearance() { return appearance; } public SubcircuitFactory getSubcircuitFactory() { return subcircuitFactory; } public Set getWidthIncompatibilityData() { return wires.getWidthIncompatibilityData(); } public BitWidth getWidth(Location p) { return wires.getWidth(p); } public Location getWidthDeterminant(Location p) { return wires.getWidthDeterminant(p); } public boolean hasConflict(Component comp) { return wires.points.hasConflict(comp); } public Component getExclusive(Location loc) { return wires.points.getExclusive(loc); } private Set getComponents() { return CollectionUtil.createUnmodifiableSetUnion(comps, wires.getWires()); } public boolean contains(Component c) { return comps.contains(c) || wires.getWires().contains(c); } public Set getWires() { return wires.getWires(); } public Set getNonWires() { return comps; } public Collection getComponents(Location loc) { return wires.points.getComponents(loc); } public Collection getSplitCauses(Location loc) { return wires.points.getSplitCauses(loc); } public Collection getWires(Location loc) { return wires.points.getWires(loc); } public Collection getNonWires(Location loc) { return wires.points.getNonWires(loc); } public boolean isConnected(Location loc, Component ignore) { for (Component o : wires.points.getComponents(loc)) { if (o != ignore) return true; } return false; } public Set getSplitLocations() { return wires.points.getSplitLocations(); } public Collection getAllContaining(Location pt) { HashSet ret = new HashSet(); for (Component comp : getComponents()) { if (comp.contains(pt)) ret.add(comp); } return ret; } public Collection getAllContaining(Location pt, Graphics g) { HashSet ret = new HashSet(); for (Component comp : getComponents()) { if (comp.contains(pt, g)) ret.add(comp); } return ret; } public Collection getAllWithin(Bounds bds) { HashSet ret = new HashSet(); for (Component comp : getComponents()) { if (bds.contains(comp.getBounds())) ret.add(comp); } return ret; } public Collection getAllWithin(Bounds bds, Graphics g) { HashSet ret = new HashSet(); for (Component comp : getComponents()) { if (bds.contains(comp.getBounds(g))) ret.add(comp); } return ret; } public WireSet getWireSet(Wire start) { return wires.getWireSet(start); } public Bounds getBounds() { Bounds wireBounds = wires.getWireBounds(); Iterator it = comps.iterator(); if (!it.hasNext()) return wireBounds; Component first = it.next(); Bounds firstBounds = first.getBounds(); int xMin = firstBounds.getX(); int yMin = firstBounds.getY(); int xMax = xMin + firstBounds.getWidth(); int yMax = yMin + firstBounds.getHeight(); while (it.hasNext()) { Component c = it.next(); Bounds bds = c.getBounds(); int x0 = bds.getX(); int x1 = x0 + bds.getWidth(); int y0 = bds.getY(); int y1 = y0 + bds.getHeight(); if (x0 < xMin) xMin = x0; if (x1 > xMax) xMax = x1; if (y0 < yMin) yMin = y0; if (y1 > yMax) yMax = y1; } Bounds compBounds = Bounds.create(xMin, yMin, xMax - xMin, yMax - yMin); if (wireBounds.getWidth() == 0 || wireBounds.getHeight() == 0) { return compBounds; } else { return compBounds.add(wireBounds); } } public Bounds getBounds(Graphics g) { Bounds ret = wires.getWireBounds(); int xMin = ret.getX(); int yMin = ret.getY(); int xMax = xMin + ret.getWidth(); int yMax = yMin + ret.getHeight(); if (ret == Bounds.EMPTY_BOUNDS) { xMin = Integer.MAX_VALUE; yMin = Integer.MAX_VALUE; xMax = Integer.MIN_VALUE; yMax = Integer.MIN_VALUE; } for (Component c : comps) { Bounds bds = c.getBounds(g); if (bds != null && bds != Bounds.EMPTY_BOUNDS) { int x0 = bds.getX(); int x1 = x0 + bds.getWidth(); int y0 = bds.getY(); int y1 = y0 + bds.getHeight(); if (x0 < xMin) xMin = x0; if (x1 > xMax) xMax = x1; if (y0 < yMin) yMin = y0; if (y1 > yMax) yMax = y1; } } if (xMin > xMax || yMin > yMax) return Bounds.EMPTY_BOUNDS; return Bounds.create(xMin, yMin, xMax - xMin, yMax - yMin); } ArrayList getClocks() { return clocks; } // // action methods // public void setName(String name) { staticAttrs.setValue(CircuitAttributes.NAME_ATTR, name); } void mutatorAdd(Component c) { locker.checkForWritePermission("add"); if (c instanceof Wire) { Wire w = (Wire) c; if (w.getEnd0().equals(w.getEnd1())) return; boolean added = wires.add(w); if (!added) return; } else { // add it into the circuit boolean added = comps.add(c); if (!added) return; wires.add(c); ComponentFactory factory = c.getFactory(); if (factory instanceof Clock) { clocks.add(c); } else if (factory instanceof SubcircuitFactory) { SubcircuitFactory subcirc = (SubcircuitFactory) factory; subcirc.getSubcircuit().circuitsUsingThis.put(c, this); } c.addComponentListener(myComponentListener); } fireEvent(CircuitEvent.ACTION_ADD, c); } void mutatorRemove(Component c) { locker.checkForWritePermission("remove"); if (c instanceof Wire) { wires.remove(c); } else { wires.remove(c); comps.remove(c); ComponentFactory factory = c.getFactory(); if (factory instanceof Clock) { clocks.remove(c); } else if (factory instanceof SubcircuitFactory) { SubcircuitFactory subcirc = (SubcircuitFactory) factory; subcirc.getSubcircuit().circuitsUsingThis.remove(c); } c.removeComponentListener(myComponentListener); } fireEvent(CircuitEvent.ACTION_REMOVE, c); } // // Graphics methods // public void draw(ComponentDrawContext context, Collection hidden) { Graphics g = context.getGraphics(); Graphics g_copy = g.create(); context.setGraphics(g_copy); wires.draw(context, hidden); if (hidden == null || hidden.size() == 0) { for (Component c : comps) { Graphics g_new = g.create(); context.setGraphics(g_new); g_copy.dispose(); g_copy = g_new; c.draw(context); } } else { for (Component c : comps) { if (!hidden.contains(c)) { Graphics g_new = g.create(); context.setGraphics(g_new); g_copy.dispose(); g_copy = g_new; try { c.draw(context); } catch (RuntimeException e) { // this is a JAR developer error - display it and move on e.printStackTrace(); } } } } context.setGraphics(g); g_copy.dispose(); } // // helper methods for other classes in package // public static boolean isInput(Component comp) { return comp.getEnd(0).getType() != EndData.INPUT_ONLY; } } logisim-2.7.1/src/com/cburch/logisim/circuit/appear/0000755000175000017500000000000011541661276022263 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/logisim/circuit/appear/Strings.java0000644000175000017500000000120311446034524024545 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit.appear; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.StringGetter; class Strings { private static LocaleManager source = new LocaleManager("resources/logisim", "circuit"); public static String get(String key) { return source.get(key); } public static StringGetter getter(String key) { return source.getter(key); } public static StringGetter getter(String key, String arg) { return source.getter(key, arg); } } logisim-2.7.1/src/com/cburch/logisim/circuit/appear/PortManager.java0000644000175000017500000001461011450405514025335 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit.appear; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import com.cburch.draw.model.CanvasObject; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.StdAttr; class PortManager { private CircuitAppearance appearance; private boolean doingUpdate; PortManager(CircuitAppearance appearance) { this.appearance = appearance; this.doingUpdate = false; } void updatePorts() { appearance.recomputePorts(); } void updatePorts(Set adds, Set removes, Map replaces, Collection allPins) { if (appearance.isDefaultAppearance()) { appearance.recomputePorts(); } else if (!doingUpdate) { // "doingUpdate" ensures infinite recursion doesn't happen try { doingUpdate = true; performUpdate(adds, removes, replaces, allPins); appearance.recomputePorts(); } finally { doingUpdate = false; } } } private void performUpdate(Set adds, Set removes, Map replaces, Collection allPins) { // Find the current objects corresponding to pins Map oldObjects; oldObjects = new HashMap(); AppearanceAnchor anchor = null; for (CanvasObject o : appearance.getObjectsFromBottom()) { if (o instanceof AppearancePort) { AppearancePort port = (AppearancePort) o; oldObjects.put(port.getPin(), port); } else if (o instanceof AppearanceAnchor) { anchor = (AppearanceAnchor) o; } } // ensure we have the anchor in the circuit if (anchor == null) { for (CanvasObject o : DefaultAppearance.build(allPins)) { if (o instanceof AppearanceAnchor) { anchor = (AppearanceAnchor) o; } } if (anchor == null) { anchor = new AppearanceAnchor(Location.create(100, 100)); } int dest = appearance.getObjectsFromBottom().size(); appearance.addObjects(dest, Collections.singleton(anchor)); } // Compute how the ports should change ArrayList portRemoves; portRemoves = new ArrayList(removes.size()); ArrayList portAdds; portAdds = new ArrayList(adds.size()); // handle removals for (Instance pin : removes) { AppearancePort port = oldObjects.remove(pin); if (port != null) { portRemoves.add(port); } } // handle replacements ArrayList addsCopy = new ArrayList(adds); for (Map.Entry entry : replaces.entrySet()) { AppearancePort port = oldObjects.remove(entry.getKey()); if (port != null) { port.setPin(entry.getValue()); oldObjects.put(entry.getValue(), port); } else { // this really shouldn't happen, but just to make sure... addsCopy.add(entry.getValue()); } } // handle additions DefaultAppearance.sortPinList(addsCopy, Direction.EAST); // They're probably not really all facing east. // I'm just sorting them so it works predictably. for (Instance pin : addsCopy) { if (!oldObjects.containsKey(pin)) { Location loc = computeDefaultLocation(appearance, pin, oldObjects); AppearancePort o = new AppearancePort(loc, pin); portAdds.add(o); oldObjects.put(pin, o); } } // Now update the appearance appearance.replaceAutomatically(portRemoves, portAdds); } private static Location computeDefaultLocation(CircuitAppearance appear, Instance pin, Map others) { // Determine which locations are being used in canvas, and look for // which instances facing the same way in layout Set usedLocs = new HashSet(); List sameWay = new ArrayList(); Direction facing = pin.getAttributeValue(StdAttr.FACING); for (Map.Entry entry : others.entrySet()) { Instance pin2 = entry.getKey(); Location loc = entry.getValue().getLocation(); usedLocs.add(loc); if (pin2.getAttributeValue(StdAttr.FACING) == facing) { sameWay.add(pin2); } } // if at least one faces the same way, place pin relative to that if (sameWay.size() > 0) { sameWay.add(pin); DefaultAppearance.sortPinList(sameWay, facing); boolean isFirst = false; Instance neighbor = null; // (preferably previous in map) for (Instance p : sameWay) { if (p == pin) { break; } else { neighbor = p; } } if (neighbor == null) { // pin must have been first in list neighbor = sameWay.get(1); } int dx; int dy; if (facing == Direction.EAST || facing == Direction.WEST) { dx = 0; dy = isFirst? -10 : 10; } else { dx = isFirst ? -10 : 10; dy = 0; } Location loc = others.get(neighbor).getLocation(); do { loc = loc.translate(dx, dy); } while (usedLocs.contains(loc)); if (loc.getX() >= 0 && loc.getY() >= 0) { return loc; } do { loc = loc.translate(-dx, -dy); } while (usedLocs.contains(loc)); return loc; } // otherwise place it on the boundary of the bounding rectangle Bounds bds = appear.getAbsoluteBounds(); int x; int y; int dx = 0; int dy = 0; if (facing == Direction.EAST) { // on west side by default x = bds.getX() - 7; y = bds.getY() + 5; dy = 10; } else if (facing == Direction.WEST) { // on east side by default x = bds.getX() + bds.getWidth() - 3; y = bds.getY() + 5; dy = 10; } else if (facing == Direction.SOUTH) { // on north side by default x = bds.getX() + 5; y = bds.getY() - 7; dx = 10; } else { // on south side by default x = bds.getX() + 5; y = bds.getY() + bds.getHeight() - 3; dx = 10; } x = (x + 9) / 10 * 10; // round coordinates up to ensure they're on grid y = (y + 9) / 10 * 10; Location loc = Location.create(x, y); while (usedLocs.contains(loc)) { loc = loc.translate(dx, dy); } return loc; } } logisim-2.7.1/src/com/cburch/logisim/circuit/appear/DefaultAppearance.java0000644000175000017500000001266511450405514026472 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit.appear; import java.awt.Color; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import com.cburch.draw.model.CanvasObject; import com.cburch.draw.shapes.Curve; import com.cburch.draw.shapes.DrawAttr; import com.cburch.draw.shapes.Rectangle; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.StdAttr; class DefaultAppearance { private static final int OFFS = 50; private DefaultAppearance() { } private static class CompareLocations implements Comparator { private boolean byX; CompareLocations(boolean byX) { this.byX = byX; } public int compare(Instance a, Instance b) { Location aloc = a.getLocation(); Location bloc = b.getLocation(); if (byX) { int ax = aloc.getX(); int bx = bloc.getX(); if (ax != bx) { return ax < bx ? -1 : 1; } } else { int ay = aloc.getY(); int by = bloc.getY(); if (ay != by) { return ay < by ? -1 : 1; } } return aloc.compareTo(bloc); } } static void sortPinList(List pins, Direction facing) { if (facing == Direction.NORTH || facing == Direction.SOUTH) { Comparator sortHorizontal = new CompareLocations(true); Collections.sort(pins, sortHorizontal); } else { Comparator sortVertical = new CompareLocations(false); Collections.sort(pins, sortVertical); } } public static List build(Collection pins) { Map> edge; edge = new HashMap>(); edge.put(Direction.NORTH, new ArrayList()); edge.put(Direction.SOUTH, new ArrayList()); edge.put(Direction.EAST, new ArrayList()); edge.put(Direction.WEST, new ArrayList()); for (Instance pin : pins) { Direction pinFacing = pin.getAttributeValue(StdAttr.FACING); Direction pinEdge = pinFacing.reverse(); List e = edge.get(pinEdge); e.add(pin); } for (Map.Entry> entry : edge.entrySet()) { sortPinList(entry.getValue(), entry.getKey()); } int numNorth = edge.get(Direction.NORTH).size(); int numSouth = edge.get(Direction.SOUTH).size(); int numEast = edge.get(Direction.EAST).size(); int numWest = edge.get(Direction.WEST).size(); int maxVert = Math.max(numNorth, numSouth); int maxHorz = Math.max(numEast, numWest); int offsNorth = computeOffset(numNorth, numSouth, maxHorz); int offsSouth = computeOffset(numSouth, numNorth, maxHorz); int offsEast = computeOffset(numEast, numWest, maxVert); int offsWest = computeOffset(numWest, numEast, maxVert); int width = computeDimension(maxVert, maxHorz); int height = computeDimension(maxHorz, maxVert); // compute position of anchor relative to top left corner of box int ax; int ay; if (numEast > 0) { // anchor is on east side ax = width; ay = offsEast; } else if (numNorth > 0) { // anchor is on north side ax = offsNorth; ay = 0; } else if (numWest > 0) { // anchor is on west side ax = 0; ay = offsWest; } else if (numSouth > 0) { // anchor is on south side ax = offsSouth; ay = height; } else { // anchor is top left corner ax = 0; ay = 0; } // place rectangle so anchor is on the grid int rx = OFFS + (9 - (ax + 9) % 10); int ry = OFFS + (9 - (ay + 9) % 10); Location e0 = Location.create(rx + (width - 8) / 2, ry + 1); Location e1 = Location.create(rx + (width + 8) / 2, ry + 1); Location ct = Location.create(rx + width / 2, ry + 11); Curve notch = new Curve(e0, e1, ct); notch.setValue(DrawAttr.STROKE_WIDTH, Integer.valueOf(2)); notch.setValue(DrawAttr.STROKE_COLOR, Color.GRAY); Rectangle rect = new Rectangle(rx, ry, width, height); rect.setValue(DrawAttr.STROKE_WIDTH, Integer.valueOf(2)); List ret = new ArrayList(); ret.add(notch); ret.add(rect); placePins(ret, edge.get(Direction.WEST), rx, ry + offsWest, 0, 10); placePins(ret, edge.get(Direction.EAST), rx + width, ry + offsEast, 0, 10); placePins(ret, edge.get(Direction.NORTH), rx + offsNorth, ry, 10, 0); placePins(ret, edge.get(Direction.SOUTH), rx + offsSouth, ry + height, 10, 0); ret.add(new AppearanceAnchor(Location.create(rx + ax, ry + ay))); return ret; } private static int computeDimension(int maxThis, int maxOthers) { if (maxThis < 3) { return 30; } else if (maxOthers == 0) { return 10 * maxThis; } else { return 10 * maxThis + 10; } } private static int computeOffset(int numFacing, int numOpposite, int maxOthers) { int maxThis = Math.max(numFacing, numOpposite); int maxOffs; switch (maxThis) { case 0: case 1: maxOffs = (maxOthers == 0 ? 15 : 10); break; case 2: maxOffs = 10; break; default: maxOffs = (maxOthers == 0 ? 5 : 10); } return maxOffs + 10 * ((maxThis - numFacing) / 2); } private static void placePins(List dest, List pins, int x, int y, int dx, int dy) { for (Instance pin : pins) { dest.add(new AppearancePort(Location.create(x, y), pin)); x += dx; y += dy; } } } logisim-2.7.1/src/com/cburch/logisim/circuit/appear/CircuitPins.java0000644000175000017500000000574011524651346025366 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit.appear; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import com.cburch.logisim.circuit.ReplacementMap; import com.cburch.logisim.comp.Component; import com.cburch.logisim.comp.ComponentEvent; import com.cburch.logisim.comp.ComponentListener; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeEvent; import com.cburch.logisim.data.AttributeListener; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.std.wiring.Pin; public class CircuitPins { private class MyComponentListener implements ComponentListener, AttributeListener { public void endChanged(ComponentEvent e) { appearanceManager.updatePorts(); } public void componentInvalidated(ComponentEvent e) { } public void attributeListChanged(AttributeEvent e) { } public void attributeValueChanged(AttributeEvent e) { Attribute attr = e.getAttribute(); if (attr == StdAttr.FACING || attr == StdAttr.LABEL || attr == Pin.ATTR_TYPE) { appearanceManager.updatePorts(); } } } private PortManager appearanceManager; private MyComponentListener myComponentListener; private Set pins; CircuitPins(PortManager appearanceManager) { this.appearanceManager = appearanceManager; myComponentListener = new MyComponentListener(); pins = new HashSet(); } public void transactionCompleted(ReplacementMap repl) { // determine the changes Set adds = new HashSet(); Set removes = new HashSet(); Map replaces = new HashMap(); for (Component comp : repl.getAdditions()) { if (comp.getFactory() instanceof Pin) { Instance in = Instance.getInstanceFor(comp); boolean added = pins.add(in); if (added) { comp.addComponentListener(myComponentListener); in.getAttributeSet().addAttributeListener(myComponentListener); adds.add(in); } } } for (Component comp : repl.getRemovals()) { if (comp.getFactory() instanceof Pin) { Instance in = Instance.getInstanceFor(comp); boolean removed = pins.remove(in); if (removed) { comp.removeComponentListener(myComponentListener); in.getAttributeSet().removeAttributeListener(myComponentListener); Collection rs = repl.getComponentsReplacing(comp); if (rs.isEmpty()) { removes.add(in); } else { Component r = rs.iterator().next(); Instance rin = Instance.getInstanceFor(r); adds.remove(rin); replaces.put(in, rin); } } } } appearanceManager.updatePorts(adds, removes, replaces, getPins()); } public Collection getPins() { return new ArrayList(pins); } } logisim-2.7.1/src/com/cburch/logisim/circuit/appear/CircuitAppearanceListener.java0000644000175000017500000000047411446034524030215 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit.appear; public interface CircuitAppearanceListener { public void circuitAppearanceChanged(CircuitAppearanceEvent event); } logisim-2.7.1/src/com/cburch/logisim/circuit/appear/CircuitAppearanceEvent.java0000644000175000017500000000136111446034524027505 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit.appear; import com.cburch.logisim.circuit.Circuit; public class CircuitAppearanceEvent { public static final int APPEARANCE = 1; public static final int BOUNDS = 2; public static final int PORTS = 4; public static final int ALL_TYPES = 7; private Circuit circuit; private int affects; CircuitAppearanceEvent(Circuit circuit, int affects) { this.circuit = circuit; this.affects = affects; } public Circuit getSource() { return circuit; } public boolean isConcerning(int type) { return (affects & type) != 0; } } logisim-2.7.1/src/com/cburch/logisim/circuit/appear/CircuitAppearance.java0000644000175000017500000002113311450405514026476 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit.appear; import java.awt.Graphics; import java.awt.Graphics2D; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; import com.cburch.draw.model.CanvasModelEvent; import com.cburch.draw.model.CanvasModelListener; import com.cburch.draw.model.CanvasObject; import com.cburch.draw.model.Drawing; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.util.EventSourceWeakSupport; public class CircuitAppearance extends Drawing { private class MyListener implements CanvasModelListener { public void modelChanged(CanvasModelEvent event) { if (!suppressRecompute) { setDefaultAppearance(false); fireCircuitAppearanceChanged(CircuitAppearanceEvent.ALL_TYPES); } } } private Circuit circuit; private EventSourceWeakSupport listeners; private PortManager portManager; private CircuitPins circuitPins; private MyListener myListener; private boolean isDefault; private boolean suppressRecompute; public CircuitAppearance(Circuit circuit) { this.circuit = circuit; listeners = new EventSourceWeakSupport(); portManager = new PortManager(this); circuitPins = new CircuitPins(portManager); myListener = new MyListener(); suppressRecompute = false; addCanvasModelListener(myListener); setDefaultAppearance(true); } public CircuitPins getCircuitPins() { return circuitPins; } public void addCircuitAppearanceListener(CircuitAppearanceListener l) { listeners.add(l); } public void removeCircuitAppearanceListener(CircuitAppearanceListener l) { listeners.remove(l); } void fireCircuitAppearanceChanged(int affected) { CircuitAppearanceEvent event; event = new CircuitAppearanceEvent(circuit, affected); for (CircuitAppearanceListener listener : listeners) { listener.circuitAppearanceChanged(event); } } void replaceAutomatically(List removes, List adds) { // this should be called only when substituting ports via PortManager boolean oldSuppress = suppressRecompute; try { suppressRecompute = true; removeObjects(removes); addObjects(getObjectsFromBottom().size() - 1, adds); recomputeDefaultAppearance(); } finally { suppressRecompute = oldSuppress; } fireCircuitAppearanceChanged(CircuitAppearanceEvent.ALL_TYPES); } public boolean isDefaultAppearance() { return isDefault; } public void setDefaultAppearance(boolean value) { if (isDefault != value) { isDefault = value; if (value) { recomputeDefaultAppearance(); } } } void recomputePorts() { if (isDefault) { recomputeDefaultAppearance(); } else { fireCircuitAppearanceChanged(CircuitAppearanceEvent.ALL_TYPES); } } private void recomputeDefaultAppearance() { if (isDefault) { List shapes; shapes = DefaultAppearance.build(circuitPins.getPins()); setObjectsForce(shapes); } } public Direction getFacing() { AppearanceAnchor anchor = findAnchor(); if (anchor == null) { return Direction.EAST; } else { return anchor.getFacing(); } } public void setObjectsForce(List shapesBase) { // This shouldn't ever be an issue, but just to make doubly sure, we'll // check that the anchor and all ports are in their proper places. List shapes = new ArrayList(shapesBase); int n = shapes.size(); int ports = 0; for (int i = n - 1; i >= 0; i--) { // count ports, move anchor to end CanvasObject o = shapes.get(i); if (o instanceof AppearanceAnchor) { if (i != n - 1) { shapes.remove(i); shapes.add(o); } } else if (o instanceof AppearancePort) { ports++; } } for (int i = (n - ports - 1) - 1; i >= 0; i--) { // move ports to top CanvasObject o = shapes.get(i); if (o instanceof AppearancePort) { shapes.remove(i); shapes.add(n - ports - 1, o); i--; } } try { suppressRecompute = true; super.removeObjects(new ArrayList(getObjectsFromBottom())); super.addObjects(0, shapes); } finally { suppressRecompute = false; } fireCircuitAppearanceChanged(CircuitAppearanceEvent.ALL_TYPES); } public void paintSubcircuit(Graphics g, Direction facing) { Direction defaultFacing = getFacing(); double rotate = 0.0; if (facing != defaultFacing && g instanceof Graphics2D) { rotate = defaultFacing.toRadians() - facing.toRadians(); ((Graphics2D) g).rotate(rotate); } Location offset = findAnchorLocation(); g.translate(-offset.getX(), -offset.getY()); for (CanvasObject shape : getObjectsFromBottom()) { if (!(shape instanceof AppearanceElement)) { Graphics dup = g.create(); shape.paint(dup, null); dup.dispose(); } } g.translate(offset.getX(), offset.getY()); if (rotate != 0.0) { ((Graphics2D) g).rotate(-rotate); } } private Location findAnchorLocation() { AppearanceAnchor anchor = findAnchor(); if (anchor == null) { return Location.create(100, 100); } else { return anchor.getLocation(); } } private AppearanceAnchor findAnchor() { for (CanvasObject shape : getObjectsFromBottom()) { if (shape instanceof AppearanceAnchor) { return (AppearanceAnchor) shape; } } return null; } public Bounds getOffsetBounds() { return getBounds(true); } public Bounds getAbsoluteBounds() { return getBounds(false); } private Bounds getBounds(boolean relativeToAnchor) { Bounds ret = null; Location offset = null; for (CanvasObject o : getObjectsFromBottom()) { if (o instanceof AppearanceElement) { Location loc = ((AppearanceElement) o).getLocation(); if (o instanceof AppearanceAnchor) { offset = loc; } if (ret == null) { ret = Bounds.create(loc); } else { ret = ret.add(loc); } } else { if (ret == null) { ret = o.getBounds(); } else { ret = ret.add(o.getBounds()); } } } if (ret == null) { return Bounds.EMPTY_BOUNDS; } else if (relativeToAnchor && offset != null) { return ret.translate(-offset.getX(), -offset.getY()); } else { return ret; } } public SortedMap getPortOffsets(Direction facing) { Location anchor = null; Direction defaultFacing = Direction.EAST; List ports = new ArrayList(); for (CanvasObject shape : getObjectsFromBottom()) { if (shape instanceof AppearancePort) { ports.add((AppearancePort) shape); } else if (shape instanceof AppearanceAnchor) { AppearanceAnchor o = (AppearanceAnchor) shape; anchor = o.getLocation(); defaultFacing = o.getFacing(); } } SortedMap ret = new TreeMap(); for (AppearancePort port : ports) { Location loc = port.getLocation(); if (anchor != null) { loc = loc.translate(-anchor.getX(), -anchor.getY()); } if (facing != defaultFacing) { loc = loc.rotate(defaultFacing, facing, 0, 0); } ret.put(loc, port.getPin()); } return ret; } @Override public void addObjects(int index, Collection shapes) { super.addObjects(index, shapes); checkToFirePortsChanged(shapes); } @Override public void addObjects(Map shapes) { super.addObjects(shapes); checkToFirePortsChanged(shapes.keySet()); } @Override public void removeObjects(Collection shapes) { super.removeObjects(shapes); checkToFirePortsChanged(shapes); } @Override public void translateObjects(Collection shapes, int dx, int dy) { super.translateObjects(shapes, dx, dy); checkToFirePortsChanged(shapes); } private void checkToFirePortsChanged(Collection shapes) { if (affectsPorts(shapes)) { recomputePorts(); } } private boolean affectsPorts(Collection shapes) { for (CanvasObject o : shapes) { if (o instanceof AppearanceElement) { return true; } } return false; } } logisim-2.7.1/src/com/cburch/logisim/circuit/appear/AppearanceSvgReader.java0000644000175000017500000000350211450405514026756 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit.appear; import java.util.Map; import org.w3c.dom.Element; import com.cburch.draw.model.AbstractCanvasObject; import com.cburch.draw.shapes.SvgReader; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.instance.Instance; public class AppearanceSvgReader { public static AbstractCanvasObject createShape(Element elt, Map pins) { String name = elt.getTagName(); if (name.equals("circ-anchor") || name.equals("circ-origin")) { Location loc = getLocation(elt); AbstractCanvasObject ret = new AppearanceAnchor(loc); if (elt.hasAttribute("facing")) { Direction facing = Direction.parse(elt.getAttribute("facing")); ret.setValue(AppearanceAnchor.FACING, facing); } return ret; } else if (name.equals("circ-port")) { Location loc = getLocation(elt); String[] pinStr = elt.getAttribute("pin").split(","); Location pinLoc = Location.create(Integer.parseInt(pinStr[0].trim()), Integer.parseInt(pinStr[1].trim())); Instance pin = pins.get(pinLoc); if (pin == null) { return null; } else { return new AppearancePort(loc, pin); } } else { return SvgReader.createShape(elt); } } private static Location getLocation(Element elt) { double x = Double.parseDouble(elt.getAttribute("x")); double y = Double.parseDouble(elt.getAttribute("y")); double w = Double.parseDouble(elt.getAttribute("width")); double h = Double.parseDouble(elt.getAttribute("height")); int px = (int) Math.round(x + w / 2); int py = (int) Math.round(y + h / 2); return Location.create(px, py); } } logisim-2.7.1/src/com/cburch/logisim/circuit/appear/AppearancePort.java0000644000175000017500000000653211524651164026034 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit.appear; import java.awt.Color; import java.awt.Graphics; import java.util.List; import org.w3c.dom.Document; import org.w3c.dom.Element; import com.cburch.draw.model.CanvasObject; import com.cburch.draw.model.Handle; import com.cburch.draw.model.HandleGesture; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Location; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.std.wiring.Pin; import com.cburch.logisim.util.UnmodifiableList; public class AppearancePort extends AppearanceElement { private static final int INPUT_RADIUS = 4; private static final int OUTPUT_RADIUS = 5; private static final int MINOR_RADIUS = 2; public static final Color COLOR = Color.BLUE; private Instance pin; public AppearancePort(Location location, Instance pin) { super(location); this.pin = pin; } @Override public boolean matches(CanvasObject other) { if (other instanceof AppearancePort) { AppearancePort that = (AppearancePort) other; return this.matches(that) && this.pin == that.pin; } else { return false; } } @Override public int matchesHashCode() { return super.matchesHashCode() + pin.hashCode(); } @Override public String getDisplayName() { return Strings.get("circuitPort"); } @Override public Element toSvgElement(Document doc) { Location loc = getLocation(); Location pinLoc = pin.getLocation(); Element ret = doc.createElement("circ-port"); int r = isInput() ? INPUT_RADIUS : OUTPUT_RADIUS; ret.setAttribute("x", "" + (loc.getX() - r)); ret.setAttribute("y", "" + (loc.getY() - r)); ret.setAttribute("width", "" + 2 * r); ret.setAttribute("height", "" + 2 * r); ret.setAttribute("pin", "" + pinLoc.getX() + "," + pinLoc.getY()); return ret; } public Instance getPin() { return pin; } void setPin(Instance value) { pin = value; } private boolean isInput() { Instance p = pin; return p == null || Pin.FACTORY.isInputPin(p); } @Override public Bounds getBounds() { int r = isInput() ? INPUT_RADIUS : OUTPUT_RADIUS; return super.getBounds(r); } @Override public boolean contains(Location loc, boolean assumeFilled) { if (isInput()) { return getBounds().contains(loc); } else { return super.isInCircle(loc, OUTPUT_RADIUS); } } @Override public List getHandles(HandleGesture gesture) { Location loc = getLocation(); int r = isInput() ? INPUT_RADIUS : OUTPUT_RADIUS; return UnmodifiableList.create(new Handle[] { new Handle(this, loc.translate(-r, -r)), new Handle(this, loc.translate(r, -r)), new Handle(this, loc.translate(r, r)), new Handle(this, loc.translate(-r, r)) }); } @Override public void paint(Graphics g, HandleGesture gesture) { Location location = getLocation(); int x = location.getX(); int y = location.getY(); g.setColor(COLOR); if (isInput()) { int r = INPUT_RADIUS; g.drawRect(x - r, y - r, 2 * r, 2 * r); } else { int r = OUTPUT_RADIUS; g.drawOval(x - r, y - r, 2 * r, 2 * r); } g.fillOval(x - MINOR_RADIUS, y - MINOR_RADIUS, 2 * MINOR_RADIUS, 2 * MINOR_RADIUS); } } logisim-2.7.1/src/com/cburch/logisim/circuit/appear/AppearanceElement.java0000644000175000017500000000404611446034524026475 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit.appear; import java.util.Collections; import java.util.List; import java.util.Random; import com.cburch.draw.model.CanvasObject; import com.cburch.draw.model.AbstractCanvasObject; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Location; public abstract class AppearanceElement extends AbstractCanvasObject { private Location location; public AppearanceElement(Location location) { this.location = location; } public Location getLocation() { return location; } @Override public boolean matches(CanvasObject other) { if (other instanceof AppearanceElement) { AppearanceElement that = (AppearanceElement) other; return this.location.equals(that.location); } else { return false; } } @Override public int matchesHashCode() { return location.hashCode(); } @Override public List> getAttributes() { return Collections.emptyList(); } @Override public V getValue(Attribute attr) { return null; } @Override public boolean canRemove() { return false; } @Override protected void updateValue(Attribute attr, Object value) { // nothing to do } @Override public void translate(int dx, int dy) { location = location.translate(dx, dy); } protected boolean isInCircle(Location loc, int radius) { int dx = loc.getX() - location.getX(); int dy = loc.getY() - location.getY(); return dx * dx + dy * dy < radius * radius; } @Override public Location getRandomPoint(Bounds bds, Random rand) { return null; // this is only used to determine what lies on top of what - but the elements will always be on top anyway } protected Bounds getBounds(int radius) { return Bounds.create(location.getX() - radius, location.getY() - radius, 2 * radius, 2 * radius); } } logisim-2.7.1/src/com/cburch/logisim/circuit/appear/AppearanceAnchor.java0000644000175000017500000001025011541661276026316 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit.appear; import java.awt.Color; import java.awt.Graphics; import java.util.List; import org.w3c.dom.Document; import org.w3c.dom.Element; import com.cburch.draw.model.CanvasObject; import com.cburch.draw.model.Handle; import com.cburch.draw.model.HandleGesture; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.Attributes; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.util.UnmodifiableList; public class AppearanceAnchor extends AppearanceElement { public static final Attribute FACING = Attributes.forDirection("facing", Strings.getter("appearanceFacingAttr")); static final List> ATTRIBUTES = UnmodifiableList.create(new Attribute[] { FACING }); private static final int RADIUS = 3; private static final int INDICATOR_LENGTH = 8; private static final Color SYMBOL_COLOR = new Color(0, 128, 0); private Direction facing; public AppearanceAnchor(Location location) { super(location); facing = Direction.EAST; } @Override public boolean matches(CanvasObject other) { if (other instanceof AppearanceAnchor) { AppearanceAnchor that = (AppearanceAnchor) other; return super.matches(that) && this.facing.equals(that.facing); } else { return false; } } @Override public int matchesHashCode() { return super.matchesHashCode() * 31 + facing.hashCode(); } @Override public String getDisplayName() { return Strings.get("circuitAnchor"); } @Override public Element toSvgElement(Document doc) { Location loc = getLocation(); Element ret = doc.createElement("circ-anchor"); ret.setAttribute("x", "" + (loc.getX() - RADIUS)); ret.setAttribute("y", "" + (loc.getY() - RADIUS)); ret.setAttribute("width", "" + 2 * RADIUS); ret.setAttribute("height", "" + 2 * RADIUS); ret.setAttribute("facing", facing.toString()); return ret; } public Direction getFacing() { return facing; } @Override public List> getAttributes() { return ATTRIBUTES; } @Override @SuppressWarnings("unchecked") public V getValue(Attribute attr) { if (attr == FACING) { return (V) facing; } else { return super.getValue(attr); } } @Override protected void updateValue(Attribute attr, Object value) { if (attr == FACING) { facing = (Direction) value; } else { super.updateValue(attr, value); } } @Override public void paint(Graphics g, HandleGesture gesture) { Location location = getLocation(); int x = location.getX(); int y = location.getY(); g.setColor(SYMBOL_COLOR); g.drawOval(x - RADIUS, y - RADIUS, 2 * RADIUS, 2 * RADIUS); Location e0 = location.translate(facing, RADIUS); Location e1 = location.translate(facing, RADIUS + INDICATOR_LENGTH); g.drawLine(e0.getX(), e0.getY(), e1.getX(), e1.getY()); } @Override public Bounds getBounds() { Bounds bds = super.getBounds(RADIUS); Location center = getLocation(); Location end = center.translate(facing, RADIUS + INDICATOR_LENGTH); return bds.add(end); } @Override public boolean contains(Location loc, boolean assumeFilled) { if (super.isInCircle(loc, RADIUS)) { return true; } else { Location center = getLocation(); Location end = center.translate(facing, RADIUS + INDICATOR_LENGTH); if (facing == Direction.EAST || facing == Direction.WEST) { return Math.abs(loc.getY() - center.getY()) < 2 && (loc.getX() < center.getX()) != (loc.getX() < end.getX()); } else { return Math.abs(loc.getX() - center.getX()) < 2 && (loc.getY() < center.getY()) != (loc.getY() < end.getY()); } } } @Override public List getHandles(HandleGesture gesture) { Location c = getLocation(); Location end = c.translate(facing, RADIUS + INDICATOR_LENGTH); return UnmodifiableList.create(new Handle[] { new Handle(this, c), new Handle(this, end) }); } } logisim-2.7.1/src/com/cburch/logisim/circuit/AnalyzeException.java0000644000175000017500000000150211446034526025132 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; import com.cburch.logisim.util.StringUtil; public class AnalyzeException extends Exception { public static class Circular extends AnalyzeException { public Circular() { super(Strings.get("analyzeCircularError")); } } public static class Conflict extends AnalyzeException { public Conflict() { super(Strings.get("analyzeConflictError")); } } public static class CannotHandle extends AnalyzeException { public CannotHandle(String reason) { super(StringUtil.format(Strings.get("analyzeCannotHandleError"), reason)); } } public AnalyzeException() { } public AnalyzeException(String message) { super(message); } } logisim-2.7.1/src/com/cburch/logisim/circuit/Analyze.java0000644000175000017500000002726111524651302023257 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.circuit; import java.util.ArrayList; import java.util.Collection; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; import com.cburch.logisim.analyze.model.AnalyzerModel; import com.cburch.logisim.analyze.model.Entry; import com.cburch.logisim.analyze.model.Expression; import com.cburch.logisim.analyze.model.Expressions; import com.cburch.logisim.analyze.model.TruthTable; import com.cburch.logisim.comp.Component; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Location; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.proj.Project; import com.cburch.logisim.std.wiring.Pin; public class Analyze { private static final int MAX_ITERATIONS = 100; private Analyze() { } // // getPinLabels // /** Returns a sorted map from Pin objects to String objects, * listed in canonical order (top-down order, with ties * broken left-right). */ public static SortedMap getPinLabels(Circuit circuit) { Comparator locOrder = new Comparator() { public int compare(Instance ac, Instance bc) { Location a = ac.getLocation(); Location b = bc.getLocation(); if (a.getY() < b.getY()) return -1; if (a.getY() > b.getY()) return 1; if (a.getX() < b.getX()) return -1; if (a.getX() > b.getX()) return 1; return a.hashCode() - b.hashCode(); } }; SortedMap ret = new TreeMap(locOrder); // Put the pins into the TreeMap, with null labels for (Instance pin : circuit.getAppearance().getPortOffsets(Direction.EAST).values()) { ret.put(pin, null); } // Process first the pins that the user has given labels. ArrayList pinList = new ArrayList(ret.keySet()); HashSet labelsTaken = new HashSet(); for (Instance pin : pinList) { String label = pin.getAttributeSet().getValue(StdAttr.LABEL); label = toValidLabel(label); if (label != null) { if (labelsTaken.contains(label)) { int i = 2; while (labelsTaken.contains(label + i)) i++; label = label + i; } ret.put(pin, label); labelsTaken.add(label); } } // Now process the unlabeled pins. for (Instance pin : pinList) { if (ret.get(pin) != null) continue; String defaultList; if (Pin.FACTORY.isInputPin(pin)) { defaultList = Strings.get("defaultInputLabels"); if (defaultList.indexOf(",") < 0) { defaultList = "a,b,c,d,e,f,g,h"; } } else { defaultList = Strings.get("defaultOutputLabels"); if (defaultList.indexOf(",") < 0) { defaultList = "x,y,z,u,v,w,s,t"; } } String[] options = defaultList.split(","); String label = null; for (int i = 0; label == null && i < options.length; i++) { if (!labelsTaken.contains(options[i])) { label = options[i]; } } if (label == null) { // This is an extreme measure that should never happen // if the default labels are defined properly and the // circuit doesn't exceed the maximum number of pins. int i = 1; do { i++; label = "x" + i; } while (labelsTaken.contains(label)); } labelsTaken.add(label); ret.put(pin, label); } return ret; } private static String toValidLabel(String label) { if (label == null) return null; StringBuilder end = null; StringBuilder ret = new StringBuilder(); boolean afterWhitespace = false; for (int i = 0; i < label.length(); i++) { char c = label.charAt(i); if (Character.isJavaIdentifierStart(c)) { if (afterWhitespace) { // capitalize words after the first one c = Character.toTitleCase(c); afterWhitespace = false; } ret.append(c); } else if (Character.isJavaIdentifierPart(c)) { // If we can't place it at the start, we'll dump it // onto the end. if (ret.length() > 0) { ret.append(c); } else { if (end == null) end = new StringBuilder(); end.append(c); } afterWhitespace = false; } else if (Character.isWhitespace(c)) { afterWhitespace = true; } else { ; // just ignore any other characters } } if (end != null && ret.length() > 0) ret.append(end.toString()); if (ret.length() == 0) return null; return ret.toString(); } // // computeExpression // /** Computes the expression corresponding to the given * circuit, or raises ComputeException if difficulties * arise. */ public static void computeExpression(AnalyzerModel model, Circuit circuit, Map pinNames) throws AnalyzeException { ExpressionMap expressionMap = new ExpressionMap(circuit); ArrayList inputNames = new ArrayList(); ArrayList outputNames = new ArrayList(); ArrayList outputPins = new ArrayList(); for (Map.Entry entry : pinNames.entrySet()) { Instance pin = entry.getKey(); String label = entry.getValue(); if (Pin.FACTORY.isInputPin(pin)) { expressionMap.currentCause = Instance.getComponentFor(pin); Expression e = Expressions.variable(label); expressionMap.put(pin.getLocation(), e); inputNames.add(label); } else { outputPins.add(pin); outputNames.add(label); } } propagateComponents(expressionMap, circuit.getNonWires()); for (int iterations = 0; !expressionMap.dirtyPoints.isEmpty(); iterations++) { if (iterations > MAX_ITERATIONS) { throw new AnalyzeException.Circular(); } propagateWires(expressionMap, new HashSet(expressionMap.dirtyPoints)); HashSet dirtyComponents = getDirtyComponents(circuit, expressionMap.dirtyPoints); expressionMap.dirtyPoints.clear(); propagateComponents(expressionMap, dirtyComponents); Expression expr = checkForCircularExpressions(expressionMap); if (expr != null) throw new AnalyzeException.Circular(); } model.setVariables(inputNames, outputNames); for (int i = 0; i < outputPins.size(); i++) { Instance pin = outputPins.get(i); model.getOutputExpressions().setExpression(outputNames.get(i), expressionMap.get(pin.getLocation())); } } private static class ExpressionMap extends HashMap { private Circuit circuit; private Set dirtyPoints = new HashSet(); private Map causes = new HashMap(); private Component currentCause = null; ExpressionMap(Circuit circuit) { this.circuit = circuit; } @Override public Expression put(Location point, Expression expression) { Expression ret = super.put(point, expression); if (currentCause != null) causes.put(point, currentCause); if (ret == null ? expression != null : !ret.equals(expression)) { dirtyPoints.add(point); } return ret; } } // propagates expressions down wires private static void propagateWires(ExpressionMap expressionMap, HashSet pointsToProcess) throws AnalyzeException { expressionMap.currentCause = null; for (Location p : pointsToProcess) { Expression e = expressionMap.get(p); expressionMap.currentCause = expressionMap.causes.get(p); WireBundle bundle = expressionMap.circuit.wires.getWireBundle(p); if (e != null && bundle != null && bundle.points != null) { for (Location p2 : bundle.points) { if (p2.equals(p)) continue; Expression old = expressionMap.get(p2); if (old != null) { Component eCause = expressionMap.currentCause; Component oldCause = expressionMap.causes.get(p2); if (eCause != oldCause && !old.equals(e)) { throw new AnalyzeException.Conflict(); } } expressionMap.put(p2, e); } } } } // computes outputs of affected components private static HashSet getDirtyComponents(Circuit circuit, Set pointsToProcess) throws AnalyzeException { HashSet dirtyComponents = new HashSet(); for (Location point : pointsToProcess) { for (Component comp : circuit.getNonWires(point)) { dirtyComponents.add(comp); } } return dirtyComponents; } private static void propagateComponents(ExpressionMap expressionMap, Collection components) throws AnalyzeException { for (Component comp : components) { ExpressionComputer computer = (ExpressionComputer) comp.getFeature(ExpressionComputer.class); if (computer != null) { try { expressionMap.currentCause = comp; computer.computeExpression(expressionMap); } catch (UnsupportedOperationException e) { throw new AnalyzeException.CannotHandle(comp.getFactory().getDisplayName()); } } else if (comp.getFactory() instanceof Pin) { ; // pins are handled elsewhere } else { // pins are handled elsewhere throw new AnalyzeException.CannotHandle(comp.getFactory().getDisplayName()); } } } /** Checks whether any of the recently placed expressions in the * expression map are self-referential; if so, return it. */ private static Expression checkForCircularExpressions(ExpressionMap expressionMap) throws AnalyzeException { for (Location point : expressionMap.dirtyPoints) { Expression expr = expressionMap.get(point); if (expr.isCircular()) return expr; } return null; } // // ComputeTable // /** Returns a truth table corresponding to the circuit. */ public static void computeTable(AnalyzerModel model, Project proj, Circuit circuit, Map pinLabels) { ArrayList inputPins = new ArrayList(); ArrayList inputNames = new ArrayList(); ArrayList outputPins = new ArrayList(); ArrayList outputNames = new ArrayList(); for (Map.Entry entry : pinLabels.entrySet()) { Instance pin = entry.getKey(); if (Pin.FACTORY.isInputPin(pin)) { inputPins.add(pin); inputNames.add(entry.getValue()); } else { outputPins.add(pin); outputNames.add(entry.getValue()); } } int inputCount = inputPins.size(); int rowCount = 1 << inputCount; Entry[][] columns = new Entry[outputPins.size()][rowCount]; for (int i = 0; i < rowCount; i++) { CircuitState circuitState = new CircuitState(proj, circuit); for (int j = 0; j < inputCount; j++) { Instance pin = inputPins.get(j); InstanceState pinState = circuitState.getInstanceState(pin); boolean value = TruthTable.isInputSet(i, j, inputCount); Pin.FACTORY.setValue(pinState, value ? Value.TRUE : Value.FALSE); } Propagator prop = circuitState.getPropagator(); prop.propagate(); /* TODO for the SimulatorPrototype class do { prop.step(); } while (prop.isPending()); */ // TODO: Search for circuit state if (prop.isOscillating()) { for (int j = 0; j < columns.length; j++) { columns[j][i] = Entry.OSCILLATE_ERROR; } } else { for (int j = 0; j < columns.length; j++) { Instance pin = outputPins.get(j); InstanceState pinState = circuitState.getInstanceState(pin); Entry out; Value outValue = Pin.FACTORY.getValue(pinState).get(0); if (outValue == Value.TRUE) out = Entry.ONE; else if (outValue == Value.FALSE) out = Entry.ZERO; else if (outValue == Value.ERROR) out = Entry.BUS_ERROR; else out = Entry.DONT_CARE; columns[j][i] = out; } } } model.setVariables(inputNames, outputNames); for (int i = 0; i < columns.length; i++) { model.getTruthTable().setOutputColumn(i, columns[i]); } } } logisim-2.7.1/src/com/cburch/logisim/analyze/0000755000175000017500000000000011446034530021003 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/logisim/analyze/model/0000755000175000017500000000000011541756546022121 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/logisim/analyze/model/VariableListListener.java0000644000175000017500000000043411446034530027036 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.analyze.model; public interface VariableListListener { public void listChanged(VariableListEvent event); } logisim-2.7.1/src/com/cburch/logisim/analyze/model/VariableListEvent.java0000644000175000017500000000160511446034530026333 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.analyze.model; public class VariableListEvent { public static final int ALL_REPLACED = 0; public static final int ADD = 1; public static final int REMOVE = 2; public static final int MOVE = 3; public static final int REPLACE = 4; private VariableList source; private int type; private String variable; private Object data; public VariableListEvent(VariableList source, int type, String variable, Object data) { this.source = source; this.type = type; this.variable = variable; this.data = data; } public VariableList getSource() { return source; } public int getType() { return type; } public String getVariable() { return variable; } public Object getData() { return data; } } logisim-2.7.1/src/com/cburch/logisim/analyze/model/VariableList.java0000644000175000017500000000670611535206222025336 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.analyze.model; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.NoSuchElementException; public class VariableList { private ArrayList listeners = new ArrayList(); private int maxSize; private ArrayList data; private List dataView; public VariableList(int maxSize) { this.maxSize = maxSize; data = maxSize > 16 ? new ArrayList() : new ArrayList(maxSize); dataView = Collections.unmodifiableList(data); } // // listener methods // public void addVariableListListener(VariableListListener l) { listeners.add(l); } public void removeVariableListListener(VariableListListener l) { listeners.remove(l); } private void fireEvent(int type) { fireEvent(type, null, null); } private void fireEvent(int type, String variable) { fireEvent(type, variable, null); } private void fireEvent(int type, String variable, Object data) { if (listeners.size() == 0) return; VariableListEvent event = new VariableListEvent(this, type, variable, data); for (VariableListListener l : listeners) { l.listChanged(event); } } // // data methods // public int getMaximumSize() { return maxSize; } public List getAll() { return dataView; } public int indexOf(String name) { return data.indexOf(name); } public int size() { return data.size(); } public boolean isEmpty() { return data.isEmpty(); } public boolean isFull() { return data.size() >= maxSize; } public String get(int index) { return data.get(index); } public boolean contains(String value) { return data.contains(value); } public String[] toArray(String[] dest) { return data.toArray(dest); } public void setAll(List values) { if (values.size() > maxSize) { throw new IllegalArgumentException("maximum size is " + maxSize); } data.clear(); data.addAll(values); fireEvent(VariableListEvent.ALL_REPLACED); } public void add(String name) { if (data.size() >= maxSize) { throw new IllegalArgumentException("maximum size is " + maxSize); } data.add(name); fireEvent(VariableListEvent.ADD, name); } public void remove(String name) { int index = data.indexOf(name); if (index < 0) throw new NoSuchElementException("input " + name); data.remove(index); fireEvent(VariableListEvent.REMOVE, name, Integer.valueOf(index)); } public void move(String name, int delta) { int index = data.indexOf(name); if (index < 0) throw new NoSuchElementException(name); int newIndex = index + delta; if (newIndex < 0) { throw new IllegalArgumentException("cannot move index " + index + " by " + delta); } if (newIndex > data.size() - 1) { throw new IllegalArgumentException("cannot move index " + index + " by " + delta + ": size " + data.size()); } if (index == newIndex) return; data.remove(index); data.add(newIndex, name); fireEvent(VariableListEvent.MOVE, name, Integer.valueOf(newIndex - index)); } public void replace(String oldName, String newName) { int index = data.indexOf(oldName); if (index < 0) throw new NoSuchElementException(oldName); if (oldName.equals(newName)) return; data.set(index, newName); fireEvent(VariableListEvent.REPLACE, oldName, Integer.valueOf(index)); } } logisim-2.7.1/src/com/cburch/logisim/analyze/model/TruthTableListener.java0000644000175000017500000000051711446034530026535 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.analyze.model; public interface TruthTableListener { public void cellsChanged(TruthTableEvent event); public void structureChanged(TruthTableEvent event); } logisim-2.7.1/src/com/cburch/logisim/analyze/model/TruthTableEvent.java0000644000175000017500000000124311446034530026026 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.analyze.model; public class TruthTableEvent { private TruthTable source; private int column; private Object data; public TruthTableEvent(TruthTable source, VariableListEvent event) { this.source = source; this.data = event; } public TruthTableEvent(TruthTable source, int column) { this.source = source; this.column = column; } public int getColumn() { return column; } public TruthTable getSource() { return source; } public Object getData() { return data; } } logisim-2.7.1/src/com/cburch/logisim/analyze/model/TruthTable.java0000644000175000017500000002075711535206224025037 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.analyze.model; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; public class TruthTable { private static final Entry DEFAULT_ENTRY = Entry.DONT_CARE; private class MyListener implements VariableListListener { public void listChanged(VariableListEvent event) { if (event.getSource() == model.getInputs()) { inputsChanged(event); } else { outputsChanged(event); } fireStructureChanged(event); } private void inputsChanged(VariableListEvent event) { int action = event.getType(); if (action == VariableListEvent.ADD) { for (Map.Entry curEntry : outputColumns.entrySet()) { String output = curEntry.getKey(); Entry[] column = curEntry.getValue(); Entry[] newColumn = new Entry[2 * column.length]; for (int i = 0; i < column.length; i++) { newColumn[2 * i] = column[i]; newColumn[2 * i + 1] = column[i]; } outputColumns.put(output, newColumn); } } else if (action == VariableListEvent.REMOVE) { int index = ((Integer) event.getData()).intValue(); for (Map.Entry curEntry : outputColumns.entrySet()) { String output = curEntry.getKey(); Entry[] column = curEntry.getValue(); Entry[] newColumn = removeInput(column, index); outputColumns.put(output, newColumn); } } else if (action == VariableListEvent.MOVE) { int delta = ((Integer) event.getData()).intValue(); int newIndex = model.getInputs().indexOf(event.getVariable()); for (Map.Entry curEntry : outputColumns.entrySet()) { String output = curEntry.getKey(); Entry[] column = curEntry.getValue(); Entry[] newColumn = moveInput(column, newIndex - delta, newIndex); outputColumns.put(output, newColumn); } } } private void outputsChanged(VariableListEvent event) { int action = event.getType(); if (action == VariableListEvent.ALL_REPLACED) { outputColumns.clear(); } else if (action == VariableListEvent.REMOVE) { outputColumns.remove(event.getVariable()); } else if (action == VariableListEvent.REPLACE) { Entry[] column = outputColumns.remove(event.getVariable()); if (column != null) { int index = ((Integer) event.getData()).intValue(); String newVariable = model.getOutputs().get(index); outputColumns.put(newVariable, column); } } } private Entry[] removeInput(Entry[] old, int index) { int oldInputCount = model.getInputs().size() + 1; Entry[] ret = new Entry[old.length / 2]; int j = 0; int mask = 1 << (oldInputCount - 1 - index); for (int i = 0; i < old.length; i++) { if ((i & mask) == 0) { Entry e0 = old[i]; Entry e1 = old[i | mask]; ret[j] = (e0 == e1 ? e0 : Entry.DONT_CARE); j++; } } return ret; } private Entry[] moveInput(Entry[] old, int oldIndex, int newIndex) { int inputs = model.getInputs().size(); oldIndex = inputs - 1 - oldIndex; newIndex = inputs - 1 - newIndex; Entry[] ret = new Entry[old.length]; int sameMask = (old.length - 1) ^ ((1 << (1 + Math.max(oldIndex, newIndex))) - 1) ^ ((1 << Math.min(oldIndex, newIndex)) - 1); // bits that don't change int moveMask = 1 << oldIndex; // bit that moves int moveDist = Math.abs(newIndex - oldIndex); boolean moveLeft = newIndex > oldIndex; int blockMask = (old.length - 1) ^ sameMask ^ moveMask; // bits that move by one for (int i = 0; i < old.length; i++) { int j; // new index if (moveLeft) { j = (i & sameMask) | ((i & moveMask) << moveDist) | ((i & blockMask) >> 1); } else { j = (i & sameMask) | ((i & moveMask) >> moveDist) | ((i & blockMask) << 1); } ret[j] = old[i]; } return ret; } } private MyListener myListener = new MyListener(); private List listeners = new ArrayList(); private AnalyzerModel model; private HashMap outputColumns = new HashMap(); public TruthTable(AnalyzerModel model) { this.model = model; model.getInputs().addVariableListListener(myListener); model.getOutputs().addVariableListListener(myListener); } public void addTruthTableListener(TruthTableListener l) { listeners.add(l); } public void removeTruthTableListener(TruthTableListener l) { listeners.remove(l); } private void fireCellsChanged(int column) { TruthTableEvent event = new TruthTableEvent(this, column); for (TruthTableListener l : listeners) { l.cellsChanged(event); } } private void fireStructureChanged(VariableListEvent cause) { TruthTableEvent event = new TruthTableEvent(this, cause); for (TruthTableListener l : listeners) { l.structureChanged(event); } } public int getRowCount() { int sz = model.getInputs().size(); return 1 << sz; } public int getInputColumnCount() { return model.getInputs().size(); } public int getOutputColumnCount() { return model.getOutputs().size(); } public String getInputHeader(int column) { return model.getInputs().get(column); } public String getOutputHeader(int column) { return model.getOutputs().get(column); } public int getInputIndex(String input) { return model.getInputs().indexOf(input); } public int getOutputIndex(String output) { return model.getOutputs().indexOf(output); } public Entry getInputEntry(int row, int column) { int rows = getRowCount(); int inputs = model.getInputs().size(); if (row < 0 || row >= rows) { throw new IllegalArgumentException("row index: " + row + " size: " + rows); } if (column < 0 || column >= inputs) { throw new IllegalArgumentException("column index: " + column + " size: " + inputs); } return isInputSet(row, column, inputs) ? Entry.ONE : Entry.ZERO; } public Entry getOutputEntry(int row, int column) { int outputs = model.getOutputs().size(); if (row < 0 || row >= getRowCount() || column < 0 || column >= outputs) { return Entry.DONT_CARE; } else { String outputName = model.getOutputs().get(column); Entry[] columnData = outputColumns.get(outputName); if (columnData == null) return DEFAULT_ENTRY; if (row < 0 || row >= columnData.length) return Entry.DONT_CARE; return columnData[row]; } } public void setOutputEntry(int row, int column, Entry value) { int rows = getRowCount(); int outputs = model.getOutputs().size(); if (row < 0 || row >= rows) { throw new IllegalArgumentException("row index: " + row + " size: " + rows); } if (column < 0 || column >= outputs) { throw new IllegalArgumentException("column index: " + column + " size: " + outputs); } String outputName = model.getOutputs().get(column); Entry[] columnData = outputColumns.get(outputName); if (columnData == null) { if (value == DEFAULT_ENTRY) return; columnData = new Entry[getRowCount()]; outputColumns.put(outputName, columnData); Arrays.fill(columnData, DEFAULT_ENTRY); columnData[row] = value; } else { if (columnData[row] == value) return; columnData[row] = value; } fireCellsChanged(column); } public Entry[] getOutputColumn(int column) { int outputs = model.getOutputs().size(); if (column < 0 || column >= outputs) { throw new IllegalArgumentException("index: " + column + " size: " + outputs); } String outputName = model.getOutputs().get(column); Entry[] columnData = outputColumns.get(outputName); if (columnData == null) { columnData = new Entry[getRowCount()]; Arrays.fill(columnData, DEFAULT_ENTRY); outputColumns.put(outputName, columnData); } return columnData; } public void setOutputColumn(int column, Entry[] values) { if (values != null && values.length != getRowCount()) { throw new IllegalArgumentException("argument to setOutputColumn is wrong length"); } int outputs = model.getOutputs().size(); if (column < 0 || column >= outputs) { throw new IllegalArgumentException("index: " + column + " size: " + outputs); } String outputName = model.getOutputs().get(column); Entry[] oldValues = outputColumns.get(outputName); if (oldValues == values) return; else if (values == null) outputColumns.remove(outputName); else outputColumns.put(outputName, values); fireCellsChanged(column); } public static boolean isInputSet(int row, int column, int inputs) { return ((row >> (inputs - 1 - column)) & 0x1) == 1; } } logisim-2.7.1/src/com/cburch/logisim/analyze/model/Strings.java0000644000175000017500000000120211446034530024372 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.analyze.model; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.StringGetter; class Strings { private static LocaleManager source = new LocaleManager("resources/logisim", "analyze"); public static String get(String key) { return source.get(key); } public static StringGetter getter(String key) { return source.getter(key); } public static StringGetter getter(String key, String arg) { return source.getter(key, arg); } } logisim-2.7.1/src/com/cburch/logisim/analyze/model/ParserException.java0000644000175000017500000000140511446034530026061 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.analyze.model; import com.cburch.logisim.util.StringGetter; public class ParserException extends Exception { private StringGetter message; private int start; private int length; public ParserException(StringGetter message, int start, int length) { super(message.get()); this.message = message; this.start = start; this.length = length; } @Override public String getMessage() { return message.get(); } public StringGetter getMessageGetter() { return message; } public int getOffset() { return start; } public int getEndOffset() { return start + length; } }logisim-2.7.1/src/com/cburch/logisim/analyze/model/Parser.java0000644000175000017500000002264311532247712024215 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.analyze.model; import java.util.ArrayList; import com.cburch.logisim.util.StringGetter; public class Parser { private Parser() { } public static Expression parse(String in, AnalyzerModel model) throws ParserException { ArrayList tokens = toTokens(in, false); if (tokens.size() == 0) return null; for (Token token : tokens) { if (token.type == TOKEN_ERROR) { throw token.error(Strings.getter("invalidCharacterError", token.text)); } else if (token.type == TOKEN_IDENT) { int index = model.getInputs().indexOf(token.text); if (index < 0) { // ok; but maybe this is an operator String opText = token.text.toUpperCase(); if (opText.equals("NOT")) { token.type = TOKEN_NOT; } else if (opText.equals("AND")) { token.type = TOKEN_AND; } else if (opText.equals("XOR")) { token.type = TOKEN_XOR; } else if (opText.equals("OR")) { token.type = TOKEN_OR; } else { throw token.error(Strings.getter("badVariableName", token.text)); } } } } return parse(tokens); } /** I wrote this without thinking, and then realized that this is * quite complicated because of removing operators. I haven't * bothered to do it correctly; instead, it just regenerates a * string from the raw expression. static String removeVariable(String in, String variable) { StringBuilder ret = new StringBuilder(); ArrayList tokens = toTokens(in, true); Token lastWhite = null; for (int i = 0, n = tokens.size(); i < n; i++) { Token token = (Token) tokens.get(i); if (token.type == TOKEN_IDENT && token.text.equals(variable)) { ; // just ignore it } else if (token.type == TOKEN_WHITE) { if (lastWhite != null) { if (lastWhite.text.length() >= token.text.length()) { ; // don't repeat shorter whitespace } else { ret.replace(ret.length() - lastWhite.text.length(), ret.length(), token.text); lastWhite = token; } } else { lastWhite = token; ret.append(token.text); } } else { lastWhite = null; ret.append(token.text); } } return ret.toString(); } */ static String replaceVariable(String in, String oldName, String newName) { StringBuilder ret = new StringBuilder(); ArrayList tokens = toTokens(in, true); for (Token token : tokens) { if (token.type == TOKEN_IDENT && token.text.equals(oldName)) { ret.append(newName); } else { ret.append(token.text); } } return ret.toString(); } // // tokenizing code // private static final int TOKEN_AND = 0; private static final int TOKEN_OR = 1; private static final int TOKEN_XOR = 2; private static final int TOKEN_NOT = 3; private static final int TOKEN_NOT_POSTFIX = 4; private static final int TOKEN_LPAREN = 5; private static final int TOKEN_RPAREN = 6; private static final int TOKEN_IDENT = 7; private static final int TOKEN_CONST = 8; private static final int TOKEN_WHITE = 9; private static final int TOKEN_ERROR = 10; private static class Token { int type; int offset; int length; String text; Token(int type, int offset, String text) { this(type, offset, text.length(), text); } Token(int type, int offset, int length, String text) { this.type = type; this.offset = offset; this.length = length; this.text = text; } ParserException error(StringGetter message) { return new ParserException(message, offset, length); } } private static ArrayList toTokens(String in, boolean includeWhite) { ArrayList tokens = new ArrayList(); // Guarantee that we will stop just after reading whitespace, // not in the middle of a token. in = in + " "; int pos = 0; while (true) { int whiteStart = pos; while (pos < in.length() && Character.isWhitespace(in.charAt(pos))) pos++; if (includeWhite && pos != whiteStart) { tokens.add(new Token(TOKEN_WHITE, whiteStart, in.substring(whiteStart, pos))); } if (pos == in.length()) return tokens; int start = pos; char startChar = in.charAt(pos); pos++; if (Character.isJavaIdentifierStart(startChar)) { while (Character.isJavaIdentifierPart(in.charAt(pos))) pos++; tokens.add(new Token(TOKEN_IDENT, start, in.substring(start, pos))); } else { switch (startChar) { case '(': tokens.add(new Token(TOKEN_LPAREN, start, "(")); break; case ')': tokens.add(new Token(TOKEN_RPAREN, start, ")")); break; case '0': case '1': tokens.add(new Token(TOKEN_CONST, start, "" + startChar)); break; case '~': tokens.add(new Token(TOKEN_NOT, start, "~")); break; case '\'': tokens.add(new Token(TOKEN_NOT_POSTFIX, start, "'")); break; case '^': tokens.add(new Token(TOKEN_XOR, start, "^")); break; case '+': tokens.add(new Token(TOKEN_OR, start, "+")); break; case '!': tokens.add(new Token(TOKEN_NOT, start, "!")); break; case '&': if (in.charAt(pos) == '&') pos++; tokens.add(new Token(TOKEN_AND, start, in.substring(start, pos))); break; case '|': if (in.charAt(pos) == '|') pos++; tokens.add(new Token(TOKEN_OR, start, in.substring(start, pos))); break; default: while (!okCharacter(in.charAt(pos))) pos++; String errorText = in.substring(start, pos); tokens.add(new Token(TOKEN_ERROR, start, errorText)); } } } } private static boolean okCharacter(char c) { return Character.isWhitespace(c) || Character.isJavaIdentifierStart(c) || "()01~^+!&|".indexOf(c) >= 0; } // // parsing code // private static class Context { int level; Expression current; Token cause; Context(Expression current, int level, Token cause) { this.level = level; this.current = current; this.cause = cause; } } private static Expression parse(ArrayList tokens) throws ParserException { ArrayList stack = new ArrayList(); Expression current = null; for (int i = 0; i < tokens.size(); i++) { Token t = tokens.get(i); if (t.type == TOKEN_IDENT || t.type == TOKEN_CONST) { Expression here; if (t.type == TOKEN_IDENT) { here = Expressions.variable(t.text); } else { here = Expressions.constant(Integer.parseInt(t.text, 16)); } while (i + 1 < tokens.size() && tokens.get(i + 1).type == TOKEN_NOT_POSTFIX) { here = Expressions.not(here); i++; } while (peekLevel(stack) == Expression.NOT_LEVEL) { here = Expressions.not(here); pop(stack); } current = Expressions.and(current, here); if (peekLevel(stack) == Expression.AND_LEVEL) { Context top = pop(stack); current = Expressions.and(top.current, current); } } else if (t.type == TOKEN_NOT) { if (current != null) { push(stack, current, Expression.AND_LEVEL, new Token(TOKEN_AND, t.offset, Strings.get("implicitAndOperator"))); } push(stack, null, Expression.NOT_LEVEL, t); current = null; } else if (t.type == TOKEN_NOT_POSTFIX) { throw t.error(Strings.getter("unexpectedApostrophe")); } else if (t.type == TOKEN_LPAREN) { if (current != null) { push(stack, current, Expression.AND_LEVEL, new Token(TOKEN_AND, t.offset, 0, Strings.get("implicitAndOperator"))); } push(stack, null, -2, t); current = null; } else if (t.type == TOKEN_RPAREN) { current = popTo(stack, -1, current); // there had better be a LPAREN atop the stack now. if (stack.isEmpty()) { throw t.error(Strings.getter("lparenMissingError")); } pop(stack); while (i + 1 < tokens.size() && tokens.get(i + 1).type == TOKEN_NOT_POSTFIX) { current = Expressions.not(current); i++; } current = popTo(stack, Expression.AND_LEVEL, current); } else { if (current == null) { throw t.error(Strings.getter("missingLeftOperandError", t.text)); } int level = 0; switch (t.type) { case TOKEN_AND: level = Expression.AND_LEVEL; break; case TOKEN_OR: level = Expression.OR_LEVEL; break; case TOKEN_XOR: level = Expression.XOR_LEVEL; break; } push(stack, popTo(stack, level, current), level, t); current = null; } } current = popTo(stack, -1, current); if (!stack.isEmpty()) { Context top = pop(stack); throw top.cause.error(Strings.getter("rparenMissingError")); } return current; } private static void push(ArrayList stack, Expression expr, int level, Token cause) { stack.add(new Context(expr, level, cause)); } private static int peekLevel(ArrayList stack) { if (stack.isEmpty()) return -3; Context context = stack.get(stack.size() - 1); return context.level; } private static Context pop(ArrayList stack) { return stack.remove(stack.size() - 1); } private static Expression popTo(ArrayList stack, int level, Expression current) throws ParserException { while (!stack.isEmpty() && peekLevel(stack) >= level) { Context top = pop(stack); if (current == null) throw top.cause.error(Strings.getter("missingRightOperandError", top.cause.text)); switch (top.level) { case Expression.AND_LEVEL: current = Expressions.and(top.current, current); break; case Expression.OR_LEVEL: current = Expressions.or(top.current, current); break; case Expression.XOR_LEVEL: current = Expressions.xor(top.current, current); break; case Expression.NOT_LEVEL: current = Expressions.not(current); break; } } return current; } } logisim-2.7.1/src/com/cburch/logisim/analyze/model/OutputExpressionsListener.java0000644000175000017500000000045411446034530030222 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.analyze.model; public interface OutputExpressionsListener { public void expressionChanged(OutputExpressionsEvent event); } logisim-2.7.1/src/com/cburch/logisim/analyze/model/OutputExpressionsEvent.java0000644000175000017500000000154311446034530027516 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.analyze.model; public class OutputExpressionsEvent { public static final int ALL_VARIABLES_REPLACED = 0; public static final int OUTPUT_EXPRESSION = 1; public static final int OUTPUT_MINIMAL = 2; private AnalyzerModel model; private int type; private String variable; private Object data; public OutputExpressionsEvent(AnalyzerModel model, int type, String variable, Object data) { this.model = model; this.type = type; this.variable = variable; this.data = data; } public AnalyzerModel getModel() { return model; } public int getType() { return type; } public String getVariable() { return variable; } public Object getData() { return data; } } logisim-2.7.1/src/com/cburch/logisim/analyze/model/OutputExpressions.java0000644000175000017500000002733511534737542026536 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.analyze.model; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.List; public class OutputExpressions { private class OutputData { String output; int format; Expression expr = null; String exprString = null; List minimalImplicants = null; Expression minimalExpr = null; OutputData(String output) { this.output = output; invalidate(true, false); } boolean isExpressionMinimal() { return expr == minimalExpr; } Expression getExpression() { return expr; } String getExpressionString() { if (exprString == null) { if (expr == null) invalidate(false, false); exprString = expr == null ? "" : expr.toString(); } return exprString; } Expression getMinimalExpression() { if (minimalExpr == null) invalidate(false, false); return minimalExpr; } List getMinimalImplicants() { return minimalImplicants; } int getMinimizedFormat() { return format; } void setMinimizedFormat(int value) { if (format != value) { format = value; this.invalidate(false, true); } } void setExpression(Expression newExpr, String newExprString) { expr = newExpr; exprString = newExprString; if (expr != minimalExpr) { // for efficiency to avoid recomputation Entry[] values = computeColumn(model.getTruthTable(), expr); int outputColumn = model.getOutputs().indexOf(output); updatingTable = true; try { model.getTruthTable().setOutputColumn(outputColumn, values); } finally { updatingTable = false; } } fireModelChanged(OutputExpressionsEvent.OUTPUT_EXPRESSION, output, getExpression()); } private void removeInput(String input) { Expression oldMinExpr = minimalExpr; minimalImplicants = null; minimalExpr = null; if (exprString != null) { exprString = null; // invalidate it so it recomputes } if (expr != null) { Expression oldExpr = expr; Expression newExpr; if (oldExpr == oldMinExpr) { newExpr = getMinimalExpression(); expr = newExpr; } else { newExpr = expr.removeVariable(input); } if (newExpr == null || !newExpr.equals(oldExpr)) { expr = newExpr; fireModelChanged(OutputExpressionsEvent.OUTPUT_EXPRESSION, output, expr); } } fireModelChanged(OutputExpressionsEvent.OUTPUT_MINIMAL, output, minimalExpr); } private void replaceInput(String input, String newName) { minimalExpr = null; if (exprString != null) { exprString = Parser.replaceVariable(exprString, input, newName); } if (expr != null) { Expression newExpr = expr.replaceVariable(input, newName); if (!newExpr.equals(expr)) { expr = newExpr; fireModelChanged(OutputExpressionsEvent.OUTPUT_EXPRESSION, output); } } else { fireModelChanged(OutputExpressionsEvent.OUTPUT_EXPRESSION, output); } fireModelChanged(OutputExpressionsEvent.OUTPUT_MINIMAL, output); } private boolean invalidating = false; private void invalidate(boolean initializing, boolean formatChanged) { if (invalidating) return; invalidating = true; try { List oldImplicants = minimalImplicants; Expression oldMinExpr = minimalExpr; minimalImplicants = Implicant.computeMinimal(format, model, output); minimalExpr = Implicant.toExpression(format, model, minimalImplicants); boolean minChanged = !implicantsSame(oldImplicants, minimalImplicants); if (!updatingTable) { // see whether the expression is still consistent with the truth table TruthTable table = model.getTruthTable(); Entry[] outputColumn = computeColumn(model.getTruthTable(), expr); int outputIndex = model.getOutputs().indexOf(output); Entry[] currentColumn = table.getOutputColumn(outputIndex); if (!columnsMatch(currentColumn, outputColumn) || isAllUndefined(outputColumn) || formatChanged) { // if not, then we need to change the expression to maintain consistency boolean exprChanged = expr != oldMinExpr || minChanged; expr = minimalExpr; if (exprChanged) { exprString = null; if (!initializing) { fireModelChanged(OutputExpressionsEvent.OUTPUT_EXPRESSION, output); } } } } if (!initializing && minChanged) { fireModelChanged(OutputExpressionsEvent.OUTPUT_MINIMAL, output); } } finally { invalidating = false; } } } private class MyListener implements VariableListListener, TruthTableListener { public void listChanged(VariableListEvent event) { if (event.getSource() == model.getInputs()) inputsChanged(event); else outputsChanged(event); } private void inputsChanged(VariableListEvent event) { int type = event.getType(); if (type == VariableListEvent.ALL_REPLACED && !outputData.isEmpty()) { outputData.clear(); fireModelChanged(OutputExpressionsEvent.ALL_VARIABLES_REPLACED); } else if (type == VariableListEvent.REMOVE) { String input = event.getVariable(); for (String output : outputData.keySet()) { OutputData data = getOutputData(output, false); if (data != null) data.removeInput(input); } } else if (type == VariableListEvent.REPLACE) { String input = event.getVariable(); int inputIndex = ((Integer) event.getData()).intValue(); String newName = event.getSource().get(inputIndex); for (String output : outputData.keySet()) { OutputData data = getOutputData(output, false); if (data != null) data.replaceInput(input, newName); } } else if (type == VariableListEvent.MOVE || type == VariableListEvent.ADD) { for (String output : outputData.keySet()) { OutputData data = getOutputData(output, false); if (data != null) data.invalidate(false, false); } } } private void outputsChanged(VariableListEvent event) { int type = event.getType(); if (type == VariableListEvent.ALL_REPLACED && !outputData.isEmpty()) { outputData.clear(); fireModelChanged(OutputExpressionsEvent.ALL_VARIABLES_REPLACED); } else if (type == VariableListEvent.REMOVE) { outputData.remove(event.getVariable()); } else if (type == VariableListEvent.REPLACE) { String oldName = event.getVariable(); if (outputData.containsKey(oldName)) { OutputData toMove = outputData.remove(oldName); int inputIndex = ((Integer) event.getData()).intValue(); String newName = event.getSource().get(inputIndex); toMove.output = newName; outputData.put(newName, toMove); } } } public void cellsChanged(TruthTableEvent event) { String output = model.getOutputs().get(event.getColumn()); invalidate(output, false); } public void structureChanged(TruthTableEvent event) { } } private MyListener myListener = new MyListener(); private AnalyzerModel model; private HashMap outputData = new HashMap(); private ArrayList listeners = new ArrayList(); private boolean updatingTable = false; public OutputExpressions(AnalyzerModel model) { this.model = model; model.getInputs().addVariableListListener(myListener); model.getOutputs().addVariableListListener(myListener); model.getTruthTable().addTruthTableListener(myListener); } // // listener methods // public void addOutputExpressionsListener(OutputExpressionsListener l) { listeners.add(l); } public void removeOutputExpressionsListener(OutputExpressionsListener l) { listeners.remove(l); } private void fireModelChanged(int type) { fireModelChanged(type, null, null); } private void fireModelChanged(int type, String variable) { fireModelChanged(type, variable, null); } private void fireModelChanged(int type, String variable, Object data) { OutputExpressionsEvent event = new OutputExpressionsEvent(model, type, variable, data); for (OutputExpressionsListener l : listeners) { l.expressionChanged(event); } } // // access methods // public Expression getExpression(String output) { if (output == null) return null; return getOutputData(output, true).getExpression(); } public String getExpressionString(String output) { if (output == null) return ""; return getOutputData(output, true).getExpressionString(); } public boolean isExpressionMinimal(String output) { OutputData data = getOutputData(output, false); return data == null ? true : data.isExpressionMinimal(); } public Expression getMinimalExpression(String output) { if (output == null) return Expressions.constant(0); return getOutputData(output, true).getMinimalExpression(); } public List getMinimalImplicants(String output) { if (output == null) return Implicant.MINIMAL_LIST; return getOutputData(output, true).getMinimalImplicants(); } public int getMinimizedFormat(String output) { if (output == null) return AnalyzerModel.FORMAT_SUM_OF_PRODUCTS; return getOutputData(output, true).getMinimizedFormat(); } // // modifier methods // public void setMinimizedFormat(String output, int format) { int oldFormat = getMinimizedFormat(output); if (format != oldFormat) { getOutputData(output, true).setMinimizedFormat(format); invalidate(output, true); } } public void setExpression(String output, Expression expr) { setExpression(output, expr, null); } public void setExpression(String output, Expression expr, String exprString) { if (output == null) return; getOutputData(output, true).setExpression(expr, exprString); } private void invalidate(String output, boolean formatChanged) { OutputData data = getOutputData(output, false); if (data != null) data.invalidate(false, false); } private OutputData getOutputData(String output, boolean create) { if (output == null) throw new IllegalArgumentException("null output name"); OutputData ret = outputData.get(output); if (ret == null && create) { if (model.getOutputs().indexOf(output) < 0) { throw new IllegalArgumentException("unrecognized output " + output); } ret = new OutputData(output); outputData.put(output, ret); } return ret; } private static Entry[] computeColumn(TruthTable table, Expression expr) { int rows = table.getRowCount(); int cols = table.getInputColumnCount(); Entry[] values = new Entry[rows]; if (expr == null) { Arrays.fill(values, Entry.DONT_CARE); } else { Assignments assn = new Assignments(); for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { assn.put(table.getInputHeader(j), TruthTable.isInputSet(i, j, cols)); } values[i] = expr.evaluate(assn) ? Entry.ONE : Entry.ZERO; } } return values; } private static boolean columnsMatch(Entry[] a, Entry[] b) { if (a.length != b.length) return false; for (int i = 0; i < a.length; i++) { if (a[i] != b[i]) { boolean bothDefined = (a[i] == Entry.ZERO || a[i] == Entry.ONE) && (b[i] == Entry.ZERO || b[i] == Entry.ONE); if (bothDefined) return false; } } return true; } private static boolean isAllUndefined(Entry[] a) { for (int i = 0; i < a.length; i++) { if (a[i] == Entry.ZERO || a[i] == Entry.ONE) return false; } return true; } private static boolean implicantsSame(List a, List b) { if (a == null) { return b == null || b.size() == 0; } else if (b == null) { return a == null || a.size() == 0; } else if (a.size() != b.size()) { return false; } else { Iterator ait = a.iterator(); for (Implicant bi : b) { if (!ait.hasNext()) return false; // should never happen Implicant ai = ait.next(); if (!ai.equals(bi)) return false; } return true; } } } logisim-2.7.1/src/com/cburch/logisim/analyze/model/Implicant.java0000644000175000017500000002031211541756546024702 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.analyze.model; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; public class Implicant implements Comparable { static Implicant MINIMAL_IMPLICANT = new Implicant(0, -1); static List MINIMAL_LIST = Arrays.asList(new Implicant[] { MINIMAL_IMPLICANT }); private static class TermIterator implements Iterable, Iterator { Implicant source; int currentMask = 0; TermIterator(Implicant source) { this.source = source; } public Iterator iterator() { return this; } public boolean hasNext() { return currentMask >= 0; } public Implicant next() { int ret = currentMask | source.values; int diffs = currentMask ^ source.unknowns; int diff = diffs ^ ((diffs - 1) & diffs); if (diff == 0) { currentMask = -1; } else { currentMask = (currentMask & ~(diff - 1)) | diff; } return new Implicant(0, ret); } public void remove() { } } private int unknowns; private int values; private Implicant(int unknowns, int values) { this.unknowns = unknowns; this.values = values; } @Override public boolean equals(Object other) { if (!(other instanceof Implicant)) return false; Implicant o = (Implicant) other; return this.unknowns == o.unknowns && this.values == o.values; } public int compareTo(Implicant o) { if (this.values < o.values) return -1; if (this.values > o.values) return 1; if (this.unknowns < o.unknowns) return -1; if (this.unknowns > o.unknowns) return 1; return 0; } @Override public int hashCode() { return (unknowns << 16) | values; } public int getUnknownCount() { int ret = 0; int n = unknowns; while (n != 0) { n &= (n - 1); ret++; } return ret; } public Iterable getTerms() { return new TermIterator(this); } public int getRow() { if (unknowns != 0) return -1; return values; } private Expression toProduct(TruthTable source) { Expression term = null; int cols = source.getInputColumnCount(); for (int i = cols - 1; i >= 0; i--) { if ((unknowns & (1 << i)) == 0) { Expression literal = Expressions.variable(source.getInputHeader(cols - 1 - i)); if ((values & (1 << i)) == 0) literal = Expressions.not(literal); term = Expressions.and(term, literal); } } return term == null ? Expressions.constant(1) : term; } private Expression toSum(TruthTable source) { Expression term = null; int cols = source.getInputColumnCount(); for (int i = cols - 1; i >= 0; i--) { if ((unknowns & (1 << i)) == 0) { Expression literal = Expressions.variable(source.getInputHeader(cols - 1 - i)); if ((values & (1 << i)) != 0) literal = Expressions.not(literal); term = Expressions.or(term, literal); } } return term == null ? Expressions.constant(1) : term; } static Expression toExpression(int format, AnalyzerModel model, List implicants) { if (implicants == null) return null; TruthTable table = model.getTruthTable(); if (format == AnalyzerModel.FORMAT_PRODUCT_OF_SUMS) { Expression product = null; for (Implicant imp : implicants) { product = Expressions.and(product, imp.toSum(table)); } return product == null ? Expressions.constant(1) : product; } else { Expression sum = null; for (Implicant imp : implicants) { sum = Expressions.or(sum, imp.toProduct(table)); } return sum == null ? Expressions.constant(0) : sum; } } static List computeMinimal(int format, AnalyzerModel model, String variable) { TruthTable table = model.getTruthTable(); int column = model.getOutputs().indexOf(variable); if (column < 0) return Collections.emptyList(); Entry desired = format == AnalyzerModel.FORMAT_SUM_OF_PRODUCTS ? Entry.ONE : Entry.ZERO; Entry undesired = desired == Entry.ONE ? Entry.ZERO : Entry.ONE; // determine the first-cut implicants, as well as the rows // that we need to cover. HashMap base = new HashMap(); HashSet toCover = new HashSet(); boolean knownFound = false; for (int i = 0; i < table.getRowCount(); i++) { Entry entry = table.getOutputEntry(i, column); if (entry == undesired) { knownFound = true; } else if (entry == desired) { knownFound = true; Implicant imp = new Implicant(0, i); base.put(imp, entry); toCover.add(imp); } else { Implicant imp = new Implicant(0, i); base.put(imp, entry); } } if (!knownFound) return null; // work up to more general implicants, discovering // any prime implicants. HashSet primes = new HashSet(); HashMap current = base; while (current.size() > 1) { HashSet toRemove = new HashSet(); HashMap next = new HashMap(); for (Map.Entry curEntry : current.entrySet()) { Implicant imp = curEntry.getKey(); Entry detEntry = curEntry.getValue(); for (int j = 1; j <= imp.values; j *= 2) { if ((imp.values & j) != 0) { Implicant opp = new Implicant(imp.unknowns, imp.values ^ j); Entry oppEntry = current.get(opp); if (oppEntry != null) { toRemove.add(imp); toRemove.add(opp); Implicant i = new Implicant(opp.unknowns | j, opp.values); Entry e; if (oppEntry == Entry.DONT_CARE && detEntry == Entry.DONT_CARE) { e = Entry.DONT_CARE; } else { e = desired; } next.put(i, e); } } } } for (Map.Entry curEntry : current.entrySet()) { Implicant det = curEntry.getKey(); if (!toRemove.contains(det) && curEntry.getValue() == desired) { primes.add(det); } } current = next; } // we won't have more than one implicant left, but it // is probably prime. for (Map.Entry curEntry : current.entrySet()) { Implicant imp = curEntry.getKey(); if (current.get(imp) == desired) { primes.add(imp); } } // determine the essential prime implicants HashSet retSet = new HashSet(); HashSet covered = new HashSet(); for (Implicant required : toCover) { if (covered.contains(required)) continue; int row = required.getRow(); Implicant essential = null; for (Implicant imp : primes) { if ((row & ~imp.unknowns) == imp.values) { if (essential == null) essential = imp; else { essential = null; break; } } } if (essential != null) { retSet.add(essential); primes.remove(essential); for (Implicant imp : essential.getTerms()) { covered.add(imp); } } } toCover.removeAll(covered); // This is an unusual case, but it's possible that the // essential prime implicants don't cover everything. // In that case, greedily pick out prime implicants // that cover the most uncovered rows. while (!toCover.isEmpty()) { // find the implicant covering the most rows Implicant max = null; int maxCount = 0; int maxUnknowns = Integer.MAX_VALUE; for (Iterator it = primes.iterator(); it.hasNext(); ) { Implicant imp = it.next(); int count = 0; for (Implicant term : imp.getTerms()) { if (toCover.contains(term)) ++count; } if (count == 0) { it.remove(); } else if (count > maxCount) { max = imp; maxCount = count; maxUnknowns = imp.getUnknownCount(); } else if (count == maxCount) { int unk = imp.getUnknownCount(); if (unk > maxUnknowns) { max = imp; maxUnknowns = unk; } } } // add it to our choice, and remove the covered rows if (max != null) { retSet.add(max); primes.remove(max); for (Implicant term : max.getTerms()) { toCover.remove(term); } } } // Now build up our sum-of-products expression // from the remaining terms ArrayList ret = new ArrayList(retSet); Collections.sort(ret); return ret; } } logisim-2.7.1/src/com/cburch/logisim/analyze/model/ExpressionVisitor.java0000644000175000017500000000074511446034530026473 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.analyze.model; public interface ExpressionVisitor { public T visitAnd(Expression a, Expression b); public T visitOr(Expression a, Expression b); public T visitXor(Expression a, Expression b); public T visitNot(Expression a); public T visitVariable(String name); public T visitConstant(int value); } logisim-2.7.1/src/com/cburch/logisim/analyze/model/Expressions.java0000644000175000017500000001170211446034530025271 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.analyze.model; public class Expressions { private Expressions() { } private static abstract class Binary extends Expression { protected final Expression a; protected final Expression b; Binary(Expression a, Expression b) { this.a = a; this.b = b; } @Override public boolean equals(Object other) { if (other == null) return false; if (this.getClass() != other.getClass()) return false; Binary o = (Binary) other; return this.a.equals(o.a) && this.b.equals(o.b); } @Override public int hashCode() { return 31 * (31 * getClass().hashCode() + a.hashCode()) + b.hashCode(); } } private static class And extends Binary { And(Expression a, Expression b) { super(a, b); } @Override public T visit(ExpressionVisitor visitor) { return visitor.visitAnd(a, b); } @Override void visit(Visitor visitor) { visitor.visitAnd(a, b); } @Override int visit(IntVisitor visitor) { return visitor.visitAnd(a, b); } @Override public int getPrecedence() { return Expression.AND_LEVEL; } } private static class Or extends Binary { Or(Expression a, Expression b) { super(a, b); } @Override public T visit(ExpressionVisitor visitor) { return visitor.visitOr(a, b); } @Override void visit(Visitor visitor) { visitor.visitOr(a, b); } @Override int visit(IntVisitor visitor) { return visitor.visitOr(a, b); } @Override public int getPrecedence() { return Expression.OR_LEVEL; } } private static class Xor extends Binary { Xor(Expression a, Expression b) { super(a, b); } @Override public T visit(ExpressionVisitor visitor) { return visitor.visitXor(a, b); } @Override void visit(Visitor visitor) { visitor.visitXor(a, b); } @Override int visit(IntVisitor visitor) { return visitor.visitXor(a, b); } @Override public int getPrecedence() { return Expression.XOR_LEVEL; } } private static class Not extends Expression { private Expression a; Not(Expression a) { this.a = a; } @Override public T visit(ExpressionVisitor visitor) { return visitor.visitNot(a); } @Override void visit(Visitor visitor) { visitor.visitNot(a); } @Override int visit(IntVisitor visitor) { return visitor.visitNot(a); } @Override public int getPrecedence() { return Expression.NOT_LEVEL; } @Override public boolean equals(Object other) { if (!(other instanceof Not)) return false; Not o = (Not) other; return this.a.equals(o.a); } @Override public int hashCode() { return 31 * a.hashCode(); } } private static class Variable extends Expression { private String name; Variable(String name) { this.name = name; } @Override public T visit(ExpressionVisitor visitor) { return visitor.visitVariable(name); } @Override void visit(Visitor visitor) { visitor.visitVariable(name); } @Override int visit(IntVisitor visitor) { return visitor.visitVariable(name); } @Override public int getPrecedence() { return Integer.MAX_VALUE; } @Override public boolean equals(Object other) { if (!(other instanceof Variable)) return false; Variable o = (Variable) other; return this.name.equals(o.name); } @Override public int hashCode() { return name.hashCode(); } } private static class Constant extends Expression { private int value; Constant(int value) { this.value = value; } @Override public T visit(ExpressionVisitor visitor) { return visitor.visitConstant(value); } @Override void visit(Visitor visitor) { visitor.visitConstant(value); } @Override int visit(IntVisitor visitor) { return visitor.visitConstant(value); } @Override public int getPrecedence() { return Integer.MAX_VALUE; } @Override public boolean equals(Object other) { if (!(other instanceof Constant)) return false; Constant o = (Constant) other; return this.value == o.value; } @Override public int hashCode() { return value; } } public static Expression and(Expression a, Expression b) { if (a == null) return b; if (b == null) return a; return new And(a, b); } public static Expression or(Expression a, Expression b) { if (a == null) return b; if (b == null) return a; return new Or(a, b); } public static Expression xor(Expression a, Expression b) { if (a == null) return b; if (b == null) return a; return new Xor(a, b); } public static Expression not(Expression a) { if (a == null) return null; return new Not(a); } public static Expression variable(String name) { return new Variable(name); } public static Expression constant(int value) { return new Constant(value); } } logisim-2.7.1/src/com/cburch/logisim/analyze/model/Expression.java0000644000175000017500000001652511446034530025116 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.analyze.model; import java.util.HashSet; public abstract class Expression { public static final int OR_LEVEL = 0; public static final int XOR_LEVEL = 1; public static final int AND_LEVEL = 2; public static final int NOT_LEVEL = 3; static interface Visitor { public void visitAnd(Expression a, Expression b); public void visitOr(Expression a, Expression b); public void visitXor(Expression a, Expression b); public void visitNot(Expression a); public void visitVariable(String name); public void visitConstant(int value); } static interface IntVisitor { public int visitAnd(Expression a, Expression b); public int visitOr(Expression a, Expression b); public int visitXor(Expression a, Expression b); public int visitNot(Expression a); public int visitVariable(String name); public int visitConstant(int value); } public abstract int getPrecedence(); public abstract T visit(ExpressionVisitor visitor); abstract void visit(Visitor visitor); abstract int visit(IntVisitor visitor); public boolean evaluate(final Assignments assignments) { int ret = visit(new IntVisitor() { public int visitAnd(Expression a, Expression b) { return a.visit(this) & b.visit(this); } public int visitOr(Expression a, Expression b) { return a.visit(this) | b.visit(this); } public int visitXor(Expression a, Expression b) { return a.visit(this) ^ b.visit(this); } public int visitNot(Expression a) { return ~a.visit(this); } public int visitVariable(String name) { return assignments.get(name) ? 1 : 0; } public int visitConstant(int value) { return value; } }); return (ret & 1) != 0; } @Override public String toString() { final StringBuilder text = new StringBuilder(); visit(new Visitor() { public void visitAnd(Expression a, Expression b) { binary(a, b, AND_LEVEL, " "); } public void visitOr(Expression a, Expression b) { binary(a, b, OR_LEVEL, " + "); } public void visitXor(Expression a, Expression b) { binary(a, b, XOR_LEVEL, " ^ "); } private void binary(Expression a, Expression b, int level, String op) { if (a.getPrecedence() < level) { text.append("("); a.visit(this); text.append(")"); } else { a.visit(this); } text.append(op); if (b.getPrecedence() < level) { text.append("("); b.visit(this); text.append(")"); } else { b.visit(this); } } public void visitNot(Expression a) { text.append("~"); if (a.getPrecedence() < NOT_LEVEL) { text.append("("); a.visit(this); text.append(")"); } else { a.visit(this); } } public void visitVariable(String name) { text.append(name); } public void visitConstant(int value) { text.append("" + Integer.toString(value, 16)); } }); return text.toString(); } public boolean isCircular() { final HashSet visited = new HashSet(); visited.add(this); return 1 == visit(new IntVisitor() { public int visitAnd(Expression a, Expression b) { return binary(a, b); } public int visitOr(Expression a, Expression b) { return binary(a, b); } public int visitXor(Expression a, Expression b) { return binary(a, b); } public int visitNot(Expression a) { if (!visited.add(a)) return 1; if (a.visit(this) == 1) return 1; visited.remove(a); return 0; } public int visitVariable(String name) { return 0; } public int visitConstant(int value) { return 0; } private int binary(Expression a, Expression b) { if (!visited.add(a)) return 1; if (a.visit(this) == 1) return 1; visited.remove(a); if (!visited.add(b)) return 1; if (b.visit(this) == 1) return 1; visited.remove(b); return 0; } }); } Expression removeVariable(final String input) { return visit(new ExpressionVisitor() { public Expression visitAnd(Expression a, Expression b) { Expression l = a.visit(this); Expression r = b.visit(this); if (l == null) return r; if (r == null) return l; return Expressions.and(l, r); } public Expression visitOr(Expression a, Expression b) { Expression l = a.visit(this); Expression r = b.visit(this); if (l == null) return r; if (r == null) return l; return Expressions.or(l, r); } public Expression visitXor(Expression a, Expression b) { Expression l = a.visit(this); Expression r = b.visit(this); if (l == null) return r; if (r == null) return l; return Expressions.xor(l, r); } public Expression visitNot(Expression a) { Expression l = a.visit(this); if (l == null) return null; return Expressions.not(l); } public Expression visitVariable(String name) { return name.equals(input) ? null : Expressions.variable(name); } public Expression visitConstant(int value) { return Expressions.constant(value); } }); } Expression replaceVariable(final String oldName, final String newName) { return visit(new ExpressionVisitor() { public Expression visitAnd(Expression a, Expression b) { Expression l = a.visit(this); Expression r = b.visit(this); return Expressions.and(l, r); } public Expression visitOr(Expression a, Expression b) { Expression l = a.visit(this); Expression r = b.visit(this); return Expressions.or(l, r); } public Expression visitXor(Expression a, Expression b) { Expression l = a.visit(this); Expression r = b.visit(this); return Expressions.xor(l, r); } public Expression visitNot(Expression a) { Expression l = a.visit(this); return Expressions.not(l); } public Expression visitVariable(String name) { return Expressions.variable(name.equals(oldName) ? newName : name); } public Expression visitConstant(int value) { return Expressions.constant(value); } }); } public boolean containsXor() { return 1 == visit(new IntVisitor() { public int visitAnd(Expression a, Expression b) { return a.visit(this) == 1 || b.visit(this) == 1 ? 1 : 0; } public int visitOr(Expression a, Expression b) { return a.visit(this) == 1 || b.visit(this) == 1 ? 1 : 0; } public int visitXor(Expression a, Expression b) { return 1; } public int visitNot(Expression a) { return a.visit(this); } public int visitVariable(String name) { return 0; } public int visitConstant(int value) { return 0; } }); } public boolean isCnf() { return 1 == visit(new IntVisitor() { int level = 0; public int visitAnd(Expression a, Expression b) { if (level > 1) return 0; int oldLevel = level; level = 1; int ret = a.visit(this) == 1 && b.visit(this) == 1 ? 1 : 0; level = oldLevel; return ret; } public int visitOr(Expression a, Expression b) { if (level > 0) return 0; return a.visit(this) == 1 && b.visit(this) == 1 ? 1 : 0; } public int visitXor(Expression a, Expression b) { return 0; } public int visitNot(Expression a) { if (level == 2) return 0; int oldLevel = level; level = 2; int ret = a.visit(this); level = oldLevel; return ret; } public int visitVariable(String name) { return 1; } public int visitConstant(int value) { return 1; } }); } } logisim-2.7.1/src/com/cburch/logisim/analyze/model/Entry.java0000644000175000017500000000271711446034530024056 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.analyze.model; import com.cburch.logisim.util.StringGetter; public class Entry { public static final Entry ZERO = new Entry("0"); public static final Entry ONE = new Entry("1"); public static final Entry DONT_CARE = new Entry("x"); public static final Entry BUS_ERROR = new Entry(Strings.getter("busError")); public static final Entry OSCILLATE_ERROR = new Entry(Strings.getter("oscillateError")); public static Entry parse(String description) { if (ZERO.description.equals(description)) return ZERO; if (ONE.description.equals(description)) return ONE; if (DONT_CARE.description.equals(description)) return DONT_CARE; if (BUS_ERROR.description.equals(description)) return BUS_ERROR; return null; } private String description; private StringGetter errorMessage; private Entry(String description) { this.description = description; this.errorMessage = null; } private Entry(StringGetter errorMessage) { this.description = "!!"; this.errorMessage = errorMessage; } public String getDescription() { return description; } public boolean isError() { return errorMessage != null; } public String getErrorMessage() { return errorMessage == null ? null : errorMessage.get(); } @Override public String toString() { return "Entry[" + description + "]"; } } logisim-2.7.1/src/com/cburch/logisim/analyze/model/Assignments.java0000644000175000017500000000112111446034530025234 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.analyze.model; import java.util.HashMap; import java.util.Map; class Assignments { private Map map = new HashMap(); public Assignments() { } public boolean get(String variable) { Boolean value = map.get(variable); return value != null ? value.booleanValue() : false; } public void put(String variable, boolean value) { map.put(variable, Boolean.valueOf(value)); } } logisim-2.7.1/src/com/cburch/logisim/analyze/model/AnalyzerModel.java0000644000175000017500000000331711524651506025525 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.analyze.model; import java.util.List; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.proj.Project; public class AnalyzerModel { public static final int MAX_INPUTS = 12; public static final int MAX_OUTPUTS = 12; public static final int FORMAT_SUM_OF_PRODUCTS = 0; public static final int FORMAT_PRODUCT_OF_SUMS = 1; private VariableList inputs = new VariableList(MAX_INPUTS); private VariableList outputs = new VariableList(MAX_OUTPUTS); private TruthTable table; private OutputExpressions outputExpressions; private Project currentProject = null; private Circuit currentCircuit = null; public AnalyzerModel() { // the order here is important, because the output expressions // need the truth table to exist for listening. table = new TruthTable(this); outputExpressions = new OutputExpressions(this); } // // access methods // public Project getCurrentProject() { return currentProject; } public Circuit getCurrentCircuit() { return currentCircuit; } public VariableList getInputs() { return inputs; } public VariableList getOutputs() { return outputs; } public TruthTable getTruthTable() { return table; } public OutputExpressions getOutputExpressions() { return outputExpressions; } // // modifier methods // public void setCurrentCircuit(Project value, Circuit circuit) { currentProject = value; currentCircuit = circuit; } public void setVariables(List inputs, List outputs) { this.inputs.setAll(inputs); this.outputs.setAll(outputs); } } logisim-2.7.1/src/com/cburch/logisim/analyze/gui/0000755000175000017500000000000011535206220021563 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/logisim/analyze/gui/VariableTab.java0000644000175000017500000002253711535206220024613 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.analyze.gui; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.GridLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.AbstractListModel; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.ListSelectionModel; import javax.swing.ScrollPaneConstants; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import com.cburch.logisim.analyze.model.VariableList; import com.cburch.logisim.analyze.model.VariableListEvent; import com.cburch.logisim.analyze.model.VariableListListener; import com.cburch.logisim.util.StringUtil; class VariableTab extends AnalyzerTab implements TabInterface { private static class VariableListModel extends AbstractListModel implements VariableListListener { private VariableList list; private String[] listCopy; public VariableListModel(VariableList list) { this.list = list; updateCopy(); list.addVariableListListener(this); } private void updateCopy() { listCopy = list.toArray(new String[list.size()]); } public int getSize() { return listCopy.length; } public Object getElementAt(int index) { return index >= 0 && index < listCopy.length ? listCopy[index] : null; } private void update() { String[] oldCopy = listCopy; updateCopy(); fireContentsChanged(this, 0, oldCopy.length); } public void listChanged(VariableListEvent event) { String[] oldCopy = listCopy; updateCopy(); int index; switch (event.getType()) { case VariableListEvent.ALL_REPLACED: fireContentsChanged(this, 0, oldCopy.length); return; case VariableListEvent.ADD: index = list.indexOf(event.getVariable()); fireIntervalAdded(this, index, index); return; case VariableListEvent.REMOVE: index = ((Integer) event.getData()).intValue(); fireIntervalRemoved(this, index, index); return; case VariableListEvent.MOVE: fireContentsChanged(this, 0, getSize()); return; case VariableListEvent.REPLACE: index = ((Integer) event.getData()).intValue(); fireContentsChanged(this, index, index); return; } } } private class MyListener implements ActionListener, DocumentListener, ListSelectionListener { public void actionPerformed(ActionEvent event) { Object src = event.getSource(); if ((src == add || src == field) && add.isEnabled()) { String name = field.getText().trim(); if (!name.equals("")) { data.add(name); if (data.contains(name)) { list.setSelectedValue(name, true); } field.setText(""); field.grabFocus(); } } else if (src == rename) { String oldName = (String) list.getSelectedValue(); String newName = field.getText().trim(); if (oldName != null && !newName.equals("")) { data.replace(oldName, newName); field.setText(""); field.grabFocus(); } } else if (src == remove) { String name = (String) list.getSelectedValue(); if (name != null) data.remove(name); } else if (src == moveUp) { String name = (String) list.getSelectedValue(); if (name != null) { data.move(name, -1); list.setSelectedValue(name, true); } } else if (src == moveDown) { String name = (String) list.getSelectedValue(); if (name != null) { data.move(name, 1); list.setSelectedValue(name, true); } } } public void insertUpdate(DocumentEvent event) { computeEnabled(); } public void removeUpdate(DocumentEvent event) { insertUpdate(event); } public void changedUpdate(DocumentEvent event) { insertUpdate(event); } public void valueChanged(ListSelectionEvent event) { computeEnabled(); } public void listChanged(VariableListEvent event) { switch (event.getType()) { case VariableListEvent.ALL_REPLACED: list.setSelectedIndices(new int[0]); break; case VariableListEvent.REMOVE: if (event.getVariable().equals(list.getSelectedValue())) { int index = ((Integer) event.getData()).intValue(); if (index >= data.size()) { if (data.isEmpty()) { list.setSelectedIndices(new int[0]); } index = data.size() - 1; } list.setSelectedValue(data.get(index), true); } break; case VariableListEvent.ADD: case VariableListEvent.MOVE: case VariableListEvent.REPLACE: break; } list.validate(); } } private VariableList data; private MyListener myListener = new MyListener(); private JList list = new JList(); private JTextField field = new JTextField(); private JButton remove = new JButton(); private JButton moveUp = new JButton(); private JButton moveDown = new JButton(); private JButton add = new JButton(); private JButton rename = new JButton(); private JLabel error = new JLabel(" "); VariableTab(VariableList data) { this.data = data; list.setModel(new VariableListModel(data)); list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); list.addListSelectionListener(myListener); remove.addActionListener(myListener); moveUp.addActionListener(myListener); moveDown.addActionListener(myListener); add.addActionListener(myListener); rename.addActionListener(myListener); field.addActionListener(myListener); field.getDocument().addDocumentListener(myListener); JScrollPane listPane = new JScrollPane(list, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); listPane.setPreferredSize(new Dimension(100, 100)); JPanel topPanel = new JPanel(new GridLayout(3, 1)); topPanel.add(remove); topPanel.add(moveUp); topPanel.add(moveDown); JPanel fieldPanel = new JPanel(); fieldPanel.add(rename); fieldPanel.add(add); GridBagLayout gb = new GridBagLayout(); GridBagConstraints gc = new GridBagConstraints(); setLayout(gb); Insets oldInsets = gc.insets; gc.insets = new Insets(10, 10, 0, 0); gc.fill = GridBagConstraints.BOTH; gc.weightx = 1.0; gb.setConstraints(listPane, gc); add(listPane); gc.fill = GridBagConstraints.NONE; gc.anchor = GridBagConstraints.PAGE_START; gc.weightx = 0.0; gb.setConstraints(topPanel, gc); add(topPanel); gc.insets = new Insets(10, 10, 0, 10); gc.gridwidth = GridBagConstraints.REMAINDER; gc.gridx = 0; gc.gridy = GridBagConstraints.RELATIVE; gc.fill = GridBagConstraints.HORIZONTAL; gb.setConstraints(field, gc); add(field); gc.insets = oldInsets; gc.fill = GridBagConstraints.NONE; gc.anchor = GridBagConstraints.LINE_END; gb.setConstraints(fieldPanel, gc); add(fieldPanel); gc.fill = GridBagConstraints.HORIZONTAL; gb.setConstraints(error, gc); add(error); if (!data.isEmpty()) list.setSelectedValue(data.get(0), true); computeEnabled(); } @Override void localeChanged() { remove.setText(Strings.get("variableRemoveButton")); moveUp.setText(Strings.get("variableMoveUpButton")); moveDown.setText(Strings.get("variableMoveDownButton")); add.setText(Strings.get("variableAddButton")); rename.setText(Strings.get("variableRenameButton")); validateInput(); } @Override void updateTab() { VariableListModel model = (VariableListModel) list.getModel(); model.update(); } void registerDefaultButtons(DefaultRegistry registry) { registry.registerDefaultButton(field, add); } private void computeEnabled() { int index = list.getSelectedIndex(); int max = list.getModel().getSize(); boolean selected = index >= 0 && index < max; remove.setEnabled(selected); moveUp.setEnabled(selected && index > 0); moveDown.setEnabled(selected && index < max); boolean ok = validateInput(); add.setEnabled(ok && data.size() < data.getMaximumSize()); rename.setEnabled(ok && selected); } private boolean validateInput() { String text = field.getText().trim(); boolean ok = true; boolean errorShown = true; if (text.length() == 0) { errorShown = false; ok = false; } else if (!Character.isJavaIdentifierStart(text.charAt(0))) { error.setText(Strings.get("variableStartError")); ok = false; } else { for (int i = 1; i < text.length() && ok; i++) { char c = text.charAt(i); if (!Character.isJavaIdentifierPart(c)) { error.setText(StringUtil.format(Strings.get("variablePartError"), "" + c)); ok = false; } } } if (ok) { for (int i = 0, n = data.size(); i < n && ok; i++) { String other = data.get(i); if (text.equals(other)) { error.setText(Strings.get("variableDuplicateError")); ok = false; } } } if (ok || !errorShown) { if (data.size() >= data.getMaximumSize()) { error.setText(StringUtil.format(Strings.get("variableMaximumError"), "" + data.getMaximumSize())); } else { error.setText(" "); } } return ok; } public void copy() { field.requestFocus(); field.copy(); } public void paste() { field.requestFocus(); field.paste(); } public void delete() { field.requestFocus(); field.replaceSelection(""); } public void selectAll() { field.requestFocus(); field.selectAll(); } } logisim-2.7.1/src/com/cburch/logisim/analyze/gui/TruthTablePanel.java0000644000175000017500000000116711446034532025477 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.analyze.gui; import java.awt.Color; import java.awt.event.MouseEvent; import com.cburch.logisim.analyze.model.Entry; import com.cburch.logisim.analyze.model.TruthTable; interface TruthTablePanel { public static final Color ERROR_COLOR = new Color(255, 128, 128); public TruthTable getTruthTable(); public int getOutputColumn(MouseEvent event); public int getRow(MouseEvent event); public void setEntryProvisional(int row, int col, Entry value); } logisim-2.7.1/src/com/cburch/logisim/analyze/gui/TruthTableMouseListener.java0000644000175000017500000000365211446034532027237 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.analyze.gui; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import com.cburch.logisim.analyze.model.Entry; import com.cburch.logisim.analyze.model.TruthTable; class TruthTableMouseListener implements MouseListener { private int cellX; private int cellY; private Entry oldValue; private Entry newValue; public void mousePressed(MouseEvent event) { TruthTablePanel source = (TruthTablePanel) event.getSource(); TruthTable model = source.getTruthTable(); int cols = model.getInputColumnCount() + model.getOutputColumnCount(); int rows = model.getRowCount(); cellX = source.getOutputColumn(event); cellY = source.getRow(event); if (cellX < 0 || cellY < 0 || cellX >= cols || cellY >= rows) return; oldValue = source.getTruthTable().getOutputEntry(cellY, cellX); if (oldValue == Entry.ZERO) newValue = Entry.ONE; else if (oldValue == Entry.ONE) newValue = Entry.DONT_CARE; else newValue = Entry.ZERO; source.setEntryProvisional(cellY, cellX, newValue); } public void mouseReleased(MouseEvent event) { TruthTablePanel source = (TruthTablePanel) event.getSource(); TruthTable model = source.getTruthTable(); int cols = model.getInputColumnCount() + model.getOutputColumnCount(); int rows = model.getRowCount(); if (cellX < 0 || cellY < 0 || cellX >= cols || cellY >= rows) return; int x = source.getOutputColumn(event); int y = source.getRow(event); TruthTable table = source.getTruthTable(); if (x == cellX && y == cellY) { table.setOutputEntry(y, x, newValue); } source.setEntryProvisional(cellY, cellX, null); cellX = -1; cellY = -1; } public void mouseClicked(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } } logisim-2.7.1/src/com/cburch/logisim/analyze/gui/TableTabClip.java0000644000175000017500000001577211447117134024737 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.analyze.gui; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.ClipboardOwner; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.io.IOException; import java.io.Serializable; import java.util.StringTokenizer; import javax.swing.JOptionPane; import com.cburch.logisim.analyze.model.Entry; import com.cburch.logisim.analyze.model.TruthTable; class TableTabClip implements ClipboardOwner { private static final DataFlavor binaryFlavor = new DataFlavor(Data.class, "Binary data"); private static class Data implements Transferable, Serializable { private String[] headers; private String[][] contents; Data(String[] headers, String[][] contents) { this.headers = headers; this.contents = contents; } public DataFlavor[] getTransferDataFlavors() { return new DataFlavor[] { binaryFlavor, DataFlavor.stringFlavor }; } public boolean isDataFlavorSupported(DataFlavor flavor) { return flavor == binaryFlavor || flavor == DataFlavor.stringFlavor; } public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { if (flavor == binaryFlavor) { return this; } else if (flavor == DataFlavor.stringFlavor) { StringBuilder buf = new StringBuilder(); for (int i = 0; i < headers.length; i++) { buf.append(headers[i]); buf.append(i == headers.length - 1 ? '\n' : '\t'); } for (int i = 0; i < contents.length; i++) { for (int j = 0; j < contents[i].length; j++) { buf.append(contents[i][j]); buf.append(j == contents[i].length - 1 ? '\n' : '\t'); } } return buf.toString(); } else { throw new UnsupportedFlavorException(flavor); } } } private TableTab table; TableTabClip(TableTab table) { this.table = table; } public void copy() { TableTabCaret caret = table.getCaret(); int c0 = caret.getCursorCol(); int r0 = caret.getCursorRow(); int c1 = caret.getMarkCol(); int r1 = caret.getMarkRow(); if (c1 < c0) { int t = c0; c0 = c1; c1 = t; } if (r1 < r0) { int t = r0; r0 = r1; r1 = t; } TruthTable t = table.getTruthTable(); int inputs = t.getInputColumnCount(); String[] header = new String[c1 - c0 + 1]; for (int c = c0; c <= c1; c++) { if (c < inputs) { header[c - c0] = t.getInputHeader(c); } else { header[c - c0] = t.getOutputHeader(c - inputs); } } String[][] contents = new String[r1 - r0 + 1][c1 - c0 + 1]; for (int r = r0; r <= r1; r++) { for (int c = c0; c <= c1; c++) { if (c < inputs) { contents[r - r0][c - c0] = t.getInputEntry(r, c).getDescription(); } else { contents[r - r0][c - c0] = t.getOutputEntry(r, c - inputs).getDescription(); } } } Clipboard clip = table.getToolkit().getSystemClipboard(); clip.setContents(new Data(header, contents), this); } public boolean canPaste() { Clipboard clip = table.getToolkit().getSystemClipboard(); Transferable xfer = clip.getContents(this); return xfer.isDataFlavorSupported(binaryFlavor); } public void paste() { Clipboard clip = table.getToolkit().getSystemClipboard(); Transferable xfer; try { xfer = clip.getContents(this); } catch (Throwable t) { // I don't know - the above was observed to throw an odd ArrayIndexOutOfBounds // exception on a Linux computer using Sun's Java 5 JVM JOptionPane.showMessageDialog(table.getRootPane(), Strings.get("clipPasteSupportedError"), Strings.get("clipPasteErrorTitle"), JOptionPane.ERROR_MESSAGE); return; } Entry[][] entries; if (xfer.isDataFlavorSupported(binaryFlavor)) { try { Data data = (Data) xfer.getTransferData(binaryFlavor); entries = new Entry[data.contents.length][]; for (int i = 0; i < entries.length; i++) { Entry[] row = new Entry[data.contents[i].length]; for (int j = 0; j < row.length; j++) { row[j] = Entry.parse(data.contents[i][j]); } entries[i] = row; } } catch (UnsupportedFlavorException e) { return; } catch (IOException e) { return; } } else if (xfer.isDataFlavorSupported(DataFlavor.stringFlavor)) { try { String buf = (String) xfer.getTransferData(DataFlavor.stringFlavor); StringTokenizer lines = new StringTokenizer(buf, "\r\n"); String first; if (!lines.hasMoreTokens()) return; first = lines.nextToken(); StringTokenizer toks = new StringTokenizer(first, "\t,"); String[] headers = new String[toks.countTokens()]; Entry[] firstEntries = new Entry[headers.length]; boolean allParsed = true; for (int i = 0; toks.hasMoreTokens(); i++) { headers[i] = toks.nextToken(); firstEntries[i] = Entry.parse(headers[i]); allParsed = allParsed && firstEntries[i] != null; } int rows = lines.countTokens(); if (allParsed) rows++; entries = new Entry[rows][]; int cur = 0; if (allParsed) { entries[0] = firstEntries; cur++; } while (lines.hasMoreTokens()) { toks = new StringTokenizer(lines.nextToken(), "\t"); Entry[] ents = new Entry[toks.countTokens()]; for (int i = 0; toks.hasMoreTokens(); i++) { ents[i] = Entry.parse(toks.nextToken()); } entries[cur] = ents; cur++; } } catch (UnsupportedFlavorException e) { return; } catch (IOException e) { return; } } else { JOptionPane.showMessageDialog(table.getRootPane(), Strings.get("clipPasteSupportedError"), Strings.get("clipPasteErrorTitle"), JOptionPane.ERROR_MESSAGE); return; } TableTabCaret caret = table.getCaret(); int c0 = caret.getCursorCol(); int c1 = caret.getMarkCol(); int r0 = caret.getCursorRow(); int r1 = caret.getMarkRow(); if (r0 < 0 || r1 < 0 || c0 < 0 || c1 < 0) return; TruthTable model = table.getTruthTable(); int rows = model.getRowCount(); int inputs = model.getInputColumnCount(); int outputs = model.getOutputColumnCount(); if (c0 == c1 && r0 == r1) { if (r0 + entries.length > rows || c0 + entries[0].length > inputs + outputs) { JOptionPane.showMessageDialog(table.getRootPane(), Strings.get("clipPasteEndError"), Strings.get("clipPasteErrorTitle"), JOptionPane.ERROR_MESSAGE); return; } } else { if (r0 > r1) { int t = r0; r0 = r1; r1 = t; } if (c0 > c1) { int t = c0; c0 = c1; c1 = t; } if (r1 - r0 + 1 != entries.length || c1 - c0 + 1 != entries[0].length) { JOptionPane.showMessageDialog(table.getRootPane(), Strings.get("clipPasteSizeError"), Strings.get("clipPasteErrorTitle"), JOptionPane.ERROR_MESSAGE); return; } } for (int r = 0; r < entries.length; r++) { for (int c = 0; c < entries[0].length; c++) { if (c0 + c >= inputs) { model.setOutputEntry(r0 + r, c0 + c - inputs, entries[r][c]); } } } } public void lostOwnership(Clipboard clip, Transferable transfer) { } } logisim-2.7.1/src/com/cburch/logisim/analyze/gui/TableTabCaret.java0000644000175000017500000002343011446034532025073 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.analyze.gui; import java.awt.Color; import java.awt.Graphics; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import javax.swing.AbstractAction; import javax.swing.ActionMap; import javax.swing.InputMap; import javax.swing.KeyStroke; import com.cburch.logisim.analyze.model.Entry; import com.cburch.logisim.analyze.model.TruthTable; import com.cburch.logisim.analyze.model.TruthTableEvent; import com.cburch.logisim.analyze.model.TruthTableListener; import com.cburch.logisim.util.GraphicsUtil; class TableTabCaret { private static Color SELECT_COLOR = new Color(192, 192, 255); private Listener listener = new Listener(); private TableTab table; private int cursorRow; private int cursorCol; private int markRow; private int markCol; TableTabCaret(TableTab table) { this.table = table; cursorRow = 0; cursorCol = 0; markRow = 0; markCol = 0; table.getTruthTable().addTruthTableListener(listener); table.addMouseListener(listener); table.addMouseMotionListener(listener); table.addKeyListener(listener); table.addFocusListener(listener); InputMap imap = table.getInputMap(); ActionMap amap = table.getActionMap(); AbstractAction nullAction = new AbstractAction() { public void actionPerformed(ActionEvent e) { } }; String nullKey = "null"; amap.put(nullKey, nullAction); imap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), nullKey); imap.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), nullKey); imap.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), nullKey); imap.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), nullKey); imap.put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN, 0), nullKey); imap.put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP, 0), nullKey); imap.put(KeyStroke.getKeyStroke(KeyEvent.VK_HOME, 0), nullKey); imap.put(KeyStroke.getKeyStroke(KeyEvent.VK_END, 0), nullKey); imap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), nullKey); } int getCursorRow() { return cursorRow; } int getCursorCol() { return cursorCol; } int getMarkRow() { return markRow; } int getMarkCol() { return markCol; } void selectAll() { table.requestFocus(); TruthTable model = table.getTruthTable(); setCursor(model.getRowCount(), model.getInputColumnCount() + model.getOutputColumnCount(), false); setCursor(0, 0, true); } private void setCursor(int row, int col, boolean keepMark) { TruthTable model = table.getTruthTable(); int rows = model.getRowCount(); int cols = model.getInputColumnCount() + model.getOutputColumnCount(); if (row < 0) row = 0; if (col < 0) col = 0; if (row >= rows) row = rows - 1; if (col >= cols) col = cols - 1; if (row == cursorRow && col == cursorCol && (keepMark || (row == markRow && col == markCol))) { ; // nothing is changing, so do nothing } else if (!keepMark && markRow == cursorRow && markCol == cursorCol) { int oldRow = cursorRow; int oldCol = cursorCol; cursorRow = row; cursorCol = col; markRow = row; markCol = col; expose(oldRow, oldCol); expose(cursorRow, cursorCol); } else { int r0 = Math.min(row, Math.min(cursorRow, markRow)); int r1 = Math.max(row, Math.max(cursorRow, markRow)); int c0 = Math.min(col, Math.min(cursorCol, markCol)); int c1 = Math.max(col, Math.max(cursorCol, markCol)); cursorRow = row; cursorCol = col; if (!keepMark) { markRow = row; markCol = col; } int x0 = table.getX(c0); int x1 = table.getX(c1) + table.getCellWidth(); int y0 = table.getY(r0); int y1 = table.getY(r1) + table.getCellHeight(); table.repaint(x0 - 2, y0 - 2, (x1 - x0) + 4, (y1 - y0) + 4); } int cx = table.getX(cursorCol); int cy = table.getY(cursorRow); int cw = table.getCellWidth(); int ch = table.getCellHeight(); if (cursorRow == 0) { ch += cy; cy = 0; } table.scrollRectToVisible(new Rectangle(cx, cy, cw, ch)); } private void expose(int row, int col) { if (row >= 0) { int x0 = table.getX(0); int x1 = table.getX(table.getColumnCount() - 1) + table.getCellWidth(); table.repaint(x0 - 2, table.getY(row) - 2, (x1 - x0) + 4, table.getCellHeight() + 4); } } void paintBackground(Graphics g) { if (cursorRow >= 0 && cursorCol >= 0 && (cursorRow != markRow || cursorCol != markCol)) { g.setColor(SELECT_COLOR); int r0 = cursorRow; int c0 = cursorCol; int r1 = markRow; int c1 = markCol; if (r1 < r0) { int t = r1; r1 = r0; r0 = t; } if (c1 < c0) { int t = c1; c1 = c0; c0 = t; } int x0 = table.getX(c0); int y0 = table.getY(r0); int x1 = table.getX(c1) + table.getCellWidth(); int y1 = table.getY(r1) + table.getCellHeight(); g.fillRect(x0, y0, x1 - x0, y1 - y0); } } void paintForeground(Graphics g) { if (!table.isFocusOwner()) return; if (cursorRow >= 0 && cursorCol >= 0) { int x = table.getX(cursorCol); int y = table.getY(cursorRow); GraphicsUtil.switchToWidth(g, 2); g.drawRect(x, y, table.getCellWidth(), table.getCellHeight()); GraphicsUtil.switchToWidth(g, 2); } } private class Listener implements MouseListener, MouseMotionListener, KeyListener, FocusListener, TruthTableListener { public void mouseClicked(MouseEvent e) { } public void mousePressed(MouseEvent e) { table.requestFocus(); int row = table.getRow(e); int col = table.getColumn(e); setCursor(row, col, (e.getModifiers() & InputEvent.SHIFT_MASK) != 0); } public void mouseReleased(MouseEvent e) { mouseDragged(e); } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mouseDragged(MouseEvent e) { int row = table.getRow(e); int col = table.getColumn(e); setCursor(row, col, true); } public void mouseMoved(MouseEvent e) { } public void keyTyped(KeyEvent e) { int mask = e.getModifiers(); if ((mask & ~InputEvent.SHIFT_MASK) != 0) return; char c = e.getKeyChar(); Entry newEntry = null; switch (c) { case ' ': if (cursorRow >= 0) { TruthTable model = table.getTruthTable(); int inputs = model.getInputColumnCount(); if (cursorCol >= inputs) { Entry cur = model.getOutputEntry(cursorRow, cursorCol - inputs); if (cur == Entry.ZERO) cur = Entry.ONE; else if (cur == Entry.ONE) cur = Entry.DONT_CARE; else cur = Entry.ZERO; model.setOutputEntry(cursorRow, cursorCol - inputs, cur); } } break; case '0': newEntry = Entry.ZERO; break; case '1': newEntry = Entry.ONE; break; case 'x': newEntry = Entry.DONT_CARE; break; case '\n': setCursor(cursorRow + 1, table.getTruthTable().getInputColumnCount(), (mask & InputEvent.SHIFT_MASK) != 0); break; case '\u0008': case '\u007f': setCursor(cursorRow, cursorCol - 1, (mask & InputEvent.SHIFT_MASK) != 0); break; default: } if (newEntry != null) { TruthTable model = table.getTruthTable(); int inputs = model.getInputColumnCount(); int outputs = model.getOutputColumnCount(); if (cursorCol >= inputs) { model.setOutputEntry(cursorRow, cursorCol - inputs, newEntry); if (cursorCol >= inputs + outputs - 1) { setCursor(cursorRow + 1, inputs, false); } else { setCursor(cursorRow, cursorCol + 1, false); } } } } public void keyPressed(KeyEvent e) { if (cursorRow < 0) return; TruthTable model = table.getTruthTable(); int rows = model.getRowCount(); int inputs = model.getInputColumnCount(); int outputs = model.getOutputColumnCount(); int cols = inputs + outputs; boolean shift = (e.getModifiers() & InputEvent.SHIFT_MASK) != 0; switch (e.getKeyCode()) { case KeyEvent.VK_UP: setCursor(cursorRow - 1, cursorCol, shift); break; case KeyEvent.VK_LEFT: setCursor(cursorRow, cursorCol - 1, shift); break; case KeyEvent.VK_DOWN: setCursor(cursorRow + 1, cursorCol, shift); break; case KeyEvent.VK_RIGHT: setCursor(cursorRow, cursorCol + 1, shift); break; case KeyEvent.VK_HOME: if (cursorCol == 0) setCursor(0, 0, shift); else setCursor(cursorRow, 0, shift); break; case KeyEvent.VK_END: if (cursorCol == cols - 1) setCursor(rows - 1, cols - 1, shift); else setCursor(cursorRow, cols - 1, shift); break; case KeyEvent.VK_PAGE_DOWN: rows = table.getVisibleRect().height / table.getCellHeight(); if (rows > 2) rows--; setCursor(cursorRow + rows, cursorCol, shift); break; case KeyEvent.VK_PAGE_UP: rows = table.getVisibleRect().height / table.getCellHeight(); if (rows > 2) rows--; setCursor(cursorRow - rows, cursorCol, shift); break; } } public void keyReleased(KeyEvent e) { } public void focusGained(FocusEvent e) { if (cursorRow >= 0) expose(cursorRow, cursorCol); } public void focusLost(FocusEvent e) { if (cursorRow >= 0) expose(cursorRow, cursorCol); } public void cellsChanged(TruthTableEvent event) { } public void structureChanged(TruthTableEvent event) { TruthTable model = event.getSource(); int inputs = model.getInputColumnCount(); int outputs = model.getOutputColumnCount(); int rows = model.getRowCount(); int cols = inputs + outputs; boolean changed = false; if (cursorRow >= rows) { cursorRow = rows - 1; changed = true; } if (cursorCol >= cols) { cursorCol = cols - 1; changed = true; } if (markRow >= rows) { markRow = rows - 1; changed = true; } if (markCol >= cols) { markCol = cols - 1; changed = true; } if (changed) table.repaint(); } } } logisim-2.7.1/src/com/cburch/logisim/analyze/gui/TableTab.java0000644000175000017500000002265111447117134024121 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.analyze.gui; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Rectangle; import java.awt.event.MouseEvent; import javax.swing.JPanel; import javax.swing.JScrollBar; import com.cburch.logisim.analyze.model.Entry; import com.cburch.logisim.analyze.model.TruthTable; import com.cburch.logisim.analyze.model.TruthTableEvent; import com.cburch.logisim.analyze.model.TruthTableListener; import com.cburch.logisim.util.GraphicsUtil; class TableTab extends JPanel implements TruthTablePanel, TabInterface { private static final Font HEAD_FONT = new Font("Serif", Font.BOLD, 14); private static final Font BODY_FONT = new Font("Serif", Font.PLAIN, 14); private static final int COLUMN_SEP = 8; private static final int HEADER_SEP = 4; private class MyListener implements TruthTableListener { public void cellsChanged(TruthTableEvent event) { repaint(); } public void structureChanged(TruthTableEvent event) { computePreferredSize(); } } private MyListener myListener = new MyListener(); private TruthTable table; private int cellWidth = 25; // reasonable start values private int cellHeight = 15; private int tableWidth; private int tableHeight; private int provisionalX; private int provisionalY; private Entry provisionalValue = null; private TableTabCaret caret; private TableTabClip clip; public TableTab(TruthTable table) { this.table = table; table.addTruthTableListener(myListener); setToolTipText(" "); caret = new TableTabCaret(this); clip = new TableTabClip(this); } public TruthTable getTruthTable() { return table; } TableTabCaret getCaret() { return caret; } void localeChanged() { computePreferredSize(); repaint(); } public int getColumn(MouseEvent event) { int x = event.getX() - (getWidth() - tableWidth) / 2; if (x < 0) return -1; int inputs = table.getInputColumnCount(); int cols = inputs + table.getOutputColumnCount(); int ret = (x + COLUMN_SEP / 2) / (cellWidth + COLUMN_SEP); if (inputs == 0) ret--; return ret >= 0 ? ret < cols ? ret : cols : -1; } int getColumnCount() { int inputs = table.getInputColumnCount(); int outputs = table.getOutputColumnCount(); return inputs + outputs; } public int getOutputColumn(MouseEvent event) { int inputs = table.getInputColumnCount(); if (inputs == 0) inputs = 1; int ret = getColumn(event); return ret >= inputs ? ret - inputs : -1; } public int getRow(MouseEvent event) { int y = event.getY() - (getHeight() - tableHeight) / 2; if (y < cellHeight + HEADER_SEP) return -1; int ret = (y - cellHeight - HEADER_SEP) / cellHeight; int rows = table.getRowCount(); return ret >= 0 ? ret < rows ? ret : rows : -1; } public void setEntryProvisional(int y, int x, Entry value) { provisionalY = y; provisionalX = x; provisionalValue = value; int top = (getHeight() - tableHeight) / 2 + cellHeight + HEADER_SEP + y * cellHeight; repaint(0, top, getWidth(), cellHeight); } @Override public String getToolTipText(MouseEvent event) { int row = getRow(event); int col = getOutputColumn(event); Entry entry = table.getOutputEntry(row, col); return entry.getErrorMessage(); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); caret.paintBackground(g); Dimension sz = getSize(); int top = Math.max(0, (sz.height - tableHeight) / 2); int left = Math.max(0, (sz.width - tableWidth) / 2); int inputs = table.getInputColumnCount(); int outputs = table.getOutputColumnCount(); if (inputs == 0 && outputs == 0) { g.setFont(BODY_FONT); GraphicsUtil.drawCenteredText(g, Strings.get("tableEmptyMessage"), sz.width / 2, sz.height / 2); return; } g.setColor(Color.GRAY); int lineX = left + (cellWidth + COLUMN_SEP) * inputs - COLUMN_SEP / 2; if (inputs == 0) lineX = left + cellWidth + COLUMN_SEP / 2; int lineY = top + cellHeight + HEADER_SEP / 2; g.drawLine(left, lineY, left + tableWidth, lineY); g.drawLine(lineX, top, lineX, top + tableHeight); g.setColor(Color.BLACK); g.setFont(HEAD_FONT); FontMetrics headerMetric = g.getFontMetrics(); int x = left; int y = top + headerMetric.getAscent() + 1; if (inputs == 0) { x = paintHeader(Strings.get("tableNullHeader"), x, y, g, headerMetric); } else { for (int i = 0; i < inputs; i++) { x = paintHeader(table.getInputHeader(i), x, y, g, headerMetric); } } if (outputs == 0) { x = paintHeader(Strings.get("tableNullHeader"), x, y, g, headerMetric); } else { for (int i = 0; i < outputs; i++) { x = paintHeader(table.getOutputHeader(i), x, y, g, headerMetric); } } g.setFont(BODY_FONT); FontMetrics bodyMetric = g.getFontMetrics(); y = top + cellHeight + HEADER_SEP; Rectangle clip = g.getClipBounds(); int firstRow = Math.max(0, (clip.y - y) / cellHeight); int lastRow = Math.min(table.getRowCount(), 2 + (clip.y + clip.height - y) / cellHeight); y += firstRow * cellHeight; if (inputs == 0) left += cellWidth + COLUMN_SEP; boolean provisional = false; for (int i = firstRow; i < lastRow; i++) { x = left; for (int j = 0; j < inputs + outputs; j++) { Entry entry = j < inputs ? table.getInputEntry(i, j) : table.getOutputEntry(i, j - inputs); if (provisionalValue != null && i == provisionalY && j - inputs == provisionalX) { provisional = true; entry = provisionalValue; } if (entry.isError()) { g.setColor(ERROR_COLOR); g.fillRect(x, y, cellWidth, cellHeight); g.setColor(Color.BLACK); } String label = entry.getDescription(); int width = bodyMetric.stringWidth(label); if (provisional) { provisional = false; g.setColor(Color.GREEN); g.drawString(label, x + (cellWidth - width) / 2, y + bodyMetric.getAscent()); g.setColor(Color.BLACK); } else { g.drawString(label, x + (cellWidth - width) / 2, y + bodyMetric.getAscent()); } x += cellWidth + COLUMN_SEP; } y += cellHeight; } caret.paintForeground(g); } int getCellWidth() { return cellWidth; } int getCellHeight() { return cellHeight; } int getX(int col) { Dimension sz = getSize(); int left = Math.max(0, (sz.width - tableWidth) / 2); int inputs = table.getInputColumnCount(); if (inputs == 0) left += cellWidth + COLUMN_SEP; return left + col * (cellWidth + COLUMN_SEP); } int getY(int row) { Dimension sz = getSize(); int top = Math.max(0, (sz.height - tableHeight) / 2); return top + cellHeight + HEADER_SEP + row * cellHeight; } private int paintHeader(String header, int x, int y, Graphics g, FontMetrics fm) { int width = fm.stringWidth(header); g.drawString(header, x + (cellWidth - width) / 2, y); return x + cellWidth + COLUMN_SEP; } private void computePreferredSize() { int inputs = table.getInputColumnCount(); int outputs = table.getOutputColumnCount(); if (inputs == 0 && outputs == 0) { setPreferredSize(new Dimension(0, 0)); return; } Graphics g = getGraphics(); if (g == null) { cellHeight = 16; cellWidth = 24; } else { FontMetrics fm = g.getFontMetrics(HEAD_FONT); cellHeight = fm.getHeight(); cellWidth = 24; if (inputs == 0 || outputs == 0) { cellWidth = Math.max(cellWidth, fm.stringWidth(Strings.get("tableNullHeader"))); } for (int i = 0; i < inputs + outputs; i++) { String header = i < inputs ? table.getInputHeader(i) : table.getOutputHeader(i - inputs); cellWidth = Math.max(cellWidth, fm.stringWidth(header)); } } if (inputs == 0) inputs = 1; if (outputs == 0) outputs = 1; tableWidth = (cellWidth + COLUMN_SEP) * (inputs + outputs) - COLUMN_SEP; tableHeight = cellHeight * (1 + table.getRowCount()) + HEADER_SEP; setPreferredSize(new Dimension(tableWidth, tableHeight)); revalidate(); repaint(); } JScrollBar getVerticalScrollBar() { return new JScrollBar() { @Override public int getUnitIncrement(int direction) { int curY = getValue(); if (direction > 0) { return curY > 0 ? cellHeight : cellHeight + HEADER_SEP; } else { return curY > cellHeight + HEADER_SEP ? cellHeight : cellHeight + HEADER_SEP; } } @Override public int getBlockIncrement(int direction) { int curY = getValue(); int curHeight = getVisibleAmount(); int numCells = curHeight / cellHeight - 1; if (numCells <= 0) numCells = 1; if (direction > 0) { return curY > 0 ? numCells * cellHeight : numCells * cellHeight + HEADER_SEP; } else { return curY > cellHeight + HEADER_SEP ? numCells * cellHeight : numCells * cellHeight + HEADER_SEP; } } }; } public void copy() { requestFocus(); clip.copy(); } public void paste() { requestFocus(); clip.paste(); } public void delete() { requestFocus(); int r0 = caret.getCursorRow(); int r1 = caret.getMarkRow(); int c0 = caret.getCursorCol(); int c1 = caret.getMarkCol(); if (r0 < 0 || r1 < 0) return; if (r1 < r0) { int t = r0; r0 = r1; r1 = t; } if (c1 < c0) { int t = c0; c0 = c1; c1 = t; } int inputs = table.getInputColumnCount(); for (int c = c0; c <= c1; c++) { if (c >= inputs) { for (int r = r0; r <= r1; r++) { table.setOutputEntry(r, c - inputs, Entry.DONT_CARE); } } } } public void selectAll() { caret.selectAll(); } } logisim-2.7.1/src/com/cburch/logisim/analyze/gui/TabInterface.java0000644000175000017500000000046411446034532024767 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.analyze.gui; interface TabInterface { public void copy(); public void paste(); public void delete(); public void selectAll(); } logisim-2.7.1/src/com/cburch/logisim/analyze/gui/Strings.java0000644000175000017500000000103611446034532024065 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.analyze.gui; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.StringGetter; class Strings { private static LocaleManager source = new LocaleManager("resources/logisim", "analyze"); public static String get(String key) { return source.get(key); } public static StringGetter getter(String key) { return source.getter(key); } } logisim-2.7.1/src/com/cburch/logisim/analyze/gui/OutputSelector.java0000644000175000017500000001041311534737560025445 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.analyze.gui; import java.awt.event.ItemListener; import javax.swing.AbstractListModel; import javax.swing.ComboBoxModel; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JPanel; import com.cburch.logisim.analyze.model.AnalyzerModel; import com.cburch.logisim.analyze.model.VariableList; import com.cburch.logisim.analyze.model.VariableListEvent; import com.cburch.logisim.analyze.model.VariableListListener; class OutputSelector { private class Model extends AbstractListModel implements ComboBoxModel, VariableListListener { private Object selected; public void setSelectedItem(Object value) { selected = value; } public Object getSelectedItem() { return selected; } public int getSize() { return source.size(); } public Object getElementAt(int index) { return source.get(index); } public void listChanged(VariableListEvent event) { int index; String variable; Object selection; switch (event.getType()) { case VariableListEvent.ALL_REPLACED: computePrototypeValue(); fireContentsChanged(this, 0, getSize()); if (source.isEmpty()) { select.setSelectedItem(null); } else { select.setSelectedItem(source.get(0)); } break; case VariableListEvent.ADD: variable = event.getVariable(); if (prototypeValue == null || variable.length() > prototypeValue.length()) { computePrototypeValue(); } index = source.indexOf(variable); fireIntervalAdded(this, index, index); if (select.getSelectedItem() == null) { select.setSelectedItem(variable); } break; case VariableListEvent.REMOVE: variable = event.getVariable(); if (variable.equals(prototypeValue)) computePrototypeValue(); index = ((Integer) event.getData()).intValue(); fireIntervalRemoved(this, index, index); selection = select.getSelectedItem(); if (selection != null && selection.equals(variable)) { selection = source.isEmpty() ? null : source.get(0); select.setSelectedItem(selection); } break; case VariableListEvent.MOVE: fireContentsChanged(this, 0, getSize()); break; case VariableListEvent.REPLACE: variable = event.getVariable(); if (variable.equals(prototypeValue)) computePrototypeValue(); index = ((Integer) event.getData()).intValue(); fireContentsChanged(this, index, index); selection = select.getSelectedItem(); if (selection != null && selection.equals(variable)) { select.setSelectedItem(event.getSource().get(index)); } break; } } } private VariableList source; private JLabel label = new JLabel(); private JComboBox select = new JComboBox(); private String prototypeValue = null; public OutputSelector(AnalyzerModel model) { this.source = model.getOutputs(); Model listModel = new Model(); select.setModel(listModel); source.addVariableListListener(listModel); } public JPanel createPanel() { JPanel ret = new JPanel(); ret.add(label); ret.add(select); return ret; } public JLabel getLabel() { return label; } public JComboBox getComboBox() { return select; } void localeChanged() { label.setText(Strings.get("outputSelectLabel")); } public void addItemListener(ItemListener l) { select.addItemListener(l); } public void removeItemListener(ItemListener l) { select.removeItemListener(l); } public String getSelectedOutput() { String value = (String) select.getSelectedItem(); if (value != null && !source.contains(value)) { if (source.isEmpty()) { value = null; } else { value = source.get(0); } select.setSelectedItem(value); } return value; } private void computePrototypeValue() { String newValue; if (source.isEmpty()) { newValue = "xx"; } else { newValue = "xx"; for (int i = 0, n = source.size(); i < n; i++) { String candidate = source.get(i); if (candidate.length() > newValue.length()) newValue = candidate; } } if (prototypeValue == null || newValue.length() != prototypeValue.length()) { prototypeValue = newValue; select.setPrototypeDisplayValue(prototypeValue + "xx"); select.revalidate(); } } } logisim-2.7.1/src/com/cburch/logisim/analyze/gui/MinimizedTab.java0000644000175000017500000001464711534737554025040 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.analyze.gui; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.GridLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import javax.swing.AbstractListModel; import javax.swing.ComboBoxModel; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JPanel; import com.cburch.logisim.analyze.model.AnalyzerModel; import com.cburch.logisim.analyze.model.OutputExpressions; import com.cburch.logisim.analyze.model.OutputExpressionsEvent; import com.cburch.logisim.analyze.model.OutputExpressionsListener; import com.cburch.logisim.analyze.model.VariableList; class MinimizedTab extends AnalyzerTab { private static class FormatModel extends AbstractListModel implements ComboBoxModel { static int getFormatIndex(int choice) { switch (choice) { case AnalyzerModel.FORMAT_PRODUCT_OF_SUMS: return 1; default: return 0; } } private String[] choices; private int selected; private FormatModel() { selected = 0; choices = new String[2]; localeChanged(); } void localeChanged() { choices[0] = Strings.get("minimizedSumOfProducts"); choices[1] = Strings.get("minimizedProductOfSums"); fireContentsChanged(this, 0, choices.length); } int getSelectedFormat() { switch (selected) { case 1: return AnalyzerModel.FORMAT_PRODUCT_OF_SUMS; default: return AnalyzerModel.FORMAT_SUM_OF_PRODUCTS; } } public int getSize() { return choices.length; } public Object getElementAt(int index) { return choices[index]; } public Object getSelectedItem() { return choices[selected]; } public void setSelectedItem(Object value) { for (int i = 0; i < choices.length; i++) { if (choices[i].equals(value)) { selected = i; } } } } private class MyListener implements OutputExpressionsListener, ActionListener, ItemListener { public void expressionChanged(OutputExpressionsEvent event) { String output = getCurrentVariable(); if (event.getType() == OutputExpressionsEvent.OUTPUT_MINIMAL && event.getVariable().equals(output)) { minimizedExpr.setExpression(outputExprs.getMinimalExpression(output)); MinimizedTab.this.validate(); } setAsExpr.setEnabled(output != null && !outputExprs.isExpressionMinimal(output)); int format = outputExprs.getMinimizedFormat(output); formatChoice.setSelectedIndex(FormatModel.getFormatIndex(format)); } public void actionPerformed(ActionEvent event) { String output = getCurrentVariable(); int format = outputExprs.getMinimizedFormat(output); formatChoice.setSelectedIndex(FormatModel.getFormatIndex(format)); outputExprs.setExpression(output, outputExprs.getMinimalExpression(output)); } public void itemStateChanged(ItemEvent event) { if (event.getSource() == formatChoice) { String output = getCurrentVariable(); FormatModel model = (FormatModel) formatChoice.getModel(); outputExprs.setMinimizedFormat(output, model.getSelectedFormat()); } else { updateTab(); } } } private OutputSelector selector; private KarnaughMapPanel karnaughMap; private JLabel formatLabel = new JLabel(); private JComboBox formatChoice = new JComboBox(new FormatModel()); private ExpressionView minimizedExpr = new ExpressionView(); private JButton setAsExpr = new JButton(); private MyListener myListener = new MyListener(); private AnalyzerModel model; private OutputExpressions outputExprs; public MinimizedTab(AnalyzerModel model) { this.model = model; this.outputExprs = model.getOutputExpressions(); outputExprs.addOutputExpressionsListener(myListener); selector = new OutputSelector(model); selector.addItemListener(myListener); karnaughMap = new KarnaughMapPanel(model); karnaughMap.addMouseListener(new TruthTableMouseListener()); setAsExpr.addActionListener(myListener); formatChoice.addItemListener(myListener); JPanel buttons = new JPanel(new GridLayout(1, 1)); buttons.add(setAsExpr); JPanel formatPanel = new JPanel(); formatPanel.add(formatLabel); formatPanel.add(formatChoice); GridBagLayout gb = new GridBagLayout(); GridBagConstraints gc = new GridBagConstraints(); setLayout(gb); gc.gridx = 0; gc.gridy = 0; addRow(gb, gc, selector.getLabel(), selector.getComboBox()); addRow(gb, gc, formatLabel, formatChoice); gc.weightx = 0.0; gc.gridx = 0; gc.gridwidth = 2; gc.gridy = GridBagConstraints.RELATIVE; gc.fill = GridBagConstraints.BOTH; gc.anchor = GridBagConstraints.CENTER; gb.setConstraints(karnaughMap, gc); add(karnaughMap); Insets oldInsets = gc.insets; gc.insets = new Insets(20, 0, 0, 0); gb.setConstraints(minimizedExpr, gc); add(minimizedExpr); gc.insets = oldInsets; gc.fill = GridBagConstraints.NONE; gb.setConstraints(buttons, gc); add(buttons); String selected = selector.getSelectedOutput(); setAsExpr.setEnabled(selected != null && !outputExprs.isExpressionMinimal(selected)); } private void addRow(GridBagLayout gb, GridBagConstraints gc, JLabel label, JComboBox choice) { Insets oldInsets = gc.insets; gc.weightx = 0.0; gc.gridx = 0; gc.fill = GridBagConstraints.HORIZONTAL; gc.anchor = GridBagConstraints.LINE_START; gc.insets = new Insets(5, 5, 5, 5); gb.setConstraints(label, gc); add(label); gc.gridx = 1; gc.fill = GridBagConstraints.VERTICAL; gb.setConstraints(choice, gc); add(choice); gc.gridy++; gc.insets = oldInsets; } @Override void localeChanged() { selector.localeChanged(); karnaughMap.localeChanged(); minimizedExpr.localeChanged(); setAsExpr.setText(Strings.get("minimizedSetButton")); formatLabel.setText(Strings.get("minimizedFormat")); ((FormatModel) formatChoice.getModel()).localeChanged(); } @Override void updateTab() { String output = getCurrentVariable(); karnaughMap.setOutput(output); int format = outputExprs.getMinimizedFormat(output); formatChoice.setSelectedIndex(FormatModel.getFormatIndex(format)); minimizedExpr.setExpression(outputExprs.getMinimalExpression(output)); setAsExpr.setEnabled(output != null && !outputExprs.isExpressionMinimal(output)); } private String getCurrentVariable() { return selector.getSelectedOutput(); } } logisim-2.7.1/src/com/cburch/logisim/analyze/gui/KarnaughMapPanel.java0000644000175000017500000003417011524651144025620 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.analyze.gui; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.MouseEvent; import java.util.List; import javax.swing.JPanel; import com.cburch.logisim.analyze.model.AnalyzerModel; import com.cburch.logisim.analyze.model.OutputExpressionsEvent; import com.cburch.logisim.analyze.model.OutputExpressionsListener; import com.cburch.logisim.analyze.model.Entry; import com.cburch.logisim.analyze.model.Implicant; import com.cburch.logisim.analyze.model.TruthTable; import com.cburch.logisim.analyze.model.TruthTableEvent; import com.cburch.logisim.analyze.model.TruthTableListener; import com.cburch.logisim.analyze.model.VariableList; import com.cburch.logisim.util.GraphicsUtil; class KarnaughMapPanel extends JPanel implements TruthTablePanel { private static final Font HEAD_FONT = new Font("Serif", Font.BOLD, 14); private static final Font BODY_FONT = new Font("Serif", Font.PLAIN, 14); private static final Color[] IMP_COLORS = new Color[] { new Color(255, 0, 0, 128), new Color(0, 150, 0, 128), new Color(0, 0, 255, 128), new Color(255, 0, 255, 128), }; private static final int MAX_VARS = 4; private static final int[] ROW_VARS = { 0, 0, 1, 1, 2 }; private static final int[] COL_VARS = { 0, 1, 1, 2, 2 }; private static final int CELL_HORZ_SEP = 10; private static final int CELL_VERT_SEP = 10; private static final int IMP_INSET = 4; private static final int IMP_RADIUS = 5; private class MyListener implements OutputExpressionsListener, TruthTableListener { public void expressionChanged(OutputExpressionsEvent event) { if (event.getType() == OutputExpressionsEvent.OUTPUT_MINIMAL && event.getVariable().equals(output)) { repaint(); } } public void cellsChanged(TruthTableEvent event) { repaint(); } public void structureChanged(TruthTableEvent event) { computePreferredSize(); } } private MyListener myListener = new MyListener(); private AnalyzerModel model; private String output; private int headHeight; private int cellWidth = 1; private int cellHeight = 1; private int tableWidth; private int tableHeight; private int provisionalX; private int provisionalY; private Entry provisionalValue = null; public KarnaughMapPanel(AnalyzerModel model) { this.model = model; model.getOutputExpressions().addOutputExpressionsListener(myListener); model.getTruthTable().addTruthTableListener(myListener); setToolTipText(" "); } public void setOutput(String value) { boolean recompute = (output == null || value == null) && output != value; output = value; if (recompute) computePreferredSize(); else repaint(); } public TruthTable getTruthTable() { return model.getTruthTable(); } public int getRow(MouseEvent event) { TruthTable table = model.getTruthTable(); int inputs = table.getInputColumnCount(); if (inputs >= ROW_VARS.length) return -1; int left = computeMargin(getWidth(), tableWidth); int top = computeMargin(getHeight(), tableHeight); int x = event.getX() - left - headHeight - cellWidth; int y = event.getY() - top - headHeight - cellHeight; if (x < 0 || y < 0) return -1; int row = y / cellHeight; int col = x / cellWidth; int rows = 1 << ROW_VARS[inputs]; int cols = 1 << COL_VARS[inputs]; if (row >= rows || col >= cols) return -1; return getTableRow(row, col, rows, cols); } public int getOutputColumn(MouseEvent event) { return model.getOutputs().indexOf(output); } public void setEntryProvisional(int y, int x, Entry value) { provisionalY = y; provisionalX = x; provisionalValue = value; repaint(); } @Override public String getToolTipText(MouseEvent event) { TruthTable table = model.getTruthTable(); int row = getRow(event); int col = getOutputColumn(event); Entry entry = table.getOutputEntry(row, col); return entry.getErrorMessage(); } void localeChanged() { computePreferredSize(); repaint(); } private void computePreferredSize() { Graphics g = getGraphics(); TruthTable table = model.getTruthTable(); String message = null; if (output == null) { message = Strings.get("karnaughNoOutputError"); } else if (table.getInputColumnCount() > MAX_VARS) { message = Strings.get("karnaughTooManyInputsError"); } if (message != null) { if (g == null) { tableHeight = 15; tableWidth = 100; } else { FontMetrics fm = g.getFontMetrics(BODY_FONT); tableHeight = fm.getHeight(); tableWidth = fm.stringWidth(message); } setPreferredSize(new Dimension(tableWidth, tableHeight)); repaint(); return; } if (g == null) { headHeight = 16; cellHeight = 16; cellWidth = 24; } else { FontMetrics headFm = g.getFontMetrics(HEAD_FONT); headHeight = headFm.getHeight(); FontMetrics fm = g.getFontMetrics(BODY_FONT); cellHeight = fm.getAscent() + CELL_VERT_SEP; cellWidth = fm.stringWidth("00") + CELL_HORZ_SEP; } int rows = 1 << ROW_VARS[table.getInputColumnCount()]; int cols = 1 << COL_VARS[table.getInputColumnCount()]; tableWidth = headHeight + cellWidth * (cols + 1); tableHeight = headHeight + cellHeight * (rows + 1); setPreferredSize(new Dimension(tableWidth, tableHeight)); invalidate(); repaint(); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); TruthTable table = model.getTruthTable(); int inputCount = table.getInputColumnCount(); Dimension sz = getSize(); String message = null; if (output == null) { message = Strings.get("karnaughNoOutputError"); } else if (inputCount > MAX_VARS) { message = Strings.get("karnaughTooManyInputsError"); } if (message != null) { g.setFont(BODY_FONT); GraphicsUtil.drawCenteredText(g, message, sz.width / 2, sz.height / 2); return; } int left = computeMargin(sz.width, tableWidth); int top = computeMargin(sz.height, tableHeight); int x = left; int y = top; int rowVars = ROW_VARS[inputCount]; int colVars = COL_VARS[inputCount]; int rows = 1 << rowVars; int cols = 1 << colVars; g.setFont(HEAD_FONT); FontMetrics headFm = g.getFontMetrics(); String rowHeader = header(0, rowVars); String colHeader = header(rowVars, rowVars + colVars); int xoffs = (tableWidth + headHeight + cellWidth - headFm.stringWidth(colHeader)) / 2; g.drawString(colHeader, x + xoffs, y + headFm.getAscent()); int headerWidth = headFm.stringWidth(rowHeader); if (headerWidth <= headHeight) { int headX = x + (headHeight - headerWidth) / 2; int headY = y + (tableHeight + headHeight + cellHeight + headFm.getAscent()) / 2; g.drawString(rowHeader, headX, headY); } else if (g instanceof Graphics2D){ Graphics2D g2 = (Graphics2D) g.create(); int yoffs = (tableHeight + headHeight + cellHeight + headerWidth) / 2; int headX = x + headFm.getAscent(); int headY = y + yoffs; g2.rotate(-Math.PI / 2.0); g2.drawString(rowHeader, -headY, headX); g2.dispose(); } x += headHeight; y += headHeight; g.setFont(BODY_FONT); FontMetrics fm = g.getFontMetrics(); int dy = (cellHeight + fm.getAscent()) / 2; for (int i = 0; i < cols; i++) { String label = label(i, cols); g.drawString(label, x + (i + 1) * cellWidth + (cellWidth - fm.stringWidth(label)) / 2, y + dy); } for (int i = 0; i < rows; i++) { String label = label(i, rows); g.drawString(label, x + (cellWidth - fm.stringWidth(label)) / 2, y + (i + 1) * cellHeight + dy); } int outputColumn = table.getOutputIndex(output); x += cellWidth; y += cellHeight; g.setColor(ERROR_COLOR); for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { int row = getTableRow(i, j, rows, cols); Entry entry = table.getOutputEntry(row, outputColumn); if (provisionalValue != null && row == provisionalY && outputColumn == provisionalX) entry = provisionalValue; if (entry.isError()) { g.fillRect(x + j * cellWidth, y + i * cellHeight, cellWidth, cellHeight); } } } List implicants = model.getOutputExpressions().getMinimalImplicants(output); if (implicants != null) { int index = 0; for (Implicant imp : implicants) { g.setColor(IMP_COLORS[index % IMP_COLORS.length]); paintImplicant(g, imp, x, y, rows, cols); index++; } } g.setColor(Color.GRAY); if (cols > 1 || inputCount == 0) g.drawLine(x, y, left + tableWidth, y); if (rows > 1 || inputCount == 0) g.drawLine(x, y, x, top + tableHeight); if (outputColumn < 0) return; g.setColor(Color.BLACK); for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { int row = getTableRow(i, j, rows, cols); if (provisionalValue != null && row == provisionalY && outputColumn == provisionalX) { String text = provisionalValue.getDescription(); g.setColor(Color.GREEN); g.drawString(text, x + j * cellWidth + (cellWidth - fm.stringWidth(text)) / 2, y + i * cellHeight + dy); g.setColor(Color.BLACK); } else { Entry entry = table.getOutputEntry(row, outputColumn); String text = entry.getDescription(); g.drawString(text, x + j * cellWidth + (cellWidth - fm.stringWidth(text)) / 2, y + i * cellHeight + dy); } } } } private void paintImplicant(Graphics g, Implicant imp, int x, int y, int rows, int cols) { int rowMax = -1; int rowMin = rows; int colMax = -1; int colMin = cols; boolean oneRowFound = false; int count = 0; for (Implicant sq : imp.getTerms()) { int tableRow = sq.getRow(); int row = getRow(tableRow, rows, cols); int col = getCol(tableRow, rows, cols); if (row == 1) oneRowFound = true; if (row > rowMax) rowMax = row; if (row < rowMin) rowMin = row; if (col > colMax) colMax = col; if (col < colMin) colMin = col; ++count; } int numCols = colMax - colMin + 1; int numRows = rowMax - rowMin + 1; int covered = numCols * numRows; int d = 2 * IMP_RADIUS; if (covered == count) { g.fillRoundRect(x + colMin * cellWidth + IMP_INSET, y + rowMin * cellHeight + IMP_INSET, numCols * cellWidth - 2 * IMP_INSET, numRows * cellHeight - 2 * IMP_INSET, d, d); } else if (covered == 16) { if (count == 4) { int w = cellWidth - IMP_INSET; int h = cellHeight - IMP_INSET; int x1 = x + 3 * cellWidth + IMP_INSET; int y1 = y + 3 * cellHeight + IMP_INSET; g.fillRoundRect(x, y, w, h, d, d); g.fillRoundRect(x1, y, w, h, d, d); g.fillRoundRect(x, y1, w, h, d, d); g.fillRoundRect(x1, y1, w, h, d, d); } else if (oneRowFound) { // first and last columns int w = cellWidth - IMP_INSET; int h = 4 * cellHeight - 2 * IMP_INSET; int x1 = x + 3 * cellWidth + IMP_INSET; g.fillRoundRect(x, y + IMP_INSET, w, h, d, d); g.fillRoundRect(x1, y + IMP_INSET, w, h, d, d); } else { // first and last rows int w = 4 * cellWidth - 2 * IMP_INSET; int h = cellHeight - IMP_INSET; int y1 = y + 3 * cellHeight + IMP_INSET; g.fillRoundRect(x + IMP_INSET, y, w, h, d, d); g.fillRoundRect(x + IMP_INSET, y1, w, h, d, d); } } else if (numCols == 4) { int top = y + rowMin * cellHeight + IMP_INSET; int w = cellWidth - IMP_INSET; int h = numRows * cellHeight - 2 * IMP_INSET; // handle half going off left edge g.fillRoundRect(x, top, w, h, d, d); // handle half going off right edge g.fillRoundRect(x + 3 * cellWidth + IMP_INSET, top, w, h, d, d); /* This is the proper way, with no rounded rectangles along * the table's edge; but I found that the different regions were * liable to overlap, particularly the arcs with the rectangles. * (Plus, I was too lazy to figure this out for the 16 case.) int y0 = y + rowMin * cellHeight + IMP_INSET; int y1 = y + rowMax * cellHeight + cellHeight - IMP_INSET; int dy = y1 - y0; int x0 = x + cellWidth - IMP_INSET; int x1 = x + 3 * cellWidth + IMP_INSET; // half going off left edge g.fillRect(x, y0, cellWidth - IMP_INSET - IMP_RADIUS, dy); g.fillRect(x0 - IMP_RADIUS, y0 + IMP_RADIUS, IMP_RADIUS, dy - d); g.fillArc(x0 - d, y0, d, d, 0, 90); g.fillArc(x0 - d, y1 - d, d, d, 0, -90); // half going off right edge g.fillRect(x1 + IMP_RADIUS, y0, cellWidth - IMP_INSET - IMP_RADIUS, dy); g.fillRect(x1, y0 + IMP_RADIUS, IMP_RADIUS, dy - d); g.fillArc(x1, y0, d, d, 180, 90); g.fillArc(x1, y1 - d, d, d, 180, -90); */ } else { // numRows == 4 int left = x + colMin * cellWidth + IMP_INSET; int w = numCols * cellWidth - 2 * IMP_INSET; int h = cellHeight - IMP_INSET; // handle half going off top edge g.fillRoundRect(left, y, w, h, d, d); // handle half going off right edge g.fillRoundRect(left, y + 3 * cellHeight + IMP_INSET, w, h, d, d); } } private String header(int start, int stop) { if (start >= stop) return ""; VariableList inputs = model.getInputs(); StringBuilder ret = new StringBuilder(inputs.get(start)); for (int i = start + 1; i < stop; i++) { ret.append(", "); ret.append(inputs.get(i)); } return ret.toString(); } private String label(int row, int rows) { switch (rows) { case 2: return "" + row; case 4: switch (row) { case 0: return "00"; case 1: return "01"; case 2: return "11"; case 3: return "10"; } default: return ""; } } private int getTableRow(int row, int col, int rows, int cols) { return toRow(row, rows) * cols + toRow(col, cols); } private int toRow(int row, int rows) { if (rows == 4) { switch (row) { case 2: return 3; case 3: return 2; default: return row; } } else { return row; } } private int getRow(int tableRow, int rows, int cols) { int ret = tableRow / cols; switch (ret) { case 2: return 3; case 3: return 2; default: return ret; } } private int getCol(int tableRow, int rows, int cols) { int ret = tableRow % cols; switch (ret) { case 2: return 3; case 3: return 2; default: return ret; } } private int computeMargin(int compDim, int tableDim) { int ret = (compDim - tableDim) / 2; return ret >= 0 ? ret : Math.max(-headHeight, compDim - tableDim); } } logisim-2.7.1/src/com/cburch/logisim/analyze/gui/ExpressionView.java0000644000175000017500000002454411447117134025440 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.analyze.gui; import java.awt.Dimension; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import java.util.ArrayList; import javax.swing.JPanel; import com.cburch.logisim.analyze.model.Expression; import com.cburch.logisim.analyze.model.ExpressionVisitor; class ExpressionView extends JPanel { private static final int BADNESS_IDENT_BREAK = 10000; private static final int BADNESS_BEFORE_SPACE = 500; private static final int BADNESS_BEFORE_AND = 50; private static final int BADNESS_BEFORE_XOR = 30; private static final int BADNESS_BEFORE_OR = 0; private static final int BADNESS_NOT_BREAK = 100; private static final int BADNESS_PER_NOT_BREAK = 30; private static final int BADNESS_PER_PIXEL = 1; private static final int NOT_SEP = 3; private static final int EXTRA_LEADING = 4; private static final int MINIMUM_HEIGHT = 25; private class MyListener implements ComponentListener { public void componentResized(ComponentEvent arg0) { int width = getWidth(); if (renderData != null && Math.abs(renderData.width - width) > 2) { Graphics g = getGraphics(); FontMetrics fm = g == null ? null : g.getFontMetrics(); renderData = new RenderData(renderData.exprData, width, fm); setPreferredSize(renderData.getPreferredSize()); revalidate(); repaint(); } } public void componentMoved(ComponentEvent arg0) { } public void componentShown(ComponentEvent arg0) { } public void componentHidden(ComponentEvent arg0) { } } private MyListener myListener = new MyListener(); private RenderData renderData; public ExpressionView() { addComponentListener(myListener); setExpression(null); } public void setExpression(Expression expr) { ExpressionData exprData = new ExpressionData(expr); Graphics g = getGraphics(); FontMetrics fm = g == null ? null : g.getFontMetrics(); renderData = new RenderData(exprData, getWidth(), fm); setPreferredSize(renderData.getPreferredSize()); revalidate(); repaint(); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); if (renderData != null) { int x = Math.max(0, (getWidth() - renderData.prefWidth) / 2); int y = Math.max(0, (getHeight() - renderData.height) / 2); renderData.paint(g, x, y); } } void localeChanged() { repaint(); } private static class NotData { int startIndex; int stopIndex; int depth; } private static class ExpressionData { String text; final ArrayList nots = new ArrayList(); int[] badness; ExpressionData(Expression expr) { if (expr == null) { text = ""; badness = new int[0]; } else { computeText(expr); computeBadnesses(); } } private void computeText(Expression expr) { final StringBuilder text = new StringBuilder(); expr.visit(new ExpressionVisitor() { public Object visitAnd(Expression a, Expression b) { return binary(a, b, Expression.AND_LEVEL, " "); } public Object visitOr(Expression a, Expression b) { return binary(a, b, Expression.OR_LEVEL, " + "); } public Object visitXor(Expression a, Expression b) { return binary(a, b, Expression.XOR_LEVEL, " ^ "); } private Object binary(Expression a, Expression b, int level, String op) { if (a.getPrecedence() < level) { text.append("("); a.visit(this); text.append(")"); } else { a.visit(this); } text.append(op); if (b.getPrecedence() < level) { text.append("("); b.visit(this); text.append(")"); } else { b.visit(this); } return null; } public Object visitNot(Expression a) { NotData notData = new NotData(); notData.startIndex = text.length(); nots.add(notData); a.visit(this); notData.stopIndex = text.length(); return null; } public Object visitVariable(String name) { text.append(name); return null; } public Object visitConstant(int value) { text.append("" + Integer.toString(value, 16)); return null; } }); this.text = text.toString(); } private void computeBadnesses() { badness = new int[text.length() + 1]; badness[text.length()] = 0; if (text.length() == 0) return; badness[0] = Integer.MAX_VALUE; NotData curNot = nots.isEmpty() ? null : (NotData) nots.get(0); int curNotIndex = 0; char prev = text.charAt(0); for (int i = 1; i < text.length(); i++) { // invariant: curNot.stopIndex >= i (and is first such), // or curNot == null if none such exists char cur = text.charAt(i); if (cur == ' ') { badness[i] = BADNESS_BEFORE_SPACE;; } else if (Character.isJavaIdentifierPart(cur)) { if (Character.isJavaIdentifierPart(prev)) { badness[i] = BADNESS_IDENT_BREAK; } else { badness[i] = BADNESS_BEFORE_AND; } } else if (cur == '+') { badness[i] = BADNESS_BEFORE_OR; } else if (cur == '^') { badness[i] = BADNESS_BEFORE_XOR; } else if (cur == ')') { badness[i] = BADNESS_BEFORE_SPACE; } else { // cur == '(' badness[i] = BADNESS_BEFORE_AND; } while (curNot != null && curNot.stopIndex <= i) { ++curNotIndex; curNot = (curNotIndex >= nots.size() ? null : (NotData) nots.get(curNotIndex)); } if (curNot != null && badness[i] < BADNESS_IDENT_BREAK) { int depth = 0; NotData nd = curNot; int ndi = curNotIndex; while (nd != null && nd.startIndex < i) { if (nd.stopIndex > i) ++depth; ++ndi; nd = ndi < nots.size() ? (NotData) nots.get(ndi) : null; } if (depth > 0) { badness[i] += BADNESS_NOT_BREAK + (depth - 1) * BADNESS_PER_NOT_BREAK; } } prev = cur; } } } private static class RenderData { ExpressionData exprData; int prefWidth; int width; int height; String[] lineText; ArrayList> lineNots; int[] lineY; RenderData(ExpressionData exprData, int width, FontMetrics fm) { this.exprData = exprData; this.width = width; height = MINIMUM_HEIGHT; if (fm == null) { lineText = new String[] { exprData.text }; lineNots = new ArrayList>(); lineNots.add(exprData.nots); computeNotDepths(); lineY = new int[] { MINIMUM_HEIGHT }; } else { if (exprData.text.length() == 0) { lineText = new String[] { Strings.get("expressionEmpty") }; lineNots = new ArrayList>(); lineNots.add(new ArrayList()); } else { computeLineText(fm); computeLineNots(); computeNotDepths(); } computeLineY(fm); prefWidth = lineText.length > 1 ? width : fm.stringWidth(lineText[0]); } } private void computeLineText(FontMetrics fm) { String text = exprData.text; int[] badness = exprData.badness; if (fm.stringWidth(text) <= width) { lineText = new String[] { text }; return; } int startPos = 0; ArrayList lines = new ArrayList(); while (startPos < text.length()) { int stopPos = startPos + 1; String bestLine = text.substring(startPos, stopPos); if (stopPos >= text.length()) { lines.add(bestLine); break; } int bestStopPos = stopPos; int lineWidth = fm.stringWidth(bestLine); int bestBadness = badness[stopPos] + (width - lineWidth) * BADNESS_PER_PIXEL; while (stopPos < text.length()) { ++stopPos; String line = text.substring(startPos, stopPos); lineWidth = fm.stringWidth(line); if (lineWidth > width) break; int lineBadness = badness[stopPos] + (width - lineWidth) * BADNESS_PER_PIXEL; if (lineBadness < bestBadness) { bestBadness = lineBadness; bestStopPos = stopPos; bestLine = line; } } lines.add(bestLine); startPos = bestStopPos; } lineText = lines.toArray(new String[lines.size()]); } private void computeLineNots() { ArrayList allNots = exprData.nots; lineNots = new ArrayList>(); for (int i = 0; i < lineText.length; i++) { lineNots.add(new ArrayList()); } for (NotData nd : allNots) { int pos = 0; for (int j = 0; j < lineNots.size() && pos < nd.stopIndex; j++) { String line = lineText[j]; int nextPos = pos + line.length(); if (nextPos > nd.startIndex) { NotData toAdd = new NotData(); toAdd.startIndex = Math.max(pos, nd.startIndex) - pos; toAdd.stopIndex = Math.min(nextPos, nd.stopIndex) - pos; lineNots.get(j).add(toAdd); } pos = nextPos; } } } private void computeNotDepths() { for (ArrayList nots : lineNots) { int n = nots.size(); int[] stack = new int[n]; for (int i = 0; i < nots.size(); i++) { NotData nd = nots.get(i); int depth = 0; int top = 0; stack[0] = nd.stopIndex; for (int j = i + 1; j < nots.size(); j++) { NotData nd2 = nots.get(j); if (nd2.startIndex >= nd.stopIndex) break; while (nd2.startIndex >= stack[top]) top--; ++top; stack[top] = nd2.stopIndex; if (top > depth) depth = top; } nd.depth = depth; } } } private void computeLineY(FontMetrics fm) { lineY = new int[lineNots.size()]; int curY = 0; for (int i = 0; i < lineY.length; i++) { int maxDepth = -1; ArrayList nots = lineNots.get(i); for (NotData nd : nots) { if (nd.depth > maxDepth) maxDepth = nd.depth; } lineY[i] = curY + maxDepth * NOT_SEP; curY = lineY[i] + fm.getHeight() + EXTRA_LEADING; } height = Math.max(MINIMUM_HEIGHT, curY - fm.getLeading() - EXTRA_LEADING); } public Dimension getPreferredSize() { return new Dimension(10, height); } public void paint(Graphics g, int x, int y) { FontMetrics fm = g.getFontMetrics(); int i = -1; for (String line : lineText) { i++; g.drawString(line, x, y + lineY[i] + fm.getAscent()); ArrayList nots = lineNots.get(i); int j = -1; for (NotData nd : nots) { j++; int notY = y + lineY[i] - nd.depth * NOT_SEP; int startX = x + fm.stringWidth(line.substring(0, nd.startIndex)); int stopX = x + fm.stringWidth(line.substring(0, nd.stopIndex)); g.drawLine(startX, notY, stopX, notY); } } } } } logisim-2.7.1/src/com/cburch/logisim/analyze/gui/ExpressionTab.java0000644000175000017500000001545211532247702025232 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.analyze.gui; import java.awt.Font; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.KeyEvent; import javax.swing.AbstractAction; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.KeyStroke; import javax.swing.ScrollPaneConstants; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import com.cburch.logisim.analyze.model.AnalyzerModel; import com.cburch.logisim.analyze.model.OutputExpressionsEvent; import com.cburch.logisim.analyze.model.OutputExpressionsListener; import com.cburch.logisim.analyze.model.Expression; import com.cburch.logisim.analyze.model.Parser; import com.cburch.logisim.analyze.model.ParserException; import com.cburch.logisim.util.StringGetter; class ExpressionTab extends AnalyzerTab implements TabInterface { private class MyListener extends AbstractAction implements DocumentListener, OutputExpressionsListener, ItemListener { boolean edited = false; public void actionPerformed(ActionEvent event) { Object src = event.getSource(); if (src == clear) { setError(null); field.setText(""); field.grabFocus(); } else if (src == revert) { setError(null); field.setText(getCurrentString()); field.grabFocus(); } else if ((src == field || src == enter) && enter.isEnabled()) { try { String exprString = field.getText(); Expression expr = Parser.parse(field.getText(), model); setError(null); model.getOutputExpressions().setExpression(getCurrentVariable(), expr, exprString); insertUpdate(null); } catch (ParserException ex) { setError(ex.getMessageGetter()); field.setCaretPosition(ex.getOffset()); field.moveCaretPosition(ex.getEndOffset()); } field.grabFocus(); } } public void insertUpdate(DocumentEvent event) { String curText = field.getText(); edited = curText.length() != curExprStringLength || !curText.equals(getCurrentString()); boolean enable = (edited && getCurrentVariable() != null); clear.setEnabled(curText.length() > 0); revert.setEnabled(enable); enter.setEnabled(enable); } public void removeUpdate(DocumentEvent event) { insertUpdate(event); } public void changedUpdate(DocumentEvent event) { insertUpdate(event); } public void expressionChanged(OutputExpressionsEvent event) { if (event.getType() == OutputExpressionsEvent.OUTPUT_EXPRESSION) { String output = event.getVariable(); if (output.equals(getCurrentVariable())) { prettyView.setExpression(model.getOutputExpressions().getExpression(output)); currentStringChanged(); } } } public void itemStateChanged(ItemEvent event) { updateTab(); } private String getCurrentString() { String output = getCurrentVariable(); return output == null ? "" : model.getOutputExpressions().getExpressionString(output); } private void currentStringChanged() { String output = getCurrentVariable(); String exprString = model.getOutputExpressions().getExpressionString(output); curExprStringLength = exprString.length(); if (!edited) { setError(null); field.setText(getCurrentString()); } else { insertUpdate(null); } } } private OutputSelector selector; private ExpressionView prettyView = new ExpressionView(); private JTextArea field = new JTextArea(4, 25); private JButton clear = new JButton(); private JButton revert = new JButton(); private JButton enter = new JButton(); private JLabel error = new JLabel(); private MyListener myListener = new MyListener(); private AnalyzerModel model; private int curExprStringLength = 0; private StringGetter errorMessage; public ExpressionTab(AnalyzerModel model) { this.model = model; selector = new OutputSelector(model); model.getOutputExpressions().addOutputExpressionsListener(myListener); selector.addItemListener(myListener); clear.addActionListener(myListener); revert.addActionListener(myListener); enter.addActionListener(myListener); field.setLineWrap(true); field.setWrapStyleWord(true); field.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), myListener); field.getDocument().addDocumentListener(myListener); field.setFont(new Font("Monospaced", Font.PLAIN, 14)); JPanel buttons = new JPanel(); buttons.add(clear); buttons.add(revert); buttons.add(enter); GridBagLayout gb = new GridBagLayout(); GridBagConstraints gc = new GridBagConstraints(); setLayout(gb); gc.weightx = 1.0; gc.gridx = 0; gc.gridy = GridBagConstraints.RELATIVE; gc.fill = GridBagConstraints.BOTH; JPanel selectorPanel = selector.createPanel(); gb.setConstraints(selectorPanel, gc); add(selectorPanel); gb.setConstraints(prettyView, gc); add(prettyView); Insets oldInsets = gc.insets; gc.insets = new Insets(10, 10, 0, 10); JScrollPane fieldPane = new JScrollPane(field, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); gb.setConstraints(fieldPane, gc); add(fieldPane); gc.insets = oldInsets; gc.fill = GridBagConstraints.NONE; gc.anchor = GridBagConstraints.LINE_END; gb.setConstraints(buttons, gc); add(buttons); gc.fill = GridBagConstraints.BOTH; gb.setConstraints(error, gc); add(error); myListener.insertUpdate(null); setError(null); } @Override void localeChanged() { selector.localeChanged(); prettyView.localeChanged(); clear.setText(Strings.get("exprClearButton")); revert.setText(Strings.get("exprRevertButton")); enter.setText(Strings.get("exprEnterButton")); if (errorMessage != null) { error.setText(errorMessage.get()); } } @Override void updateTab() { String output = getCurrentVariable(); prettyView.setExpression(model.getOutputExpressions().getExpression(output)); myListener.currentStringChanged(); } void registerDefaultButtons(DefaultRegistry registry) { registry.registerDefaultButton(field, enter); } String getCurrentVariable() { return selector.getSelectedOutput(); } private void setError(StringGetter msg) { if (msg == null) { errorMessage = null; error.setText(" "); } else { errorMessage = msg; error.setText(msg.get()); } } public void copy() { field.requestFocus(); field.copy(); } public void paste() { field.requestFocus(); field.paste(); } public void delete() { field.requestFocus(); field.replaceSelection(""); } public void selectAll() { field.requestFocus(); field.selectAll(); } }logisim-2.7.1/src/com/cburch/logisim/analyze/gui/DefaultRegistry.java0000644000175000017500000000207611446034532025556 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.analyze.gui; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JRootPane; class DefaultRegistry { private class MyListener implements FocusListener { JButton defaultButton; MyListener(JButton defaultButton) { this.defaultButton = defaultButton; } public void focusGained(FocusEvent event) { rootPane.setDefaultButton(defaultButton); } public void focusLost(FocusEvent event) { JButton currentDefault = rootPane.getDefaultButton(); if (currentDefault == defaultButton) rootPane.setDefaultButton(null); } } private JRootPane rootPane; public DefaultRegistry(JRootPane rootPane) { this.rootPane = rootPane; rootPane.setDefaultButton(null); } public void registerDefaultButton(JComponent comp, JButton button) { comp.addFocusListener(new MyListener(button)); } } logisim-2.7.1/src/com/cburch/logisim/analyze/gui/BuildCircuitButton.java0000644000175000017500000001451511447117134026221 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.analyze.gui; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.List; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import com.cburch.logisim.analyze.model.AnalyzerModel; import com.cburch.logisim.analyze.model.Expression; import com.cburch.logisim.analyze.model.VariableList; import com.cburch.logisim.circuit.Circuit; import com.cburch.logisim.circuit.CircuitMutation; import com.cburch.logisim.file.LogisimFileActions; import com.cburch.logisim.proj.Project; import com.cburch.logisim.proj.Projects; import com.cburch.logisim.std.gates.CircuitBuilder; import com.cburch.logisim.util.StringUtil; class BuildCircuitButton extends JButton { private static class ProjectItem { Project project; ProjectItem(Project project) { this.project = project; } @Override public String toString() { return project.getLogisimFile().getDisplayName(); } } private class DialogPanel extends JPanel { private JLabel projectLabel = new JLabel(); private JComboBox project; private JLabel nameLabel = new JLabel(); private JTextField name = new JTextField(10); private JCheckBox twoInputs = new JCheckBox(); private JCheckBox nands = new JCheckBox(); DialogPanel() { List projects = Projects.getOpenProjects(); Object[] options = new Object[projects.size()]; Object initialSelection = null; for (int i = 0; i < options.length; i++) { Project proj = projects.get(i); options[i] = new ProjectItem(proj); if (proj == model.getCurrentProject()) { initialSelection = options[i]; } } project = new JComboBox(options); if (options.length == 1) { project.setSelectedItem(options[0]); project.setEnabled(false); } else if (initialSelection != null) { project.setSelectedItem(initialSelection); } Circuit defaultCircuit = model.getCurrentCircuit(); if (defaultCircuit != null) { name.setText(defaultCircuit.getName()); name.selectAll(); } VariableList outputs = model.getOutputs(); boolean enableNands = true; for (int i = 0; i < outputs.size(); i++) { String output = outputs.get(i); Expression expr = model.getOutputExpressions().getExpression(output); if (expr != null && expr.containsXor()) { enableNands = false; break; } } nands.setEnabled(enableNands); GridBagLayout gb = new GridBagLayout(); GridBagConstraints gc = new GridBagConstraints(); setLayout(gb); gc.anchor = GridBagConstraints.LINE_START; gc.fill = GridBagConstraints.NONE; gc.gridx = 0; gc.gridy = 0; gb.setConstraints(projectLabel, gc); add(projectLabel); gc.gridx = 1; gb.setConstraints(project, gc); add(project); gc.gridy++; gc.gridx = 0; gb.setConstraints(nameLabel, gc); add(nameLabel); gc.gridx = 1; gb.setConstraints(name, gc); add(name); gc.gridy++; gb.setConstraints(twoInputs, gc); add(twoInputs); gc.gridy++; gb.setConstraints(nands, gc); add(nands); projectLabel.setText(Strings.get("buildProjectLabel")); nameLabel.setText(Strings.get("buildNameLabel")); twoInputs.setText(Strings.get("buildTwoInputsLabel")); nands.setText(Strings.get("buildNandsLabel")); } } private class MyListener implements ActionListener { public void actionPerformed(ActionEvent event) { Project dest = null; String name = null; boolean twoInputs = false; boolean useNands = false; boolean replace = false; boolean ok = false; while (!ok) { DialogPanel dlog = new DialogPanel(); int action = JOptionPane.showConfirmDialog(parent, dlog, Strings.get("buildDialogTitle"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); if (action != JOptionPane.OK_OPTION) return; ProjectItem projectItem = (ProjectItem) dlog.project.getSelectedItem(); if (projectItem == null) { JOptionPane.showMessageDialog(parent, Strings.get("buildNeedProjectError"), Strings.get("buildDialogErrorTitle"), JOptionPane.ERROR_MESSAGE); continue; } dest = projectItem.project; name = dlog.name.getText().trim(); if (name.equals("")) { JOptionPane.showMessageDialog(parent, Strings.get("buildNeedCircuitError"), Strings.get("buildDialogErrorTitle"), JOptionPane.ERROR_MESSAGE); continue; } if (dest.getLogisimFile().getCircuit(name) != null) { int choice = JOptionPane.showConfirmDialog(parent, StringUtil.format(Strings.get("buildConfirmReplaceMessage"), name), Strings.get("buildConfirmReplaceTitle"), JOptionPane.YES_NO_OPTION); if (choice != JOptionPane.YES_OPTION) { continue; } replace = true; } twoInputs = dlog.twoInputs.isSelected(); useNands = dlog.nands.isSelected(); ok = true; } performAction(dest, name, replace, twoInputs, useNands); } } private MyListener myListener = new MyListener(); private JFrame parent; private AnalyzerModel model; BuildCircuitButton(JFrame parent, AnalyzerModel model) { this.parent = parent; this.model = model; addActionListener(myListener); } void localeChanged() { setText(Strings.get("buildCircuitButton")); } private void performAction(Project dest, String name, boolean replace, final boolean twoInputs, final boolean useNands) { if (replace) { final Circuit circuit = dest.getLogisimFile().getCircuit(name); if (circuit == null) { JOptionPane.showMessageDialog(parent, "Internal error prevents replacing circuit.", "Internal Error", JOptionPane.ERROR_MESSAGE); return; } CircuitMutation xn = CircuitBuilder.build(circuit, model, twoInputs, useNands); dest.doAction(xn.toAction(Strings.getter("replaceCircuitAction"))); } else { // add the circuit Circuit circuit = new Circuit(name); CircuitMutation xn = CircuitBuilder.build(circuit, model, twoInputs, useNands); xn.execute(); dest.doAction(LogisimFileActions.addCircuit(circuit)); dest.setCurrentCircuit(circuit); } } } logisim-2.7.1/src/com/cburch/logisim/analyze/gui/AnalyzerTab.java0000644000175000017500000000050311446034532024646 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.analyze.gui; import javax.swing.JPanel; abstract class AnalyzerTab extends JPanel { abstract void updateTab(); abstract void localeChanged(); } logisim-2.7.1/src/com/cburch/logisim/analyze/gui/AnalyzerManager.java0000644000175000017500000000232411446034532025515 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.analyze.gui; import javax.swing.JFrame; import com.cburch.logisim.util.LocaleListener; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.WindowMenuItemManager; public class AnalyzerManager extends WindowMenuItemManager implements LocaleListener { public static void initialize() { analysisManager = new AnalyzerManager(); } public static Analyzer getAnalyzer() { if (analysisWindow == null) { analysisWindow = new Analyzer(); analysisWindow.pack(); if (analysisManager != null) analysisManager.frameOpened(analysisWindow); } return analysisWindow; } private static Analyzer analysisWindow = null; private static AnalyzerManager analysisManager = null; private AnalyzerManager() { super(Strings.get("analyzerWindowTitle"), true); LocaleManager.addLocaleListener(this); } @Override public JFrame getJFrame(boolean create) { if (create) { return getAnalyzer(); } else { return analysisWindow; } } public void localeChanged() { setText(Strings.get("analyzerWindowTitle")); } } logisim-2.7.1/src/com/cburch/logisim/analyze/gui/Analyzer.java0000644000175000017500000001673511455470202024233 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.logisim.analyze.gui; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.ScrollPaneConstants; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import com.cburch.logisim.analyze.model.AnalyzerModel; import com.cburch.logisim.gui.generic.LFrame; import com.cburch.logisim.gui.menu.LogisimMenuBar; import com.cburch.logisim.util.LocaleListener; import com.cburch.logisim.util.LocaleManager; public class Analyzer extends LFrame { // used by circuit analysis to select the relevant tab automatically. public static final int INPUTS_TAB = 0; public static final int OUTPUTS_TAB = 1; public static final int TABLE_TAB = 2; public static final int EXPRESSION_TAB = 3; public static final int MINIMIZED_TAB = 4; private class MyListener implements LocaleListener { public void localeChanged() { Analyzer.this.setTitle(Strings.get("analyzerWindowTitle")); tabbedPane.setTitleAt(INPUTS_TAB, Strings.get("inputsTab")); tabbedPane.setTitleAt(OUTPUTS_TAB, Strings.get("outputsTab")); tabbedPane.setTitleAt(TABLE_TAB, Strings.get("tableTab")); tabbedPane.setTitleAt(EXPRESSION_TAB, Strings.get("expressionTab")); tabbedPane.setTitleAt(MINIMIZED_TAB, Strings.get("minimizedTab")); tabbedPane.setToolTipTextAt(INPUTS_TAB, Strings.get("inputsTabTip")); tabbedPane.setToolTipTextAt(OUTPUTS_TAB, Strings.get("outputsTabTip")); tabbedPane.setToolTipTextAt(TABLE_TAB, Strings.get("tableTabTip")); tabbedPane.setToolTipTextAt(EXPRESSION_TAB, Strings.get("expressionTabTip")); tabbedPane.setToolTipTextAt(MINIMIZED_TAB, Strings.get("minimizedTabTip")); buildCircuit.setText(Strings.get("buildCircuitButton")); inputsPanel.localeChanged(); outputsPanel.localeChanged(); truthTablePanel.localeChanged(); expressionPanel.localeChanged(); minimizedPanel.localeChanged(); buildCircuit.localeChanged(); } } private class EditListener implements ActionListener, ChangeListener { private void register(LogisimMenuBar menubar) { menubar.addActionListener(LogisimMenuBar.CUT, this); menubar.addActionListener(LogisimMenuBar.COPY, this); menubar.addActionListener(LogisimMenuBar.PASTE, this); menubar.addActionListener(LogisimMenuBar.DELETE, this); menubar.addActionListener(LogisimMenuBar.SELECT_ALL, this); tabbedPane.addChangeListener(this); enableItems(menubar); } public void actionPerformed(ActionEvent e) { Object src = e.getSource(); Component c = tabbedPane.getSelectedComponent(); if (c instanceof JScrollPane) { c = ((JScrollPane) c).getViewport().getView(); } if (!(c instanceof TabInterface)) return; TabInterface tab = (TabInterface) c; if (src == LogisimMenuBar.CUT) { tab.copy(); tab.delete(); } else if (src == LogisimMenuBar.COPY) { tab.copy(); } else if (src == LogisimMenuBar.PASTE) { tab.paste(); } else if (src == LogisimMenuBar.DELETE) { tab.delete(); } else if (src == LogisimMenuBar.SELECT_ALL) { tab.selectAll(); } } private void enableItems(LogisimMenuBar menubar) { Component c = tabbedPane.getSelectedComponent(); if (c instanceof JScrollPane) { c = ((JScrollPane) c).getViewport().getView(); } boolean support = c instanceof TabInterface; menubar.setEnabled(LogisimMenuBar.CUT, support); menubar.setEnabled(LogisimMenuBar.COPY, support); menubar.setEnabled(LogisimMenuBar.PASTE, support); menubar.setEnabled(LogisimMenuBar.DELETE, support); menubar.setEnabled(LogisimMenuBar.SELECT_ALL, support); } public void stateChanged(ChangeEvent e) { enableItems((LogisimMenuBar) getJMenuBar()); Object selected = tabbedPane.getSelectedComponent(); if (selected instanceof JScrollPane) { selected = ((JScrollPane) selected).getViewport().getView(); } if (selected instanceof AnalyzerTab) { ((AnalyzerTab) selected).updateTab(); } } } private MyListener myListener = new MyListener(); private EditListener editListener = new EditListener(); private AnalyzerModel model = new AnalyzerModel(); private JTabbedPane tabbedPane = new JTabbedPane(); private VariableTab inputsPanel; private VariableTab outputsPanel; private TableTab truthTablePanel; private ExpressionTab expressionPanel; private MinimizedTab minimizedPanel; private BuildCircuitButton buildCircuit; Analyzer() { inputsPanel = new VariableTab(model.getInputs()); outputsPanel = new VariableTab(model.getOutputs()); truthTablePanel = new TableTab(model.getTruthTable()); expressionPanel = new ExpressionTab(model); minimizedPanel = new MinimizedTab(model); buildCircuit = new BuildCircuitButton(this, model); truthTablePanel.addMouseListener(new TruthTableMouseListener()); tabbedPane = new JTabbedPane(); addTab(INPUTS_TAB, inputsPanel); addTab(OUTPUTS_TAB, outputsPanel); addTab(TABLE_TAB, truthTablePanel); addTab(EXPRESSION_TAB, expressionPanel); addTab(MINIMIZED_TAB, minimizedPanel); Container contents = getContentPane(); JPanel vertStrut = new JPanel(null); vertStrut.setPreferredSize(new Dimension(0, 300)); JPanel horzStrut = new JPanel(null); horzStrut.setPreferredSize(new Dimension(450, 0)); JPanel buttonPanel = new JPanel(); buttonPanel.add(buildCircuit); contents.add(vertStrut, BorderLayout.WEST); contents.add(horzStrut, BorderLayout.NORTH); contents.add(tabbedPane, BorderLayout.CENTER); contents.add(buttonPanel, BorderLayout.SOUTH); DefaultRegistry registry = new DefaultRegistry(getRootPane()); inputsPanel.registerDefaultButtons(registry); outputsPanel.registerDefaultButtons(registry); expressionPanel.registerDefaultButtons(registry); LocaleManager.addLocaleListener(myListener); myListener.localeChanged(); LogisimMenuBar menubar = new LogisimMenuBar(this, null); setJMenuBar(menubar); editListener.register(menubar); } private void addTab(int index, final JComponent comp) { final JScrollPane pane = new JScrollPane(comp, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); if (comp instanceof TableTab) { pane.setVerticalScrollBar(((TableTab) comp).getVerticalScrollBar()); } pane.addComponentListener(new ComponentListener() { public void componentResized(ComponentEvent event) { int width = pane.getViewport().getWidth(); comp.setSize(new Dimension(width, comp.getHeight())); } public void componentMoved(ComponentEvent arg0) { } public void componentShown(ComponentEvent arg0) { } public void componentHidden(ComponentEvent arg0) { } }); tabbedPane.insertTab("Untitled", null, pane, null, index); } public AnalyzerModel getModel() { return model; } public void setSelectedTab(int index) { Object found = tabbedPane.getComponentAt(index); if (found instanceof AnalyzerTab) { ((AnalyzerTab) found).updateTab(); } tabbedPane.setSelectedIndex(index); } public static void main(String[] args) { Analyzer frame = new Analyzer(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); } } logisim-2.7.1/src/com/cburch/hex/0000755000175000017500000000000011450405564016465 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/hex/Test.java0000644000175000017500000000417511446034572020260 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.hex; import java.util.ArrayList; import java.util.Arrays; import javax.swing.JFrame; import javax.swing.JScrollPane; public class Test { private static class Model implements HexModel { private ArrayList listeners = new ArrayList(); private int[] data = new int[924]; public void addHexModelListener(HexModelListener l) { listeners.add(l); } public void removeHexModelListener(HexModelListener l) { listeners.remove(l); } public long getFirstOffset() { return 11111; } public long getLastOffset() { return data.length + 11110; } public int getValueWidth() { return 9; } public int get(long address) { return data[(int) (address - 11111)]; } public void set(long address, int value) { int[] oldValues = new int[] { data[(int) (address - 11111)] }; data[(int) (address - 11111)] = value & 0x1FF; for (HexModelListener l : listeners) { l.bytesChanged(this, address, 1, oldValues); } } public void set(long start, int[] values) { int[] oldValues = new int[values.length]; System.arraycopy(data, (int) (start - 11111), oldValues, 0, values.length); System.arraycopy(values, 0, data, (int) (start - 11111), values.length); for (HexModelListener l : listeners) { l.bytesChanged(this, start, values.length, oldValues); } } public void fill(long start, long len, int value) { int[] oldValues = new int[(int) len]; System.arraycopy(data, (int) (start - 11111), oldValues, 0, (int) len); Arrays.fill(data, (int) (start - 11111), (int) len, value); for (HexModelListener l : listeners) { l.bytesChanged(this, start, len, oldValues); } } } public static void main(String[] args) { JFrame frame = new JFrame(); HexModel model = new Model(); HexEditor editor = new HexEditor(model); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(new JScrollPane(editor)); frame.pack(); frame.setVisible(true); } } logisim-2.7.1/src/com/cburch/hex/Measures.java0000644000175000017500000001146111450405514021112 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.hex; import java.awt.Dimension; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; class Measures { private HexEditor hex; private int headerChars; private int cellChars; private int headerWidth; private int spacerWidth; private int cellWidth; private int cellHeight; private int cols; private int baseX; private boolean guessed; public Measures(HexEditor hex) { this.hex = hex; this.guessed = true; this.cols = 1; this.cellWidth = -1; this.cellHeight = -1; this.cellChars = 2; this.headerChars = 4; computeCellSize(null); } public int getColumnCount() { return cols; } public int getBaseX() { return baseX; } public int getCellHeight() { return cellHeight; } public int getCellWidth() { return cellWidth; } public int getLabelWidth() { return headerWidth; } public int getLabelChars() { return headerChars; } public int getCellChars() { return cellChars; } public int getValuesX() { return baseX + spacerWidth; } public int getValuesWidth() { return ((cols - 1) / 4) * spacerWidth + cols * cellWidth; } public long getBaseAddress(HexModel model) { if (model == null) { return 0; } else { long addr0 = model.getFirstOffset(); return addr0 - addr0 % cols; } } public int toY(long addr) { long row = (addr - getBaseAddress(hex.getModel())) / cols; long ret = row * cellHeight; return ret < Integer.MAX_VALUE ? (int) ret : Integer.MAX_VALUE; } public int toX(long addr) { int col = (int) (addr % cols); return baseX + (1 + (col / 4)) * spacerWidth + col * cellWidth; } public long toAddress(int x, int y) { HexModel model = hex.getModel(); if (model == null) return Integer.MIN_VALUE; long addr0 = model.getFirstOffset(); long addr1 = model.getLastOffset(); long base = getBaseAddress(model) + ((long) y / cellHeight) * cols; int offs = (x - baseX) / (cellWidth + (spacerWidth + 2) / 4); if (offs < 0) offs = 0; if (offs >= cols) offs = cols - 1; long ret = base + offs; if (ret > addr1) ret = addr1; if (ret < addr0) ret = addr0; return ret; } void ensureComputed(Graphics g) { if (guessed || cellWidth < 0) computeCellSize(g); } void recompute() { computeCellSize(hex.getGraphics()); } void widthChanged() { int oldCols = cols; int width; if (guessed || cellWidth < 0) { cols = 16; width = hex.getPreferredSize().width; } else { width = hex.getWidth(); int ret = (width - headerWidth) / (cellWidth + (spacerWidth + 3) / 4); if (ret >= 16) cols = 16; else if (ret >= 8) cols = 8; else cols = 4; } int lineWidth = headerWidth + cols * cellWidth + ((cols / 4) - 1) * spacerWidth; int newBase = headerWidth + Math.max(0, (width - lineWidth) / 2); if (baseX != newBase) { baseX = newBase; hex.repaint(); } if (cols != oldCols) recompute(); } private void computeCellSize(Graphics g) { HexModel model = hex.getModel(); // compute number of characters in headers and cells if (model == null) { headerChars = 4; cellChars = 2; } else { int logSize = 0; long addrEnd = model.getLastOffset(); while (addrEnd > (1L << logSize)) { logSize++; } headerChars = (logSize + 3) / 4; cellChars = (model.getValueWidth() + 3) / 4; } // compute character sizes FontMetrics fm = g == null ? null : g.getFontMetrics(hex.getFont()); int charWidth; int spaceWidth; int lineHeight; if (fm == null) { charWidth = 8; spaceWidth = 6; Font font = hex.getFont(); if (font == null) { lineHeight = 16; } else { lineHeight = font.getSize(); } } else { guessed = false; charWidth = 0; for(int i = 0; i < 16; i++) { int width = fm.stringWidth(Integer.toHexString(i)); if (width > charWidth) charWidth = width; } spaceWidth = fm.stringWidth(" "); lineHeight = fm.getHeight(); } // update header and cell dimensions headerWidth = headerChars * charWidth + spaceWidth; spacerWidth = spaceWidth; cellWidth = cellChars * charWidth + spaceWidth; cellHeight = lineHeight; // compute preferred size int width = headerWidth + cols * cellWidth + (cols / 4) * spacerWidth; long height; if (model == null) { height = 16 * cellHeight; } else { long addr0 = getBaseAddress(model); long addr1 = model.getLastOffset(); long rows = (int) (((addr1 - addr0 + 1) + cols - 1) / cols); height = rows * cellHeight; if (height > Integer.MAX_VALUE) height = Integer.MAX_VALUE; } // update preferred size Dimension pref = hex.getPreferredSize(); if (pref.width != width || pref.height != height) { pref.width = width; pref.height = (int) height; hex.setPreferredSize(pref); hex.revalidate(); } widthChanged(); } } logisim-2.7.1/src/com/cburch/hex/Highlighter.java0000644000175000017500000000537211450405564021575 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.hex; import java.awt.Color; import java.awt.Graphics; import java.util.ArrayList; class Highlighter { private static class Entry { private long start; private long end; private Color color; Entry(long start, long end, Color color) { this.start = start; this.end = end; this.color = color; } } private HexEditor hex; private ArrayList entries; Highlighter(HexEditor hex) { this.hex = hex; this.entries = new ArrayList(); } public synchronized Object add(long start, long end, Color color) { HexModel model = hex.getModel(); if (model == null) return null; if (start > end) { long t = start; start = end; end = t; } if (start < model.getFirstOffset()) start = model.getFirstOffset(); if (end > model.getLastOffset()) end = model.getLastOffset(); if (start >= end) return null; Entry entry = new Entry(start, end, color); entries.add(entry); expose(entry); return entry; } public synchronized void remove(Object tag) { if (entries.remove(tag)) { Entry entry = (Entry) tag; expose(entry); } } public synchronized void clear() { ArrayList oldEntries = entries; entries = new ArrayList(); for(int n = oldEntries.size(); n >= 0; n--) { expose(oldEntries.get(n)); } } private void expose(Entry entry) { Measures m = hex.getMeasures(); int y0 = m.toY(entry.start); int y1 = m.toY(entry.end); int h = m.getCellHeight(); int cellWidth = m.getCellWidth(); if (y0 == y1) { int x0 = m.toX(entry.start); int x1 = m.toX(entry.end) + cellWidth; hex.repaint(x0, y0, x1 - x0, h); } else { int lineStart = m.getValuesX(); int lineWidth = m.getValuesWidth(); hex.repaint(lineStart, y0, lineWidth, y1 - y0 + h); } } synchronized void paint(Graphics g, long start, long end) { int size = entries.size(); if (size == 0) return; Measures m = hex.getMeasures(); int lineStart = m.getValuesX(); int lineWidth = m.getValuesWidth(); int cellWidth = m.getCellWidth(); int cellHeight = m.getCellHeight(); for (Entry e : entries) { if (e.start <= end && e.end >= start) { int y0 = m.toY(e.start); int y1 = m.toY(e.end); int x0 = m.toX(e.start); int x1 = m.toX(e.end); g.setColor(e.color); if (y0 == y1) { g.fillRect(x0, y0, x1 - x0 + cellWidth, cellHeight); } else { int midHeight = y1 - (y0 + cellHeight); g.fillRect(x0, y0, lineStart + lineWidth - x0, cellHeight); if (midHeight > 0) g.fillRect(lineStart, y0 + cellHeight, lineWidth, midHeight); g.fillRect(lineStart, y1, x1 + cellWidth - lineStart, cellHeight); } } } } } logisim-2.7.1/src/com/cburch/hex/HexModelListener.java0000644000175000017500000000053511446034572022550 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.hex; public interface HexModelListener { public void metainfoChanged(HexModel source); public void bytesChanged(HexModel source, long start, long numBytes, int[] oldValues); } logisim-2.7.1/src/com/cburch/hex/HexModel.java0000644000175000017500000000207111446034572021037 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.hex; public interface HexModel { /** Registers a listener for changes to the values. */ public void addHexModelListener(HexModelListener l); /** Unregisters a listener for changes to the values. */ public void removeHexModelListener(HexModelListener l); /** Returns the offset of the initial value to be displayed. */ public long getFirstOffset(); /** Returns the number of values to be displayed. */ public long getLastOffset(); /** Returns number of bits in each value. */ public int getValueWidth(); /** Returns the value at the given address. */ public int get(long address); /** Changes the value at the given address. */ public void set(long address, int value); /** Changes a series of values at the given addresses. */ public void set(long start, int[] values); /** Fills a series of values with the same value. */ public void fill(long start, long length, int value); } logisim-2.7.1/src/com/cburch/hex/HexEditor.java0000644000175000017500000001420611446034572021230 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.hex; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Rectangle; import javax.swing.JComponent; import javax.swing.Scrollable; import javax.swing.SwingConstants; public class HexEditor extends JComponent implements Scrollable { private class Listener implements HexModelListener { public void metainfoChanged(HexModel source) { measures.recompute(); repaint(); } public void bytesChanged(HexModel source, long start, long numBytes, int[] oldValues) { repaint(0, measures.toY(start), getWidth(), measures.toY(start + numBytes) + measures.getCellHeight()); } } private HexModel model; private Listener listener; private Measures measures; private Caret caret; private Highlighter highlighter; public HexEditor(HexModel model) { this.model = model; this.listener = new Listener(); this.measures = new Measures(this); this.caret = new Caret(this); this.highlighter = new Highlighter(this); setOpaque(true); setBackground(Color.WHITE); if (model != null) model.addHexModelListener(listener); measures.recompute(); } Measures getMeasures() { return measures; } Highlighter getHighlighter() { return highlighter; } public HexModel getModel() { return model; } public Caret getCaret() { return caret; } public Object addHighlight(int start, int end, Color color) { return highlighter.add(start, end, color); } public void removeHighlight(Object tag) { highlighter.remove(tag); } public void setModel(HexModel value) { if (model == value) return; if (model != null) model.removeHexModelListener(listener); model = value; highlighter.clear(); caret.setDot(-1, false); if (model != null) model.addHexModelListener(listener); measures.recompute(); } public void scrollAddressToVisible(int start, int end) { if (start < 0 || end < 0) return; int x0 = measures.toX(start); int x1 = measures.toX(end) + measures.getCellWidth(); int y0 = measures.toY(start); int y1 = measures.toY(end); int h = measures.getCellHeight(); if (y0 == y1) { scrollRectToVisible(new Rectangle(x0, y0, x1 - x0, h)); } else { scrollRectToVisible(new Rectangle(x0, y0, x1 - x0, (y1 + h) - y0)); } } @Override public void setFont(Font value) { super.setFont(value); measures.recompute(); } @Override public void setBounds(int x, int y, int width, int height) { super.setBounds(x, y, width, height); measures.widthChanged(); } @Override protected void paintComponent(Graphics g) { measures.ensureComputed(g); Rectangle clip = g.getClipBounds(); if (isOpaque()) { g.setColor(getBackground()); g.fillRect(clip.x, clip.y, clip.width, clip.height); } long addr0 = model.getFirstOffset(); long addr1 = model.getLastOffset(); long xaddr0 = measures.toAddress(0, clip.y); if (xaddr0 == addr0) xaddr0 = measures.getBaseAddress(model); long xaddr1 = measures.toAddress(getWidth(), clip.y + clip.height) + 1; highlighter.paint(g, xaddr0, xaddr1); g.setColor(getForeground()); Font baseFont = g.getFont(); FontMetrics baseFm = g.getFontMetrics(baseFont); Font labelFont = baseFont.deriveFont(Font.ITALIC); FontMetrics labelFm = g.getFontMetrics(labelFont); int cols = measures.getColumnCount(); int baseX = measures.getBaseX(); int baseY = measures.toY(xaddr0) + baseFm.getAscent() + baseFm.getLeading() / 2; int dy = measures.getCellHeight(); int labelWidth = measures.getLabelWidth(); int labelChars = measures.getLabelChars(); int cellWidth = measures.getCellWidth(); int cellChars = measures.getCellChars(); for(long a = xaddr0; a < xaddr1; a += cols, baseY += dy) { String label = toHex(a, labelChars); g.setFont(labelFont); g.drawString(label, baseX - labelWidth + (labelWidth - labelFm.stringWidth(label)) / 2, baseY); g.setFont(baseFont); long b = a; for(int j = 0; j < cols; j++, b++) { if (b >= addr0 && b <= addr1) { String val = toHex(model.get(b), cellChars); int x = measures.toX(b) + (cellWidth - baseFm.stringWidth(val)) / 2; g.drawString(val, x, baseY); } } } caret.paintForeground(g, xaddr0, xaddr1); } private String toHex(long value, int chars) { String ret = Long.toHexString(value); int retLen = ret.length(); if (retLen < chars) { ret = "0" + ret; for(int i = retLen + 1; i < chars; i++) { ret = "0" + ret; } return ret; } else if (retLen == chars) { return ret; } else { return ret.substring(retLen - chars); } } // // selection methods // public boolean selectionExists() { return caret.getMark() >= 0 && caret.getDot() >= 0; } public void selectAll() { caret.setDot(model.getLastOffset(), false); caret.setDot(0, true); } public void delete() { long p0 = caret.getMark(); long p1 = caret.getDot(); if (p0 < 0 || p1 < 0) return; if (p0 > p1) { long t = p0; p0 = p1; p1 = t; } model.fill(p0, p1 - p0 + 1, 0); } // // Scrollable methods // public Dimension getPreferredScrollableViewportSize() { return getPreferredSize(); } public int getScrollableUnitIncrement(Rectangle vis, int orientation, int direction) { if (orientation == SwingConstants.VERTICAL) { int ret = measures.getCellHeight(); if (ret < 1) { measures.recompute(); ret = measures.getCellHeight(); if (ret < 1) return 1; } return ret; } else { return Math.max(1, vis.width / 20); } } public int getScrollableBlockIncrement(Rectangle vis, int orientation, int direction) { if (orientation == SwingConstants.VERTICAL) { int height = measures.getCellHeight(); if (height < 1) { measures.recompute(); height = measures.getCellHeight(); if (height < 1) return 19 * vis.height / 20; } int lines = Math.max(1, (vis.height / height) - 1); return lines * height; } else { return 19 * vis.width / 20; } } public boolean getScrollableTracksViewportWidth() { return true; } public boolean getScrollableTracksViewportHeight() { return false; } } logisim-2.7.1/src/com/cburch/hex/Caret.java0000644000175000017500000001756611450405556020406 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.hex; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.Stroke; import java.awt.event.ActionEvent; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.util.ArrayList; import javax.swing.AbstractAction; import javax.swing.ActionMap; import javax.swing.InputMap; import javax.swing.KeyStroke; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; public class Caret { private static Color SELECT_COLOR = new Color(192, 192, 255); private class Listener implements MouseListener, MouseMotionListener, KeyListener, FocusListener { public void mouseClicked(MouseEvent e) { } public void mousePressed(MouseEvent e) { Measures measures = hex.getMeasures(); long loc = measures.toAddress(e.getX(), e.getY()); setDot(loc, (e.getModifiers() & InputEvent.SHIFT_MASK) != 0); if (!hex.isFocusOwner()) hex.requestFocus(); } public void mouseReleased(MouseEvent e) { mouseDragged(e); } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mouseDragged(MouseEvent e) { Measures measures = hex.getMeasures(); long loc = measures.toAddress(e.getX(), e.getY()); setDot(loc, true); // TODO should repeat dragged events when mouse leaves the // component } public void mouseMoved(MouseEvent e) { } public void keyTyped(KeyEvent e) { int mask = e.getModifiers(); if ((mask & ~InputEvent.SHIFT_MASK) != 0) return; char c = e.getKeyChar(); int cols = hex.getMeasures().getColumnCount(); switch (c) { case ' ': if (cursor >= 0) setDot(cursor + 1, (mask & InputEvent.SHIFT_MASK) != 0); break; case '\n': if (cursor >= 0) setDot(cursor + cols, (mask & InputEvent.SHIFT_MASK) != 0); break; case '\u0008': case '\u007f': hex.delete(); // setDot(cursor - 1, (mask & InputEvent.SHIFT_MASK) != 0); break; default: int digit = Character.digit(e.getKeyChar(), 16); if (digit >= 0) { HexModel model = hex.getModel(); if (model != null && cursor >= model.getFirstOffset() && cursor <= model.getLastOffset()) { int curValue = model.get(cursor); int newValue = 16 * curValue + digit; model.set(cursor, newValue); } } } } public void keyPressed(KeyEvent e) { int cols = hex.getMeasures().getColumnCount(); int rows; boolean shift = (e.getModifiers() & InputEvent.SHIFT_MASK) != 0; switch (e.getKeyCode()) { case KeyEvent.VK_UP: if (cursor >= cols) setDot(cursor - cols, shift); break; case KeyEvent.VK_LEFT: if (cursor >= 1) setDot(cursor - 1, shift); break; case KeyEvent.VK_DOWN: if (cursor >= hex.getModel().getFirstOffset() && cursor <= hex.getModel().getLastOffset() - cols) { setDot(cursor + cols, shift); } break; case KeyEvent.VK_RIGHT: if (cursor >= hex.getModel().getFirstOffset() && cursor <= hex.getModel().getLastOffset() - 1) { setDot(cursor + 1, shift); } break; case KeyEvent.VK_HOME: if (cursor >= 0) { int dist = (int) (cursor % cols); if (dist == 0) setDot(0, shift); else setDot(cursor - dist, shift); break; } case KeyEvent.VK_END: if (cursor >= 0) { HexModel model = hex.getModel(); long dest = (cursor / cols * cols) + cols - 1; if (model != null) { long end = model.getLastOffset(); if (dest > end || dest == cursor) dest = end; setDot(dest, shift); } else { setDot(dest, shift); } } break; case KeyEvent.VK_PAGE_DOWN: rows = hex.getVisibleRect().height / hex.getMeasures().getCellHeight(); if (rows > 2) rows--; if (cursor >= 0) { long max = hex.getModel().getLastOffset(); if (cursor + rows * cols <= max) { setDot(cursor + rows * cols, shift); } else { long n = cursor; while (n + cols < max) n += cols; setDot(n, shift); } } break; case KeyEvent.VK_PAGE_UP: rows = hex.getVisibleRect().height / hex.getMeasures().getCellHeight(); if (rows > 2) rows--; if (cursor >= rows * cols) setDot(cursor - rows * cols, shift); else if (cursor >= cols) setDot(cursor % cols, shift); break; } } public void keyReleased(KeyEvent e) { } public void focusGained(FocusEvent e) { expose(cursor, false); } public void focusLost(FocusEvent e) { expose(cursor, false); } } private static final Stroke CURSOR_STROKE = new BasicStroke(2.0f); private HexEditor hex; private ArrayList listeners; private long mark; private long cursor; private Object highlight; Caret(HexEditor hex) { this.hex = hex; this.listeners = new ArrayList(); this.cursor = -1; Listener l = new Listener(); hex.addMouseListener(l); hex.addMouseMotionListener(l); hex.addKeyListener(l); hex.addFocusListener(l); InputMap imap = hex.getInputMap(); ActionMap amap = hex.getActionMap(); AbstractAction nullAction = new AbstractAction() { public void actionPerformed(ActionEvent e) { } }; String nullKey = "null"; amap.put(nullKey, nullAction); imap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), nullKey); imap.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), nullKey); imap.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), nullKey); imap.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), nullKey); imap.put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN, 0), nullKey); imap.put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP, 0), nullKey); imap.put(KeyStroke.getKeyStroke(KeyEvent.VK_HOME, 0), nullKey); imap.put(KeyStroke.getKeyStroke(KeyEvent.VK_END, 0), nullKey); imap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), nullKey); } public void addChangeListener(ChangeListener l) { listeners.add(l); } public void removeChangeListener(ChangeListener l) { listeners.remove(l); } public long getMark() { return mark; } public long getDot() { return cursor; } public void setDot(long value, boolean keepMark) { HexModel model = hex.getModel(); if (model == null || value < model.getFirstOffset() || value > model.getLastOffset()) { value = -1; } if (cursor != value) { long oldValue = cursor; if (highlight != null) { hex.getHighlighter().remove(highlight); highlight = null; } if (!keepMark) { mark = value; } else if (mark != value) { highlight = hex.getHighlighter().add(mark, value, SELECT_COLOR); } cursor = value; expose(oldValue, false); expose(value, true); if (!listeners.isEmpty()) { ChangeEvent event = new ChangeEvent(this); for (ChangeListener l : listeners) { l.stateChanged(event); } } } } private void expose(long loc, boolean scrollTo) { if (loc >= 0) { Measures measures = hex.getMeasures(); int x = measures.toX(loc); int y = measures.toY(loc); int w = measures.getCellWidth(); int h = measures.getCellHeight(); hex.repaint(x - 1, y - 1, w + 2, h + 2); if (scrollTo) { hex.scrollRectToVisible(new Rectangle(x, y, w, h)); } } } void paintForeground(Graphics g, long start, long end) { if (cursor >= start && cursor < end && hex.isFocusOwner()) { Measures measures = hex.getMeasures(); int x = measures.toX(cursor); int y = measures.toY(cursor); Graphics2D g2 = (Graphics2D) g; Stroke oldStroke = g2.getStroke(); g2.setColor(hex.getForeground()); g2.setStroke(CURSOR_STROKE); g2.drawRect(x, y, measures.getCellWidth() - 1, measures.getCellHeight() - 1); g2.setStroke(oldStroke); } } } logisim-2.7.1/src/com/cburch/gray/0000755000175000017500000000000011450405554016642 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/gray/SimpleGrayCounter.java0000644000175000017500000000600611450405554023123 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.gray; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.util.GraphicsUtil; import com.cburch.logisim.util.StringUtil; /** Manufactures a simple counter that iterates over the 4-bit Gray Code. This * example illustrates how a component can maintain its own internal state. All * of the code relevant to state, though, appears in CounterData class. */ class SimpleGrayCounter extends InstanceFactory { private static final BitWidth BIT_WIDTH = BitWidth.create(4); // Again, notice how we don't have any instance variables related to an // individual instance's state. We can't put that here, because only one // SimpleGrayCounter object is ever created, and its job is to manage all // instances that appear in any circuits. public SimpleGrayCounter() { super("Gray Counter (Simple)"); setOffsetBounds(Bounds.create(-30, -15, 30, 30)); setPorts(new Port[] { new Port(-30, 0, Port.INPUT, 1), new Port( 0, 0, Port.OUTPUT, BIT_WIDTH.getWidth()), }); } @Override public void propagate(InstanceState state) { // Here I retrieve the state associated with this component via a helper // method. In this case, the state is in a CounterData object, which is // also where the helper method is defined. This helper method will end // up creating a CounterData object if one doesn't already exist. CounterData cur = CounterData.get(state, BIT_WIDTH); boolean trigger = cur.updateClock(state.getPort(0)); if (trigger) cur.setValue(GrayIncrementer.nextGray(cur.getValue())); state.setPort(1, cur.getValue(), 9); // (You might be tempted to determine the counter's current value // via state.getPort(1). This is erroneous, though, because another // component may be pushing a value onto the same point, which would // "corrupt" the value found there. We really do need to store the // current value in the instance.) } @Override public void paintInstance(InstancePainter painter) { painter.drawBounds(); painter.drawClock(0, Direction.EAST); // draw a triangle on port 0 painter.drawPort(1); // draw port 1 as just a dot // Display the current counter value centered within the rectangle. // However, if the context says not to show state (as when generating // printer output), then skip this. if (painter.getShowState()) { CounterData state = CounterData.get(painter, BIT_WIDTH); Bounds bds = painter.getBounds(); GraphicsUtil.drawCenteredText(painter.getGraphics(), StringUtil.toHexString(BIT_WIDTH.getWidth(), state.getValue().toIntValue()), bds.getX() + bds.getWidth() / 2, bds.getY() + bds.getHeight() / 2); } } } logisim-2.7.1/src/com/cburch/gray/GrayIncrementer.java0000644000175000017500000001210511450405504022575 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.gray; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; /** This component takes a multibit input and outputs the value that follows it * in Gray Code. For instance, given input 0100 the output is 1100. */ class GrayIncrementer extends InstanceFactory { /* Note that there are no instance variables. There is only one instance of * this class created, which manages all instances of the component. Any * information associated with individual instances should be handled * through attributes. For GrayIncrementer, each instance has a "bit width" * that it works with, and so we'll have an attribute. */ /** The constructor configures the factory. */ GrayIncrementer() { super("Gray Code Incrementer"); /* This is how we can set up the attributes for GrayIncrementers. In * this case, there is just one attribute - the width - whose default * is 4. The StdAttr class defines several commonly occurring * attributes, including one for "bit width." It's best to use those * StdAttr attributes when appropriate: A user can then select several * components (even from differing factories) with the same attribute * and modify them all at once. */ setAttributes(new Attribute[] { StdAttr.WIDTH }, new Object[] { BitWidth.create(4) }); /* The "offset bounds" is the location of the bounding rectangle * relative to the mouse location. Here, we're choosing the component to * be 30x30, and we're anchoring it relative to its primary output * (as is typical for Logisim), which happens to be in the center of the * east edge. Thus, the top left corner of the bounding box is 30 pixels * west and 15 pixels north of the mouse location. */ setOffsetBounds(Bounds.create(-30, -15, 30, 30)); /* The ports are locations where wires can be connected to this * component. Each port object says where to find the port relative to * the component's anchor location, then whether the port is an * input/output/both, and finally the expected bit width for the port. * The bit width can be a constant (like 1) or an attribute (as here). */ setPorts(new Port[] { new Port(-30, 0, Port.INPUT, StdAttr.WIDTH), new Port(0, 0, Port.OUTPUT, StdAttr.WIDTH), }); } /** Computes the current output for this component. This method is invoked * any time any of the inputs change their values; it may also be invoked in * other circumstances, even if there is no reason to expect it to change * anything. */ @Override public void propagate(InstanceState state) { // First we retrieve the value being fed into the input. Note that in // the setPorts invocation above, the component's input was included at // index 0 in the parameter array, so we use 0 as the parameter below. Value in = state.getPort(0); // Now compute the output. We've farmed this out to a helper method, // since the same logic is needed for the library's other components. Value out = nextGray(in); // Finally we propagate the output into the circuit. The first parameter // is 1 because in our list of ports (configured by invocation of // setPorts above) the output is at index 1. The second parameter is the // value we want to send on that port. And the last parameter is its // "delay" - the number of steps it will take for the output to update // after its input. state.setPort(1, out, out.getWidth() + 1); } /** Says how an individual instance should appear on the canvas. */ @Override public void paintInstance(InstancePainter painter) { // As it happens, InstancePainter contains several convenience methods // for drawing, and we'll use those here. Frequently, you'd want to // retrieve its Graphics object (painter.getGraphics) so you can draw // directly onto the canvas. painter.drawRectangle(painter.getBounds(), "G+1"); painter.drawPorts(); } /** Computes the next gray value in the sequence after prev. This static * method just does some bit twiddling; it doesn't have much to do with * Logisim except that it manipulates Value and BitWidth objects. */ static Value nextGray(Value prev) { BitWidth bits = prev.getBitWidth(); if (!prev.isFullyDefined()) return Value.createError(bits); int x = prev.toIntValue(); int ct = (x >> 16) ^ x; // compute parity of x ct = (ct >> 8) ^ ct; ct = (ct >> 4) ^ ct; ct = (ct >> 2) ^ ct; ct = (ct >> 1) ^ ct; if ((ct & 1) == 0) { // if parity is even, flip 1's bit x = x ^ 1; } else { // else flip bit just above last 1 int y = x ^ (x & (x - 1)); // first compute the last 1 y = (y << 1) & bits.getMask(); x = (y == 0 ? 0 : x ^ y); } return Value.createKnown(bits, x); } } logisim-2.7.1/src/com/cburch/gray/GrayCounter.java0000644000175000017500000000751311450405540021750 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.gray; import java.net.URL; import javax.swing.ImageIcon; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.instance.Instance; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.util.GraphicsUtil; import com.cburch.logisim.util.StringUtil; /** Manufactures a counter that iterates over Gray codes. This demonstrates * several additional features beyond the SimpleGrayCounter class. */ class GrayCounter extends InstanceFactory { public GrayCounter() { super("Gray Counter"); setOffsetBounds(Bounds.create(-30, -15, 30, 30)); setPorts(new Port[] { new Port(-30, 0, Port.INPUT, 1), new Port( 0, 0, Port.OUTPUT, StdAttr.WIDTH), }); // We'll have width, label, and label font attributes. The latter two // attributes allow us to associate a label with the component (though // we'll also need configureNewInstance to configure the label's // location). setAttributes( new Attribute[] { StdAttr.WIDTH, StdAttr.LABEL, StdAttr.LABEL_FONT }, new Object[] { BitWidth.create(4), "", StdAttr.DEFAULT_LABEL_FONT }); // The following method invocation sets things up so that the instance's // state can be manipulated using the Poke Tool. setInstancePoker(CounterPoker.class); // These next two lines set it up so that the explorer window shows a // customized icon representing the component type. This should be a // 16x16 image. URL url = getClass().getClassLoader().getResource("com/cburch/gray/counter.gif"); if (url != null) setIcon(new ImageIcon(url)); } /** The configureNewInstance method is invoked every time a new instance * is created. In the superclass, the method doesn't do anything, since * the new instance is pretty thoroughly configured already by default. But * sometimes you need to do something particular to each instance, so you * would override the method. In this case, we need to set up the location * for its label. */ @Override protected void configureNewInstance(Instance instance) { Bounds bds = instance.getBounds(); instance.setTextField(StdAttr.LABEL, StdAttr.LABEL_FONT, bds.getX() + bds.getWidth() / 2, bds.getY() - 3, GraphicsUtil.H_CENTER, GraphicsUtil.V_BASELINE); } @Override public void propagate(InstanceState state) { // This is the same as with SimpleGrayCounter, except that we use the // StdAttr.WIDTH attribute to determine the bit width to work with. BitWidth width = state.getAttributeValue(StdAttr.WIDTH); CounterData cur = CounterData.get(state, width); boolean trigger = cur.updateClock(state.getPort(0)); if (trigger) cur.setValue(GrayIncrementer.nextGray(cur.getValue())); state.setPort(1, cur.getValue(), 9); } @Override public void paintInstance(InstancePainter painter) { // This is essentially the same as with SimpleGrayCounter, except for // the invocation of painter.drawLabel to make the label be drawn. painter.drawBounds(); painter.drawClock(0, Direction.EAST); painter.drawPort(1); painter.drawLabel(); if (painter.getShowState()) { BitWidth width = painter.getAttributeValue(StdAttr.WIDTH); CounterData state = CounterData.get(painter, width); Bounds bds = painter.getBounds(); GraphicsUtil.drawCenteredText(painter.getGraphics(), StringUtil.toHexString(width.getWidth(), state.getValue().toIntValue()), bds.getX() + bds.getWidth() / 2, bds.getY() + bds.getHeight() / 2); } } } logisim-2.7.1/src/com/cburch/gray/CounterPoker.java0000644000175000017500000000564011450405472022131 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.gray; import java.awt.Color; import java.awt.Graphics; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstancePoker; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.StdAttr; /** When the user clicks a counter using the Poke Tool, a CounterPoker object * is created, and that object will handle all user events. Note that * CounterPoker is a class specific to GrayCounter, and that it must be a * subclass of InstancePoker in the com.cburch.logisim.instance package. */ public class CounterPoker extends InstancePoker { public CounterPoker() { } /** Determines whether the location the mouse was pressed should result * in initiating a poke. */ @Override public boolean init(InstanceState state, MouseEvent e) { return state.getInstance().getBounds().contains(e.getX(), e.getY()); // Anywhere in the main rectangle initiates the poke. The user might // have clicked within a label, but that will be outside the bounds. } /** Draws an indicator that the caret is being selected. Here, we'll draw * a red rectangle around the value. */ @Override public void paint(InstancePainter painter) { Bounds bds = painter.getBounds(); BitWidth width = painter.getAttributeValue(StdAttr.WIDTH); int len = (width.getWidth() + 3) / 4; Graphics g = painter.getGraphics(); 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. */ @Override public void keyTyped(InstanceState state, KeyEvent e) { // convert it to a hex digit; if it isn't a hex digit, abort. int val = Character.digit(e.getKeyChar(), 16); BitWidth width = state.getAttributeValue(StdAttr.WIDTH); if (val < 0 || (val & width.getMask()) != val) return; // compute the next value CounterData cur = CounterData.get(state, width); int newVal = (cur.getValue().toIntValue() * 16 + val) & width.getMask(); Value newValue = Value.createKnown(width, newVal); cur.setValue(newValue); state.fireInvalidated(); // You might be tempted to propagate the value immediately here, using // state.setPort. However, the circuit may currently be propagating in // another thread, and invoking setPort directly could interfere with // that. Using fireInvalidated notifies the propagation thread to // invoke propagate on the counter at its next opportunity. } } logisim-2.7.1/src/com/cburch/gray/CounterData.java0000644000175000017500000000442611450405526021723 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.gray; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.InstanceData; import com.cburch.logisim.instance.InstanceState; /** Represents the state of a counter. */ class CounterData implements InstanceData, Cloneable { /** Retrieves the state associated with this counter in the circuit state, * generating the state if necessary. */ public static CounterData get(InstanceState state, BitWidth width) { CounterData ret = (CounterData) state.getData(); if (ret == 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. ret = new CounterData(null, Value.createKnown(width, 0)); state.setData(ret); } else if (!ret.value.getBitWidth().equals(width)) { ret.value = ret.value.extendWidth(width.getWidth(), Value.FALSE); } return ret; } /** 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 CounterData(Value lastClock, Value value) { this.lastClock = lastClock; this.value = value; } /** Returns a copy of this object. */ @Override 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; } } /** Updates the last clock observed, returning true if triggered. */ public boolean updateClock(Value value) { Value old = lastClock; lastClock = value; return old == Value.FALSE && value == Value.TRUE; } /** 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; } } logisim-2.7.1/src/com/cburch/gray/Components.java0000644000175000017500000000260011446034506021630 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.gray; import java.util.Arrays; import java.util.List; import com.cburch.logisim.tools.AddTool; import com.cburch.logisim.tools.Library; /** 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 components; practically speaking, though, you'll most often want * to create AddTools for new components that can be added into the circuit. */ 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 AddTool[] { new AddTool(new GrayIncrementer()), new AddTool(new SimpleGrayCounter()), new AddTool(new GrayCounter()), }); } /** Returns the name of the library that the user will see. */ @Override public String getDisplayName() { return "Gray Tools"; } /** Returns a list of all the tools available in this library. */ @Override public List getTools() { return tools; } } logisim-2.7.1/src/com/cburch/draw/0000755000175000017500000000000011446034604016634 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/draw/util/0000755000175000017500000000000011447117152017612 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/draw/util/ZOrder.java0000644000175000017500000000712311446663010021663 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.util; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.ListIterator; import java.util.Map; import java.util.Set; import com.cburch.draw.model.CanvasModel; import com.cburch.draw.model.CanvasObject; public class ZOrder { private ZOrder() { } public static int getZIndex(CanvasObject query, CanvasModel model) { // returns 0 for bottommost element, large number for topmost return getIndex(query, model.getObjectsFromBottom()); } public static Map getZIndex( Collection query, CanvasModel model) { // returns 0 for bottommost element, large number for topmost, ordered // from the bottom up. if (query == null) return Collections.emptyMap(); Set querySet = toSet(query); Map ret; ret = new LinkedHashMap(query.size()); int z = -1; for (CanvasObject o : model.getObjectsFromBottom()) { z++; if (querySet.contains(o)) { ret.put(o, Integer.valueOf(z)); } } return ret; } public static List sortTopFirst( Collection objects, CanvasModel model) { return sortXFirst(objects, model, model.getObjectsFromBottom()); } public static List sortBottomFirst( Collection objects, CanvasModel model) { return sortXFirst(objects, model, model.getObjectsFromTop()); } private static List sortXFirst( Collection objects, CanvasModel model, Collection objs) { Set set = toSet(objects); ArrayList ret = new ArrayList(objects.size()); for (CanvasObject o : objs) { if (set.contains(o)) { @SuppressWarnings("unchecked") E toAdd = (E) o; ret.add(toAdd); } } return ret; } private static Set toSet(Collection objects) { if (objects instanceof Set) { return (Set) objects; } else { return new HashSet(objects); } } // returns first object above query in the z-order that overlaps query public static CanvasObject getObjectAbove(CanvasObject query, CanvasModel model, Collection ignore) { return getPrevious(query, model.getObjectsFromTop(), model, ignore); } // returns first object below query in the z-order that overlaps query public static CanvasObject getObjectBelow(CanvasObject query, CanvasModel model, Collection ignore) { return getPrevious(query, model.getObjectsFromBottom(), model, ignore); } private static CanvasObject getPrevious(CanvasObject query, List objs, CanvasModel model, Collection ignore) { int index = getIndex(query, objs); if (index <= 0) { return null; } else { Set set = toSet(model.getObjectsOverlapping(query)); ListIterator it = objs.listIterator(index); while (it.hasPrevious()) { CanvasObject o = it.previous(); if (set.contains(o) && !ignore.contains(o)) return o; } return null; } } private static int getIndex(CanvasObject query, List objs) { int index = -1; for (CanvasObject o : objs) { index++; if (o == query) return index; } return -1; } } logisim-2.7.1/src/com/cburch/draw/util/MatchingSet.java0000644000175000017500000000404011446034604022660 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.util; import java.util.AbstractSet; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import com.cburch.draw.model.CanvasObject; public class MatchingSet extends AbstractSet { private static class Member { E value; public Member(E value) { this.value = value; } @Override public boolean equals(Object other) { @SuppressWarnings("unchecked") Member that = (Member) other; return this.value.matches(that.value); } @Override public int hashCode() { return value.matchesHashCode(); } } private static class MatchIterator implements Iterator { private Iterator> it; MatchIterator(Iterator> it) { this.it = it; } public boolean hasNext() { return it.hasNext(); } public E next() { return it.next().value; } public void remove() { it.remove(); } } private HashSet> set; public MatchingSet() { set = new HashSet>(); } public MatchingSet(Collection initialContents) { set = new HashSet>(initialContents.size()); for (E value : initialContents) { set.add(new Member(value)); } } @Override public boolean add(E value) { return set.add(new Member(value)); } @Override public boolean remove(Object value) { @SuppressWarnings("unchecked") E eValue = (E) value; return set.remove(new Member(eValue)); } @Override public boolean contains(Object value) { @SuppressWarnings("unchecked") E eValue = (E) value; return set.contains(new Member(eValue)); } @Override public Iterator iterator() { return new MatchIterator(set.iterator()); } @Override public int size() { return set.size(); } } logisim-2.7.1/src/com/cburch/draw/util/EditableLabelField.java0000644000175000017500000000145411447117152024076 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.util; import java.awt.Color; import java.awt.Graphics; import javax.swing.BorderFactory; import javax.swing.JTextField; public class EditableLabelField extends JTextField { static final int FIELD_BORDER = 2; public EditableLabelField() { super(10); setBackground(new Color(255, 255, 255, 128)); setOpaque(false); setBorder(BorderFactory.createCompoundBorder( BorderFactory.createLineBorder(Color.BLACK), BorderFactory.createEmptyBorder(1, 1, 1, 1))); } @Override protected void paintComponent(Graphics g) { g.setColor(getBackground()); g.fillRect(0,0, getWidth(),getHeight()); super.paintComponent(g); } } logisim-2.7.1/src/com/cburch/draw/util/EditableLabel.java0000644000175000017500000001600411446663010023125 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.util; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.font.FontRenderContext; import java.awt.font.TextLayout; import java.awt.geom.AffineTransform; import java.awt.geom.Rectangle2D; import java.util.Arrays; import javax.swing.JTextField; import com.cburch.logisim.data.Bounds; public class EditableLabel implements Cloneable { public static final int LEFT = JTextField.LEFT; public static final int RIGHT = JTextField.RIGHT; public static final int CENTER = JTextField.CENTER; public static final int TOP = 8; public static final int MIDDLE = 9; public static final int BASELINE = 10; public static final int BOTTOM = 11; private int x; private int y; private String text; private Font font; private Color color; private int horzAlign; private int vertAlign; private boolean dimsKnown; private int width; private int ascent; private int descent; private int[] charX; private int[] charY; public EditableLabel(int x, int y, String text, Font font) { this.x = x; this.y = y; this.text = text; this.font = font; this.color = Color.BLACK; this.horzAlign = LEFT; this.vertAlign = BASELINE; this.dimsKnown = false; } @Override public EditableLabel clone() { try { return (EditableLabel) super.clone(); } catch (CloneNotSupportedException e) { return new EditableLabel(x, y, text, font); } } @Override public boolean equals(Object other) { if (other instanceof EditableLabel) { EditableLabel that = (EditableLabel) other; return this.x == that.x && this.y == that.y && this.text.equals(that.text) && this.font.equals(that.font) && this.color.equals(that.color) && this.horzAlign == that.horzAlign && this.vertAlign == that.vertAlign; } else { return false; } } @Override public int hashCode() { int ret = x * 31 + y; ret = ret * 31 + text.hashCode(); ret = ret * 31 + font.hashCode(); ret = ret * 31 + color.hashCode(); ret = ret * 31 + horzAlign; ret = ret * 31 + vertAlign; return ret; } // // accessor methods // public int getX() { return x; } public int getY() { return y; } public void setLocation(int x, int y) { this.x = x; this.y = y; } public String getText() { return text; } public void setText(String value) { dimsKnown = false; text = value; } public Font getFont() { return font; } public void setFont(Font value) { font = value; dimsKnown = false; } public Color getColor() { return color; } public void setColor(Color value) { color = value; } public int getHorizontalAlignment() { return horzAlign; } public void setHorizontalAlignment(int value) { if (value != LEFT && value != CENTER && value != RIGHT) { throw new IllegalArgumentException("argument must be LEFT, CENTER, or RIGHT"); } horzAlign = value; dimsKnown = false; } public int getVerticalAlignment() { return vertAlign; } public void setVerticalAlignment(int value) { if (value != TOP && value != MIDDLE && value != BASELINE && value != BOTTOM) { throw new IllegalArgumentException("argument must be TOP, MIDDLE, BASELINE, or BOTTOM"); } vertAlign = value; dimsKnown = false; } // // more complex methods // public Bounds getBounds() { int x0 = getLeftX(); int y0 = getBaseY() - ascent; int w = width; int h = ascent + descent; return Bounds.create(x0, y0, w, h); } public boolean contains(int qx, int qy) { int x0 = getLeftX(); int y0 = getBaseY(); if (qx >= x0 && qx < x0 + width && qy >= y0 - ascent && qy < y0 + descent) { int[] xs = charX; int[] ys = charY; if (xs == null || ys == null) { return true; } else { int i = Arrays.binarySearch(xs, qx - x0); if (i < 0) i = -(i + 1); if (i >= xs.length) { return false; } else { int asc = (ys[i] >> 16) & 0xFFFF; int desc = ys[i] & 0xFFFF; int dy = y0 - qy; return dy >= -desc && dy <= asc; } } } else { return false; } } private int getLeftX() { switch (horzAlign) { case LEFT: return x; case CENTER: return x - width / 2; case RIGHT: return x - width; default: return x; } } private int getBaseY() { switch (vertAlign) { case TOP: return y + ascent; case MIDDLE: return y + (ascent - descent) / 2; case BASELINE: return y; case BOTTOM: return y - descent; default: return y; } } public void configureTextField(EditableLabelField field) { configureTextField(field, 1.0); } public void configureTextField(EditableLabelField field, double zoom) { Font f = font; if (zoom != 1.0) { f = f.deriveFont(AffineTransform.getScaleInstance(zoom, zoom)); } field.setFont(f); Dimension dim = field.getPreferredSize(); int w; int border = EditableLabelField.FIELD_BORDER; if (dimsKnown) { w = width + 1 + 2 * border; } else { FontMetrics fm = field.getFontMetrics(font); ascent = fm.getAscent(); descent = fm.getDescent(); w = 0; } int x0 = x; int y0 = getBaseY() - ascent; if (zoom != 1.0) { x0 = (int) Math.round(x0 * zoom); y0 = (int) Math.round(y0 * zoom); w = (int) Math.round(w * zoom); } w = Math.max(w, dim.width); int h = dim.height; switch (horzAlign) { case LEFT: x0 = x0 - border; break; case CENTER: x0 = x0 - (w / 2) + 1; break; case RIGHT: x0 = x0 - w + border + 1; break; default: x0 = x0 - border; } y0 = y0 - border; field.setHorizontalAlignment(horzAlign); field.setForeground(color); field.setBounds(x0, y0, w, h); } public void paint(Graphics g) { g.setFont(font); if (!dimsKnown) { computeDimensions(g, font, g.getFontMetrics()); } int x0 = getLeftX(); int y0 = getBaseY(); g.setColor(color); g.drawString(text, x0, y0); } private void computeDimensions(Graphics g, Font font, FontMetrics fm) { String s = text; FontRenderContext frc = ((Graphics2D) g).getFontRenderContext(); width = fm.stringWidth(s); ascent = fm.getAscent(); descent = fm.getDescent(); int[] xs = new int[s.length()]; int[] ys = new int[s.length()]; for (int i = 0; i < xs.length; i++) { xs[i] = fm.stringWidth(s.substring(0, i + 1)); TextLayout lay = new TextLayout(s.substring(i, i + 1), font, frc); Rectangle2D rect = lay.getBounds(); int asc = (int) Math.ceil(-rect.getMinY()); int desc = (int) Math.ceil(rect.getMaxY()); if (asc < 0) asc = 0; if (asc > 0xFFFF) asc = 0xFFFF; if (desc < 0) desc = 0; if (desc > 0xFFFF) desc = 0xFFFF; ys[i] = (asc << 16) | desc; } charX = xs; charY = ys; dimsKnown = true; } } logisim-2.7.1/src/com/cburch/draw/undo/0000755000175000017500000000000011446034602017577 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/draw/undo/UndoLogListener.java0000644000175000017500000000050611446034602023520 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.undo; import java.util.EventListener; public interface UndoLogListener extends EventListener { public void undoLogChanged(UndoLogEvent e); } logisim-2.7.1/src/com/cburch/draw/undo/UndoLogEvent.java0000644000175000017500000000137411446034602023020 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.undo; import java.util.EventObject; public class UndoLogEvent extends EventObject { public static final int ACTION_DONE = 0; public static final int ACTION_UNDONE = 1; private int action; private Action actionObject; public UndoLogEvent(UndoLog source, int action, Action actionObject) { super(source); this.action = action; this.actionObject = actionObject; } public UndoLog getUndoLog() { return (UndoLog) getSource(); } public int getAction() { return action; } public Action getActionObject() { return actionObject; } } logisim-2.7.1/src/com/cburch/draw/undo/UndoLogDispatcher.java0000644000175000017500000000071711446034602024025 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.undo; import com.cburch.draw.canvas.ActionDispatcher; public class UndoLogDispatcher implements ActionDispatcher { private UndoLog log; public UndoLogDispatcher(UndoLog log) { this.log = log; } public void doAction(Action action) { log.doAction(action); } } logisim-2.7.1/src/com/cburch/draw/undo/UndoLog.java0000644000175000017500000000515611446034602022020 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.undo; import java.util.LinkedList; import com.cburch.logisim.util.EventSourceWeakSupport; public class UndoLog { private static final int MAX_UNDO_SIZE = 64; private EventSourceWeakSupport listeners; private LinkedList undoLog; private LinkedList redoLog; private int modCount; public UndoLog() { this.listeners = new EventSourceWeakSupport(); this.undoLog = new LinkedList(); this.redoLog = new LinkedList(); this.modCount = 0; } // // listening methods // public void addProjectListener(UndoLogListener what) { listeners.add(what); } public void removeProjectListener(UndoLogListener what) { listeners.remove(what); } private void fireEvent(int action, Action actionObject) { UndoLogEvent e = null; for (UndoLogListener listener : listeners) { if (e == null) e = new UndoLogEvent(this, action, actionObject); listener.undoLogChanged(e); } } // // accessor methods // public Action getUndoAction() { if (undoLog.size() == 0) { return null; } else { return undoLog.getLast(); } } public Action getRedoAction() { if (redoLog.size() == 0) { return null; } else { return redoLog.getLast(); } } public boolean isModified() { return modCount != 0; } // // mutator methods // public void doAction(Action act) { if (act == null) return; act.doIt(); logAction(act); } public void logAction(Action act) { redoLog.clear(); if (!undoLog.isEmpty()) { Action prev = undoLog.getLast(); if (act.shouldAppendTo(prev)) { if (prev.isModification()) --modCount; Action joined = prev.append(act); if (joined == null) { fireEvent(UndoLogEvent.ACTION_DONE, act); return; } act = joined; } while (undoLog.size() > MAX_UNDO_SIZE) { undoLog.removeFirst(); } } undoLog.add(act); if (act.isModification()) ++modCount; fireEvent(UndoLogEvent.ACTION_DONE, act); } public void undoAction() { if (undoLog.size() > 0) { Action action = undoLog.removeLast(); if (action.isModification()) --modCount; action.undo(); redoLog.add(action); fireEvent(UndoLogEvent.ACTION_UNDONE, action); } } public void redoAction() { if (redoLog.size() > 0) { Action action = redoLog.removeLast(); if (action.isModification()) ++modCount; action.doIt(); undoLog.add(action); fireEvent(UndoLogEvent.ACTION_DONE, action); } } public void clearModified() { modCount = 0; } } logisim-2.7.1/src/com/cburch/draw/undo/ActionUnion.java0000644000175000017500000000126211446034602022671 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.undo; class ActionUnion extends Action { Action first; Action second; ActionUnion(Action first, Action second) { this.first = first; this.second = second; } @Override public boolean isModification() { return first.isModification() || second.isModification(); } @Override public String getName() { return first.getName(); } @Override public void doIt() { first.doIt(); second.doIt(); } @Override public void undo() { second.undo(); first.undo(); } } logisim-2.7.1/src/com/cburch/draw/undo/Action.java0000644000175000017500000000077111446034602021664 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.undo; public abstract class Action { public boolean isModification() { return true; } public abstract String getName(); public abstract void doIt(); public abstract void undo(); public boolean shouldAppendTo(Action other) { return false; } public Action append(Action other) { return new ActionUnion(this, other); } } logisim-2.7.1/src/com/cburch/draw/tools/0000755000175000017500000000000011541271666020003 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/draw/tools/ToolbarToolItem.java0000644000175000017500000000244411447117152023723 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.tools; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Graphics; import javax.swing.Icon; import com.cburch.draw.toolbar.ToolbarItem; public class ToolbarToolItem implements ToolbarItem { private AbstractTool tool; private Icon icon; public ToolbarToolItem(AbstractTool tool) { this.tool = tool; this.icon = tool.getIcon(); } public AbstractTool getTool() { return tool; } public boolean isSelectable() { return true; } public void paintIcon(Component destination, Graphics g) { if (icon == null) { g.setColor(new Color(255, 128, 128)); g.fillRect(4, 4, 8, 8); g.setColor(Color.BLACK); g.drawLine(4, 4, 12, 12); g.drawLine(4, 12, 12, 4); g.drawRect(4, 4, 8, 8); } else { icon.paintIcon(destination, g, 4, 4); } } public String getToolTip() { return tool.getDescription(); } public Dimension getDimension(Object orientation) { if (icon == null) { return new Dimension(16, 16); } else { return new Dimension(icon.getIconWidth() + 8, icon.getIconHeight() + 8); } } } logisim-2.7.1/src/com/cburch/draw/tools/TextTool.java0000644000175000017500000001236311446663006022432 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.tools; import java.awt.Cursor; import java.awt.Graphics; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import java.util.Collections; import java.util.List; import javax.swing.AbstractAction; import javax.swing.ActionMap; import javax.swing.Icon; import javax.swing.InputMap; import javax.swing.KeyStroke; import com.cburch.draw.actions.ModelAddAction; import com.cburch.draw.actions.ModelEditTextAction; import com.cburch.draw.actions.ModelRemoveAction; import com.cburch.draw.canvas.Canvas; import com.cburch.draw.model.CanvasObject; import com.cburch.draw.shapes.DrawAttr; import com.cburch.draw.shapes.Text; import com.cburch.draw.util.EditableLabelField; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeEvent; import com.cburch.logisim.data.AttributeListener; import com.cburch.logisim.data.Location; import com.cburch.logisim.util.Icons; public class TextTool extends AbstractTool { private class FieldListener extends AbstractAction implements AttributeListener { public void actionPerformed(ActionEvent e) { commitText(curCanvas); } public void attributeListChanged(AttributeEvent e) { Text cur = curText; if (cur != null) { double zoom = curCanvas.getZoomFactor(); cur.getLabel().configureTextField(field, zoom); curCanvas.repaint(); } } public void attributeValueChanged(AttributeEvent e) { attributeListChanged(e); } } private class CancelListener extends AbstractAction { public void actionPerformed(ActionEvent e) { cancelText(curCanvas); } } private DrawingAttributeSet attrs; private EditableLabelField field; private FieldListener fieldListener; private Text curText; private Canvas curCanvas; private boolean isTextNew; public TextTool(DrawingAttributeSet attrs) { this.attrs = attrs; curText = null; isTextNew = false; field = new EditableLabelField(); fieldListener = new FieldListener(); InputMap fieldInput = field.getInputMap(); fieldInput.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "commit"); fieldInput.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "cancel"); ActionMap fieldAction = field.getActionMap(); fieldAction.put("commit", fieldListener); fieldAction.put("cancel", new CancelListener()); } @Override public Icon getIcon() { return Icons.getIcon("text.gif"); } @Override public Cursor getCursor(Canvas canvas) { return Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR); } @Override public List> getAttributes() { return DrawAttr.ATTRS_TEXT_TOOL; } @Override public void toolSelected(Canvas canvas) { cancelText(canvas); } @Override public void toolDeselected(Canvas canvas) { commitText(canvas); } @Override public void mousePressed(Canvas canvas, MouseEvent e) { if (curText != null) { commitText(canvas); } Text clicked = null; boolean found = false; int mx = e.getX(); int my = e.getY(); Location mloc = Location.create(mx, my); for (CanvasObject o : canvas.getModel().getObjectsFromTop()) { if (o instanceof Text && o.contains(mloc, true)) { clicked = (Text) o; found = true; break; } } if (!found) { clicked = attrs.applyTo(new Text(mx, my, "")); } curText = clicked; curCanvas = canvas; isTextNew = !found; clicked.getLabel().configureTextField(field, canvas.getZoomFactor()); field.setText(clicked.getText()); canvas.add(field); Point fieldLoc = field.getLocation(); double zoom = canvas.getZoomFactor(); fieldLoc.x = (int) Math.round(mx * zoom - fieldLoc.x); fieldLoc.y = (int) Math.round(my * zoom - fieldLoc.y); int caret = field.viewToModel(fieldLoc); if (caret >= 0) { field.setCaretPosition(caret); } field.requestFocus(); canvas.getSelection().setSelected(clicked, true); canvas.getSelection().setHidden(Collections.singleton(clicked), true); clicked.addAttributeListener(fieldListener); canvas.repaint(); } @Override public void zoomFactorChanged(Canvas canvas) { Text t = curText; if (t != null) { t.getLabel().configureTextField(field, canvas.getZoomFactor()); } } @Override public void draw(Canvas canvas, Graphics g) { ; // actually, there's nothing to do here - it's handled by the field } private void cancelText(Canvas canvas) { Text cur = curText; if (cur != null) { curText = null; cur.removeAttributeListener(fieldListener); canvas.remove(field); canvas.getSelection().clearSelected(); canvas.repaint(); } } private void commitText(Canvas canvas) { Text cur = curText; boolean isNew = isTextNew; String newText = field.getText(); if (cur == null) { return; } cancelText(canvas); if (isNew) { if (!newText.equals("")) { cur.setText(newText); canvas.doAction(new ModelAddAction(canvas.getModel(), cur)); } } else { String oldText = cur.getText(); if (newText.equals("")) { canvas.doAction(new ModelRemoveAction(canvas.getModel(), cur)); } else if (!oldText.equals(newText)) { canvas.doAction(new ModelEditTextAction(canvas.getModel(), cur, newText)); } } } } logisim-2.7.1/src/com/cburch/draw/tools/SelectTool.java0000644000175000017500000003327411450405542022723 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.tools; import java.awt.Color; import java.awt.Cursor; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; import javax.swing.Icon; import com.cburch.draw.actions.ModelMoveHandleAction; import com.cburch.draw.actions.ModelRemoveAction; import com.cburch.draw.actions.ModelTranslateAction; import com.cburch.draw.canvas.Canvas; import com.cburch.draw.canvas.Selection; import com.cburch.draw.model.CanvasModel; import com.cburch.draw.model.CanvasObject; import com.cburch.draw.model.Handle; import com.cburch.draw.model.HandleGesture; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Location; import com.cburch.logisim.util.GraphicsUtil; import com.cburch.logisim.util.Icons; public class SelectTool extends AbstractTool { private static final int IDLE = 0; private static final int MOVE_ALL = 1; private static final int RECT_SELECT = 2; private static final int RECT_TOGGLE = 3; private static final int MOVE_HANDLE = 4; private static final int DRAG_TOLERANCE = 2; private static final int HANDLE_SIZE = 8; private static final Color RECT_SELECT_BACKGROUND = new Color(0, 0, 0, 32); private int curAction; private List beforePressSelection; private Handle beforePressHandle; private Location dragStart; private Location dragEnd; private boolean dragEffective; private int lastMouseX; private int lastMouseY; private HandleGesture curGesture; public SelectTool() { curAction = IDLE; dragStart = Location.create(0, 0); dragEnd = dragStart; dragEffective = false; } @Override public Icon getIcon() { return Icons.getIcon("select.gif"); } @Override public Cursor getCursor(Canvas canvas) { return Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR); } @Override public List> getAttributes() { return Collections.emptyList(); } @Override public void toolSelected(Canvas canvas) { curAction = IDLE; canvas.getSelection().clearSelected(); repaintArea(canvas); } @Override public void toolDeselected(Canvas canvas) { curAction = IDLE; canvas.getSelection().clearSelected(); repaintArea(canvas); } private int getHandleSize(Canvas canvas) { double zoom = canvas.getZoomFactor(); return (int) Math.ceil(HANDLE_SIZE / Math.sqrt(zoom)); } @Override public void mousePressed(Canvas canvas, MouseEvent e) { beforePressSelection = new ArrayList(canvas.getSelection().getSelected()); beforePressHandle = canvas.getSelection().getSelectedHandle(); int mx = e.getX(); int my = e.getY(); boolean shift = (e.getModifiersEx() & MouseEvent.SHIFT_DOWN_MASK) != 0; dragStart = Location.create(mx, my); dragEffective = false; dragEnd = dragStart; lastMouseX = mx; lastMouseY = my; Selection selection = canvas.getSelection(); selection.setHandleSelected(null); // see whether user is pressing within an existing handle int halfSize = getHandleSize(canvas) / 2; CanvasObject clicked = null; for (CanvasObject shape : selection.getSelected()) { List handles = shape.getHandles(null); for (Handle han : handles) { int dx = han.getX() - mx; int dy = han.getY() - my; if (dx >= -halfSize && dx <= halfSize && dy >= -halfSize && dy <= halfSize) { if (shape.canMoveHandle(han)) { curAction = MOVE_HANDLE; curGesture = new HandleGesture(han, 0, 0, e.getModifiersEx()); repaintArea(canvas); return; } else if (clicked == null) { clicked = shape; } } } } // see whether the user is clicking within a shape if (clicked == null) { clicked = getObjectAt(canvas.getModel(), e.getX(), e.getY(), false); } if (clicked != null) { if (shift && selection.isSelected(clicked)) { selection.setSelected(clicked, false); curAction = IDLE; } else { if (!shift && !selection.isSelected(clicked)) { selection.clearSelected(); } selection.setSelected(clicked, true); selection.setMovingShapes(selection.getSelected(), 0, 0); curAction = MOVE_ALL; } repaintArea(canvas); return; } clicked = getObjectAt(canvas.getModel(), e.getX(), e.getY(), true); if (clicked != null && selection.isSelected(clicked)) { if (shift) { selection.setSelected(clicked, false); curAction = IDLE; } else { selection.setMovingShapes(selection.getSelected(), 0, 0); curAction = MOVE_ALL; } repaintArea(canvas); return; } if (shift) { curAction = RECT_TOGGLE; } else { selection.clearSelected(); curAction = RECT_SELECT; } repaintArea(canvas); } @Override public void cancelMousePress(Canvas canvas) { List before = beforePressSelection; Handle handle = beforePressHandle; beforePressSelection = null; beforePressHandle = null; if (before != null) { curAction = IDLE; Selection sel = canvas.getSelection(); sel.clearDrawsSuppressed(); sel.setMovingShapes(Collections.emptySet(), 0, 0); sel.clearSelected(); sel.setSelected(before, true); sel.setHandleSelected(handle); repaintArea(canvas); } } @Override public void mouseDragged(Canvas canvas, MouseEvent e) { setMouse(canvas, e.getX(), e.getY(), e.getModifiersEx()); } @Override public void mouseReleased(Canvas canvas, MouseEvent e) { beforePressSelection = null; beforePressHandle = null; setMouse(canvas, e.getX(), e.getY(), e.getModifiersEx()); CanvasModel model = canvas.getModel(); Selection selection = canvas.getSelection(); Set selected = selection.getSelected(); int action = curAction; curAction = IDLE; if (!dragEffective) { Location loc = dragEnd; CanvasObject o = getObjectAt(model, loc.getX(), loc.getY(), false); if (o != null) { Handle han = o.canDeleteHandle(loc); if (han != null) { selection.setHandleSelected(han); } else { han = o.canInsertHandle(loc); if (han != null) { selection.setHandleSelected(han); } } } } Location start = dragStart; int x1 = e.getX(); int y1 = e.getY(); switch (action) { case MOVE_ALL: Location moveDelta = selection.getMovingDelta(); if (dragEffective && !moveDelta.equals(Location.create(0, 0))) { canvas.doAction(new ModelTranslateAction(model, selected, moveDelta.getX(), moveDelta.getY())); } break; case MOVE_HANDLE: HandleGesture gesture = curGesture; curGesture = null; if (dragEffective && gesture != null) { ModelMoveHandleAction act; act = new ModelMoveHandleAction(model, gesture); canvas.doAction(act); Handle result = act.getNewHandle(); if (result != null) { Handle h = result.getObject().canDeleteHandle(result.getLocation()); selection.setHandleSelected(h); } } break; case RECT_SELECT: if (dragEffective) { Bounds bds = Bounds.create(start).add(x1, y1); selection.setSelected(canvas.getModel().getObjectsIn(bds), true); } else { CanvasObject clicked; clicked = getObjectAt(model, start.getX(), start.getY(), true); if (clicked != null) { selection.clearSelected(); selection.setSelected(clicked, true); } } break; case RECT_TOGGLE: if (dragEffective) { Bounds bds = Bounds.create(start).add(x1, y1); selection.toggleSelected(canvas.getModel().getObjectsIn(bds)); } else { CanvasObject clicked; clicked = getObjectAt(model, start.getX(), start.getY(), true); selection.setSelected(clicked, !selected.contains(clicked)); } break; } selection.clearDrawsSuppressed(); repaintArea(canvas); } @Override public void keyPressed(Canvas canvas, KeyEvent e) { int code = e.getKeyCode(); if ((code == KeyEvent.VK_SHIFT || code == KeyEvent.VK_CONTROL || code == KeyEvent.VK_ALT) && curAction != IDLE) { setMouse(canvas, lastMouseX, lastMouseY, e.getModifiersEx()); } } @Override public void keyReleased(Canvas canvas, KeyEvent e) { keyPressed(canvas, e); } @Override public void keyTyped(Canvas canvas, KeyEvent e) { char ch = e.getKeyChar(); Selection selected = canvas.getSelection(); if ((ch == '\u0008' || ch == '\u007F') && !selected.isEmpty()) { ArrayList toRemove = new ArrayList(); for (CanvasObject shape : selected.getSelected()) { if (shape.canRemove()) { toRemove.add(shape); } } if (!toRemove.isEmpty()) { e.consume(); CanvasModel model = canvas.getModel(); canvas.doAction(new ModelRemoveAction(model, toRemove)); selected.clearSelected(); repaintArea(canvas); } } else if (ch == '\u001b' && !selected.isEmpty()) { selected.clearSelected(); repaintArea(canvas); } } private void setMouse(Canvas canvas, int mx, int my, int mods) { lastMouseX = mx; lastMouseY = my; boolean shift = (mods & MouseEvent.SHIFT_DOWN_MASK) != 0; boolean ctrl = (mods & InputEvent.CTRL_DOWN_MASK) != 0; Location newEnd = Location.create(mx, my); dragEnd = newEnd; Location start = dragStart; int dx = newEnd.getX() - start.getX(); int dy = newEnd.getY() - start.getY(); if (!dragEffective) { if (Math.abs(dx) + Math.abs(dy) > DRAG_TOLERANCE) { dragEffective = true; } else { return; } } switch (curAction) { case MOVE_HANDLE: HandleGesture gesture = curGesture; if (ctrl) { Handle h = gesture.getHandle(); dx = canvas.snapX(h.getX() + dx) - h.getX(); dy = canvas.snapY(h.getY() + dy) - h.getY(); } curGesture = new HandleGesture(gesture.getHandle(), dx, dy, mods); canvas.getSelection().setHandleGesture(curGesture); break; case MOVE_ALL: if (ctrl) { int minX = Integer.MAX_VALUE; int minY = Integer.MAX_VALUE; for (CanvasObject o : canvas.getSelection().getSelected()) { for (Handle handle : o.getHandles(null)) { int x = handle.getX(); int y = handle.getY(); if (x < minX) minX = x; if (y < minY) minY = y; } } dx = canvas.snapX(minX + dx) - minX; dy = canvas.snapY(minY + dy) - minY; } if (shift) { if (Math.abs(dx) > Math.abs(dy)) { dy = 0; } else { dx = 0; } } canvas.getSelection().setMovingDelta(dx, dy); break; } repaintArea(canvas); } private void repaintArea(Canvas canvas) { canvas.repaint(); } @Override public void draw(Canvas canvas, Graphics g) { Selection selection = canvas.getSelection(); int action = curAction; Location start = dragStart; Location end = dragEnd; HandleGesture gesture = null; boolean drawHandles; switch (action) { case MOVE_ALL: drawHandles = !dragEffective; break; case MOVE_HANDLE: drawHandles = !dragEffective; if (dragEffective) gesture = curGesture; break; default: drawHandles = true; } CanvasObject moveHandleObj = null; if (gesture != null) moveHandleObj = gesture.getHandle().getObject(); if (drawHandles) { // unscale the coordinate system so that the stroke width isn't scaled double zoom = 1.0; Graphics gCopy = g.create(); if (gCopy instanceof Graphics2D) { zoom = canvas.getZoomFactor(); if (zoom != 1.0) { ((Graphics2D) gCopy).scale(1.0 / zoom, 1.0 / zoom); } } GraphicsUtil.switchToWidth(gCopy, 1); int size = (int) Math.ceil(HANDLE_SIZE * Math.sqrt(zoom)); int offs = size / 2; for (CanvasObject obj : selection.getSelected()) { List handles; if (action == MOVE_HANDLE && obj == moveHandleObj) { handles = obj.getHandles(gesture); } else { handles = obj.getHandles(null); } for (Handle han : handles) { int x = han.getX(); int y = han.getY(); if (action == MOVE_ALL && dragEffective) { Location delta = selection.getMovingDelta(); x += delta.getX(); y += delta.getY(); } x = (int) Math.round(zoom * x); y = (int) Math.round(zoom * y); gCopy.clearRect(x - offs, y - offs, size, size); gCopy.drawRect(x - offs, y - offs, size, size); } } Handle selHandle = selection.getSelectedHandle(); if (selHandle != null) { int x = selHandle.getX(); int y = selHandle.getY(); if (action == MOVE_ALL && dragEffective) { Location delta = selection.getMovingDelta(); x += delta.getX(); y += delta.getY(); } x = (int) Math.round(zoom * x); y = (int) Math.round(zoom * y); int[] xs = { x - offs, x, x + offs, x }; int[] ys = { y, y - offs, y, y + offs }; gCopy.setColor(Color.WHITE); gCopy.fillPolygon(xs, ys, 4); gCopy.setColor(Color.BLACK); gCopy.drawPolygon(xs, ys, 4); } } switch (action) { case RECT_SELECT: case RECT_TOGGLE: if (dragEffective) { // find rectangle currently to show int x0 = start.getX(); int y0 = start.getY(); int x1 = end.getX(); int y1 = end.getY(); if (x1 < x0) { int t = x0; x0 = x1; x1 = t; } if (y1 < y0) { int t = y0; y0 = y1; y1 = t; } // make the region that's not being selected darker int w = canvas.getWidth(); int h = canvas.getHeight(); g.setColor(RECT_SELECT_BACKGROUND); g.fillRect(0, 0, w, y0); g.fillRect(0, y0, x0, y1 - y0); g.fillRect(x1, y0, w - x1, y1 - y0); g.fillRect(0, y1, w, h - y1); // now draw the rectangle g.setColor(Color.GRAY); g.drawRect(x0, y0, x1 - x0, y1 - y0); } break; } } private static CanvasObject getObjectAt(CanvasModel model, int x, int y, boolean assumeFilled) { Location loc = Location.create(x, y); for (CanvasObject o : model.getObjectsFromTop()) { if (o.contains(loc, assumeFilled)) return o; } return null; } } logisim-2.7.1/src/com/cburch/draw/tools/RoundRectangleTool.java0000644000175000017500000000260611446034576024425 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.tools; import java.awt.Graphics; import java.util.List; import javax.swing.Icon; import com.cburch.draw.model.CanvasObject; import com.cburch.draw.shapes.DrawAttr; import com.cburch.draw.shapes.RoundRectangle; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.util.Icons; public class RoundRectangleTool extends RectangularTool { private DrawingAttributeSet attrs; public RoundRectangleTool(DrawingAttributeSet attrs) { this.attrs = attrs; } @Override public Icon getIcon() { return Icons.getIcon("drawrrct.gif"); } @Override public List> getAttributes() { return DrawAttr.getRoundRectAttributes(attrs.getValue(DrawAttr.PAINT_TYPE)); } @Override public CanvasObject createShape(int x, int y, int w, int h) { return attrs.applyTo(new RoundRectangle(x, y, w, h)); } @Override public void drawShape(Graphics g, int x, int y, int w, int h) { int r = 2 * attrs.getValue(DrawAttr.CORNER_RADIUS).intValue(); g.drawRoundRect(x, y, w, h, r, r); } @Override public void fillShape(Graphics g, int x, int y, int w, int h) { int r = 2 * attrs.getValue(DrawAttr.CORNER_RADIUS).intValue(); g.fillRoundRect(x, y, w, h, r, r); } } logisim-2.7.1/src/com/cburch/draw/tools/RectangularTool.java0000644000175000017500000001145311453524012023743 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.tools; import java.awt.Color; import java.awt.Cursor; import java.awt.Graphics; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import com.cburch.draw.actions.ModelAddAction; import com.cburch.draw.canvas.Canvas; import com.cburch.draw.model.CanvasModel; import com.cburch.draw.model.CanvasObject; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Location; abstract class RectangularTool extends AbstractTool { private boolean active; private Location dragStart; private int lastMouseX; private int lastMouseY; private Bounds currentBounds; public RectangularTool() { active = false; currentBounds = Bounds.EMPTY_BOUNDS; } public abstract CanvasObject createShape(int x, int y, int w, int h); public abstract void drawShape(Graphics g, int x, int y, int w, int h); public abstract void fillShape(Graphics g, int x, int y, int w, int h); @Override public Cursor getCursor(Canvas canvas) { return Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR); } @Override public void toolDeselected(Canvas canvas) { Bounds bds = currentBounds; active = false; repaintArea(canvas, bds); } @Override public void mousePressed(Canvas canvas, MouseEvent e) { Location loc = Location.create(e.getX(), e.getY()); Bounds bds = Bounds.create(loc); dragStart = loc; lastMouseX = loc.getX(); lastMouseY = loc.getY(); active = canvas.getModel() != null; repaintArea(canvas, bds); } @Override public void mouseDragged(Canvas canvas, MouseEvent e) { updateMouse(canvas, e.getX(), e.getY(), e.getModifiersEx()); } @Override public void mouseReleased(Canvas canvas, MouseEvent e) { if (active) { Bounds oldBounds = currentBounds; Bounds bds = computeBounds(canvas, e.getX(), e.getY(), e.getModifiersEx()); currentBounds = Bounds.EMPTY_BOUNDS; active = false; CanvasObject add = null; if (bds.getWidth() != 0 && bds.getHeight() != 0) { CanvasModel model = canvas.getModel(); add = createShape(bds.getX(), bds.getY(), bds.getWidth(), bds.getHeight()); canvas.doAction(new ModelAddAction(model, add)); repaintArea(canvas, oldBounds.add(bds)); } canvas.toolGestureComplete(this, add); } } @Override public void keyPressed(Canvas canvas, KeyEvent e) { int code = e.getKeyCode(); if (active && (code == KeyEvent.VK_SHIFT || code == KeyEvent.VK_ALT || code == KeyEvent.VK_CONTROL)) { updateMouse(canvas, lastMouseX, lastMouseY, e.getModifiersEx()); } } @Override public void keyReleased(Canvas canvas, KeyEvent e) { keyPressed(canvas, e); } private void updateMouse(Canvas canvas, int mx, int my, int mods) { Bounds oldBounds = currentBounds; Bounds bds = computeBounds(canvas, mx, my, mods); if (!bds.equals(oldBounds)) { currentBounds = bds; repaintArea(canvas, oldBounds.add(bds)); } } private Bounds computeBounds(Canvas canvas, int mx, int my, int mods) { lastMouseX = mx; lastMouseY = my; if (!active) { return Bounds.EMPTY_BOUNDS; } else { Location start = dragStart; int x0 = start.getX(); int y0 = start.getY(); int x1 = mx; int y1 = my; if (x0 == x1 && y0 == y1) { return Bounds.EMPTY_BOUNDS; } boolean ctrlDown = (mods & MouseEvent.CTRL_DOWN_MASK) != 0; if (ctrlDown) { x0 = canvas.snapX(x0); y0 = canvas.snapY(y0); x1 = canvas.snapX(x1); y1 = canvas.snapY(y1); } boolean altDown = (mods & MouseEvent.ALT_DOWN_MASK) != 0; boolean shiftDown = (mods & MouseEvent.SHIFT_DOWN_MASK) != 0; if (altDown) { if (shiftDown) { int r = Math.min(Math.abs(x0 - x1), Math.abs(y0 - y1)); x1 = x0 + r; y1 = y0 + r; x0 -= r; y0 -= r; } else { x0 = x0 - (x1 - x0); y0 = y0 - (y1 - y0); } } else { if (shiftDown) { int r = Math.min(Math.abs(x0 - x1), Math.abs(y0 - y1)); y1 = y1 < y0 ? y0 - r : y0 + r; x1 = x1 < x0 ? x0 - r : x0 + r; } } int x = x0; int y = y0; int w = x1 - x0; int h = y1 - y0; if (w < 0) { x = x1; w = -w; } if (h < 0) { y = y1; h = -h; } return Bounds.create(x, y, w, h); } } private void repaintArea(Canvas canvas, Bounds bds) { canvas.repaint(); /* The below doesn't work because Java doesn't deal correctly with stroke * widths that go outside the clip area canvas.repaintCanvasCoords(bds.getX() - 10, bds.getY() - 10, bds.getWidth() + 20, bds.getHeight() + 20); */ } @Override public void draw(Canvas canvas, Graphics g) { Bounds bds = currentBounds; if (active && bds != null && bds != Bounds.EMPTY_BOUNDS) { g.setColor(Color.GRAY); drawShape(g, bds.getX(), bds.getY(), bds.getWidth(), bds.getHeight()); } } } logisim-2.7.1/src/com/cburch/draw/tools/RectangleTool.java0000644000175000017500000000232411446034576023412 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.tools; import java.awt.Graphics; import java.util.List; import javax.swing.Icon; import com.cburch.draw.model.CanvasObject; import com.cburch.draw.shapes.DrawAttr; import com.cburch.draw.shapes.Rectangle; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.util.Icons; public class RectangleTool extends RectangularTool { private DrawingAttributeSet attrs; public RectangleTool(DrawingAttributeSet attrs) { this.attrs = attrs; } @Override public Icon getIcon() { return Icons.getIcon("drawrect.gif"); } @Override public List> getAttributes() { return DrawAttr.getFillAttributes(attrs.getValue(DrawAttr.PAINT_TYPE)); } @Override public CanvasObject createShape(int x, int y, int w, int h) { return attrs.applyTo(new Rectangle(x, y, w, h)); } @Override public void drawShape(Graphics g, int x, int y, int w, int h) { g.drawRect(x, y, w, h); } @Override public void fillShape(Graphics g, int x, int y, int w, int h) { g.fillRect(x, y, w, h); } } logisim-2.7.1/src/com/cburch/draw/tools/PolyTool.java0000644000175000017500000001336011447117152022424 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.tools; import java.awt.Color; import java.awt.Cursor; import java.awt.Graphics; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.List; import javax.swing.Icon; import com.cburch.draw.actions.ModelAddAction; import com.cburch.draw.canvas.Canvas; import com.cburch.draw.model.CanvasModel; import com.cburch.draw.model.CanvasObject; import com.cburch.draw.shapes.DrawAttr; import com.cburch.draw.shapes.LineUtil; import com.cburch.draw.shapes.Poly; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.Location; import com.cburch.logisim.util.Icons; public class PolyTool extends AbstractTool { // how close we need to be to the start point to count as "closing the loop" private static final int CLOSE_TOLERANCE = 2; private boolean closed; // whether we are drawing polygons or polylines private DrawingAttributeSet attrs; private boolean active; private ArrayList locations; private boolean mouseDown; private int lastMouseX; private int lastMouseY; public PolyTool(boolean closed, DrawingAttributeSet attrs) { this.closed = closed; this.attrs = attrs; active = false; locations = new ArrayList(); } @Override public Icon getIcon() { if (closed) { return Icons.getIcon("drawpoly.gif"); } else { return Icons.getIcon("drawplin.gif"); } } @Override public List> getAttributes() { return DrawAttr.getFillAttributes(attrs.getValue(DrawAttr.PAINT_TYPE)); } @Override public Cursor getCursor(Canvas canvas) { return Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR); } @Override public void toolDeselected(Canvas canvas) { CanvasObject add = commit(canvas); canvas.toolGestureComplete(this, add); repaintArea(canvas); } @Override public void mousePressed(Canvas canvas, MouseEvent e) { int mx = e.getX(); int my = e.getY(); lastMouseX = mx; lastMouseY = my; int mods = e.getModifiersEx(); if ((mods & InputEvent.CTRL_DOWN_MASK) != 0) { mx = canvas.snapX(mx); my = canvas.snapY(my); } if (active && e.getClickCount() > 1) { CanvasObject add = commit(canvas); canvas.toolGestureComplete(this, add); return; } Location loc = Location.create(mx, my); ArrayList locs = locations; if (!active) { locs.clear(); locs.add(loc); } locs.add(loc); mouseDown = true; active = canvas.getModel() != null; repaintArea(canvas); } @Override public void mouseDragged(Canvas canvas, MouseEvent e) { updateMouse(canvas, e.getX(), e.getY(), e.getModifiersEx()); } @Override public void mouseReleased(Canvas canvas, MouseEvent e) { if (active) { updateMouse(canvas, e.getX(), e.getY(), e.getModifiersEx()); mouseDown = false; int size = locations.size(); if (size >= 3) { Location first = locations.get(0); Location last = locations.get(size - 1); if (first.manhattanDistanceTo(last) <= CLOSE_TOLERANCE) { locations.remove(size - 1); CanvasObject add = commit(canvas); canvas.toolGestureComplete(this, add); } } } } @Override public void keyPressed(Canvas canvas, KeyEvent e) { int code = e.getKeyCode(); if (active && mouseDown && (code == KeyEvent.VK_SHIFT || code == KeyEvent.VK_CONTROL)) { updateMouse(canvas, lastMouseX, lastMouseY, e.getModifiersEx()); } } @Override public void keyReleased(Canvas canvas, KeyEvent e) { keyPressed(canvas, e); } @Override public void keyTyped(Canvas canvas, KeyEvent e) { if (active) { char ch = e.getKeyChar(); if (ch == '\u001b') { // escape key active = false; locations.clear(); repaintArea(canvas); canvas.toolGestureComplete(this, null); } else if (ch == '\n') { // enter key CanvasObject add = commit(canvas); canvas.toolGestureComplete(this, add); } } } private CanvasObject commit(Canvas canvas) { if (!active) return null; CanvasObject add = null; active = false; ArrayList locs = locations; for(int i = locs.size() - 2; i >= 0; i--) { if (locs.get(i).equals(locs.get(i + 1))) locs.remove(i); } if (locs.size() > 1) { CanvasModel model = canvas.getModel(); add = new Poly(closed, locs); canvas.doAction(new ModelAddAction(model, add)); repaintArea(canvas); } locs.clear(); return add; } private void updateMouse(Canvas canvas, int mx, int my, int mods) { lastMouseX = mx; lastMouseY = my; if (active) { int index = locations.size() - 1; Location last = locations.get(index); Location newLast; if ((mods & MouseEvent.SHIFT_DOWN_MASK) != 0 && index > 0) { Location nextLast = locations.get(index - 1); newLast = LineUtil.snapTo8Cardinals(nextLast, mx, my); } else { newLast = Location.create(mx, my); } if ((mods & MouseEvent.CTRL_DOWN_MASK) != 0) { int lastX = newLast.getX(); int lastY = newLast.getY(); lastX = canvas.snapX(lastX); lastY = canvas.snapY(lastY); newLast = Location.create(lastX, lastY); } if (!newLast.equals(last)) { locations.set(index, newLast); repaintArea(canvas); } } } private void repaintArea(Canvas canvas) { canvas.repaint(); } @Override public void draw(Canvas canvas, Graphics g) { if (active) { g.setColor(Color.GRAY); int size = locations.size(); int[] xs = new int[size]; int[] ys = new int[size]; for(int i = 0; i < size; i++) { Location loc = locations.get(i); xs[i] = loc.getX(); ys[i] = loc.getY(); } g.drawPolyline(xs, ys, size); int lastX = xs[xs.length - 1]; int lastY = ys[ys.length - 1]; g.fillOval(lastX - 2, lastY - 2, 4, 4); } } } logisim-2.7.1/src/com/cburch/draw/tools/OvalTool.java0000644000175000017500000000227711446034576022416 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.tools; import java.awt.Graphics; import java.util.List; import javax.swing.Icon; import com.cburch.draw.model.CanvasObject; import com.cburch.draw.shapes.DrawAttr; import com.cburch.draw.shapes.Oval; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.util.Icons; public class OvalTool extends RectangularTool { private DrawingAttributeSet attrs; public OvalTool(DrawingAttributeSet attrs) { this.attrs = attrs; } @Override public Icon getIcon() { return Icons.getIcon("drawoval.gif"); } @Override public List> getAttributes() { return DrawAttr.getFillAttributes(attrs.getValue(DrawAttr.PAINT_TYPE)); } @Override public CanvasObject createShape(int x, int y, int w, int h) { return attrs.applyTo(new Oval(x, y, w, h)); } @Override public void drawShape(Graphics g, int x, int y, int w, int h) { g.drawOval(x, y, w, h); } @Override public void fillShape(Graphics g, int x, int y, int w, int h) { g.fillOval(x, y, w, h); } } logisim-2.7.1/src/com/cburch/draw/tools/LineTool.java0000644000175000017500000001052411450405552022365 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.tools; import java.awt.Color; import java.awt.Cursor; import java.awt.Graphics; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import java.util.List; import javax.swing.Icon; import com.cburch.draw.actions.ModelAddAction; import com.cburch.draw.canvas.Canvas; import com.cburch.draw.model.CanvasModel; import com.cburch.draw.model.CanvasObject; import com.cburch.draw.shapes.DrawAttr; import com.cburch.draw.shapes.LineUtil; import com.cburch.draw.shapes.Poly; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.Location; import com.cburch.logisim.util.Icons; import com.cburch.logisim.util.UnmodifiableList; public class LineTool extends AbstractTool { private DrawingAttributeSet attrs; private boolean active; private Location mouseStart; private Location mouseEnd; private int lastMouseX; private int lastMouseY; public LineTool(DrawingAttributeSet attrs) { this.attrs = attrs; active = false; } @Override public Icon getIcon() { return Icons.getIcon("drawline.gif"); } @Override public Cursor getCursor(Canvas canvas) { return Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR); } @Override public List> getAttributes() { return DrawAttr.ATTRS_STROKE; } @Override public void toolDeselected(Canvas canvas) { active = false; repaintArea(canvas); } @Override public void mousePressed(Canvas canvas, MouseEvent e) { int x = e.getX(); int y = e.getY(); int mods = e.getModifiersEx(); if ((mods & InputEvent.CTRL_DOWN_MASK) != 0) { x = canvas.snapX(x); y = canvas.snapY(y); } Location loc = Location.create(x, y); mouseStart = loc; mouseEnd = loc; lastMouseX = loc.getX(); lastMouseY = loc.getY(); active = canvas.getModel() != null; repaintArea(canvas); } @Override public void mouseDragged(Canvas canvas, MouseEvent e) { updateMouse(canvas, e.getX(), e.getY(), e.getModifiersEx()); } @Override public void mouseReleased(Canvas canvas, MouseEvent e) { if (active) { updateMouse(canvas, e.getX(), e.getY(), e.getModifiersEx()); Location start = mouseStart; Location end = mouseEnd; CanvasObject add = null; if (!start.equals(end)) { active = false; CanvasModel model = canvas.getModel(); Location[] ends = { start, end }; List locs = UnmodifiableList.create(ends); add = attrs.applyTo(new Poly(false, locs)); add.setValue(DrawAttr.PAINT_TYPE, DrawAttr.PAINT_STROKE); canvas.doAction(new ModelAddAction(model, add)); repaintArea(canvas); } canvas.toolGestureComplete(this, add); } } @Override public void keyPressed(Canvas canvas, KeyEvent e) { int code = e.getKeyCode(); if (active && (code == KeyEvent.VK_SHIFT || code == KeyEvent.VK_CONTROL)) { updateMouse(canvas, lastMouseX, lastMouseY, e.getModifiersEx()); } } @Override public void keyReleased(Canvas canvas, KeyEvent e) { keyPressed(canvas, e); } private void updateMouse(Canvas canvas, int mx, int my, int mods) { if (active) { boolean shift = (mods & MouseEvent.SHIFT_DOWN_MASK) != 0; Location newEnd; if (shift) { newEnd = LineUtil.snapTo8Cardinals(mouseStart, mx, my); } else { newEnd = Location.create(mx, my); } if ((mods & InputEvent.CTRL_DOWN_MASK) != 0) { int x = newEnd.getX(); int y = newEnd.getY(); x = canvas.snapX(x); y = canvas.snapY(y); newEnd = Location.create(x, y); } if (!newEnd.equals(mouseEnd)) { mouseEnd = newEnd; repaintArea(canvas); } } lastMouseX = mx; lastMouseY = my; } private void repaintArea(Canvas canvas) { canvas.repaint(); } @Override public void draw(Canvas canvas, Graphics g) { if (active) { Location start = mouseStart; Location end = mouseEnd; g.setColor(Color.GRAY); g.drawLine(start.getX(), start.getY(), end.getX(), end.getY()); } } static Location snapTo4Cardinals(Location from, int mx, int my) { int px = from.getX(); int py = from.getY(); if (mx != px && my != py) { if (Math.abs(my - py) < Math.abs(mx - px)) { return Location.create(mx, py); } else { return Location.create(px, my); } } return Location.create(mx, my); // should never happen } } logisim-2.7.1/src/com/cburch/draw/tools/DrawingAttributeSet.java0000644000175000017500000001412311541271666024602 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.tools; import com.cburch.draw.model.CanvasObject; import com.cburch.draw.model.AbstractCanvasObject; import com.cburch.draw.shapes.DrawAttr; import com.cburch.logisim.data.AbstractAttributeSet; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeEvent; import com.cburch.logisim.data.AttributeListener; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.util.EventSourceWeakSupport; import com.cburch.logisim.util.UnmodifiableList; import java.awt.Color; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.ListIterator; public class DrawingAttributeSet implements AttributeSet, Cloneable { static final List> ATTRS_ALL = UnmodifiableList.create(new Attribute[] { DrawAttr.FONT, DrawAttr.ALIGNMENT, DrawAttr.PAINT_TYPE, DrawAttr.STROKE_WIDTH, DrawAttr.STROKE_COLOR, DrawAttr.FILL_COLOR, DrawAttr.TEXT_DEFAULT_FILL, DrawAttr.CORNER_RADIUS }); static final List DEFAULTS_ALL = Arrays.asList(new Object[] { DrawAttr.DEFAULT_FONT, DrawAttr.ALIGN_CENTER, DrawAttr.PAINT_STROKE, Integer.valueOf(1), Color.BLACK, Color.WHITE, Color.BLACK, Integer.valueOf(10) }); private class Restriction extends AbstractAttributeSet implements AttributeListener { private AbstractTool tool; private List> selectedAttrs; private List> selectedView; Restriction(AbstractTool tool) { this.tool = tool; updateAttributes(); } private void updateAttributes() { List> toolAttrs; if (tool == null) { toolAttrs = Collections.emptyList(); } else { toolAttrs = tool.getAttributes(); } if (!toolAttrs.equals(selectedAttrs)) { selectedAttrs = new ArrayList>(toolAttrs); selectedView = Collections.unmodifiableList(selectedAttrs); DrawingAttributeSet.this.addAttributeListener(this); fireAttributeListChanged(); } } @Override protected void copyInto(AbstractAttributeSet dest) { DrawingAttributeSet.this.addAttributeListener(this); } @Override public List> getAttributes() { return selectedView; } @Override public V getValue(Attribute attr) { return DrawingAttributeSet.this.getValue(attr); } @Override public void setValue(Attribute attr, V value) { DrawingAttributeSet.this.setValue(attr, value); updateAttributes(); } // // AttributeListener methods // public void attributeListChanged(AttributeEvent e) { fireAttributeListChanged(); } public void attributeValueChanged(AttributeEvent e) { if (selectedAttrs.contains(e.getAttribute())) { @SuppressWarnings("unchecked") Attribute attr = (Attribute) e.getAttribute(); fireAttributeValueChanged(attr, e.getValue()); } updateAttributes(); } } private EventSourceWeakSupport listeners; private List> attrs; private List values; public DrawingAttributeSet() { listeners = new EventSourceWeakSupport(); attrs = ATTRS_ALL; values = DEFAULTS_ALL; } public AttributeSet createSubset(AbstractTool tool) { return new Restriction(tool); } public void addAttributeListener(AttributeListener l) { listeners.add(l); } public void removeAttributeListener(AttributeListener l) { listeners.remove(l); } @Override public Object clone() { try { DrawingAttributeSet ret = (DrawingAttributeSet) super.clone(); ret.listeners = new EventSourceWeakSupport(); ret.values = new ArrayList(this.values); return ret; } catch (CloneNotSupportedException e) { return null; } } public List> getAttributes() { return attrs; } public boolean containsAttribute(Attribute attr) { return attrs.contains(attr); } public Attribute getAttribute(String name) { for (Attribute attr : attrs) { if (attr.getName().equals(name)) return attr; } return null; } public boolean isReadOnly(Attribute attr) { return false; } public void setReadOnly(Attribute attr, boolean value) { throw new UnsupportedOperationException("setReadOnly"); } public boolean isToSave(Attribute attr) { return true; } public V getValue(Attribute attr) { Iterator> ait = attrs.iterator(); Iterator vit = values.iterator(); while (ait.hasNext()) { Object a = ait.next(); Object v = vit.next(); if (a.equals(attr)) { @SuppressWarnings("unchecked") V ret = (V) v; return ret; } } return null; } public void setValue(Attribute attr, V value) { Iterator> ait = attrs.iterator(); ListIterator vit = values.listIterator(); while (ait.hasNext()) { Object a = ait.next(); vit.next(); if (a.equals(attr)) { vit.set(value); AttributeEvent e = new AttributeEvent(this, attr, value); for (AttributeListener listener : listeners) { listener.attributeValueChanged(e); } if (attr == DrawAttr.PAINT_TYPE) { e = new AttributeEvent(this); for (AttributeListener listener : listeners) { listener.attributeListChanged(e); } } return; } } throw new IllegalArgumentException(attr.toString()); } public E applyTo(E drawable) { AbstractCanvasObject d = (AbstractCanvasObject) drawable; // use a for(i...) loop since the attribute list may change as we go on for (int i = 0; i < d.getAttributes().size(); i++) { Attribute attr = d.getAttributes().get(i); @SuppressWarnings("unchecked") Attribute a = (Attribute) attr; if (attr == DrawAttr.FILL_COLOR && this.containsAttribute(DrawAttr.TEXT_DEFAULT_FILL)) { d.setValue(a, this.getValue(DrawAttr.TEXT_DEFAULT_FILL)); } else if (this.containsAttribute(a)) { Object value = this.getValue(a); d.setValue(a, value); } } return drawable; } } logisim-2.7.1/src/com/cburch/draw/tools/CurveTool.java0000644000175000017500000001276111446663006022574 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.tools; import java.awt.Color; import java.awt.Cursor; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import java.util.List; import javax.swing.Icon; import com.cburch.draw.actions.ModelAddAction; import com.cburch.draw.canvas.Canvas; import com.cburch.draw.model.CanvasModel; import com.cburch.draw.shapes.Curve; import com.cburch.draw.shapes.CurveUtil; import com.cburch.draw.shapes.DrawAttr; import com.cburch.draw.shapes.LineUtil; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.Location; import com.cburch.logisim.util.Icons; public class CurveTool extends AbstractTool { private static final int BEFORE_CREATION = 0; private static final int ENDPOINT_DRAG = 1; private static final int CONTROL_DRAG = 2; private DrawingAttributeSet attrs; private int state; private Location end0; private Location end1; private Curve curCurve; private boolean mouseDown; private int lastMouseX; private int lastMouseY; public CurveTool(DrawingAttributeSet attrs) { this.attrs = attrs; state = BEFORE_CREATION; mouseDown = false; } @Override public Icon getIcon() { return Icons.getIcon("drawcurv.gif"); } @Override public Cursor getCursor(Canvas canvas) { return Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR); } @Override public void toolDeselected(Canvas canvas) { state = BEFORE_CREATION; repaintArea(canvas); } @Override public void mousePressed(Canvas canvas, MouseEvent e) { int mx = e.getX(); int my = e.getY(); lastMouseX = mx; lastMouseY = my; mouseDown = true; int mods = e.getModifiersEx(); if ((mods & InputEvent.CTRL_DOWN_MASK) != 0) { mx = canvas.snapX(mx); my = canvas.snapY(my); } switch (state) { case BEFORE_CREATION: case CONTROL_DRAG: end0 = Location.create(mx, my); end1 = end0; state = ENDPOINT_DRAG; break; case ENDPOINT_DRAG: curCurve = new Curve(end0, end1, Location.create(mx, my)); state = CONTROL_DRAG; break; } repaintArea(canvas); } @Override public void mouseDragged(Canvas canvas, MouseEvent e) { updateMouse(canvas, e.getX(), e.getY(), e.getModifiersEx()); repaintArea(canvas); } @Override public void mouseReleased(Canvas canvas, MouseEvent e) { Curve c = updateMouse(canvas, e.getX(), e.getY(), e.getModifiersEx()); mouseDown = false; if (state == CONTROL_DRAG) { if (c != null) { attrs.applyTo(c); CanvasModel model = canvas.getModel(); canvas.doAction(new ModelAddAction(model, c)); canvas.toolGestureComplete(this, c); } state = BEFORE_CREATION; } repaintArea(canvas); } @Override public void keyPressed(Canvas canvas, KeyEvent e) { int code = e.getKeyCode(); if (mouseDown && (code == KeyEvent.VK_SHIFT || code == KeyEvent.VK_CONTROL || code == KeyEvent.VK_ALT)) { updateMouse(canvas, lastMouseX, lastMouseY, e.getModifiersEx()); repaintArea(canvas); } } @Override public void keyReleased(Canvas canvas, KeyEvent e) { keyPressed(canvas, e); } @Override public void keyTyped(Canvas canvas, KeyEvent e) { char ch = e.getKeyChar(); if (ch == '\u001b') { // escape key state = BEFORE_CREATION; repaintArea(canvas); canvas.toolGestureComplete(this, null); } } private Curve updateMouse(Canvas canvas, int mx, int my, int mods) { lastMouseX = mx; lastMouseY = my; boolean shiftDown = (mods & MouseEvent.SHIFT_DOWN_MASK) != 0; boolean ctrlDown = (mods & MouseEvent.CTRL_DOWN_MASK) != 0; boolean altDown = (mods & MouseEvent.ALT_DOWN_MASK) != 0; Curve ret = null; switch (state) { case ENDPOINT_DRAG: if (mouseDown) { if (shiftDown) { Location p = LineUtil.snapTo8Cardinals(end0, mx, my); mx = p.getX(); my = p.getY(); } if (ctrlDown) { mx = canvas.snapX(mx); my = canvas.snapY(my); } end1 = Location.create(mx, my); } break; case CONTROL_DRAG: if (mouseDown) { int cx = mx; int cy = my; if (ctrlDown) { cx = canvas.snapX(cx); cy = canvas.snapY(cy); } if (shiftDown) { double x0 = end0.getX(); double y0 = end0.getY(); double x1 = end1.getX(); double y1 = end1.getY(); double midx = (x0 + x1) / 2; double midy = (y0 + y1) / 2; double dx = x1 - x0; double dy = y1 - y0; double[] p = LineUtil.nearestPointInfinite(cx, cy, midx, midy, midx - dy, midy + dx); cx = (int) Math.round(p[0]); cy = (int) Math.round(p[1]); } if (altDown) { double[] e0 = { end0.getX(), end0.getY() }; double[] e1 = { end1.getX(), end1.getY() }; double[] mid = { cx, cy }; double[] ct = CurveUtil.interpolate(e0, e1, mid); cx = (int) Math.round(ct[0]); cy = (int) Math.round(ct[1]); } ret = new Curve(end0, end1, Location.create(cx, cy)); curCurve = ret; } break; } return ret; } private void repaintArea(Canvas canvas) { canvas.repaint(); } @Override public List> getAttributes() { return DrawAttr.getFillAttributes(attrs.getValue(DrawAttr.PAINT_TYPE)); } @Override public void draw(Canvas canvas, Graphics g) { g.setColor(Color.GRAY); switch (state) { case ENDPOINT_DRAG: g.drawLine(end0.getX(), end0.getY(), end1.getX(), end1.getY()); break; case CONTROL_DRAG: ((Graphics2D) g).draw(curCurve.getCurve2D()); break; } } } logisim-2.7.1/src/com/cburch/draw/tools/AbstractTool.java0000644000175000017500000000405711447117152023247 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.tools; import java.awt.Cursor; import java.awt.Graphics; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import java.util.List; import javax.swing.Icon; import com.cburch.draw.canvas.Canvas; import com.cburch.draw.canvas.CanvasTool; import com.cburch.logisim.data.Attribute; public abstract class AbstractTool extends CanvasTool { public static AbstractTool[] getTools(DrawingAttributeSet attrs) { return new AbstractTool[] { new SelectTool(), new LineTool(attrs), new CurveTool(attrs), new PolyTool(false, attrs), new RectangleTool(attrs), new RoundRectangleTool(attrs), new OvalTool(attrs), new PolyTool(true, attrs), }; } public abstract Icon getIcon(); public abstract List> getAttributes(); public String getDescription() { return null; } // // CanvasTool methods // @Override public abstract Cursor getCursor(Canvas canvas); @Override public void toolSelected(Canvas canvas) { } @Override public void toolDeselected(Canvas canvas) { } @Override public void mouseMoved(Canvas canvas, MouseEvent e) { } @Override public void mousePressed(Canvas canvas, MouseEvent e) { } @Override public void mouseDragged(Canvas canvas, MouseEvent e) { } @Override public void mouseReleased(Canvas canvas, MouseEvent e) { } @Override public void mouseEntered(Canvas canvas, MouseEvent e) { } @Override public void mouseExited(Canvas canvas, MouseEvent e) { } /** This is because a popup menu may result from the subsequent mouse release */ @Override public void cancelMousePress(Canvas canvas) { } @Override public void keyPressed(Canvas canvas, KeyEvent e) { } @Override public void keyReleased(Canvas canvas, KeyEvent e) { } @Override public void keyTyped(Canvas canvas, KeyEvent e) { } @Override public void draw(Canvas canvas, Graphics g) { } } logisim-2.7.1/src/com/cburch/draw/toolbar/0000755000175000017500000000000011446034600020272 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/draw/toolbar/ToolbarSeparator.java0000644000175000017500000000216411446034600024423 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.toolbar; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Graphics; public class ToolbarSeparator implements ToolbarItem { private int size; public ToolbarSeparator(int size) { this.size = size; } public boolean isSelectable() { return false; } public void paintIcon(Component destination, Graphics g) { Dimension dim = destination.getSize(); g.setColor(Color.GRAY); int x = 0; int y = 0; int w = dim.width; int h = dim.height; if (h >= w) { // separator is a vertical line in horizontal toolbar h -= 8; y = 2; x = (w - 2) / 2; w = 2; } else { // separator is a horizontal line in vertical toolbar w -= 8; x = 2; y = (h - 2) / 2; h = 2; } g.fillRect(x, y, w, h); } public String getToolTip() { return null; } public Dimension getDimension(Object orientation) { return new Dimension(size, size); } } logisim-2.7.1/src/com/cburch/draw/toolbar/ToolbarModelListener.java0000644000175000017500000000054711446034600025234 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.toolbar; public interface ToolbarModelListener { public void toolbarContentsChanged(ToolbarModelEvent event); public void toolbarAppearanceChanged(ToolbarModelEvent event); } logisim-2.7.1/src/com/cburch/draw/toolbar/ToolbarModelEvent.java0000644000175000017500000000053311446034600024523 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.toolbar; import java.util.EventObject; public class ToolbarModelEvent extends EventObject { public ToolbarModelEvent(ToolbarModel model) { super(model); } } logisim-2.7.1/src/com/cburch/draw/toolbar/ToolbarModel.java0000644000175000017500000000101411446034600023514 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.toolbar; import java.util.List; public interface ToolbarModel { public void addToolbarModelListener(ToolbarModelListener listener); public void removeToolbarModelListener(ToolbarModelListener listener); public List getItems(); public boolean isSelected(ToolbarItem item); public void itemSelected(ToolbarItem item); } logisim-2.7.1/src/com/cburch/draw/toolbar/ToolbarItem.java0000644000175000017500000000074311446034600023362 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.toolbar; import java.awt.Component; import java.awt.Dimension; import java.awt.Graphics; public interface ToolbarItem { public boolean isSelectable(); public void paintIcon(Component destination, Graphics g); public String getToolTip(); public Dimension getDimension(Object orientation); } logisim-2.7.1/src/com/cburch/draw/toolbar/ToolbarButton.java0000644000175000017500000000472611446034600023744 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.toolbar; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.JComponent; import com.cburch.logisim.util.GraphicsUtil; class ToolbarButton extends JComponent implements MouseListener { private static final int BORDER = 2; private Toolbar toolbar; private ToolbarItem item; ToolbarButton(Toolbar toolbar, ToolbarItem item) { this.toolbar = toolbar; this.item = item; addMouseListener(this); setFocusable(true); setToolTipText(""); } public ToolbarItem getItem() { return item; } @Override public Dimension getPreferredSize() { Dimension dim = item.getDimension(toolbar.getOrientation()); dim.width += 2 * BORDER; dim.height += 2 * BORDER; return dim; } @Override public Dimension getMinimumSize() { return getPreferredSize(); } @Override public void paintComponent(Graphics g) { if (toolbar.getPressed() == this) { Dimension dim = item.getDimension(toolbar.getOrientation()); Color defaultColor = g.getColor(); GraphicsUtil.switchToWidth(g, 2); g.setColor(Color.GRAY); g.fillRect(BORDER, BORDER, dim.width, dim.height); GraphicsUtil.switchToWidth(g, 1); g.setColor(defaultColor); } Graphics g2 = g.create(); g2.translate(BORDER, BORDER); item.paintIcon(ToolbarButton.this, g2); g2.dispose(); // draw selection indicator if (toolbar.getToolbarModel().isSelected(item)) { Dimension dim = item.getDimension(toolbar.getOrientation()); GraphicsUtil.switchToWidth(g, 2); g.setColor(Color.BLACK); g.drawRect(BORDER, BORDER, dim.width, dim.height); GraphicsUtil.switchToWidth(g, 1); } } @Override public String getToolTipText(MouseEvent e) { return item.getToolTip(); } public void mousePressed(MouseEvent e) { if (item != null && item.isSelectable()) { toolbar.setPressed(this); } } public void mouseReleased(MouseEvent e) { if (toolbar.getPressed() == this) { toolbar.getToolbarModel().itemSelected(item); toolbar.setPressed(null); } } public void mouseClicked(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { toolbar.setPressed(null); } } logisim-2.7.1/src/com/cburch/draw/toolbar/Toolbar.java0000644000175000017500000000527711446034600022552 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.toolbar; import java.awt.BorderLayout; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JPanel; public class Toolbar extends JPanel { public static final Object VERTICAL = new Object(); public static final Object HORIZONTAL = new Object(); private class MyListener implements ToolbarModelListener { public void toolbarAppearanceChanged(ToolbarModelEvent event) { repaint(); } public void toolbarContentsChanged(ToolbarModelEvent event) { computeContents(); } } private ToolbarModel model; private JPanel subpanel; private Object orientation; private MyListener myListener; private ToolbarButton curPressed; public Toolbar(ToolbarModel model) { super(new BorderLayout()); this.subpanel = new JPanel(); this.model = model; this.orientation = HORIZONTAL; this.myListener = new MyListener(); this.curPressed = null; this.add(new JPanel(), BorderLayout.CENTER); setOrientation(HORIZONTAL); computeContents(); if (model != null) model.addToolbarModelListener(myListener); } public ToolbarModel getToolbarModel() { return model; } public void setToolbarModel(ToolbarModel value) { ToolbarModel oldValue = model; if (value != oldValue) { if (oldValue != null) oldValue.removeToolbarModelListener(myListener); if (value != null) value.addToolbarModelListener(myListener); model = value; computeContents(); } } public void setOrientation(Object value) { int axis; String position; if (value == HORIZONTAL) { axis = BoxLayout.X_AXIS; position = BorderLayout.LINE_START; } else if (value == VERTICAL) { axis = BoxLayout.Y_AXIS; position = BorderLayout.NORTH; } else { throw new IllegalArgumentException(); } this.remove(subpanel); subpanel.setLayout(new BoxLayout(subpanel, axis)); this.add(subpanel, position); this.orientation = value; } private void computeContents() { subpanel.removeAll(); ToolbarModel m = model; if (m != null) { for (ToolbarItem item : m.getItems()) { subpanel.add(new ToolbarButton(this, item)); } subpanel.add(Box.createGlue()); } revalidate(); } ToolbarButton getPressed() { return curPressed; } void setPressed(ToolbarButton value) { ToolbarButton oldValue = curPressed; if (oldValue != value) { curPressed = value; if (oldValue != null) oldValue.repaint(); if (value != null) value.repaint(); } } Object getOrientation() { return orientation; } } logisim-2.7.1/src/com/cburch/draw/toolbar/AbstractToolbarModel.java0000644000175000017500000000262311446034600025207 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.toolbar; import com.cburch.draw.toolbar.ToolbarItem; import com.cburch.draw.toolbar.ToolbarModel; import com.cburch.draw.toolbar.ToolbarModelEvent; import com.cburch.draw.toolbar.ToolbarModelListener; import java.util.ArrayList; import java.util.List; public abstract class AbstractToolbarModel implements ToolbarModel { private List listeners; public AbstractToolbarModel() { listeners = new ArrayList(); } public void addToolbarModelListener(ToolbarModelListener listener) { listeners.add(listener); } public void removeToolbarModelListener(ToolbarModelListener listener) { listeners.remove(listener); } protected void fireToolbarContentsChanged() { ToolbarModelEvent event = new ToolbarModelEvent(this); for (ToolbarModelListener listener : listeners) { listener.toolbarContentsChanged(event); } } protected void fireToolbarAppearanceChanged() { ToolbarModelEvent event = new ToolbarModelEvent(this); for (ToolbarModelListener listener : listeners) { listener.toolbarAppearanceChanged(event); } } public abstract List getItems(); public abstract boolean isSelected(ToolbarItem item); public abstract void itemSelected(ToolbarItem item); } logisim-2.7.1/src/com/cburch/draw/shapes/0000755000175000017500000000000011751441134020116 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/draw/shapes/CurveUtil.java0000644000175000017500000001675611751441134022722 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.shapes; import com.cburch.logisim.data.Bounds; public class CurveUtil { private CurveUtil() { } /** * getBounds and findNearestPoint are based translated from the ActionScript * of Olivier Besson's Bezier class for collision detection. Code from: * http://blog.gludion.com/2009/08/distance-to-quadratic-bezier-curve.html */ // a value we consider "small enough" to equal it to zero: // (this is used for double solutions in 2nd or 3d degree equation) private static final double zeroMax = 0.0000001; // note: p0 and p2 are endpoints, p1 is control point public static Bounds getBounds(double[] p0, double[] p1, double[] p2) { double[] A = computeA(p0, p1); double[] B = computeB(p0, p1, p2); // rough evaluation of bounds: double xMin = Math.min(p0[0], Math.min(p1[0], p2[0])); double xMax = Math.max(p0[0], Math.max(p1[0], p2[0])); double yMin = Math.min(p0[1], Math.min(p1[1], p2[1])); double yMax = Math.max(p0[1], Math.max(p1[1], p2[1])); // more accurate evaluation: // see Andree Michelle for a faster but less readable method if (xMin == p1[0] || xMax == p1[0]) { double u = -A[0] / B[0]; // u where getTan(u)[0] == 0 u = (1 - u) * (1 - u) * p0[0] + 2 * u * (1 - u) * p1[0] + u * u * p2[0]; if (xMin == p1[0]) xMin = u; else xMax = u; } if (yMin == p1[1] || yMax == p1[1]) { double u = -A[1] / B[1]; // u where getTan(u)[1] == 0 u = (1 - u) * (1 - u) * p0[1] + 2 * u * (1 - u) * p1[1] + u * u * p2[1]; if (yMin == p1[1]) yMin = u; else yMax = u; } int x = (int) xMin; int y = (int) yMin; int w = (int) Math.ceil(xMax) - x; int h = (int) Math.ceil(yMax) - y; return Bounds.create(x, y, w, h); } private static double[] computeA(double[] p0, double[] p1) { return new double[] { p1[0] - p0[0], p1[1] - p0[1] }; } private static double[] computeB(double[] p0, double[] p1, double[] p2) { return new double[] { p0[0] - 2 * p1[0] + p2[0], p0[1] - 2 * p1[1] + p2[1] }; } // returns { t:Number, pos:Point, dist:Number, nor:Point } // (costs about 80 multiplications+additions) // note: p0 and p2 are endpoints, p1 is control point public static double[] findNearestPoint(double[] q, double[] p0, double[] p1, double[] p2) { double[] A = computeA(p0, p1); double[] B = computeB(p0, p1, p2); // a temporary util vect = p0 - (x,y) double[] pos = { p0[0] - q[0], p0[1] - q[1] }; // search points P of bezier curve with PM.(dP / dt) = 0 // a calculus leads to a 3d degree equation : double a = B[0] * B[0] + B[1] * B[1]; double b = 3 * (A[0] * B[0] + A[1] * B[1]); double c = 2 * (A[0] * A[0] + A[1] * A[1]) + pos[0] * B[0] + pos[1] * B[1]; double d = pos[0] * A[0] + pos[1] * A[1]; double[] roots = solveCubic(a, b, c, d); if (roots == null) return null; // find the closest point: double tMin = Double.MAX_VALUE; double dist2Min = Double.MAX_VALUE; double[] posMin = new double[2]; for (double root : roots) { double t; if (root < 0) { t = 0; } else if (root <= 1) { t = root; } else { t = 1; } getPos(pos, t, p0, p1, p2); double lx = q[0] - pos[0]; double ly = q[1] - pos[1]; double dist2 = lx * lx + ly * ly; if (dist2 < dist2Min) { // minimum found! tMin = root; dist2Min = dist2; posMin[0] = pos[0]; posMin[1] = pos[1]; } } if (tMin == Double.MAX_VALUE) { return null; } else { return posMin; } } private static void getPos(double[] result, double t, double[] p0, double[] p1, double[] p2) { double a = (1 - t) * (1 - t); double b = 2 * t * (1 - t); double c = t * t; result[0] = a * p0[0] + b * p1[0] + c * p2[0]; result[1] = a * p0[1] + b * p1[1] + c * p2[1]; } // a local duplicate & optimized version of com.gludion.utils.MathUtils.thirdDegreeEquation(a,b,c,d):Object //WARNING: s2, s3 may be non - null if count = 1. // use only result["s"+i] where i <= count private static double[] solveCubic(double a, double b, double c, double d) { if (Math.abs(a) > zeroMax) { // let's adopt form: x3 + ax2 + bx + d = 0 double z = a; // multi-purpose util variable a = b / z; b = c / z; c = d / z; // we solve using Cardan formula: http://fr.wikipedia.org/wiki/M%C3%A9thode_de_Cardan double p = b - a * a / 3; double q = a * (2 * a * a - 9 * b) / 27 + c; double p3 = p * p * p; double D = q * q + 4 * p3 / 27; double offset = -a / 3; if (D > zeroMax) { // D positive z = Math.sqrt(D); double u = ( -q + z) / 2; double v = ( -q - z) / 2; u = (u >= 0)? Math.pow(u, 1. / 3) : -Math.pow( -u, 1. / 3); v = (v >= 0)? Math.pow(v, 1. / 3) : -Math.pow( -v, 1. / 3); return new double[] { u + v + offset }; } else if (D < -zeroMax) { // D negative double u = 2 * Math.sqrt( -p / 3); double v = Math.acos( -Math.sqrt( -27 / p3) * q / 2) / 3; return new double[] { u * Math.cos(v) + offset, u * Math.cos(v + 2 * Math.PI / 3) + offset, u * Math.cos(v + 4 * Math.PI / 3) + offset }; } else { // D zero double u; if (q < 0) u = Math.pow( -q / 2, 1. / 3); else u = -Math.pow( q / 2, 1. / 3); return new double[] { 2*u + offset, -u + offset }; } } else if (Math.abs(b) > zeroMax) { // a = 0, then actually a 2nd degree equation: // form : ax2 + bx + c = 0; a = b; b = c; c = d; double D = b*b - 4*a*c; if (D <= -zeroMax) { // D negative return null; } else if (D > zeroMax) { // D positive D = Math.sqrt(D); return new double[] { ( -b - D) / (2 * a), ( -b + D) / (2 * a) }; } else { // D zero return new double[] { -b / (2 * a) }; } } else if (Math.abs(c) > zeroMax) { // a and b are both 0 - we're looking at a linear equation return new double[] { -d / c }; } else { // a, b, and c are all 0 - this is a constant equation return null; } } // Translated from ActionScript written by Jim Armstrong, at // www.algorithmist.net. ActionScript is (c) 2006-2007, Jim Armstrong. // All rights reserved. // // This software program is supplied 'as is' without any warranty, express, // implied, or otherwise, including without limitation all warranties of // merchantability or fitness for a particular purpose. Jim Armstrong shall // not be liable for any special incidental, or consequential damages, // including, without limitation, lost revenues, lost profits, or loss of // prospective economic advantage, resulting from the use or misuse of this // software program. public static double[] interpolate(double[] end0, double[] end1, double[] mid) { double dx = mid[0] - end0[0]; double dy = mid[1] - end0[1]; double d0 = Math.sqrt(dx * dx + dy * dy); dx = mid[0] - end1[0]; dy = mid[1] - end1[1]; double d1 = Math.sqrt(dx * dx + dy * dy); if (d0 < zeroMax || d1 < zeroMax) { return new double[] { (end0[0] + end1[0]) / 2, (end0[1] + end1[1]) / 2 }; } double t = d0 / (d0 + d1); double u = 1.0 - t; double t2 = t * t; double u2 = u * u; double den = 2 * t * u; double xNum = mid[0] - u2 * end0[0] - t2 * end1[0]; double yNum = mid[1] - u2 * end0[1] - t2 * end1[1]; return new double[] { xNum / den, yNum / den }; } }logisim-2.7.1/src/com/cburch/draw/shapes/Text.java0000644000175000017500000000764711446034602021722 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.shapes; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.util.List; import org.w3c.dom.Document; import org.w3c.dom.Element; import com.cburch.draw.model.CanvasObject; import com.cburch.draw.model.AbstractCanvasObject; import com.cburch.draw.model.Handle; import com.cburch.draw.model.HandleGesture; import com.cburch.draw.util.EditableLabel; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeOption; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Location; import com.cburch.logisim.util.UnmodifiableList; public class Text extends AbstractCanvasObject { private EditableLabel label; public Text(int x, int y, String text) { this(x, y, EditableLabel.LEFT, EditableLabel.BASELINE, text, DrawAttr.DEFAULT_FONT, Color.BLACK); } private Text(int x, int y, int halign, int valign, String text, Font font, Color color) { label = new EditableLabel(x, y, text, font); label.setColor(color); label.setHorizontalAlignment(halign); label.setVerticalAlignment(valign); } @Override public Text clone() { Text ret = (Text) super.clone(); ret.label = this.label.clone(); return ret; } @Override public boolean matches(CanvasObject other) { if (other instanceof Text) { Text that = (Text) other; return this.label.equals(that.label); } else { return false; } } @Override public int matchesHashCode() { return label.hashCode(); } @Override public Element toSvgElement(Document doc) { return SvgCreator.createText(doc, this); } public Location getLocation() { return Location.create(label.getX(), label.getY()); } public String getText() { return label.getText(); } public EditableLabel getLabel() { return label; } public void setText(String value) { label.setText(value); } @Override public String getDisplayName() { return Strings.get("shapeText"); } @Override public List> getAttributes() { return DrawAttr.ATTRS_TEXT; } @Override @SuppressWarnings("unchecked") public V getValue(Attribute attr) { if (attr == DrawAttr.FONT) { return (V) label.getFont(); } else if (attr == DrawAttr.FILL_COLOR) { return (V) label.getColor(); } else if (attr == DrawAttr.ALIGNMENT) { int halign = label.getHorizontalAlignment(); AttributeOption h; if (halign == EditableLabel.LEFT) { h = DrawAttr.ALIGN_LEFT; } else if (halign == EditableLabel.RIGHT) { h = DrawAttr.ALIGN_RIGHT; } else { h = DrawAttr.ALIGN_CENTER; } return (V) h; } else { return null; } } @Override public void updateValue(Attribute attr, Object value) { if (attr == DrawAttr.FONT) { label.setFont((Font) value); } else if (attr == DrawAttr.FILL_COLOR) { label.setColor((Color) value); } else if (attr == DrawAttr.ALIGNMENT) { Integer intVal = (Integer) ((AttributeOption) value).getValue(); label.setHorizontalAlignment(intVal.intValue()); } } @Override public Bounds getBounds() { return label.getBounds(); } @Override public boolean contains(Location loc, boolean assumeFilled) { return label.contains(loc.getX(), loc.getY()); } @Override public void translate(int dx, int dy) { label.setLocation(label.getX() + dx, label.getY() + dy); } public List getHandles() { Bounds bds = label.getBounds(); int x = bds.getX(); int y = bds.getY(); int w = bds.getWidth(); int h = bds.getHeight(); return UnmodifiableList.create(new Handle[] { new Handle(this, x, y), new Handle(this, x + w, y), new Handle(this, x + w, y + h), new Handle(this, x, y + h) }); } @Override public List getHandles(HandleGesture gesture) { return getHandles(); } @Override public void paint(Graphics g, HandleGesture gesture) { label.paint(g); } } logisim-2.7.1/src/com/cburch/draw/shapes/SvgReader.java0000644000175000017500000002012611500267102022635 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.shapes; import java.awt.Color; import java.awt.Font; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.w3c.dom.Element; import com.cburch.draw.model.AbstractCanvasObject; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeOption; import com.cburch.logisim.data.Location; import com.cburch.logisim.util.UnmodifiableList; public class SvgReader { private SvgReader() { } private static final Pattern PATH_REGEX = Pattern.compile("[a-zA-Z]|[-0-9.]+"); public static AbstractCanvasObject createShape(Element elt) { String name = elt.getTagName(); AbstractCanvasObject ret; if (name.equals("ellipse")) { ret = createOval(elt); } else if (name.equals("line")) { ret = createLine(elt); } else if (name.equals("path")) { ret = createPath(elt); } else if (name.equals("polyline")) { ret = createPolyline(elt); } else if (name.equals("polygon")) { ret = createPolygon(elt); } else if (name.equals("rect")) { ret = createRectangle(elt); } else if (name.equals("text")) { ret = createText(elt); } else { return null; } List> attrs = ret.getAttributes(); if (attrs.contains(DrawAttr.PAINT_TYPE)) { String stroke = elt.getAttribute("stroke"); String fill = elt.getAttribute("fill"); if (stroke.equals("") || stroke.equals("none")) { ret.setValue(DrawAttr.PAINT_TYPE, DrawAttr.PAINT_FILL); } else if (fill.equals("none")) { ret.setValue(DrawAttr.PAINT_TYPE, DrawAttr.PAINT_STROKE); } else { ret.setValue(DrawAttr.PAINT_TYPE, DrawAttr.PAINT_STROKE_FILL); } } attrs = ret.getAttributes(); // since changing paintType could change it if (attrs.contains(DrawAttr.STROKE_WIDTH) && elt.hasAttribute("stroke-width")) { Integer width = Integer.valueOf(elt.getAttribute("stroke-width")); ret.setValue(DrawAttr.STROKE_WIDTH, width); } if (attrs.contains(DrawAttr.STROKE_COLOR)) { String color = elt.getAttribute("stroke"); String opacity = elt.getAttribute("stroke-opacity"); if (!color.equals("none")) { ret.setValue(DrawAttr.STROKE_COLOR, getColor(color, opacity)); } } if (attrs.contains(DrawAttr.FILL_COLOR)) { String color = elt.getAttribute("fill"); if (color.equals("")) color = "#000000"; String opacity = elt.getAttribute("fill-opacity"); if (!color.equals("none")) { ret.setValue(DrawAttr.FILL_COLOR, getColor(color, opacity)); } } return ret; } private static AbstractCanvasObject createRectangle(Element elt) { int x = Integer.parseInt(elt.getAttribute("x")); int y = Integer.parseInt(elt.getAttribute("y")); int w = Integer.parseInt(elt.getAttribute("width")); int h = Integer.parseInt(elt.getAttribute("height")); if (elt.hasAttribute("rx")) { AbstractCanvasObject ret = new RoundRectangle(x, y, w, h); int rx = Integer.parseInt(elt.getAttribute("rx")); ret.setValue(DrawAttr.CORNER_RADIUS, Integer.valueOf(rx)); return ret; } else { return new Rectangle(x, y, w, h); } } private static AbstractCanvasObject createOval(Element elt) { double cx = Double.parseDouble(elt.getAttribute("cx")); double cy = Double.parseDouble(elt.getAttribute("cy")); double rx = Double.parseDouble(elt.getAttribute("rx")); double ry = Double.parseDouble(elt.getAttribute("ry")); int x = (int) Math.round(cx - rx); int y = (int) Math.round(cy - ry); int w = (int) Math.round(rx * 2); int h = (int) Math.round(ry * 2); return new Oval(x, y, w, h); } private static AbstractCanvasObject createLine(Element elt) { int x0 = Integer.parseInt(elt.getAttribute("x1")); int y0 = Integer.parseInt(elt.getAttribute("y1")); int x1 = Integer.parseInt(elt.getAttribute("x2")); int y1 = Integer.parseInt(elt.getAttribute("y2")); return new Line(x0, y0, x1, y1); } private static AbstractCanvasObject createPolygon(Element elt) { return new Poly(true, parsePoints(elt.getAttribute("points"))); } private static AbstractCanvasObject createPolyline(Element elt) { return new Poly(false, parsePoints(elt.getAttribute("points"))); } private static AbstractCanvasObject createText(Element elt) { int x = Integer.parseInt(elt.getAttribute("x")); int y = Integer.parseInt(elt.getAttribute("y")); String text = elt.getTextContent(); Text ret = new Text(x, y, text); String fontFamily = elt.getAttribute("font-family"); String fontStyle = elt.getAttribute("font-style"); String fontWeight = elt.getAttribute("font-weight"); String fontSize = elt.getAttribute("font-size"); int styleFlags = 0; if (fontStyle.equals("italic")) styleFlags |= Font.ITALIC; if (fontWeight.equals("bold")) styleFlags |= Font.BOLD; int size = Integer.parseInt(fontSize); ret.setValue(DrawAttr.FONT, new Font(fontFamily, styleFlags, size)); String alignStr = elt.getAttribute("text-anchor"); AttributeOption halign; if (alignStr.equals("start")) { halign = DrawAttr.ALIGN_LEFT; } else if (alignStr.equals("end")) { halign = DrawAttr.ALIGN_RIGHT; } else { halign = DrawAttr.ALIGN_CENTER; } ret.setValue(DrawAttr.ALIGNMENT, halign); // fill color is handled after we return return ret; } private static List parsePoints(String points) { Pattern patt = Pattern.compile("[ ,\n\r\t]+"); String[] toks = patt.split(points); Location[] ret = new Location[toks.length / 2]; for (int i = 0; i < ret.length; i++) { int x = Integer.parseInt(toks[2 * i]); int y = Integer.parseInt(toks[2 * i + 1]); ret[i] = Location.create(x, y); } return UnmodifiableList.create(ret); } private static AbstractCanvasObject createPath(Element elt) { Matcher patt = PATH_REGEX.matcher(elt.getAttribute("d")); List tokens = new ArrayList(); int type = -1; // -1 error, 0 start, 1 curve, 2 polyline while (patt.find()) { String token = patt.group(); tokens.add(token); if (Character.isLetter(token.charAt(0))) { switch (token.charAt(0)) { case 'M': if (type == -1) type = 0; else type = -1; break; case 'Q': case 'q': if (type == 0) type = 1; else type = -1; break; /* not supported case 'L': case 'l': case 'H': case 'h': case 'V': case 'v': if (type == 0 || type == 2) type = 2; else type = -1; break; */ default: type = -1; } if (type == -1) { throw new NumberFormatException("Unrecognized path command '" + token.charAt(0) + "'"); } } } if (type == 1) { if (tokens.size() == 8 && tokens.get(0).equals("M") && tokens.get(3).toUpperCase().equals("Q")) { int x0 = Integer.parseInt(tokens.get(1)); int y0 = Integer.parseInt(tokens.get(2)); int x1 = Integer.parseInt(tokens.get(4)); int y1 = Integer.parseInt(tokens.get(5)); int x2 = Integer.parseInt(tokens.get(6)); int y2 = Integer.parseInt(tokens.get(7)); if (tokens.get(3).equals("q")) { x1 += x0; y1 += y0; x2 += x0; y2 += y0; } Location e0 = Location.create(x0, y0); Location e1 = Location.create(x2, y2); Location ct = Location.create(x1, y1); return new Curve(e0, e1, ct); } else { throw new NumberFormatException("Unexpected format for curve"); } } else { throw new NumberFormatException("Unrecognized path"); } } private static Color getColor(String hue, String opacity) { int r; int g; int b; if (hue == null || hue.equals("")) { r = 0; g = 0; b = 0; } else { r = Integer.parseInt(hue.substring(1, 3), 16); g = Integer.parseInt(hue.substring(3, 5), 16); b = Integer.parseInt(hue.substring(5, 7), 16); } int a; if (opacity == null || opacity.equals("")) { a = 255; } else { a = (int) Math.round(Double.parseDouble(opacity) * 255); } return new Color(r, g, b, a); } } logisim-2.7.1/src/com/cburch/draw/shapes/SvgCreator.java0000644000175000017500000001364111500267126023044 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.shapes; import java.awt.Color; import java.awt.Font; import org.w3c.dom.Document; import org.w3c.dom.Element; import com.cburch.draw.model.AbstractCanvasObject; import com.cburch.draw.model.Handle; import com.cburch.logisim.data.Location; class SvgCreator { private SvgCreator() { } public static Element createRectangle(Document doc, Rectangle rect) { return createRectangular(doc, rect); } public static Element createRoundRectangle(Document doc, RoundRectangle rrect) { Element elt = createRectangular(doc, rrect); int r = rrect.getValue(DrawAttr.CORNER_RADIUS).intValue(); elt.setAttribute("rx", "" + r); elt.setAttribute("ry", "" + r); return elt; } private static Element createRectangular(Document doc, Rectangular rect) { Element elt = doc.createElement("rect"); elt.setAttribute("x", "" + rect.getX()); elt.setAttribute("y", "" + rect.getY()); elt.setAttribute("width", "" + rect.getWidth()); elt.setAttribute("height", "" + rect.getHeight()); populateFill(elt, rect); return elt; } public static Element createOval(Document doc, Oval oval) { double x = oval.getX(); double y = oval.getY(); double width = oval.getWidth(); double height = oval.getHeight(); Element elt = doc.createElement("ellipse"); elt.setAttribute("cx", "" + (x + width / 2)); elt.setAttribute("cy", "" + (y + height / 2)); elt.setAttribute("rx", "" + (width / 2)); elt.setAttribute("ry", "" + (height / 2)); populateFill(elt, oval); return elt; } public static Element createLine(Document doc, Line line) { Element elt = doc.createElement("line"); Location v1 = line.getEnd0(); Location v2 = line.getEnd1(); elt.setAttribute("x1", "" + v1.getX()); elt.setAttribute("y1", "" + v1.getY()); elt.setAttribute("x2", "" + v2.getX()); elt.setAttribute("y2", "" + v2.getY()); populateStroke(elt, line); return elt; } public static Element createCurve(Document doc, Curve curve) { Element elt = doc.createElement("path"); Location e0 = curve.getEnd0(); Location e1 = curve.getEnd1(); Location ct = curve.getControl(); elt.setAttribute("d", "M" + e0.getX() + "," + e0.getY() + " Q" + ct.getX() + "," + ct.getY() + " " + e1.getX() + "," + e1.getY()); populateFill(elt, curve); return elt; } public static Element createPoly(Document doc, Poly poly) { Element elt; if (poly.isClosed()) { elt = doc.createElement("polygon"); } else { elt = doc.createElement("polyline"); } StringBuilder points = new StringBuilder(); boolean first = true; for (Handle h : poly.getHandles(null)) { if (!first) points.append(" "); points.append(h.getX() + "," + h.getY()); first = false; } elt.setAttribute("points", points.toString()); populateFill(elt, poly); return elt; } public static Element createText(Document doc, Text text) { Element elt = doc.createElement("text"); Location loc = text.getLocation(); Font font = text.getValue(DrawAttr.FONT); Color fill = text.getValue(DrawAttr.FILL_COLOR); Object halign = text.getValue(DrawAttr.ALIGNMENT); elt.setAttribute("x", "" + loc.getX()); elt.setAttribute("y", "" + loc.getY()); if (!colorMatches(fill, Color.BLACK)) { elt.setAttribute("fill", getColorString(fill)); } if (showOpacity(fill)) { elt.setAttribute("fill-opacity", getOpacityString(fill)); } elt.setAttribute("font-family", font.getFamily()); elt.setAttribute("font-size", "" + font.getSize()); int style = font.getStyle(); if ((style & Font.ITALIC) != 0) { elt.setAttribute("font-style", "italic"); } if ((style & Font.BOLD) != 0) { elt.setAttribute("font-weight", "bold"); } if (halign == DrawAttr.ALIGN_LEFT) { elt.setAttribute("text-anchor", "start"); } else if (halign == DrawAttr.ALIGN_RIGHT) { elt.setAttribute("text-anchor", "end"); } else { elt.setAttribute("text-anchor", "middle"); } elt.appendChild(doc.createTextNode(text.getText())); return elt; } private static void populateFill(Element elt, AbstractCanvasObject shape) { Object type = shape.getValue(DrawAttr.PAINT_TYPE); if (type == DrawAttr.PAINT_FILL) { elt.setAttribute("stroke", "none"); } else { populateStroke(elt, shape); } if (type == DrawAttr.PAINT_STROKE) { elt.setAttribute("fill", "none"); } else { Color fill = shape.getValue(DrawAttr.FILL_COLOR); if (colorMatches(fill, Color.BLACK)) { elt.removeAttribute("fill"); } else { elt.setAttribute("fill", getColorString(fill)); } if (showOpacity(fill)) { elt.setAttribute("fill-opacity", getOpacityString(fill)); } } } private static void populateStroke(Element elt, AbstractCanvasObject shape) { Integer width = shape.getValue(DrawAttr.STROKE_WIDTH); if (width != null && width.intValue() != 1) { elt.setAttribute("stroke-width", width.toString()); } Color stroke = shape.getValue(DrawAttr.STROKE_COLOR); elt.setAttribute("stroke", getColorString(stroke)); if (showOpacity(stroke)) { elt.setAttribute("stroke-opacity", getOpacityString(stroke)); } elt.setAttribute("fill", "none"); } private static boolean colorMatches(Color a, Color b) { return a.getRed() == b.getRed() && a.getGreen() == b.getGreen() && a.getBlue() == b.getBlue(); } private static String getColorString(Color color) { return String.format("#%02x%02x%02x", Integer.valueOf(color.getRed()), Integer.valueOf(color.getGreen()), Integer.valueOf(color.getBlue())); } private static boolean showOpacity(Color color) { return color.getAlpha() != 255; } private static String getOpacityString(Color color) { return String.format("%5.3f", Double.valueOf(color.getAlpha() / 255.0)); } } logisim-2.7.1/src/com/cburch/draw/shapes/Strings.java0000644000175000017500000000102311446034602022405 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.shapes; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.StringGetter; class Strings { private static LocaleManager source = new LocaleManager("resources/logisim", "draw"); public static String get(String key) { return source.get(key); } public static StringGetter getter(String key) { return source.getter(key); } } logisim-2.7.1/src/com/cburch/draw/shapes/RoundRectangle.java0000644000175000017500000001023211446034602023672 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.shapes; import java.awt.Graphics; import java.util.List; import java.util.Random; import org.w3c.dom.Document; import org.w3c.dom.Element; import com.cburch.draw.model.CanvasObject; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Location; public class RoundRectangle extends Rectangular { private int radius; public RoundRectangle(int x, int y, int w, int h) { super(x, y, w, h); this.radius = 10; } @Override public boolean matches(CanvasObject other) { if (other instanceof RoundRectangle) { RoundRectangle that = (RoundRectangle) other; return super.matches(other) && this.radius == that.radius; } else { return false; } } @Override public int matchesHashCode() { return super.matchesHashCode() * 31 + radius; } @Override public String getDisplayName() { return Strings.get("shapeRoundRect"); } @Override public Element toSvgElement(Document doc) { return SvgCreator.createRoundRectangle(doc, this); } @Override public List> getAttributes() { return DrawAttr.getRoundRectAttributes(getPaintType()); } @Override @SuppressWarnings("unchecked") public V getValue(Attribute attr) { if (attr == DrawAttr.CORNER_RADIUS) { return (V) Integer.valueOf(radius); } else { return super.getValue(attr); } } @Override public void updateValue(Attribute attr, Object value) { if (attr == DrawAttr.CORNER_RADIUS) { radius = ((Integer) value).intValue(); } else { super.updateValue(attr, value); } } @Override protected boolean contains(int x, int y, int w, int h, Location q) { int qx = q.getX(); int qy = q.getY(); int rx = radius; int ry = radius; if (2 * rx > w) rx = w / 2; if (2 * ry > h) ry = h / 2; if (!isInRect(qx, qy, x, y, w, h)) { return false; } else if (qx < x + rx) { if (qy < y + ry) return inCircle(qx, qy, x + rx, y + ry, rx, ry); else if (qy < y + h - ry) return true; else return inCircle(qx, qy, x + rx, y + h - ry, rx, ry); } else if (qx < x + w - rx) { return true; } else { if (qy < y + ry) return inCircle(qx, qy, x + w - rx, y + ry, rx, ry); else if (qy < y + h - ry) return true; else return inCircle(qx, qy, x + w - rx, y + h - ry, rx, ry); } } @Override protected Location getRandomPoint(Bounds bds, Random rand) { if (getPaintType() == DrawAttr.PAINT_STROKE) { int w = getWidth(); int h = getHeight(); int r = radius; int horz = Math.max(0, w - 2 * r); // length of horizontal segment int vert = Math.max(0, h - 2 * r); double len = 2 * horz + 2 * vert + 2 * Math.PI * r; double u = len * rand.nextDouble(); int x = getX(); int y = getY(); if (u < horz) { x += r + (int) u; } else if (u < 2 * horz) { x += r + (int) (u - horz); y += h; } else if (u < 2 * horz + vert) { y += r + (int) (u - 2 * horz); } else if (u < 2 * horz + 2 * vert) { x += w; y += (u - 2 * w - h); } else { int rx = radius; int ry = radius; if (2 * rx > w) rx = w / 2; if (2 * ry > h) ry = h / 2; u = 2 * Math.PI * rand.nextDouble(); int dx = (int) Math.round(rx * Math.cos(u)); int dy = (int) Math.round(ry * Math.sin(u)); if (dx < 0) { x += r + dx; } else { x += r + horz + dx; } if (dy < 0) { y += r + dy; } else { y += r + vert + dy; } } int d = getStrokeWidth(); if (d > 1) { x += rand.nextInt(d) - d / 2; y += rand.nextInt(d) - d / 2; } return Location.create(x, y); } else { return super.getRandomPoint(bds, rand); } } private static boolean inCircle(int qx, int qy, int cx, int cy, int rx, int ry) { double dx = qx - cx; double dy = qy - cy; double sum = (dx * dx) / (4 * rx * rx) + (dy * dy) / (4 * ry * ry); return sum <= 0.25; } @Override public void draw(Graphics g, int x, int y, int w, int h) { int diam = 2 * radius; if (setForFill(g)) g.fillRoundRect(x, y, w, h, diam, diam); if (setForStroke(g)) g.drawRoundRect(x, y, w, h, diam, diam); } } logisim-2.7.1/src/com/cburch/draw/shapes/Rectangular.java0000644000175000017500000001463411446663010023240 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.shapes; import java.awt.Graphics; import java.util.List; import com.cburch.draw.model.CanvasObject; import com.cburch.draw.model.Handle; import com.cburch.draw.model.HandleGesture; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Location; import com.cburch.logisim.util.UnmodifiableList; abstract class Rectangular extends FillableCanvasObject { private Bounds bounds; // excluding the stroke's width public Rectangular(int x, int y, int w, int h) { bounds = Bounds.create(x, y, w, h); } @Override public boolean matches(CanvasObject other) { if (other instanceof Rectangular) { Rectangular that = (Rectangular) other; return this.bounds.equals(that.bounds) && super.matches(that); } else { return false; } } @Override public int matchesHashCode() { return bounds.hashCode() * 31 + super.matchesHashCode(); } public int getX() { return bounds.getX(); } public int getY() { return bounds.getY(); } public int getWidth() { return bounds.getWidth(); } public int getHeight() { return bounds.getHeight(); } @Override public Bounds getBounds() { int wid = getStrokeWidth(); Object type = getPaintType(); if (wid < 2 || type == DrawAttr.PAINT_FILL) { return bounds; } else { return bounds.expand(wid / 2); } } @Override public void translate(int dx, int dy) { bounds = bounds.translate(dx, dy); } @Override public List getHandles(HandleGesture gesture) { return UnmodifiableList.create(getHandleArray(gesture)); } private Handle[] getHandleArray(HandleGesture gesture) { Bounds bds = bounds; int x0 = bds.getX(); int y0 = bds.getY(); int x1 = x0 + bds.getWidth(); int y1 = y0 + bds.getHeight(); if (gesture == null) { return new Handle[] { new Handle(this, x0, y0), new Handle(this, x1, y0), new Handle(this, x1, y1), new Handle(this, x0, y1) }; } else { int hx = gesture.getHandle().getX(); int hy = gesture.getHandle().getY(); int dx = gesture.getDeltaX(); int dy = gesture.getDeltaY(); int newX0 = x0 == hx ? x0 + dx : x0; int newY0 = y0 == hy ? y0 + dy : y0; int newX1 = x1 == hx ? x1 + dx : x1; int newY1 = y1 == hy ? y1 + dy : y1; if (gesture.isShiftDown()) { if (gesture.isAltDown()) { if (x0 == hx) newX1 -= dx; if (x1 == hx) newX0 -= dx; if (y0 == hy) newY1 -= dy; if (y1 == hy) newY0 -= dy; int w = Math.abs(newX1 - newX0); int h = Math.abs(newY1 - newY0); if (w > h) { // reduce width to h int dw = (w - h) / 2; newX0 -= (newX0 > newX1 ? 1 : -1) * dw; newX1 -= (newX1 > newX0 ? 1 : -1) * dw; } else { int dh = (h - w) / 2; newY0 -= (newY0 > newY1 ? 1 : -1) * dh; newY1 -= (newY1 > newY0 ? 1 : -1) * dh; } } else { int w = Math.abs(newX1 - newX0); int h = Math.abs(newY1 - newY0); if (w > h) { // reduce width to h if (x0 == hx) { newX0 = newX1 + (newX0 > newX1 ? 1 : -1) * h; } if (x1 == hx) { newX1 = newX0 + (newX1 > newX0 ? 1 : -1) * h; } } else { // reduce height to w if (y0 == hy) { newY0 = newY1 + (newY0 > newY1 ? 1 : -1) * w; } if (y1 == hy) { newY1 = newY0 + (newY1 > newY0 ? 1 : -1) * w; } } } } else { if (gesture.isAltDown()) { if (x0 == hx) newX1 -= dx; if (x1 == hx) newX0 -= dx; if (y0 == hy) newY1 -= dy; if (y1 == hy) newY0 -= dy; } else { ; // already handled } } return new Handle[] { new Handle(this, newX0, newY0), new Handle(this, newX1, newY0), new Handle(this, newX1, newY1), new Handle(this, newX0, newY1) }; } } @Override public boolean canMoveHandle(Handle handle) { return true; } @Override public Handle moveHandle(HandleGesture gesture) { Handle[] oldHandles = getHandleArray(null); Handle[] newHandles = getHandleArray(gesture); Handle moved = gesture == null ? null : gesture.getHandle(); Handle result = null; int x0 = Integer.MAX_VALUE; int x1 = Integer.MIN_VALUE; int y0 = Integer.MAX_VALUE; int y1 = Integer.MIN_VALUE; int i = -1; for (Handle h : newHandles) { i++; if (oldHandles[i].equals(moved)) { result = h; } int hx = h.getX(); int hy = h.getY(); if (hx < x0) x0 = hx; if (hx > x1) x1 = hx; if (hy < y0) y0 = hy; if (hy > y1) y1 = hy; } bounds = Bounds.create(x0, y0, x1 - x0, y1 - y0); return result; } @Override public void paint(Graphics g, HandleGesture gesture) { if (gesture == null) { Bounds bds = bounds; draw(g, bds.getX(), bds.getY(), bds.getWidth(), bds.getHeight()); } else { Handle[] handles = getHandleArray(gesture); Handle p0 = handles[0]; Handle p1 = handles[2]; int x0 = p0.getX(); int y0 = p0.getY(); int x1 = p1.getX(); int y1 = p1.getY(); if (x1 < x0) { int t = x0; x0 = x1; x1 = t; } if (y1 < y0) { int t = y0; y0 = y1; y1 = t; } draw(g, x0, y0, x1 - x0, y1 - y0); } } @Override public boolean contains(Location loc, boolean assumeFilled) { Object type = getPaintType(); if (assumeFilled && type == DrawAttr.PAINT_STROKE) { type = DrawAttr.PAINT_STROKE_FILL; } Bounds b = bounds; int x = b.getX(); int y = b.getY(); int w = b.getWidth(); int h = b.getHeight(); int qx = loc.getX(); int qy = loc.getY(); if (type == DrawAttr.PAINT_FILL) { return isInRect(qx, qy, x, y, w, h) && contains(x, y, w, h, loc); } else if (type == DrawAttr.PAINT_STROKE) { int stroke = getStrokeWidth(); int tol2 = Math.max(2 * Line.ON_LINE_THRESH, stroke); int tol = tol2 / 2; return isInRect(qx, qy, x - tol, y - tol, w + tol2, h + tol2) && contains(x - tol, y - tol, w + tol2, h + tol2, loc) && !contains(x + tol, y + tol, w - tol2, h - tol2, loc); } else if (type == DrawAttr.PAINT_STROKE_FILL) { int stroke = getStrokeWidth(); int tol2 = stroke; int tol = tol2 / 2; return isInRect(qx, qy, x - tol, y - tol, w + tol2, h + tol2) && contains(x - tol, y - tol, w + tol2, h + tol2, loc); } else { return false; } } boolean isInRect(int qx, int qy, int x0, int y0, int w, int h) { return qx >= x0 && qx < x0 + w && qy >= y0 && qy < y0 + h; } protected abstract boolean contains(int x, int y, int w, int h, Location q); protected abstract void draw(Graphics g, int x, int y, int w, int h); } logisim-2.7.1/src/com/cburch/draw/shapes/Rectangle.java0000644000175000017500000000421311450405546022670 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.shapes; import java.awt.Graphics; import java.util.List; import java.util.Random; import org.w3c.dom.Document; import org.w3c.dom.Element; import com.cburch.draw.model.CanvasObject; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Location; public class Rectangle extends Rectangular { public Rectangle(int x, int y, int w, int h) { super(x, y, w, h); } @Override public boolean matches(CanvasObject other) { if (other instanceof Rectangle) { return super.matches(other); } else { return false; } } @Override public int matchesHashCode() { return super.matchesHashCode(); } @Override public String toString() { return "Rectangle:" + getBounds(); } @Override public String getDisplayName() { return Strings.get("shapeRect"); } @Override public Element toSvgElement(Document doc) { return SvgCreator.createRectangle(doc, this); } @Override public List> getAttributes() { return DrawAttr.getFillAttributes(getPaintType()); } @Override protected boolean contains(int x, int y, int w, int h, Location q) { return isInRect(q.getX(), q.getY(), x, y, w, h); } @Override protected Location getRandomPoint(Bounds bds, Random rand) { if (getPaintType() == DrawAttr.PAINT_STROKE) { int w = getWidth(); int h = getHeight(); int u = rand.nextInt(2 * w + 2 * h); int x = getX(); int y = getY(); if (u < w) { x += u; } else if (u < 2 * w) { x += (u - w); y += h; } else if (u < 2 * w + h) { y += (u - 2 * w); } else { x += w; y += (u - 2 * w - h); } int d = getStrokeWidth(); if (d > 1) { x += rand.nextInt(d) - d / 2; y += rand.nextInt(d) - d / 2; } return Location.create(x, y); } else { return super.getRandomPoint(bds, rand); } } @Override public void draw(Graphics g, int x, int y, int w, int h) { if (setForFill(g)) g.fillRect(x, y, w, h); if (setForStroke(g)) g.drawRect(x, y, w, h); } } logisim-2.7.1/src/com/cburch/draw/shapes/PolyUtil.java0000644000175000017500000000330211446034602022537 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.shapes; import com.cburch.draw.model.Handle; import com.cburch.logisim.data.Location; public class PolyUtil { private PolyUtil() { } public static class ClosestResult { private double dist; private Location loc; private Handle prevHandle; private Handle nextHandle; public double getDistanceSq() { return dist; } public Location getLocation() { return loc; } public Handle getPreviousHandle() { return prevHandle; } public Handle getNextHandle() { return nextHandle; } } public static ClosestResult getClosestPoint(Location loc, boolean closed, Handle[] hs) { int xq = loc.getX(); int yq = loc.getY(); ClosestResult ret = new ClosestResult(); ret.dist = Double.MAX_VALUE; if (hs.length > 0) { Handle h0 = hs[0]; int x0 = h0.getX(); int y0 = h0.getY(); int stop = closed ? hs.length : (hs.length - 1); for(int i = 0; i < stop; i++) { Handle h1 = hs[(i + 1) % hs.length]; int x1 = h1.getX(); int y1 = h1.getY(); double d = LineUtil.ptDistSqSegment(x0, y0, x1, y1, xq, yq); if (d < ret.dist) { ret.dist = d; ret.prevHandle = h0; ret.nextHandle = h1; } h0 = h1; x0 = x1; y0 = y1; } } if (ret.dist == Double.MAX_VALUE) { return null; } else { Handle h0 = ret.prevHandle; Handle h1 = ret.nextHandle; double[] p = LineUtil.nearestPointSegment(xq, yq, h0.getX(), h0.getY(), h1.getX(), h1.getY()); ret.loc = Location.create((int) Math.round(p[0]), (int) Math.round(p[1])); return ret; } } } logisim-2.7.1/src/com/cburch/draw/shapes/Poly.java0000644000175000017500000002350211446034602021705 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.shapes; import java.awt.Graphics; import java.awt.geom.GeneralPath; import java.util.List; import java.util.Random; import org.w3c.dom.Document; import org.w3c.dom.Element; import com.cburch.draw.model.CanvasObject; import com.cburch.draw.model.Handle; import com.cburch.draw.model.HandleGesture; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Location; import com.cburch.logisim.util.UnmodifiableList; public class Poly extends FillableCanvasObject { private boolean closed; // "handles" should be immutable - create a new array and change using // setHandles rather than changing contents private Handle[] handles; private GeneralPath path; private double[] lens; private Bounds bounds; public Poly(boolean closed, List locations) { Handle[] hs = new Handle[locations.size()]; int i = -1; for (Location loc : locations) { i++; hs[i] = new Handle(this, loc.getX(), loc.getY()); } this.closed = closed; handles = hs; recomputeBounds(); } @Override public boolean matches(CanvasObject other) { if (other instanceof Poly) { Poly that = (Poly) other; Handle[] a = this.handles; Handle[] b = that.handles; if (this.closed != that.closed || a.length != b.length) { return false; } else { for (int i = 0, n = a.length; i < n; i++) { if (!a[i].equals(b[i])) return false; } return super.matches(that); } } else { return false; } } @Override public int matchesHashCode() { int ret = super.matchesHashCode(); ret = ret * 3 + (closed ? 1 : 0); Handle[] hs = handles; for (int i = 0, n = hs.length; i < n; i++) { ret = ret * 31 + hs[i].hashCode(); } return ret; } @Override public String getDisplayName() { if (closed) { return Strings.get("shapePolygon"); } else { return Strings.get("shapePolyline"); } } @Override public Element toSvgElement(Document doc) { return SvgCreator.createPoly(doc, this); } @Override public List> getAttributes() { return DrawAttr.getFillAttributes(getPaintType()); } @Override public final boolean contains(Location loc, boolean assumeFilled) { Object type = getPaintType(); if (assumeFilled && type == DrawAttr.PAINT_STROKE) { type = DrawAttr.PAINT_STROKE_FILL; } if (type == DrawAttr.PAINT_STROKE) { int thresh = Math.max(Line.ON_LINE_THRESH, getStrokeWidth() / 2); PolyUtil.ClosestResult result = PolyUtil.getClosestPoint(loc, closed, handles); return result.getDistanceSq() < thresh * thresh; } else if (type == DrawAttr.PAINT_FILL) { GeneralPath path = getPath(); return path.contains(loc.getX(), loc.getY()); } else { // fill and stroke GeneralPath path = getPath(); if (path.contains(loc.getX(), loc.getY())) return true; int width = getStrokeWidth(); PolyUtil.ClosestResult result = PolyUtil.getClosestPoint(loc, closed, handles); return result.getDistanceSq() < (width * width) / 4; } } @Override public final Location getRandomPoint(Bounds bds, Random rand) { if (getPaintType() == DrawAttr.PAINT_STROKE) { Location ret = getRandomBoundaryPoint(bds, rand); int w = getStrokeWidth(); if (w > 1) { int dx = rand.nextInt(w) - w / 2; int dy = rand.nextInt(w) - w / 2; ret = ret.translate(dx, dy); } return ret; } else { return super.getRandomPoint(bds, rand); } } private Location getRandomBoundaryPoint(Bounds bds, Random rand) { Handle[] hs = handles; double[] ls = lens; if (ls == null) { ls = new double[hs.length + (closed ? 1 : 0)]; double total = 0.0; for (int i = 0; i < ls.length; i++) { int j = (i + 1) % hs.length; total += LineUtil.distance(hs[i].getX(), hs[i].getY(), hs[j].getX(), hs[j].getY()); ls[i] = total; } lens = ls; } double pos = ls[ls.length - 1] * rand.nextDouble(); for (int i = 0; true; i++) { if (pos < ls[i]) { Handle p = hs[i]; Handle q = hs[(i + 1) % hs.length]; double u = Math.random(); int x = (int) Math.round(p.getX() + u * (q.getX() - p.getX())); int y = (int) Math.round(p.getY() + u * (q.getY() - p.getY())); return Location.create(x, y); } } } @Override public Bounds getBounds() { return bounds; } @Override public void translate(int dx, int dy) { Handle[] hs = handles; Handle[] is = new Handle[hs.length]; for(int i = 0; i < hs.length; i++) { is[i] = new Handle(this, hs[i].getX() + dx, hs[i].getY() + dy); } setHandles(is); } public boolean isClosed() { return closed; } @Override public List getHandles(HandleGesture gesture) { Handle[] hs = handles; if (gesture == null) { return UnmodifiableList.create(hs); } else { Handle g = gesture.getHandle(); Handle[] ret = new Handle[hs.length]; for (int i = 0, n = hs.length; i < n; i++) { Handle h = hs[i]; if (h.equals(g)) { int x = h.getX() + gesture.getDeltaX(); int y = h.getY() + gesture.getDeltaY(); Location r; if (gesture.isShiftDown()) { Location prev = hs[(i + n - 1) % n].getLocation(); Location next = hs[(i + 1) % n].getLocation(); if (!closed) { if (i == 0) prev = null; if (i == n - 1) next = null; } if (prev == null) { r = LineUtil.snapTo8Cardinals(next, x, y); } else if (next == null) { r = LineUtil.snapTo8Cardinals(prev, x, y); } else { Location to = Location.create(x, y); Location a = LineUtil.snapTo8Cardinals(prev, x, y); Location b = LineUtil.snapTo8Cardinals(next, x, y); int ad = a.manhattanDistanceTo(to); int bd = b.manhattanDistanceTo(to); r = ad < bd ? a : b; } } else { r = Location.create(x, y); } ret[i] = new Handle(this, r); } else { ret[i] = h; } } return UnmodifiableList.create(ret); } } @Override public boolean canMoveHandle(Handle handle) { return true; } @Override public Handle moveHandle(HandleGesture gesture) { List hs = getHandles(gesture); Handle[] is = new Handle[hs.size()]; Handle ret = null; int i = -1; for (Handle h : hs) { i++; is[i] = h; } setHandles(is); return ret; } @Override public Handle canInsertHandle(Location loc) { PolyUtil.ClosestResult result = PolyUtil.getClosestPoint(loc, closed, handles); int thresh = Math.max(Line.ON_LINE_THRESH, getStrokeWidth() / 2); if (result.getDistanceSq() < thresh * thresh) { Location resLoc = result.getLocation(); if (result.getPreviousHandle().isAt(resLoc) || result.getNextHandle().isAt(resLoc)) { return null; } else { return new Handle(this, result.getLocation()); } } else { return null; } } @Override public Handle canDeleteHandle(Location loc) { int minHandles = closed ? 3 : 2; Handle[] hs = handles; if (hs.length <= minHandles) { return null; } else { int qx = loc.getX(); int qy = loc.getY(); int w = Math.max(Line.ON_LINE_THRESH, getStrokeWidth() / 2); for (Handle h : hs) { int hx = h.getX(); int hy = h.getY(); if (LineUtil.distance(qx, qy, hx, hy) < w * w) { return h; } } return null; } } @Override public void insertHandle(Handle desired, Handle previous) { Location loc = desired.getLocation(); Handle[] hs = handles; Handle prev; if (previous == null) { PolyUtil.ClosestResult result = PolyUtil.getClosestPoint(loc, closed, hs); prev = result.getPreviousHandle(); } else { prev = previous; } Handle[] is = new Handle[hs.length + 1]; boolean inserted = false; for(int i = 0; i < hs.length; i++) { if (inserted) { is[i + 1] = hs[i]; } else if (hs[i].equals(prev)) { inserted = true; is[i] = hs[i]; is[i + 1] = desired; } else { is[i] = hs[i]; } } if (!inserted) { throw new IllegalArgumentException("no such handle"); } setHandles(is); } @Override public Handle deleteHandle(Handle handle) { Handle[] hs = handles; int n = hs.length; Handle[] is = new Handle[n - 1]; Handle previous = null; boolean deleted = false; for (int i = 0; i < n; i++) { if (deleted) { is[i - 1] = hs[i]; } else if (hs[i].equals(handle)) { if (previous == null) { previous = hs[n - 1]; } deleted = true; } else { previous = hs[i]; is[i] = hs[i]; } } setHandles(is); return previous; } @Override public void paint(Graphics g, HandleGesture gesture) { List hs = getHandles(gesture); int[] xs = new int[hs.size()]; int[] ys = new int[hs.size()]; int i = -1; for (Handle h : hs) { i++; xs[i] = h.getX(); ys[i] = h.getY(); } if (setForFill(g)) { g.fillPolygon(xs, ys, xs.length); } if (setForStroke(g)) { if (closed) g.drawPolygon(xs, ys, xs.length); else g.drawPolyline(xs, ys, xs.length); } } private void setHandles(Handle[] hs) { handles = hs; lens = null; path = null; recomputeBounds(); } private void recomputeBounds() { Handle[] hs = handles; int x0 = hs[0].getX(); int y0 = hs[0].getY(); int x1 = x0; int y1 = y0; for(int i = 1; i < hs.length; i++) { int x = hs[i].getX(); int y = hs[i].getY(); if (x < x0) x0 = x; if (x > x1) x1 = x; if (y < y0) y0 = y; if (y > y1) y1 = y; } Bounds bds = Bounds.create(x0, y0, x1 - x0 + 1, y1 - y0 + 1); int stroke = getStrokeWidth(); bounds = stroke < 2 ? bds : bds.expand(stroke / 2); } private GeneralPath getPath() { GeneralPath p = path; if (p == null) { p = new GeneralPath(); Handle[] hs = handles; if (hs.length > 0) { boolean first = true; for (Handle h : hs) { if (first) { p.moveTo(h.getX(), h.getY()); first = false; } else { p.lineTo(h.getX(), h.getY()); } } } path = p; } return p; } } logisim-2.7.1/src/com/cburch/draw/shapes/Oval.java0000644000175000017500000000413611450405562021667 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.shapes; import java.awt.Graphics; import java.util.List; import java.util.Random; import org.w3c.dom.Document; import org.w3c.dom.Element; import com.cburch.draw.model.CanvasObject; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Location; public class Oval extends Rectangular { public Oval(int x, int y, int w, int h) { super(x, y, w, h); } @Override public boolean matches(CanvasObject other) { if (other instanceof Oval) { return super.matches(other); } else { return false; } } @Override public int matchesHashCode() { return super.matchesHashCode(); } @Override public Element toSvgElement(Document doc) { return SvgCreator.createOval(doc, this); } @Override public String getDisplayName() { return Strings.get("shapeOval"); } @Override public List> getAttributes() { return DrawAttr.getFillAttributes(getPaintType()); } @Override protected boolean contains(int x, int y, int w, int h, Location q) { int qx = q.getX(); int qy = q.getY(); double dx = qx - (x + 0.5 * w); double dy = qy - (y + 0.5 * h); double sum = (dx * dx) / (w * w) + (dy * dy) / (h * h); return sum <= 0.25; } @Override protected Location getRandomPoint(Bounds bds, Random rand) { if (getPaintType() == DrawAttr.PAINT_STROKE) { double rx = getWidth() / 2.0; double ry = getHeight() / 2.0; double u = 2 * Math.PI * rand.nextDouble(); int x = (int) Math.round(getX() + rx + rx * Math.cos(u)); int y = (int) Math.round(getY() + ry + ry * Math.sin(u)); int d = getStrokeWidth(); if (d > 1) { x += rand.nextInt(d) - d / 2; y += rand.nextInt(d) - d / 2; } return Location.create(x, y); } else { return super.getRandomPoint(bds, rand); } } @Override public void draw(Graphics g, int x, int y, int w, int h) { if (setForFill(g)) g.fillOval(x, y, w, h); if (setForStroke(g)) g.drawOval(x, y, w, h); } } logisim-2.7.1/src/com/cburch/draw/shapes/LineUtil.java0000644000175000017500000000611211450405464022510 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.shapes; import com.cburch.logisim.data.Location; public class LineUtil { private LineUtil() { } // a value we consider "small enough" to equal it to zero: // (this is used for double solutions in 2nd or 3d degree equation) private static final double zeroMax = 0.0000001; public static double distanceSquared(double x0, double y0, double x1, double y1) { double dx = x1 - x0; double dy = y1 - y0; return dx * dx + dy * dy; } public static double distance(double x0, double y0, double x1, double y1) { return Math.sqrt(distanceSquared(x0, y0, x1, y1)); } public static double ptDistSqSegment(double x0, double y0, double x1, double y1, double xq, double yq) { double dx = x1 - x0; double dy = y1 - y0; double len2 = dx * dx + dy * dy; if (len2 < zeroMax * zeroMax) { // the "segment" is essentially a point return distanceSquared(xq, yq, (x0 + x1) / 2, (y0 + y1) / 2); } double u = ((xq - x0) * dx + (yq - y0) * dy) / len2; if (u <= 0) return distanceSquared(xq, yq, x0, y0); if (u >= 1) return distanceSquared(xq, yq, x1, y1); return distanceSquared(xq, yq, x0 + u * dx, y0 + u * dy); } public static double[] nearestPointSegment(double xq, double yq, double x0, double y0, double x1, double y1) { return nearestPoint(xq, yq, x0, y0, x1, y1, true); } public static double[] nearestPointInfinite(double xq, double yq, double x0, double y0, double x1, double y1) { return nearestPoint(xq, yq, x0, y0, x1, y1, false); } private static double[] nearestPoint(double xq, double yq, double x0, double y0, double x1, double y1, boolean isSegment) { double dx = x1 - x0; double dy = y1 - y0; double len2 = dx * dx + dy * dy; if (len2 < zeroMax * zeroMax) { // the "line" is essentially a point - return that return new double[] { (x0 + x1) / 2, (y0 + y1) / 2 }; } double num = (xq - x0) * dx + (yq - y0) * dy; double u; if (isSegment) { if (num < 0) u = 0; else if (num < len2) u = num / len2; else u = 1; } else { u = num / len2; } return new double[] { x0 + u * dx, y0 + u * dy }; } public static Location snapTo8Cardinals(Location from, int mx, int my) { int px = from.getX(); int py = from.getY(); if (mx != px && my != py) { double ang = Math.atan2(my - py, mx - px); int d45 = (Math.abs(mx - px) + Math.abs(my - py)) / 2; int d = (int) (4 * ang / Math.PI + 4.5); switch (d) { case 0: case 8: // going west case 4: // going east return Location.create(mx, py); case 2: // going north case 6: // going south return Location.create(px, my); case 1: // going northwest return Location.create(px - d45, py - d45); case 3: // going northeast return Location.create(px + d45, py - d45); case 5: // going southeast return Location.create(px + d45, py + d45); case 7: // going southwest return Location.create(px - d45, py + d45); } } return Location.create(mx, my); // should never happen } }logisim-2.7.1/src/com/cburch/draw/shapes/Line.java0000644000175000017500000001170011446034602021646 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.shapes; import java.awt.Color; import java.awt.Graphics; import java.util.List; import java.util.Random; import org.w3c.dom.Document; import org.w3c.dom.Element; import com.cburch.draw.model.CanvasObject; import com.cburch.draw.model.AbstractCanvasObject; import com.cburch.draw.model.Handle; import com.cburch.draw.model.HandleGesture; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Location; import com.cburch.logisim.util.UnmodifiableList; public class Line extends AbstractCanvasObject { static final int ON_LINE_THRESH = 2; private int x0; private int y0; private int x1; private int y1; private Bounds bounds; private int strokeWidth; private Color strokeColor; public Line(int x0, int y0, int x1, int y1) { this.x0 = x0; this.y0 = y0; this.x1 = x1; this.y1 = y1; bounds = Bounds.create(x0, y0, 0, 0).add(x1, y1); strokeWidth = 1; strokeColor = Color.BLACK; } @Override public boolean matches(CanvasObject other) { if (other instanceof Line) { Line that = (Line) other; return this.x0 == that.x0 && this.y0 == that.x1 && this.x1 == that.y0 && this.y1 == that.y1 && this.strokeWidth == that.strokeWidth && this.strokeColor.equals(that.strokeColor); } else { return false; } } @Override public int matchesHashCode() { int ret = x0 * 31 + y0; ret = ret * 31 * 31 + x1 * 31 + y1; ret = ret * 31 + strokeWidth; ret = ret * 31 + strokeColor.hashCode(); return ret; } @Override public Element toSvgElement(Document doc) { return SvgCreator.createLine(doc, this); } public Location getEnd0() { return Location.create(x0, y0); } public Location getEnd1() { return Location.create(x1, y1); } @Override public String getDisplayName() { return Strings.get("shapeLine"); } @Override public List> getAttributes() { return DrawAttr.ATTRS_STROKE; } @Override @SuppressWarnings("unchecked") public V getValue(Attribute attr) { if (attr == DrawAttr.STROKE_COLOR) { return (V) strokeColor; } else if (attr == DrawAttr.STROKE_WIDTH) { return (V) Integer.valueOf(strokeWidth); } else { return null; } } @Override public void updateValue(Attribute attr, Object value) { if (attr == DrawAttr.STROKE_COLOR) { strokeColor = (Color) value; } else if (attr == DrawAttr.STROKE_WIDTH) { strokeWidth = ((Integer) value).intValue(); } } @Override public Bounds getBounds() { return bounds; } @Override public Location getRandomPoint(Bounds bds, Random rand) { double u = rand.nextDouble(); int x = (int) Math.round(x0 + u * (x1 - x0)); int y = (int) Math.round(y0 + u * (y1 - y0)); int w = strokeWidth; if (w > 1) { x += (rand.nextInt(w) - w / 2); y += (rand.nextInt(w) - w / 2); } return Location.create(x, y); } @Override public boolean contains(Location loc, boolean assumeFilled) { int xq = loc.getX(); int yq = loc.getY(); double d = LineUtil.ptDistSqSegment(x0, y0, x1, y1, xq, yq); int thresh = Math.max(ON_LINE_THRESH, strokeWidth / 2); return d < thresh * thresh; } @Override public void translate(int dx, int dy) { x0 += dx; y0 += dy; x1 += dx; y1 += dy; } public List getHandles() { return getHandles(null); } @Override public List getHandles(HandleGesture gesture) { if (gesture == null) { return UnmodifiableList.create(new Handle[] { new Handle(this, x0, y0), new Handle(this, x1, y1) }); } else { Handle h = gesture.getHandle(); int dx = gesture.getDeltaX(); int dy = gesture.getDeltaY(); Handle[] ret = new Handle[2]; ret[0] = new Handle(this, h.isAt(x0, y0) ? Location.create(x0 + dx, y0 + dy) : Location.create(x0, y0)); ret[1] = new Handle(this, h.isAt(x1, y1) ? Location.create(x1 + dx, y1 + dy) : Location.create(x1, y1)); return UnmodifiableList.create(ret); } } @Override public boolean canMoveHandle(Handle handle) { return true; } @Override public Handle moveHandle(HandleGesture gesture) { Handle h = gesture.getHandle(); int dx = gesture.getDeltaX(); int dy = gesture.getDeltaY(); Handle ret = null; if (h.isAt(x0, y0)) { x0 += dx; y0 += dy; ret = new Handle(this, x0, y0); } if (h.isAt(x1, y1)) { x1 += dx; y1 += dy; ret = new Handle(this, x1, y1); } bounds = Bounds.create(x0, y0, 0, 0).add(x1, y1); return ret; } @Override public void paint(Graphics g, HandleGesture gesture) { if (setForStroke(g)) { int x0 = this.x0; int y0 = this.y0; int x1 = this.x1; int y1 = this.y1; Handle h = gesture.getHandle(); if (h.isAt(x0, y0)) { x0 += gesture.getDeltaX(); y0 += gesture.getDeltaY(); } if (h.isAt(x1, y1)) { x1 += gesture.getDeltaX(); y1 += gesture.getDeltaY(); } g.drawLine(x0, y0, x1, y1); } } } logisim-2.7.1/src/com/cburch/draw/shapes/FillableCanvasObject.java0000644000175000017500000000507711446034602024766 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.shapes; import java.awt.Color; import com.cburch.draw.model.CanvasObject; import com.cburch.draw.model.AbstractCanvasObject; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeOption; abstract class FillableCanvasObject extends AbstractCanvasObject { private AttributeOption paintType; private int strokeWidth; private Color strokeColor; private Color fillColor; public FillableCanvasObject() { paintType = DrawAttr.PAINT_STROKE; strokeWidth = 1; strokeColor = Color.BLACK; fillColor = Color.WHITE; } @Override public boolean matches(CanvasObject other) { if (other instanceof FillableCanvasObject) { FillableCanvasObject that = (FillableCanvasObject) other; boolean ret = this.paintType == that.paintType; if (ret && this.paintType != DrawAttr.PAINT_FILL) { ret = ret && this.strokeWidth == that.strokeWidth && this.strokeColor.equals(that.strokeColor); } if (ret && this.paintType != DrawAttr.PAINT_STROKE) { ret = ret && this.fillColor.equals(that.fillColor); } return ret; } else { return false; } } @Override public int matchesHashCode() { int ret = paintType.hashCode(); if (paintType != DrawAttr.PAINT_FILL) { ret = ret * 31 + strokeWidth; ret = ret * 31 + strokeColor.hashCode(); } else { ret = ret * 31 * 31; } if (paintType != DrawAttr.PAINT_STROKE) { ret = ret * 31 + fillColor.hashCode(); } else { ret = ret * 31; } return ret; } public AttributeOption getPaintType() { return paintType; } public int getStrokeWidth() { return strokeWidth; } @Override @SuppressWarnings("unchecked") public V getValue(Attribute attr) { if (attr == DrawAttr.PAINT_TYPE) { return (V) paintType; } else if (attr == DrawAttr.STROKE_COLOR) { return (V) strokeColor; } else if (attr == DrawAttr.FILL_COLOR) { return (V) fillColor; } else if (attr == DrawAttr.STROKE_WIDTH) { return (V) Integer.valueOf(strokeWidth); } else { return null; } } @Override public void updateValue(Attribute attr, Object value) { if (attr == DrawAttr.PAINT_TYPE) { paintType = (AttributeOption) value; fireAttributeListChanged(); } else if (attr == DrawAttr.STROKE_COLOR) { strokeColor = (Color) value; } else if (attr == DrawAttr.FILL_COLOR) { fillColor = (Color) value; } else if (attr == DrawAttr.STROKE_WIDTH) { strokeWidth = ((Integer) value).intValue(); } } } logisim-2.7.1/src/com/cburch/draw/shapes/DrawAttr.java0000644000175000017500000001100711446663010022510 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.shapes; import java.awt.Color; import java.awt.Font; import java.util.List; import com.cburch.draw.util.EditableLabel; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeOption; import com.cburch.logisim.data.Attributes; import com.cburch.logisim.util.UnmodifiableList; public class DrawAttr { public static final Font DEFAULT_FONT = new Font("SansSerif", Font.PLAIN, 12); public static final AttributeOption ALIGN_LEFT = new AttributeOption(Integer.valueOf(EditableLabel.LEFT), Strings.getter("alignStart")); public static final AttributeOption ALIGN_CENTER = new AttributeOption(Integer.valueOf(EditableLabel.CENTER), Strings.getter("alignMiddle")); public static final AttributeOption ALIGN_RIGHT = new AttributeOption(Integer.valueOf(EditableLabel.RIGHT), Strings.getter("alignEnd")); public static final AttributeOption PAINT_STROKE = new AttributeOption("stroke", Strings.getter("paintStroke")); public static final AttributeOption PAINT_FILL = new AttributeOption("fill", Strings.getter("paintFill")); public static final AttributeOption PAINT_STROKE_FILL = new AttributeOption("both", Strings.getter("paintBoth")); public static final Attribute FONT = Attributes.forFont("font", Strings.getter("attrFont")); public static final Attribute ALIGNMENT = Attributes.forOption("align", Strings.getter("attrAlign"), new AttributeOption[] { ALIGN_LEFT, ALIGN_CENTER, ALIGN_RIGHT }); public static final Attribute PAINT_TYPE = Attributes.forOption("paintType", Strings.getter("attrPaint"), new AttributeOption[] { PAINT_STROKE, PAINT_FILL, PAINT_STROKE_FILL }); public static final Attribute STROKE_WIDTH = Attributes.forIntegerRange("stroke-width", Strings.getter("attrStrokeWidth"), 1, 8); public static final Attribute STROKE_COLOR = Attributes.forColor("stroke", Strings.getter("attrStroke")); public static final Attribute FILL_COLOR = Attributes.forColor("fill", Strings.getter("attrFill")); public static final Attribute TEXT_DEFAULT_FILL = Attributes.forColor("fill", Strings.getter("attrFill")); public static final Attribute CORNER_RADIUS = Attributes.forIntegerRange("rx", Strings.getter("attrRx"), 1, 1000); public static final List> ATTRS_TEXT // for text = createAttributes(new Attribute[] { FONT, ALIGNMENT, FILL_COLOR }); public static final List> ATTRS_TEXT_TOOL // for text tool = createAttributes(new Attribute[] { FONT, ALIGNMENT, TEXT_DEFAULT_FILL }); public static final List> ATTRS_STROKE // for line, polyline = createAttributes(new Attribute[] { STROKE_WIDTH, STROKE_COLOR }); // attribute lists for rectangle, oval, polygon private static final List> ATTRS_FILL_STROKE = createAttributes(new Attribute[] { PAINT_TYPE, STROKE_WIDTH, STROKE_COLOR }); private static final List> ATTRS_FILL_FILL = createAttributes(new Attribute[] { PAINT_TYPE, FILL_COLOR }); private static final List> ATTRS_FILL_BOTH = createAttributes(new Attribute[] { PAINT_TYPE, STROKE_WIDTH, STROKE_COLOR, FILL_COLOR }); // attribute lists for rounded rectangle private static final List> ATTRS_RRECT_STROKE = createAttributes(new Attribute[] { PAINT_TYPE, STROKE_WIDTH, STROKE_COLOR, CORNER_RADIUS }); private static final List> ATTRS_RRECT_FILL = createAttributes(new Attribute[] { PAINT_TYPE, FILL_COLOR, CORNER_RADIUS }); private static final List> ATTRS_RRECT_BOTH = createAttributes(new Attribute[] { PAINT_TYPE, STROKE_WIDTH, STROKE_COLOR, FILL_COLOR, CORNER_RADIUS }); private static List> createAttributes(Attribute[] values) { return UnmodifiableList.create(values); } public static List> getFillAttributes(AttributeOption paint) { if (paint == PAINT_STROKE) { return ATTRS_FILL_STROKE; } else if (paint == PAINT_FILL) { return ATTRS_FILL_FILL; } else { return ATTRS_FILL_BOTH; } } public static List> getRoundRectAttributes(AttributeOption paint) { if (paint == PAINT_STROKE) { return ATTRS_RRECT_STROKE; } else if (paint == PAINT_FILL) { return ATTRS_RRECT_FILL; } else { return ATTRS_RRECT_BOTH; } } } logisim-2.7.1/src/com/cburch/draw/shapes/Curve.java0000644000175000017500000001402111446663010022043 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.shapes; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.geom.QuadCurve2D; import java.util.List; import org.w3c.dom.Document; import org.w3c.dom.Element; import com.cburch.draw.model.CanvasObject; import com.cburch.draw.model.Handle; import com.cburch.draw.model.HandleGesture; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Location; import com.cburch.logisim.util.UnmodifiableList; public class Curve extends FillableCanvasObject { private Location p0; private Location p1; private Location p2; private Bounds bounds; public Curve(Location end0, Location end1, Location ctrl) { this.p0 = end0; this.p1 = ctrl; this.p2 = end1; bounds = CurveUtil.getBounds(toArray(p0), toArray(p1), toArray(p2)); } @Override public boolean matches(CanvasObject other) { if (other instanceof Curve) { Curve that = (Curve) other; return this.p0.equals(that.p0) && this.p1.equals(that.p1) && this.p2.equals(that.p2) && super.matches(that); } else { return false; } } @Override public int matchesHashCode() { int ret = p0.hashCode(); ret = ret * 31 * 31 + p1.hashCode(); ret = ret * 31 * 31 + p2.hashCode(); ret = ret * 31 + super.matchesHashCode(); return ret; } @Override public Element toSvgElement(Document doc) { return SvgCreator.createCurve(doc, this); } public Location getEnd0() { return p0; } public Location getEnd1() { return p2; } public Location getControl() { return p1; } public QuadCurve2D getCurve2D() { return new QuadCurve2D.Double(p0.getX(), p0.getY(), p1.getX(), p1.getY(), p2.getX(), p2.getY()); } @Override public String getDisplayName() { return Strings.get("shapeCurve"); } @Override public List> getAttributes() { return DrawAttr.getFillAttributes(getPaintType()); } @Override public Bounds getBounds() { return bounds; } @Override public boolean contains(Location loc, boolean assumeFilled) { Object type = getPaintType(); if (assumeFilled && type == DrawAttr.PAINT_STROKE) { type = DrawAttr.PAINT_STROKE_FILL; } if (type != DrawAttr.PAINT_FILL) { int stroke = getStrokeWidth(); double[] q = toArray(loc); double[] p0 = toArray(this.p0); double[] p1 = toArray(this.p1); double[] p2 = toArray(this.p2); double[] p = CurveUtil.findNearestPoint(q, p0, p1, p2); if (p == null) return false; int thr; if (type == DrawAttr.PAINT_STROKE) { thr = Math.max(Line.ON_LINE_THRESH, stroke / 2); } else { thr = stroke / 2; } if (LineUtil.distanceSquared(p[0], p[1], q[0], q[1]) < thr * thr) { return true; } } if (type != DrawAttr.PAINT_STROKE) { QuadCurve2D curve = getCurve(null); if (curve.contains(loc.getX(), loc.getY())) { return true; } } return false; } @Override public void translate(int dx, int dy) { p0 = p0.translate(dx, dy); p1 = p1.translate(dx, dy); p2 = p2.translate(dx, dy); bounds = bounds.translate(dx, dy); } public List getHandles() { return UnmodifiableList.create(getHandleArray(null)); } @Override public List getHandles(HandleGesture gesture) { return UnmodifiableList.create(getHandleArray(gesture)); } private Handle[] getHandleArray(HandleGesture gesture) { if (gesture == null) { return new Handle[] { new Handle(this, p0), new Handle(this, p1), new Handle(this, p2) }; } else { Handle g = gesture.getHandle(); int gx = g.getX() + gesture.getDeltaX(); int gy = g.getY() + gesture.getDeltaY(); Handle[] ret = { new Handle(this, p0), new Handle(this, p1), new Handle(this, p2) }; if (g.isAt(p0)) { if (gesture.isShiftDown()) { Location p = LineUtil.snapTo8Cardinals(p2, gx, gy); ret[0] = new Handle(this, p); } else { ret[0] = new Handle(this, gx, gy); } } else if (g.isAt(p2)) { if (gesture.isShiftDown()) { Location p = LineUtil.snapTo8Cardinals(p0, gx, gy); ret[2] = new Handle(this, p); } else { ret[2] = new Handle(this, gx, gy); } } else if (g.isAt(p1)) { if (gesture.isShiftDown()) { double x0 = p0.getX(); double y0 = p0.getY(); double x1 = p2.getX(); double y1 = p2.getY(); double midx = (x0 + x1) / 2; double midy = (y0 + y1) / 2; double dx = x1 - x0; double dy = y1 - y0; double[] p = LineUtil.nearestPointInfinite(gx, gy, midx, midy, midx - dy, midy + dx); gx = (int) Math.round(p[0]); gy = (int) Math.round(p[1]); } if (gesture.isAltDown()) { double[] e0 = { p0.getX(), p0.getY() }; double[] e1 = { p2.getX(), p2.getY() }; double[] mid = { gx, gy }; double[] ct = CurveUtil.interpolate(e0, e1, mid); gx = (int) Math.round(ct[0]); gy = (int) Math.round(ct[1]); } ret[1] = new Handle(this, gx, gy); } return ret; } } @Override public boolean canMoveHandle(Handle handle) { return true; } @Override public Handle moveHandle(HandleGesture gesture) { Handle[] hs = getHandleArray(gesture); Handle ret = null; if (!hs[0].equals(p0)) { p0 = hs[0].getLocation(); ret = hs[0]; } if (!hs[1].equals(p1)) { p1 = hs[1].getLocation(); ret = hs[1]; } if (!hs[2].equals(p2)) { p2 = hs[2].getLocation(); ret = hs[2]; } bounds = CurveUtil.getBounds(toArray(p0), toArray(p1), toArray(p2)); return ret; } @Override public void paint(Graphics g, HandleGesture gesture) { QuadCurve2D curve = getCurve(gesture); if (setForFill(g)) { ((Graphics2D) g).fill(curve); } if (setForStroke(g)) { ((Graphics2D) g).draw(curve); } } private QuadCurve2D getCurve(HandleGesture gesture) { Handle[] p = getHandleArray(gesture); return new QuadCurve2D.Double(p[0].getX(), p[0].getY(), p[1].getX(), p[1].getY(), p[2].getX(), p[2].getY()); } private static double[] toArray(Location loc) { return new double[] { loc.getX(), loc.getY() }; } } logisim-2.7.1/src/com/cburch/draw/model/0000755000175000017500000000000011450405544017734 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/draw/model/ReorderRequest.java0000644000175000017500000000300711446034574023560 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.model; import java.util.Comparator; public class ReorderRequest { public static final Comparator ASCENDING_FROM = new Compare(true, true); public static final Comparator DESCENDING_FROM = new Compare(true, true); public static final Comparator ASCENDING_TO = new Compare(true, true); public static final Comparator DESCENDING_TO = new Compare(true, true); private static class Compare implements Comparator { private boolean onFrom; private boolean asc; Compare(boolean onFrom, boolean asc) { this.onFrom = onFrom; this.asc = asc; } public int compare(ReorderRequest a, ReorderRequest b) { int i = onFrom ? a.fromIndex : a.toIndex; int j = onFrom ? b.fromIndex : b.toIndex; if (i < j) { return asc ? -1 : 1; } else if (i > j) { return asc ? 1 : -1; } else { return 0; } } } private CanvasObject object; private int fromIndex; private int toIndex; public ReorderRequest(CanvasObject object, int from, int to) { this.object = object; this.fromIndex = from; this.toIndex = to; } public CanvasObject getObject() { return object; } public int getFromIndex() { return fromIndex; } public int getToIndex() { return toIndex; } } logisim-2.7.1/src/com/cburch/draw/model/HandleGesture.java0000644000175000017500000000227711446034574023347 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.model; import java.awt.event.InputEvent; public class HandleGesture { private Handle handle; private int dx; private int dy; private int modifiersEx; private Handle resultingHandle; public HandleGesture(Handle handle, int dx, int dy, int modifiersEx) { this.handle = handle; this.dx = dx; this.dy = dy; this.modifiersEx = modifiersEx; } public Handle getHandle() { return handle; } public int getDeltaX() { return dx; } public int getDeltaY() { return dy; } public int getModifiersEx() { return modifiersEx; } public boolean isShiftDown() { return (modifiersEx & InputEvent.SHIFT_DOWN_MASK) != 0; } public boolean isControlDown() { return (modifiersEx & InputEvent.CTRL_DOWN_MASK) != 0; } public boolean isAltDown() { return (modifiersEx & InputEvent.ALT_DOWN_MASK) != 0; } public void setResultingHandle(Handle value) { resultingHandle = value; } public Handle getResultingHandle() { return resultingHandle; } } logisim-2.7.1/src/com/cburch/draw/model/Handle.java0000644000175000017500000000237011446034574022002 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.model; import com.cburch.logisim.data.Location; public class Handle { private CanvasObject object; private int x; private int y; public Handle(CanvasObject object, int x, int y) { this.object = object; this.x = x; this.y = y; } public Handle(CanvasObject object, Location loc) { this(object, loc.getX(), loc.getY()); } public CanvasObject getObject() { return object; } public int getX() { return x; } public int getY() { return y; } public Location getLocation() { return Location.create(x, y); } public boolean isAt(Location loc) { return x == loc.getX() && y == loc.getY(); } public boolean isAt(int xq, int yq) { return x == xq && y == yq; } @Override public boolean equals(Object other) { if (other instanceof Handle) { Handle that = (Handle) other; return this.object.equals(that.object) && this.x == that.x && this.y == that.y; } else { return false; } } @Override public int hashCode() { return (this.object.hashCode() * 31 + x) * 31 + y; } } logisim-2.7.1/src/com/cburch/draw/model/DrawingOverlaps.java0000644000175000017500000000416711446034574023724 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.model; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; class DrawingOverlaps { private Map> map; private Set untested; public DrawingOverlaps() { map = new HashMap>(); untested = new HashSet(); } public Collection getObjectsOverlapping(CanvasObject o) { ensureUpdated(); List ret = map.get(o); if (ret == null || ret.isEmpty()) { return Collections.emptyList(); } else { return Collections.unmodifiableList(ret); } } private void ensureUpdated() { for (CanvasObject o : untested) { ArrayList over = new ArrayList(); for (CanvasObject o2 : map.keySet()) { if (o != o2 && o.overlaps(o2)) { over.add(o2); addOverlap(o2, o); } } map.put(o, over); } untested.clear(); } private void addOverlap(CanvasObject a, CanvasObject b) { List alist = map.get(a); if (alist == null) { alist = new ArrayList(); map.put(a, alist); } if (!alist.contains(b)) { alist.add(b); } } public void addShape(CanvasObject shape) { untested.add(shape); } public void removeShape(CanvasObject shape) { untested.remove(shape); List mapped = map.remove(shape); if (mapped != null) { for (CanvasObject o : mapped) { List reverse = map.get(o); if (reverse != null) { reverse.remove(shape); } } } } public void invalidateShape(CanvasObject shape) { removeShape(shape); untested.add(shape); } public void invalidateShapes(Collection shapes) { for (CanvasObject o : shapes) { invalidateShape(o); } } } logisim-2.7.1/src/com/cburch/draw/model/Drawing.java0000644000175000017500000001706111450405534022176 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.model; import java.awt.Graphics; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; import com.cburch.draw.canvas.Selection; import com.cburch.draw.shapes.Text; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.util.EventSourceWeakSupport; public class Drawing implements CanvasModel { private EventSourceWeakSupport listeners; private ArrayList canvasObjects; private DrawingOverlaps overlaps; public Drawing() { listeners = new EventSourceWeakSupport(); canvasObjects = new ArrayList(); overlaps = new DrawingOverlaps(); } public void addCanvasModelListener(CanvasModelListener l) { listeners.add(l); } public void removeCanvasModelListener(CanvasModelListener l) { listeners.remove(l); } protected boolean isChangeAllowed(CanvasModelEvent e) { return true; } private void fireChanged(CanvasModelEvent e) { for (CanvasModelListener listener : listeners) { listener.modelChanged(e); } } public void paint(Graphics g, Selection selection) { Set suppressed = selection.getDrawsSuppressed(); for (CanvasObject shape : getObjectsFromBottom()) { Graphics dup = g.create(); if (suppressed.contains(shape)) { selection.drawSuppressed(dup, shape); } else { shape.paint(dup, null); } dup.dispose(); } } public List getObjectsFromTop() { ArrayList ret = new ArrayList(getObjectsFromBottom()); Collections.reverse(ret); return ret; } public List getObjectsFromBottom() { return Collections.unmodifiableList(canvasObjects); } public Collection getObjectsIn(Bounds bds) { ArrayList ret = null; for (CanvasObject shape : getObjectsFromBottom()) { if (bds.contains(shape.getBounds())) { if (ret == null) ret = new ArrayList(); ret.add(shape); } } if (ret == null) { return Collections.emptyList(); } else { return ret; } } public Collection getObjectsOverlapping(CanvasObject shape) { return overlaps.getObjectsOverlapping(shape); } public void addObjects(int index, Collection shapes) { LinkedHashMap indexes; indexes = new LinkedHashMap(); int i = index; for (CanvasObject shape : shapes) { indexes.put(shape, Integer.valueOf(i)); i++; } addObjectsHelp(indexes); } public void addObjects(Map shapes) { addObjectsHelp(shapes); } private void addObjectsHelp(Map shapes) { // this is separate method so that subclass can call super.add to either // of the add methods, and it won't get redirected into the subclass // in calling the other add method CanvasModelEvent e = CanvasModelEvent.forAdd(this, shapes.keySet()); if (!shapes.isEmpty() && isChangeAllowed(e)) { for (Map.Entry entry : shapes.entrySet()) { CanvasObject shape = entry.getKey(); int index = entry.getValue().intValue(); canvasObjects.add(index, shape); overlaps.addShape(shape); } fireChanged(e); } } public void removeObjects(Collection shapes) { List found = restrict(shapes); CanvasModelEvent e = CanvasModelEvent.forRemove(this, found); if (!found.isEmpty() && isChangeAllowed(e)) { for (CanvasObject shape : found) { canvasObjects.remove(shape); overlaps.removeShape(shape); } fireChanged(e); } } public void translateObjects(Collection shapes, int dx, int dy) { List found = restrict(shapes); CanvasModelEvent e = CanvasModelEvent.forTranslate(this, found, dx, dy); if (!found.isEmpty() && (dx != 0 || dy != 0) && isChangeAllowed(e)) { for (CanvasObject shape : shapes) { shape.translate(dx, dy); overlaps.invalidateShape(shape); } fireChanged(e); } } public void reorderObjects(List requests) { boolean hasEffect = false; for (ReorderRequest r : requests) { if (r.getFromIndex() != r.getToIndex()) { hasEffect = true; } } CanvasModelEvent e = CanvasModelEvent.forReorder(this, requests); if (hasEffect && isChangeAllowed(e)) { for (ReorderRequest r : requests) { if (canvasObjects.get(r.getFromIndex()) != r.getObject()) { throw new IllegalArgumentException("object not present" + " at indicated index: " + r.getFromIndex()); } canvasObjects.remove(r.getFromIndex()); canvasObjects.add(r.getToIndex(), r.getObject()); } fireChanged(e); } } public Handle moveHandle(HandleGesture gesture) { CanvasModelEvent e = CanvasModelEvent.forMoveHandle(this, gesture); CanvasObject o = gesture.getHandle().getObject(); if (canvasObjects.contains(o) && (gesture.getDeltaX() != 0 || gesture.getDeltaY() != 0) && isChangeAllowed(e)) { Handle moved = o.moveHandle(gesture); gesture.setResultingHandle(moved); overlaps.invalidateShape(o); fireChanged(e); return moved; } else { return null; } } public void insertHandle(Handle desired, Handle previous) { CanvasObject obj = desired.getObject(); CanvasModelEvent e = CanvasModelEvent.forInsertHandle(this, desired); if (isChangeAllowed(e)) { obj.insertHandle(desired, previous); overlaps.invalidateShape(obj); fireChanged(e); } } public Handle deleteHandle(Handle handle) { CanvasModelEvent e = CanvasModelEvent.forDeleteHandle(this, handle); if (isChangeAllowed(e)) { CanvasObject o = handle.getObject(); Handle ret = o.deleteHandle(handle); overlaps.invalidateShape(o); fireChanged(e); return ret; } else { return null; } } public void setAttributeValues(Map values) { HashMap oldValues; oldValues = new HashMap(); for (AttributeMapKey key : values.keySet()) { @SuppressWarnings("unchecked") Attribute attr = (Attribute) key.getAttribute(); Object oldValue = key.getObject().getValue(attr); oldValues.put(key, oldValue); } CanvasModelEvent e = CanvasModelEvent.forChangeAttributes(this, oldValues, values); if (isChangeAllowed(e)) { for (Map.Entry entry : values.entrySet()) { AttributeMapKey key = entry.getKey(); CanvasObject shape = key.getObject(); @SuppressWarnings("unchecked") Attribute attr = (Attribute) key.getAttribute(); shape.setValue(attr, entry.getValue()); overlaps.invalidateShape(shape); } fireChanged(e); } } public void setText(Text text, String value) { String oldValue = text.getText(); CanvasModelEvent e = CanvasModelEvent.forChangeText(this, text, oldValue, value); if (canvasObjects.contains(text) && !oldValue.equals(value) && isChangeAllowed(e)) { text.setText(value); overlaps.invalidateShape(text); fireChanged(e); } } private ArrayList restrict( Collection shapes) { ArrayList ret; ret = new ArrayList(shapes.size()); for (CanvasObject shape : shapes) { if (canvasObjects.contains(shape)) { ret.add(shape); } } return ret; } } logisim-2.7.1/src/com/cburch/draw/model/CanvasObject.java0000644000175000017500000000273211446034574023153 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.model; import java.awt.Graphics; import java.util.List; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Location; public interface CanvasObject { public abstract CanvasObject clone(); public abstract String getDisplayName(); public abstract AttributeSet getAttributeSet(); public abstract V getValue(Attribute attr); public abstract Bounds getBounds(); public abstract boolean matches(CanvasObject other); public abstract int matchesHashCode(); public abstract boolean contains(Location loc, boolean assumeFilled); public abstract boolean overlaps(CanvasObject other); public abstract List getHandles(HandleGesture gesture); public abstract boolean canRemove(); public abstract boolean canMoveHandle(Handle handle); public abstract Handle canInsertHandle(Location desired); public abstract Handle canDeleteHandle(Location desired); public abstract void paint(Graphics g, HandleGesture gesture); public Handle moveHandle(HandleGesture gesture); public void insertHandle(Handle desired, Handle previous); public Handle deleteHandle(Handle handle); public void translate(int dx, int dy); public void setValue(Attribute attr, V value); } logisim-2.7.1/src/com/cburch/draw/model/CanvasModelListener.java0000644000175000017500000000052111446034574024505 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.model; import java.util.EventListener; public interface CanvasModelListener extends EventListener { public void modelChanged(CanvasModelEvent event); } logisim-2.7.1/src/com/cburch/draw/model/CanvasModelEvent.java0000644000175000017500000001472111450405522023776 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.model; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.EventObject; import java.util.HashMap; import java.util.HashSet; import java.util.Map; public class CanvasModelEvent extends EventObject { public static final int ACTION_ADDED = 0; public static final int ACTION_REMOVED = 1; public static final int ACTION_TRANSLATED = 2; public static final int ACTION_REORDERED = 3; public static final int ACTION_HANDLE_MOVED = 4; public static final int ACTION_HANDLE_INSERTED = 5; public static final int ACTION_HANDLE_DELETED = 6; public static final int ACTION_ATTRIBUTES_CHANGED = 7; public static final int ACTION_TEXT_CHANGED = 8; public static CanvasModelEvent forAdd(CanvasModel source, Collection affected) { return new CanvasModelEvent(source, ACTION_ADDED, affected); } public static CanvasModelEvent forRemove(CanvasModel source, Collection affected) { return new CanvasModelEvent(source, ACTION_REMOVED, affected); } public static CanvasModelEvent forTranslate(CanvasModel source, Collection affected, int dx, int dy) { return new CanvasModelEvent(source, ACTION_TRANSLATED, affected, 0, 0); } public static CanvasModelEvent forReorder(CanvasModel source, Collection requests) { return new CanvasModelEvent(true, source, ACTION_REORDERED, requests); } public static CanvasModelEvent forInsertHandle(CanvasModel source, Handle desired) { return new CanvasModelEvent(source, ACTION_HANDLE_INSERTED, desired); } public static CanvasModelEvent forDeleteHandle(CanvasModel source, Handle handle) { return new CanvasModelEvent(source, ACTION_HANDLE_DELETED, handle); } public static CanvasModelEvent forMoveHandle(CanvasModel source, HandleGesture gesture) { return new CanvasModelEvent(source, ACTION_HANDLE_MOVED, gesture); } public static CanvasModelEvent forChangeAttributes(CanvasModel source, Map oldValues, Map newValues) { return new CanvasModelEvent(source, ACTION_ATTRIBUTES_CHANGED, oldValues, newValues); } public static CanvasModelEvent forChangeText(CanvasModel source, CanvasObject obj, String oldText, String newText) { return new CanvasModelEvent(source, ACTION_TEXT_CHANGED, Collections.singleton(obj), oldText, newText); } private int action; private Collection affected; private int deltaX; private int deltaY; private Map oldValues; private Map newValues; private Collection reorderRequests; private Handle handle; private HandleGesture gesture; private String oldText; private String newText; private CanvasModelEvent(CanvasModel source, int action, Collection affected) { super(source); this.action = action; this.affected = affected; this.deltaX = 0; this.deltaY = 0; this.oldValues = null; this.newValues = null; this.reorderRequests = null; this.handle = null; this.gesture = null; this.oldText = null; this.newText = null; } private CanvasModelEvent(CanvasModel source, int action, Collection affected, int dx, int dy) { this(source, action, affected); this.deltaX = dx; this.deltaY = dy; } private CanvasModelEvent(CanvasModel source, int action, Handle handle) { this(source, action, Collections.singleton(handle.getObject())); this.handle = handle; } private CanvasModelEvent(CanvasModel source, int action, HandleGesture gesture) { this(source, action, gesture.getHandle()); this.gesture = gesture; } private CanvasModelEvent(CanvasModel source, int action, Map oldValues, Map newValues) { this(source, action, Collections.emptySet()); HashSet affected; affected = new HashSet(newValues.size()); for (AttributeMapKey key : newValues.keySet()) { affected.add(key.getObject()); } this.affected = affected; Map oldValuesCopy; oldValuesCopy = new HashMap(oldValues); Map newValuesCopy; newValuesCopy = new HashMap(newValues); this.oldValues = Collections.unmodifiableMap(oldValuesCopy); this.newValues = Collections.unmodifiableMap(newValuesCopy); } private CanvasModelEvent(CanvasModel source, int action, Collection affected, String oldText, String newText) { this(source, action, affected); this.oldText = oldText; this.newText = newText; } // the boolean parameter is just because the compiler insists upon it to // avoid an erasure conflict with the first constructor private CanvasModelEvent(boolean dummy, CanvasModel source, int action, Collection requests) { this(source, action, Collections.emptySet()); ArrayList affected; affected = new ArrayList(requests.size()); for (ReorderRequest r : requests) { affected.add(r.getObject()); } this.affected = affected; this.reorderRequests = Collections.unmodifiableCollection(requests); } public int getAction() { return action; } public Collection getAffected() { Collection ret = affected; if (ret == null) { Map newVals = newValues; if (newVals != null) { HashSet keys = new HashSet(); for (AttributeMapKey key : newVals.keySet()) { keys.add(key.getObject()); } ret = Collections.unmodifiableCollection(keys); affected = ret; } } return affected; } public int getDeltaX() { return deltaX; } public int getDeltaY() { return deltaY; } public Handle getHandle() { return handle; } public HandleGesture getHandleGesture() { return gesture; } public Map getOldValues() { return oldValues; } public Map getNewValues() { return newValues; } public Collection getReorderRequests() { return reorderRequests; } public String getOldText() { return oldText; } public String getNewText() { return newText; } } logisim-2.7.1/src/com/cburch/draw/model/CanvasModel.java0000644000175000017500000000313411446663006023000 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.model; import java.awt.Graphics; import java.util.Collection; import java.util.List; import java.util.Map; import com.cburch.draw.canvas.Selection; import com.cburch.draw.shapes.Text; import com.cburch.logisim.data.Bounds; public interface CanvasModel { // listener methods public void addCanvasModelListener(CanvasModelListener l); public void removeCanvasModelListener(CanvasModelListener l); // methods that don't change any data in the model public void paint(Graphics g, Selection selection); public List getObjectsFromTop(); public List getObjectsFromBottom(); public Collection getObjectsIn(Bounds bds); public Collection getObjectsOverlapping(CanvasObject shape); // methods that alter the model public void addObjects(int index, Collection shapes); public void addObjects(Map shapes); public void removeObjects(Collection shapes); public void translateObjects(Collection shapes, int dx, int dy); public void reorderObjects(List requests); public Handle moveHandle(HandleGesture gesture); public void insertHandle(Handle desired, Handle previous); public Handle deleteHandle(Handle handle); public void setAttributeValues(Map values); public void setText(Text text, String value); } logisim-2.7.1/src/com/cburch/draw/model/AttributeMapKey.java0000644000175000017500000000173411450405506023654 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.model; import com.cburch.logisim.data.Attribute; public class AttributeMapKey { private Attribute attr; private CanvasObject object; public AttributeMapKey(Attribute attr, CanvasObject object) { this.attr = attr; this.object = object; } public Attribute getAttribute() { return attr; } public CanvasObject getObject() { return object; } @Override public int hashCode() { int a = attr == null ? 0 : attr.hashCode(); int b = object == null ? 0 : object.hashCode(); return a ^ b; } @Override public boolean equals(Object other) { if (!(other instanceof AttributeMapKey)) return false; AttributeMapKey o = (AttributeMapKey) other; return (attr == null ? o.attr == null : attr.equals(o.attr)) && (object == null ? o.object == null : object.equals(o.object)); } } logisim-2.7.1/src/com/cburch/draw/model/AbstractCanvasObject.java0000644000175000017500000001421011450405544024623 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.model; import com.cburch.draw.shapes.DrawAttr; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeEvent; import com.cburch.logisim.data.AttributeListener; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Location; import com.cburch.logisim.util.EventSourceWeakSupport; import com.cburch.logisim.util.GraphicsUtil; import java.awt.Color; import java.awt.Graphics; import java.util.List; import java.util.Random; import org.w3c.dom.Document; import org.w3c.dom.Element; public abstract class AbstractCanvasObject implements AttributeSet, CanvasObject, Cloneable { private static final int OVERLAP_TRIES = 50; private static final int GENERATE_RANDOM_TRIES = 20; private EventSourceWeakSupport listeners; public AbstractCanvasObject() { listeners = new EventSourceWeakSupport(); } public AttributeSet getAttributeSet() { return this; } public abstract String getDisplayName(); public abstract Element toSvgElement(Document doc); public abstract boolean matches(CanvasObject other); public abstract int matchesHashCode(); public abstract Bounds getBounds(); public abstract boolean contains(Location loc, boolean assumeFilled); public abstract void translate(int dx, int dy); public abstract List getHandles(HandleGesture gesture); protected abstract void updateValue(Attribute attr, Object value); public abstract void paint(Graphics g, HandleGesture gesture); public boolean canRemove() { return true; } public boolean canMoveHandle(Handle handle) { return false; } public Handle canInsertHandle(Location desired) { return null; } public Handle canDeleteHandle(Location loc) { return null; } public Handle moveHandle(HandleGesture gesture) { throw new UnsupportedOperationException("moveHandle"); } public void insertHandle(Handle desired, Handle previous) { throw new UnsupportedOperationException("insertHandle"); } public Handle deleteHandle(Handle handle) { throw new UnsupportedOperationException("deleteHandle"); } public boolean overlaps(CanvasObject other) { Bounds a = this.getBounds(); Bounds b = other.getBounds(); Bounds c = a.intersect(b); Random rand = new Random(); if (c.getWidth() == 0 || c.getHeight() == 0) { return false; } else if (other instanceof AbstractCanvasObject) { AbstractCanvasObject that = (AbstractCanvasObject) other; for (int i = 0; i < OVERLAP_TRIES; i++) { if (i % 2 == 0) { Location loc = this.getRandomPoint(c, rand); if (loc != null && that.contains(loc, false)) return true; } else { Location loc = that.getRandomPoint(c, rand); if (loc != null && this.contains(loc, false)) return true; } } return false; } else { for (int i = 0; i < OVERLAP_TRIES; i++) { Location loc = this.getRandomPoint(c, rand); if (loc != null && other.contains(loc, false)) return true; } return false; } } protected Location getRandomPoint(Bounds bds, Random rand) { int x = bds.getX(); int y = bds.getY(); int w = bds.getWidth(); int h = bds.getHeight(); for (int i = 0; i < GENERATE_RANDOM_TRIES; i++) { Location loc = Location.create(x + rand.nextInt(w), y + rand.nextInt(h)); if (contains(loc, false)) return loc; } return null; } // methods required by AttributeSet interface public abstract List> getAttributes(); public abstract V getValue(Attribute attr); public void addAttributeListener(AttributeListener l) { listeners.add(l); } public void removeAttributeListener(AttributeListener l) { listeners.remove(l); } @Override public CanvasObject clone() { try { AbstractCanvasObject ret = (AbstractCanvasObject) super.clone(); ret.listeners = new EventSourceWeakSupport(); return ret; } catch (CloneNotSupportedException e) { return null; } } public boolean containsAttribute(Attribute attr) { return getAttributes().contains(attr); } public Attribute getAttribute(String name) { for (Attribute attr : getAttributes()) { if (attr.getName().equals(name)) return attr; } return null; } public boolean isReadOnly(Attribute attr) { return false; } public void setReadOnly(Attribute attr, boolean value) { throw new UnsupportedOperationException("setReadOnly"); } public boolean isToSave(Attribute attr) { return true; } public final void setValue(Attribute attr, V value) { Object old = getValue(attr); boolean same = old == null ? value == null : old.equals(value); if (!same) { updateValue(attr, value); AttributeEvent e = new AttributeEvent(this, attr, value); for (AttributeListener listener : listeners) { listener.attributeValueChanged(e); } } } protected void fireAttributeListChanged() { AttributeEvent e = new AttributeEvent(this); for (AttributeListener listener : listeners) { listener.attributeListChanged(e); } } protected boolean setForStroke(Graphics g) { List> attrs = getAttributes(); if (attrs.contains(DrawAttr.PAINT_TYPE)) { Object value = getValue(DrawAttr.PAINT_TYPE); if (value == DrawAttr.PAINT_FILL) return false; } Integer width = getValue(DrawAttr.STROKE_WIDTH); if (width != null && width.intValue() > 0) { Color color = getValue(DrawAttr.STROKE_COLOR); if (color != null && color.getAlpha() == 0) { return false; } else { GraphicsUtil.switchToWidth(g, width.intValue()); if (color != null) g.setColor(color); return true; } } else { return false; } } protected boolean setForFill(Graphics g) { List> attrs = getAttributes(); if (attrs.contains(DrawAttr.PAINT_TYPE)) { Object value = getValue(DrawAttr.PAINT_TYPE); if (value == DrawAttr.PAINT_STROKE) return false; } Color color = getValue(DrawAttr.FILL_COLOR); if (color != null && color.getAlpha() == 0) { return false; } else { if (color != null) g.setColor(color); return true; } } } logisim-2.7.1/src/com/cburch/draw/gui/0000755000175000017500000000000011541271700017414 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/draw/gui/Toolbar.java0000644000175000017500000000773511450405462021700 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.gui; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import javax.swing.Icon; import javax.swing.JComponent; import com.cburch.draw.canvas.Canvas; import com.cburch.draw.canvas.CanvasTool; import com.cburch.draw.tools.AbstractTool; import com.cburch.draw.tools.DrawingAttributeSet; import com.cburch.logisim.util.GraphicsUtil; class Toolbar extends JComponent { private static int ICON_WIDTH = 16; private static int ICON_HEIGHT = 16; private static int ICON_SEP = 4; private class Listener implements MouseListener, MouseMotionListener { private AbstractTool toolPressed; private boolean inTool; private int toolX; private int toolY; public void mouseClicked(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mousePressed(MouseEvent e) { int mx = e.getX(); int my = e.getY(); int col = (e.getX() - ICON_SEP) / (ICON_WIDTH + ICON_SEP); int row = (e.getY() - ICON_SEP) / (ICON_HEIGHT + ICON_SEP); int x0 = ICON_SEP + col * (ICON_SEP + ICON_WIDTH); int y0 = ICON_SEP + row * (ICON_SEP + ICON_HEIGHT); if (mx >= x0 && mx < x0 + ICON_WIDTH && my >= y0 && my < y0 + ICON_HEIGHT && col >= 0 && col < tools.length && row >= 0 && row < tools[col].length) { toolPressed = tools[col][row]; inTool = true; toolX = x0; toolY = y0; repaint(); } else { toolPressed = null; inTool = false; } } public void mouseReleased(MouseEvent e) { mouseDragged(e); if (inTool) { canvas.setTool(toolPressed); repaint(); } toolPressed = null; inTool = false; } public void mouseDragged(MouseEvent e) { int mx = e.getX(); int my = e.getY(); int x0 = toolX; int y0 = toolY; boolean was = inTool; boolean now = toolPressed != null && mx >= x0 && mx < x0 + ICON_WIDTH && my >= y0 && my < y0 + ICON_HEIGHT; if (was != now) { inTool = now; repaint(); } } public void mouseMoved(MouseEvent e) { } } private Canvas canvas; private AbstractTool[][] tools; private Listener listener; public Toolbar(Canvas canvas, DrawingAttributeSet attrs) { this.canvas = canvas; this.tools = new AbstractTool[][] { AbstractTool.getTools(attrs) }; this.listener = new Listener(); AbstractTool[] toolBase = AbstractTool.getTools(attrs); this.tools = new AbstractTool[2][]; this.tools[0] = new AbstractTool[(toolBase.length + 1) / 2]; this.tools[1] = new AbstractTool[toolBase.length / 2]; for(int i = 0; i < toolBase.length; i++) { this.tools[i % 2][i / 2] = toolBase[i]; } setPreferredSize(new Dimension(3 * ICON_SEP + 2 * ICON_WIDTH, ICON_SEP + tools[0].length * (ICON_HEIGHT + ICON_SEP))); addMouseListener(listener); addMouseMotionListener(listener); } public AbstractTool getDefaultTool() { return tools[0][0]; } @Override public void paintComponent(Graphics g) { g.clearRect(0, 0, getWidth(), getHeight()); CanvasTool current = canvas.getTool(); for(int i = 0; i < tools.length; i++) { AbstractTool[] column = tools[i]; int x = ICON_SEP + i * (ICON_SEP + ICON_WIDTH); int y = ICON_SEP; for(int j = 0; j < column.length; j++) { AbstractTool tool = column[j]; if (tool == listener.toolPressed && listener.inTool) { g.setColor(Color.darkGray); g.fillRect(x, y, ICON_WIDTH, ICON_HEIGHT); } Icon icon = tool.getIcon(); if (icon != null) icon.paintIcon(this, g, x, y); if (tool == current) { GraphicsUtil.switchToWidth(g, 2); g.setColor(Color.black); g.drawRect(x - 1, y - 1, ICON_WIDTH + 2, ICON_HEIGHT + 2); } y += ICON_HEIGHT + ICON_SEP; } } g.setColor(Color.black); GraphicsUtil.switchToWidth(g, 1); } } logisim-2.7.1/src/com/cburch/draw/gui/Strings.java0000644000175000017500000000144211527054420021713 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.gui; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.StringGetter; import com.cburch.logisim.util.StringUtil; class Strings { private static LocaleManager source = new LocaleManager("resources/logisim", "draw"); public static String get(String key) { return source.get(key); } public static String get(String key, String arg) { return StringUtil.format(source.get(key), arg); } public static String get(String key, String arg0, String arg1) { return StringUtil.format(source.get(key), arg0, arg1); } public static StringGetter getter(String key) { return source.getter(key); } } logisim-2.7.1/src/com/cburch/draw/gui/SelectionAttributes.java0000644000175000017500000001325111541271666024270 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.gui; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import com.cburch.draw.canvas.Selection; import com.cburch.draw.canvas.SelectionEvent; import com.cburch.draw.canvas.SelectionListener; import com.cburch.draw.model.CanvasObject; import com.cburch.logisim.data.AbstractAttributeSet; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeEvent; import com.cburch.logisim.data.AttributeListener; import com.cburch.logisim.data.AttributeSet; public class SelectionAttributes extends AbstractAttributeSet { private class Listener implements SelectionListener, AttributeListener { // // SelectionListener // public void selectionChanged(SelectionEvent ex) { Map oldSel = selected; Map newSel = new HashMap(); for (CanvasObject o : selection.getSelected()) { newSel.put(o.getAttributeSet(), o); } selected = newSel; boolean change = false; for (AttributeSet attrs : oldSel.keySet()) { if (!newSel.containsKey(attrs)) { change = true; attrs.removeAttributeListener(this); } } for (AttributeSet attrs : newSel.keySet()) { if (!oldSel.containsKey(attrs)) { change = true; attrs.addAttributeListener(this); } } if (change) { computeAttributeList(newSel.keySet()); fireAttributeListChanged(); } } private void computeAttributeList(Set attrsSet) { Set> attrSet = new LinkedHashSet>(); Iterator sit = attrsSet.iterator(); if (sit.hasNext()) { AttributeSet first = sit.next(); attrSet.addAll(first.getAttributes()); while (sit.hasNext()) { AttributeSet next = sit.next(); for (Iterator> ait = attrSet.iterator(); ait.hasNext(); ) { Attribute attr = ait.next(); if (!next.containsAttribute(attr)) { ait.remove(); } } } } Attribute[] attrs = new Attribute[attrSet.size()]; Object[] values = new Object[attrs.length]; int i = 0; for (Attribute attr : attrSet) { attrs[i] = attr; values[i] = getSelectionValue(attr, attrsSet); i++; } SelectionAttributes.this.selAttrs = attrs; SelectionAttributes.this.selValues = values; SelectionAttributes.this.attrsView = Collections.unmodifiableList(Arrays.asList(attrs)); fireAttributeListChanged(); } // // AttributeSet listener // public void attributeListChanged(AttributeEvent e) { // show selection attributes computeAttributeList(selected.keySet()); } public void attributeValueChanged(AttributeEvent e) { if (selected.containsKey(e.getSource())) { @SuppressWarnings("unchecked") Attribute attr = (Attribute) e.getAttribute(); Attribute[] attrs = SelectionAttributes.this.selAttrs; Object[] values = SelectionAttributes.this.selValues; for (int i = 0; i < attrs.length; i++) { if (attrs[i] == attr) { values[i] = getSelectionValue(attr, selected.keySet()); } } } } } private Selection selection; private Listener listener; private Map selected; private Attribute[] selAttrs; private Object[] selValues; private List> attrsView; public SelectionAttributes(Selection selection) { this.selection = selection; this.listener = new Listener(); this.selected = Collections.emptyMap(); this.selAttrs = new Attribute[0]; this.selValues = new Object[0]; this.attrsView = Collections.unmodifiableList(Arrays.asList(selAttrs)); selection.addSelectionListener(listener); listener.selectionChanged(null); } public Iterable> entries() { Set> raw = selected.entrySet(); ArrayList> ret; ret = new ArrayList>(raw); return ret; } // // AbstractAttributeSet methods // @Override protected void copyInto(AbstractAttributeSet dest) { listener = new Listener(); selection.addSelectionListener(listener); } @Override public List> getAttributes() { return attrsView; } @Override public V getValue(Attribute attr) { Attribute[] attrs = this.selAttrs; Object[] values = this.selValues; for (int i = 0; i < attrs.length; i++) { if (attrs[i] == attr) { @SuppressWarnings("unchecked") V ret = (V) values[i]; return ret; } } return null; } @Override public void setValue(Attribute attr, V value) { Attribute[] attrs = this.selAttrs; Object[] values = this.selValues; for (int i = 0; i < attrs.length; i++) { if (attrs[i] == attr) { boolean same = value == null ? values[i] == null : value.equals(values[i]); if (!same) { values[i] = value; for (AttributeSet objAttrs : selected.keySet()) { objAttrs.setValue(attr, value); } } break; } } } private static Object getSelectionValue(Attribute attr, Set sel) { Object ret = null; for (AttributeSet attrs : sel) { if (attrs.containsAttribute(attr)) { Object val = attrs.getValue(attr); if (ret == null) { ret = val; } else if (val != null && val.equals(ret)) { ; // keep on, making sure everything else matches } else { return null; } } } return ret; } } logisim-2.7.1/src/com/cburch/draw/gui/Main.java0000644000175000017500000000357311527054420021155 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.gui; import java.awt.BorderLayout; import java.util.Collections; import javax.swing.JFrame; import com.cburch.draw.canvas.Canvas; import com.cburch.draw.model.CanvasObject; import com.cburch.draw.model.Drawing; import com.cburch.draw.shapes.Rectangle; import com.cburch.draw.tools.DrawingAttributeSet; import com.cburch.draw.undo.UndoLog; import com.cburch.draw.undo.UndoLogDispatcher; import com.cburch.logisim.gui.generic.AttrTable; import com.cburch.logisim.util.HorizontalSplitPane; import com.cburch.logisim.util.VerticalSplitPane; public class Main { public static void main(String[] args) { DrawingAttributeSet attrs = new DrawingAttributeSet(); Drawing model = new Drawing(); CanvasObject rect = attrs.applyTo(new Rectangle(25, 25, 50, 50)); model.addObjects(0, Collections.singleton(rect)); showFrame(model, "Drawing 1"); showFrame(model, "Drawing 2"); } private static void showFrame(Drawing model, String title) { JFrame frame = new JFrame(title); DrawingAttributeSet attrs = new DrawingAttributeSet(); Canvas canvas = new Canvas(); Toolbar toolbar = new Toolbar(canvas, attrs); canvas.setModel(model, new UndoLogDispatcher(new UndoLog())); canvas.setTool(toolbar.getDefaultTool()); AttrTable table = new AttrTable(frame); AttrTableDrawManager manager = new AttrTableDrawManager(canvas, table, attrs); manager.attributesSelected(); HorizontalSplitPane west = new HorizontalSplitPane(toolbar, table, 0.5); VerticalSplitPane all = new VerticalSplitPane(west, canvas, 0.3); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(all, BorderLayout.CENTER); frame.pack(); frame.setVisible(true); } } logisim-2.7.1/src/com/cburch/draw/gui/AttrTableToolModel.java0000644000175000017500000000214411541271700023761 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.gui; import com.cburch.draw.tools.AbstractTool; import com.cburch.draw.tools.DrawingAttributeSet; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.gui.generic.AttrTableSetException; import com.cburch.logisim.gui.generic.AttributeSetTableModel; class AttrTableToolModel extends AttributeSetTableModel { private DrawingAttributeSet defaults; private AbstractTool currentTool; public AttrTableToolModel(DrawingAttributeSet defaults, AbstractTool tool) { super(defaults.createSubset(tool)); this.defaults = defaults; this.currentTool = tool; } public void setTool(AbstractTool value) { currentTool = value; setAttributeSet(defaults.createSubset(value)); fireTitleChanged(); } @Override public String getTitle() { return currentTool.getDescription(); } @Override public void setValueRequested(Attribute attr, Object value) throws AttrTableSetException { defaults.setValue(attr, value); } } logisim-2.7.1/src/com/cburch/draw/gui/AttrTableSelectionModel.java0000644000175000017500000000535611527307522025007 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.gui; import java.util.HashMap; import java.util.Map; import com.cburch.draw.actions.ModelChangeAttributeAction; import com.cburch.draw.canvas.Canvas; import com.cburch.draw.canvas.Selection; import com.cburch.draw.canvas.SelectionEvent; import com.cburch.draw.canvas.SelectionListener; import com.cburch.draw.model.AttributeMapKey; import com.cburch.draw.model.CanvasModel; import com.cburch.draw.model.CanvasObject; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.gui.generic.AttrTableSetException; import com.cburch.logisim.gui.generic.AttributeSetTableModel; class AttrTableSelectionModel extends AttributeSetTableModel implements SelectionListener { private Canvas canvas; public AttrTableSelectionModel(Canvas canvas) { super(new SelectionAttributes(canvas.getSelection())); this.canvas = canvas; canvas.getSelection().addSelectionListener(this); } @Override public String getTitle() { Selection sel = canvas.getSelection(); Class commonClass = null; int commonCount = 0; CanvasObject firstObject = null; int totalCount = 0; for (CanvasObject obj : sel.getSelected()) { if (firstObject == null) { firstObject = obj; commonClass = obj.getClass(); commonCount = 1; } else if (obj.getClass() == commonClass) { commonCount++; } else { commonClass = null; } totalCount++; } if (firstObject == null) { return null; } else if (commonClass == null) { return Strings.get("selectionVarious", "" + totalCount); } else if (commonCount == 1) { return Strings.get("selectionOne", firstObject.getDisplayName()); } else { return Strings.get("selectionMultiple", firstObject.getDisplayName(), "" + commonCount); } } @Override public void setValueRequested(Attribute attr, Object value) throws AttrTableSetException { SelectionAttributes attrs = (SelectionAttributes) getAttributeSet(); HashMap oldVals; oldVals = new HashMap(); HashMap newVals; newVals = new HashMap(); for (Map.Entry ent : attrs.entries()) { AttributeMapKey key = new AttributeMapKey(attr, ent.getValue()); oldVals.put(key, ent.getKey().getValue(attr)); newVals.put(key, value); } CanvasModel model = canvas.getModel(); canvas.doAction(new ModelChangeAttributeAction(model, oldVals, newVals)); } // // SelectionListener method // public void selectionChanged(SelectionEvent e) { fireTitleChanged(); } } logisim-2.7.1/src/com/cburch/draw/gui/AttrTableDrawManager.java0000644000175000017500000000317211527054420024257 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.gui; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import com.cburch.draw.canvas.Canvas; import com.cburch.draw.tools.AbstractTool; import com.cburch.draw.tools.DrawingAttributeSet; import com.cburch.draw.tools.SelectTool; import com.cburch.logisim.gui.generic.AttrTable; public class AttrTableDrawManager implements PropertyChangeListener { private Canvas canvas; private AttrTable table; private AttrTableSelectionModel selectionModel; private AttrTableToolModel toolModel; public AttrTableDrawManager(Canvas canvas, AttrTable table, DrawingAttributeSet attrs) { this.canvas = canvas; this.table = table; this.selectionModel = new AttrTableSelectionModel(canvas); this.toolModel = new AttrTableToolModel(attrs, null); canvas.addPropertyChangeListener(Canvas.TOOL_PROPERTY, this); updateToolAttributes(); } public void attributesSelected() { updateToolAttributes(); } // // PropertyChangeListener method // public void propertyChange(PropertyChangeEvent evt) { String prop = evt.getPropertyName(); if (prop.equals(Canvas.TOOL_PROPERTY)) { updateToolAttributes(); } } private void updateToolAttributes() { Object tool = canvas.getTool(); if (tool instanceof SelectTool) { table.setAttrTableModel(selectionModel); } else if (tool instanceof AbstractTool) { toolModel.setTool((AbstractTool) tool); table.setAttrTableModel(toolModel); } else { table.setAttrTableModel(null); } } } logisim-2.7.1/src/com/cburch/draw/canvas/0000755000175000017500000000000011450405570020106 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/draw/canvas/SelectionListener.java0000644000175000017500000000051611446034604024407 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.canvas; import java.util.EventListener; public interface SelectionListener extends EventListener { public void selectionChanged(SelectionEvent e); } logisim-2.7.1/src/com/cburch/draw/canvas/SelectionEvent.java0000644000175000017500000000164711446034604023711 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.canvas; import java.util.Collection; import java.util.EventObject; import com.cburch.draw.model.CanvasObject; public class SelectionEvent extends EventObject { public static final int ACTION_ADDED = 0; public static final int ACTION_REMOVED = 1; public static final int ACTION_HANDLE = 2; private int action; private Collection affected; public SelectionEvent(Selection source, int action, Collection affected) { super(source); this.action = action; this.affected = affected; } public Selection getSelection() { return (Selection) getSource(); } public int getAction() { return action; } public Collection getAffected() { return affected; } } logisim-2.7.1/src/com/cburch/draw/canvas/Selection.java0000644000175000017500000001502311450405570022677 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.canvas; import java.awt.Graphics; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Set; import com.cburch.draw.model.CanvasModelEvent; import com.cburch.draw.model.CanvasObject; import com.cburch.draw.model.Handle; import com.cburch.draw.model.HandleGesture; import com.cburch.logisim.data.Location; public class Selection { private static final String MOVING_HANDLE = "movingHandle"; private static final String TRANSLATING = "translating"; private static final String HIDDEN = "hidden"; private ArrayList listeners; private HashSet selected; private Set selectedView; private HashMap suppressed; private Set suppressedView; private Handle selectedHandle; private HandleGesture curHandleGesture; private int moveDx; private int moveDy; protected Selection() { listeners = new ArrayList(); selected = new HashSet(); suppressed = new HashMap(); selectedView = Collections.unmodifiableSet(selected); suppressedView = Collections.unmodifiableSet(suppressed.keySet()); } public void addSelectionListener(SelectionListener l) { listeners.add(l); } public void removeSelectionListener(SelectionListener l) { listeners.remove(l); } private void fireChanged(int action, Collection affected) { SelectionEvent e = null; for (SelectionListener listener : listeners) { if (e == null) e = new SelectionEvent(this, action, affected); listener.selectionChanged(e); } } public boolean isEmpty() { return selected.isEmpty(); } public boolean isSelected(CanvasObject shape) { return selected.contains(shape); } public Set getSelected() { return selectedView; } public void clearSelected() { if (!selected.isEmpty()) { ArrayList oldSelected; oldSelected = new ArrayList(selected); selected.clear(); suppressed.clear(); setHandleSelected(null); fireChanged(SelectionEvent.ACTION_REMOVED, oldSelected); } } public void setSelected(CanvasObject shape, boolean value) { setSelected(Collections.singleton(shape), value); } public void setSelected(Collection shapes, boolean value) { if (value) { ArrayList added; added = new ArrayList(shapes.size()); for (CanvasObject shape : shapes) { if (selected.add(shape)) { added.add(shape); } } if (!added.isEmpty()) { fireChanged(SelectionEvent.ACTION_ADDED, added); } } else { ArrayList removed; removed = new ArrayList(shapes.size()); for (CanvasObject shape : shapes) { if (selected.remove(shape)) { suppressed.remove(shape); Handle h = selectedHandle; if (h != null && h.getObject() == shape) setHandleSelected(null); removed.add(shape); } } if (!removed.isEmpty()) { fireChanged(SelectionEvent.ACTION_REMOVED, removed); } } } public void toggleSelected(Collection shapes) { ArrayList added; added = new ArrayList(shapes.size()); ArrayList removed; removed = new ArrayList(shapes.size()); for (CanvasObject shape : shapes) { if (selected.contains(shape)) { selected.remove(shape); suppressed.remove(shape); Handle h = selectedHandle; if (h != null && h.getObject() == shape) setHandleSelected(null); removed.add(shape); } else { selected.add(shape); added.add(shape); } } if (!removed.isEmpty()) { fireChanged(SelectionEvent.ACTION_REMOVED, removed); } if (!added.isEmpty()) { fireChanged(SelectionEvent.ACTION_ADDED, added); } } public Set getDrawsSuppressed() { return suppressedView; } public void clearDrawsSuppressed() { suppressed.clear(); curHandleGesture = null; } public Handle getSelectedHandle() { return selectedHandle; } public void setHandleSelected(Handle handle) { Handle cur = selectedHandle; boolean same = cur == null ? handle == null : cur.equals(handle); if (!same) { selectedHandle = handle; curHandleGesture = null; Collection objs; if (handle == null) { objs = Collections.emptySet(); } else { objs = Collections.singleton(handle.getObject()); } fireChanged(SelectionEvent.ACTION_HANDLE, objs); } } public void setHandleGesture(HandleGesture gesture) { HandleGesture g = curHandleGesture; if (g != null) suppressed.remove(g.getHandle().getObject()); Handle h = gesture.getHandle(); suppressed.put(h.getObject(), MOVING_HANDLE); curHandleGesture = gesture; } public void setMovingShapes(Collection shapes, int dx, int dy) { for (CanvasObject o : shapes) { suppressed.put(o, TRANSLATING); } moveDx = dx; moveDy = dy; } public void setHidden(Collection shapes, boolean value) { if (value) { for (CanvasObject o : shapes) { suppressed.put(o, HIDDEN); } } else { suppressed.keySet().removeAll(shapes); } } public Location getMovingDelta() { return Location.create(moveDx, moveDy); } public void setMovingDelta(int dx, int dy) { moveDx = dx; moveDy = dy; } public void drawSuppressed(Graphics g, CanvasObject shape) { String state = suppressed.get(shape); if (state == MOVING_HANDLE) { shape.paint(g, curHandleGesture); } else if (state == TRANSLATING) { g.translate(moveDx, moveDy); shape.paint(g, null); } } void modelChanged(CanvasModelEvent event) { int action = event.getAction(); switch (action) { case CanvasModelEvent.ACTION_REMOVED: Collection affected = event.getAffected(); if (affected != null) { selected.removeAll(affected); suppressed.keySet().removeAll(affected); Handle h = selectedHandle; if (h != null && affected.contains(h.getObject())) { setHandleSelected(null); } } break; case CanvasModelEvent.ACTION_HANDLE_DELETED: if (event.getHandle().equals(selectedHandle)) { setHandleSelected(null); } break; case CanvasModelEvent.ACTION_HANDLE_MOVED: HandleGesture gesture = event.getHandleGesture(); if (gesture.getHandle().equals(selectedHandle)) { setHandleSelected(gesture.getResultingHandle()); } } } } logisim-2.7.1/src/com/cburch/draw/canvas/CanvasTool.java0000644000175000017500000000236311447117152023030 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.canvas; import java.awt.Cursor; import java.awt.Graphics; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; public abstract class CanvasTool { public abstract Cursor getCursor(Canvas canvas); public void draw(Canvas canvas, Graphics g) { } public void toolSelected(Canvas canvas) { } public void toolDeselected(Canvas canvas) { } public void mouseMoved(Canvas canvas, MouseEvent e) { } public void mousePressed(Canvas canvas, MouseEvent e) { } public void mouseDragged(Canvas canvas, MouseEvent e) { } public void mouseReleased(Canvas canvas, MouseEvent e) { } public void mouseEntered(Canvas canvas, MouseEvent e) { } public void mouseExited(Canvas canvas, MouseEvent e) { } /** This is because a popup menu may result from the subsequent mouse release */ public void cancelMousePress(Canvas canvas) { } public void keyPressed(Canvas canvas, KeyEvent e) { } public void keyReleased(Canvas canvas, KeyEvent e) { } public void keyTyped(Canvas canvas, KeyEvent e) { } public void zoomFactorChanged(Canvas canvas) { } } logisim-2.7.1/src/com/cburch/draw/canvas/CanvasListener.java0000644000175000017500000000622511450405500023670 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.canvas; import java.awt.Cursor; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.util.List; import com.cburch.draw.model.CanvasModelEvent; import com.cburch.draw.model.CanvasModelListener; import com.cburch.draw.model.CanvasObject; import com.cburch.logisim.data.Location; class CanvasListener implements MouseListener, MouseMotionListener, KeyListener, CanvasModelListener { private Canvas canvas; private CanvasTool tool; public CanvasListener(Canvas canvas) { this.canvas = canvas; tool = null; } public CanvasTool getTool() { return tool; } public void setTool(CanvasTool value) { CanvasTool oldValue = tool; if (value != oldValue) { tool = value; if (oldValue != null) oldValue.toolDeselected(canvas); if (value != null) { value.toolSelected(canvas); canvas.setCursor(value.getCursor(canvas)); } else { canvas.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } } } public void mouseMoved(MouseEvent e) { if (tool != null) tool.mouseMoved(canvas, e); } public void mousePressed(MouseEvent e) { canvas.requestFocus(); if (e.isPopupTrigger()) { handlePopupTrigger(e); } else if (e.getButton() == 1) { if (tool != null) tool.mousePressed(canvas, e); } } public void mouseDragged(MouseEvent e) { if (isButton1(e)) { if (tool != null) tool.mouseDragged(canvas, e); } else { if (tool != null) tool.mouseMoved(canvas, e); } } public void mouseReleased(MouseEvent e) { if (e.isPopupTrigger()) { if (tool != null) tool.cancelMousePress(canvas); handlePopupTrigger(e); } else if (e.getButton() == 1) { if (tool != null) tool.mouseReleased(canvas, e); } } public void mouseClicked(MouseEvent e) { } public void mouseEntered(MouseEvent e) { if (tool != null) tool.mouseEntered(canvas, e); } public void mouseExited(MouseEvent e) { if (tool != null) tool.mouseExited(canvas, e); } public void keyPressed(KeyEvent e) { if (tool != null) tool.keyPressed(canvas, e); } public void keyReleased(KeyEvent e) { if (tool != null) tool.keyReleased(canvas, e); } public void keyTyped(KeyEvent e) { if (tool != null) tool.keyTyped(canvas, e); } public void modelChanged(CanvasModelEvent event) { canvas.getSelection().modelChanged(event); canvas.repaint(); } private boolean isButton1(MouseEvent e) { return (e.getModifiersEx() & MouseEvent.BUTTON1_DOWN_MASK) != 0; } private void handlePopupTrigger(MouseEvent e) { Location loc = Location.create(e.getX(), e.getY()); List objects = canvas.getModel().getObjectsFromTop(); CanvasObject clicked = null; for (CanvasObject o : objects) { if (o.contains(loc, false)) { clicked = o; break; } } if (clicked == null) { for (CanvasObject o : objects) { if (o.contains(loc, true)) { clicked = o; break; } } } canvas.showPopupMenu(e, clicked); } } logisim-2.7.1/src/com/cburch/draw/canvas/Canvas.java0000644000175000017500000000606011450405532022164 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.canvas; import java.awt.Dimension; import java.awt.Graphics; import java.awt.event.MouseEvent; import javax.swing.JComponent; import javax.swing.JPopupMenu; import com.cburch.draw.model.CanvasModel; import com.cburch.draw.model.CanvasObject; import com.cburch.draw.undo.Action; public class Canvas extends JComponent { public static final String TOOL_PROPERTY = "tool"; public static final String MODEL_PROPERTY = "model"; private CanvasModel model; private ActionDispatcher dispatcher; private CanvasListener listener; private Selection selection; public Canvas() { model = null; listener = new CanvasListener(this); selection = new Selection(); addMouseListener(listener); addMouseMotionListener(listener); addKeyListener(listener); setPreferredSize(new Dimension(200, 200)); } public CanvasModel getModel() { return model; } public CanvasTool getTool() { return listener.getTool(); } public void toolGestureComplete(CanvasTool tool, CanvasObject created) { ; // nothing to do - subclass may override } protected JPopupMenu showPopupMenu(MouseEvent e, CanvasObject clicked) { return null; // subclass will override if it supports popup menus } public Selection getSelection() { return selection; } protected void setSelection(Selection value) { selection = value; repaint(); } public void doAction(Action action) { dispatcher.doAction(action); } public void setModel(CanvasModel value, ActionDispatcher dispatcher) { CanvasModel oldValue = model; if (oldValue != value) { if (oldValue != null) oldValue.removeCanvasModelListener(listener); model = value; this.dispatcher = dispatcher; if (value != null) value.addCanvasModelListener(listener); selection.clearSelected(); repaint(); firePropertyChange(MODEL_PROPERTY, oldValue, value); } } public void setTool(CanvasTool value) { CanvasTool oldValue = listener.getTool(); if (value != oldValue) { listener.setTool(value); firePropertyChange(TOOL_PROPERTY, oldValue, value); } } public void repaintCanvasCoords(int x, int y, int width, int height) { repaint(x, y, width, height); } public double getZoomFactor() { return 1.0; // subclass will have to override this } public int snapX(int x) { return x; // subclass will have to override this } public int snapY(int y) { return y; // subclass will have to override this } @Override public void paintComponent(Graphics g) { paintBackground(g); paintForeground(g); } protected void paintBackground(Graphics g) { g.clearRect(0, 0, getWidth(), getHeight()); } protected void paintForeground(Graphics g) { CanvasModel model = this.model; CanvasTool tool = listener.getTool(); if (model != null) { Graphics dup = g.create(); model.paint(g, selection); dup.dispose(); } if (tool != null) { Graphics dup = g.create(); tool.draw(this, dup); dup.dispose(); } } } logisim-2.7.1/src/com/cburch/draw/canvas/ActionDispatcher.java0000644000175000017500000000046011446034602024174 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.canvas; import com.cburch.draw.undo.Action; public interface ActionDispatcher { public void doAction(Action action); } logisim-2.7.1/src/com/cburch/draw/actions/0000755000175000017500000000000011450405550020271 5ustar vincentvincentlogisim-2.7.1/src/com/cburch/draw/actions/Strings.java0000644000175000017500000000141411446034574022576 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.actions; import com.cburch.logisim.util.LocaleManager; import com.cburch.logisim.util.StringGetter; import com.cburch.logisim.util.StringUtil; class Strings { private static LocaleManager source = new LocaleManager("resources/logisim", "draw"); public static String get(String key) { return source.get(key); } public static String get(String key, String arg) { return StringUtil.format(source.get(key), arg); } public static StringGetter getter(String key) { return source.getter(key); } public static StringGetter getter(String key, String arg) { return source.getter(key, arg); } } logisim-2.7.1/src/com/cburch/draw/actions/ModelTranslateAction.java0000644000175000017500000000322711450405550025214 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.actions; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import com.cburch.draw.model.CanvasModel; import com.cburch.draw.model.CanvasObject; import com.cburch.draw.undo.Action; public class ModelTranslateAction extends ModelAction { private HashSet moved; private int dx; private int dy; public ModelTranslateAction(CanvasModel model, Collection moved, int dx, int dy) { super(model); this.moved = new HashSet(moved); this.dx = dx; this.dy = dy; } @Override public Collection getObjects() { return Collections.unmodifiableSet(moved); } @Override public String getName() { return Strings.get("actionTranslate", getShapesName(moved)); } @Override void doSub(CanvasModel model) { model.translateObjects(moved, dx, dy); } @Override void undoSub(CanvasModel model) { model.translateObjects(moved, -dx, -dy); } @Override public boolean shouldAppendTo(Action other) { if (other instanceof ModelTranslateAction) { ModelTranslateAction o = (ModelTranslateAction) other; return this.moved.equals(o.moved); } else { return false; } } @Override public Action append(Action other) { if (other instanceof ModelTranslateAction) { ModelTranslateAction o = (ModelTranslateAction) other; if (this.moved.equals(o.moved)) { return new ModelTranslateAction(getModel(), moved, this.dx + o.dx, this.dy + o.dy); } } return super.append(other); } } logisim-2.7.1/src/com/cburch/draw/actions/ModelReorderAction.java0000644000175000017500000001442211446663006024667 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.actions; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; import com.cburch.draw.model.CanvasModel; import com.cburch.draw.model.CanvasObject; import com.cburch.draw.model.ReorderRequest; import com.cburch.draw.util.ZOrder; public class ModelReorderAction extends ModelAction { public static ModelReorderAction createRaise(CanvasModel model, Collection objects) { List reqs = new ArrayList(); Map zmap = ZOrder.getZIndex(objects, model); for(Map.Entry entry : zmap.entrySet()) { CanvasObject obj = entry.getKey(); int from = entry.getValue().intValue(); CanvasObject above = ZOrder.getObjectAbove(obj, model, objects); if (above != null) { int to = ZOrder.getZIndex(above, model); if (objects.contains(above)) { to--; } reqs.add(new ReorderRequest(obj, from, to)); } } if (reqs.isEmpty()) { return null; } else { Collections.sort(reqs, ReorderRequest.DESCENDING_FROM); repairRequests(reqs); return new ModelReorderAction(model, reqs); } } public static ModelReorderAction createLower(CanvasModel model, Collection objects) { List reqs = new ArrayList(); Map zmap = ZOrder.getZIndex(objects, model); for(Map.Entry entry : zmap.entrySet()) { CanvasObject obj = entry.getKey(); int from = entry.getValue().intValue(); CanvasObject above = ZOrder.getObjectBelow(obj, model, objects); if (above != null) { int to = ZOrder.getZIndex(above, model); if (objects.contains(above)) { to++; } reqs.add(new ReorderRequest(obj, from, to)); } } if (reqs.isEmpty()) { return null; } else { Collections.sort(reqs, ReorderRequest.ASCENDING_FROM); repairRequests(reqs); return new ModelReorderAction(model, reqs); } } public static ModelReorderAction createRaiseTop(CanvasModel model, Collection objects) { List reqs = new ArrayList(); Map zmap = ZOrder.getZIndex(objects, model); int to = model.getObjectsFromBottom().size() - 1; for(Map.Entry entry : zmap.entrySet()) { CanvasObject obj = entry.getKey(); int from = entry.getValue().intValue(); reqs.add(new ReorderRequest(obj, from, to)); } if (reqs.isEmpty()) { return null; } else { Collections.sort(reqs, ReorderRequest.ASCENDING_FROM); repairRequests(reqs); return new ModelReorderAction(model, reqs); } } public static ModelReorderAction createLowerBottom(CanvasModel model, Collection objects) { List reqs = new ArrayList(); Map zmap = ZOrder.getZIndex(objects, model); int to = 0; for(Map.Entry entry : zmap.entrySet()) { CanvasObject obj = entry.getKey(); int from = entry.getValue().intValue(); reqs.add(new ReorderRequest(obj, from, to)); } if (reqs.isEmpty()) { return null; } else { Collections.sort(reqs, ReorderRequest.ASCENDING_FROM); repairRequests(reqs); return new ModelReorderAction(model, reqs); } } private static void repairRequests(List reqs) { for (int i = 0, n = reqs.size(); i < n; i++) { ReorderRequest req = reqs.get(i); int from = req.getFromIndex(); int to = req.getToIndex(); for (int j = 0; j < i; j++) { ReorderRequest prev = reqs.get(j); int prevFrom = prev.getFromIndex(); int prevTo = prev.getToIndex(); if (prevFrom <= from && from < prevTo) { from--; } else if (prevTo <= from && from < prevFrom) { from++; } if (prevFrom <= to && to < prevTo) { to--; } else if (prevTo <= to && to < prevFrom) { to++; } } if (from != req.getFromIndex() || to != req.getToIndex()) { reqs.set(i, new ReorderRequest(req.getObject(), from, to)); } } for (int i = reqs.size() - 1; i >= 0; i--) { ReorderRequest req = reqs.get(i); if (req.getFromIndex() == req.getToIndex()) { reqs.remove(i); } } } private ArrayList requests; private ArrayList objects; private int type; public ModelReorderAction(CanvasModel model, List requests) { super(model); this.requests = new ArrayList(requests); this.objects = new ArrayList(requests.size()); for (ReorderRequest r : requests) { objects.add(r.getObject()); } int type = 0; // 0 = mixed/unknown, -1 = to greater index, 1 = to smaller index for (ReorderRequest r : requests) { int thisType; int from = r.getFromIndex(); int to = r.getToIndex(); if (to < from) { thisType = -1; } else if (to > from) { thisType = 1; } else { thisType = 0; } if (type == 2) { type = thisType; } else if (type != thisType) { type = 0; break; } } this.type = type; } public List getReorderRequests() { return Collections.unmodifiableList(requests); } @Override public Collection getObjects() { return objects; } @Override public String getName() { if (type < 0) { return Strings.get("actionRaise", getShapesName(objects)); } else if (type > 0) { return Strings.get("actionLower", getShapesName(objects)); } else { return Strings.get("actionReorder", getShapesName(objects)); } } @Override void doSub(CanvasModel model) { model.reorderObjects(requests); } @Override void undoSub(CanvasModel model) { ArrayList inv = new ArrayList(requests.size()); for (int i = requests.size() - 1; i >= 0; i--) { ReorderRequest r = requests.get(i); inv.add(new ReorderRequest(r.getObject(), r.getToIndex(), r.getFromIndex())); } model.reorderObjects(inv); } } logisim-2.7.1/src/com/cburch/draw/actions/ModelRemoveAction.java0000644000175000017500000000227011446663006024520 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.actions; import java.util.Collection; import java.util.Collections; import java.util.Map; import com.cburch.draw.model.CanvasModel; import com.cburch.draw.model.CanvasObject; import com.cburch.draw.util.ZOrder; public class ModelRemoveAction extends ModelAction { private Map removed; public ModelRemoveAction(CanvasModel model, CanvasObject removed) { this(model, Collections.singleton(removed)); } public ModelRemoveAction(CanvasModel model, Collection removed) { super(model); this.removed = ZOrder.getZIndex(removed, model); } @Override public Collection getObjects() { return Collections.unmodifiableSet(removed.keySet()); } @Override public String getName() { return Strings.get("actionRemove", getShapesName(removed.keySet())); } @Override void doSub(CanvasModel model) { model.removeObjects(removed.keySet()); } @Override void undoSub(CanvasModel model) { model.addObjects(removed); } } logisim-2.7.1/src/com/cburch/draw/actions/ModelMoveHandleAction.java0000644000175000017500000000247611446034574025317 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.actions; import java.util.Collection; import java.util.Collections; import com.cburch.draw.model.CanvasModel; import com.cburch.draw.model.CanvasObject; import com.cburch.draw.model.Handle; import com.cburch.draw.model.HandleGesture; public class ModelMoveHandleAction extends ModelAction { private HandleGesture gesture; private Handle newHandle; public ModelMoveHandleAction(CanvasModel model, HandleGesture gesture) { super(model); this.gesture = gesture; } public Handle getNewHandle() { return newHandle; } @Override public Collection getObjects() { return Collections.singleton(gesture.getHandle().getObject()); } @Override public String getName() { return Strings.get("actionMoveHandle"); } @Override void doSub(CanvasModel model) { newHandle = model.moveHandle(gesture); } @Override void undoSub(CanvasModel model) { Handle oldHandle = gesture.getHandle(); int dx = oldHandle.getX() - newHandle.getX(); int dy = oldHandle.getY() - newHandle.getY(); HandleGesture reverse = new HandleGesture(newHandle, dx, dy, 0); model.moveHandle(reverse); } } logisim-2.7.1/src/com/cburch/draw/actions/ModelInsertHandleAction.java0000644000175000017500000000172111446034574025645 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.actions; import java.util.Collection; import java.util.Collections; import com.cburch.draw.model.CanvasModel; import com.cburch.draw.model.CanvasObject; import com.cburch.draw.model.Handle; public class ModelInsertHandleAction extends ModelAction { private Handle desired; public ModelInsertHandleAction(CanvasModel model, Handle desired) { super(model); this.desired = desired; } @Override public Collection getObjects() { return Collections.singleton(desired.getObject()); } @Override public String getName() { return Strings.get("actionInsertHandle"); } @Override void doSub(CanvasModel model) { model.insertHandle(desired, null); } @Override void undoSub(CanvasModel model) { model.deleteHandle(desired); } } logisim-2.7.1/src/com/cburch/draw/actions/ModelEditTextAction.java0000644000175000017500000000207211446034574025017 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.actions; import java.util.Collection; import java.util.Collections; import com.cburch.draw.model.CanvasModel; import com.cburch.draw.model.CanvasObject; import com.cburch.draw.shapes.Text; public class ModelEditTextAction extends ModelAction { private Text text; private String oldValue; private String newValue; public ModelEditTextAction(CanvasModel model, Text text, String newValue) { super(model); this.text = text; this.oldValue = text.getText(); this.newValue = newValue; } @Override public Collection getObjects() { return Collections.singleton((CanvasObject) text); } @Override public String getName() { return Strings.get("actionEditText"); } @Override void doSub(CanvasModel model) { model.setText(text, newValue); } @Override void undoSub(CanvasModel model) { model.setText(text, oldValue); } } logisim-2.7.1/src/com/cburch/draw/actions/ModelDeleteHandleAction.java0000644000175000017500000000176411446034574025612 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.actions; import java.util.Collection; import java.util.Collections; import com.cburch.draw.model.CanvasModel; import com.cburch.draw.model.CanvasObject; import com.cburch.draw.model.Handle; public class ModelDeleteHandleAction extends ModelAction { private Handle handle; private Handle previous; public ModelDeleteHandleAction(CanvasModel model, Handle handle) { super(model); this.handle = handle; } @Override public Collection getObjects() { return Collections.singleton(handle.getObject()); } @Override public String getName() { return Strings.get("actionDeleteHandle"); } @Override void doSub(CanvasModel model) { previous = model.deleteHandle(handle); } @Override void undoSub(CanvasModel model) { model.insertHandle(handle, previous); } } logisim-2.7.1/src/com/cburch/draw/actions/ModelChangeAttributeAction.java0000644000175000017500000000334211450405476026335 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.actions; import java.util.Collection; import java.util.HashSet; import java.util.Map; import com.cburch.draw.model.AttributeMapKey; import com.cburch.draw.model.CanvasModel; import com.cburch.draw.model.CanvasObject; import com.cburch.logisim.data.Attribute; public class ModelChangeAttributeAction extends ModelAction { private Map oldValues; private Map newValues; private Attribute attr; public ModelChangeAttributeAction(CanvasModel model, Map oldValues, Map newValues) { super(model); this.oldValues = oldValues; this.newValues = newValues; } @Override public Collection getObjects() { HashSet ret = new HashSet(); for (AttributeMapKey key : newValues.keySet()) { ret.add(key.getObject()); } return ret; } @Override public String getName() { Attribute a = attr; if (a == null) { boolean found = false; for (AttributeMapKey key : newValues.keySet()) { Attribute at = key.getAttribute(); if (found) { if (a == null ? at != null : !a.equals(at)) { a = null; break; } } else { found = true; a = at; } } attr = a; } if (a == null) { return Strings.get("actionChangeAttributes"); } else { return Strings.get("actionChangeAttribute", a.getDisplayName()); } } @Override void doSub(CanvasModel model) { model.setAttributeValues(newValues); } @Override void undoSub(CanvasModel model) { model.setAttributeValues(oldValues); } } logisim-2.7.1/src/com/cburch/draw/actions/ModelAddAction.java0000644000175000017500000000267311446663006023762 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.actions; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import com.cburch.draw.model.CanvasModel; import com.cburch.draw.model.CanvasObject; public class ModelAddAction extends ModelAction { private ArrayList added; private int addIndex; public ModelAddAction(CanvasModel model, CanvasObject added) { this(model, Collections.singleton(added)); } public ModelAddAction(CanvasModel model, Collection added) { super(model); this.added = new ArrayList(added); this.addIndex = model.getObjectsFromBottom().size(); } public ModelAddAction(CanvasModel model, Collection added, int index) { super(model); this.added = new ArrayList(added); this.addIndex = index; } public int getDestinationIndex() { return addIndex; } @Override public Collection getObjects() { return Collections.unmodifiableList(added); } @Override public String getName() { return Strings.get("actionAdd", getShapesName(added)); } @Override void doSub(CanvasModel model) { model.addObjects(addIndex, added); } @Override void undoSub(CanvasModel model) { model.removeObjects(added); } } logisim-2.7.1/src/com/cburch/draw/actions/ModelAction.java0000644000175000017500000000216211450405470023334 0ustar vincentvincent/* Copyright (c) 2010, Carl Burch. License information is located in the * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */ package com.cburch.draw.actions; import java.util.Collection; import java.util.Collections; import com.cburch.draw.model.CanvasModel; import com.cburch.draw.model.CanvasObject; import com.cburch.draw.undo.Action; public abstract class ModelAction extends Action { private CanvasModel model; public ModelAction(CanvasModel model) { this.model = model; } public Collection getObjects() { return Collections.emptySet(); } @Override public abstract String getName(); abstract void doSub(CanvasModel model); abstract void undoSub(CanvasModel model); @Override public final void doIt() { doSub(model); } @Override public final void undo() { undoSub(model); } public CanvasModel getModel() { return model; } static String getShapesName(Collection coll) { if (coll.size() != 1) { return Strings.get("shapeMultiple"); } else { CanvasObject shape = coll.iterator().next(); return shape.getDisplayName(); } } } logisim-2.7.1/resources/0000755000175000017500000000000011751441134015075 5ustar vincentvincentlogisim-2.7.1/resources/logisim/0000755000175000017500000000000011530653016016537 5ustar vincentvincentlogisim-2.7.1/resources/logisim/settings.properties0000644000175000017500000000003411530653016022512 0ustar vincentvincentlocales = de el en es pt ru logisim-2.7.1/resources/logisim/ru/0000755000175000017500000000000011541661310017163 5ustar vincentvincentlogisim-2.7.1/resources/logisim/ru/util.properties0000644000175000017500000000345511527307500022267 0ustar vincentvincent# # util/FontUtil.java # fontPlainStyle= \u041e\u0431\u044b\u0447\u043d\u044b\u0439 fontBoldStyle= \u041f\u043e\u043b\u0443\u0436\u0438\u0440\u043d\u044b\u0439 fontItalicStyle= \u041a\u0443\u0440\u0441\u0438\u0432 fontBoldItalicStyle= \u041f\u043e\u043b\u0443\u0436\u0438\u0440\u043d\u044b\u0439 \u043a\u0443\u0440\u0441\u0438\u0432 # # util/InputEventUtil.java # metaMod= Meta altMod= Alt ctrlMod= Ctrl shiftMod= Shift button1Mod= \u041a\u043d\u043e\u043f\u043a\u04301 button2Mod= \u041a\u043d\u043e\u043f\u043a\u04302 button3Mod= \u041a\u043d\u043e\u043f\u043a\u04303 # # util/JDialogOk.java # dlogOkButton= OK dlogCancelButton= \u041e\u0442\u043c\u0435\u043d\u0430 # # util/LocaleManager.java # # If the user selects to "replace accented characters" in the International # dialog, the program will replace accented characters based on # the slash-delimited character-string pairs in accentReplacements. # For example, with German, accentReplacements might be # "\u00f6 oe/\u00d6 Oe/\u00fc ue/\u00dc ue/\u00df ss" so that umlauted o's and u's are # replaced, as would be essets. accentReplacements= # # util/GifEncoder.java # grabberError= \u0413\u0440\u0430\u0431\u0431\u0435\u0440 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0438\u043b "\u043b\u043e\u0436\u044c": manyColorError= \u0421\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0446\u0432\u0435\u0442\u043e\u0432. # # util/WindowMenu.java # windowMenu= \u041e\u043a\u043d\u043e windowMinimizeItem= \u041c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c windowZoomItem= \u041c\u0430\u043a\u0441\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c windowZoomItemMac= \u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c windowCloseItem= \u0417\u0430\u043a\u0440\u044b\u0442\u044c logisim-2.7.1/resources/logisim/ru/tools.properties0000644000175000017500000001052211527054346022452 0ustar vincentvincent# # tools/AddTool.java # addToolText= \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c %s negativeCoordError= \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b. cannotModifyError= \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0445\u0435\u043c\u0443. circularError= \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0441\u044b\u043b\u043a\u0443. exclusiveError= \u0417\u0434\u0435\u0441\u044c \u0443\u0436\u0435 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442. addComponentAction= \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c %s # # tools/MenuTool.java # menuTool= \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u041c\u0435\u043d\u044e menuToolDesc= \u041f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043c\u0435\u043d\u044e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 compDeleteItem= \u0423\u0434\u0430\u043b\u0438\u0442\u044c compShowAttrItem= \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b selDeleteItem= \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 selCutItem= \u0412\u044b\u0440\u0435\u0437\u0430\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 selCopyItem= \u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 removeComponentAction= \u0423\u0434\u0430\u043b\u0438\u0442\u044c %s # # tools/PokeTool.java # pokeTool= \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u041d\u0430\u0436\u0430\u0442\u0438\u0435 pokeToolDesc= \u0418\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0441\u0445\u0435\u043c\u0435 # # tools/SelectTool.java # selectTool= \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0412\u044b\u0431\u043e\u0440 selectToolDesc= \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0441\u0445\u0435\u043c\u044b moveWorkingMsg= \u0420\u0430\u0441\u0447\u0451\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439... # # tools/SelectionAttributeChange.java # selectionRefaceAction= \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f # # tools/key/KeyConfigurationAction # changeComponentAttributesAction= \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 # # tools/TextTool.java # textTool= \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0422\u0435\u043a\u0441\u0442 textToolDesc= \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u0432 \u0441\u0445\u0435\u043c\u0435 # # tools/EditTool.java # editTool= \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u041f\u0440\u0430\u0432\u043a\u0430 editToolDesc= \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u0440\u043e\u0432\u043e\u0434\u0430 # # tools/WiringTool.java # wiringTool= \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u041f\u0440\u043e\u0432\u043e\u0434\u043a\u0430 wiringToolDesc= \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u0440\u043e\u0432\u043e\u0434\u0430 \u0432 \u0441\u0445\u0435\u043c\u0443 addWireAction= \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u043e\u0432\u043e\u0434 addWiresAction= \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u043e\u0432\u043e\u0434\u0430 shortenWireAction= \u0423\u043a\u043e\u0440\u043e\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0432\u043e\u0434 logisim-2.7.1/resources/logisim/ru/std.properties0000644000175000017500000013564211540557304022114 0ustar vincentvincent# # std/Builtin.java # builtinLibrary= \u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 # instance/StdAttr.java stdFacingAttr= \u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 stdDataWidthAttr= \u0411\u0438\u0442\u044b \u0434\u0430\u043d\u043d\u044b\u0445 stdTriggerAttr= \u0421\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u0435 stdTriggerRising= \u041f\u0435\u0440\u0435\u0434\u043d\u0438\u0439 \u0444\u0440\u043e\u043d\u0442 stdTriggerFalling= \u0417\u0430\u0434\u043d\u0438\u0439 \u0444\u0440\u043e\u043d\u0442 stdTriggerHigh= \u0412\u044b\u0441\u043e\u043a\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c stdTriggerLow= \u041d\u0438\u0437\u043a\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c stdLabelAttr= \u041c\u0435\u0442\u043a\u0430 stdLabelFontAttr= \u0428\u0440\u0438\u0444\u0442 \u043c\u0435\u0442\u043a\u0438 # instance/InstanceTextField.java changeLabelAction= \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043c\u0435\u0442\u043a\u0443 # # std/base/Base.java # baseLibrary= \u0411\u0430\u0437\u043e\u0432\u044b\u0435 # std/base/BitExtender.java extenderComponent= \u0420\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u0435\u043b\u044c \u0431\u0438\u0442\u043e\u0432 extenderInAttr= \u0420\u0430\u0437\u0440\u044f\u0434\u043d\u043e\u0441\u0442\u044c \u0432\u0445\u043e\u0434\u0430 extenderOutAttr= \u0420\u0430\u0437\u0440\u044f\u0434\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0445\u043e\u0434\u0430 extenderTypeAttr= \u0422\u0438\u043f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f extenderOneType= \u0415\u0434\u0438\u043d\u0438\u0446\u0430 extenderZeroType= \u041d\u043e\u043b\u044c extenderSignType= \u0417\u043d\u0430\u043a extenderInputType= \u0412\u0445\u043e\u0434 extenderMainLabel= extend extenderOneLabel= 1 extenderZeroLabel= 0 extenderSignLabel= sign extenderInputLabel= input # std/base/Clock clockComponent= \u0422\u0430\u043a\u0442\u043e\u0432\u044b\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 clockHighAttr= \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0435\u0434\u0438\u043d\u0438\u0446\u044b clockLowAttr= \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0443\u043b\u044f clockDurationValue= %s \u0442\u0430\u043a\u0442\u043e\u0432 clockDurationOneValue= 1 \u0442\u0430\u043a\u0442 durationSmallMessage= \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c %s. durationLargeMessage= \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c %s \u0438\u043b\u0438 \u043c\u0435\u043d\u044c\u0448\u0435. freqInvalidMessage= \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u043c \u0446\u0435\u043b\u044b\u043c # std/base/Pin pinComponent= \u041a\u043e\u043d\u0442\u0430\u043a\u0442 pinInputName= \u0412\u0445\u043e\u0434 pinOutputName= \u0412\u044b\u0445\u043e\u0434 pinThreeStateAttr= \u0422\u0440\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f? pinOutputAttr= \u0412\u044b\u0445\u043e\u0434? pinPullAttr= \u041e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0438\u043c\u0438 pinPullNoneOption= \u041d\u0435 \u043c\u0435\u043d\u044f\u0442\u044c pinPullUpOption= \u041f\u043e\u0432\u044b\u0448\u0430\u0442\u044c pinPullDownOption= \u041f\u043e\u043d\u0438\u0436\u0430\u0442\u044c pinLabelLocAttr= \u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u043a\u0438 pinInputToolTip= \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043d\u0442\u0430\u043a\u0442 pinOutputToolTip= \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043d\u0442\u0430\u043a\u0442 pinFrozenTitle= \u041a\u043e\u043d\u0442\u0430\u043a\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d \u043a \u043d\u0430\u0434\u0441\u0445\u0435\u043c\u0435. pinFrozenQuestion= \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043e \u043a \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e \u043d\u0430\u0434\u0441\u0445\u0435\u043c\u044b. \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u0445\u0435\u043c\u044b? # std/base/Probe probeComponent= \u0414\u0430\u0442\u0447\u0438\u043a # std/base/PullResistor pullComponent= \u0421\u043e\u0433\u043b\u0430\u0441\u0443\u044e\u0449\u0438\u0439 \u0440\u0435\u0437\u0438\u0441\u0442\u043e\u0440 pullTypeAttr= \u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u044f pullZeroType= \u041d\u043e\u043b\u044c pullOneType= \u0415\u0434\u0438\u043d\u0438\u0446\u0430 pullErrorType= \u041e\u0448\u0438\u0431\u043a\u0430 # std/base/Text.java textComponent= \u041c\u0435\u0442\u043a\u0430 textTextAttr= \u0422\u0435\u043a\u0441\u0442 textFontAttr= \u0428\u0440\u0438\u0444\u0442 textHorzAlignAttr= \u0413\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 textHorzAlignLeftOpt= \u0421\u043b\u0435\u0432\u0430 textHorzAlignRightOpt= \u0421\u043f\u0440\u0430\u0432\u0430 textHorzAlignCenterOpt= \u0426\u0435\u043d\u0442\u0440 textVertAlignAttr= \u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 textVertAlignTopOpt= \u041f\u043e \u0432\u0435\u0440\u0445\u0443 textVertAlignBaseOpt= \u041f\u043e \u0431\u0430\u0437\u043e\u0432\u043e\u0439 textVertAlignBottomOpt= \u041f\u043e \u043d\u0438\u0437\u0443 textVertAlignCenterOpt= \u041f\u043e \u0446\u0435\u043d\u0442\u0440\u0443 # std/base/Tunnel.java tunnelComponent= \u0422\u043e\u043d\u043d\u0435\u043b\u044c # # std/Wiring.java # wiringLibrary= \u041f\u0440\u043e\u0432\u043e\u0434\u043a\u0430 wiringGateAttr= \u041f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u0442\u0432\u043e\u0440\u0430 wiringGateBottomRightOption= \u0421\u043d\u0438\u0437\u0443/\u0441\u043f\u0440\u0430\u0432\u0430 wiringGateTopLeftOption= \u0421\u0432\u0435\u0440\u0445\u0443/\u0441\u043b\u0435\u0432\u0430 # std/wiring/Transistor.java transistorComponent= \u0422\u0440\u0430\u043d\u0437\u0438\u0441\u0442\u043e\u0440 transistorTypeAttr= \u0422\u0438\u043f transistorTypeP= p-\u0442\u0438\u043f transistorTypeN= n-\u0442\u0438\u043f # std/wiring/TransmissionGate.java transmissionGateComponent= \u041f\u0435\u0440\u0435\u0434\u0430\u0442\u043e\u0447\u043d\u044b\u0439 \u0432\u0435\u043d\u0442\u0438\u043b\u044c # std/wiring/Power.java powerComponent= \u041f\u0438\u0442\u0430\u043d\u0438\u0435 # std/wiring/Ground.java groundComponent= \u0417\u0435\u043c\u043b\u044f # # std/Gates.java # gatesLibrary= \u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b gateSizeAttr= \u0420\u0430\u0437\u043c\u0435\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 gateSizeNarrowOpt= \u0423\u0437\u043a\u0438\u0439 gateSizeNormalOpt= \u0421\u0440\u0435\u0434\u043d\u0438\u0439 gateSizeWideOpt= \u0428\u0438\u0440\u043e\u043a\u0438\u0439 gateNegateAttr= \u0418\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c %s gateInputsAttr= \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0445\u043e\u0434\u043e\u0432 gateOutput01= 0/1 gateOutput0Z= 0/\u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0435 gateOutputZ1= \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0435/1 gateOutputAttr= \u0412\u044b\u0445\u043e\u0434\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 xorBehaviorAttr= \u041c\u043d\u043e\u0433\u043e\u0432\u0445\u043e\u0434\u043e\u0432\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 xorBehaviorOne= \u041a\u043e\u0433\u0434\u0430 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0432\u0445\u043e\u0434\u0435 1 xorBehaviorOdd= \u041a\u043e\u0433\u0434\u0430 \u043d\u0430 \u043d\u0435\u0447\u0451\u0442\u043d\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 1 # std/Constant.java constantComponent= \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 constantValueAttr= \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 # std/NotGate.java notGateComponent= \u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u041d\u0415 # std/Buffer.java bufferComponent= \u0411\u0443\u0444\u0435\u0440 # std/AndGate.java andGateComponent= \u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0418 # std/NandGate.java nandGateComponent= \u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0418-\u041d\u0415 # std/NorGate.java norGateComponent= \u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0418\u041b\u0418-\u041d\u0415 # std/OrGate.java orGateComponent= \u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0418\u041b\u0418 # std/XorGate.java xorGateComponent= \u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0418\u0441\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0435\u0435 \u0418\u041b\u0418 # std/XnorGate.java xnorGateComponent= \u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0418\u0441\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0435\u0435 \u0418\u041b\u0418-\u041d\u0415 # std/OddParityGate.java oddParityComponent= \u041d\u0435\u0447\u0451\u0442\u043d\u043e\u0441\u0442\u044c # std/EvenParityGate.java evenParityComponent= \u0427\u0451\u0442\u043d\u043e\u0441\u0442\u044c # std/ControlledBuffer.java controlledBufferComponent= \u0423\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 controlledInverterComponent= \u0423\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0439 \u0438\u043d\u0432\u0435\u0440\u0442\u043e\u0440 controlledControlOption= \u0420\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0433\u043e \u0432\u0445\u043e\u0434\u0430 controlledLeftHanded= \u041f\u043e \u043b\u0435\u0432\u0443\u044e \u0440\u0443\u043a\u0443 controlledRightHanded= \u041f\u043e \u043f\u0440\u0430\u0432\u0443\u044e \u0440\u0443\u043a\u0443 # # std/Memory.java # memoryLibrary= \u041f\u0430\u043c\u044f\u0442\u044c memEnableLabel= en # AbstractFlipFlop.java flipFlopClockTip= \u0422\u0430\u043a\u0442\u043e\u0432\u044b\u0439 \u0432\u0445\u043e\u0434: \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u0438 flipFlopQTip= \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 flipFlopNotQTip= \u0414\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 flipFlopResetTip= \u041e\u0447\u0438\u0441\u0442\u043a\u0430: \u043a\u043e\u0433\u0434\u0430 1, \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 0 flipFlopPresetTip= \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430: \u043a\u043e\u0433\u0434\u0430 1, \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 1 flipFlopEnableTip= \u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435: \u043a\u043e\u0433\u0434\u0430 0, \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u043a\u0442\u043e\u0432\u043e\u0433\u043e \u0432\u0445\u043e\u0434\u0430 \u043d\u0435 \u0434\u0430\u0451\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0430 # std/Counter.java counterComponent= \u0421\u0447\u0451\u0442\u0447\u0438\u043a counterMaxAttr= \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 counterGoalAttr= \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 counterGoalWrap= \u0417\u0430\u043a\u043e\u043b\u044c\u0446\u043e\u0432\u044b\u0432\u0430\u0442\u044c counterGoalStay= \u041e\u0441\u0442\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0438 counterGoalContinue= \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0441\u0447\u0451\u0442 counterGoalLoad= \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 counterQTip= \u0412\u044b\u0445\u043e\u0434: \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430 counterClockTip= \u0422\u0430\u043a\u0442\u043e\u0432\u044b\u0439 \u0432\u0445\u043e\u0434: \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u0438 counterDataTip= \u0414\u0430\u043d\u043d\u044b\u0435: \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432 \u0441\u0447\u0451\u0442\u0447\u0438\u043a counterLoadTip= \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430: \u043a\u043e\u0433\u0434\u0430 1, \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0441 \u0432\u0445\u043e\u0434\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 (\u0435\u0441\u043b\u0438 \u0421\u0447\u0451\u0442 = 0) \u0438\u043b\u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 counterEnableTip= \u0421\u0447\u0451\u0442: \u043a\u043e\u0433\u0434\u0430 1, \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f (\u0438\u043b\u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 = 1) counterResetTip= \u041e\u0447\u0438\u0441\u0442\u043a\u0430: \u043a\u043e\u0433\u0434\u0430 1, \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u0432 0 counterCarryTip= \u041f\u0435\u0440\u0435\u043d\u043e\u0441: 1, \u043a\u043e\u0433\u0434\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u0430 (\u043c\u0438\u043d\u0438\u043c\u0443\u043c\u0430 \u043f\u0440\u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0438) counterEnableLabel= ct counterLabel= ctr # std/DFlipFlop.java dFlipFlopComponent= D \u0442\u0440\u0438\u0433\u0433\u0435\u0440 # std/TFlipFlop.java tFlipFlopComponent= T \u0442\u0440\u0438\u0433\u0433\u0435\u0440 # std/JKFlipFlop.java jkFlipFlopComponent= J-K \u0442\u0440\u0438\u0433\u0433\u0435\u0440 # std/SRFlipFlop.java srFlipFlopComponent= S-R \u0442\u0440\u0438\u0433\u0433\u0435\u0440 # std/Random.java randomSeedAttr= \u0421\u0435\u043c\u044f randomComponent= \u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b randomQTip= \u0412\u044b\u0445\u043e\u0434: \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 randomClockTip= \u0422\u0430\u043a\u0442\u043e\u0432\u044b\u0439 \u0432\u0445\u043e\u0434: \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u0438 randomNextTip= \u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435: \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u0438 \u0442\u0430\u043a\u0442\u043e\u0432\u043e\u0433\u043e \u0432\u0445\u043e\u0434\u0430 randomResetTip= \u041e\u0447\u0438\u0441\u0442\u043a\u0430: \u043a\u043e\u0433\u0434\u0430 1, \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u0435\u043c\u044f # std/Register.java registerComponent= \u0420\u0435\u0433\u0438\u0441\u0442\u0440 registerQTip= \u0412\u044b\u0445\u043e\u0434: \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 registerDTip= \u0414\u0430\u043d\u043d\u044b\u0435: \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u043e\u0435 \u043f\u0440\u0438 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u0438 \u0442\u0430\u043a\u0442\u043e\u0432\u043e\u0433\u043e \u0432\u0445\u043e\u0434\u0430 registerClkTip= \u0422\u0430\u043a\u0442\u043e\u0432\u044b\u0439 \u0432\u0445\u043e\u0434: \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u0438 registerClrTip= \u041e\u0447\u0438\u0441\u0442\u043a\u0430: \u043a\u043e\u0433\u0434\u0430 1, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 0 registerEnableTip= \u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435: \u043a\u043e\u0433\u0434\u0430 0, \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u043a\u0442\u043e\u0432\u043e\u0433\u043e \u0432\u0445\u043e\u0434\u0430 \u043d\u0435 \u0434\u0430\u0451\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0430 registerLabel= reg registerWidthLabel= (%sb) # std/RamFactory.java ramComponent= \u041e\u0417\u0423 # std/RomFactory.java romComponent= \u041f\u0417\u0423 romContentsAttr= \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 romContentsValue= (\u043d\u0430\u0436\u043c\u0438\u0442\u0435 \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c) romChangeAction= \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u041f\u0417\u0423 # std/Ram.java ramAddrWidthAttr= \u0420\u0430\u0437\u0440\u044f\u0434\u043d\u043e\u0441\u0442\u044c \u0430\u0434\u0440\u0435\u0441\u0430 ramDataWidthAttr= \u0420\u0430\u0437\u0440\u044f\u0434\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 ramDataLabel= D ramAddrLabel= A ramWELabel= str ramCSLabel= sel ramOELabel= ld ramClrLabel= clr ramGigabyteLabel= %s\u0413\u0411 \u041e\u0417\u0423 ramMegabyteLabel= %s\u041c\u0411 \u041e\u0417\u0423 ramKilobyteLabel= %s\u041a\u0411 \u041e\u0417\u0423 ramByteLabel= %s\u0411 \u041e\u0417\u0423 romGigabyteLabel= %s\u0413\u0411 \u041f\u0417\u0423 romMegabyteLabel= %s\u041c\u0411 \u041f\u0417\u0423 romKilobyteLabel= %s\u041a\u0411 \u041f\u0417\u0423 romByteLabel= %s\u0411 \u041f\u0417\u0423 memDataTip= \u0414\u0430\u043d\u043d\u044b\u0435: \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c\u043e\u0435 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 memAddrTip= \u0410\u0434\u0440\u0435\u0441\u0443: \u043c\u0435\u0441\u0442\u043e \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0443\u043f memCSTip= \u0412\u044b\u0431\u043e\u0440 \u043a\u0440\u0438\u0441\u0442\u0430\u043b\u043b\u0430: 0 \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 ramClkTip= \u0422\u0430\u043a\u0442\u043e\u0432\u044b\u0439 \u0432\u0445\u043e\u0434: \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0441 0 \u043d\u0430 1 ramOETip= \u0427\u0442\u0435\u043d\u0438\u0435: \u0435\u0441\u043b\u0438 1, \u043f\u0430\u043c\u044f\u0442\u044c \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0432\u044b\u0445\u043e\u0434 ramWETip= \u0417\u0430\u043f\u0438\u0441\u044c: \u0435\u0441\u043b\u0438 1, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u043e \u0432\u0445\u043e\u0434\u0430 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u044c ramClrTip= \u041e\u0447\u0438\u0441\u0442\u043a\u0430: \u043a\u043e\u0433\u0434\u0430 1, \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432 0 ramBusTip= \u0414\u0430\u043d\u043d\u044b\u0435: \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c\u043e\u0435 \u0438\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u043e\u0435 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 ramInTip= \u0412\u0445\u043e\u0434: \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 ramBusAttr= \u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u0430\u043d\u043d\u044b\u0445 ramBusSynchCombined= \u041e\u0434\u0438\u043d \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043f\u043e\u0440\u0442 \u0447\u0442\u0435\u043d\u0438\u044f/\u0437\u0430\u043f\u0438\u0441\u0438 ramBusAsynchCombined= \u041e\u0434\u0438\u043d \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043f\u043e\u0440\u0442 \u0447\u0442\u0435\u043d\u0438\u044f/\u0437\u0430\u043f\u0438\u0441\u0438 ramBusSeparate= \u0420\u0430\u0437\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u0440\u0442\u044b \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 ramEditMenuItem= \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435... ramClearMenuItem= \u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 ramLoadMenuItem= \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0437... ramSaveMenuItem= \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0437... ramConfirmClearTitle= \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u043e\u0447\u0438\u0441\u0442\u043a\u0438 ramConfirmClearMsg= \u0412\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0431\u043d\u0443\u043b\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c? ramLoadDialogTitle= \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043e\u0431\u0440\u0430\u0437\u0430 \u041e\u0417\u0423 ramLoadErrorTitle= \u041e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 ramSaveDialogTitle= \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0437\u0430 \u041e\u0417\u0423 ramSaveErrorTitle= \u041e\u0448\u0438\u0431\u043a\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f # std/memory/ShiftRegister.java shiftRegisterComponent= \u0421\u0434\u0432\u0438\u0433\u043e\u0432\u044b\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 shiftRegisterLabel1= shift reg shiftRegisterLabel2= %sx%s shiftRegLengthAttr= \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0443\u043f\u0435\u043d\u0435\u0439 shiftRegParallelAttr= \u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u0430\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 shiftRegShiftTip= \u0421\u0434\u0432\u0438\u0433: \u0441\u0434\u0432\u0438\u0433 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d, \u0435\u0441\u043b\u0438 0 shiftRegClockTip= \u0422\u0430\u043a\u0442\u043e\u0432\u044b\u0439 \u0432\u0445\u043e\u0434: \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0433\u0443\u0442 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u0438 shiftRegClearTip= \u041e\u0447\u0438\u0441\u0442\u043a\u0430: \u043a\u043e\u0433\u0434\u0430 1, \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0432 0 shiftRegInTip= \u0412\u0445\u043e\u0434: \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0441\u0434\u0432\u0438\u0433\u0430 \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u0442\u0443\u043f\u0435\u043d\u044c shiftRegOutTip= \u0412\u044b\u0445\u043e\u0434: \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0443\u043f\u0435\u043d\u0438 shiftRegLoadTip= \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430: \u043a\u043e\u0433\u0434\u0430 1 (\u043f\u0440\u0438 \u0421\u0434\u0432\u0438\u0433 = 0), \u0432\u0441\u0435 \u0441\u0442\u0443\u043f\u0435\u043d\u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f \u0441\u043e \u0432\u0445\u043e\u0434\u043e\u0432 # # std/Plexers.java # plexerLibrary= \u041f\u043b\u0435\u043a\u0441\u043e\u0440\u044b plexerSelectBitsAttr= \u0412\u044b\u0431\u0438\u0440\u0430\u044e\u0449\u0438\u0435 \u0431\u0438\u0442\u044b plexerThreeStateAttr= \u0422\u0440\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f? plexerDisabledAttr= \u041d\u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u043c \u0432\u044b\u0445\u043e\u0434\u0435 plexerDisabledFloating= \u041f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0435 plexerDisabledZero= \u041d\u043e\u043b\u044c plexerEnableAttr= \u0420\u0430\u0437\u0440\u0435\u0448\u0430\u044e\u0449\u0438\u0439 \u0432\u0445\u043e\u0434? plexerSelectLocAttr= \u041f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u044e\u0449\u0435\u0433\u043e \u0432\u0445\u043e\u0434\u0430 plexerSelectTopRightOption= \u0421\u0432\u0435\u0440\u0445\u0443/\u0441\u043f\u0440\u0430\u0432\u0430 plexerSelectBottomLeftOption= \u0421\u043d\u0438\u0437\u0443/\u0441\u043b\u0435\u0432\u0430 # std/Multiplexer.java multiplexerComponent= \u041c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u043a\u0441\u043e\u0440 multiplexerSelectTip= \u0412\u044b\u0431\u0438\u0440\u0430\u044e\u0449\u0438\u0439 \u0432\u0445\u043e\u0434: \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442, \u043a\u0430\u043a\u043e\u0439 \u0432\u0445\u043e\u0434 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0432\u044b\u0445\u043e\u0434\u043e\u043c multiplexerEnableTip= \u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c: \u043a\u043e\u0433\u0434\u0430 \u043d\u0435 0, \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 - \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0445\u043e\u0434\u0430 multiplexerInTip= \u0412\u0445\u043e\u0434 %s multiplexerOutTip= \u0412\u044b\u0445\u043e\u0434 # std/Demultiplexer.java demultiplexerComponent= \u0414\u0435\u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u043a\u0441\u043e\u0440 demultiplexerSelectTip= \u0412\u044b\u0431\u0438\u0440\u0430\u044e\u0449\u0438\u0439 \u0432\u0445\u043e\u0434: \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442, \u043d\u0430 \u043a\u0430\u043a\u043e\u0439 \u0432\u044b\u0445\u043e\u0434 \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u043e \u0432\u0445\u043e\u0434\u0430 demultiplexerEnableTip= \u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c: \u043a\u043e\u0433\u0434\u0430 \u043d\u0435 0, \u043d\u0430 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u043c \u0432\u044b\u0445\u043e\u0434\u0435 - \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u043e \u0432\u0445\u043e\u0434\u0430 demultiplexerInTip= \u0412\u0445\u043e\u0434 demultiplexerOutTip= \u0412\u044b\u0445\u043e\u0434 %s # std/Decoder.java decoderComponent= \u0414\u0435\u043a\u043e\u0434\u0435\u0440 decoderSelectTip= \u0412\u044b\u0431\u0438\u0440\u0430\u044e\u0449\u0438\u0439 \u0432\u0445\u043e\u0434: \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442, \u043d\u0430 \u043a\u0430\u043a\u043e\u043c \u0432\u044b\u0445\u043e\u0434\u0435 1 decoderEnableTip= \u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c: \u043a\u043e\u0433\u0434\u0430 \u043d\u0435 0, \u043d\u0430 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u043c \u0432\u044b\u0445\u043e\u0434\u0435 - 1 decoderOutTip= \u0412\u044b\u0445\u043e\u0434 %s # std/plexers/PriorityEncoder.java priorityEncoderComponent= \u0428\u0438\u0444\u0440\u0430\u0442\u043e\u0440 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043e\u0432 priorityEncoderInTip= \u0412\u0445\u043e\u0434 %s priorityEncoderOutTip= \u0412\u044b\u0445\u043e\u0434: \u0430\u0434\u0440\u0435\u0441 \u0441\u0442\u0430\u0440\u0448\u0435\u0433\u043e \u043f\u043e \u043d\u043e\u043c\u0435\u0440\u0443 \u0432\u0445\u043e\u0434\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c 1 priorityEncoderEnableInTip= \u0420\u0430\u0437\u0440\u0435\u0448\u0430\u044e\u0449\u0438\u0439 \u0432\u0445\u043e\u0434: 0 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 priorityEncoderEnableOutTip= \u0420\u0430\u0437\u0440\u0435\u0448\u0430\u044e\u0449\u0438\u0439 \u0432\u044b\u0445\u043e\u0434: 1, \u0435\u0441\u043b\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d \u0438 \u043d\u0438 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0432\u0445\u043e\u0434\u0435 \u043d\u0435\u0442 1 priorityEncoderGroupSignalTip= \u0412\u044b\u0431\u043e\u0440 \u0433\u0440\u0443\u043f\u043f\u044b: 1, \u0435\u0441\u043b\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d \u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0432\u0445\u043e\u0434\u0435 1 # std/BitSelector.java bitSelectorComponent= \u0421\u0435\u043b\u0435\u043a\u0442\u043e\u0440 \u0431\u0438\u0442\u043e\u0432 bitSelectorGroupAttr= \u0412\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u0431\u0438\u0442\u044b bitSelectorOutputTip= \u0412\u044b\u0445\u043e\u0434: \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0438\u0437 \u0434\u0430\u043d\u043d\u044b\u0445 \u0433\u0440\u0443\u043f\u043f\u044b \u0431\u0438\u0442 bitSelectorDataTip= \u0414\u0430\u043d\u043d\u044b\u0435 bitSelectorSelectTip= \u0412\u044b\u0431\u0438\u0440\u0430\u044e\u0449\u0438\u0439 \u0432\u0445\u043e\u0434: \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442, \u043a\u0430\u043a\u0430\u044f \u0433\u0440\u0443\u043f\u043f\u0430 \u0438\u0437 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u044b\u0431\u0440\u0430\u043d\u0430 # # arith/Arithmetic.java # arithmeticLibrary= \u0410\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u0430 # arith/Adder.java adderComponent= \u0421\u0443\u043c\u043c\u0430\u0442\u043e\u0440 adderInputTip= \u0412\u0445\u043e\u0434: \u043e\u0434\u043d\u043e \u0438\u0437 \u0447\u0438\u0441\u0435\u043b \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f adderOutputTip= \u0412\u044b\u0445\u043e\u0434: \u0441\u0443\u043c\u043c\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043d\u0430 \u0432\u0445\u043e\u0434\u0430\u0445 (\u043f\u043b\u044e\u0441 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430) adderCarryInTip= \u0412\u0445\u043e\u0434 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430: \u0435\u0441\u043b\u0438 1, \u0442\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f 1 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e adderCarryOutTip= \u0412\u044b\u0445\u043e\u0434 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430: 1, \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0431\u0438\u0442\u044b # arith/Subtractor.java subtractorComponent= \u0412\u044b\u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c subtractorMinuendTip= \u0423\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u043c\u043e\u0435: \u0447\u0438\u0441\u043b\u043e, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u044b\u0447\u0438\u0442\u0430\u0442\u044c subtractorSubtrahendTip= \u0412\u044b\u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0435: \u0447\u0438\u0441\u043b\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u0442\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u043c\u043e\u0433\u043e subtractorOutputTip= \u0412\u044b\u0445\u043e\u0434: \u0440\u0430\u0437\u043d\u043e\u0441\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u043c\u044b\u043c \u0438 \u0432\u044b\u0447\u0438\u0442\u0430\u0435\u043c\u044b\u043c subtractorBorrowInTip= \u0412\u0445\u043e\u0434 \u0437\u0430\u0439\u043c\u0430: \u0435\u0441\u043b\u0438 1, \u0442\u043e \u0438\u0437 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u044b\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f 1 subtractorBorrowOutTip= \u0412\u044b\u0445\u043e\u0434 \u0437\u0430\u0439\u043c\u0430: 1, \u0435\u0441\u043b\u0438 \u0440\u0430\u0437\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u0451\u0442 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 # arith/Multiplier.java multiplierComponent= \u041c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c multiplierInputTip= \u0412\u0445\u043e\u0434: \u043e\u0434\u043d\u043e \u0438\u0437 \u0447\u0438\u0441\u0435\u043b \u0434\u043b\u044f \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f multiplierOutputTip= \u0412\u044b\u0445\u043e\u0434: \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432\u0445\u043e\u0434\u043e\u0432 \u043f\u043b\u044e\u0441 \u0432\u0445\u043e\u0434 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 multiplierCarryInTip= \u0412\u0445\u043e\u0434 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430: \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0430, \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u0435\u043c\u0430\u044f \u043a \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e multiplierCarryOutTip= \u0412\u044b\u0445\u043e\u0434 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430: \u0441\u0442\u0430\u0440\u0448\u0438\u0435 \u0431\u0438\u0442\u044b \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f # arith/Divider.java dividerComponent= \u0414\u0435\u043b\u0438\u0442\u0435\u043b\u044c dividerUpperInput= upper dividerRemainderOutput= rem dividerDividendLowerTip= \u041d\u0438\u0437 \u0434\u0435\u043b\u0438\u043c\u043e\u0433\u043e: \u043c\u043b\u0430\u0434\u0448\u0430\u044f \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u0447\u0438\u0441\u043b\u0430 \u0434\u043b\u044f \u0434\u0435\u043b\u0435\u043d\u0438\u044f dividerDividendUpperTip= \u0412\u0435\u0440\u0445 \u0434\u0435\u043b\u0438\u043c\u043e\u0433\u043e: \u0441\u0442\u0430\u0440\u0448\u0430\u044f \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u0447\u0438\u0441\u043b\u0430 \u0434\u043b\u044f \u0434\u0435\u043b\u0435\u043d\u0438\u044f dividerDivisorTip= \u0414\u0435\u043b\u0438\u0442\u0435\u043b\u044c: \u0447\u0438\u0441\u043b\u043e, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0434\u0435\u043b\u0438\u0442\u044c dividerOutputTip= \u0412\u044b\u0445\u043e\u0434: \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0434\u0435\u043b\u0438\u043c\u043e\u0433\u043e \u043d\u0430 \u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c dividerRemainderTip= \u041e\u0441\u0442\u0430\u0442\u043e\u043a: \u043e\u0441\u0442\u0430\u0442\u043e\u043a (\u0434\u0435\u043b\u0438\u043c\u043e\u0435 - \u0447\u0430\u0441\u0442\u043d\u043e\u0435*\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c) # arith/Negator.java negatorComponent= \u041e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c negatorInputTip= \u0412\u0445\u043e\u0434: \u0447\u0438\u0441\u043b\u043e \u0434\u043b\u044f \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f negatorOutputTip= \u0412\u044b\u0445\u043e\u0434: \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0432\u0445\u043e\u0434\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u043a\u043e\u0434\u0435 # arith/Comparator.java comparatorComponent= \u041a\u043e\u043c\u043f\u0430\u0440\u0430\u0442\u043e\u0440 comparatorType= \u0424\u043e\u0440\u043c\u0430\u0442 \u0447\u0438\u0441\u043b\u0430 unsignedOption= \u0411\u0435\u0437\u0437\u043d\u0430\u043a\u043e\u0432\u043e\u0435 twosComplementOption= \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 comparatorInputATip= A: \u043f\u0435\u0440\u0432\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f comparatorInputBTip= B: \u0432\u0442\u043e\u0440\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f comparatorLessTip= \u041c\u0435\u043d\u044c\u0448\u0435: 1, \u0435\u0441\u043b\u0438 A \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c B comparatorEqualTip= \u0420\u0430\u0432\u043d\u043e: 1, \u0435\u0441\u043b\u0438 A \u0440\u0430\u0432\u043d\u043e B comparatorGreaterTip= \u0411\u043e\u043b\u044c\u0448\u0435: 1, \u0435\u0441\u043b\u0438 A \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c B # arith/Shifter.java shifterComponent= \u0421\u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044c shifterShiftAttr= \u0422\u0438\u043f \u0441\u0434\u0432\u0438\u0433\u0430 shiftLogicalLeft= \u041b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043b\u0435\u0432\u044b\u0439 shiftLogicalRight= \u041b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u0430\u0432\u044b\u0439 shiftArithmeticRight= \u0410\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u0430\u0432\u044b\u0439 shiftRollLeft= \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043b\u0435\u0432\u044b\u0439 shiftRollRight= \u041b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u0430\u0432\u044b\u0439 shifterDistanceTip= \u0414\u0438\u0441\u0442\u0430\u043d\u0446\u0438\u044f: \u043d\u0430 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0434\u0432\u0438\u0433\u0430\u0442\u044c \u0432\u0445\u043e\u0434\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 shifterInputTip= \u0412\u0445\u043e\u0434: \u0431\u0438\u0442\u044b \u0434\u043b\u044f \u0441\u0434\u0432\u0438\u0433\u0430 shifterOutputTip= \u0412\u044b\u0445\u043e\u0434: \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u0434\u0432\u0438\u0433\u0430 \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f # arith/BitAdder.java bitAdderComponent= \u0421\u0443\u043c\u043c\u0430\u0442\u043e\u0440 \u0431\u0438\u0442\u043e\u0432 bitAdderInputTip= \u0412\u0445\u043e\u0434: \u0431\u0438\u0442\u044b \u0434\u043b\u044f \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u0430 bitAdderOutputManyTip= \u0412\u044b\u0445\u043e\u0434: \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0435\u0434\u0438\u043d\u0438\u0446 \u0441\u0440\u0435\u0434\u0438 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0431\u0438\u0442\u043e\u0432 # arith/BitFinder.java bitFinderComponent= \u0418\u0441\u043a\u0430\u0442\u0435\u043b\u044c \u0431\u0438\u0442\u043e\u0432 bitFinderFindLabel= find bitFinderHighLabel= high bitFinderLowLabel= low bitFinderHighOption= \u0421\u0442\u0430\u0440\u0448\u0438\u0439 %s bitFinderLowOption= \u041c\u043b\u0430\u0434\u0448\u0438\u0439 %s bitFinderTypeAttr= \u0422\u0438\u043f bitFinderIndexHighTip= \u041d\u043e\u043c\u0435\u0440: \u043d\u043e\u043c\u0435\u0440 \u0441\u0442\u0430\u0440\u0448\u0435\u0433\u043e \u0431\u0438\u0442\u0430 %s \u0432\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0438 bitFinderIndexLowTip= \u041d\u043e\u043c\u0435\u0440: \u043d\u043e\u043c\u0435\u0440 \u043c\u043b\u0430\u0434\u0448\u0435\u0433\u043e \u0431\u0438\u0442\u0430 %s \u0432\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0438 bitFinderPresentTip= \u041f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435: 1, \u0435\u0441\u043b\u0438 \u0432\u0445\u043e\u0434\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 %s bitFinderInputTip= \u0412\u0445\u043e\u0434: \u0431\u0438\u0442\u044b \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 # # io # # io/Io.java ioLibrary= \u0412\u0432\u043e\u0434/\u0432\u044b\u0432\u043e\u0434 ioLabelCenter= \u0426\u0435\u043d\u0442\u0440 ioBitWidthAttr= \u0420\u0430\u0437\u0440\u044f\u0434\u043d\u043e\u0441\u0442\u044c ioColorAttr= \u0426\u0432\u0435\u0442 ioLabelLocAttr= \u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u043a\u0438 ioLabelColorAttr= \u0426\u0432\u0435\u0442 \u043c\u0435\u0442\u043a\u0438 ioActiveAttr= \u0410\u043a\u0442\u0438\u0432\u0435\u043d \u043f\u0440\u0438 \u0435\u0434\u0438\u043d\u0438\u0446\u0435? # io/Button.java buttonComponent= \u041a\u043d\u043e\u043f\u043a\u0430 # io/Joystick.java joystickComponent= \u0414\u0436\u043e\u0439\u0441\u0442\u0438\u043a # io/Keyboard.java keyboardComponent= \u041a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0430 keybDesc= \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0430 (\u0431\u0443\u0444\u0435\u0440 %s) keybBufferLengthAttr= \u0414\u043b\u0438\u043d\u0430 \u0431\u0443\u0444\u0435\u0440\u0430 keybClearTip= \u041e\u0447\u0438\u0441\u0442\u043a\u0430: 1 \u043e\u0447\u0438\u0449\u0430\u0435\u0442 \u0431\u0443\u0444\u0435\u0440 keybClockTip= \u0422\u0430\u043a\u0442\u043e\u0432\u044b\u0439 \u0432\u0445\u043e\u0434: \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u0431\u0443\u0444\u0435\u0440\u0430 keybEnableTip= \u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438: 0 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0442\u0430\u043a\u0442\u043e\u0432\u044b\u0439 \u0432\u0445\u043e\u0434 keybAvailTip= \u041d\u0430\u043b\u0438\u0447\u0438\u0435: 1, \u043a\u043e\u0433\u0434\u0430 \u0431\u0443\u0444\u0435\u0440 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0438\u043c\u0432\u043e\u043b\u044b keybOutputTip= \u0414\u0430\u043d\u043d\u044b\u0435: ASCII \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0431\u0443\u0444\u0435\u0440\u0430 # io/Led.java ledComponent= \u0421\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434 # io/SevenSegment.java sevenSegmentComponent= 7-\u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043d\u044b\u0439 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 # io/HexDigit.java hexDigitComponent= \u0428\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u044b\u0439 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 # io/DotMatrix.java dotMatrixComponent= \u0421\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043d\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430 ioMatrixInput= \u0424\u043e\u0440\u043c\u0430\u0442 \u0432\u0445\u043e\u0434\u0430 ioMatrixRows= \u0421\u0442\u0440\u043e\u043a\u0438 \u043c\u0430\u0442\u0440\u0438\u0446\u044b ioMatrixCols= \u0421\u0442\u043e\u043b\u0431\u0446\u044b \u043c\u0430\u0442\u0440\u0438\u0446\u044b ioOnColor= \u0426\u0432\u0435\u0442 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0445 ioOffColor= \u0426\u0432\u0435\u0442 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0445 ioBackgroundColor= \u0424\u043e\u043d ioMatrixPersistenceAttr= \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u0432\u0435\u0447\u0435\u043d\u0438\u044f ioMatrixShape= \u0424\u043e\u0440\u043c\u0430 \u0442\u043e\u0447\u043a\u0438 ioInputColumn= \u0421\u0442\u043e\u043b\u0431\u0446\u044b ioInputRow= \u0421\u0442\u0440\u043e\u043a\u0438 ioInputSelect= \u0412\u044b\u0431\u043e\u0440 \u0421\u0442\u0440\u043e\u043a\u0438/\u0421\u0442\u043e\u043b\u0431\u0446\u044b ioShapeCircle= \u041a\u0440\u0443\u0433\u043b\u0430\u044f ioShapeSquare= \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u0430\u044f # io/Tty.java ttyComponent= \u0422\u0435\u0440\u043c\u0438\u043d\u0430\u043b ttyDesc= \u0422\u0435\u0440\u043c\u0438\u043d\u0430\u043b (%s \u0441\u0442\u0440\u043e\u043a, %s \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432) ttyDescShort= \u0422\u0435\u0440\u043c\u0438\u043d\u0430\u043b ttyRowsAttr= \u0421\u0442\u0440\u043e\u043a\u0438 ttyColsAttr= \u0421\u0442\u043e\u043b\u0431\u0446\u044b ttyClearTip= \u041e\u0447\u0438\u0441\u0442\u043a\u0430: 1 \u043e\u0447\u0438\u0449\u0430\u0435\u0442 \u044d\u043a\u0440\u0430\u043d ttyClockTip= \u0422\u0430\u043a\u0442\u043e\u0432\u044b\u0439 \u0432\u0445\u043e\u0434: \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0438\u043c\u0432\u043e\u043b \u043d\u0430 \u0432\u0445\u043e\u0434 ttyEnableTip= \u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438: 0 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0442\u0430\u043a\u0442\u043e\u0432\u044b\u0439 \u0432\u0445\u043e\u0434 ttyInputTip= \u0414\u0430\u043d\u043d\u044b\u0435: ASCII \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 logisim-2.7.1/resources/logisim/ru/start.properties0000644000175000017500000002522711532247714022456 0ustar vincentvincent# # Startup.java # argTwoSubstitutionError= \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 "-sub" \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u0442\u044c\u0441\u044f \u0434\u0432\u0443\u043c\u044f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438. argDuplicateSubstitutionError= \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0442\u043e\u0442 \u0436\u0435 \u0444\u0430\u0439\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437. ttyNeedsFileError= \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 "-tty" \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0438\u043c\u044f \u0444\u0430\u0439\u043b\u0430 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435. argTtyOption= -tty \u0444\u043e\u0440\u043c\u0430\u0442 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0431\u0435\u0437 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 argSubOption= -sub \u0444\u0430\u0439\u043b1 \u0444\u0430\u0439\u043b2 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0444\u0430\u0439\u043b, \u0437\u0430\u043c\u0435\u043d\u0438\u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0444\u0430\u0439\u043b1 \u043d\u0430 \u0444\u0430\u0439\u043b2 argLoadOption= -load \u0444\u0430\u0439\u043b \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0444\u0430\u0439\u043b \u043e\u0431\u0440\u0430\u0437\u0430 \u0432 \u041e\u0417\u0423 (\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 -tty) loadNeedsFileError= \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 "-load" \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0438\u043c\u044f \u0444\u0430\u0439\u043b\u0430, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0435 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443. loadNeedsTtyError= "-load" \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0438 \u0441 "-tty". loadMultipleError= \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 "-load" \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437. ttyFormatError= -tty \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435 \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432: halt, speed, stats, table, tty argOneTemplateError= \u0414\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0448\u0430\u0431\u043b\u043e\u043d. argUsage= \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435: java %s [\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b] [\u0438\u043c\u0435\u043d\u0430_\u0444\u0430\u0439\u043b\u043e\u0432] argOptionHeader= \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b: argEmptyOption= -empty \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0443\u0441\u0442\u043e\u0439 \u0448\u0430\u0431\u043b\u043e\u043d argPlainOption= -plain \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d Logisim argTemplateOption= -template \u0444\u0430\u0439\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 argGatesOption= -gates shaped|rectangular \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u0441\u0442\u0438\u043b\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 argLocaleOption= -locale str \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044f\u0437\u044b\u043a, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u0432 str argAccentsOption= -accents yes|no \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0438\u043b\u0438 ASCII \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u044b argNoSplashOption= -nosplash \u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0437\u0430\u0441\u0442\u0430\u0432\u043a\u0443 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 argVersionOption= -version \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u043d\u043e\u043c\u0435\u0440 \u0432\u0435\u0440\u0441\u0438\u0438 \u0438 \u0432\u044b\u0439\u0442\u0438 argHelpOption= -help \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u044d\u0442\u0443 \u0441\u0432\u043e\u0434\u043a\u0443 \u0438 \u0432\u044b\u0439\u0442\u0438 argClearOption= -clearprops \u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 argGatesOptionError= \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 -gates \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c "shaped" \u0438\u043b\u0438 "rectangular". argAccentsOptionError= \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 -accents \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c "yes" \u0438\u043b\u0438 "no". templateMissingError= \u0424\u0430\u0439\u043b \u0448\u0430\u0431\u043b\u043e\u043d\u0430 %s \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442. templateCannotReadError= \u041d\u0435\u0442 \u043f\u0440\u0430\u0432 \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 %s. invalidLocaleError= \u0417\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u044f\u0437\u044b\u043a \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f. invalidLocaleOptionsHeader= \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u044f\u0437\u044b\u043a\u0438: startupCloseButton= \u0417\u0430\u043a\u0440\u044b\u0442\u044c startupQuitButton= \u0412\u044b\u0445\u043e\u0434 # # SplashScreen.java # progressLibraries= \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432... progressTemplateCreate= \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u0430... progressTemplateOpen= \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u0430... progressTemplateLoad= \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430... progressTemplateClose= \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u0430... progressGuiInitialize= \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430... progressFileCreate= \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430... progressFileLoad= \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0444\u0430\u0439\u043b\u0430... progressProjectCreate= \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430... progressFrameCreate= \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u043a\u043d\u0430... creditsRoleLead= \u0412\u0435\u0434\u0443\u0449\u0438\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a creditsRoleGerman= \u041d\u0435\u043c\u0435\u0446\u043a\u0438\u0439 \u043f\u0435\u0440\u0435\u0432\u043e\u0434 creditsRoleGreek= \u0413\u0440\u0435\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0435\u0440\u0435\u0432\u043e\u0434 creditsRolePortuguese= \u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u044c\u0441\u043a\u0438\u0439 \u043f\u0435\u0440\u0435\u0432\u043e\u0434 creditsRoleRussian= \u0420\u0443\u0441\u0441\u043a\u0438\u0439 \u043f\u0435\u0440\u0435\u0432\u043e\u0434 creditsRoleTesting= \u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 creditsRoleOriginal= \u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f # # TtyInterface.java # ttyLoadError= \u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0444\u0430\u0439\u043b\u0430 \u0441\u0445\u0435\u043c\u044b: %s ttySpeedMsg= %s \u0413\u0446 (%s \u0442\u0430\u043a\u0442\u043e\u0432 \u0437\u0430 %s \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434) loadNoRamError= \u041d\u0435 \u0431\u044b\u043b\u043e \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u041e\u0417\u0423 \u0434\u043b\u044f \u043f\u0430\u0440\u0435\u043c\u0442\u0440\u0430 "-load". loadIoError= \u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 \u0444\u0430\u0439\u043b\u0430 \u043e\u0431\u0440\u0430\u0437\u0430 ttyNoTtyError= \u041d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0422\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u0438\u043b\u0438 \u041a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0430. ttyHaltReasonPin= \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u0447\u043d\u044b\u043c \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u043e\u043c ttyHaltReasonOscillation= \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u0438\u0437-\u0437\u0430 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u043e\u0437\u0431\u0443\u0436\u0434\u0435\u043d\u0438\u044f statsTotalWithout= \u0412\u0421\u0415\u0413\u041e (\u0431\u0435\u0437 \u043f\u043e\u0434\u0441\u0445\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0430) statsTotalWith= \u0412\u0421\u0415\u0413\u041e (\u0441 \u043f\u043e\u0434\u0441\u0445\u0435\u043c\u0430\u043c\u0438) logisim-2.7.1/resources/logisim/ru/proj.properties0000644000175000017500000000504511452221640022256 0ustar vincentvincent# # ProjectActions.java # newCircuitName= main openAlreadyTitle= \u0424\u0430\u0439\u043b \u0443\u0436\u0435 \u043e\u0442\u043a\u0440\u044b\u0442 openAlreadyMessage= \u0423\u0436\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0444\u0430\u0439\u043b %s \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. openAlreadyCancelOption= \u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 openAlreadyLoseChangesOption= \u041f\u043e\u0442\u0435\u0440\u044f\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f openAlreadyNewWindowOption= \u041d\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e confirmOverwriteMessage= \u0424\u0430\u0439\u043b \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442. \u0425\u043e\u0442\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0433\u043e? confirmOverwriteTitle= \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044c fileOpenError= \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0444\u0430\u0439\u043b: %s fileOpenErrorTitle= \u041e\u0448\u0438\u0431\u043a\u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f templateOpenError= \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d: %s templateOpenErrorTitle= \u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 replaceExtensionMessage= \u0425\u043e\u0442\u0438\u0442\u0435 \u0441\u043c\u0435\u043d\u0438\u0442\u044c "%s" \u043d\u0430 \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0435 \u0434\u043b\u044f Logisim \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 ".circ"? replaceExtensionTitle= \u0421\u043c\u0435\u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 confirmQuitTitle= \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c \u0432\u044b\u0445\u043e\u0434 replaceExtensionReplaceOpt= \u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c "%s" replaceExtensionAddOpt= \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c "%s" replaceExtensionKeepOpt= \u041d\u0435 \u043c\u0435\u043d\u044f\u0442\u044clogisim-2.7.1/resources/logisim/ru/prefs.properties0000644000175000017500000001431111532247704022427 0ustar vincentvincent# # PreferencesFrame.java # preferencesFrameTitle= Logisim: \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 preferencesFrameMenuItem= \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 closeButton= \u0417\u0430\u043a\u0440\u044b\u0442\u044c \u043e\u043a\u043d\u043e # TemplateOptions.java templateTitle= \u0428\u0430\u0431\u043b\u043e\u043d templateHelp= \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0448\u0430\u0431\u043b\u043e\u043d templatePlainOption= \u041e\u0431\u044b\u0447\u043d\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d templateEmptyOption= \u041f\u0443\u0441\u0442\u043e\u0439 \u0448\u0430\u0431\u043b\u043e\u043d templateCustomOption= \u0421\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d: templateSelectButton= \u0412\u044b\u0431\u0440\u0430\u0442\u044c... templateErrorMessage= \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d: %s templateErrorTitle= \u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 selectDialogTitle= \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d selectDialogButton= \u0412\u044b\u0431\u0440\u0430\u0442\u044c # IntlOptions.java intlTitle= \u041c\u0435\u0436\u0434\u0443\u043d\u0430\u0440\u043e\u0434\u043d\u044b\u0435 intlHelp= \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 intlLocale= \u042f\u0437\u044b\u043a: intlReplaceAccents= \u0417\u0430\u043c\u0435\u043d\u044f\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b intlGateShape= \u0424\u043e\u0440\u043c\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432: shapeShaped= \u0424\u0438\u0433\u0443\u0440\u043d\u044b\u0435 shapeRectangular= \u041f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u044b\u0435 shapeDIN40700= DIN 40700 # WindowOptions.java windowTitle= \u041e\u043a\u043d\u043e windowHelp= \u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f windowTickRate= \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0442\u0430\u043a\u0442\u043e\u0432 windowToolbarLocation= \u0420\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432: windowToolbarHidden= \u0421\u043a\u0440\u044b\u0442\u0430 windowToolbarDownMiddle= \u041f\u043e\u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u0432\u043d\u0438\u0437 # LayoutOptions.java layoutTitle= \u0427\u0435\u0440\u0442\u0451\u0436 layoutHelp= \u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0447\u0435\u0440\u0442\u0435\u0436\u0430 layoutAddShowGhosts= \u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u0437\u0440\u0430\u043a\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f layoutPrinterView= \u0412\u0438\u0434 \u0434\u043b\u044f \u043f\u0435\u0447\u0430\u0442\u0438 layoutMoveKeepConnect= \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0438 layoutAttributeHalo= \u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043e\u0440\u0435\u043e\u043b layoutShowTips= \u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 layoutAddAfter= \u041f\u043e\u0441\u043b\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430: layoutAddAfterUnchanged= \u041e\u0441\u0442\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0435 \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 layoutAddAfterEdit= \u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u041f\u0440\u0430\u0432\u043a\u0430 layoutRadix1= \u041f\u0435\u0440\u0432\u043e\u0435 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 \u043f\u0440\u043e\u0432\u043e\u0434: layoutRadix2= \u0412\u0442\u043e\u0440\u043e\u0435 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 \u043f\u0440\u043e\u0432\u043e\u0434: # ExperimentalOptions.java experimentTitle= \u042d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0435 experimentHelp= \u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0449\u0435 \u043d\u0435 \u0431\u044b\u043b\u0438 \u0442\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b accelLabel= \u0423\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u0433\u0440\u0430\u0444\u0438\u043a\u0438: accelDefault= \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044f accelNone= \u041d\u0435\u0442 accelOpenGL= OpenGL accelD3D= Direct 3D accelRestartLabel= \u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435 Logisim, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432\u0441\u0442\u0443\u043f\u0438\u043b\u0438 \u0432 \u0441\u0438\u043b\u0443. logisim-2.7.1/resources/logisim/ru/opts.properties0000644000175000017500000001064111455261276022303 0ustar vincentvincent# # OptionsFrame.java # optionsFrameTitle= Logisim: \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b %s optionsFrameMenuItem= %s: \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b revertButton= \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u043a \u0448\u0430\u0431\u043b\u043e\u043d\u0443 closeButton= \u0417\u0430\u043a\u0440\u044b\u0442\u044c \u043e\u043a\u043d\u043e # # OptionsActions.java # setOptionAction= \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c %s addMouseMappingAction= \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0443 \u043c\u044b\u0448\u0438 removeMouseMappingAction= \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0443 \u043c\u044b\u0448\u0438 # # SimulateOptions.java # simulateTitle= \u041c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 simulateHelp= \u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0434\u0432\u0438\u0436\u043a\u0430 \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0445\u0435\u043c\u044b. simulateLimit= \u0418\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u0434\u043e \u0432\u043e\u0437\u0431\u0443\u0436\u0434\u0435\u043d\u0438\u044f gateUndefined= \u0412\u044b\u0445\u043e\u0434 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043f\u0440\u0438 \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0441\u0442\u0438 simulateRandomness= \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0448\u0443\u043c \u043a \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 # # MouseOptions.java # mouseTitle= \u041c\u044b\u0448\u044c mouseHelp= \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043a \u043a\u043d\u043e\u043f\u043a\u0430\u043c \u043c\u044b\u0448\u0438. mouseMapNone= \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043d\u0435 \u0432\u044b\u0431\u0440\u0430\u043d mouseMapText= \u0429\u0451\u043b\u043a\u043d\u0438\u0442\u0435 \u0437\u0434\u0435\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044e, mouseMapText2= \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u0442\u044c %s mouseRemoveButton= \u0423\u0434\u0430\u043b\u0438\u0442\u044c # # ToolbarOptions.java # toolbarTitle= \u041f\u0430\u043d\u0435\u043b\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 toolbarHelp= \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 toolbarAddTool= \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 toolbarAddSeparator= \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c toolbarMoveUp= \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u0432\u0435\u0440\u0445 toolbarMoveDown= \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u043d\u0438\u0437 toolbarRemove= \u0423\u0434\u0430\u043b\u0438\u0442\u044c # # ToolbarActions.java # toolbarAddAction= \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 toolbarRemoveAction= \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 toolbarMoveAction= \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 toolbarInsertSepAction= \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c toolbarRemoveSepAction= \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c logisim-2.7.1/resources/logisim/ru/menu.properties0000644000175000017500000003020711532247716022261 0ustar vincentvincent# MenuEdit.java editMenu= \u041f\u0440\u0430\u0432\u043a\u0430 editCantUndoItem= \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c editUndoItem= \u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c %s editCutItem= \u0412\u044b\u0440\u0435\u0437\u0430\u0442\u044c editCopyItem= \u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c editPasteItem= \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c editDuplicateItem= \u0414\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c editClearItem= \u0423\u0434\u0430\u043b\u0438\u0442\u044c editSelectAllItem= \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435 editLowerItem= \u041e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 editRaiseItem= \u041f\u043e\u0434\u043d\u044f\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 editRaiseTopItem= \u041f\u043e\u0434\u043d\u044f\u0442\u044c \u043d\u0430\u0432\u0435\u0440\u0445 editLowerBottomItem= \u041e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u0437 editAddControlItem= \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u0435\u0440\u0448\u0438\u043d\u0443 editRemoveControlItem= \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0435\u0440\u0448\u0438\u043d\u0443 # MenuFile.java fileMenu= \u0424\u0430\u0439\u043b fileNewItem= \u041d\u043e\u0432\u044b\u0439 fileOpenItem= \u041e\u0442\u043a\u0440\u044b\u0442\u044c... fileOpenRecentItem= \u041e\u0442\u043a\u0440\u044b\u0442\u044c \u043d\u0435\u0434\u0430\u0432\u043d\u0438\u0435 fileOpenRecentNoChoices= (\u041d\u0435\u0442) fileCloseItem= \u0417\u0430\u043a\u0440\u044b\u0442\u044c fileSaveItem= \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c fileSaveAsItem= \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u0430\u043a... fileExportImageItem= \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435... filePrintItem= \u041f\u0435\u0447\u0430\u0442\u044c... filePreferencesItem= \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438... fileQuitItem= \u0412\u044b\u0445\u043e\u0434 # MenuProject.java projectMenu= \u041f\u0440\u043e\u0435\u043a\u0442 projectAddCircuitItem= \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0445\u0435\u043c\u0443... projectLoadLibraryItem= \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 projectLoadBuiltinItem= \u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430... projectLoadLogisimItem= \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 Logisim... projectLoadJarItem= \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 JAR... projectUnloadLibraryItem= \u0412\u044b\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 projectUnloadLibrariesItem= \u0412\u044b\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438... projectMoveCircuitDownItem= \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0441\u0445\u0435\u043c\u0443 \u0432\u043d\u0438\u0437 projectMoveCircuitUpItem= \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0441\u0445\u0435\u043c\u0443 \u0432\u0432\u0435\u0440\u0445 projectSetAsMainItem= \u0421\u0434\u0435\u043b\u0430\u0442\u044c \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u043e\u0439 projectRemoveCircuitItem= \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0445\u0435\u043c\u0443 projectEditCircuitLayoutItem= \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0442\u0451\u0436 \u0441\u0445\u0435\u043c\u044b projectEditCircuitAppearanceItem= \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0432\u0438\u0434 \u0441\u0445\u0435\u043c\u044b projectRevertAppearanceItem= \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0432\u0438\u0434 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e projectAnalyzeCircuitItem= \u0410\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0445\u0435\u043c\u0443 projectViewToolboxItem= \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b projectViewSimulationItem= \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u0435\u0440\u0435\u0432\u043e \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f projectGetCircuitStatisticsItem= \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u0441\u0445\u0435\u043c\u044b projectOptionsItem= \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b... # MenuSimulate.java simulateMenu= \u041c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c simulateRunItem= \u041c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043e simulateResetItem= \u0421\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 simulateStepItem= \u0428\u0430\u0433 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f simulateTickOnceItem= \u041e\u0434\u0438\u043d \u0442\u0430\u043a\u0442 simulateTickItem= \u0422\u0430\u043a\u0442\u044b \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u044b simulateTickFreqMenu= \u0422\u0430\u043a\u0442\u043e\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u043e\u0442\u0430 simulateTickFreqItem= %s \u0413\u0446 simulateTickKFreqItem= %s \u043a\u0413\u0446 simulateUpStateMenu= \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u0432\u044b\u0448\u0435 simulateDownStateMenu= \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u043d\u0438\u0436\u0435 simulateLogItem= \u0417\u0430\u043f\u0438\u0441\u044c \u0432 \u0436\u0443\u0440\u043d\u0430\u043b... # MenuHelp.java helpMenu= \u0421\u043f\u0440\u0430\u0432\u043a\u0430 helpTutorialItem= \u041f\u043e\u0441\u043e\u0431\u0438\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0435\u0433\u043e helpGuideItem= \u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f helpLibraryItem= \u0421\u043f\u0440\u0430\u0432\u043a\u0430 \u043f\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 helpAboutItem= \u041e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435... helpNotFoundError= \u0414\u0430\u043d\u043d\u044b\u0435 \u0441\u043f\u0440\u0430\u0432\u043a\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u044b. helpUnavailableError= \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043f\u0440\u0430\u0432\u043a\u0438. helpDisplayError= \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043f\u0440\u0430\u0432\u043a\u0438. helpWindowTitle= \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f Logisim helpsetUrl= doc/doc_ru.hs # Popups.java projMenu= \u041f\u0440\u043e\u0435\u043a\u0442 libMenu= \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 circuitMenu= \u0421\u0445\u0435\u043c\u0430 projectReloadLibraryItem= \u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 # ProjectCircuitActions.java circuitNameDialogTitle= \u0412\u0432\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0441\u0445\u0435\u043c\u044b circuitNamePrompt= \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0445\u0435\u043c\u044b: circuitNameMissingError= \u041a\u0430\u0436\u0434\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0438\u043c\u044f. circuitNameDuplicateError= \u0421\u0445\u0435\u043c\u044b \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u0438\u043c\u0435\u043d\u0430. circuitRemoveErrorTitle= \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0446\u0435\u043f\u044c circuitRemoveLastError= \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u0443 \u0441\u0445\u0435\u043c\u0443. circuitRemoveUsedError= \u0421\u0445\u0435\u043c\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0430\u044f \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u0445\u0435\u043c\u0430\u0445, \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u0430. analyzeErrorTitle= \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c analyzeMultibitInputError= \u0410\u043d\u0430\u043b\u0438\u0437 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u0431\u0438\u0442\u043d\u044b\u043c\u0438 \u0432\u0445\u043e\u0434\u0430\u043c\u0438. analyzeMultibitOutputError= \u0410\u043d\u0430\u043b\u0438\u0437 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u0431\u0438\u0442\u043d\u044b\u043c\u0438 \u0432\u044b\u0445\u043e\u0434\u0430\u043c\u0438. analyzeTooManyInputsError= \u0410\u043d\u0430\u043b\u0438\u0437 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c %s \u0432\u0445\u043e\u0434\u0430\u043c\u0438. analyzeTooManyOutputsError= \u0410\u043d\u0430\u043b\u0438\u0437 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c %s \u0432\u044b\u0445\u043e\u0434\u0430\u043c\u0438. analyzeNoExpressionTitle= \u0412\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e # ProjectLibraryActions.java loadBuiltinErrorTitle= \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 loadBuiltinNoneError= \u0412\u0441\u0435 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0443\u0436\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u044b. loadBuiltinDialogTitle= \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 loadLogisimDialogTitle= \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0444\u0430\u0439\u043b Logisim loadJarDialogTitle= \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c JAR \u0444\u0430\u0439\u043b jarClassNamePrompt= \u0418\u043c\u044f \u043a\u043b\u0430\u0441\u0441\u0430: jarClassNameTitle= \u0412\u0432\u043e\u0434 JAR \u043a\u043b\u0430\u0441\u0441\u0430 unloadLibrariesDialogTitle= \u0412\u044b\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 unloadErrorTitle= \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 unloadNoneError= \u0412\u0441\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f. logisim-2.7.1/resources/logisim/ru/log.properties0000644000175000017500000000600511452221640022062 0ustar vincentvincent# # OptionsFrame.java # logFrameTitle= Logisim: \u0436\u0443\u0440\u043d\u0430\u043b %s \u0438\u0437 %s logFrameMenuItem= %s: \u0436\u0443\u0440\u043d\u0430\u043b closeButton= \u0417\u0430\u043a\u0440\u044b\u0442\u044c \u043e\u043a\u043d\u043e # # SelectionPanel.java # selectionTab= \u0412\u044b\u0431\u043e\u0440 selectionHelp= \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a\u0430\u043a\u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432 \u0436\u0443\u0440\u043d\u0430\u043b. selectionAdd= \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c >> selectionChangeBase= \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0435 selectionMoveUp= \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u0432\u0435\u0440\u0445 selectionMoveDown= \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u043d\u0438\u0437 selectionRemove= << \u0423\u0434\u0430\u043b\u0438\u0442\u044c # # TablePanel.java # tableTab= \u0422\u0430\u0431\u043b\u0438\u0446\u0430 tableHelp= \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0436\u0443\u0440\u043d\u0430\u043b \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. tableEmptyMessage= \u0412\u044b\u0431\u043e\u0440 \u043f\u0443\u0441\u0442. # # FilePanel.java # fileTab= \u0424\u0430\u0439\u043b fileHelp= \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430. fileEnabled= \u0412\u044b\u0432\u043e\u0434 \u0432 \u0444\u0430\u0439\u043b \u0432\u043a\u043b\u044e\u0447\u0435\u043d. fileDisabled= \u0412\u044b\u0432\u043e\u0434 \u0432 \u0444\u0430\u0439\u043b \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d. fileEnableButton= \u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c fileDisableButton= \u0412\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c fileLabel= \u0424\u0430\u0439\u043b: fileSelectButton= \u0412\u044b\u0431\u0440\u0430\u0442\u044c... fileHeaderCheck= \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 fileCannotWriteTitle= \u0424\u0430\u0439\u043b \u043d\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d fileCannotWriteMessage= \u0423 \u0432\u0430\u0441 \u043d\u0435\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 "%s." fileExistsTitle= \u0424\u0430\u0439\u043b \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 fileExistsMessage= \u0424\u0430\u0439\u043b "%s" \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442. fileOverwriteOption= \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c fileAppendOption= \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u044c fileCancelOption= \u041e\u0442\u043c\u0435\u043d\u0430logisim-2.7.1/resources/logisim/ru/hex.properties0000644000175000017500000000561011452221640022066 0ustar vincentvincent# # HexFrame.java # hexFrameTitle= Logisim: \u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 hexFrameMenuItem= \u0428\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 hexPasteErrorTitle= \u041e\u0448\u0438\u0431\u043a\u0430 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 hexPasteSupportedError= \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0431\u0443\u0444\u0435\u0440\u0430 \u043e\u0431\u043c\u0435\u043d\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440. hexPasteEndError= \u0411\u0443\u0444\u0435\u0440 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u0444\u0430\u0439\u043b\u0430. hexPasteSizeError= \u041e\u0431\u043b\u0430\u0441\u0442\u044c \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0442\u043e\u0433\u043e \u0436\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430, \u0447\u0442\u043e \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430. hexOpenErrorTitle= \u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0438 hexSaveErrorTitle= \u041e\u0448\u0438\u0431\u043a\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f openButton= \u041e\u0442\u043a\u0440\u044b\u0442\u044c... saveButton= \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c... closeButton= \u0417\u0430\u043a\u0440\u044b\u0442\u044c \u043e\u043a\u043d\u043e # # HexFile.java # hexFileOpenError= \u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0444\u0430\u0439\u043b. hexFileReadError= \u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 \u0444\u0430\u0439\u043b\u0430. hexFileWriteError= \u041e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0444\u0430\u0439\u043b. hexHeaderFormatError= \u0424\u0430\u0439\u043b \u043e\u0431\u0440\u0430\u0437\u0430 \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430. hexNumberFormatError= \u0424\u0430\u0439\u043b \u043e\u0431\u0440\u0430\u0437\u0430 \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u0432\u0435\u0440\u043d\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435. hexFileSizeError= \u0424\u0430\u0439\u043b \u043e\u0431\u0440\u0430\u0437\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438. logisim-2.7.1/resources/logisim/ru/gui.properties0000644000175000017500000003347111541661302022076 0ustar vincentvincent# # gui/AttributeTable.java # attributeDialogTitle= \u0412\u044b\u0431\u043e\u0440 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f changeAttributeAction= \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442 changeCircuitAttrAction= \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0445\u0435\u043c\u0443 attributeChangeInvalidError= \u0410\u0442\u0440\u0438\u0431\u0443\u0442 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0451\u043d, \u0442\u0430\u043a \u043a\u0430\u043a \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0435\u0432\u0435\u0440\u0435\u043d attributeChangeInvalidTitle= \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u0432\u0435\u0440\u043d\u043e cannotModifyCircuitError= \u042d\u0442\u0430 \u0441\u0445\u0435\u043c\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0430. # # gui/Canvas.java # canvasWidthError= \u041d\u0435\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0435 \u0440\u0430\u0437\u0440\u044f\u0434\u043d\u043e\u0441\u0442\u0438 canvasOscillationError= \u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043e \u0432\u043e\u0437\u0431\u0443\u0436\u0434\u0435\u043d\u0438\u0435 canvasExceptionError= \u041c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u0438\u0437-\u0437\u0430 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u043e\u0448\u0438\u0431\u043a\u0438 # # gui/Frame.java # titleCircFileKnown= Logisim: %s \u0438\u0437 %s titleFileKnown= Logisim: %s confirmDiscardMessage= \u0427\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0442\u0438 \u0441 \u0432\u0430\u0448\u0438\u043c\u0438 \u043d\u0435\u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u043c\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438 \u0432 %s? confirmCloseTitle= \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f saveOption= \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c discardOption= \u041d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c cancelOption= \u041e\u0442\u043c\u0435\u043d\u0430 # # gui/ExportImage.java # labelCircuits= \u0421\u0445\u0435\u043c\u044b: labelImageFormat= \u0424\u043e\u0440\u043c\u0430\u0442 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f: labelScale= \u041c\u0430\u0441\u0448\u0442\u0430\u0431\u043d\u044b\u0439 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442: labelPrinterView= \u0412\u0438\u0434 \u0434\u043b\u044f \u043f\u0435\u0447\u0430\u0442\u0438: exportEmptyCircuitsTitle= \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c exportEmptyCircuitsMessage= \u041d\u0435\u0442 \u043d\u0435\u043f\u0443\u0441\u0442\u044b\u0445 \u0441\u0445\u0435\u043c, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0434\u043b\u044f \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430. exportImageSelect= \u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f exportImageDirectorySelect= \u0412\u044b\u0431\u043e\u0440 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430 \u0434\u043b\u044f \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 exportImageFileSelect= \u0412\u044b\u0431\u043e\u0440 \u0444\u0430\u0439\u043b\u0430 \u0434\u043b\u044f \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 exportImageButton= \u042d\u043a\u0441\u043f\u043e\u0440\u0442 exportGifFilter= \u0424\u0430\u0439\u043b\u044b GIF (*.gif) exportPngFilter= \u0424\u0430\u0439\u043b\u044b PNG (*.png) exportJpgFilter= \u0424\u0430\u0439\u043b\u044b JPEG (*.jpeg, *.jpg) exportNewDirectoryErrorTitle= \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u0430\u0442\u0430\u043b\u043e\u0433 exportNewDirectoryErrorMessage= \u041a\u0430\u0442\u0430\u043b\u043e\u0433 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d. couldNotCreateImage= \u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u043e. couldNotCreateFile= \u0424\u0430\u0439\u043b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d. confirmOverwriteMessage= \u0424\u0430\u0439\u043b \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442. \u0425\u043e\u0442\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0433\u043e? confirmOverwriteTitle= \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044c exportImageProgress= \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f... # # gui/Print.java # labelRotateToFit= \u041f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0434\u043b\u044f \u043f\u043e\u0434\u0433\u043e\u043d\u043a\u0438: labelHeader= \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a: printEmptyCircuitsTitle= \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c printEmptyCircuitsMessage= \u041d\u0435\u0442 \u043d\u0435\u043f\u0443\u0441\u0442\u044b\u0445 \u0441\u0445\u0435\u043c, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0434\u043b\u044f \u043f\u0435\u0447\u0430\u0442\u0438. printParmsTitle= \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0435\u0447\u0430\u0442\u0438 printError= \u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043f\u0435\u0447\u0430\u0442\u0438: %s printErrorTitle= \u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043f\u0435\u0447\u0430\u0442\u0438 # # gui/SelectionActions.java # dropComponentAction= \u0421\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 dropComponentsAction= \u0421\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b moveSelectionAction= \u0414\u0432\u0438\u0433\u0430\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 deleteSelectionAction= \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 duplicateSelectionAction= \u0414\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 cutSelectionAction= \u0412\u044b\u0440\u0435\u0437\u0430\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 copySelectionAction= \u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 pasteClipboardAction= \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430 pasteCloneQuery= \u0411\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 "%s." \u0412 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0435\u0433\u043e \u043d\u0435\u0442, \u043d\u043e \u0435\u0441\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439 \u0441 \u0442\u0435\u043c \u0436\u0435 \u0438\u043c\u0435\u043d\u0435\u043c. pasteCloneTitle= \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 pasteCloneReplace= \u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c pasteCloneIgnore= \u0418\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c pasteCloneCancel= \u041e\u0442\u043c\u0435\u043d\u0430 pasteDropMessage= \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430 \u043e\u0431\u043c\u0435\u043d\u0430 \u043d\u0435 \u0431\u044b\u043b\u0438 \u0432\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 \u0438\u0445: pasteDropTitle= \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u043d\u0435 \u0432\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b # # tools/SelectionAttributeChange.java # selectionAttributeAction= \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f # # tools/ToolActions.java # changeToolAttrAction= \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 # # gui/main/StatisticsDialog.java # statsDialogTitle= Logisim: \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 %s statsCloseButton= \u0417\u0430\u043a\u0440\u044b\u0442\u044c statsSimpleCountColumn= \u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e statsUniqueCountColumn= \u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 statsRecursiveCountColumn= \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e statsComponentColumn= \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 statsLibraryColumn= \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 statsTotalWithout= \u0412\u0421\u0415\u0413\u041e (\u0431\u0435\u0437 \u043f\u043e\u0434\u0441\u0445\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0430) statsTotalWith= \u0412\u0421\u0415\u0413\u041e (\u0441 \u043f\u043e\u0434\u0441\u0445\u0435\u043c\u0430\u043c\u0438) # # gui/main/ExplorerToolbarModel.java # projectViewToolboxTip= \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u0445\u0435\u043c\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u043f\u0440\u043e\u0432\u043e\u0434\u043d\u0438\u043a\u0430 projectViewSimulationTip= \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044e \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u043f\u0440\u043e\u0432\u043e\u0434\u043d\u0438\u043a\u0430 projectEditLayoutTip= \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0442\u0451\u0436 \u043f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u043e\u0439 \u0441\u0445\u0435\u043c\u044b projectEditAppearanceTip= \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0432\u0438\u0434 \u043f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u043e\u0439 \u0441\u0445\u0435\u043c\u044b # # gui/main/ToolboxToolbarModel.java # projectAddCircuitTip= \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0445\u0435\u043c\u0443 projectMoveCircuitDownTip= \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u0443\u044e \u0441\u0445\u0435\u043c\u0443 \u0432\u043d\u0438\u0437 \u043f\u043e \u0441\u043f\u0438\u0441\u043a\u0443 projectMoveCircuitUpTip= \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u0443\u044e \u0441\u0445\u0435\u043c\u0443 \u0432\u0432\u0435\u0440\u0445 \u043f\u043e \u0441\u043f\u0438\u0441\u043a\u0443 projectRemoveCircuitTip= \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u0443\u044e \u0441\u0445\u0435\u043c\u0443 # # gui/main/SimulationToolbarModel.java # simulateEnableStepsTip= \u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u043f\u043e \u0441\u0445\u0435\u043c\u0435 simulateDisableStepsTip= \u0412\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u043f\u043e \u0441\u0445\u0435\u043c\u0435 simulateStepTip= \u0421\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0448\u0430\u0433 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u043f\u043e \u0441\u0445\u0435\u043c\u0435 simulateEnableTicksTip= \u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0442\u0430\u043a\u0442\u044b simulateDisableTicksTip= \u0412\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0442\u0430\u043a\u0442\u044b simulateTickTip= \u041e\u0434\u0438\u043d \u0442\u0430\u043a\u0442 # # gui/TickRate.java # tickRateHz= %s \u0413\u0446 tickRateKHz= %s \u043a\u0413\u0446 # # gui/ZoomControl.java # zoomShowGrid= \u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u0435\u0442\u043a\u0438 # # gui/appear/RevertAppearanceAction # revertAppearanceAction= \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u043e\u0441\u0442\u044c # # attribute table models # circuitAttrTitle= \u0421\u0445\u0435\u043c\u0430: %s toolAttrTitle= \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442: %s selectionOne= \u0412\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435: %s selectionMultiple= \u0412\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435: %s \u00d7 %s selectionVarious= \u0412\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435: \u0420\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u00d7 %slogisim-2.7.1/resources/logisim/ru/file.properties0000644000175000017500000003201011541661310022214 0ustar vincentvincent# # lib/LogisimFile.java # fileDuplicateError= \u041e\u0448\u0438\u0431\u043a\u0430 \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430: %s defaultProjectName= \u0411\u0435\u0437 \u0438\u043c\u0435\u043d\u0438 unloadUsedError= \u0421\u0445\u0435\u043c\u0430 '%s' \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. unloadToolbarError= \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0435\u0441\u044f \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432. unloadMappingError= \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0432 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u043a \u043c\u044b\u0448\u0438. xmlConversionError= \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 XML # # lib/LogisimFileActions.java # addCircuitAction= \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0445\u0435\u043c\u0443 removeCircuitAction= \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0445\u0435\u043c\u0443 moveCircuitAction= \u0423\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0442\u044c \u0441\u0445\u0435\u043c\u044b loadLibraryAction= \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 loadLibrariesAction= \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 unloadLibraryAction= \u0412\u044b\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 unloadLibrariesAction= \u0412\u044b\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 setMainCircuitAction= \u0421\u0434\u0435\u043b\u0430\u0442\u044c \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u043e\u0439 revertDefaultsAction= \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e # # gui/Loader.java # logisimFileFilter= \u041f\u0440\u043e\u0435\u043a\u0442 Logisim (*.circ) jarFileFilter= \u0410\u0440\u0445\u0438\u0432 Java (*.jar) fileDescriptorUnknownError= \u0414\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u043d\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u0434\u043b\u044f %s. fileDescriptorError= \u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 %s fileTypeError= \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 Logisim \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u0442\u0438\u043f %s (%s) fileBuiltinMissingError= \u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 %s \u043d\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0432 \u044d\u0442\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438. fileLibraryMissingError= \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u0444\u0430\u0439\u043b \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 `%s' \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0444\u0430\u0439\u043b \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0434\u0438\u0430\u043b\u043e\u0433\u0430. fileLibraryMissingTitle= \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c `%s' fileLibraryMissingButton= \u0412\u044b\u0431\u0440\u0430\u0442\u044c fileLoadCanceledError= \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043e\u0442\u043c\u0435\u043d\u0438\u043b \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443. [1] fileMessageTitle= \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 fileErrorTitle= \u041e\u0448\u0438\u0431\u043a\u0430 \u0444\u0430\u0439\u043b\u0430 fileSaveErrorTitle= \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0444\u0430\u0439\u043b fileSaveError= \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0444\u0430\u0439\u043b: %s fileSaveCloseError= \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u0444\u0430\u0439\u043b: %s fileCircularError= \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0441\u044b\u043b\u043a\u0443. (\u0424\u0430\u0439\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 %s.) fileSaveZeroError= \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043f\u043e \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0441\u0442\u0438\u0440\u0430\u0435\u0442 \u0444\u0430\u0439\u043b; \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u043f\u0440\u0438\u043d\u044f\u0442\u0430 \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f. \u0415\u0441\u043b\u0438 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u0447\u0442\u043e \u043a \u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0441\u0432\u044f\u0436\u0438\u0442\u0435\u0441\u044c \u0441 \u041a\u0430\u0440\u043b\u043e\u043c \u0411\u0435\u0440\u0447\u0435\u043c. unknownLibraryFileError= \u041d\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u0444\u0430\u0439\u043b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 %s. logisimCircularError= \u0424\u0430\u0439\u043b %s \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0441\u0435\u0431\u044f. logisimLoadError= \u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f %s: %s jarNotOpenedError= JAR \u0444\u0430\u0439\u043b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0442. jarClassNotFoundError= \u041a\u043b\u0430\u0441\u0441 % \u043d\u0435 \u0431\u044b\u043b \u043d\u0430\u0439\u0434\u0435\u043d \u0432 JAR \u0444\u0430\u0439\u043b\u0435. jarClassNotLibraryError= `%s' \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. jarLibraryNotCreatedError= \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 %s. fileAppearanceError= \u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0432\u0438\u0434\u0430 %s fileAppearanceNotFound= \u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0432\u0438\u0434\u0430 %s \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d # # lib/Options.java # gateUndefinedOption= \u0412\u044b\u0445\u043e\u0434 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043f\u0440\u0438 \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0441\u0442\u0438 simLimitOption= \u041f\u0440\u0435\u0434\u0435\u043b \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f simRandomOption= \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0441\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f gateUndefinedIgnore= \u0418\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u0432\u0445\u043e\u0434\u044b gateUndefinedError= \u041e\u0448\u0438\u0431\u043a\u0430 \u0434\u043b\u044f \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u0432\u0445\u043e\u0434\u043e\u0432 # # lib/XmlReader.java # libNameMissingError= \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u043c\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 libDescMissingError= \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 libMissingError= \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 `%s' \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430 toolNameMissingError= \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 mappingMissingError= \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u043c\u044b\u0448\u0438 mappingBadError= \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u043c\u044b\u0448\u0438 `%s' \u043d\u0435\u0432\u0435\u0440\u0435\u043d circNameMissingError= \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0445\u0435\u043c\u044b compUnknownError= \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 `%s' \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d compNameMissingError= \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u043c\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 compAbsentError= \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 `%s' \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 `%s' compLocMissingError= \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 `%s' \u043d\u0435 \u0437\u0430\u0434\u0430\u043d\u043e compLocInvalidError= \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 `%s' \u043d\u0435 \u0432\u0435\u0440\u043d\u043e (%s) wireStartMissingError= \u043d\u0430\u0447\u0430\u043b\u043e \u043f\u0440\u043e\u0432\u043e\u0434\u0430 \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e wireStartInvalidError= \u043d\u0430\u0447\u0430\u043b\u043e \u043f\u0440\u043e\u0432\u043e\u0434\u0430 \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 wireEndMissingError= \u043a\u043e\u043d\u0435\u0446 \u043f\u0440\u043e\u0432\u043e\u0434\u0430 \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d wireEndInvalidError= \u043a\u043e\u043d\u0435\u0446 \u043f\u0440\u043e\u0432\u043e\u0434\u0430 \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 attrNameMissingError= \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 attrValueInvalidError= \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 (%s) \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f %s xmlFormatError= \u043e\u0448\u0438\u0431\u043a\u0430 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f XML: %s toolNameMissing= \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043e toolNotFound= \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435logisim-2.7.1/resources/logisim/ru/draw.properties0000644000175000017500000000617511527624252022257 0ustar vincentvincent# draw.model - Attributes attrPaint= \u0422\u0438\u043f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 attrFont= \u0428\u0440\u0438\u0444\u0442 attrAlign= \u0412\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 attrStrokeWidth= \u0422\u043e\u043b\u0449\u0438\u043d\u0430 \u043b\u0438\u043d\u0438\u0438 attrStroke= \u0426\u0432\u0435\u0442 \u043b\u0438\u043d\u0438\u0438 attrFill= \u0426\u0432\u0435\u0442 \u0437\u0430\u043b\u0438\u0432\u043a\u0438 attrRx= \u0420\u0430\u0434\u0438\u0443\u0441 \u0443\u0433\u043b\u0430 paintStroke= \u0422\u043e\u043b\u044c\u043a\u043e \u0433\u0440\u0430\u043d\u0438\u0446\u0430 paintFill= \u0422\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043b\u0438\u0432\u043a\u0430 paintBoth= \u0413\u0440\u0430\u043d\u0438\u0446\u0430 \u0438 \u0437\u0430\u043b\u0438\u0432\u043a\u0430 alignStart= \u0421\u043b\u0435\u0432\u0430 alignMiddle= \u0426\u0435\u043d\u0442\u0440 alignEnd= \u0421\u043f\u0440\u0430\u0432\u0430 # draw.model - CanvasObject names shapeMultiple= \u041e\u0431\u044a\u0435\u043a\u0442\u044b shapeCurve= \u041a\u0440\u0438\u0432\u0430\u044f shapeRect= \u041f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a shapeRoundRect= \u0421\u043a\u0440\u0443\u0433\u043b\u0451\u043d\u043d\u044b\u0439 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a shapeOval= \u041e\u0432\u0430\u043b shapePolygon= \u041c\u043d\u043e\u0433\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a shapePolyline= \u041b\u043e\u043c\u0430\u043d\u0430\u044f shapeLine= \u041b\u0438\u043d\u0438\u044f shapeText= \u0422\u0435\u043a\u0441\u0442 # draw.action - Action names actionAdd= \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c %s actionRemove= \u0423\u0434\u0430\u043b\u0438\u0442\u044c %s actionTranslate= \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c %s actionMoveHandle= \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c actionInsertHandle= \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c actionDeleteHandle= \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c actionChangeAttributes= \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b actionChangeAttribute= \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c %s actionLower= \u041e\u043f\u0443\u0441\u0442\u0438\u0442\u044c actionRaise= \u041f\u043e\u0434\u043d\u044f\u0442\u044c actionReorder= \u041f\u0435\u0440\u0435\u0441\u0442\u0440\u043e\u0438\u0442\u044c actionEditText= \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442 # draw.gui - attribute table titles selectionOne= \u0412\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435: %s selectionMultiple= \u0412\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435: %s \u00d7 %s selectionVarious= \u0412\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435: \u0420\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u00d7 %slogisim-2.7.1/resources/logisim/ru/data.properties0000644000175000017500000000125311452221640022212 0ustar vincentvincent# # data/Attributes.java # booleanTrueOption= \u0414\u0430 booleanFalseOption= \u041d\u0435\u0442 # # data/Direction.java # directionEastOption= \u0412\u043e\u0441\u0442\u043e\u043a directionWestOption= \u0417\u0430\u043f\u0430\u0434 directionNorthOption= \u0421\u0435\u0432\u0435\u0440 directionSouthOption= \u042e\u0433 directionNorthVertical= \u0421\u0432\u0435\u0440\u0445\u0443 directionSouthVertical= \u0421\u043d\u0438\u0437\u0443 directionEastVertical= \u0421\u043f\u0440\u0430\u0432\u0430 directionWestVertical= \u0421\u043b\u0435\u0432\u0430 # # data/Value.java # valueErrorSymbol= E valueUnknownSymbol= x valueError= \u041e\u0448\u0438\u0431\u043a\u0430 valueUnknown= ??? logisim-2.7.1/resources/logisim/ru/circuit.properties0000644000175000017500000001236411533632422022754 0ustar vincentvincent# # Analyze.java # defaultInputLabels= a,b,c,d,e,f,g,h defaultOutputLabels= x,y,z,u,v,w,s,t # # AnalyzeException.java # analyzeCircularError= \u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0430 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0441\u044b\u043b\u043a\u0430; \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0438\u0441\u0442\u0438\u043d\u043d\u043e\u0441\u0442\u0438. analyzeConflictError= \u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u044b \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0443\u044e\u0449\u0438\u0435 \u0432\u044b\u0445\u043e\u0434\u044b; \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0438\u0441\u0442\u0438\u043d\u043d\u043e\u0441\u0442\u0438. analyzeCannotHandleError= \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0438\u0441\u0442\u0438\u043d\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f %s \u0432\u043c\u0435\u0441\u0442\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f. # # circuit/Circuit.java # circuitName= \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0445\u0435\u043c\u044b circuitLabelLocAttr= \u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u043a\u0438 circuitLabelAttr= \u041e\u0431\u0449\u0430\u044f \u043c\u0435\u0442\u043a\u0430 circuitLabelDirAttr= \u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u0449\u0435\u0439 \u043c\u0435\u0442\u043a\u0438 circuitLabelFontAttr= \u0428\u0440\u0438\u0444\u0442 \u043e\u0431\u0449\u0435\u0439 \u043c\u0435\u0442\u043a\u0438 # # circuit/CircuitMutation.java # unknownChangeAction= \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0445\u0435\u043c\u0443 # # circuit/Subcircuit.java # subcircuitViewItem= \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c %s subcircuitCircuitTip= \u041f\u043e\u0434\u0441\u0445\u0435\u043c\u0430 %s # # circuit/RadixOption.java # radixAttr= \u041e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0435 radix2= \u0414\u0432\u043e\u0438\u0447\u043d\u043e\u0435 radix10Signed= \u0417\u043d\u0430\u043a\u043e\u0432\u043e\u0435 \u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u043e\u0435 radix10Unsigned= \u0411\u0435\u0437\u0437\u043d\u0430\u043a\u043e\u0432\u043e\u0435 \u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u043e\u0435 radix8= \u0412\u043e\u0441\u044c\u043c\u0435\u0440\u0438\u0447\u043d\u043e\u0435 radix16= \u0428\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u0435 # # circuit/SplitterClass.java # # splitter component name splitterComponent= \u0420\u0430\u0437\u0432\u0435\u0442\u0432\u0438\u0442\u0435\u043b\u044c # splitter end tool tips splitterCombinedTip= \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0451\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0435\u0446 \u0440\u0430\u0437\u0432\u0435\u0442\u0432\u0438\u0442\u0435\u043b\u044f splitterSplit0Tip= \u041d\u0435\u0442 \u0431\u0438\u0442 \u0441 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0451\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0446\u0430 splitterSplit1Tip= \u0411\u0438\u0442 %s \u0441 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0451\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0446\u0430 splitterSplitManyTip= \u0411\u0438\u0442\u044b %s \u0441 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0451\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0446\u0430 # splitter attributes splitterBitWidthAttr= \u0420\u0430\u0437\u0440\u044f\u0434\u043d\u043e\u0441\u0442\u044c \u0432\u0445\u043e\u0434\u0430 splitterFanOutAttr= \u0412\u0435\u0435\u0440\u043d\u044b\u0439 \u0432\u044b\u0445\u043e\u0434 splitterBitAttr= \u0411\u0438\u0442 %s splitterBitNone= \u041d\u0435\u0442 splitterAppearanceAttr= \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0432\u0438\u0434 splitterAppearanceLegacy= \u0423\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0439 splitterAppearanceLeft= \u041b\u0435\u0432\u043e\u0440\u0443\u043a\u0438\u0439 splitterAppearanceCenter= \u041f\u043e \u0446\u0435\u043d\u0442\u0440\u0443 splitterAppearanceRight= \u041f\u0440\u0430\u0432\u043e\u0440\u0443\u043a\u0438\u0439 splitterDistributeAscending= \u0420\u0430\u0441\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u044e splitterDistributeDescending= \u0420\u0430\u0441\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u043e \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044e # # circuit/WireClass.java # wireComponent= \u041f\u0440\u043e\u0432\u043e\u0434 wireLengthAttr= \u0414\u043b\u0438\u043d\u0430 wireDirectionAttr= \u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 wireDirectionHorzOption= \u0413\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0439 wireDirectionVertOption= \u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 # circuit/appear/AppearanceOrigin circuitAnchor= \u042f\u043a\u043e\u0440\u044c appearanceFacingAttr= \u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0432\u0438\u0434\u0430 # circuit/appear/AppearancePort circuitPort= \u041f\u043e\u0440\u0442logisim-2.7.1/resources/logisim/ru/analyze.properties0000644000175000017500000002232211532762550022755 0ustar vincentvincent# # gui/Analyzer.java # analyzerWindowTitle= \u041a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 inputsTab= \u0412\u0445\u043e\u0434\u044b outputsTab= \u0412\u044b\u0445\u043e\u0434\u044b tableTab= \u0422\u0430\u0431\u043b\u0438\u0446\u0430 expressionTab= \u0412\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 minimizedTab= \u041c\u0438\u043d\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f inputsTabTip= \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0431\u043e\u0440 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445. outputsTabTip= \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0431\u043e\u0440 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445. tableTabTip= \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0438\u0441\u0442\u0438\u043d\u043d\u043e\u0441\u0442\u0438. expressionTabTip= \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0432\u044b\u0445\u043e\u0434\u043e\u0432. minimizedTabTip= \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0438\u0441\u0442\u0438\u043d\u043d\u043e\u0441\u0442\u0438. # # gui/BuildCircuitButton.java # buildCircuitButton= \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0445\u0435\u043c\u0443 buildProjectLabel= \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442: buildNameLabel= \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0445\u0435\u043c\u044b: buildTwoInputsLabel= \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0432\u0443\u0445\u0432\u0445\u043e\u0434\u043e\u0432\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b buildNandsLabel= \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0418-\u041d\u0415 buildDialogTitle= \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0445\u0435\u043c\u0443 buildDialogErrorTitle= \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0445\u0435\u043c\u0443 buildNeedProjectError= \u0412\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442. buildNeedCircuitError= \u0412\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0445\u0435\u043c\u044b. buildConfirmReplaceMessage= \u0412\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0445\u0435\u043c\u0443 %s? buildConfirmReplaceTitle= \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c \u0437\u0430\u043c\u0435\u043d\u0443 replaceCircuitAction= \u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0445\u0435\u043c\u0443 # # gui/ExpressionEditorPanel.java # exprClearButton= \u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c exprRevertButton= \u0412\u0435\u0440\u043d\u0443\u0442\u044c exprEnterButton= \u0412\u0432\u0435\u0441\u0442\u0438 # # gui/ExpressionPanel.java # expressionEmpty= (\u043f\u0443\u0441\u0442\u043e) # # gui/KarnaughMapPanel.java # karnaughNoOutputError= \u0412\u044b\u0445\u043e\u0434 \u043d\u0435 \u0432\u044b\u0431\u0440\u0430\u043d. karnaughTooManyInputsError= \u0421\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0432\u0445\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b. # # gui/MinimizedTabPanel.java # minimizedFormat= \u0424\u043e\u0440\u043c\u0430\u0442: minimizedSumOfProducts= \u0421\u0443\u043c\u043c\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0439 minimizedProductOfSums= \u041f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0441\u0443\u043c\u043c minimizedSetButton= \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043a\u0430\u043a \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 # # gui/OutputSelector.java # outputSelectLabel= \u0412\u044b\u0445\u043e\u0434: # # gui/SimpleTruthTablePanel.java # tableEmptyMessage= (\u043f\u0443\u0441\u0442\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430) tableNullHeader= (\u043d\u0435\u0442) # # gui/TableTabClip.java # clipPasteErrorTitle= \u041e\u0448\u0438\u0431\u043a\u0430 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 clipPasteSupportedError= \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0431\u0443\u0444\u0435\u0440\u0430 \u043e\u0431\u043c\u0435\u043d\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440. clipPasteEndError= \u0411\u0443\u0444\u0435\u0440 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u0442\u0430\u0431\u043b\u0438\u0446\u044b. clipPasteSizeError= \u041e\u0431\u043b\u0430\u0441\u0442\u044c \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0442\u043e\u0433\u043e \u0436\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430, \u0447\u0442\u043e \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430. # # gui/VariableListPanel.java # variableRemoveButton= \u0423\u0434\u0430\u043b\u0438\u0442\u044c variableMoveUpButton= \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u0432\u0435\u0440\u0445 variableMoveDownButton= \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u043d\u0438\u0437 variableAddButton= \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c variableRenameButton= \u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c variableStartError= \u0418\u043c\u044f \u0434\u043e\u043b\u0436\u043d\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c\u0441\u044f \u0441 \u0431\u0443\u043a\u0432\u044b. variablePartError= \u0418\u043c\u044f \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c '%s'. variableDuplicateError= \u0418\u043c\u044f \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e. variableMaximumError= (\u0414\u043e\u0441\u0442\u0438\u0433\u043d\u0443\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 %s.) # # model/Entry.java # busError= \u041a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0443\u044e\u0449\u0438\u0435 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0441\u0445\u0435\u043c\u0435. oscillateError= \u0421\u0445\u0435\u043c\u0430 \u0432\u043e\u0437\u0431\u0443\u0436\u0434\u0430\u0435\u0442\u0441\u044f. # # model/Parser.java # implicitAndOperator= (\u041d\u0435\u044f\u0432\u043d\u043e\u0435 \u0418) invalidCharacterError= \u0421\u0438\u043c\u0432\u043e\u043b\u044b \u043d\u0435 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u043d\u044b: %s missingLeftOperandError= \u0414\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 %s \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u0435\u0432\u044b\u0439 \u043e\u043f\u0435\u0440\u0430\u043d\u0434. missingRightOperandError= \u0414\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 %s \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u0430\u0432\u044b\u0439 \u043e\u043f\u0435\u0440\u0430\u043d\u0434. lparenMissingError= \u041d\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u0441\u043a\u043e\u0431\u043a\u0438. rparenMissingError= \u041d\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u0441\u043a\u043e\u0431\u043a\u0438. badVariableName= %s \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439. unexpectedApostrophe= \u041d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u044b\u0439 \u0430\u043f\u043e\u0441\u0442\u0440\u043e\u0444 ("'")logisim-2.7.1/resources/logisim/pt/0000755000175000017500000000000011536421172017164 5ustar vincentvincentlogisim-2.7.1/resources/logisim/pt/util.properties0000644000175000017500000000175111534277534022274 0ustar vincentvincent# # util/FontUtil.java # fontPlainStyle= Normal fontBoldStyle= Negrito fontItalicStyle= Itlico fontBoldItalicStyle= Negrito em itlico # # util/InputEventUtil.java # metaMod= Meta altMod= Alt ctrlMod= Ctrl shiftMod= Shift button1Mod= Boto1 button2Mod= Boto2 button3Mod= Boto3 # # util/JDialogOk.java # dlogOkButton= OK dlogCancelButton= Cancelar # # util/LocaleManager.java # # If the user selects to "replace accented characters" in the International # dialog, the program will replace accented characters based on # the slash-delimited character-string pairs in accentReplacements. # For example, with German, accentReplacements might be # "\u00f6 oe/\u00d6 Oe/\u00fc ue/\u00dc ue/\u00df ss" so that umlauted o's and u's are # replaced, as would be essets. accentReplacements= # # util/GifEncoder.java # grabberError= Retorno falso: manyColorError= Cores demasiadas. # # util/WindowMenu.java # windowMenu= Janela windowMinimizeItem= Minimizar windowZoomItem= Maximizar windowZoomItemMac= Zoom logisim-2.7.1/resources/logisim/pt/tools.properties0000644000175000017500000000261411534277462022456 0ustar vincentvincent# # tools/AddTool.java # addToolText= Acrescentar %s negativeCoordError= Componente no pode ter coordenadas negativas. cannotModifyError= Impossvel modificar circuito. circularError= Impossvel criar referncia circular. exclusiveError= Componente em conflito. addComponentAction= Acrescentar %s # # tools/MenuTool.java # menuTool= Ferramenta Menu menuToolDesc= Ver menus de componente compDeleteItem= Apagar compShowAttrItem= Mostrar atributos selDeleteItem= Apagar seleo selCutItem= Recortar seleo selCopyItem= Copiar seleo removeComponentAction= Remover %s # # tools/PokeTool.java # pokeTool= Ferramenta Testar pokeToolDesc= Alterar valores no circuito # # tools/SelectTool.java # selectTool= Ferramenta Selecionar selectToolDesc= Editar componentes do circuito moveWorkingMsg= Computar conexes... # # tools/SelectionAttributeChange.java # selectionRefaceAction= Alterar direo da seleo # # tools/key/KeyConfigurationAction # changeComponentAttributesAction= Alterar atributos do componente # # tools/TextTool.java # textTool= Ferramenta Texto textToolDesc= Editar texto no circuito # # tools/EditTool.java # editTool= Editar ferramenta editToolDesc= Editar seleo e acrescentar conexes # # tools/WiringTool.java # wiringTool= Ferramenta Conectar wiringToolDesc= Acrescentar conexes ao circuito addWireAction= Acrescentar conexo addWiresAction= Acrescentar conexes shortenWireAction= Reduzir conexo logisim-2.7.1/resources/logisim/pt/std.properties0000644000175000017500000003625611536421170022106 0ustar vincentvincent# # std/Builtin.java # builtinLibrary= Predefinido # instance/StdAttr.java stdFacingAttr= Posio stdDataWidthAttr= Bits de dados stdTriggerAttr= Gatilho stdTriggerRising= Borda de subida stdTriggerFalling= Borda de descida stdTriggerHigh= Nvel alto stdTriggerLow= Nvel baixo stdLabelAttr= Rtulo stdLabelFontAttr= Fonte do rtulo # instance/InstanceTextField.java changeLabelAction= Substituir rtulo # # std/base/Base.java # baseLibrary= Base # std/base/BitExtender.java extenderComponent= Extensor de bits extenderInAttr= Largura em bits entrada extenderOutAttr= Largura em bits sada extenderTypeAttr= Tipo da extenso extenderOneType= Um extenderZeroType= Zero extenderSignType= Sinal extenderInputType= Entrada extenderMainLabel= estendido extenderOneLabel= 1 extenderZeroLabel= 0 extenderSignLabel= sinal extenderInputLabel= entrada # std/base/Clock clockComponent= Clock clockHighAttr= Durao em nvel alto clockLowAttr= Durao em nvel baixo clockDurationValue= %s pulsos clockDurationOneValue= 1 pulso durationSmallMessage= Valor deve ser ao menos %s. durationLargeMessage= Valor deve ser %s ou menor. freqInvalidMessage= Valor no um inteiro vlido # std/base/Pin pinComponent= Pino pinInputName= Entrada pinOutputName= Sada pinThreeStateAttr= Tri-state? pinOutputAttr= Sada? pinPullAttr= Comportamento para ajuste pinPullNoneOption= Sem alteraes pinPullUpOption= Ajustar para cima pinPullDownOption= Ajustar para baixo pinLabelLocAttr= Posio do rtulo pinInputToolTip= Acrescentar um pino de entrada pinOutputToolTip= Acrescentar um pino de sada pinFrozenTitle= Pino associado ao supercircuito. pinFrozenQuestion= Pino vinculado ao estado do supercircuito. Criar um novo estado do circuito? # std/base/Probe probeComponent= Ponta de prova # std/base/PullResistor pullComponent= Resistor para ajuste pullTypeAttr= Direo para ajuste pullZeroType= Zero pullOneType= Um pullErrorType= Erro # std/base/Text.java textComponent= Rtulo textTextAttr= Texto textFontAttr= Fonte textHorzAlignAttr= Alinhamento horizontal textHorzAlignLeftOpt= Esquerda textHorzAlignRightOpt= Direita textHorzAlignCenterOpt= Centro textVertAlignAttr= Alinhamento vertical textVertAlignTopOpt= Em cima textVertAlignBaseOpt= Base textVertAlignBottomOpt= Embaixo textVertAlignCenterOpt= Centro # std/base/Tunnel.java tunnelComponent= Tnel # # std/Wiring.java # wiringLibrary = Conexo wiringGateAttr = Posio wiringGateBottomRightOption = Embaixo/Direita wiringGateTopLeftOption = Em cima/Esquerda # std/wiring/Transistor.java transistorComponent = Transistor transistorTypeAttr = Tipo transistorTypeP = Tipo-P transistorTypeN = Tipo-N # std/wiring/TransmissionGate.java transmissionGateComponent = Porta de Transmisso # std/wiring/Power.java powerComponent = Fonte # std/wiring/Ground.java groundComponent = Terra # # std/Gates.java # gatesLibrary= Portas gateSizeAttr= Tamanho da porta gateSizeNarrowOpt= Pequeno gateSizeNormalOpt= Mdio gateSizeWideOpt= Grande gateNegateAttr= Negar %s gateInputsAttr= Quantidade de entradas gateOutput01 = 0/1 gateOutput0Z = 0/flutuante gateOutputZ1 = flutuante/1 gateOutputAttr = Valor de sada xorBehaviorAttr= Comportamento para mltiplas entradas xorBehaviorOne= Quando uma entrada estiver em 1 xorBehaviorOdd= Quando existir um nmero mpar # std/Constant.java constantComponent= Constante constantValueAttr= Valor # std/NotGate.java notGateComponent= Porta NOT # std/Buffer.java bufferComponent= Buffer # std/AndGate.java andGateComponent= Porta AND # std/NandGate.java nandGateComponent= Porta NAND # std/NorGate.java norGateComponent= Porta NOR # std/OrGate.java orGateComponent= Porta OR # std/XorGate.java xorGateComponent= Porta XOR # std/XnorGate.java xnorGateComponent= Porta XNOR # std/OddParityGate.java oddParityComponent= Paridade mpar # std/EvenParityGate.java evenParityComponent= Paridade par # std/ControlledBuffer.java controlledBufferComponent= Buffer controlado controlledInverterComponent= Inversor controlado controlledControlOption= Posio da linha de controle controlledLeftHanded= esquerda controlledRightHanded= direita # # std/Memory.java # memoryLibrary= Memria memEnableLabel= en # AbstractFlipFlop.java flipFlopClockTip= Clock: atualizar estado ao gatilho flipFlopQTip= Estado atual do flip-flop flipFlopNotQTip= Complemento do estado atual do flip-flop flipFlopResetTip= Clear: quando em 1, o estado do pino ser 0 assincronamente flipFlopPresetTip= Preset: quando em 1, o estado do pino ser 1 assincronamente flipFlopEnableTip= Enable: quando em 0, os gatilhos de clock no sero efetivos # std/Counter.java counterComponent= Contador counterMaxAttr= Valor mximo counterGoalAttr= Ao quando houver transbordamento counterGoalWrap= Reiniciar contagem counterGoalStay= Permanecer no valor counterGoalContinue= Continuar contando counterGoalLoad= Carregar prximo valor counterQTip= Sada: valor atual do contador counterClockTip= Clock: valor pode ser atualizado ao gatilho counterDataTip= Dados: valor a ser carregado no contador counterLoadTip= Load: quando em 1, carregar a partir dos dados de entrada (se Count = 0) ou decrementar counterEnableTip= Count: quando em 1, incrementar contador (ou decrementar se Load = 1) counterResetTip= Clear: quando em 1, reiniciar em 0 assincronamente counterCarryTip= Carry: ser 1 quando o valor mximo for alcanado (ou mnimo se em decremento) counterEnableLabel= ct counterLabel= ctr # std/DFlipFlop.java dFlipFlopComponent= Flip-Flop tipo D # std/TFlipFlop.java tFlipFlopComponent= Flip-Flop tipo T # std/JKFlipFlop.java jkFlipFlopComponent= Flip-Flop tipo JK # std/SRFlipFlop.java srFlipFlopComponent= Flip-Flop tipo SR # std/Random.java randomSeedAttr= Semente randomComponent= Gerador de valor aleatrio randomQTip= Sada: prximo nmero na sequncia randomClockTip= Clock: valor pode ser atualizado ao gatilho randomNextTip= Enable: passos at o prximo na sequncia ao gatilho do clock randomResetTip= Clear: quando em 1, reiniciar com a semente inicial assincronamente # std/Register.java registerComponent= Registrador registerQTip= Sada: valor corrente do registrador registerDTip= Data: valor armazenado ao gatilho do clock registerClkTip= Clock: valor atualizado ao gatilho registerClrTip= Clear: quanto em 1, o valor do pino ser 0 assincronamente registerEnableTip= Enable: quando em 0, os gatilhos de clock no sero efetivos registerLabel= reg registerWidthLabel= (%sb) # std/RamFactory.java ramComponent= RAM # std/RomFactory.java romComponent= ROM romContentsAttr= Contedos romContentsValue= (clicar para editar) romChangeAction= Editar contedos da ROM # std/Ram.java ramAddrWidthAttr= Largura em bits do endereo ramDataWidthAttr= Largura em bits dos dados ramDataLabel= D ramAddrLabel= A ramWELabel= str ramCSLabel= sel ramOELabel= ld ramClrLabel= clr ramGigabyteLabel= %sGB RAM ramMegabyteLabel= %sMB RAM ramKilobyteLabel= %sKB RAM ramByteLabel= %sB RAM romGigabyteLabel= %sGB ROM romMegabyteLabel= %sMB ROM romKilobyteLabel= %sKB ROM romByteLabel= %sB ROM memDataTip= Data: valor carregado a partir do endereo memAddrTip= Address: posio acessada na memria memCSTip= Chip select: 0 desabilita componente ramClkTip= Clock: valor da memria ser atualizado na vario de 0 para 1 ramOETip= Load: se 1, carregar memria sada ramWETip= Store: se 1, armazenar entrada na memria ramClrTip= Clear: contedos dos pinos em 1 ir para 0 assincronamente ramBusTip= Data: valor carregado ou armazenado no endereo ramInTip= Entrada: valor a ser armazenado no endereo ramBusAttr= Interface de dados ramBusSynchCombined= Porta para carga/armazenamento sncrono ramBusAsynchCombined= Porta para carga/armazenamento assncrono ramBusSeparate= Portas para carga e armazenamento separados ramEditMenuItem= Editar contedos... ramClearMenuItem= Limpar contedos ramLoadMenuItem= Carregar imagem... ramSaveMenuItem= Salvar imagem... ramConfirmClearTitle= Confirmar apagamento ramConfirmClearMsg= Tem certeza que quer zerar toda a memria ramLoadDialogTitle= Carregar imagem da RAM ramLoadErrorTitle= Carregar erro ramSaveDialogTitle= Salvar imagem da RAM ramSaveErrorTitle= Erro ao salvar # std/memory/ShiftRegister.java shiftRegisterComponent= Registrador de deslocamento shiftRegisterLabel1= shift reg shiftRegisterLabel2= %sx%s shiftRegLengthAttr= Nmero de estgios shiftRegParallelAttr= Carga em paralelo shiftRegShiftTip= Shift: desabilitar se 0 shiftRegClockTip= Clock: valores podero ser atualizados ao gatilho shiftRegClearTip= Clear: quando em 1, reiniciar todos os valores em 0 assincronamente shiftRegInTip= Entrada: valor a ser deslocado no primeiro estgio shiftRegOutTip= Sada: contedo do ltimo estgio shiftRegLoadTip= Load: quando em 1 (com shift = 0), todos os estgios sero carregados a partir das entradas # # std/Plexers.java # plexerLibrary= Plexers plexerSelectBitsAttr= Bits para seleo plexerThreeStateAttr= Tri-state? plexerDisabledAttr= Desabilitar sada plexerDisabledFloating= Flutuante plexerDisabledZero= Zero plexerEnableAttr = Incluir Enable? # std/Multiplexer.java multiplexerComponent= Multiplexador multiplexerSelectTip= Select: identificar qual entrada se tornar sada multiplexerEnableTip= Enable: quando diferente de 0, a sada ser a entrada selecionada multiplexerInTip= Entrada %s multiplexerOutTip= Sada # std/Demultiplexer.java demultiplexerComponent= Demultiplexador demultiplexerSelectTip= Select: identificar qual sada receber a entrada demultiplexerEnableTip= Enable: quando diferente de 0, a sada selecionada ser entrada demultiplexerInTip= Entrada demultiplexerOutTip= Sada %s # std/Decoder.java decoderComponent= Decodificador decoderSelectTip= Select: identificar qual sada ser igual a 1 decoderEnableTip= Enable: quando diferente de 0, a sada selecionada ser 1 decoderOutTip= Sada %s # std/plexers/PriorityEncoder.java priorityEncoderComponent= Codificador de prioridade priorityEncoderInTip= Entrada %s priorityEncoderOutTip= Sada: endereo do valor 1 mais significativo na entrada priorityEncoderEnableInTip= Enable Input: 0 ir desabilitar o componente priorityEncoderEnableOutTip= Enable Output: 1 se habilitado e nenhuma entrada estiver em 1 priorityEncoderGroupSignalTip= Group Select: 1 se habilitado e alguma entrada estiver em 1 # std/BitSelector.java bitSelectorComponent= Selector de bit bitSelectorGroupAttr= Bits de sada bitSelectorOutputTip= Sada: valor do grupo de bits selecionados a partir dos dados bitSelectorDataTip= Dados bitSelectorSelectTip= Select: identificar qual grupo de dados da entrada ser selecionado # # arith/Arithmetic.java # arithmeticLibrary= Aritmtica # arith/Adder.java adderComponent= Somador adderInputTip= Entrada: um dos nmeros a ser adicionado adderOutputTip= Sada: a soma das entradas (mais "carry in") adderCarryInTip= Carry In: se 1, um valor adicional em 1 ser adicionado sada adderCarryOutTip= Carry Out: 1 se a soma transbordar para os bits disponveis # arith/Subtractor.java subtractorComponent= Subtrator subtractorMinuendTip= Minuendo: nmero do qual outro ser subtrado subtractorSubtrahendTip= Subtraendo: nmero a subtrair do minuendo subtractorOutputTip= Sada: a diferena entre o minuendo e o subtraendo subtractorBorrowInTip= Borrow In: se 1, 1 ser deduzido da sada subtractorBorrowOutTip= Borrow Out: 1 se a diferena levar a um valor negativo # arith/Multiplier.java multiplierComponent= Multiplicador multiplierInputTip= Entrada: um dos nmeros a ser multiplicado multiplierOutputTip= Sada: o produto das entradas, mais o "carry in" multiplierCarryInTip= Carry In: valor a ser adicionado sada multiplierCarryOutTip= Carry Out: bits mais significativos do produto # arith/Divider.java dividerComponent= Divisor dividerUpperInput= upper dividerRemainderOutput= rem dividerDividendLowerTip= Parte baixa do dividendo: metade baixa do nmero a ser dividido dividerDividendUpperTip= Parte alta do dividendo: metade alta do nmero a ser dividido dividerDivisorTip= Divisor: nmero pelo qual ser dividido dividerOutputTip= Sada: o resultado da diviso do dividendo pelo divisor dividerRemainderTip= Resto: o resto da diviso (dividendo - output * divisor) # arith/Negator.java negatorComponent= Negador negatorInputTip= Entrada: nmero a ser negado negatorOutputTip= Sada: complemento de dois da entrada # arith/Comparator.java comparatorComponent= Comparador comparatorType= Tipo numrico unsignedOption= Sem sinal twosComplementOption= Complemento de 2 comparatorInputATip= A: nmero precedendo a operao de comparao comparatorInputBTip= B: nmero seguindo a operao de comparao comparatorLessTip= Less: 1 se A for menor que B comparatorEqualTip= Equal: 1 se A igual a B comparatorGreaterTip= Greater: 1 se A for maior que B # arith/Shifter.java shifterComponent= Deslocador shifterShiftAttr= Tipo do deslocamento shiftLogicalLeft= Lgico para a esquerda shiftLogicalRight= Lgico para a direita shiftArithmeticRight= Aritmtico para a direita shiftRollLeft= Com rotao esquerda shiftRollRight= Com rotao direita shifterDistanceTip= Distance: at onde deslocar a entrada shifterInputTip= Entrada: bits a serem deslocados shifterOutputTip= Sada: resultado do deslocamento da entrada # arith/BitAdder.java bitAdderComponent= Contador de bits bitAdderInputTip= Entrada: bits a serem contados bitAdderOutputManyTip= Sada: nmero de bits de entrada iguais a 1 # arith/BitFinder.java bitFinderComponent= Indexador de bits bitFinderFindLabel= find bitFinderHighLabel= alto bitFinderLowLabel= baixo bitFinderHighOption= Mais alta ordem %s bitFinderLowOption= Mais baixa ordem %s bitFinderTypeAttr= Tipo bitFinderIndexHighTip= Index: ndice da mais alta ordem da entrada %s bitFinderIndexLowTip= Index: ndice da mais baixa ordem da entrada %s bitFinderPresentTip= Present: 1 se a entrada contiver um %s bitFinderInputTip= Entrada: bits a serem procurados # # io # # io/Io.java ioLibrary= Entrada/Sada ioLabelCenter= Centro ioBitWidthAttr= Largura em bits ioColorAttr= Cor ioLabelLocAttr= Posio do rtulo ioLabelColorAttr= Cor do rtulo ioActiveAttr= Ativar em alto? # io/Button.java buttonComponent= Boto # io/Joystick.java joystickComponent= Joystick # io/Keyboard.java keyboardComponent= Teclado keybDesc= teclado (buffer cap. %s) keybBufferLengthAttr= Tamanho do buffer keybClearTip= Clear: 1 ir limpar o buffer keybClockTip= Clock: ao gatilho ir consumir o primeiro caractere no buffer keybEnableTip= Read enable: 0 ir desabilitar o clock keybAvailTip= Available: 1 quando o buffer contiver caracteres keybOutputTip= Data: valor ASCII do primeiro caractere no buffer # io/Led.java ledComponent= LED # io/SevenSegment.java sevenSegmentComponent= Display de 7-segmentos # io/HexDigit.java hexDigitComponent= Display hexadecimal # io/DotMatrix.java dotMatrixComponent= Matriz de LED ioMatrixInput= Formato da entrada ioMatrixRows= Linhas da matriz ioMatrixCols= Colunas da matriz ioOnColor= Cor se ligado ioOffColor= Cor se desligado ioBackgroundColor= Fundo ioMatrixPersistenceAttr= Persistncia ioMatrixShape= Forma dos pontos ioInputColumn= Colunas ioInputRow= Linhas ioInputSelect= Selecionar linhas/colunas ioShapeCircle= Circular ioShapeSquare= Quadrado # io/Tty.java ttyComponent= TTY ttyDesc= TTY (%s linhas, %s colunas) ttyDescShort= TTY ttyRowsAttr= Linhas ttyColsAttr= Colunas ttyClearTip= Clear: 1 ir limpar a tela ttyClockTip= Clock: ao gatilho ir acrescentar caractere entrada ttyEnableTip= Write enable: 0 ir desabilitar o clock ttyInputTip= Data: valor ASCII do prximo caractere a ser escrito logisim-2.7.1/resources/logisim/pt/start.properties0000644000175000017500000000646411534277456022465 0ustar vincentvincent# # Startup.java # argTwoSubstitutionError= A opo "-sub" deve ser seguida por dois parmetros. argDuplicateSubstitutionError= Impossvel substituir o mesmo arquivo vrias vezes. ttyNeedsFileError= Ao usar "-tty" requerido fornecer um nome de arquivo pela linha de comando. argTtyOption= -tty formato executar sem interface grfica argSubOption= -sub arquivo1 arquivo2 carregar arquivo substituindo a biblioteca do arquivo1 pela do arquivo2 argLoadOption= -load arquivo carregar arquivo de imagem na RAM (usar apenas com -tty) loadNeedsFileError= Ao usar "-load" requerido fornecer um nome de arquivo pela linha de comando. loadNeedsTtyError= A opo "-load" deve ser usada em conjuno com "-tty". loadMultipleError= A opo "-load" s pode ser especificada uma vez. ttyFormatError= -tty requer ao menos um dos seguintes: halt, speed, stats, table, tty argOneTemplateError= Somente permitido um gabarito. argUsage= uso: java %s [options] [filenames] argOptionHeader= opes: argEmptyOption= -empty usar gabarito vazio argPlainOption= -plain usar gabarito padro do Logisim argTemplateOption= -template arquivo usar arquivo com gabarito argGatesOption= -gates shaped|rectangular usar estilo de porta especificado argLocaleOption= -locale str usar definio regional dada por str argAccentsOption= -accents yes|no usar caracteres acentuados ou equivalentes ASCII argNoSplashOption= -nosplash ocultar crditos de abertura ao iniciar argVersionOption= -version exibir nmero da verso e sair argHelpOption= -help exibir este resumo e sair argClearOption= -clearprops limpar preferncias para a aplicao ao iniciar argGatesOptionError= Argumento para a opo -gates deve ser "shaped" ou "rectangular". argAccentsOptionError= Argumento para a opo -accents deve ser "yes" ou "no". templateMissingError= Arquivo com gabarito %s no existe. templateCannotReadError= No h permisso para se ler o arquivo com gabarito %s. invalidLocaleError= Definies regionais sem suporte. invalidLocaleOptionsHeader= Definies regionais com suporte: startupCloseButton= Fechar startupQuitButton= Sair # # SplashScreen.java # progressLibraries= Carregar componentes... progressTemplateCreate= Criar gabarito... progressTemplateOpen= Abrir gabarito... progressTemplateLoad= Carregar gabarito... progressTemplateClose= Fechar gabarito... progressGuiInitialize= Iniciar interface... progressFileCreate= Criar arquivo... progressFileLoad= Carregar arquivo... progressProjectCreate= Criar projeto... progressFrameCreate= Criar janela... creditsRoleLead= Desenvolvedor principal creditsRoleGerman= Traduo para o alemo creditsRoleGreek = Traduo para o grego creditsRolePortuguese= Traduo para o portugus creditsRoleRussian= Traduo para o russo creditsRoleTesting= Testar creditsRoleOriginal= Verso original # # TtyInterface.java # ttyLoadError= Erro ao carregar o arquivo: %s ttySpeedMsg= %s Hz (%s pulsos em %s milisegundos) loadNoRamError= Nenhuma RAM foi encontrada para a opo "-load". loadIoError= Erro ao ler o arquivo imagem ttyNoTtyError= Nenhum componente TTY ou Keyboard encontrado. ttyHaltReasonPin= suspenso devido ao pino halt ttyHaltReasonOscillation= suspenso devido deteco de oscilao statsTotalWithout= TOTAL (sem subcircuitos do projeto) statsTotalWith= TOTAL (com subcircuitos) logisim-2.7.1/resources/logisim/pt/proj.properties0000644000175000017500000000162211534277446022270 0ustar vincentvincent# # ProjectActions.java # newCircuitName= principal openAlreadyTitle= Arquivo j aberto openAlreadyMessage= O arquivo %s, j aberto, possui alteraes no salvas. openAlreadyCancelOption= Cancelar abertura openAlreadyLoseChangesOption= Dispensar alteraes openAlreadyNewWindowOption= Nova janela confirmOverwriteMessage= Arquivo j existente. Quer sobrescrever? confirmOverwriteTitle= Confirmar sobrescrita fileOpenError= Impossvel abrir arquivo: %s fileOpenErrorTitle= Erro durante abertura templateOpenError= Impossvel abrir gabarito: %s templateOpenErrorTitle= Erro ao carregar gabarito replaceExtensionMessage= Gostaria de trocar a extenso "%s" pela extenso preferencial ".circ" do Logisim? replaceExtensionTitle= Substituir extenso confirmQuitTitle= Confirmar encerramento replaceExtensionReplaceOpt= Substituir "%s" replaceExtensionAddOpt= Acrescentar "%s" replaceExtensionKeepOpt= Dispensar alteraeslogisim-2.7.1/resources/logisim/pt/prefs.properties0000644000175000017500000000406611534277476022445 0ustar vincentvincent# # PreferencesFrame.java # preferencesFrameTitle= Logisim: Preferncias preferencesFrameMenuItem= Preferncias closeButton= Fechar janela # TemplateOptions.java templateTitle= Gabarito templateHelp= Selecionar o gabarito atual templatePlainOption= Gabarito geral templateEmptyOption= Gabarito vazio templateCustomOption= Gabarito personalizado: templateSelectButton= Selecionar... templateErrorMessage= Impossvel carregar gabarito: %s templateErrorTitle= Erro ao carregar gabarito selectDialogTitle= Selecionar gabarito selectDialogButton= Selecionar # IntlOptions.java intlTitle= Internacional intlHelp= Editar preferncias regionais intlLocale= Lngua: intlReplaceAccents= Trocar caracteres acentuados intlGateShape= Forma da porta: shapeShaped= Convencional shapeRectangular= Retangular shapeDIN40700= DIN 40700 # WindowOptions.java windowTitle= Janela windowHelp= Configurar a janela principal de edico windowTickRate= Mostrar taxa de pulsos windowProjectToolbar= Mostrar barra de ferramentas do projeto windowToolbarLocation= Posio da barra de ferramentas: windowToolbarHidden= Oculta windowToolbarDownMiddle= Centralizada abaixo # LayoutOptions.java layoutTitle= Layout layoutHelp= Configurar comportamento do editor de layout layoutAddShowGhosts= Apresentar esboos enquanto acrescentar layoutPrinterView= Prvia da impresso layoutMoveKeepConnect= Manter conexes enquanto mover layoutAttributeHalo= Mostrar halo layoutShowTips= Mostrar dicas sobre componente layoutAddAfter= Aps acrescentar componente: layoutAddAfterUnchanged= Manter a ferramenta do componente layoutAddAfterEdit= Passar ferramenta para edio layoutRadix1= Primeira base de numerao quando conexo for testada: layoutRadix2= Segunda base de numerao quando conexo for testada: # ExperimentalOptions.java experimentTitle= Experimental experimentHelp= Habilitar caractersticas que ainda no foram extensivamente testadas accelLabel= Acelerao grfica: accelDefault= Usar padres accelNone= Nenhum accelOpenGL= OpenGL accelD3D= Direct 3D accelRestartLabel= Reiniciar Logisim para as alteraes terem efeitos. logisim-2.7.1/resources/logisim/pt/opts.properties0000644000175000017500000000256511534277536022312 0ustar vincentvincent# # OptionsFrame.java # optionsFrameTitle= Logisim: opes %s optionsFrameMenuItem= %s: Opes revertButton= Restaurar aos padres closeButton= Fechar janela # # OptionsActions.java # setOptionAction= Definir %s addMouseMappingAction= Acrescentar mapeamento do mouse removeMouseMappingAction= Remover mapeamento do mouse # # SimulateOptions.java # simulateTitle= Simulao simulateHelp= Configurar o mecanismo para simular o comportamento do circuito. simulateLimit= Iteraes at oscilao gateUndefined= Sada de porta quando indefinida simulateRandomness= Acrescentar rudo aos atrasos de componente # # MouseOptions.java # mouseTitle= Mouse mouseHelp= Editar ferramentas associadas aos botes do mouse. mouseMapNone= Nenhuma ferramenta selecionada mouseMapText= Clicar usando combinao mouseMapText2= Mapear %s mouseRemoveButton= Remover # # ToolbarOptions.java # toolbarTitle= Barra de ferramentas toolbarHelp= Editar itens na barra de ferramentas. toolbarAddTool= Acrescentar ferramentas toolbarAddSeparator= Acrescentar separador toolbarMoveUp= Para cima toolbarMoveDown= Para baixo toolbarRemove= Remover # # ToolbarActions.java # toolbarAddAction= Acrescentar boto barra de ferramentas toolbarRemoveAction= Remover boto da barra de ferramentas toolbarMoveAction= Mover boto na barra de ferramentas toolbarInsertSepAction= Inserir separador toolbarRemoveSepAction= Remover separador logisim-2.7.1/resources/logisim/pt/menu.properties0000644000175000017500000000771711536421172022262 0ustar vincentvincent# MenuEdit.java editMenu= Editar editCantUndoItem= Impossvel desfazer editUndoItem= Desfazer %s editCutItem= Recortar editCopyItem= Copiar editPasteItem= Colar editDuplicateItem= Duplicar editClearItem= Apagar editSelectAllItem= Selecionar tudo editLowerItem= Selecionar item abaixo editRaiseItem= Selecionar item acima editRaiseTopItem= Para cima editLowerBottomItem= Para baixo editAddControlItem= Acrescentar vrtice editRemoveControlItem= Remover vrtice # MenuFile.java fileMenu= Arquivo fileNewItem= Novo fileOpenItem= Abrir... fileOpenRecentItem= Abrir recente fileOpenRecentNoChoices= (Nenhum) fileCloseItem= Fechar fileSaveItem= Salvar fileSaveAsItem= Salvar como... fileExportImageItem= Exportar imagem... filePrintItem= Imprimir... filePreferencesItem= Preferncias... fileQuitItem= Sair # MenuProject.java projectMenu= Projeto projectAddCircuitItem= Acrescentar circuito... projectLoadLibraryItem= Carregar biblioteca projectLoadBuiltinItem= Biblioteca predefinida... projectLoadLogisimItem= Biblioteca do Logisim... projectLoadJarItem= Biblioteca JAR... projectUnloadLibraryItem= Carregar biblioteca projectUnloadLibrariesItem= Descarregar bibliotecas... projectMoveCircuitDownItem= Mover circuito para baixo projectMoveCircuitUpItem= Mover circuito para cima projectSetAsMainItem= Tomar como circuito principal projectRemoveCircuitItem= Remover circuito projectEditCircuitLayoutItem= Editar layout do circuito projectEditCircuitAppearanceItem= Editar forma do circuito projectRevertAppearanceItem= Restaurar forma padro projectAnalyzeCircuitItem = Analisar circuito projectViewToolboxItem = Ver ferramentas projectViewSimulationItem = Ver simulaes projectGetCircuitStatisticsItem= Obter estatsticas do circuito projectOptionsItem= Opes... # MenuSimulate.java simulateMenu= Simular simulateRunItem= Habilitar simulao simulateResetItem= Desabilitar simulao simulateStepItem= Simulao passo-a-passo simulateTickOnceItem= Pulso unitrio simulateTickItem= Pulso habilitado simulateTickFreqMenu= Frequncia de pulso simulateTickFreqItem= %s Hz simulateTickKFreqItem= %s KHz simulateUpStateMenu= Ir ao estado simulateDownStateMenu= Continuar do estado simulateLogItem= Registrar... # MenuHelp.java helpMenu= Ajuda helpTutorialItem= Tutorial helpGuideItem= Guia do Usurio helpLibraryItem= Biblioteca de Referncia helpAboutItem= Sobre... helpNotFoundError= Ajuda indisponvel. helpUnavailableError= Impossvel obter ajuda. helpDisplayError= Impossvel exibir ajuda. helpWindowTitle= Documentao do Logisim helpsetUrl= doc/doc_pt.hs # Popups.java projMenu= Projeto libMenu= Biblioteca circuitMenu= Circuito projectReloadLibraryItem= Recarregar biblioteca # ProjectCircuitActions.java circuitNameDialogTitle= Fornecer nome do circuito circuitNamePrompt= Nome do circuito: circuitNameMissingError= Todo circuito requer um nome. circuitNameDuplicateError= Circuito no podem ter nomes idnticos. circuitRemoveErrorTitle= Impossvel remover circuito circuitRemoveLastError= Biblioteca deve conter pelo menos um circuito. circuitRemoveUsedError= Impossvel remover circuito usado por outro(s). analyzeErrorTitle= Impossvel analisar analyzeMultibitInputError= Impossvel lidar com entradas multibits. analyzeMultibitOutputError= Impossvel lidar com sadas multibits. analyzeTooManyInputsError= Impossvel lidar com mais de %s entradas. analyzeTooManyOutputsError= Impossvel lidar com mais de %s sa?s. analyzeNoExpressionTitle= Expresso indeterminada # ProjectLibraryActions.java loadBuiltinErrorTitle= Impossvel carregar biblioteca predefinida loadBuiltinNoneError= Todas as bibliotecas predefinidas j esto carregadas. loadBuiltinDialogTitle= Carregar biblioteca predefinida loadLogisimDialogTitle= Carregar arquivo Logisim loadJarDialogTitle= Carregar arquivo JAR jarClassNamePrompt= Nome da classe: jarClassNameTitle= Entrar com a classe JAR unloadLibrariesDialogTitle= Selecionar bibliotecas para descarregar unloadErrorTitle= Impossvel remover biblioteca unloadNoneError= Todas as bibliotecas abertas esto em uso. logisim-2.7.1/resources/logisim/pt/log.properties0000644000175000017500000000216711534277530022076 0ustar vincentvincent# # OptionsFrame.java # logFrameTitle= Logisim: Registro %s de %s logFrameMenuItem= %s: Registro closeButton= Fechar janela # # SelectionPanel.java # selectionTab= Seleo selectionHelp= Selecionar quais valores de componentes devero ser registrados. selectionAdd= Acrescentar >> selectionChangeBase= Mudar base do sistema de numerao selectionMoveUp= Para cima selectionMoveDown= Para baixo selectionRemove= << Remover # # TablePanel.java # tableTab= Tabela tableHelp= Ver registro de valores recentes. tableEmptyMessage= Seleo vazia. # # FilePanel.java # fileTab= Arquivo fileHelp= Configurar sada em arquivo. fileEnabled= Sada em arquivo habilitada. fileDisabled= Sada em arquivo desabilitada. fileEnableButton= Habilitar fileDisableButton= Desabilitar fileLabel= Arquivo: fileSelectButton= Selecionar... fileHeaderCheck= Incluir linha de cabealho fileCannotWriteTitle= Arquivo indisponvel fileCannotWriteMessage= No h permisso para se escrever em "%s." fileExistsTitle= Arquivo j existente fileExistsMessage= Arquivo "%s" j existente. fileOverwriteOption= Sobrescrever fileAppendOption= Acrescentar fileCancelOption= Cancelarlogisim-2.7.1/resources/logisim/pt/legacy.properties0000644000175000017500000000103511534277464022560 0ustar vincentvincent# GroupedReader.java notStartError= No incio de grupo notEndError= No fim de grupo # Legacy.java legacyLibrary= Legado # DFlipFlop.java dFlipFlopComponent= Flip-Flop tipo D do Logisim 1.0 # JKFlipFlop.java jkFlipFlopComponent= Flip-Flop tipo JK do Logisim 1.0 # RegisterFlipFlop.java registerComponent= Registrador de 8-Bits do Logisim 1.0 # Version1Support.java version1SubcircuitMessage= Subcircuitos sero deslocados durante a converso do Logisim 1.0. version1RamMessage= Arquivo do Logisim 1.0 possui componente RAM sem suporte. logisim-2.7.1/resources/logisim/pt/hex.properties0000644000175000017500000000156211534277444022103 0ustar vincentvincent# # HexFrame.java # hexFrameTitle= Logisim: Editor hexadecimal hexFrameMenuItem= Editor hexadecimal hexPasteErrorTitle= Erro ao colar hexPasteSupportedError= O contedo da rea de transferncia no pode ser colado no editor. hexPasteEndError= A rea de transferncia ultrapassa o fim do arquivo. hexPasteSizeError= A rea onde colar dever ser do mesmo tamanho que a rea de transferncia. hexOpenErrorTitle= Erro ao abrir hexSaveErrorTitle= Erro ao salvar openButton= Abrir... saveButton= Salvar... closeButton= Fechar janela # # HexFile.java # hexFileOpenError= Impossvel fechar arquivo. hexFileReadError= Erro ao ler arquivo. hexFileWriteError= Erro ao gravar arquivo. hexHeaderFormatError= Arquivo de imagem com formato de cabealho invlido. hexNumberFormatError= Arquivo de imagem tem alguns contedos invlidos. hexFileSizeError= Arquivo de imagem tem informao demasiada. logisim-2.7.1/resources/logisim/pt/gui.properties0000644000175000017500000001037411534277470022103 0ustar vincentvincent# # gui/AttributeTable.java # attributeDialogTitle= Selecionar valor changeAttributeAction= Alterar atributo changeCircuitAttrAction= Alterar circuito attributeChangeInvalidError= Atributo no alterado por causa de requisio invlida attributeChangeInvalidTitle= Valor invlido cannotModifyCircuitError= Impossvel modificar este circuito. # # gui/Canvas.java # canvasWidthError= Larguras incompatveis canvasOscillationError= Oscilao aparente canvasExceptionError= Simulao suspensa por erro interno # # gui/Frame.java # titleCircFileKnown= Logisim: %s de %s titleFileKnown= Logisim: %s confirmDiscardMessage= O que dever ser feito com as alteraes no salvas de %s? confirmCloseTitle= Confirmar fechamento saveOption= Salvar discardOption= Descartar cancelOption= Cancelar # # gui/ExportImage.java # labelCircuits= Circuitos: labelImageFormat= Formato da imagem: labelScale= Fator de escala: labelPrinterView= Prvia da impresso: exportEmptyCircuitsTitle= Impossvel exportar exportEmptyCircuitsMessage= Circuitos no vazios disponveis para se exportar. exportImageSelect= Exportar imagem exportImageDirectorySelect= Selecionar diretrio para onde exportar exportImageFileSelect= Selecionar arquivo para exportar exportImageButton= Exportar exportGifFilter= Arquivos GIF (*.gif) exportPngFilter= Arquivos (*.png) exportJpgFilter= Arquivos JPEG (*.jpeg, *.jpg) exportNewDirectoryErrorTitle= Impossvel criar diretrio exportNewDirectoryErrorMessage= Diretrio no criado. couldNotCreateImage= Impossvel criar imagem. couldNotCreateFile= Impossvel criar arquivo. confirmOverwriteMessage= Arquivo j existente. Quer sobrescrever? confirmOverwriteTitle= Confirmar sobrescrita exportImageProgress= Criar imagem... # # gui/Print.java # labelRotateToFit= Rotacionar para ajuste: labelHeader= Cabealho: printEmptyCircuitsTitle= Impossvel imprimir printEmptyCircuitsMessage= Circuitos no vazios disponveis para se imprimir. printParmsTitle= Imprimir parmetros printError= Erro durante a impresso de: %s printErrorTitle= Erro durante a impresso # # gui/SelectionActions.java # dropComponentAction= Fixar componente dropComponentsAction= Fixar componentes moveSelectionAction= Mover seleo deleteSelectionAction= Apagar seleo duplicateSelectionAction= Duplicar seleo cutSelectionAction= Recortar seleo copySelectionAction= Copiar seleo pasteClipboardAction= Colar rea de transferncia # # tools/SelectionAttributeChange.java # selectionAttributeAction = Mudar atributo de seleo # # tools/ToolActions.java # changeToolAttrAction = Mudar atributo de ferramenta # # gui/main/StatisticsDialog.java # statsDialogTitle= Logisim: estatsticas %s statsCloseButton= Fechar statsSimpleCountColumn= Simples statsUniqueCountColumn= Exclusiva statsRecursiveCountColumn= Recursiva statsComponentColumn= Componente statsLibraryColumn= Biblioteca statsTotalWithout= TOTAL (sem subcircuitos do projeto) statsTotalWith= TOTAL (com subcircuitos) # # gui/main/ExplorerToolbarModel.java # projectViewToolboxTip = Mostrar circuitos e bibliotecas do projeto no painel do explorador projectViewSimulationTip = Mostrar a hierarquia da simulao no painel do explorador projectEditLayoutTip = Editar layout do circuito visto projectEditAppearanceTip = Editar forma do subcircuito visto # # gui/main/ToolboxToolbarModel.java # projectAddCircuitTip= Acrescentar circuito projectMoveCircuitDownTip= Mover circuito para baixo projectMoveCircuitUpTip= Mover circuito para cima projectRemoveCircuitTip= Remover circuito # # gui/main/SimulationToolbarModel.java # simulateEnableStepsTip = Habilitar a propagao de sinais atravs dos circuitos simulateDisableStepsTip = Desabilitar a propagao de sinais atravs dos circuitos simulateStepTip = Propagao de pulso nitrio do sinal atravs do circuito simulateEnableTicksTip = Habilitar pulsos de clock simulateDisableTicksTip = Desabilitar pulsos de clock simulateTickTip = Pulso unitrio de clock # # gui/TickRate.java # tickRateHz= %s Hz tickRateKHz= %s KHz # # gui/ZoomControl.java # zoomShowGrid= Alternar se grade em uso # # gui/appear/RevertAppearanceAction # revertAppearanceAction= Restaurar forma # # attribute table models # circuitAttrTitle = Circuito: %s toolAttrTitle = Ferramenta: %s selectionOne = Seleo: %s selectionMultiple = Seleo: %s x %s selectionVarious = Seleo: itens variados x %slogisim-2.7.1/resources/logisim/pt/file.properties0000644000175000017500000000730111534277552022233 0ustar vincentvincent# # lib/LogisimFile.java # fileDuplicateError= Erro ao duplicar arquivo: %s defaultProjectName= Sem ttulo unloadUsedError= Circuito '%s' usa componentes da biblioteca. unloadToolbarError= Biblioteca inclui itens na atual barra de ferramentas. unloadMappingError= Biblioteca inclui itens atualmente mapeados ao mouse. xmlConversionError= Erro interno ao criar XML # # lib/LogisimFileActions.java # addCircuitAction= Acrescentar circuito removeCircuitAction= Remover circuito moveCircuitAction= Reordenar circuitos loadLibraryAction= Carregar biblioteca loadLibrariesAction= Carregar bibliotecas unloadLibraryAction= Carregar biblioteca unloadLibrariesAction= Descarregar bibliotecas setMainCircuitAction= Tomar como circuito principal revertDefaultsAction= Restaurar aos padres # # gui/Loader.java # logisimFileFilter= Projeto do Logisim (*.circ) jarFileFilter= Arquivo compactado Java (*.jar) fileDescriptorUnknownError= Descritor desconhecido para %s. fileDescriptorError= Descritor desconhecido para biblioteca %s fileTypeError= A biblioteca possui um tipo desconhecido %s (%s) fileBuiltinMissingError= A biblioteca predefinida %s no est disponvel nesta verso. fileLibraryMissingError= Falta o arquivo requerido da biblioteca '%s'. Favor selecionar o arquivo do dilogo a seguir. fileLibraryMissingTitle= Localizar '%s' fileLibraryMissingButton= Selecionar fileLoadCanceledError= Carga cancelada pelo usurio. [1] fileMessageTitle= Arquivo de mensagens fileErrorTitle= Arquivo de erros fileSaveErrorTitle= Impossvel salvar arquivo fileSaveError= Impossvel salvar arquivo: %s fileSaveCloseError= Impossvel fechar arquivo: %s fileCircularError= Impossvel criar referncia circular. (O arquivo est em uso pela biblioteca %s.) fileSaveZeroError= Misteriosamente, ao salver o arquivo apagado; restaurao ser tentada. Veja se pode identificar a causa disso, e entre em contato com Carl Burch, por favor. unknownLibraryFileError= Nenhum arquivo conhecido corresponde a %s. logisimCircularError= O arquivo %s contm uma referncia circular. logisimLoadError= Erro encontrado ao abrir %s: %s jarNotOpenedError= Impossvel abrir o arquivo JAR. jarClassNotFoundError= Impossvel encontrar a classe %s no arquivo JAR. jarClassNotLibraryError= '%s' no nome vlido para biblioteca. jarLibraryNotCreatedError= Impossvel instanciar a biblioteca %s. fileAppearanceError= Erro ao carregar elemento da forma: %s fileAppearanceNotFound= Elemento da forma no encontrado (%s) # # lib/Options.java # gateUndefinedOption= Sada de porta quando indefinida simLimitOption= Limite da simulao simRandomOption= Aleatoriedade da simulao gateUndefinedIgnore= Ignorar entradas indefinidas gateUndefinedError= Erro para entradas indefinidas # # lib/XmlReader.java # libNameMissingError= falta nome da biblioteca libDescMissingError= falta descritor da biblioteca libMissingError= biblioteca '%s' no encontrada toolNameMissingError= falta nome da ferramenta mappingMissingError= falta modificador de mapeamento do mouse mappingBadError= modificador de mapeamento do mouse ('%s') invlido circNameMissingError= falta nome do circuito compUnknownError= componente '%s' no encontrado compNameMissingError= falta nome do componente compAbsentError= falta componente '%s' da biblioteca '%s' compLocMissingError= no especificada a posio do componente '%s' compLocInvalidError= posio do componente '%s' invlida (%s) wireStartMissingError= indefinido o incio da conexo wireStartInvalidError= incio da conexo mal formatado wireEndMissingError= indefinido o final da conexo wireEndInvalidError= final da conexo mal formatado attrNameMissingError= falta nome do atributo attrValueInvalidError= valor do atributo (%s) invlido para %s xmlFormatError= Erro de formatao XML: %s logisim-2.7.1/resources/logisim/pt/draw.properties0000644000175000017500000000221411534277454022250 0ustar vincentvincent# draw.model - Attributes attrPaint= Tipo para pintar attrFont= Fonte attrAlign= Alinhamento attrStrokeWidth= Largura attrStroke= Cor attrFill= Cor para preencher attrRx= Raio de concordncia paintStroke= Somente a borda paintFill= Apenas preencher paintBoth= Borda e preenchimento alignStart= Esquerda alignMiddle= Centro alignEnd= Direita # draw.model - CanvasObject names shapeMultiple= Objetos shapeCurve= Curva shapeRect= Retngulo shapeRoundRect= Retngulo com bordas arredondadas shapeOval= Oval shapePolygon= Polgono shapePolyline= Poligonal shapeLine= Linha shapeText= Texto # draw.action - Action names actionAdd= Acrescentar %s actionRemove= Remover %s actionTranslate= Mover %s actionMoveHandle= Mover referncia actionInsertHandle= Acrescentar referncia actionDeleteHandle= Apagar referncia actionChangeAttributes= Mudar atributos actionChangeAttribute= Alterar %s actionLower= Baixar actionRaise= Elevar actionReorder= Reordenar actionEditText= Editar texto # draw.gui - attribute table titles selectionOne = Seleo: %s selectionMultiple = Seleo: %s x %s selectionVarious = Seleo: itens variados x %s logisim-2.7.1/resources/logisim/pt/data.properties0000644000175000017500000000066211534277512022224 0ustar vincentvincent# # data/Attributes.java # booleanTrueOption= Sim booleanFalseOption= No # # data/Direction.java # directionEastOption= Leste directionWestOption= Oeste directionNorthOption= Norte directionSouthOption= Sul directionNorthVertical= Em cima directionSouthVertical= Embaixo directionEastVertical= Direita directionWestVertical= Esquerda # # data/Value.java # valueErrorSymbol= E valueUnknownSymbol= x valueError= Erro valueUnknown= ??? logisim-2.7.1/resources/logisim/pt/circuit.properties0000644000175000017500000000410411536421140022736 0ustar vincentvincent# # Analyze.java # defaultInputLabels= a,b,c,d,e,f,g,h defaultOutputLabels= x,y,z,u,v,w,s,t # # AnalyzeException.java # analyzeCircularError= Referncia circular detectada; tabela-verdade ser calculada no lugar. analyzeConflictError= Sadas conflitantes detectada; tabela-verdade ser computada em seu lugar. analyzeCannotHandleError= Computao da tabela-verdade em lugar da expresso devido a %s. # # circuit/Circuit.java # circuitName= Nome do circuito circuitLabelLocAttr= Posio do rtulo circuitLabelAttr= Rtulo compartilhado circuitLabelDirAttr= Direo do rtulo compartilhado circuitLabelFontAttr= Fonte do rtulo compartilhado # # circuit/CircuitMutation.java # unknownChangeAction= Alterar circuito # # circuit/Subcircuit.java # subcircuitViewItem= Ver %s subcircuitCircuitTip= %s subcircuito # # circuit/RadixOption.java # radixAttr= Base radix2= Binrio radix10Signed= Decimal com sinal radix10Unsigned= Decimal sem sinal radix8= Octal radix16= Hexadecimal # # circuit/SplitterClass.java # # splitter component name splitterComponent= Distribuidor # splitter end tool tips splitterCombinedTip= Extremidade combinada do distribuidor splitterSplit0Tip= Nenhum bit oriundo da extremidade combinada splitterSplit1Tip= Bit %s oriundo da extremidade combinada splitterSplitManyTip= Bits %s oriundos da extremidade combinada # splitter attributes splitterBitWidthAttr= Largura em bits entrada splitterFanOutAttr= Largura em bits sada splitterBitAttr= Bit %s splitterBitNone= Nenhum splitterAppearanceAttr = Forma splitterAppearanceLegacy = Legacy splitterAppearanceLeft = esquerda splitterAppearanceCenter = Central splitterAppearanceRight = direita splitterDistributeAscending = Distribuir em ordem crescente splitterDistributeDescending = Distribuir em ordem decrescente # # circuit/WireClass.java # wireComponent= Conexo wireLengthAttr= Comprimento wireDirectionAttr= Direo wireDirectionHorzOption= Horizontal wireDirectionVertOption= Vertical # circuit/appear/AppearanceOrigin circuitAnchor= ncora appearanceFacingAttr= Direo da forma # circuit/appear/AppearancePort circuitPort= Portalogisim-2.7.1/resources/logisim/pt/analyze.properties0000644000175000017500000000572011534277450022757 0ustar vincentvincent# # gui/Analyzer.java # analyzerWindowTitle= Anlise Combinacional inputsTab= Entradas outputsTab= Sadas tableTab= Tabela expressionTab= Expresso minimizedTab= Minimizada inputsTabTip= Ver e editar o conjunto de variveis de entrada. outputsTabTip= Ver e editar o conjunto de variveis de sada. tableTabTip= Ver e manipular a tabela-verdade. expressionTabTip= Ver e manipular as expresses de sada. minimizedTabTip= Ver expresses minimizadas correspondentes tabela-verdade. # # gui/BuildCircuitButton.java # buildCircuitButton= Construir circuito buildProjectLabel= Projeto alvo: buildNameLabel= Nome do circuito: buildTwoInputsLabel= Usar apenas portas com duas entradas buildNandsLabel= Usar apenas portas NAND buildDialogTitle= Construir circuito buildDialogErrorTitle= Impossvel construir circuito buildNeedProjectError= Selecionar o projeto alvo. buildNeedCircuitError= Um nome para o circuito deve ser especificado. buildConfirmReplaceMessage= Tem certeza que quer substituir o circuito %s? buildConfirmReplaceTitle= Confirmar a substituio replaceCircuitAction= Substituir circuito # # gui/ExpressionEditorPanel.java # exprClearButton= Limpar exprRevertButton= Restaurar exprEnterButton= Entrar # # gui/ExpressionPanel.java # expressionEmpty= (vazio) # # gui/KarnaughMapPanel.java # karnaughNoOutputError= Nenhuma sada selecionada. karnaughTooManyInputsError= Entradas demais para a tabela. # # gui/MinimizedTabPanel.java # minimizedFormat = Formato: minimizedSumOfProducts = Soma de produtos minimizedProductOfSums = Produto das somas minimizedSetButton= Tomar como expresso # # gui/OutputSelector.java # outputSelectLabel= Sada: # # gui/SimpleTruthTablePanel.java # tableEmptyMessage= (tabela vazia) tableNullHeader= (nenhum) # # gui/TableTabClip.java # clipPasteErrorTitle= Erro ao colar clipPasteSupportedError= O contedo da rea de transferncia no pode ser colado no editor. clipPasteEndError= A rea de transferncia ultrapassa o limite da tabela. clipPasteSizeError= A rea onde colar dever ser do mesmo tamanho que a rea de transferncia. # # gui/VariableListPanel.java # variableRemoveButton= Remover variableMoveUpButton= Para cima variableMoveDownButton= Para baixo variableAddButton= Acrescentar variableRenameButton= Renomear variableStartError= Nome deve comear com uma letra. variablePartError= Nome no pode conter '%s'. variableDuplicateError= Nome de varivel j existente. variableMaximumError= (Alcanado o tamanho mximo %s.) # # model/Entry.java # busError= Valores de sadas conflitantes no circuito. oscillateError= Oscilao no circuito. # # model/Parser.java # implicitAndOperator= (AND implcita) invalidCharacterError= Caracteres desconhecidos: %s missingLeftOperandError= Falta o operado esquerdo ao operador %s. missingRightOperandError= Falta o operando direito ao operador %s. lparenMissingError= Falta abrir parnteses. rparenMissingError= Falta fechar parnteses. badVariableName= %s no uma varivel de entrada. unexpectedApostrophe = Apstrofo ("'") inesperadologisim-2.7.1/resources/logisim/img/0000755000175000017500000000000011455470116017317 5ustar vincentvincentlogisim-2.7.1/resources/logisim/img/logisim-icon-64.png0000644000175000017500000000115311455470116022645 0ustar vincentvincentPNG  IHDR@@sRGBcPLTE.i 5'('796VAC@dLNLY[Xbcartq|~{ïtRNS@f pHYs  IDATX˖@ DFG!<:zDG! jX;T%I a_ ALWu^0fAmnu}[ 7 >x%+E@o#ZSjt qPDwS*76$4MdBƗ {BDG"'R ! T(&: tR@s<;J` Ќa)o<1_rsuZKF8|["9낞gG!Yٔ9K ;I#044>a2;K  NwpKYRP͚+rF\\g7fnylEq?%+|6fu`qIENDB`logisim-2.7.1/resources/logisim/img/logisim-icon-48.png0000644000175000017500000000074611455470116022656 0ustar vincentvincentPNG  IHDR00` sRGBcPLTEVG -!#!./-685^DFCdOQNXZW_a^kmj}|jtRNS@f pHYs B(xIDATHݒ0 MR݅"W?̎bf;u6iw `'@QLH۹:tu Ɩw(/~eOOuBHJSk/_UxۃUo%oZpqS&бKX5NKPJ .ul4p26!ԹPߣZvPh\g4'Vj|k< A#>`]H^‡h>xDSU r6 pl0eg3n|>wW wQH5jIENDB`logisim-2.7.1/resources/logisim/img/logisim-icon-24.png0000644000175000017500000000036211455470116022642 0ustar vincentvincentPNG  IHDRY sRGB!PLTEdj06IWtRNS@fbKGDH pHYsu85PIDATc` 0 "x @LJVJq@:) ggDd*dB\@fqqDX P4/ X+cO)%IENDB`logisim-2.7.1/resources/logisim/img/logisim-icon-20.png0000644000175000017500000000040511455470116022634 0ustar vincentvincentPNG  IHDR>sRGB-PLTE Ke1tRNS@fbKGDH pHYsyWIDATc` l`ܻw`6wp滍-y5Hk#9$bWPQ-*B?ՐIENDB`logisim-2.7.1/resources/logisim/img/logisim-icon-16.png0000644000175000017500000000016711455470116022646 0ustar vincentvincentGIF89aP!,@>ZFHEdOQOY[Xbcalnk|~{VltRNS@f pHYs$$P$IDATxk Q,'[^rT4"g]xܰ/lEyuXf*APWEFWMyEb?k8hM )< Vb`c 3l4Yfx71a;iUw`I <6,xbeTBCR|ș)N{F\Vm'BHuG5 M FsU>A+>jȐbB{ѓ/{q#PtD 5jE.z @܂\^9f+U%* [Q1J)y ڻHZC*|a8Ԁ@AB&8M;*vVAp0b_X>KǃOGԅKLܞR8x{Lx*F@,>alB^?놼"aOf@DgF d\ bg !H,ڟ\+sZYԪ 8’!NF'z@s1솤J?Hk wG.?.\~=eim5`^cMP+T2Qߌ>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,g H?(@ۣС?HA7NH+""H+ B| LbD)NS ȍFhgǏ%>P&X;logisim-2.7.1/resources/logisim/icons/xnorGateRect.gif0000644000175000017500000000017211446034504022747 0ustar vincentvincentGIF89a!Created with The GIMP! ,2y#hNJ dm~yQX"LIJ0RO3H ;logisim-2.7.1/resources/logisim/icons/xnorGate.gif0000644000175000017500000000161511446034504022134 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,j H?(b B{ l(P+l)x$R {)> 2Ɓ+YfĎ&AXf\ޔX'gJ yD;56uQʄ 5qj0 ;logisim-2.7.1/resources/logisim/icons/wiring.gif0000644000175000017500000000012711446034504021641 0ustar vincentvincentGIF89a-o-P! ,( 3A)߆0^ImVh#sF;logisim-2.7.1/resources/logisim/icons/tunnel.gif0000644000175000017500000000017011446034504021645 0ustar vincentvincentGIF89a!Created with GIMP! ,(H0I. p`@`hbfaST[G(Y/+!327H" ;logisim-2.7.1/resources/logisim/icons/text.gif0000644000175000017500000000022111446034504021321 0ustar vincentvincentGIF89a )))777MMM\\\jjj~~~! ,>I؂\8d>$m$>i`) @@.2F9&4DU%#K u)(כEXH]r Oꪅ3g߶67Zn9 '(BBDXjŁ4ab1LLcJnnltlt4:HL꺮O9xs+)_pR 8fX[4@BJ}3x9s BdB|Z -f<9Wٶ}ƿTN:@?PL_CVŒ5RIENDB`logisim-2.7.1/resources/logisim/icons/simtstep.png0000644000175000017500000000152511532066736022244 0ustar vincentvincentPNG  IHDRasRGBbKGD pHYs  tIME"MIDAT8˝MhgGvv6ɢ Xkڭ$&PŃ`D dPᒍ WTo RC=,BWH6&33Q<|y`1NIO97,؎yrQ֖n|oo[!sG|hetS| m,ˢX,:s&z8l͛?r3؅’0"G ]سs{\Ww=:.xeA)m-W=4%p{RJvw`ޞG㮔A0?F("X؄"6&д ǩ.P,#Yr%{nqv(4GG~æT q{7/U6d0&D[pEJ@COݼ۵ƦmjiY0%F/Qp؋Xwg*-'07cGSuwK>^-~ɥlyjYWoIENDB`logisim-2.7.1/resources/logisim/icons/simtplay.png0000644000175000017500000000151411532066736022234 0ustar vincentvincentPNG  IHDRasRGBbKGD pHYs  tIME8y8eIDAT8˝KLT{wfxDIX h]+ DuA&1@iBBZyƸi]iJx al#h:Xt&P;sq!cFɗs~X֕^+:$F,ӊwNW˹V^VmxihwMSOD1l{Naضm-,F4#f,Qu=''xwʽD]>jj>58 3n{DU)/+e}||DS'֭F_ddxxƲ:O%|NQOd} }oܙ錎P[SCݑz>M,l\q?KWO-s1K)DN7~_*GU!mm?Hqn7x8=W9?k>Q(J5՞\H4+*0Me*ԓ LAlÛy78!s㈳-) CA<7 uA۷~'5% i qtAKԤk9srf#jP!LDbuƟ>GwdMhW"AzF&PCڼlM0EO PޒMG6g*",m;~>x`Gw H۔%ۼrKd=0XfIENDB`logisim-2.7.1/resources/logisim/icons/simstop.png0000644000175000017500000000144411532066736022072 0ustar vincentvincentPNG  IHDRasRGBbKGD pHYs  tIME#&6IDAT8eoG?3;tزᒆ HGZlҤKqBK.7jҀ r "R$g06u[v۝o X{y3v7?HP) o?TMz޵,7rŋ~>}1fn;#i7_Ay,OQ(޽vn4@YKKd1/0 0 d1KKeQ;n_}3<.'OxQQ ?~c5tf0z8|֭{mBgo֭ZTUu@~lyXk|xGeKFhAq T8gADBYcΜh{Ƒ1uQVԻ`fTe @9bN8 R FZ_|IQ1t\cd\(ߌFWv:?,epkbb]˗"=Sbyyׯq]*X,T*+BבR:?ff8Y()O?ӃXZ1NX]F>yZy52WFFF.;~o+)e8 s7 ͣ/$In Rm.?dx8dl&gxZA$$ eXZR <|#za.IЗx@RJ:䰲 qll+Fqr9:LMsJ>m.Len),|ߧRWaBplS.I~bX0 y_z: rjulRQ*6ֶ5 Tl͖\.`c֣(*=#"@J8ض,!ssψ8>>`>ۛxqsaHOR{(]_3Rv.ƋRt4F m`+/WIENDB`logisim-2.7.1/resources/logisim/icons/simplay.png0000644000175000017500000000150211532066736022045 0ustar vincentvincentPNG  IHDRasRGBbKGD pHYs  tIME ^CIDAT8e=luA1MPBTwCl,H1F!Kpu^R)RhftC!N"BО8qlNݽ Jgy_?h(D/RsEUNJe[˗YxOtFպ/NsEkv F3 &z0ۣZbf%5>%sc*{{ *$IOSz}2Jn 0WA+wIӔNT 뺄4M޾K+X__0LXZzy°Gt]=zH+%LGZ*H9w;xsoD˲/A5jIENDB`logisim-2.7.1/resources/logisim/icons/shiftreg.gif0000644000175000017500000000014111446034504022151 0ustar vincentvincentGIF89a! ,2}P؋q [oU7XBBvI~mse-H& ;logisim-2.7.1/resources/logisim/icons/shifter.gif0000644000175000017500000000014111446034504022002 0ustar vincentvincentGIF89a! ,2iTX AmZXŔy7>V%AH" ;logisim-2.7.1/resources/logisim/icons/select.gif0000644000175000017500000000013611446034504021621 0ustar vincentvincentGIF89a! ,/ɢ{ IY;e㖪(V^2Ri肇آ;logisim-2.7.1/resources/logisim/icons/rom.gif0000644000175000017500000000013711446034504021140 0ustar vincentvincentGIF89a! ,0)ςƊ5nMM$Yz` y9'<@ P;logisim-2.7.1/resources/logisim/icons/register.gif0000644000175000017500000000017611446034504022172 0ustar vincentvincentGIF89aUUU! ,CH 0J8zA C |VʒKX䇊4Sfk`1N%d_Cbeux ;logisim-2.7.1/resources/logisim/icons/random.gif0000644000175000017500000000036211446034504021623 0ustar vincentvincentGIF89a66;NOT]``ssu! ,o $diqd(L03y7 X4 C>49By=/aу@!(4KP eG/}  &Qr , }r,"$!;logisim-2.7.1/resources/logisim/icons/ram.gif0000644000175000017500000000013611446034504021121 0ustar vincentvincentGIF89arrr! ,/9ςƊ5nMM$Yz ʪyYσ;logisim-2.7.1/resources/logisim/icons/pullshap.gif0000644000175000017500000000010611446034504022167 0ustar vincentvincentGIF89a! , "mQo͚_^~3v紦+S;logisim-2.7.1/resources/logisim/icons/pullrect.gif0000644000175000017500000000012311446034504022170 0ustar vincentvincentGIF89a! ,$ -"M-QކedUN}S;logisim-2.7.1/resources/logisim/icons/projup.gif0000644000175000017500000000012311446034504021655 0ustar vincentvincentGIF89ajl! ,$PIkYQydgY^э#;logisim-2.7.1/resources/logisim/icons/projtool.gif0000644000175000017500000000013211527307512022210 0ustar vincentvincentGIF89a333DDDfff<<~ڥ! ,80IX=rGxlPbUS!P,6w }?XRr##X;logisim-2.7.1/resources/logisim/icons/priencod.gif0000644000175000017500000000013711446034504022146 0ustar vincentvincentGIF89a! ,0ˍUDqeyY)u(1\a5 BĢP;logisim-2.7.1/resources/logisim/icons/power.gif0000644000175000017500000000012711524651200021471 0ustar vincentvincentGIF89aDDD! ,(pH4Z҉JTʞT%p|̴`yJ;logisim-2.7.1/resources/logisim/icons/poke.gif0000644000175000017500000000022111446034504021273 0ustar vincentvincentGIF89aaKqV!"Created with The GIMP"! ,;1^a{WޝqGJ8P5cUqgx+DSOAC1Γ&%;logisim-2.7.1/resources/logisim/icons/pinOutputReversed.gif0000644000175000017500000000023011446034504024044 0ustar vincentvincentGIF89a@@@ڤUUT! ,EIX 2Al A U@PQq u;G#$B ?wkjNU˪HC&G;logisim-2.7.1/resources/logisim/icons/pinOutput.gif0000644000175000017500000000023011446034504022344 0ustar vincentvincentGIF89a@@@ڤUUT! ,EIX 2Al A U@PQ0ZaP1Ž&MCC {̣lw{OU HC.#";logisim-2.7.1/resources/logisim/icons/pinInput.gif0000644000175000017500000000022711446034504022151 0ustar vincentvincentGIF89aڤUU! ,DI5A( A BXN@tAu=Ӭg^#L3P*:"}:`x|;logisim-2.7.1/resources/logisim/icons/parityOddGate.gif0000644000175000017500000000166711446034504023114 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~!Created with The GIMP! ,{@Aǐq $PNcTEPqU2(1c C:°B䌬%4˨J?WV'Ѕ 4!ʣ Q@fʆ\ΪL2 fԧ;logisim-2.7.1/resources/logisim/icons/parityEvenGate.gif0000644000175000017500000000165011446034504023273 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~!Created with The GIMP! ,l@Aǐq $PNcTEPqU2(1c C:°B䌬%4˨J?WV'Ѕ 4TѦIB]rϛVN=z;logisim-2.7.1/resources/logisim/icons/orGateRect.gif0000644000175000017500000000025611446034504022404 0ustar vincentvincentGIF89arrrUUU!Created with The GIMP! ,B=@R}mm D!tlu'wUd ##F"&:]֫(Z);logisim-2.7.1/resources/logisim/icons/orGate.gif0000644000175000017500000000157711446034504021575 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,\ H?v1X{2 L<"D ]YxH#=30J U^jsS@3?22DF&iS;logisim-2.7.1/resources/logisim/icons/notGateRect.gif0000644000175000017500000000016311446034504022561 0ustar vincentvincentGIF89a!Created with The GIMP! ,+ˍ/؋Ay[Qvʖ)fw3 & ;logisim-2.7.1/resources/logisim/icons/notGate.gif0000644000175000017500000000155711446034504021753 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,L H <Br0?^87^_I$ʏ"11PΟ@;logisim-2.7.1/resources/logisim/icons/norGateRect.gif0000644000175000017500000000026311446034504022560 0ustar vincentvincentGIF89arrrUUU!Created with The GIMP! ,GI|X;Z&FD!%HrvUt"aUveS,ި6{r]ZےXΙ;logisim-2.7.1/resources/logisim/icons/norGate.gif0000644000175000017500000000160611446034504021744 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,c H?v1X{2 L<"D ]YxH#=3yAMu2}2iKd㾏 8G д*À;logisim-2.7.1/resources/logisim/icons/negator.gif0000644000175000017500000000156711446034504022012 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,T H@*TxÇhD*ZŌ7+ I#Ē#[bɐ#KQˎ7{\H;logisim-2.7.1/resources/logisim/icons/nandGateRect.gif0000644000175000017500000000027211446034504022702 0ustar vincentvincentGIF89aUUUrrr999!Created with The GIMP! ,NI|X;&  eV{rQ 6!ຄ@ rPcnoV|Xޙ;logisim-2.7.1/resources/logisim/icons/nandGate.gif0000644000175000017500000000160411446034504022064 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,a H*"JW,aA%; ƌu?H#LʕI4mfliQD$arcʗ>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~!Created with The GIMP! ,Y H@*TxÇhD$$㿋;n'R"E4#‘,=:"ȇ"W~r͏0QƬh$ј "4Ȕ`@;logisim-2.7.1/resources/logisim/icons/multiplexer.gif0000644000175000017500000000022511446034504022713 0ustar vincentvincentGIF89aP??? ! ,BIW0QgE: kw4k!Ɨyza4H J5Hme';logisim-2.7.1/resources/logisim/icons/menu.gif0000644000175000017500000000015711446034504021311 0ustar vincentvincentGIF89arrrTTT! ,4H0`*;`(uli tmpt5b<Ȍfd$;logisim-2.7.1/resources/logisim/icons/led.gif0000644000175000017500000000017611446034504021112 0ustar vincentvincentGIF89a ]fUJ1! ,Cx: 2[&d| l<*߬@g.**/'] ex! ;logisim-2.7.1/resources/logisim/icons/keyboard.gif0000644000175000017500000000035611446034504022146 0ustar vincentvincentGIF89ahjgopnꀂZבf騪۹! ,k $di,L*.8 Җ!3b1TA`. qlxe5!;( @WMka^w/E`vxC$WEl(WxP.9!;logisim-2.7.1/resources/logisim/icons/joystick.gif0000644000175000017500000000032611446034504022202 0ustar vincentvincentGIF89a |&'%443>?>FFFPPPY[XGGgifM5porr}|֍! ,S'diqE:PL=&>#@0!"m,Cb@(K"l c8Љr:BT>0!;logisim-2.7.1/resources/logisim/icons/jkFlipFlop.gif0000644000175000017500000000014511446034504022402 0ustar vincentvincentGIF89awww! ,6iTXuHFɁʦB@M?2z(&;logisim-2.7.1/resources/logisim/icons/hexdig.gif0000644000175000017500000000017211446034504021612 0ustar vincentvincentGIF89aCsCCC! ,?x 0J@Sf ߵ=EŨXff{u-,>^WIS";logisim-2.7.1/resources/logisim/icons/ground.gif0000644000175000017500000000010611524651200021630 0ustar vincentvincentGIF89a! ,۞ίfm١ya;logisim-2.7.1/resources/logisim/icons/extender.gif0000644000175000017500000000012511446034504022156 0ustar vincentvincentGIF89a! ,& 0Iۡׄu'&yflf]tԺU;logisim-2.7.1/resources/logisim/icons/drawrrct.gif0000644000175000017500000000023711446034504022174 0ustar vincentvincentGIF89a ak|s  ! ,LIw$rFM2gZ$,.iEAԏ[g%c=fЩCezi,Q 8f;D;logisim-2.7.1/resources/logisim/icons/drawrect.gif0000644000175000017500000000022111446034504022150 0ustar vincentvincentGIF89a ak|s  ! ,>I8k _  $rFQ,LFsC'}xHXfv#;logisim-2.7.1/resources/logisim/icons/drawpoly.gif0000644000175000017500000000022711446034504022204 0ustar vincentvincentGIF89a ` l|w   $ ! ,DI8S4D=BbV*IqӚ ȁB.CAA1(zӑx;logisim-2.7.1/resources/logisim/icons/drawplin.gif0000644000175000017500000000014711446034504022164 0ustar vincentvincentGIF89aa lw! ,,H02$Z"xQdհAמ< 1D7pI;logisim-2.7.1/resources/logisim/icons/drawpin.gif0000644000175000017500000000020211446034504022000 0ustar vincentvincentGIF89a r 98@>FEhhЀ! ,/)IJ4O5t J)"E;B KpO_P]r؊;logisim-2.7.1/resources/logisim/icons/drawoval.gif0000644000175000017500000000023311446034504022157 0ustar vincentvincentGIF89a a ku  ! ,HI8cz[0 q_ JBF!Ҫ˴ܮP $>`ngpBCl6a*  Q4 ֘hJ;logisim-2.7.1/resources/logisim/icons/drawline.gif0000644000175000017500000000007511446034504022151 0ustar vincentvincentGIF89ak! ,cڮŎ;logisim-2.7.1/resources/logisim/icons/drawcurv.gif0000644000175000017500000000011411446453766022212 0ustar vincentvincentGIF89aef! , xb&KoNa#u38J;logisim-2.7.1/resources/logisim/icons/drawarc.gif0000644000175000017500000000012711446034504021765 0ustar vincentvincentGIF89aa lw! ,80BA ;.^X~5iԮk;logisim-2.7.1/resources/logisim/icons/dotmat.gif0000644000175000017500000000017211446034504021632 0ustar vincentvincentGIF89aCC! ,?H 0J8:B}37,a'gs@ Eܙz!MelBrU ׈";logisim-2.7.1/resources/logisim/icons/divider.gif0000644000175000017500000000155711446034504022000 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,L H@*TxÇhD""HF3VQ!Mq$˒ EzlL._O@ ;logisim-2.7.1/resources/logisim/icons/dinXorGate.gif0000644000175000017500000000160211446034504022405 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,_ H,0h2a#&Xv':RȆ=Svȍ7|!K1H@Ś 'xLz&LARP ;logisim-2.7.1/resources/logisim/icons/dinXnorGate.gif0000644000175000017500000000157711446034504022576 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,\ H,0h2a#&XbƉ7ÓJ ȕ'r#Ɂ"tN%L'sHς >>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,V H,0h2a#&`Ɖ*>)#Cl8rǂ(@:)JJ>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,V H,0h2a#&h1D!yldB'r'v. rCz"{LAPH ;logisim-2.7.1/resources/logisim/icons/dinNorGate.gif0000644000175000017500000000157111446034504022400 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,V H,0h2a#&`Ɖ*>)#C?6cATdIҤ?:)͕J>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,W H,0h2a#&XbƉBɍ C(J%M9%HwQgAF,*5;logisim-2.7.1/resources/logisim/icons/dinAndGate.gif0000644000175000017500000000157211446034504022345 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,W H,0h2a#&XbƉBIe$ |1(AI%\xQ'F*%;logisim-2.7.1/resources/logisim/icons/dFlipFlop.gif0000644000175000017500000000014211446034504022216 0ustar vincentvincentGIF89awww! ,3iTX`>uBQ ˥$ܚ+m~^ՂP(;logisim-2.7.1/resources/logisim/icons/dff.gif0000644000175000017500000000033611446034504021103 0ustar vincentvincentGIF89a./-;=:MOL]_\qspz{y~! ,[ $d)h㾰 ON hCS@Oa;logisim-2.7.1/resources/logisim/icons/comparator.gif0000644000175000017500000000156611446034504022521 0ustar vincentvincentGIF89a>  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,S H@*TxÇh&bD;^|B1ܨcʌ WtƒkdQ'ɗ-A.РQ;logisim-2.7.1/resources/logisim/icons/clock.gif0000644000175000017500000000016311446034504021435 0ustar vincentvincentGIF89aUUP! ,8xI%! A`B)|Bf'@dwz`a 2:ޱ88!#;logisim-2.7.1/resources/logisim/icons/button.gif0000644000175000017500000000022211446034504021651 0ustar vincentvincentGIF89a.*LMuswvvת! ,?I8<`x`'@\'-f>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~!Created with The GIMP! ,D H <Br0?^8ƍU""IB<#F#‡8s ;logisim-2.7.1/resources/logisim/icons/bitSelector.gif0000644000175000017500000000024711446034504022624 0ustar vincentvincentGIF89aP??? !Created with The GIMP! ,;08 EUc (\5D'U>R';logisim-2.7.1/resources/logisim/icons/bitfindr.gif0000644000175000017500000000022011451010344022125 0ustar vincentvincentGIF89a,-+YZX{}z! ,=I8k}tA ~ ܆ B$\6XeK;logisim-2.7.1/resources/logisim/icons/bitadder.gif0000644000175000017500000000014111446034504022114 0ustar vincentvincentGIF89a! ,2iThAW0\>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,Y H*"JW,aA%; ƌu?H#,eI.WJ)%I'iqƔ*3C B4ut`@;logisim-2.7.1/resources/logisim/icons/adder.gif0000644000175000017500000000043511446034504021423 0ustar vincentvincentGIF89an/xxggN# 'yPkk` {! ?,:pH, ȤRy 8P'N(RK}n,X.RY֒X77>;>>DA;logisim-2.7.1/resources/logisim/icons/7seg.gif0000644000175000017500000000017511446034504021212 0ustar vincentvincentGIF89aCsCCC! ,Bx `+h/E \b*kϟ6ls }AW--MOT%̤";logisim-2.7.1/resources/logisim/hendrix.png0000644000175000017500000000057511446034506020720 0ustar vincentvincentPNG  IHDR2D1j{^PLTEؽƠzh]*&&.8:tRNS@f pHYsClIDATxŕ0;v58bq8Jae0a%ѤoZŶ(.D ء׻7m.Wv hDX{ir^] WCR%!2(k(_[0qH9K~䐃@>pn)^;" <=3UQyz {0dD1\VIK>Ql#zIWmH#HbSb$1RrN#IvVTJ$nO~Qw!oW6IENDB`logisim-2.7.1/resources/logisim/es/0000755000175000017500000000000011536416116017152 5ustar vincentvincentlogisim-2.7.1/resources/logisim/es/util.properties0000644000175000017500000000225111524651374022251 0ustar vincentvincent# # util/FontUtil.java # fontPlainStyle = Plano fontBoldStyle = Negrita fontItalicStyle = Itlicas fontBoldItalicStyle = Negrita Itlicas fontDlogFontLabel = Fuente: fontDlogStyleLabel = Estilo: fontDlogSizeLabel = Tamao: # # util/InputEventUtil.java # metaMod = Meta altMod = Alt ctrlMod = Ctrl shiftMod = Shift button1Mod = Button1 button2Mod = Button2 button3Mod = Button3 # # util/JDialogOk.java # dlogOkButton = Aceptar dlogCancelButton = Cancelar # # util/LocaleManager.java # # If the user selects to "replace accented characters" in the International # dialog, the program will replace accented characters based on # the slash-delimited character-string pairs in accentReplacements. # For example, with German, accentReplacements might be # " oe/ Oe/ ue/ ue/ ss" so that umlauted o's and u's are # replaced, as would be essets. accentReplacements = / a/ e/ i/ o/ u/ A/ E/ I/ O/ U/ n/ N localeMenuItem = Idioma # # util/GifEncoder.java # grabberError = Grabber devolvi false: manyColorError = Demasiados colores. # # util/WindowMenu.java # windowMenu = Ventana windowMinimizeItem = Minimizar windowZoomItem = Zoom windowZoomItemMac = Zoom windowCloseItem = Cerrar logisim-2.7.1/resources/logisim/es/tools.properties0000644000175000017500000000226611527054402022432 0ustar vincentvincent# # tools/AddTool.java # addToolText = Aadir %s negativeCoordError = El componente no puede tener coordenadas negativas. cannotModifyError = No se puede modificar el circuito. circularError = No se puede crear referencia circuito. exclusiveError = Ya existe un componente conflictivo. # # tools/MenuTool.java # menuTool = Menu Herramientas menuToolDesc = Ver componentes del men compDeleteItem = Borrar compShowAttrItem = Mostrar Atributos selDeleteItem = Eliminar Seleccin selCutItem = Cortar Seleccin selCopyItem = Copiar Seleccin # # tools/PokeTool.java # pokeTool = Herramienta De Cambio pokeToolDesc = Cambiar valores en el circuito # # tools/SelectTool.java # selectTool = Seleccionar Herramienta selectToolDesc = Editar componentes del circuito # # tools/TextTool.java # textTool = Herramienta De Texto textToolDesc = Editar texto en el circuito changeTextAction = Cambiar Texto # # tools/WiringTool.java # wiringTool = Herramienta De Cableado wiringToolDesc = Aadir cables al circuito # actions addComponentAction = Aadir %s addWireAction = Aadir Cable addWiresAction = Aadir Cables removeWireAction = Eliminar Cable removeComponentAction = Eliminar %s shortenWireAction = Acortar Cable logisim-2.7.1/resources/logisim/es/std.properties0000644000175000017500000001475111452004274022065 0ustar vincentvincent# # std/Builtin.java # builtinLibrary = Incorporada # # std/Base.java # baseLibrary = Base # # std/StdAttr.java # stdFacingAttr = Orientacin stdDataWidthAttr = Bits De Datos stdLabelAttr = Etiqueta stdLabelFontAttr = Fuente Del Etiquetado # # Base library # # std/base/BitExtender.java extenderInAttr = Bits De Entrada extenderInputType = Entrada # std/base/Clock.java clockComponent = Reloj clockHighAttr = Duracin Del Nivel Alto clockLowAttr = Duracin Del Nivel Bajo clockDurationValue = %s Ticks clockDurationOneValue = 1 Tick freqNegativeMessage = El valor tiene que ser un entero positivo freqInvalidMessage = El valor no es un entero vlido # std/base/Pin.java pinComponent = Pin pinInputName = Entrada pinOutputName = Salida pinThreeStateAttr = Tres-estados? pinOutputAttr = Salida? pinPullAttr = Comportamiento De Pines pinPullNoneOption = Invariante pinPullUpOption = Adoptar Nivel Alto pinPullDownOption = Adoptar Nivel Bajo pinLabelLocAttr = Posicin De La Etiqueta pinInputToolTip = Aadir pin de entrada pinOutputToolTip = Aadir pin de salida pinFrozenTitle = Pin Asociado Al Supercircuito. pinFrozenQuestion = El pin est relacionado con el estado del circuito. Crear un nuevo estado del circuito? # std/base/Probe.java probeComponent = Ver # std/base/PullResistor.java pullErrorType = Error # std/base/Text.java textComponent = Etiqueta textTextAttr = Texto textFontAttr = Fuente textHorzAlignAttr = Alineamiento Horizontal textHorzAlignLeftOpt = Izquierda textHorzAlignRightOpt = Derecha textHorzAlignCenterOpt = Centro textVertAlignAttr = Alineamiento Vertical textVertAlignTopOpt = Arriba textVertAlignBaseOpt = Base textVertAlignBottomOpt = Abajo textVertAlignCenterOpt = Centro # # std/Gates.java # gatesLibrary = Puertas gateSizeAttr = Tamao De Puerta gateSizeNarrowOpt = Estrecho gateSizeWideOpt = Ancho gateInputsAttr = Nmero De Entradas # std/Constant.java constantComponent = Constante constantValueAttr = Valor # std/NotGate.java notGateComponent = Puerta NOT # std/Buffer.java bufferComponent = Bffer # std/AndGate.java andGateComponent = Puerta AND # std/NandGate.java nandGateComponent = Puerta NAND # std/NorGate.java norGateComponent = Puerta NOR # std/OrGate.java orGateComponent = Puerta OR # std/XorGate.java xorGateComponent = Puerta XOR # std/XnorGate.java xnorGateComponent = Puerta XNOR # std/OddParityGate.java oddParityComponent = Detector Imparidad # std/EvenParityGate.java evenParityComponent = Detector Paridad # std/ControlledBuffer.java controlledBufferComponent = Bffer Controlado controlledInverterComponent = Inversor Controlado # # std/Memory.java # memoryLibrary = Memoria # AbstractFlipFlop.java flipFlopClockTip = Entrada de reloj - el estado se actualiza en el flanco de 0 a 1 flipFlopQTip = ltimo estado del biestable flipFlopNotQTip = Inverso del ltimo estado del biestable flipFlopResetTip = Para 1, estado del pin a 0 asncronamente flipFlopPresetTip = Para 1, estado del pin a 1 asncronamente # std/DFlipFlop.java dFlipFlopComponent = Biestable D # std/TFlipFlop.java tFlipFlopComponent = Biestable T # std/JKFlipFlop.java jkFlipFlopComponent = Biestable J-K # std/SRFlipFlop.java srFlipFlopComponent = Biestable S-R # std/Register.java registerComponent = Registro registerQTip = ltimo valor de salida registerDTip = Valor de entrada - guardado con el flanco de subida registerClkTip = Reloj - el valor se actualiza en el flanco de 0 a 1 registerClrTip = Clear - Los pins a 1 se ponen a 0 asncronamente # std/RomFactory.java romComponent = ROM romContentsAttr = Contenidos romContentsValue = (click para editar) romChangeAction = Edit Contenidos De La ROM # std/Ram.java ramComponent = RAM ramDataLabel = D ramAddrLabel = A ramCSLabel = sel ramOELabel = out ramClrLabel = clr ramAddrWidthAttr = Nmero De Bits De Direccin ramDataWidthAttr = Nmero De Bits De Datos ramKilobyteLabel = %sKB RAM ramByteLabel = %sB RAM romKilobyteLabel = %sKB ROM romByteLabel = %sB ROM memDataTip = Entrada o salida de datos de memoria memAddrTip = Entrada de direccin de memoria memCSTip = Seleccin de chip - 0 deshabilita el componente ramWETip = Reloj - valor de memoria se actualiza en el flanco de 0 a 1 ramOETip = Salida permitida - si 1, se leen datos; si 0, se escriben datos con reloj ramClrTip = Clear - pins a 1 se ponen a 0 asncronamente ramEditMenuItem = Editar Contenidos... ramClearMenuItem = Borrar Contenidos ramLoadMenuItem = Cargar Imagen... ramSaveMenuItem = Salvar Imagen... ramConfirmClearTitle = Confirmar Borrar ramConfirmClearMsg = Est seguro de que desea resetear "zero out" la memoria? ramLoadDialogTitle = Cargar Imagen RAM ramSaveDialogTitle = Salvar Imagen RAM ramLoadErrorTitle = Error Al Cargar ramSaveErrorTitle = Error Al Salvar # # std/Plexers.java # plexerLibrary = Plexores plexerSelectBitsAttr = Seleccionar Bits plexerThreeStateAttr = Tercer Estado? # std/Multiplexer.java multiplexerComponent = Multiplexor multiplexerSelectTip = Seleccionar ndice de entrada multiplexerInTip = Entrada %s multiplexerOutTip = Salida del multiplexor # std/Demultiplexer.java demultiplexerComponent = Demultiplexor demultiplexerSelectTip = Seleccionar ndice de salida demultiplexerInTip = Entrada del demultiplexor demultiplexerOutTip = Salida %s # std/Decoder.java decoderComponent = Decodficador decoderSelectTip = Seleccionar ndice de salida decoderOutTip = Salida %s # std/BitSelector.java bitSelectorComponent = Selector De Bit bitSelectorGroupAttr = Bits De Salida bitSelectorOutputTip = Grupo de bits de salida de los datos de entrada bitSelectorDataTip = Datos de entrada bitSelectorSelectTip = Selecciona el grupo de salida # std/plexers/PriorityEncoder.java priorityEncoderInTip = Entrada %s # # arith/Arithmetic.java # arithmeticLibrary = Aritmtica # arith/Adder.java adderComponent = Sumador # arith/Subtractor.java subtractorComponent = Restador # arith/Multiplier.java multiplierComponent = Multiplicador # arith/Divider.java dividerComponent = Divisor dividerUpperInput = superior dividerRemainderOutput = resto # arith/Negator.java negatorComponent = Negador # arith/Comparator.java comparatorComponent = Comparador comparatorType = Tipo Numrico unsignedOption = Sin Signo twosComplementOption = 2's Complemento # # io # ioBitWidthAttr = Nmero De Bits ioLabelCenter = Centro ioLabelLocAttr = Posicin De La Etiqueta # io/Io.java #ioLibrary = Input/Output ioLabelCenter = Centro #ioColorAttr = Color ioLabelLocAttr = Posicin De La Etiqueta #ioLabelColorAttr = Label Color # io/Button.java #buttonComponent = Button # io/Led.java #ledComponent = LED # io/SevenSegment.java #sevenSegmentComponent = 7-Segment Display logisim-2.7.1/resources/logisim/es/start.properties0000644000175000017500000000370711452004274022427 0ustar vincentvincent# # Startup.java # argOneTemplateError = Slo se permite una plantilla. argUsage = uso: java %s [opciones] [nombre de archivos] argOptionHeader = opciones: argEmptyOption = -empty utilizar plantilla vaca argPlainOption = -plain utilizar plantilla estndar de Logisim argTemplateOption = -template file utilizar archivo como plantilla argGatesOption = -gates shaped|rectangular utilizar estilo de puerta determinado argLocaleOption = -locale idm utilizar idioma dado por idm argAccentsOption = -accents yes|no utilizar caracteres acentuados o los equivalentes de ASCII argNoSplashOption = -nosplash no muestra la pantalla de inicio argVersionOption = -version mostrar nmero de versin y salir argHelpOption = -help mostrar este resumen y salir argGatesOptionError = El argumento para la opcin -gates debe ser "shaped" o "rectangular". argAccentsOptionError = El agumento para la opcin -accents debe ser "yes" o "no". templateMissingError = La plantilla %s no existe. templateCannotReadError = No hay permiso para leer la plantilla %s. # templateOpenError = Error abriendo la plantilla (%s): %s #removed templateFindDefaultError = No se pudo encontrar la plantilla por defecto. #removed templateLoadError = Error cargando plantilla: %s #removed templateCloseError = Error cerrando plantilla: %s invalidLocaleError = El idioma no est soportado. invalidLocaleOptionsHeader = Idiomas soportados: startupCloseButton = Cerrar startupQuitButton = Salir # # SplashScreen.java # progressLibraries = Cargando componentes... progressTemplateCreate = Creando plantilla... progressTemplateOpen = Abriendo plantilla... progressTemplateLoad = Cargando plantilla... progressTemplateClose = Cerrando plantilla... progressGuiInitialize = Iniciando interfaz... progressFileCreate = Creando archivo... progressFileLoad = Cargando archivo... progressProjectCreate = Creando proyecto... progressFrameCreate = Creando ventana... logisim-2.7.1/resources/logisim/es/proj.properties0000644000175000017500000000130311452004274022232 0ustar vincentvincent# # ProjectActions.java # newCircuitName = principal openAlreadyTitle = Archivo Abierto Con Anterioridad openAlreadyMessage = El archivo %s, abierto con anterioridad, tiene cambios sin guardar. openAlreadyCancelOption = Cancelar Apertura openAlreadyLoseChangesOption = Perder Cambios openAlreadyNewWindowOption = Nueva Ventana confirmOverwriteMessage = El archivo ya existe Quieres sobreescribirlo? confirmOverwriteTitle = Confirmar Sobreescribir fileOpenError = No se pudo abrir el archivo: %s fileOpenErrorTitle = Error Al Abrir replaceExtensionMessage = Quieres sustituir "%s" con la extesin preferida de Logisim ".circ"? replaceExtensionTitle = Sustituir extensin confirmQuitTitle = Confirmar Salir logisim-2.7.1/resources/logisim/es/prefs.properties0000644000175000017500000000155711452004274022412 0ustar vincentvincent# # PreferencesFrame.java # preferencesFrameTitle = Logisim: Preferencias preferencesFrameMenuItem = Preferencias closeButton = Cerrar Ventana # # IntlOptions.java # intlTitle = Internacional intlHelp = Editar la localizacin de las preferencias intlLocale = Lenguaje: intlReplaceAccents = Reemplazar Caracteres Acentuados intlShapedGates = Puertas Moldeadas # # TemplateOptions.java # templateTitle = Plantilla templateHelp = Seleccionar la plantilla actual templatePlainOption = Plantilla Por Defecto templateEmptyOption = Plantilla Vaca templateCustomOption = Especificar Plantilla: templateSelectButton = Seleccionar... templateErrorMessage = No se pudo cargar la plantilla: %s templateErrorTitle = Error Cargando Plantilla selectDialogTitle = Seleccionar Plantilla selectDialogButton = Seleccionar accelNone = Nada # # ToolOptions.java # showGhostsLabel = Mostrar Sombras logisim-2.7.1/resources/logisim/es/opts.properties0000644000175000017500000000333711452004274022256 0ustar vincentvincent# # OptionsFrame.java # optionsFrameTitle = Logisim: %s Opciones optionsFrameMenuItem = %s: Opciones revertButton = Restablecer Plantilla closeButton = Cerrar Ventana # # OptionsActions.java # setOptionAction = Establecer %s addMouseMappingAction = Agregar Acciones Al Ratn removeMouseMappingAction = Eliminar Acciones Del Ratn # # CanvasOptions.java # canvasTitle = Pizarra De Trabajo canvasHelp = Editar opciones que afectan al comportamiento del rea de dibujo. canvasShowGrid = Mostrar Cuadrcula canvasPrinterView = Vista De Impresin canvasShowHalo = Mostrar Aureola canvasShowTips = Mostrar Aclaraciones Para Los Componentes canvasZoom = Factor Del Zoom # # SimulateOptions.java # simulateTitle = Simulacin simulateHelp = Configurar el mecanismo para simular el comportamiento del circuito. simulateLimit = Iteraciones Hasta Oscilacin simulateRandomness = Aadir Ruido A Los Retardos De Los Componentes # # MouseOptions.java # mouseTitle = Ratn mouseHelp = Editar las herramientas asociadas con los botones del ratn. mouseMapNone = No Hay Herramientas Seleccionadas mouseMapText = Haz Click Aqu Con El Botn Adecuado mouseMapText2 = Para Asociarle %s mouseRemoveButton = Eliminar # # ToolbarOptions.java # toolbarTitle = Barra De Herramientas toolbarHelp = Editar las herramientas de la barra de herramientas toolbarAddTool = Aadir Herramienta toolbarAddSeparator = Aadir Separador toolbarMoveUp = Mover Arriba toolbarMoveDown = Mover Abajo toolbarRemove = Eliminar # # ToolbarActions.java # toolbarAddAction = Aadir Herramienta toolbarRemoveAction = Eliminar Botn De La Barra De Herramientas toolbarMoveAction = Mover Botn De La Barra De Herramientas toolbarInsertSepAction = Insertar Separador toolbarRemoveSepAction = Eliminar Separador logisim-2.7.1/resources/logisim/es/menu.properties0000644000175000017500000000672011452004274022234 0ustar vincentvincent# # MenuEdit.java # editMenu = Editar editCantUndoItem = No Es Posible Deshacer editUndoItem = Deshacer %s editCutItem = Cortar editCopyItem = Copiar editPasteItem = Pegar editClearItem = Eliminar editSelectAllItem = Seleccionar Todo # # MenuFile.java # fileMenu = Archivo fileNewItem = Nuevo fileOpenItem = Abrir... fileCloseItem = Cerrar fileSaveItem = Guardar fileSaveAsItem = Guardar Como... fileExportGifItem = Exportar Como GIF... filePrintItem = Imprimir... filePreferencesItem = Preferencias... fileQuitItem = Salir # # MenuProject.java # projectMenu = Proyecto projectAddCircuitItem = Aadir Circuito... projectLoadLibraryItem = Cargar Librera projectLoadBuiltinItem = Librera Incorporada... projectLoadLogisimItem = Librera Logisim... projectLoadJarItem = Librera JAR... projectUnloadLibraryItem = Descargar Librera projectUnloadLibrariesItem = Descargar Libreras... projectAnalyzeCircuitItem = Analizar Circuito projectRenameCircuitItem = Renombrar Circuito... projectSetAsMainItem = Seleccionar Como Circuito Principal projectRemoveCircuitItem = Eliminar Circuito projectOptionsItem = Opciones... # # MenuSimulate.java # simulateMenu = Simular simulateRunItem = Simulacin Conectada simulateResetItem = Resetear Simulacin simulateTickOnceItem = Conmutar Reloj simulateTickItem = Activar Reloj simulateTickFreqMenu = Seleccionar Frecuencia Reloj simulateTickFreqItem = %s Hz simulateUpStateMenu = Volver A simulateDownStateMenu = Ir A simulateLogItem = Registro... # # MenuHelp.java # helpMenu = Ayuda helpTutorialItem = Tutorial helpGuideItem = Manual Del Usuario helpLibraryItem = Referencia De Las Libreras helpAboutItem = Acerca De... helpNotFoundError = Informacin de ayuda no encontrada. helpUnavailableError = No se puede cargar la ayuda. helpDisplayError = No se puede mostrar la ayuda. # # Popups.java # projMenu = Proyecto libMenu = Librera circuitMenu = Circuito projectViewCircuitItem = Ver Circuito projectReloadLibraryItem = Recargar Librera # # ProjectCircuitActions.java # circuitNameDialogTitle = Especificar Nombre Del Circuito circuitNamePrompt = Nombre Del Circuito: circuitNameMissingError = Es necesario un nombre para todos los circuitos. circuitNameDuplicateError = No pueden existir dos circuitos con el mismo nombre. circuitRemoveErrorTitle = El Circuito No Se Puede Eliminar circuitRemoveLastError = La librera debe contener al menos un circuito. circuitRemoveUsedError = El circuito est siendo utilizado en otros circuitos, no se puede eliminar. analyzeErrorTitle = No Se Puede Analizar analyzeMultibitInputError = El anlisis no se puede llevar a cabo con entradas multibit. analyzeMultibitOutputError = El anlisis no se puede llevar a cabo con salidas multibit. analyzeTooManyInputsError = El anlisis no se puede llevar cabo con mas de %s entradas. analyzeTooManyOutputsError = El anlisis no se puede llevar a cabo con mas de %s salidas. analyzeNoExpressionTitle = Expresin No Definida # # ProjectLibraryActions.java # loadBuiltinErrorTitle = No Se Puede Cargar La Librera Incorporada loadBuiltinNoneError = Todas las libreras incorporadas ya estan cargadas. loadBuiltinDialogTitle = Cargar Una Librera Incorporada loadLogisimDialogTitle = Cargar Un Archivo Logisim loadJarDialogTitle = Cargar Un Archivo JAR jarClassNamePrompt = Nombre De La Clase: jarClassNameTitle = Introducir Una Clase JAR unloadLibrariesDialogTitle = Seleccionar Libreras Para Descargar unloadErrorTitle = No Se Puede Eliminar La Librera unloadNoneError = Todas las libreras abiertas estan en uso. logisim-2.7.1/resources/logisim/es/log.properties0000644000175000017500000000225111452004274022044 0ustar vincentvincent# # OptionsFrame.java # logFrameTitle = Logisim: Registro %s de %s logFrameMenuItem = %s: Registro closeButton = Cerrar Ventana # # SelectionPanel.java # # Review selectionChangeBase # selectionTab = Seleccin selectionHelp = Seleccionar que valores de los componentes son registrados. selectionAdd = Aadir >> selectionChangeBase = Cambiar Base selectionMoveUp = Mover Arriba selectionMoveDown = Mover Abajo selectionRemove = << Eliminar # # TablePanel.java # tableTab = Tabla tableHelp = Ver valores registrados recientemente. tableEmptyMessage = La seleccin est vaca. # # FilePanel.java # fileTab = Archivo fileHelp = Configurar fichero de salida. fileEnabled = Fichero de salida habilitado. fileDisabled = Fichero de salida deshabilitado. fileEnableButton = Habilitar fileDisableButton = Deshabilitar fileLabel = Archivo: fileSelectButton = Seleccionar... fileHeaderCheck = Incluir Lnea De Cabecera fileCannotWriteTitle = Archivo No Disponible fileCannotWriteMessage = No tiene permiso para escribir en "%s." fileExistsTitle = Archivo Ya Existente fileExistsMessage = El archivo "%s" ya existe. fileOverwriteOption = Sobreescribir fileAppendOption = Aadir fileCancelOption = Cancelar logisim-2.7.1/resources/logisim/es/hex.properties0000644000175000017500000000130511452004274022046 0ustar vincentvincent# # HexFrame.java # hexFrameTitle = Logisim: Editor Hex hexFrameMenuItem = Editor Hex hexPasteErrorTitle = Error Al Pegar hexPasteSizeError = La regin para pegar debe ser del mismo tamao que el sujetapapeles. hexOpenErrorTitle = Error Al Abrir hexSaveErrorTitle = Error Al Salvar openButton = Abrir... saveButton = Salvar... closeButton = Cerrar Ventana # # HexFile.java # hexFileOpenError = No se pudo abrir el archivo. hexFileReadError = Error leyendo fichero. hexFileWriteError = Error escribiendo fichero. hexHeaderFormatError = El archivo imagen tiene un formato de cabecera invlido. hexNumberFormatError = Archivo imagen con contenidos invlidos. hexFileSizeError = Imagen con demasiada informacin. logisim-2.7.1/resources/logisim/es/gui.properties0000644000175000017500000000521211452004274022047 0ustar vincentvincent# # gui/AttributeTable.java # attributeDialogTitle = Seleccionar Valor changeAttributeAction = Cambiar Atributo attributeChangeInvalidError = Atributo no modificado porque los cambios solicitados no son vlidos attributeChangeInvalidTitle = Valor No Vlido cannotModifyCircuitError = Este circuito no puede ser modificado. # # gui/Canvas.java # canvasWidthError = Anchos incompatibles canvasOscillationError = Osciacin evidente # # gui/Frame.java # titleCircFileKnown = Logisim: %s de %s titleFileKnown = Logisim: %s confirmDiscardMessage = Qu quieres hacer con los cambios sin salvar en %s? confirmCloseTitle = Confirmar Cerrar saveOption = Salvar discardOption = Descartar cancelOption = Cancelar # # gui/ExportGif.java # no-vacos exportGifSelect = Exportar GIF labelCircuits = Circuitos: labelScale = Tamao Imagen: labelPrinterView = Vista De La Impresora: #removed exportGifEmptyMessage = No se puede exportar un circuito vaco. exportEmptyCircuitsTitle = No Se Puede Exportar exportEmptyCircuitsMessage = No hay circuitos disponibles para exportar. exportImageDirectorySelect = Seleccionar Directorio De Exportacin exportImageFileSelect = Seleccionar Archivo De Exportacin exportImageButton = Exportar exportGifFilter = Archivos GIF (*.gif) exportNewDirectoryErrorTitle = No Se Puede Crear El Directorio exportNewDirectoryErrorMessage = El directorio no ha podido ser creado. couldNotCreateGifImage = La imagen GIF no ha podido ser creada. couldNotCreateGifFile = El achivo GIF no ha podido ser creado. confirmOverwriteMessage = El archivo ya existe. Quieres rescribirlo? confirmOverwriteTitle = Confirmar Reescritura exportGifProgress = Generando GIF... # # gui/Print.java # no-vacos labelRotateToFit = Rotar Hasta Encajar: labelHeader = Cabecera: printEmptyCircuitsTitle = No Se Puede Imprimir printEmptyCircuitsMessage = No hay circuitos disponibles para imprimir. printParmsTitle = Imprimir Parmetros printError = Error al imprimir: %s printErrorTitle = Error Al Imprimir # # gui/SelectionActions.java # moveSelectionAction = Mover Seleccin clearSelectionAction = Limpiar Seleccin cutSelectionAction = Cortar Seleccin copySelectionAction = Copiar Seleccin pasteClipboardAction = Pasar Al Portapapeles # # gui/ToolActions.java # changeToolAttrAction = Cambiar El Atributo De Herramienta # # gui/Toolbar.java # toolbarDefaultToolTip = Pulsar el botn derecho del ratn sobre herramientas en el panel del explorador para aadir una barra de herramientas. # # gui/ProjectToolbar.java # projectAddCircuitTip = Aadir circuito... projectRenameCircuitTip = Renombrar ircuito projectRemoveCircuitTip = Eliminar circuito # # gui/ZoomControl.java # zoomShowGrid = Mostrar cuadrcula logisim-2.7.1/resources/logisim/es/file.properties0000644000175000017500000000726511452004274022214 0ustar vincentvincent# # lib/LogisimFile.java # fileDuplicateError = Error duplicando fichero : %s defaultProjectName = SinTtulo unloadUsedError = El circuito '%s' utiliza componentes de la librera. unloadToolbarError = La librera contiene elementos que ya estn en la barra de herramientas. unloadMappingError = La librera contiene elementos que ya han sido asociados al ratn. # # lib/LogisimFileActions.java # addCircuitAction = Aadir Circuito removeCircuitAction = Eliminar Circuito moveCircuitAction = Reordenar Circuitos loadLibraryAction = Cargar Librera loadLibrariesAction = Cargar Libreras unloadLibraryAction = Descargar Librera unloadLibrariesAction = Descargar Librera setMainCircuitAction = Seleccionar Circuito Principal revertDefaultsAction = Restaurar Valores Por Defecto # # gui/Loader.java # logisimFileFilter = Proyecto Logisim (*.circ) jarFileFilter = Archivos Java (*.jar) fileDescriptorUnknownError = Descriptor desconocido para %s. fileDescriptorError = Descriptor de la librera desconocido %s. fileTypeError = La librera Logisim contiene un tipo desconocido %s (%s) fileBuiltinMissingError = La librera incorporada %s no es vlida en esta versin. fileLibraryMissingError = Falta el archivo `%s' requerido por la librera. Por favor seleccione el archivo de la siguiente pantalla. fileLibraryMissingTitle = Ubicar `%s' fileLibraryMissingButton = Seleccionar fileLoadCanceledError = Carga cancelada por el usuario. [1] fileMessageTitle = Mensaje De Archivo fileErrorTitle = Error De Archivo fileSaveErrorTitle = No Se Puede Salvar El Archivo fileSaveError = No se pudo salvar el archivo: %s fileSaveCloseError = No se pudo cerrar el archivo: %s fileCircularError = No se puede crear una referencia circular. (El archivo est siendo utilizado por la librera %s.) unknownLibraryFileError = No existe un archivo que corresponda a %s. logisimCircularError = El archivo %s contiene una referencia a s mismo. logisimLoadError = Error encontrado abriendo %s: %s jarNotOpenedError = El archivo JAR no se ha podido abrir. jarClassNotFoundError = La clase %s no ha sido encontrada en el archivo JAR. jarClassNotLibraryError = `%s' no es un nombre de librera vlido. jarLibraryNotCreatedError = La librera %s no ha podido ser instanciada. # # lib/Options.java # showGridOption = Mostrar Cuadrcula printPreviewOption = Imprimir Vista Negra showGhostsOption = Mostrar Sombras showHaloOption = Mostrar Aureola zoomFactorOption = Factor Del Zoom simLimitOption = Lmite De La Simulacin simRandomOption = Aleatoriedad De La Simulacin # # lib/XmlReader.java # libNameMissingError = falta el nombre de la librera libDescMissingError = falta el descriptor de la librera libMissingError = librera `%s' no encontrada toolNameMissingError = falta el nombre de una herramienta #removed toolMissingError = herramienta %s no encontrada mappingMissingError = falta el modificador del mapeado del ratn mappingBadError = modificador del mapeado del ratn `%s' invlido circNameMissingError = falta el nombre del circuito compUnknownError = componente `%s' no encontrado compNameMissingError = falta el nombre del componente compAbsentError = falta el componente `%s'de la librera `%s' compLocMissingError = direccin del componente `%s' no est especificada compLocInvalidError = direccin del componente `%s' invlida (%s) wireStartMissingError = no definido comienzo del cable wireStartInvalidError = comienzo del cable sin formato wireEndMissingError = fin de cable no definido wireEndInvalidError = fin de cable sin formato attrNameMissingError = falta el nombre del atributo #removed attrValueMissingError = falta el valor del atributo para %s attrValueInvalidError = el valor del atributo (%s) no es vlido para %s xmlFormatError = XML error de formato : %s logisim-2.7.1/resources/logisim/es/draw.properties0000644000175000017500000000000011536416130022207 0ustar vincentvincentlogisim-2.7.1/resources/logisim/es/data.properties0000644000175000017500000000067411452004274022203 0ustar vincentvincent# # data/Attributes.java # booleanTrueOption = S booleanFalseOption = No # # data/Direction.java # directionEastOption = Este directionWestOption = Oeste directionNorthOption = Norte directionSouthOption = Sur directionNorthVertical = Arriba directionSouthVertical = Abajo directionEastVertical = Derecha directionWestVertical = Izquierda # # data/Value.java # valueErrorSymbol = E valueUnknownSymbol = x valueError = Error valueUnknown = ??? logisim-2.7.1/resources/logisim/es/comp.properties0000644000175000017500000000000011452004274022207 0ustar vincentvincentlogisim-2.7.1/resources/logisim/es/circuit.properties0000644000175000017500000000334011452004274022725 0ustar vincentvincent# # Analyze.java # defaultInputLabels = a,b,c,d,e,f,g,h defaultOutputLabels = x,y,z,u,v,w,s,t # # AnalyzeException.java # analyzeCircularError = Detectada referencia circular; calculando tabla de verdad en su lugar. analyzeConflictError = Detectadas salidas conflictivas; calculando tabla de verdad en su lugar. analyzeCannotHandleError = Calculando la tabla de verdad en lugar de la expresin debido a %s. # # circuit/Circuit.java # circuitName = Nombre Del Circuito # # circuit/CircuitActions.java # renameCircuitAction = Renombrar El Circuito changeAttributeAction = Cambiar El Atributo # # circuit/ComponentAction.java # unknownComponentAction = Accin Del Componente # # circuit/ComponentsAdd.java # addWireAction = Aadir Cable addComponentAction = Aadir %s addWiresAction = Aadir Cables addComponentsAction = Aadir Componentes # # circuit/ComponentsRemove.java # removeWireAction = Eliminar Cable removeComponentAction = Eliminar %s removeWiresAction = Eliminar Cables removeComponentsAction = Eliminar Componentes # # circuit/Subcircuit.java # subcircuitViewItem = Vista %s subcircuitCircuitTip = %s subcircuito # # circuit/SplitterClass.java # # splitter component name splitterComponent = Separador # splitter end tool tips splitterCombinedTip = Extremo agrupado del separador splitterSplit0Tip = No hay bits del extremo agrupado splitterSplit1Tip = Bit %s del extremo agrupado splitterSplitManyTip = Bits %s del extremo agrupado # splitter attributes splitterBitWidthAttr = Bits De Entrada splitterFanOutAttr = Fan Out splitterBitAttr = Bit %s splitterBitNone = Nada # # circuit/WireClass.java # wireComponent = Cable wireLengthAttr = Longitud wireDirectionAttr = Direccin wireDirectionHorzOption = Horizontal wireDirectionVertOption = Vertical logisim-2.7.1/resources/logisim/es/analyze.properties0000644000175000017500000000562411452004274022735 0ustar vincentvincent# # gui/Analyzer.java # analyzerWindowTitle = Anlisis Combinacional inputsTab = Entradas outputsTab = Salidas tableTab = Tabla expressionTab = Expresin minimizedTab = Minimizado inputsTabTip = Ver y editar el conjunto de variables de entrada. outputsTabTip = Ver y editar el conjunto de variables de salida. tableTabTip = Ver y modificar la tabla de verdad. expressionTabTip = Ver y modificar las expresiones de salida. minimizedTabTip = Ver las expresiones minimizadas correspondientes a la tabla de verdad. # # gui/BuildCircuitButton.java # buildCircuitButton = Crear Circuito buildProjectLabel = Proyecto Destino: buildNameLabel = Nombre Circuito: buildTwoInputsLabel = Slo Puertas Con Dos Entradas buildNandsLabel = Slo Puertas NAND buildDialogTitle = Crear Circuito buildDialogErrorTitle = No Se Pudo Crear El Circuito buildNeedProjectError = Debes seleccionar un proyecto destino. buildNeedCircuitError = Debes especificar un nobre de circuito. buildConfirmReplaceMessage = Ests seguro de que deseas reemplazar el circuito %s? buildConfirmReplaceTitle = Confirmar Reemplazar replaceCircuitAction = Reemplazar Circuito # # gui/ExpressionEditorPanel.java # exprClearButton = Limpiar exprRevertButton = Recargar exprEnterButton = Intro # # gui/ExpressionPanel.java # expressionEmpty = (vaco) # # gui/KarnaughMapPanel.java # karnaughNoOutputError = No hay salidas seleccionadas. karnaughTooManyInputsError = Demasiadas entradas por tabla. # # gui/MinimizedTabPanel.java # minimizedSetButton = Fijar Como Expresin # # gui/OutputSelector.java # outputSelectLabel = Salida: # # gui/SimpleTruthTablePanel.java # tableEmptyMessage = (tabla vaca) tableNullHeader = (ninguno) # # gui/TableTabClip.java # clipPasteErrorTitle = Error Al Pegar clipPasteSizeError = La regin para pegar debe ser del mismo tamao que el sujetapapeles. #TODO clipPasteSupportedError = The clipboard contents cannot be pasted into the editor. #TODO clipPasteEndError = The clipboard goes beyond the end of the table. # # gui/VariableListPanel.java # variableRemoveButton = Eliminar variableMoveUpButton = Mover Arriba variableMoveDownButton = Mover Abajo variableAddButton = Aadir variableRenameButton = Cambiar Nombre variableStartError = El nombre debe comenzar con una letra. variablePartError = El nombre no puede contener '%s'. variableDuplicateError = El nombre duplica una variable ya existente. variableMaximumError = (Alcanzado mximo tamao de %s.) # # model/Entry.java # busError = Conflicto de valores de salida en circuito. oscillateError = El circuito oscila. # # model/Parser.java # implicitAndOperator = (Implcito AND) invalidCharacterError = Caracteres desconocidos: %s missingLeftOperandError = Falta el operando izquierdo del operador %s. missingRightOperandError = Falta el operando derecho del operador %s. lparenMissingError = Falta apertura de parntesis. rparenMissingError = Falta cierre de parntesis. badVariableName = %s no es una variable de entrada. logisim-2.7.1/resources/logisim/en/0000755000175000017500000000000011541271704017143 5ustar vincentvincentlogisim-2.7.1/resources/logisim/en/util.properties0000644000175000017500000000176611524651550022252 0ustar vincentvincent# # util/FontUtil.java # fontPlainStyle = Plain fontBoldStyle = Bold fontItalicStyle = Italic fontBoldItalicStyle = Bold Italic # # util/InputEventUtil.java # metaMod = Meta altMod = Alt ctrlMod = Ctrl shiftMod = Shift button1Mod = Button1 button2Mod = Button2 button3Mod = Button3 # # util/JDialogOk.java # dlogOkButton = OK dlogCancelButton = Cancel # # util/LocaleManager.java # # If the user selects to "replace accented characters" in the International # dialog, the program will replace accented characters based on # the slash-delimited character-string pairs in accentReplacements. # For example, with German, accentReplacements might be # " oe/ Oe/ ue/ ue/ ss" so that umlauted o's and u's are # replaced, as would be essets. accentReplacements = # # util/GifEncoder.java # grabberError = Grabber returned false: manyColorError = Too many colors. # # util/WindowMenu.java # windowMenu = Window windowMinimizeItem = Minimize windowZoomItem = Maximize windowZoomItemMac = Zoom windowCloseItem = Close logisim-2.7.1/resources/logisim/en/tools.properties0000644000175000017500000000244711527054314022430 0ustar vincentvincent# # tools/AddTool.java # addToolText = Add %s negativeCoordError = Component cannot have negative coordinates. cannotModifyError = Cannot modify circuit. circularError = Cannot create circular reference. exclusiveError = Conflicting component already there. addComponentAction = Add %s # # tools/MenuTool.java # menuTool = Menu Tool menuToolDesc = View component menus compDeleteItem = Delete compShowAttrItem = Show Attributes selDeleteItem = Delete Selection selCutItem = Cut Selection selCopyItem = Copy Selection removeComponentAction = Remove %s # # tools/PokeTool.java # pokeTool = Poke Tool pokeToolDesc = Change values within circuit # # tools/SelectTool.java # selectTool = Select Tool selectToolDesc = Edit circuit components moveWorkingMsg = Computing connections... # # tools/SelectionAttributeChange.java # selectionRefaceAction = Change Selection Facing # # tools/key/KeyConfigurationAction # changeComponentAttributesAction = Change Component Attributes # # tools/TextTool.java # textTool = Text Tool textToolDesc = Edit text in circuit # # tools/EditTool.java # editTool = Edit Tool editToolDesc = Edit selection and add wires # # tools/WiringTool.java # wiringTool = Wiring Tool wiringToolDesc = Add wires to circuit addWireAction = Add Wire addWiresAction = Add Wires shortenWireAction = Shorten Wire logisim-2.7.1/resources/logisim/en/std.properties0000644000175000017500000003465511537604344022075 0ustar vincentvincent# # std/Builtin.java # builtinLibrary = Built-In # instance/StdAttr.java stdFacingAttr = Facing stdDataWidthAttr = Data Bits stdTriggerAttr = Trigger stdTriggerRising = Rising Edge stdTriggerFalling = Falling Edge stdTriggerHigh = High Level stdTriggerLow = Low Level stdLabelAttr = Label stdLabelFontAttr = Label Font # instance/InstanceTextField.java changeLabelAction = Change Label # # std/base/Base.java # baseLibrary = Base # std/base/BitExtender.java extenderComponent = Bit Extender extenderInAttr = Bit Width In extenderOutAttr = Bit Width Out extenderTypeAttr = Extension Type extenderOneType = One extenderZeroType = Zero extenderSignType = Sign extenderInputType = Input extenderMainLabel = extend extenderOneLabel = 1 extenderZeroLabel = 0 extenderSignLabel = sign extenderInputLabel = input # std/base/Clock clockComponent = Clock clockHighAttr = High Duration clockLowAttr = Low Duration clockDurationValue = %s Ticks clockDurationOneValue = 1 Tick durationSmallMessage = Value must be at least %s. durationLargeMessage = Value must be %s or less. freqInvalidMessage = Value is not a valid integer # std/base/Pin pinComponent = Pin pinInputName = Input pinOutputName = Output pinThreeStateAttr = Three-state? pinOutputAttr = Output? pinPullAttr = Pull Behavior pinPullNoneOption = Unchanged pinPullUpOption = Pull Up pinPullDownOption = Pull Down pinLabelLocAttr = Label Location pinInputToolTip = Add an input pin pinOutputToolTip = Add an output pin pinFrozenTitle = Pin Attached To Supercircuit. pinFrozenQuestion = The pin is tied to the supercircuit's state. Create a new circuit state? # std/base/Probe probeComponent = Probe # std/base/PullResistor pullComponent = Pull Resistor pullTypeAttr = Pull Direction pullZeroType = Zero pullOneType = One pullErrorType = Error # std/base/Text.java textComponent = Label textTextAttr = Text textFontAttr = Font textHorzAlignAttr = Horizontal Alignment textHorzAlignLeftOpt = Left textHorzAlignRightOpt = Right textHorzAlignCenterOpt = Center textVertAlignAttr = Vertical Alignment textVertAlignTopOpt = Top textVertAlignBaseOpt = Base textVertAlignBottomOpt = Bottom textVertAlignCenterOpt = Center # std/base/Tunnel.java tunnelComponent = Tunnel # # std/Wiring.java # wiringLibrary = Wiring wiringGateAttr = Gate Location wiringGateBottomRightOption = Bottom/Right wiringGateTopLeftOption = Top/Left # std/wiring/Transistor.java transistorComponent = Transistor transistorTypeAttr = Type transistorTypeP = P-Type transistorTypeN = N-Type # std/wiring/TransmissionGate.java transmissionGateComponent = Transmission Gate # std/wiring/Power.java powerComponent = Power # std/wiring/Ground.java groundComponent = Ground # # std/Gates.java # gatesLibrary = Gates gateSizeAttr = Gate Size gateSizeNarrowOpt = Narrow gateSizeNormalOpt = Medium gateSizeWideOpt = Wide gateNegateAttr = Negate %s gateInputsAttr = Number Of Inputs gateOutput01 = 0/1 gateOutput0Z = 0/floating gateOutputZ1 = floating/1 gateOutputAttr = Output Value xorBehaviorAttr = Multiple-Input Behavior xorBehaviorOne = When one input is on xorBehaviorOdd = When an odd number are on # std/Constant.java constantComponent = Constant constantValueAttr = Value # std/NotGate.java notGateComponent = NOT Gate # std/Buffer.java bufferComponent = Buffer # std/AndGate.java andGateComponent = AND Gate # std/NandGate.java nandGateComponent = NAND Gate # std/NorGate.java norGateComponent = NOR Gate # std/OrGate.java orGateComponent = OR Gate # std/XorGate.java xorGateComponent = XOR Gate # std/XnorGate.java xnorGateComponent = XNOR Gate # std/OddParityGate.java oddParityComponent = Odd Parity # std/EvenParityGate.java evenParityComponent = Even Parity # std/ControlledBuffer.java controlledBufferComponent = Controlled Buffer controlledInverterComponent = Controlled Inverter controlledControlOption = Control Line Location controlledLeftHanded = Left-Handed controlledRightHanded = Right-Handed # # std/Memory.java # memoryLibrary = Memory memEnableLabel = en # AbstractFlipFlop.java flipFlopClockTip = Clock: state updates on trigger flipFlopQTip = Current flip-flop state flipFlopNotQTip = Complement of current flip-flop state flipFlopResetTip = Clear: When 1, pin state to 0 asynchronously flipFlopPresetTip = Preset: When 1, pin state to 1 asynchronously flipFlopEnableTip = Enable: When 0, clock triggers are ineffective # std/Counter.java counterComponent = Counter counterMaxAttr = Maximum Value counterGoalAttr = Action On Overflow counterGoalWrap = Wrap around counterGoalStay = Stay at value counterGoalContinue = Continue counting counterGoalLoad = Load next value counterQTip = Output: current value of counter counterClockTip = Clock: value may update on trigger counterDataTip = Data: value to load into counter counterLoadTip = Load: when 1, loads from data input (if Count = 0) or decrements counterEnableTip = Count: when 1, counter increments (or decrements if Load = 1) counterResetTip = Clear: when 1, resets to 0 asynchronously counterCarryTip = Carry: is 1 when value reaches maximum (minimum if decrementing) counterEnableLabel = ct counterLabel = ctr # std/DFlipFlop.java dFlipFlopComponent = D Flip-Flop # std/TFlipFlop.java tFlipFlopComponent = T Flip-Flop # std/JKFlipFlop.java jkFlipFlopComponent = J-K Flip-Flop # std/SRFlipFlop.java srFlipFlopComponent = S-R Flip-Flop # std/Random.java randomSeedAttr = Seed randomComponent = Random Generator randomQTip = Output: current number in sequence randomClockTip = Clock: value may update on trigger randomNextTip = Enable: steps to next in sequence on clock trigger randomResetTip = Clear: When 1, resets to initial seed asynchronously # std/Register.java registerComponent = Register registerQTip = Output: register's current value registerDTip = Data: value stored on clock trigger registerClkTip = Clock: value updates on trigger registerClrTip = Clear: When 1, pin value to 0 asynchronously registerEnableTip = Enable: When 0, clock triggers are ineffective registerLabel = reg registerWidthLabel = (%sb) # std/RamFactory.java ramComponent = RAM # std/RomFactory.java romComponent = ROM romContentsAttr = Contents romContentsValue = (click to edit) romChangeAction = Edit ROM Contents # std/Ram.java ramAddrWidthAttr = Address Bit Width ramDataWidthAttr = Data Bit Width ramDataLabel = D ramAddrLabel = A ramWELabel = str ramCSLabel = sel ramOELabel = ld ramClrLabel = clr ramGigabyteLabel = %sGB RAM ramMegabyteLabel = %sMB RAM ramKilobyteLabel = %sKB RAM ramByteLabel = %sB RAM romGigabyteLabel = %sGB ROM romMegabyteLabel = %sMB ROM romKilobyteLabel = %sKB ROM romByteLabel = %sB ROM memDataTip = Data: value loaded from address memAddrTip = Address: location accessed in memory memCSTip = Chip select: 0 disables component ramClkTip = Clock: memory value updates on rise from 0 to 1 ramOETip = Load: if 1, load memory to output ramWETip = Store: if 1, store input to memory ramClrTip = Clear: when 1, resets contents to 0 asynchronously ramBusTip = Data: value loaded or stored at address ramInTip = Input: value to be stored at address ramBusAttr = Data Interface ramBusSynchCombined = One synchronous load/store port ramBusAsynchCombined = One asynchronous load/store port ramBusSeparate = Separate load and store ports ramEditMenuItem = Edit Contents... ramClearMenuItem = Clear Contents ramLoadMenuItem = Load Image... ramSaveMenuItem = Save Image... ramConfirmClearTitle = Confirm Clear ramConfirmClearMsg = Are you sure you wish to zero out the memory? ramLoadDialogTitle = Load RAM Image ramLoadErrorTitle = Load Error ramSaveDialogTitle = Save RAM Image ramSaveErrorTitle = Save Error # std/memory/ShiftRegister.java shiftRegisterComponent = Shift Register shiftRegisterLabel1 = shift reg shiftRegisterLabel2 = %sx%s shiftRegLengthAttr = Number of Stages shiftRegParallelAttr = Parallel Load shiftRegShiftTip = Shift: shift is disabled when 0 shiftRegClockTip = Clock: values may update on trigger shiftRegClearTip = Clear: when 1, resets all to 0 asynchronously shiftRegInTip = Input: value to be shifted into first stage shiftRegOutTip = Output: is content of last stage shiftRegLoadTip = Load: when 1 (with shift = 0), all stages load from inputs # # std/Plexers.java # plexerLibrary = Plexers plexerSelectBitsAttr = Select Bits plexerThreeStateAttr = Three-state? plexerDisabledAttr = Disabled Output plexerDisabledFloating = Floating plexerDisabledZero = Zero plexerEnableAttr = Include Enable? plexerSelectLocAttr = Select Location plexerSelectTopRightOption = Top/Right plexerSelectBottomLeftOption = Bottom/Left # std/Multiplexer.java multiplexerComponent = Multiplexer multiplexerSelectTip = Select: identifies which input becomes output multiplexerEnableTip = Enable: when not 0, output is the selected input multiplexerInTip = Input %s multiplexerOutTip = Output # std/Demultiplexer.java demultiplexerComponent = Demultiplexer demultiplexerSelectTip = Select: identifies which output receives input demultiplexerEnableTip = Enable: when not 0, selected output is input demultiplexerInTip = Input demultiplexerOutTip = Output %s # std/Decoder.java decoderComponent = Decoder decoderSelectTip = Select: identifies which output is 1 decoderEnableTip = Enable: when not 0, selected output is 1 decoderOutTip = Output %s # std/plexers/PriorityEncoder.java priorityEncoderComponent = Priority Encoder priorityEncoderInTip = Input %s priorityEncoderOutTip = Output: address of highest-indexed 1 input priorityEncoderEnableInTip = Enable Input: 0 disables the component priorityEncoderEnableOutTip = Enable Output: 1 if enabled and no inputs are 1 priorityEncoderGroupSignalTip = Group Select: 1 if enabled and any input is 1 # std/BitSelector.java bitSelectorComponent = Bit Selector bitSelectorGroupAttr = Output Bits bitSelectorOutputTip = Output: value of selected group of bits from data bitSelectorDataTip = Data bitSelectorSelectTip = Select: identifies which group from data is selected # # arith/Arithmetic.java # arithmeticLibrary = Arithmetic # arith/Adder.java adderComponent = Adder adderInputTip = Input: one of the numbers to add adderOutputTip = Output: the sum of the inputs (plus carry in) adderCarryInTip = Carry In: if 1, an additional 1 is added to output adderCarryOutTip = Carry Out: 1 if the sum overflows the available bits # arith/Subtractor.java subtractorComponent = Subtractor subtractorMinuendTip = Minuend: the number from which to subtract subtractorSubtrahendTip = Subtrahend: the number to subtract from the minuend subtractorOutputTip = Output: the difference of the minuend and the subtrahend subtractorBorrowInTip = Borrow In: if 1, output is decreased by 1 subtractorBorrowOutTip = Borrow Out: 1 if the difference yields a negative value # arith/Multiplier.java multiplierComponent = Multiplier multiplierInputTip = Input: one of the numbers to multiply multiplierOutputTip = Output: the product of the inputs, plus the carry in multiplierCarryInTip = Carry In: an amount to be added into the output multiplierCarryOutTip = Carry Out: the upper bits of the product # arith/Divider.java dividerComponent = Divider dividerUpperInput = upper dividerRemainderOutput = rem dividerDividendLowerTip = Dividend Lower: the lower half of the number to divide dividerDividendUpperTip = Dividend Upper: the upper half of the number to divide dividerDivisorTip = Divisor: the number by which to divide dividerOutputTip = Output: the result of dividing the dividend by the divisor dividerRemainderTip = Remainder: the remainder (dividend - output * divisor) # arith/Negator.java negatorComponent = Negator negatorInputTip = Input: the number to be negated negatorOutputTip = Output: the two's-complement negation of the input # arith/Comparator.java comparatorComponent = Comparator comparatorType = Numeric Type unsignedOption = Unsigned twosComplementOption = 2's Complement comparatorInputATip = A: the number preceding the comparison operation comparatorInputBTip = B: the number following the comparison operation comparatorLessTip = Less: 1 if A is less than B comparatorEqualTip = Equal: 1 if A is equal to B comparatorGreaterTip = Greater: 1 if A is greator than B # arith/Shifter.java shifterComponent = Shifter shifterShiftAttr = Shift Type shiftLogicalLeft = Logical Left shiftLogicalRight = Logical Right shiftArithmeticRight = Arithmetic Right shiftRollLeft = Rotate Left shiftRollRight = Rotate Right shifterDistanceTip = Distance: how far to shift the input shifterInputTip = Input: bits to be shifted shifterOutputTip = Output: result of shifting the input # arith/BitAdder.java bitAdderComponent = Bit Adder bitAdderInputTip = Input: the bits to be counted bitAdderOutputManyTip = Output: how many input bits are 1 # arith/BitFinder.java bitFinderComponent = Bit Finder bitFinderFindLabel = find bitFinderHighLabel = high bitFinderLowLabel = low bitFinderHighOption = Highest-order %s bitFinderLowOption = Lowest-order %s bitFinderTypeAttr = Type bitFinderIndexHighTip = Index: index of input's highest-order %s bitFinderIndexLowTip = Index: index of input's lowest-order %s bitFinderPresentTip = Present: 1 if input contains a %s bitFinderInputTip = Input: the bits to be searched # # io # # io/Io.java ioLibrary = Input/Output ioLabelCenter = Center ioBitWidthAttr = Bit Width ioColorAttr = Color ioLabelLocAttr = Label Location ioLabelColorAttr = Label Color ioActiveAttr = Active On High? # io/Button.java buttonComponent = Button # io/Joystick.java joystickComponent = Joystick # io/Keyboard.java keyboardComponent = Keyboard keybDesc = keyboard (buffer cap. %s) keybBufferLengthAttr = Buffer Length keybClearTip = Clear: 1 empties buffer keybClockTip = Clock: trigger consumes the buffer's front character keybEnableTip = Read enable: 0 disables clock keybAvailTip = Available: 1 when buffer contains characters keybOutputTip = Data: ASCII value of buffer's front character # io/Led.java ledComponent = LED # io/SevenSegment.java sevenSegmentComponent = 7-Segment Display # io/HexDigit.java hexDigitComponent = Hex Digit Display # io/DotMatrix.java dotMatrixComponent = LED Matrix ioMatrixInput = Input Format ioMatrixRows = Matrix Rows ioMatrixCols = Matrix Columns ioOnColor = On Color ioOffColor = Off Color ioBackgroundColor = Background ioMatrixPersistenceAttr = Light Persistence ioMatrixShape = Dot Shape ioInputColumn = Columns ioInputRow = Rows ioInputSelect = Select Rows/Columns ioShapeCircle = Circular ioShapeSquare = Square # io/Tty.java ttyComponent = TTY ttyDesc = TTY (%s rows, %s cols) ttyDescShort = TTY ttyRowsAttr = Rows ttyColsAttr = Columns ttyClearTip = Clear: 1 clears screen ttyClockTip = Clock: trigger adds character on input ttyEnableTip = Write enable: 0 disables clock ttyInputTip = Data: ASCII value of next character to write logisim-2.7.1/resources/logisim/en/start.properties0000644000175000017500000000631311532066744022427 0ustar vincentvincent# # Startup.java # argTwoSubstitutionError = The "-sub" option must be followed by two parameters. argDuplicateSubstitutionError = Cannot substitute the same file multiple times. ttyNeedsFileError = Using "-tty" requires a filename provided on command line. argTtyOption = -tty format run without graphical interface argSubOption = -sub file1 file2 load file replacing library file1 with file2 argLoadOption = -load file load image file into RAM (works with -tty only) loadNeedsFileError = Using "-load" requires a filename provided on command line. loadNeedsTtyError = The "-load" option works only in conjunction with "-tty". loadMultipleError = The "-load" option can be specified only once. ttyFormatError = -tty requires at least one of the following: halt, speed, stats, table, tty argOneTemplateError = Only one template allowed. argUsage = usage: java %s [options] [filenames] argOptionHeader = options: argEmptyOption = -empty use empty template argPlainOption = -plain use standard Logisim template argTemplateOption = -template file use file as template argGatesOption = -gates shaped|rectangular use specified gate style argLocaleOption = -locale str use locale given in str argAccentsOption = -accents yes|no use accented characters or ASCII equivalents argNoSplashOption = -nosplash hides splash screen at startup argVersionOption = -version display version number and exit argHelpOption = -help display this summary and exit argClearOption = -clearprops clear application preferences at startup argGatesOptionError = Argument for -gates option must be "shaped" or "rectangular". argAccentsOptionError = Argument for -accents option must be "yes" or "no". templateMissingError = Template file %s does not exist. templateCannotReadError = No permission to read template file %s. invalidLocaleError = Locale given is not supported. invalidLocaleOptionsHeader = Supported locales: startupCloseButton = Close startupQuitButton = Quit # # SplashScreen.java # progressLibraries = Loading components... progressTemplateCreate = Creating template... progressTemplateOpen = Opening template... progressTemplateLoad = Loading template... progressTemplateClose = Closing template... progressGuiInitialize = Initializing interface... progressFileCreate = Creating file... progressFileLoad = Loading file... progressProjectCreate = Creating project... progressFrameCreate = Creating window... creditsRoleLead = Lead Developer creditsRoleGerman = German Translation creditsRoleGreek = Greek Translation creditsRolePortuguese = Portuguese Translation creditsRoleRussian = Russian Translation creditsRoleTesting = Testing creditsRoleOriginal = Original Version # # TtyInterface.java # ttyLoadError = Error loading circuit file: %s ttySpeedMsg = %s Hz (%s ticks in %s milliseconds) loadNoRamError = No RAM was found for the "-load" option. loadIoError = Error while reading image file ttyNoTtyError = No TTY or Keyboard component was found. ttyHaltReasonPin = halted due to halt pin ttyHaltReasonOscillation = halted due to detected oscillation statsTotalWithout = TOTAL (without project's subcircuits) statsTotalWith = TOTAL (with subcircuits) logisim-2.7.1/resources/logisim/en/proj.properties0000644000175000017500000000154411452004302022224 0ustar vincentvincent# # ProjectActions.java # newCircuitName = main openAlreadyTitle = File Already Open openAlreadyMessage = The file %s, already open, has unsaved changes. openAlreadyCancelOption = Cancel Open openAlreadyLoseChangesOption = Lose Changes openAlreadyNewWindowOption = New Window confirmOverwriteMessage = The file already exists. Do you want to overwrite it? confirmOverwriteTitle = Confirm Overwrite fileOpenError = Could not open file: %s fileOpenErrorTitle = Error During Open templateOpenError = Could not open template: %s templateOpenErrorTitle = Error Loading Template replaceExtensionMessage = Would you like to replace "%s" with Logisim's preferred ".circ" extension? replaceExtensionTitle = Replace Extension confirmQuitTitle = Confirm Quit replaceExtensionReplaceOpt = Replace "%s" replaceExtensionAddOpt = Append "%s" replaceExtensionKeepOpt = Leave Unchangedlogisim-2.7.1/resources/logisim/en/prefs.properties0000644000175000017500000000352511532066756022416 0ustar vincentvincent# # PreferencesFrame.java # preferencesFrameTitle = Logisim: Preferences preferencesFrameMenuItem = Preferences closeButton = Close Window # TemplateOptions.java templateTitle = Template templateHelp = Select the current template templatePlainOption = Plain template templateEmptyOption = Empty template templateCustomOption = Custom template: templateSelectButton = Select... templateErrorMessage = Could not load template: %s templateErrorTitle = Error Loading Template selectDialogTitle = Select Template selectDialogButton = Select # IntlOptions.java intlTitle = International intlHelp = Edit localization preferences intlLocale = Language: intlReplaceAccents = Replace accented characters intlGateShape = Gate shape: shapeShaped = Shaped shapeRectangular = Rectangular shapeDIN40700 = DIN 40700 # WindowOptions.java windowTitle = Window windowHelp = Configure the main editing window windowTickRate = Show tick rate windowToolbarLocation = Toolbar location: windowToolbarHidden = Hidden windowToolbarDownMiddle = Down middle # LayoutOptions.java layoutTitle = Layout layoutHelp = Configure behavior of layout editor layoutAddShowGhosts = Show ghosts while adding layoutPrinterView = Printer view layoutMoveKeepConnect = Keep connections while moving layoutAttributeHalo = Show attribute halo layoutShowTips = Show component tips layoutAddAfter = After adding component: layoutAddAfterUnchanged = Keep at component tool layoutAddAfterEdit = Switch to Edit Tool layoutRadix1 = First radix when wire poked: layoutRadix2 = Second radix when wire poked: # ExperimentalOptions.java experimentTitle = Experimental experimentHelp = Enable features that haven't yet been thoroughly tested accelLabel = Graphics acceleration: accelDefault = Use defaults accelNone = None accelOpenGL = OpenGL accelD3D = Direct 3D accelRestartLabel = Restart Logisim for changes to take effect. logisim-2.7.1/resources/logisim/en/opts.properties0000644000175000017500000000234511455255470022260 0ustar vincentvincent# # OptionsFrame.java # optionsFrameTitle = Logisim: %s Options optionsFrameMenuItem = %s: Options revertButton = Revert All To Template closeButton = Close Window # # OptionsActions.java # setOptionAction = Set %s addMouseMappingAction = Add Mouse Mapping removeMouseMappingAction = Remove Mouse Mapping # # SimulateOptions.java # simulateTitle = Simulation simulateHelp = Configure the engine for simulating circuit behavior. simulateLimit = Iterations until oscillation gateUndefined = Gate output when undefined simulateRandomness = Add noise to component delays # # MouseOptions.java # mouseTitle = Mouse mouseHelp = Edit tools associated with mouse buttons. mouseMapNone = No Tool Selected mouseMapText = Click Using Combination mouseMapText2 = To Map %s mouseRemoveButton = Remove # # ToolbarOptions.java # toolbarTitle = Toolbar toolbarHelp = Edit tools appearing in toolbar. toolbarAddTool = Add Tool toolbarAddSeparator = Add Separator toolbarMoveUp = Move Up toolbarMoveDown = Move Down toolbarRemove = Remove # # ToolbarActions.java # toolbarAddAction = Add Toolbar Button toolbarRemoveAction = Remove Toolbar Button toolbarMoveAction = Move Toolbar Button toolbarInsertSepAction = Insert Separator toolbarRemoveSepAction = Remove Separator logisim-2.7.1/resources/logisim/en/menu.properties0000644000175000017500000000740111532066732022232 0ustar vincentvincent# MenuEdit.java editMenu = Edit editCantUndoItem = Can't Undo editUndoItem = Undo %s editCutItem = Cut editCopyItem = Copy editPasteItem = Paste editDuplicateItem = Duplicate editClearItem = Delete editSelectAllItem = Select All editLowerItem = Lower Selection editRaiseItem = Raise Selection editRaiseTopItem = Raise To Top editLowerBottomItem = Lower To Bottom editAddControlItem = Add Vertex editRemoveControlItem = Remove Vertex # MenuFile.java fileMenu = File fileNewItem = New fileOpenItem = Open... fileOpenRecentItem = Open Recent fileOpenRecentNoChoices = (None) fileCloseItem = Close fileSaveItem = Save fileSaveAsItem = Save As... fileExportImageItem = Export Image... filePrintItem = Print... filePreferencesItem = Preferences... fileQuitItem = Exit # MenuProject.java projectMenu = Project projectAddCircuitItem = Add Circuit... projectLoadLibraryItem = Load Library projectLoadBuiltinItem = Built-in Library... projectLoadLogisimItem = Logisim Library... projectLoadJarItem = JAR Library... projectUnloadLibraryItem = Unload Library projectUnloadLibrariesItem = Unload Libraries... projectMoveCircuitDownItem = Move Circuit Down projectMoveCircuitUpItem = Move Circuit Up projectSetAsMainItem = Set As Main Circuit projectRemoveCircuitItem = Remove Circuit projectEditCircuitLayoutItem = Edit Circuit Layout projectEditCircuitAppearanceItem = Edit Circuit Appearance projectRevertAppearanceItem = Revert To Default Appearance projectAnalyzeCircuitItem = Analyze Circuit projectViewToolboxItem = View Toolbox projectViewSimulationItem = View Simulation Tree projectGetCircuitStatisticsItem = Get Circuit Statistics projectOptionsItem = Options... # MenuSimulate.java simulateMenu = Simulate simulateRunItem = Simulation Enabled simulateResetItem = Reset Simulation simulateStepItem = Step Simulation simulateTickOnceItem = Tick Once simulateTickItem = Ticks Enabled simulateTickFreqMenu = Tick Frequency simulateTickFreqItem = %s Hz simulateTickKFreqItem = %s KHz simulateUpStateMenu = Go Out To State simulateDownStateMenu = Go In To State simulateLogItem = Logging... # MenuHelp.java helpMenu = Help helpTutorialItem = Tutorial helpGuideItem = User's Guide helpLibraryItem = Library Reference helpAboutItem = About... helpNotFoundError = Help data not found. helpUnavailableError = Could not load help data. helpDisplayError = Could not display help data. helpWindowTitle = Logisim Documentation helpsetUrl = doc/doc_en.hs # Popups.java projMenu = Project libMenu = Library circuitMenu = Circuit projectReloadLibraryItem = Reload Library # ProjectCircuitActions.java circuitNameDialogTitle = Input Circuit Name circuitNamePrompt = Circuit Name: circuitNameMissingError = Every circuit requires a name. circuitNameDuplicateError = Circuits cannot have identical names. circuitRemoveErrorTitle = Cannot Remove Circuit circuitRemoveLastError = Library must contain at least one circuit. circuitRemoveUsedError = Circuit used in other circuits cannot be removed. analyzeErrorTitle = Cannot Analyze analyzeMultibitInputError = Analysis cannot handle multibit inputs. analyzeMultibitOutputError = Analysis cannot handle multibit outputs. analyzeTooManyInputsError = Analysis cannot handle more than %s inputs. analyzeTooManyOutputsError = Analysis cannot handle more than %s outputs. analyzeNoExpressionTitle = Expression Not Determined # ProjectLibraryActions.java loadBuiltinErrorTitle = Cannot Load Built-In Library loadBuiltinNoneError = All built-in libraries are already loaded. loadBuiltinDialogTitle = Load Built-in Library loadLogisimDialogTitle = Load Logisim File loadJarDialogTitle = Load JAR File jarClassNamePrompt = Class Name: jarClassNameTitle = Enter JAR Class unloadLibrariesDialogTitle = Select Libraries To Unload unloadErrorTitle = Cannot Remove Library unloadNoneError = All open libraries are in use. logisim-2.7.1/resources/logisim/en/log.properties0000644000175000017500000000203011452004302022022 0ustar vincentvincent# # OptionsFrame.java # logFrameTitle = Logisim: Log %s of %s logFrameMenuItem = %s: Log closeButton = Close Window # # SelectionPanel.java # selectionTab = Selection selectionHelp = Select which component values are logged. selectionAdd = Add >> selectionChangeBase = Change Radix selectionMoveUp = Move Up selectionMoveDown = Move Down selectionRemove = << Remove # # TablePanel.java # tableTab = Table tableHelp = View log of recent values. tableEmptyMessage = Selection is empty. # # FilePanel.java # fileTab = File fileHelp = Configure file output. fileEnabled = File output enabled. fileDisabled = File output disabled. fileEnableButton = Enable fileDisableButton = Disable fileLabel = File: fileSelectButton = Select... fileHeaderCheck = Include Header Line fileCannotWriteTitle = File Not Available fileCannotWriteMessage = You do not have permission to write to "%s." fileExistsTitle = File Already Exists fileExistsMessage = The file "%s" already exists. fileOverwriteOption = Overwrite fileAppendOption = Append fileCancelOption = Cancellogisim-2.7.1/resources/logisim/en/hex.properties0000644000175000017500000000141311452004302022031 0ustar vincentvincent# # HexFrame.java # hexFrameTitle = Logisim: Hex Editor hexFrameMenuItem = Hex Editor hexPasteErrorTitle = Paste Error hexPasteSupportedError = The clipboard contents cannot be pasted into the editor. hexPasteEndError = The clipboard goes beyond the end of the file. hexPasteSizeError = Paste region must be same size as clipboard. hexOpenErrorTitle = Open Error hexSaveErrorTitle = Save Error openButton = Open... saveButton = Save... closeButton = Close Window # # HexFile.java # hexFileOpenError = Could not open file. hexFileReadError = Error reading file. hexFileWriteError = Error writing file. hexHeaderFormatError = Image file has invalid format header. hexNumberFormatError = Image file has some invalid contents. hexFileSizeError = Image file has too much information. logisim-2.7.1/resources/logisim/en/gui.properties0000644000175000017500000001076211541271672022057 0ustar vincentvincent# # gui/AttributeTable.java # attributeDialogTitle = Select Value changeAttributeAction = Change Attribute changeCircuitAttrAction = Change Circuit attributeChangeInvalidError = Attribute unchanged because request is invalid attributeChangeInvalidTitle = Value Invalid cannotModifyCircuitError = This circuit cannot be modified. # # gui/Canvas.java # canvasWidthError = Incompatible widths canvasOscillationError = Oscillation apparent canvasExceptionError = Simulation halted by internal error # # gui/Frame.java # titleCircFileKnown = Logisim: %s of %s titleFileKnown = Logisim: %s confirmDiscardMessage = What should happen to your unsaved changes to %s? confirmCloseTitle = Confirm Close saveOption = Save discardOption = Discard cancelOption = Cancel # # gui/ExportImage.java # labelCircuits = Circuits: labelImageFormat = Image Format: labelScale = Scale Factor: labelPrinterView = Printer View: exportEmptyCircuitsTitle = Cannot Export exportEmptyCircuitsMessage = No non-empty circuits are available for export. exportImageSelect = Export Image exportImageDirectorySelect = Select Export Directory exportImageFileSelect = Select Export File exportImageButton = Export exportGifFilter = GIF Files (*.gif) exportPngFilter = PNG Files (*.png) exportJpgFilter = JPEG Files (*.jpeg, *.jpg) exportNewDirectoryErrorTitle = Cannot Create Directory exportNewDirectoryErrorMessage = The directory could not be created. couldNotCreateImage = The image could not be created. couldNotCreateFile = The file could not be created. confirmOverwriteMessage = The file already exists. Do you want to overwrite it? confirmOverwriteTitle = Confirm Overwrite exportImageProgress = Computing Image... # # gui/Print.java # labelRotateToFit = Rotate To Fit: labelHeader = Header: printEmptyCircuitsTitle = Cannot Print printEmptyCircuitsMessage = No non-empty circuits are available for printing. printParmsTitle = Print Parameters printError = Error during printing: %s printErrorTitle = Error During Print # # gui/SelectionActions.java # dropComponentAction = Drop Component dropComponentsAction = Drop Components moveSelectionAction = Move Selection deleteSelectionAction = Delete Selection duplicateSelectionAction = Duplicate Selection cutSelectionAction = Cut Selection copySelectionAction = Copy Selection pasteClipboardAction = Paste Clipboard pasteCloneQuery = The clipboard includes "%s." The project doesn't include it, but it has another of the same name. pasteCloneTitle = Component pasteCloneReplace = Replace pasteCloneIgnore = Ignore pasteCloneCancel = Cancel pasteDropMessage = Some clipboard components were not pasted because the project libraries do not support them: pasteDropTitle = Components Not Pasted # # tools/SelectionAttributeChange.java # selectionAttributeAction = Change Selection Attribute # # tools/ToolActions.java # changeToolAttrAction = Change Tool Attribute # # gui/main/StatisticsDialog.java # statsDialogTitle = Logisim: %s Statistics statsCloseButton = Close statsSimpleCountColumn = Simple statsUniqueCountColumn = Unique statsRecursiveCountColumn = Recursive statsComponentColumn = Component statsLibraryColumn = Library statsTotalWithout = TOTAL (without project's subcircuits) statsTotalWith = TOTAL (with subcircuits) # # gui/main/ExplorerToolbarModel.java # projectViewToolboxTip = Show project circuits and libraries in explorer pane projectViewSimulationTip = Show simulation hierarchy in explorer pane projectEditLayoutTip = Edit viewed circuit's layout projectEditAppearanceTip = Edit viewed circuit's subcircuit appearance # # gui/main/ToolboxToolbarModel.java # projectAddCircuitTip = Add circuit projectMoveCircuitDownTip = Move viewed circuit down list projectMoveCircuitUpTip = Move viewed circuit up list projectRemoveCircuitTip = Remove viewed circuit # # gui/main/SimulationToolbarModel.java # simulateEnableStepsTip = Enable signals propagating through circuits simulateDisableStepsTip = Disable signals propagating through circuits simulateStepTip = Step signal propagating through circuit once simulateEnableTicksTip = Enable clock ticks simulateDisableTicksTip = Disable clock ticks simulateTickTip = Tick clocks once # # gui/TickRate.java # tickRateHz = %s Hz tickRateKHz = %s KHz # # gui/ZoomControl.java # zoomShowGrid = Toggle whether grid is shown # # gui/appear/RevertAppearanceAction # revertAppearanceAction = Revert Appearance # # attribute table models # circuitAttrTitle = Circuit: %s toolAttrTitle = Tool: %s selectionOne = Selection: %s selectionMultiple = Selection: %s \u00D7 %s selectionVarious = Selection: Various items \u00D7 %slogisim-2.7.1/resources/logisim/en/file.properties0000644000175000017500000000706011541271704022203 0ustar vincentvincent# # lib/LogisimFile.java # fileDuplicateError = Error duplicating file: %s defaultProjectName = Untitled unloadUsedError = Circuit '%s' uses components from the library. unloadToolbarError = Library includes items currently in the toolbar. unloadMappingError = Library includes items currently mapped to the mouse. xmlConversionError = Internal error while creating XML # # lib/LogisimFileActions.java # addCircuitAction = Add Circuit removeCircuitAction = Remove Circuit moveCircuitAction = Reorder Circuits loadLibraryAction = Load Library loadLibrariesAction = Load Libraries unloadLibraryAction = Unload Library unloadLibrariesAction = Unload Libraries setMainCircuitAction = Set Main Circuit revertDefaultsAction = Revert To Defaults # # gui/Loader.java # logisimFileFilter = Logisim Project (*.circ) jarFileFilter = Java Archive (*.jar) fileDescriptorUnknownError = Descriptor not known for %s. fileDescriptorError = Unrecognized library descriptor %s fileTypeError = The Logisim library has an unrecognized type %s (%s) fileBuiltinMissingError = The built-in library %s is not available in this version. fileLibraryMissingError = The required library file `%s' is missing. Please select the file from the following dialog. fileLibraryMissingTitle = Locate `%s' fileLibraryMissingButton = Select fileLoadCanceledError = User canceled load. [1] fileMessageTitle = File Message fileErrorTitle = File Error fileSaveErrorTitle = Cannot Save File fileSaveError = Could not save file: %s fileSaveCloseError = Could not close file: %s fileCircularError = Cannot create circular reference. (The file is used by the %s library.) fileSaveZeroError = Mysteriously, saving erases the file; restoration will be attempted. If you can spot what might cause this, please contact Carl Burch. unknownLibraryFileError = No file known corresponding to %s. logisimCircularError = The file %s contains within it a reference to itself. logisimLoadError = Error encountered opening %s: %s jarNotOpenedError = The JAR file could not be opened. jarClassNotFoundError = The %s class was not found in the JAR file. jarClassNotLibraryError = `%s' is not a valid library name. jarLibraryNotCreatedError = The %s library could not be instantiated. fileAppearanceError = Error while loading appearance element %s fileAppearanceNotFound = Appearance element %s not found # # lib/Options.java # gateUndefinedOption = Gate Output When Undefined simLimitOption = Simulation Limit simRandomOption = Simulation Randomness gateUndefinedIgnore = Ignore undefined inputs gateUndefinedError = Error for undefined inputs # # lib/XmlReader.java # libNameMissingError = library name missing libDescMissingError = library descriptor missing libMissingError = library `%s' not found toolNameMissingError = tool name missing mappingMissingError = mouse mapping modifier missing mappingBadError = mouse mapping modifier `%s' invalid circNameMissingError = circuit name is missing compUnknownError = component `%s' not found compNameMissingError = component name missing compAbsentError = component `%s' missing from library `%s' compLocMissingError = location of component `%s' is unspecified compLocInvalidError = location of component `%s' is invalid (%s) wireStartMissingError = wire start not defined wireStartInvalidError = wire start misformatted wireEndMissingError = wire end not defined wireEndInvalidError = wire end misformatted attrNameMissingError = attribute name missing attrValueInvalidError = attribute value (%s) is not valid for %s xmlFormatError = XML formatting error: %s toolNameMissing = Tool name not provided toolNotFound = Tool not found in librarylogisim-2.7.1/resources/logisim/en/draw.properties0000644000175000017500000000213111527307510022212 0ustar vincentvincent# draw.model - Attributes attrPaint = Paint Type attrFont = Font attrAlign = Alignment attrStrokeWidth = Pen Width attrStroke = Pen Color attrFill = Fill Color attrRx = Corner Radius paintStroke = Border Only paintFill = Fill Only paintBoth = Border & Fill alignStart = Left alignMiddle = Center alignEnd = Right # draw.model - CanvasObject names shapeMultiple = Objects shapeCurve = Curve shapeRect = Rectangle shapeRoundRect = Rounded Rectangle shapeOval = Oval shapePolygon = Polygon shapePolyline = Polyline shapeLine = Line shapeText = Text # draw.action - Action names actionAdd = Add %s actionRemove = Remove %s actionTranslate = Move %s actionMoveHandle = Move Handle actionInsertHandle = Add Handle actionDeleteHandle = Delete Handle actionChangeAttributes = Change Attributes actionChangeAttribute = Change %s actionLower = Lower actionRaise = Raise actionReorder = Reorder actionEditText = Edit Text # draw.gui - attribute table titles selectionOne = Selection: %s selectionMultiple = Selection: %s \u00D7 %s selectionVarious = Selection: Various items \u00D7 %slogisim-2.7.1/resources/logisim/en/data.properties0000644000175000017500000000066511452004302022166 0ustar vincentvincent# # data/Attributes.java # booleanTrueOption = Yes booleanFalseOption = No # # data/Direction.java # directionEastOption = East directionWestOption = West directionNorthOption = North directionSouthOption = South directionNorthVertical = Top directionSouthVertical = Bottom directionEastVertical = Right directionWestVertical = Left # # data/Value.java # valueErrorSymbol = E valueUnknownSymbol = x valueError = Error valueUnknown = ??? logisim-2.7.1/resources/logisim/en/circuit.properties0000644000175000017500000000365011533632420022724 0ustar vincentvincent# # Analyze.java # defaultInputLabels = a,b,c,d,e,f,g,h defaultOutputLabels = x,y,z,u,v,w,s,t # # AnalyzeException.java # analyzeCircularError = Circular reference detected; computing truth table instead. analyzeConflictError = Conflicting outputs detected; computing truth table instead. analyzeCannotHandleError = Computing truth table instead of expression due to %s. # # circuit/Circuit.java # circuitName = Circuit Name circuitLabelLocAttr = Label Location circuitLabelAttr = Shared Label circuitLabelDirAttr = Shared Label Facing circuitLabelFontAttr = Shared Label Font # # circuit/CircuitMutation.java # unknownChangeAction = Change Circuit # # circuit/Subcircuit.java # subcircuitViewItem = View %s subcircuitCircuitTip = %s subcircuit # # circuit/RadixOption.java # radixAttr = Radix radix2 = Binary radix10Signed = Signed Decimal radix10Unsigned = Unsigned Decimal radix8 = Octal radix16 = Hexadecimal # # circuit/SplitterClass.java # # splitter component name splitterComponent = Splitter # splitter end tool tips splitterCombinedTip = Combined end of splitter splitterSplit0Tip = No bits from combined end splitterSplit1Tip = Bit %s from combined end splitterSplitManyTip = Bits %s from combined end # splitter attributes splitterBitWidthAttr = Bit Width In splitterFanOutAttr = Fan Out splitterBitAttr = Bit %s splitterBitNone = None splitterAppearanceAttr = Appearance splitterAppearanceLegacy = Legacy splitterAppearanceLeft = Left-handed splitterAppearanceCenter = Centered splitterAppearanceRight = Right-handed splitterDistributeAscending = Distribute Ascending splitterDistributeDescending = Distribute Descending # # circuit/WireClass.java # wireComponent = Wire wireLengthAttr = Length wireDirectionAttr = Direction wireDirectionHorzOption = Horizontal wireDirectionVertOption = Vertical # circuit/appear/AppearanceOrigin circuitAnchor = Anchor appearanceFacingAttr = Appearance Facing # circuit/appear/AppearancePort circuitPort = Portlogisim-2.7.1/resources/logisim/en/analyze.properties0000644000175000017500000000555411532247716022743 0ustar vincentvincent# # gui/Analyzer.java # analyzerWindowTitle = Combinational Analysis inputsTab = Inputs outputsTab = Outputs tableTab = Table expressionTab = Expression minimizedTab = Minimized inputsTabTip = View and edit the set of input variables. outputsTabTip = View and edit the set of output variables. tableTabTip = View and manipulate the truth table. expressionTabTip = View and manipulate outputs' expressions. minimizedTabTip = View minimized expressions corresponding to truth table. # # gui/BuildCircuitButton.java # buildCircuitButton = Build Circuit buildProjectLabel = Destination Project: buildNameLabel = Circuit Name: buildTwoInputsLabel = Use Two-Input Gates Only buildNandsLabel = Use NAND Gates Only buildDialogTitle = Build Circuit buildDialogErrorTitle = Could Not Build Circuit buildNeedProjectError = You must select a destination project. buildNeedCircuitError = You must specify a circuit name. buildConfirmReplaceMessage = Are you sure you want to replace the circuit %s? buildConfirmReplaceTitle = Confirm Replace replaceCircuitAction = Replace Circuit # # gui/ExpressionEditorPanel.java # exprClearButton = Clear exprRevertButton = Revert exprEnterButton = Enter # # gui/ExpressionPanel.java # expressionEmpty = (empty) # # gui/KarnaughMapPanel.java # karnaughNoOutputError = No output selected. karnaughTooManyInputsError = Too many inputs for table. # # gui/MinimizedTabPanel.java # minimizedFormat = Format: minimizedSumOfProducts = Sum of products minimizedProductOfSums = Product of sums minimizedSetButton = Set As Expression # # gui/OutputSelector.java # outputSelectLabel = Output: # # gui/SimpleTruthTablePanel.java # tableEmptyMessage = (empty table) tableNullHeader = (none) # # gui/TableTabClip.java # clipPasteErrorTitle = Paste Error clipPasteSupportedError = The clipboard contents cannot be pasted into the editor. clipPasteEndError = The clipboard goes beyond the end of the table. clipPasteSizeError = Paste region must be same size as clipboard. # # gui/VariableListPanel.java # variableRemoveButton = Remove variableMoveUpButton = Move Up variableMoveDownButton = Move Down variableAddButton = Add variableRenameButton = Rename variableStartError = Name must begin with a letter. variablePartError = Name cannot contain '%s'. variableDuplicateError = Name duplicates existing variable. variableMaximumError = (Reached maximum size of %s.) # # model/Entry.java # busError = Conflicting output values in circuit. oscillateError = Circuit oscillates. # # model/Parser.java # implicitAndOperator = (Implicit AND) invalidCharacterError = Unrecognized characters: %s missingLeftOperandError = Operator %s missing left operand. missingRightOperandError = Operator %s missing right operand. lparenMissingError = No matching opening parenthesis. rparenMissingError = No matching closing parenthesis. badVariableName = %s is not an input variable. unexpectedApostrophe = Unexpected apostrophe ("'")logisim-2.7.1/resources/logisim/el/0000755000175000017500000000000011530603654017142 5ustar vincentvincentlogisim-2.7.1/resources/logisim/el/util.properties0000644000175000017500000000344011530601316022227 0ustar vincentvincent# # util/FontUtil.java # fontPlainStyle= \u039a\u03b1\u03bd\u03bf\u03bd\u03b9\u03ba\u03ae fontBoldStyle= \u0388\u03bd\u03c4\u03bf\u03bd\u03b7 fontItalicStyle= \u03a0\u03bb\u03ac\u03b3\u03b9\u03b1 fontBoldItalicStyle= \u0388\u03bd\u03c4\u03bf\u03bd\u03b7 \u03a0\u03bb\u03ac\u03b3\u03b9\u03b1 # # util/InputEventUtil.java # metaMod= Meta altMod= Alt ctrlMod= Ctrl shiftMod= Shift button1Mod= \u039a\u03bf\u03c5\u03bc\u03c0\u03af1 button2Mod= \u039a\u03bf\u03c5\u03bc\u03c0\u03af2 button3Mod= \u039a\u03bf\u03c5\u03bc\u03c0\u03af3 # # util/JDialogOk.java # dlogOkButton= OK dlogCancelButton= \u0391\u03ba\u03cd\u03c1\u03c9\u03c3\u03b7 # # util/LocaleManager.java # # If the user selects to "replace accented characters" in the International # dialog, the program will replace accented characters based on # the slash-delimited character-string pairs in accentReplacements. # For example, with German, accentReplacements might be # "\u00f6 oe/\u00d6 Oe/\u00fc ue/\u00dc ue/\u00df ss" so that umlauted o's and u's are # replaced, as would be essets. accentReplacements= # # util/GifEncoder.java # grabberError= \u039f \u0394\u03b5\u03b9\u03b3\u03bc\u03b1\u03c4\u03bf\u03bb\u03ae\u03c0\u03c4\u03b7\u03c2 \u03b5\u03c0\u03ad\u03c3\u03c4\u03c1\u03b5\u03c8\u03b5 \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1: manyColorError= \u03a0\u03ac\u03c1\u03b1 \u03c0\u03bf\u03bb\u03bb\u03ac \u03c7\u03c1\u03ce\u03bc\u03b1\u03c4\u03b1. # # util/WindowMenu.java # windowMenu= \u03a0\u03b1\u03c1\u03ac\u03b8\u03c5\u03c1\u03bf windowMinimizeItem= \u0395\u03bb\u03b1\u03c7\u03b9\u03c3\u03c4\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7 windowZoomItem= \u039c\u03b5\u03b3\u03b9\u03c3\u03c4\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7 windowZoomItemMac= \u039a\u03bb\u03af\u03bc\u03b1\u03ba\u03b1 windowCloseItem= \u039a\u03bb\u03b5\u03af\u03c3\u03b9\u03bc\u03bf logisim-2.7.1/resources/logisim/el/tools.properties0000644000175000017500000001130411530601316022410 0ustar vincentvincent# # tools/AddTool.java # addToolText= \u03a0\u03c1\u03bf\u03c3\u03b8\u03ae\u03ba\u03b7 %s negativeCoordError= \u03a4\u03bf \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf \u03b4\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03ad\u03c7\u03b5\u03b9 \u03b1\u03c1\u03bd\u03b7\u03c4\u03b9\u03ba\u03ad\u03c2 \u03c3\u03c5\u03bd\u03c4\u03b5\u03c4\u03b1\u03b3\u03bc\u03ad\u03bd\u03b5\u03c2. cannotModifyError= \u0394\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03c5\u03bd\u03b1\u03c4\u03ae \u03b7 \u03c4\u03c1\u03bf\u03c0\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7 \u03c4\u03bf\u03c5 \u03ba\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2. circularError= \u0394\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03b4\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03b7\u03b8\u03b5\u03af \u03ba\u03c5\u03ba\u03bb\u03b9\u03ba\u03ae \u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac. exclusiveError= \u0391\u03bb\u03bb\u03b7\u03bb\u03bf\u03c3\u03c5\u03b3\u03ba\u03c1\u03bf\u03c5\u03cc\u03bc\u03b5\u03bd\u03bf \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf \u03ae\u03b4\u03b7 \u03b5\u03ba\u03b5\u03af. addComponentAction= \u03a0\u03c1\u03bf\u03c3\u03b8\u03ae\u03ba\u03b7 %s # # tools/MenuTool.java # menuTool= \u0395\u03c1\u03b3\u03b1\u03bb\u03b5\u03af\u03bf \u039c\u03b5\u03bd\u03bf\u03cd menuToolDesc= \u03a0\u03c1\u03bf\u03b2\u03bf\u03bb\u03ae \u03bc\u03b5\u03bd\u03bf\u03cd \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf\u03c5 compDeleteItem= \u0394\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae compShowAttrItem= \u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 \u0399\u03b4\u03b9\u03bf\u03c4\u03ae\u03c4\u03c9\u03bd selDeleteItem= \u0394\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae \u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae\u03c2 selCutItem= \u0391\u03c0\u03bf\u03ba\u03bf\u03c0\u03ae \u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae\u03c2 selCopyItem= \u0391\u03bd\u03c4\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae \u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae\u03c2 removeComponentAction= \u039a\u03b1\u03c4\u03ac\u03c1\u03b3\u03b7\u03c3\u03b7 %s # # tools/PokeTool.java # pokeTool= \u0395\u03c1\u03b3\u03b1\u03bb\u03b5\u03af\u03bf \u0394\u03c1\u03b1\u03c3\u03c4\u03b7\u03c1\u03b9\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7\u03c2 pokeToolDesc= \u0391\u03bb\u03bb\u03b1\u03b3\u03ae \u03c4\u03b9\u03bc\u03ce\u03bd \u03b5\u03bd\u03c4\u03cc\u03c2 \u03c4\u03bf\u03c5 \u03ba\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2 # # tools/SelectTool.java # selectTool= \u0395\u03c1\u03b3\u03b1\u03bb\u03b5\u03af\u03bf \u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae\u03c2 selectToolDesc= \u0395\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03c9\u03bd \u03c4\u03bf\u03c5 \u03ba\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2 moveWorkingMsg= \u03a5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03bc\u03cc\u03c2 \u03c3\u03c5\u03bd\u03b4\u03ad\u03c3\u03b5\u03c9\u03bd... # # tools/SelectionAttributeChange.java # selectionRefaceAction= \u0391\u03bb\u03bb\u03b1\u03b3\u03ae \u03a0\u03c1\u03bf\u03c3\u03b1\u03bd\u03b1\u03c4\u03bf\u03bb\u03b9\u03c3\u03bc\u03bf\u03cd \u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae\u03c2 # # tools/key/KeyConfigurationAction # changeComponentAttributesAction= \u0391\u03bb\u03bb\u03b1\u03b3\u03ae \u0399\u03b4\u03b9\u03bf\u03c4\u03ae\u03c4\u03c9\u03bd \u03a3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf\u03c5 # # tools/TextTool.java # textTool= \u0395\u03c1\u03b3\u03b1\u03bb\u03b5\u03af\u03bf \u039a\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5 textToolDesc= \u0395\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5 \u03c3\u03c4\u03bf \u03ba\u03cd\u03ba\u03bb\u03c9\u03bc\u03b1 # # tools/EditTool.java # editTool= \u0395\u03c1\u03b3\u03b1\u03bb\u03b5\u03af\u03bf \u0395\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1\u03c2 editToolDesc= \u0395\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae\u03c2 \u03ba\u03b1\u03b9 \u03c0\u03c1\u03bf\u03c3\u03b8\u03ae\u03ba\u03b7 \u03ba\u03b1\u03bb\u03c9\u03b4\u03af\u03c9\u03bd # # tools/WiringTool.java # wiringTool= \u0395\u03c1\u03b3\u03b1\u03bb\u03b5\u03af\u03bf \u039a\u03b1\u03bb\u03c9\u03b4\u03af\u03c9\u03c3\u03b7\u03c2 wiringToolDesc= \u03a0\u03c1\u03bf\u03c3\u03b8\u03ae\u03ba\u03b7 \u03ba\u03b1\u03bb\u03c9\u03b4\u03af\u03c9\u03bd \u03c3\u03c4\u03bf \u03ba\u03cd\u03ba\u03bb\u03c9\u03bc\u03b1 addWireAction= \u03a0\u03c1\u03bf\u03c3\u03b8\u03ae\u03ba\u03b7 \u039a\u03b1\u03bb\u03c9\u03b4\u03af\u03bf\u03c5 addWiresAction= \u03a0\u03c1\u03bf\u03c3\u03b8\u03ae\u03ba\u03b7 \u039a\u03b1\u03bb\u03c9\u03b4\u03af\u03c9\u03bd shortenWireAction= \u03a3\u03c5\u03bd\u03c4\u03cc\u03bc\u03b5\u03c5\u03c3\u03b7 \u039a\u03b1\u03bb\u03c9\u03b4\u03af\u03bf\u03c5 logisim-2.7.1/resources/logisim/el/std.properties0000644000175000017500000013000411530601316022041 0ustar vincentvincent# # std/Builtin.java # builtinLibrary= \u0395\u03bd\u03c3\u03c9\u03bc\u03b1\u03c4\u03c9\u03bc\u03ad\u03bd\u03bf # instance/StdAttr.java stdFacingAttr= \u03a0\u03c1\u03bf\u03c3\u03b1\u03bd\u03b1\u03c4\u03bf\u03bb\u03b9\u03c3\u03bc\u03cc\u03c2 stdDataWidthAttr= Bits \u0394\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd stdTriggerAttr= \u03a3\u03ba\u03b1\u03bd\u03b4\u03b1\u03bb\u03b9\u03c3\u03bc\u03cc\u03c2 stdTriggerRising= \u0398\u03b5\u03c4\u03b9\u03ba\u03ae \u0391\u03ba\u03bc\u03ae stdTriggerFalling= \u0391\u03c1\u03bd\u03b7\u03c4\u03b9\u03ba\u03ae \u0391\u03ba\u03bc\u03ae stdTriggerHigh= \u03a5\u03c8\u03b7\u03bb\u03cc \u0395\u03c0\u03af\u03c0\u03b5\u03b4\u03bf stdTriggerLow= \u03a7\u03b1\u03bc\u03b7\u03bb\u03cc \u0395\u03c0\u03af\u03c0\u03b5\u03b4\u03bf stdLabelAttr= \u0395\u03c4\u03b9\u03ba\u03ad\u03c4\u03b1 stdLabelFontAttr= \u0393\u03c1\u03b1\u03bc\u03bc\u03b1\u03c4\u03bf\u03c3\u03b5\u03b9\u03c1\u03ac \u0395\u03c4\u03b9\u03ba\u03ad\u03c4\u03b1\u03c2 # instance/InstanceTextField.java changeLabelAction= \u0391\u03bb\u03bb\u03b1\u03b3\u03ae \u0395\u03c4\u03b9\u03ba\u03ad\u03c4\u03b1\u03c2 # # std/base/Base.java # baseLibrary= \u0392\u03b1\u03c3\u03b9\u03ba\u03ae # std/base/BitExtender.java extenderComponent= \u0395\u03c0\u03ad\u03ba\u03c4\u03b1\u03c3\u03b7 Bit extenderInAttr= \u0395\u03cd\u03c1\u03bf\u03c2 Bit \u0395\u03b9\u03c3\u03cc\u03b4\u03bf\u03c5 extenderOutAttr= \u0395\u03cd\u03c1\u03bf\u03c2 Bit \u0395\u03be\u03cc\u03b4\u03bf\u03c5 extenderTypeAttr= \u03a4\u03cd\u03c0\u03bf\u03c2 \u0395\u03c0\u03ad\u03ba\u03c4\u03b1\u03c3\u03b7\u03c2 extenderOneType= \u0388\u03bd\u03b1 extenderZeroType= \u039c\u03b7\u03b4\u03ad\u03bd extenderSignType= \u03a0\u03c1\u03cc\u03c3\u03b7\u03bc\u03bf extenderInputType= \u0395\u03af\u03c3\u03bf\u03b4\u03bf\u03c2 extenderMainLabel= \u03b5\u03c0\u03ad\u03ba\u03c4\u03b1\u03c3\u03b7 extenderOneLabel= 1 extenderZeroLabel= 0 extenderSignLabel= \u03c0\u03c1\u03cc\u03c3\u03b7\u03bc\u03bf extenderInputLabel= \u03b5\u03af\u03c3\u03bf\u03b4\u03bf\u03c2 # std/base/Clock clockComponent= \u03a1\u03bf\u03bb\u03cc\u03b9 clockHighAttr= \u03a5\u03c8\u03b7\u03bb\u03ae \u0394\u03b9\u03ac\u03c1\u03ba\u03b5\u03b9\u03b1 clockLowAttr= \u03a7\u03b1\u03bc\u03b7\u03bb\u03ae \u0394\u03b9\u03ac\u03c1\u03ba\u03b5\u03b9\u03b1 clockDurationValue= %s \u03a0\u03b1\u03bb\u03bc\u03bf\u03af clockDurationOneValue= 1 \u03a0\u03b1\u03bb\u03bc\u03cc\u03c2 durationSmallMessage= \u0397 \u03c4\u03b9\u03bc\u03ae \u03c0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 \u03c4\u03bf\u03c5\u03bb\u03ac\u03c7\u03b9\u03c3\u03c4\u03bf\u03bd %s. durationLargeMessage= \u0397 \u03c4\u03b9\u03bc\u03ae \u03c0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 %s \u03ae \u03bb\u03b9\u03b3\u03cc\u03c4\u03b5\u03c1\u03bf. freqInvalidMessage= \u0397 \u03c4\u03b9\u03bc\u03ae \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03ad\u03b3\u03ba\u03c5\u03c1\u03bf\u03c2 \u03b1\u03ba\u03ad\u03c1\u03b1\u03b9\u03bf\u03c2 # std/base/Pin pinComponent= \u0391\u03ba\u03c1\u03bf\u03b4\u03ad\u03ba\u03c4\u03b7\u03c2 pinInputName= \u0395\u03af\u03c3\u03bf\u03b4\u03bf\u03c2 pinOutputName= \u0388\u03be\u03bf\u03b4\u03bf\u03c2 pinThreeStateAttr= \u03a4\u03c1\u03b9\u03ce\u03bd-\u039a\u03b1\u03c4\u03b1\u03c3\u03c4\u03ac\u03c3\u03b5\u03c9\u03bd? pinOutputAttr= \u0388\u03be\u03bf\u03b4\u03bf\u03c2? pinPullAttr= \u03a3\u03c5\u03bc\u03c0\u03b5\u03c1\u03b9\u03c6\u03bf\u03c1\u03ac \u039f\u03b4\u03ae\u03b3\u03b7\u03c3\u03b7\u03c2 pinPullNoneOption= \u0391\u03bc\u03b5\u03c4\u03ac\u03b2\u03bb\u03b7\u03c4\u03bf pinPullUpOption= \u039f\u03b4\u03ae\u03b3\u03b7\u03c3\u03b7 \u03a0\u03ac\u03bd\u03c9 pinPullDownOption= \u039f\u03b4\u03ae\u03b3\u03b7\u03c3\u03b7 \u039a\u03ac\u03c4\u03c9 pinLabelLocAttr= \u0398\u03ad\u03c3\u03b7 \u0395\u03c4\u03b9\u03ba\u03ad\u03c4\u03b1\u03c2 pinInputToolTip= \u03a0\u03c1\u03bf\u03c3\u03b8\u03ae\u03ba\u03b7 \u03b5\u03bd\u03cc\u03c2 \u03b1\u03ba\u03c1\u03bf\u03b4\u03ad\u03ba\u03c4\u03b7 \u03b5\u03b9\u03c3\u03cc\u03b4\u03bf\u03c5 pinOutputToolTip= \u03a0\u03c1\u03bf\u03c3\u03b8\u03ae\u03ba\u03b7 \u03b5\u03bd\u03cc\u03c2 \u03b1\u03ba\u03c1\u03bf\u03b4\u03ad\u03ba\u03c4\u03b7 \u03b5\u03be\u03cc\u03b4\u03bf\u03c5 pinFrozenTitle= \u0391\u03ba\u03c1\u03bf\u03b4\u03ad\u03c4\u03b7\u03c2 \u03c3\u03c5\u03bd\u03b4\u03b5\u03b4\u03b5\u03bc\u03ad\u03bd\u03bf\u03c2 \u03c3\u03c4\u03bf \u039a\u03cd\u03ba\u03bb\u03c9\u03bc\u03b1. pinFrozenQuestion= \u039f \u03b1\u03ba\u03c1\u03bf\u03b4\u03ad\u03ba\u03c4\u03b7\u03c2 \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03b9\u03b1\u03c3\u03c5\u03bd\u03b4\u03b5\u03b4\u03b5\u03bc\u03ad\u03bd\u03bf\u03c2 \u03c3\u03c4\u03b7\u03bd \u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7 \u03c4\u03bf\u03c5 \u03ba\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2. \u0394\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03bc\u03b9\u03b1\u03c2 \u03bd\u03ad\u03b1\u03c2 \u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7\u03c2 \u03c4\u03bf\u03c5 \u03ba\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2? # std/base/Probe probeComponent= \u0394\u03b5\u03b9\u03b3\u03bc\u03b1\u03c4\u03bf\u03bb\u03ae\u03c0\u03c4\u03b7\u03c2 # std/base/PullResistor pullComponent= \u0391\u03bd\u03c4\u03af\u03c3\u03c4\u03b1\u03c3\u03b7 \u039f\u03b4\u03ae\u03b3\u03b7\u03c3\u03b7\u03c2 pullTypeAttr= \u0394\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 \u039f\u03b4\u03ae\u03b3\u03b7\u03c3\u03b7\u03c2 pullZeroType= \u039c\u03b7\u03b4\u03ad\u03bd pullOneType= \u0388\u03bd\u03b1 pullErrorType= \u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 # std/base/Text.java textComponent= \u0395\u03c4\u03b9\u03ba\u03ad\u03c4\u03b1 textTextAttr= \u039a\u03b5\u03af\u03bc\u03b5\u03bd\u03bf textFontAttr= \u0393\u03c1\u03b1\u03bc\u03bc\u03b1\u03c4\u03bf\u03c3\u03b5\u03b9\u03c1\u03ac textHorzAlignAttr= \u039f\u03c1\u03b9\u03b6\u03cc\u03bd\u03c4\u03b9\u03b1 \u03a3\u03c4\u03bf\u03af\u03c7\u03b9\u03c3\u03b7 textHorzAlignLeftOpt= \u0391\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac textHorzAlignRightOpt= \u0394\u03b5\u03be\u03b9\u03ac textHorzAlignCenterOpt= \u039a\u03ad\u03bd\u03c4\u03c1\u03bf textVertAlignAttr= \u039a\u03ac\u03b8\u03b5\u03c4\u03b7 \u03a3\u03c4\u03bf\u03af\u03c7\u03b9\u03c3\u03b7 textVertAlignTopOpt= \u0395\u03c0\u03ac\u03bd\u03c9 textVertAlignBaseOpt= \u0392\u03ac\u03c3\u03b7 textVertAlignBottomOpt= \u039a\u03ac\u03c4\u03c9 textVertAlignCenterOpt= \u039a\u03ad\u03bd\u03c4\u03c1\u03bf # std/base/Tunnel.java tunnelComponent= \u03a3\u03ae\u03c1\u03b1\u03b3\u03b3\u03b1 # # std/Wiring.java # wiringLibrary= \u039a\u03b1\u03bb\u03c9\u03b4\u03af\u03c9\u03c3\u03b7 wiringGateAttr= \u0398\u03ad\u03c3\u03b7 \u03a0\u03cd\u03bb\u03b7\u03c2 wiringGateBottomRightOption= \u039a\u03ac\u03c4\u03c9/\u0394\u03b5\u03be\u03b9\u03ac wiringGateTopLeftOption= \u03a0\u03ac\u03bd\u03c9/\u0391\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac # std/wiring/Transistor.java transistorComponent= \u03a4\u03c1\u03b1\u03bd\u03b6\u03af\u03c3\u03c4\u03bf\u03c1 transistorTypeAttr= \u03a4\u03cd\u03c0\u03bf\u03c2 transistorTypeP= P-Type transistorTypeN= N-Type # std/wiring/TransmissionGate.java transmissionGateComponent= \u03a0\u03cd\u03bb\u03b7 \u039c\u03b5\u03c4\u03ac\u03b4\u03bf\u03c3\u03b7\u03c2 # std/wiring/Power.java powerComponent= \u0399\u03c3\u03c7\u03cd\u03c2 # std/wiring/Ground.java groundComponent= \u0393\u03b5\u03af\u03c9\u03c3\u03b7 # # std/Gates.java # gatesLibrary= \u03a0\u03cd\u03bb\u03b5\u03c2 gateSizeAttr= \u039c\u03ad\u03b3\u03b5\u03b8\u03bf\u03c2 \u03a0\u03cd\u03bb\u03b7\u03c2 gateSizeNarrowOpt= \u03a3\u03c4\u03b5\u03bd\u03cc gateSizeNormalOpt= \u039c\u03ad\u03c4\u03c1\u03b9\u03bf gateSizeWideOpt= \u03a6\u03b1\u03c1\u03b4\u03cd gateNegateAttr= \u0391\u03c1\u03bd\u03b7\u03c4\u03b9\u03ba\u03cc %s gateInputsAttr= \u0391\u03c1\u03b9\u03b8\u03bc\u03cc\u03c2 \u0395\u03b9\u03c3\u03cc\u03b4\u03c9\u03bd gateOutput01= 0/1 gateOutput0Z= 0/\u03b1\u03c3\u03cd\u03bd\u03b4\u03b5\u03c4\u03bf gateOutputZ1= \u03b1\u03c3\u03cd\u03bd\u03b4\u03b5\u03c4\u03bf/1 gateOutputAttr= \u03a4\u03b9\u03bc\u03ae \u0395\u03be\u03cc\u03b4\u03bf\u03c5 xorBehaviorAttr= \u03a3\u03c5\u03bc\u03c0\u03b5\u03c1\u03b9\u03c6\u03bf\u03c1\u03ac \u03a0\u03bf\u03bb\u03bb\u03b1\u03c0\u03bb\u03ce\u03bd-\u0395\u03b9\u03c3\u03cc\u03b4\u03c9\u03bd xorBehaviorOne= \u038c\u03c4\u03b1\u03bd \u03bc\u03b9\u03b1 \u03b5\u03af\u03c3\u03bf\u03b4\u03bf \u03b5\u03af\u03bd\u03b1\u03b9 \u03b5\u03bd\u03b5\u03c1\u03b3\u03ae xorBehaviorOdd= \u038c\u03c4\u03b1\u03bd \u03ad\u03bd\u03b1\u03c2 \u03c0\u03b5\u03c1\u03b9\u03c4\u03c4\u03cc\u03c2 \u03b1\u03c1\u03b9\u03b8\u03bc\u03cc\u03c2 \u03b5\u03af\u03bd\u03b1\u03b9 \u03b5\u03bd\u03b5\u03c1\u03b3\u03cc\u03c2 # std/Constant.java constantComponent= \u03a3\u03c4\u03b1\u03b8\u03b5\u03c1\u03ac constantValueAttr= \u03a4\u03b9\u03bc\u03ae # std/NotGate.java notGateComponent= NOT \u03a0\u03cd\u03bb\u03b7 # std/Buffer.java bufferComponent= \u0391\u03c0\u03bf\u03bc\u03bf\u03bd\u03c9\u03c4\u03ae\u03c2 # std/AndGate.java andGateComponent= AND \u03a0\u03cd\u03bb\u03b7 # std/NandGate.java nandGateComponent= NAND \u03a0\u03cd\u03bb\u03b7 # std/NorGate.java norGateComponent= NOR \u03a0\u03cd\u03bb\u03b7 # std/OrGate.java orGateComponent= OR \u03a0\u03cd\u03bb\u03b7 # std/XorGate.java xorGateComponent= XOR \u03a0\u03cd\u03bb\u03b7 # std/XnorGate.java xnorGateComponent= XNOR \u03a0\u03cd\u03bb\u03b7 # std/OddParityGate.java oddParityComponent= \u03a0\u03b5\u03c1\u03b9\u03c4\u03c4\u03ae \u0399\u03c3\u03bf\u03c4\u03b9\u03bc\u03af\u03b1 # std/EvenParityGate.java evenParityComponent= \u0386\u03c1\u03c4\u03b9\u03b1 \u0399\u03c3\u03bf\u03c4\u03b9\u03bc\u03af\u03b1 # std/ControlledBuffer.java controlledBufferComponent= \u0395\u03bb\u03b5\u03b3\u03c7\u03cc\u03bc\u03b5\u03bd\u03bf\u03c2 \u0391\u03c0\u03bf\u03bc\u03bf\u03bd\u03c9\u03c4\u03ae\u03c2 controlledInverterComponent= \u0395\u03bb\u03b5\u03b3\u03c7\u03cc\u03bc\u03b5\u03bd\u03bf\u03c2 \u0391\u03bd\u03c4\u03b9\u03c3\u03c4\u03c1\u03bf\u03c6\u03ad\u03b1\u03c2 controlledControlOption= \u0398\u03ad\u03c3\u03b7 \u0393\u03c1\u03b1\u03bc\u03bc\u03ae\u03c2 \u0395\u03bb\u03ad\u03b3\u03c7\u03bf\u03c5 controlledLeftHanded= \u0391\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03cc\u03c7\u03b5\u03b9\u03c1\u03b1 controlledRightHanded= \u0394\u03b5\u03be\u03b9\u03cc\u03c7\u03b5\u03b9\u03c1\u03b1 # # std/Memory.java # memoryLibrary= \u039c\u03bd\u03ae\u03bc\u03b7 memEnableLabel= en # AbstractFlipFlop.java flipFlopClockTip= Clock: \u03b7 \u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7 \u03b5\u03bd\u03b7\u03bc\u03b5\u03c1\u03ce\u03bd\u03b5\u03c4\u03b1\u03b9 \u03bc\u03b5 \u03c4\u03bf\u03bd \u03c3\u03ba\u03b1\u03bd\u03b4\u03b1\u03bb\u03b9\u03c3\u03bc\u03cc flipFlopQTip= \u03a4\u03c1\u03ad\u03c7\u03bf\u03c5\u03c3\u03b1 \u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7 flip-flop flipFlopNotQTip= \u0391\u03bd\u03c4\u03af\u03c3\u03c4\u03c1\u03bf\u03c6\u03bf \u03c4\u03c1\u03ad\u03c7\u03bf\u03c5\u03c3\u03b1\u03c2 \u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7\u03c2 flip-flop flipFlopResetTip= Clear: \u03cc\u03c4\u03b1\u03bd 1, \u03b7 \u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7 \u03c4\u03bf\u03c5 \u03b1\u03ba\u03c1\u03bf\u03b4\u03ad\u03ba\u03c4\u03b7 \u03bc\u03b5\u03c4\u03b1\u03b2\u03b1\u03af\u03bd\u03b5\u03b9 \u03c3\u03b5 0 \u03b1\u03c3\u03cd\u03b3\u03c7\u03c1\u03bf\u03bd\u03b1 flipFlopPresetTip= Preset: \u03cc\u03c4\u03b1\u03bd 1, \u03b7 \u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7 \u03c4\u03bf\u03c5 \u03b1\u03ba\u03c1\u03bf\u03b4\u03ad\u03ba\u03c4\u03b7 \u03bc\u03b5\u03c4\u03b1\u03b2\u03b1\u03b9\u03bd\u03b5\u03b9 \u03c3\u03b5 1 \u03b1\u03c3\u03cd\u03b3\u03c7\u03c1\u03bf\u03bd\u03b1 flipFlopEnableTip= Enable: \u03cc\u03c4\u03b1\u03bd 0, \u03bf\u03b9 \u03c3\u03ba\u03b1\u03bd\u03b4\u03b1\u03bb\u03b9\u03c3\u03bc\u03bf\u03af \u03c4\u03bf\u03c5 \u03c1\u03bf\u03bb\u03bf\u03b3\u03b9\u03bf\u03cd \u03b4\u03b5\u03bd \u03b5\u03c0\u03b7\u03c1\u03b5\u03ac\u03b6\u03bf\u03c5\u03bd # std/Counter.java counterComponent= \u039c\u03b5\u03c4\u03c1\u03b7\u03c4\u03ae\u03c2 counterMaxAttr= \u039c\u03ad\u03b3\u03b9\u03c3\u03c4\u03b7 \u03c4\u03b9\u03bc\u03ae counterGoalAttr= \u0395\u03bd\u03ad\u03c1\u03b3\u03b5\u03b9\u03b1 \u03c3\u03c4\u03b7\u03bd \u03a5\u03c0\u03b5\u03c1\u03c7\u03b5\u03af\u03bb\u03b9\u03c3\u03b7 counterGoalWrap= \u03a0\u03b5\u03c1\u03b9\u03c3\u03c4\u03c1\u03bf\u03c6\u03ae counterGoalStay= \u03a0\u03b1\u03c1\u03b1\u03bc\u03bf\u03bd\u03ae \u03c3\u03b5 \u03c4\u03b9\u03bc\u03ae counterGoalContinue= \u03a3\u03c5\u03bd\u03ad\u03c7\u03b9\u03c3\u03b7 \u03c4\u03b7\u03c2 \u03bc\u03ad\u03c4\u03c1\u03b7\u03c3\u03b7\u03c2 counterGoalLoad= \u03a6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7 \u03b5\u03c0\u03cc\u03bc\u03b5\u03bd\u03b7\u03c2 \u03c4\u03b9\u03bc\u03ae\u03c2 counterQTip= Output: \u03c4\u03c1\u03ad\u03c7\u03bf\u03c5\u03c3\u03b1 \u03c4\u03b9\u03bc\u03ae \u03c4\u03bf\u03c5 \u03bc\u03b5\u03c4\u03c1\u03b7\u03c4\u03ae counterClockTip= Clock: \u03b7 \u03c4\u03b9\u03bc\u03ae \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03b1\u03bd\u03b1\u03bd\u03b5\u03ce\u03bd\u03b5\u03c4\u03b1\u03b9 \u03bc\u03b5 \u03c4\u03bf\u03bd \u03c3\u03ba\u03b1\u03bd\u03b4\u03b1\u03bb\u03b9\u03c3\u03bc\u03cc counterDataTip= Data: \u03b7 \u03c4\u03b9\u03bc\u03ae \u03c0\u03c1\u03bf\u03c2 \u03c6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7 \u03c3\u03c4\u03bf\u03bd \u03bc\u03b5\u03c4\u03c1\u03b7\u03c4\u03ae counterLoadTip= Load: \u03cc\u03c4\u03b1\u03bd 1, \u03c6\u03bf\u03c1\u03c4\u03ce\u03bd\u03b5\u03b9 \u03b1\u03c0\u03cc \u03c4\u03b7\u03bd \u03b5\u03af\u03c3\u03bf\u03b4\u03bf \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd (\u03b1\u03bd Count = 0) \u03ae \u03bc\u03b5\u03b9\u03ce\u03bd\u03b5\u03b9 counterEnableTip= Count: \u03cc\u03c4\u03b1\u03bd 1, \u03bf \u03bc\u03b5\u03c4\u03c1\u03b7\u03c4\u03ae\u03c2 \u03b1\u03c5\u03be\u03ac\u03bd\u03b5\u03b9 (\u03ae \u03bc\u03b5\u03b9\u03ce\u03bd\u03b5\u03b9 \u03b1\u03bd Load = 1) counterResetTip= Clear: \u03cc\u03c4\u03b1\u03bd 1, \u03b1\u03c1\u03c7\u03b9\u03ba\u03bf\u03c0\u03bf\u03b9\u03b5\u03af\u03c4\u03b1\u03b9 \u03c3\u03b5 0 \u03b1\u03c3\u03cd\u03b3\u03c7\u03c1\u03bf\u03bd\u03b1 counterCarryTip= Carry: \u03b5\u03af\u03bd\u03b1\u03b9 1 \u03cc\u03c4\u03b1\u03bd \u03b7 \u03c4\u03b9\u03bc\u03ae \u03c6\u03c4\u03ac\u03c3\u03b5\u03b9 \u03c4\u03bf \u03bc\u03ad\u03b3\u03b9\u03c3\u03c4\u03bf (\u03b5\u03bb\u03ac\u03c7\u03b9\u03c3\u03c4\u03bf \u03ba\u03b1\u03c4\u03ac \u03c4\u03b7\u03bd \u03bc\u03b5\u03b9\u03bf\u03cd\u03bc\u03b5\u03bd\u03b7 \u03bc\u03ad\u03c4\u03c1\u03b7\u03c3\u03b7) counterEnableLabel= ct counterLabel= ctr # std/DFlipFlop.java dFlipFlopComponent= D Flip-Flop # std/TFlipFlop.java tFlipFlopComponent= T Flip-Flop # std/JKFlipFlop.java jkFlipFlopComponent= J-K Flip-Flop # std/SRFlipFlop.java srFlipFlopComponent= S-R Flip-Flop # std/Random.java randomSeedAttr= \u0393\u03b5\u03bd\u03bd\u03ae\u03c4\u03bf\u03c1\u03b1\u03c2 randomComponent= \u0393\u03b5\u03bd\u03bd\u03ae\u03c4\u03c1\u03b9\u03b1 \u03a4\u03c5\u03c7\u03b1\u03af\u03c9\u03bd \u0391\u03c1\u03b9\u03b8\u03bc\u03ce\u03bd randomQTip= Output: \u03c4\u03c1\u03ad\u03c7\u03c9\u03bd \u03b1\u03c1\u03b9\u03b8\u03bc\u03cc\u03c2 \u03c3\u03c4\u03b7\u03bd \u03b1\u03ba\u03bf\u03bb\u03bf\u03c5\u03b8\u03af\u03b1 randomClockTip= Clock: \u03b7 \u03c4\u03b9\u03bc\u03ae \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03b1\u03bd\u03b1\u03bd\u03b5\u03ce\u03bd\u03b5\u03c4\u03b1\u03b9 \u03bc\u03b5 \u03c4\u03bf\u03bd \u03c3\u03ba\u03b1\u03bd\u03b4\u03b1\u03bb\u03b9\u03c3\u03bc\u03cc randomNextTip= Enable: \u03bc\u03b5\u03c4\u03b1\u03b2\u03b1\u03af\u03bd\u03b5\u03b9 \u03c3\u03c4\u03bf \u03b5\u03c0\u03cc\u03bc\u03b5\u03bd\u03bf \u03b1\u03c1\u03b9\u03b8\u03bc\u03cc \u03c4\u03b7\u03c2 \u03b1\u03ba\u03bf\u03bb\u03bf\u03c5\u03b8\u03af\u03b1\u03c2 \u03bc\u03b5 \u03c4\u03bf\u03bd \u03c3\u03ba\u03b1\u03bd\u03b4\u03b1\u03bb\u03b9\u03c3\u03bc\u03cc \u03c4\u03bf\u03c5 \u03c1\u03bf\u03bb\u03bf\u03b3\u03b9\u03bf\u03cd randomResetTip= Clear: \u03cc\u03c4\u03b1\u03bd 1, \u03b1\u03c1\u03c7\u03b9\u03ba\u03bf\u03c0\u03bf\u03b9\u03b5\u03af\u03c4\u03b1\u03b9 \u03c3\u03c4\u03bf\u03bd \u03b1\u03c1\u03c7\u03b9\u03ba\u03cc "\u03b3\u03b5\u03bd\u03bd\u03ae\u03c4\u03bf\u03c1\u03b1" \u03b1\u03c3\u03cd\u03b3\u03c7\u03c1\u03bf\u03bd\u03b1 # std/Register.java registerComponent= \u039a\u03b1\u03c4\u03b1\u03c7\u03c9\u03c1\u03b7\u03c4\u03ae\u03c2 registerQTip= Output: \u03b7 \u03c4\u03c1\u03ad\u03c7\u03bf\u03c5\u03c3\u03b1 \u03c4\u03b9\u03bc\u03ae \u03c4\u03bf\u03c5 \u03ba\u03b1\u03c4\u03b1\u03c7\u03c9\u03c1\u03b7\u03c4\u03ae registerDTip= Data: \u03b7 \u03b1\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03c5\u03bc\u03ad\u03bd\u03b7 \u03c4\u03b9\u03bc\u03ae \u03bc\u03b5 \u03c4\u03bf\u03bd \u03c3\u03ba\u03b1\u03bd\u03b4\u03b1\u03bb\u03b9\u03c3\u03bc\u03cc \u03c4\u03bf\u03c5 \u03c1\u03bf\u03bb\u03bf\u03b3\u03b9\u03bf\u03cd registerClkTip= Clock: \u03b7 \u03c4\u03b9\u03bc\u03ae \u03b1\u03bd\u03b1\u03bd\u03b5\u03ce\u03bd\u03b5\u03c4\u03b1\u03b9 \u03bc\u03b5 \u03c4\u03bf\u03bd \u03c3\u03ba\u03b1\u03bd\u03b4\u03b1\u03bb\u03b9\u03c3\u03bc\u03cc registerClrTip= Clear: \u03cc\u03c4\u03b1\u03bd 1, \u03b7 \u03c4\u03b9\u03bc\u03ae \u03c4\u03bf\u03c5 \u03b1\u03ba\u03c1\u03bf\u03b4\u03ad\u03ba\u03c4\u03b7 \u03bc\u03b5\u03c4\u03b1\u03b2\u03b1\u03af\u03bd\u03b1\u03b9 \u03c3\u03b5 0 \u03b1\u03c3\u03cd\u03b3\u03c7\u03c1\u03bf\u03bd\u03b1 registerEnableTip= Enable: \u03cc\u03c4\u03b1\u03bd 0, \u03bf\u03b9 \u03c3\u03ba\u03b1\u03bd\u03b4\u03b1\u03bb\u03b9\u03c3\u03bc\u03bf\u03af \u03c4\u03bf\u03c5 \u03c1\u03bf\u03bb\u03bf\u03b3\u03b9\u03bf\u03cd \u03b4\u03b5\u03bd \u03b5\u03c0\u03b7\u03c1\u03b5\u03ac\u03b6\u03bf\u03c5\u03bd registerLabel= reg registerWidthLabel= (%sb) # std/RamFactory.java ramComponent= RAM # std/RomFactory.java romComponent= ROM romContentsAttr= \u03a0\u03b5\u03c1\u03b9\u03b5\u03c7\u03cc\u03bc\u03b5\u03bd\u03b1 romContentsValue= (\u03c0\u03b1\u03c4\u03ae\u03c3\u03c4\u03b5 \u03b3\u03b9\u03b1 \u03b5\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1) romChangeAction= \u0395\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03a0\u03b5\u03c1\u03b9\u03b5\u03c7\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd \u03c4\u03b7\u03c2 ROM # std/Ram.java ramAddrWidthAttr= \u0395\u03cd\u03c1\u03bf\u03c2 \u03a8\u03b7\u03c6\u03af\u03c9\u03bd \u0394\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7\u03c2 ramDataWidthAttr= \u0395\u03cd\u03c1\u03bf\u03c2 \u03a8\u03b7\u03c6\u03af\u03c9\u03bd \u0394\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd ramDataLabel= D ramAddrLabel= A ramWELabel= str ramCSLabel= sel ramOELabel= ld ramClrLabel= clr ramGigabyteLabel= %sGB RAM ramMegabyteLabel= %sMB RAM ramKilobyteLabel= %sKB RAM ramByteLabel= %sB RAM romGigabyteLabel= %sGB ROM romMegabyteLabel= %sMB ROM romKilobyteLabel= %sKB ROM romByteLabel= %sB ROM memDataTip= Data: \u03b7 \u03c4\u03b9\u03bc\u03ae \u03c0\u03bf\u03c5 \u03c6\u03bf\u03c1\u03c4\u03ce\u03bd\u03b5\u03c4\u03b1\u03b9 \u03b1\u03c0\u03cc \u03c4\u03b7 \u03b4\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 memAddrTip= Address: \u03b7 \u03c4\u03bf\u03c0\u03bf\u03b8\u03b5\u03c3\u03af\u03b1 \u03c0\u03bf\u03c5 \u03c0\u03c1\u03bf\u03c3\u03c0\u03b5\u03bb\u03b1\u03cd\u03bd\u03b5\u03c4\u03b1\u03b9 \u03c3\u03c4\u03b7\u03bd \u03bc\u03bd\u03ae\u03bc\u03b7 memCSTip= Chip select: \u03c4\u03bf 0 \u03b1\u03c0\u03b5\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03b9\u03b5\u03af \u03c4\u03bf \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf ramClkTip= Clock: \u03b7 \u03c4\u03b9\u03bc\u03ae \u03c4\u03b7\u03c2 \u03bc\u03bd\u03ae\u03bc\u03b7\u03c2 \u03b1\u03bd\u03b1\u03bd\u03b5\u03ce\u03bd\u03b5\u03c4\u03b1\u03b9 \u03c3\u03c4\u03b7\u03bd \u03ac\u03bd\u03bf\u03b4\u03bf \u03b1\u03c0\u03cc 0 \u03c3\u03b5 1 ramOETip= Load: \u03b1\u03bd 1, \u03c6\u03bf\u03c1\u03c4\u03ce\u03bd\u03b5\u03b9 \u03c4\u03b7 \u03bc\u03bd\u03ae\u03bc\u03b7 \u03c3\u03c4\u03b7\u03bd \u03ad\u03be\u03bf\u03b4\u03bf ramWETip= Store: \u03b1\u03bd 1, \u03b1\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03cd\u03b5\u03b9 \u03c4\u03b7\u03bd \u03b5\u03af\u03c3\u03bf\u03b4\u03bf \u03c3\u03c4\u03b7 \u03bc\u03bd\u03ae\u03bc\u03b7 ramClrTip= Clear: \u03b1\u03bd 1, \u03c4\u03b1 \u03c0\u03b5\u03c1\u03b9\u03b5\u03c7\u03cc\u03bc\u03b5\u03bd\u03b1 \u03bc\u03b5\u03c4\u03b1\u03b2\u03b1\u03af\u03bd\u03bf\u03c5\u03bd \u03c3\u03b5 0 \u03b1\u03c3\u03cd\u03b3\u03c7\u03c1\u03bf\u03bd\u03b1 ramBusTip= Data: \u03b7 \u03c4\u03b9\u03bc\u03ae \u03c6\u03bf\u03c1\u03c4\u03ce\u03bd\u03b5\u03c4\u03b1\u03b9 \u03ae \u03b1\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03cd\u03b5\u03c4\u03b1\u03b9 \u03c3\u03c4\u03b7 \u03b4\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 ramInTip= Input: \u03c4\u03b9\u03bc\u03ae \u03c0\u03c1\u03bf\u03c2 \u03b1\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7 \u03c3\u03c4\u03b7 \u03b4\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 ramBusAttr= \u0394\u03b9\u03b5\u03c0\u03b1\u03c6\u03ae \u0394\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd ramBusSynchCombined= \u039c\u03b9\u03b1 \u03c3\u03cd\u03b3\u03c7\u03c1\u03bf\u03bd\u03b7 \u03b8\u03cd\u03c1\u03b1 \u03c6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7\u03c2/\u03b1\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7\u03c2 ramBusAsynchCombined= \u039c\u03b9\u03b1 \u03b1\u03c3\u03cd\u03b3\u03c7\u03c1\u03bf\u03bd\u03b7 \u03b8\u03cd\u03c1\u03b1 \u03c6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7\u03c2/\u03b1\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7\u03c2 ramBusSeparate= \u039e\u03b5\u03c7\u03c9\u03c1\u03b9\u03c3\u03c4\u03ad\u03c2 \u03b8\u03cd\u03c1\u03b5\u03c2 \u03c6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7\u03c2 \u03ba\u03b1\u03b9 \u03b1\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7\u03c2 ramEditMenuItem= \u0395\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03a0\u03b5\u03c1\u03b9\u03b5\u03c7\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd... ramClearMenuItem= \u039a\u03b1\u03b8\u03b1\u03c1\u03b9\u03c3\u03bc\u03cc\u03c2 \u03a0\u03b5\u03c1\u03b9\u03b5\u03c7\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd ramLoadMenuItem= \u03a6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7 \u0395\u03b9\u03ba\u03cc\u03bd\u03b1\u03c2... ramSaveMenuItem= \u0391\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7 \u0395\u03b9\u03ba\u03cc\u03bd\u03b1\u03c2... ramConfirmClearTitle= \u0395\u03c0\u03b9\u03b2\u03b5\u03b2\u03b1\u03af\u03c9\u03c3\u03b7 \u039a\u03b1\u03b8\u03b1\u03c1\u03b9\u03c3\u03bc\u03bf\u03cd ramConfirmClearMsg= \u0395\u03af\u03c3\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03bf\u03b9 \u03cc\u03c4\u03b9 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03bc\u03b7\u03b4\u03b5\u03bd\u03af\u03c3\u03b5\u03c4\u03b5 \u03c4\u03b7\u03bd \u03bc\u03bd\u03ae\u03bc\u03b7; ramLoadDialogTitle= \u03a6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7 \u0395\u03b9\u03ba\u03cc\u03bd\u03b1\u03c2 RAM ramLoadErrorTitle= \u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03a6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7\u03c2 ramSaveDialogTitle= \u0391\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7 \u0395\u03b9\u03ba\u03cc\u03bd\u03b1\u03c2 RAM ramSaveErrorTitle= \u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03ba\u03b1\u03c4\u03ac \u03c4\u03b7\u03bd \u0391\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7 # std/memory/ShiftRegister.java shiftRegisterComponent= \u039a\u03b1\u03c4\u03b1\u03c7\u03c9\u03c1\u03b7\u03c4\u03ae\u03c2 \u039f\u03bb\u03af\u03c3\u03b8\u03b7\u03c3\u03b7\u03c2 shiftRegisterLabel1= shift reg shiftRegisterLabel2= %sx%s shiftRegLengthAttr= \u0391\u03c1\u03b9\u03b8\u03bc\u03cc\u03c2 \u03a3\u03c4\u03b1\u03b4\u03af\u03c9\u03bd shiftRegParallelAttr= \u03a0\u03b1\u03c1\u03ac\u03bb\u03bb\u03b7\u03bb\u03b7 \u03a6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7 shiftRegShiftTip= Shift: \u03b7 \u03bf\u03bb\u03af\u03c3\u03b8\u03b7\u03c3\u03b7 \u03b5\u03af\u03bd\u03b1\u03b9 \u03b1\u03bd\u03b5\u03bd\u03b5\u03c1\u03b3\u03ae \u03cc\u03c4\u03b1\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 0 shiftRegClockTip= Clock: \u03bf\u03b9 \u03c4\u03b9\u03bc\u03ad\u03c2 \u03bc\u03c0\u03bf\u03c1\u03bf\u03cd\u03bd \u03bd\u03b1 \u03b1\u03bd\u03b1\u03bd\u03b5\u03ce\u03bd\u03bf\u03bd\u03c4\u03b1\u03b9 \u03bc\u03b5 \u03c4\u03bf\u03bd \u03c3\u03ba\u03b1\u03bd\u03b4\u03b1\u03bb\u03b9\u03c3\u03bc\u03cc shiftRegClearTip= Clear: \u03cc\u03c4\u03b1\u03bd 1, \u03b1\u03c1\u03c7\u03b9\u03ba\u03bf\u03c0\u03bf\u03b9\u03bf\u03cd\u03bd\u03c4\u03b1\u03b9 \u03cc\u03bb\u03b1 \u03c3\u03b5 0 \u03b1\u03c3\u03cd\u03b3\u03c7\u03c1\u03bf\u03bd\u03b1 shiftRegInTip= Input: \u03b7 \u03c4\u03b9\u03bc\u03ae \u03c0\u03c1\u03bf\u03c2 \u03bf\u03bb\u03af\u03c3\u03b8\u03b7\u03c3\u03b7 \u03c3\u03c4\u03bf \u03c0\u03c1\u03ce\u03c4\u03bf \u03c3\u03c4\u03ac\u03b4\u03b9\u03bf shiftRegOutTip= Output: \u03b5\u03af\u03bd\u03b1\u03b9 \u03c4\u03bf \u03c0\u03b5\u03c1\u03b9\u03b5\u03c7\u03cc\u03bc\u03b5\u03bd\u03bf \u03c4\u03bf\u03c5 \u03c4\u03b5\u03bb\u03b5\u03c5\u03c4\u03b1\u03af\u03bf\u03c5 \u03c3\u03c4\u03b1\u03b4\u03af\u03bf\u03c5 shiftRegLoadTip= Load: \u03cc\u03c4\u03b1\u03bd 1 (\u03bc\u03b5 shift = 0), \u03cc\u03bb\u03b1 \u03c4\u03b1 \u03c3\u03c4\u03ac\u03b4\u03b9\u03b1 \u03c6\u03bf\u03c1\u03c4\u03ce\u03bd\u03bf\u03c5\u03bd \u03b1\u03c0\u03cc \u03c4\u03b9\u03c2 \u03b5\u03b9\u03c3\u03cc\u03b4\u03bf\u03c5\u03c2 # # std/Plexers.java # plexerLibrary= \u03a0\u03bb\u03ad\u03ba\u03c4\u03b5\u03c2/\u039a\u03c9\u03b4\u03b9\u03ba\u03bf\u03c0\u03bf\u03b9\u03b7\u03c4\u03ad\u03c2 plexerSelectBitsAttr= \u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae \u03a8\u03b7\u03c6\u03af\u03c9\u03bd plexerThreeStateAttr= \u03a4\u03c1\u03b9\u03ce\u03bd-\u039a\u03b1\u03c4\u03b1\u03c3\u03c4\u03ac\u03c3\u03b5\u03c9\u03bd? plexerDisabledAttr= \u0391\u03c0\u03b5\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03b9\u03b7\u03bc\u03ad\u03bd\u03b7 \u0388\u03be\u03bf\u03b4\u03bf\u03c2 plexerDisabledFloating= \u0391\u03c3\u03cd\u03bd\u03b4\u03b5\u03c4\u03bf plexerDisabledZero= \u039c\u03b7\u03b4\u03ad\u03bd # std/Multiplexer.java multiplexerComponent= \u03a0\u03bf\u03bb\u03c5\u03c0\u03bb\u03ad\u03ba\u03c4\u03b7\u03c2 multiplexerSelectTip= Select: \u03c5\u03c0\u03bf\u03b4\u03b5\u03b9\u03ba\u03bd\u03cd\u03b5\u03b9 \u03c0\u03bf\u03b9\u03b1 \u03b5\u03af\u03c3\u03bf\u03b4\u03bf \u03bf\u03b4\u03b7\u03b3\u03b5\u03af\u03c4\u03b1\u03b9 \u03c3\u03c4\u03b7\u03bd \u03ad\u03be\u03bf\u03b4\u03bf multiplexerEnableTip= Enable: \u03cc\u03c4\u03b1\u03bd \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 0, \u03ad\u03be\u03bf\u03b4\u03bf\u03c2 \u03b5\u03af\u03bd\u03b1\u03b9 \u03b7 \u03b5\u03c0\u03b9\u03bb\u03b5\u03b3\u03bc\u03ad\u03bd\u03b7 \u03b5\u03af\u03c3\u03bf\u03b4\u03bf\u03c2 multiplexerInTip= \u0395\u03af\u03c3\u03bf\u03b4\u03bf\u03c2 %s multiplexerOutTip= \u0388\u03be\u03bf\u03b4\u03bf\u03c2 # std/Demultiplexer.java demultiplexerComponent= \u0391\u03c0\u03bf\u03c0\u03bb\u03ad\u03ba\u03c4\u03b7\u03c2 demultiplexerSelectTip= Select: \u03c5\u03c0\u03bf\u03b4\u03b5\u03b9\u03ba\u03bd\u03cd\u03b5\u03b9 \u03c0\u03bf\u03b9\u03b1 \u03ad\u03be\u03bf\u03b4\u03bf\u03c2 \u03b4\u03ad\u03c7\u03b5\u03c4\u03b1\u03b9 \u03c4\u03b7\u03bd \u03b5\u03af\u03c3\u03bf\u03b4\u03bf demultiplexerEnableTip= Enable: \u03cc\u03c4\u03b1\u03bd \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 0, \u03b7 \u03b5\u03c0\u03b9\u03bb\u03b5\u03b3\u03bc\u03ad\u03bd\u03b7 \u03ad\u03be\u03bf\u03b4\u03bf\u03c2 \u03b5\u03af\u03bd\u03b1\u03b9 \u03b7 \u03b5\u03af\u03c3\u03bf\u03b4\u03bf\u03c2 demultiplexerInTip= \u0395\u03af\u03c3\u03bf\u03b4\u03bf\u03c2 demultiplexerOutTip= \u0388\u03be\u03bf\u03b4\u03bf\u03c2 %s # std/Decoder.java decoderComponent= \u0391\u03c0\u03bf\u03ba\u03c9\u03b4\u03b9\u03ba\u03bf\u03c0\u03bf\u03b9\u03b7\u03c4\u03ae\u03c2 decoderSelectTip= Select: \u03c5\u03c0\u03bf\u03b4\u03b5\u03b9\u03ba\u03bd\u03cd\u03b5\u03b9 \u03c0\u03bf\u03b9\u03b1 \u03ad\u03be\u03bf\u03b4\u03bf \u03b3\u03af\u03bd\u03b5\u03c4\u03b1\u03b9 1 decoderEnableTip= Enable: \u03cc\u03c4\u03b1\u03bd \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 0, \u03b7 \u03b5\u03c0\u03b9\u03bb\u03b5\u03b3\u03bc\u03ad\u03bd\u03b7 \u03ad\u03be\u03bf\u03b4\u03bf\u03c2 \u03b5\u03af\u03bd\u03b1\u03b9 \u03b7 \u03b5\u03af\u03c3\u03bf\u03b4\u03bf\u03c2 decoderOutTip= \u0388\u03be\u03bf\u03b4\u03bf\u03c2 %s # std/plexers/PriorityEncoder.java priorityEncoderComponent= \u039a\u03c9\u03b4\u03b9\u03ba\u03bf\u03c0\u03bf\u03b9\u03b7\u03c4\u03ae\u03c2 \u03a0\u03c1\u03bf\u03c4\u03b5\u03c1\u03b1\u03b9\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2 priorityEncoderInTip= \u0395\u03af\u03c3\u03bf\u03b4\u03bf\u03c2 %s priorityEncoderOutTip= Output: \u03b4\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 \u03c4\u03b7\u03c2 \u03c5\u03c8\u03b7\u03bb\u03cc\u03c4\u03b5\u03c1\u03b7\u03c2-\u03b2\u03b1\u03b8\u03bc\u03bf\u03bd\u03bf\u03bc\u03b7\u03bc\u03ad\u03bd\u03b7\u03c2 \u03bc\u03b5 1 \u03b5\u03b9\u03c3\u03cc\u03b4\u03bf\u03c5 priorityEncoderEnableInTip= Enable Input: \u03bc\u03b5 0 \u03b1\u03c0\u03b5\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03b9\u03b5\u03af \u03c4\u03bf \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf priorityEncoderEnableOutTip= Enable Output: 1 \u03b1\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b5\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03b9\u03b7\u03bc\u03ad\u03bd\u03bf \u03ba\u03b1\u03b9 \u03ba\u03b1\u03bc\u03af\u03b1 \u03b5\u03af\u03c3\u03bf\u03b4\u03bf\u03c2 \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 1 priorityEncoderGroupSignalTip= Group Select: 1 \u03b1\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b5\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03b9\u03b7\u03bc\u03ad\u03bd\u03bf \u03ba\u03b1\u03b9 \u03bf\u03c0\u03bf\u03b9\u03b1\u03b4\u03ae\u03c0\u03bf\u03c4\u03b5 \u03b5\u03af\u03c3\u03bf\u03b4\u03bf\u03c2 \u03b5\u03af\u03bd\u03b1\u03b9 1 # std/BitSelector.java bitSelectorComponent= \u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ad\u03b1\u03c2 Bit bitSelectorGroupAttr= Bits \u0395\u03be\u03cc\u03b4\u03bf\u03c5 bitSelectorOutputTip= Output: \u03b7 \u03c4\u03b9\u03bc\u03ae \u03c4\u03b7\u03c2 \u03b5\u03c0\u03b9\u03bb\u03b5\u03b3\u03bc\u03ad\u03bd\u03b7\u03c2 \u03bf\u03bc\u03ac\u03b4\u03b1\u03c2 bits \u03b1\u03c0\u03cc \u03c4\u03b1 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1 bitSelectorDataTip= \u0394\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1 bitSelectorSelectTip= Select: \u03c5\u03c0\u03bf\u03b4\u03b5\u03b9\u03ba\u03bd\u03cd\u03b5\u03b9 \u03c0\u03bf\u03b9\u03b1 \u03bf\u03bc\u03ac\u03b4\u03b1 \u03b1\u03c0\u03cc \u03c4\u03b1 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1 \u03ad\u03c7\u03b5\u03b9 \u03b5\u03c0\u03b9\u03bb\u03b5\u03b3\u03b5\u03af # # arith/Arithmetic.java # arithmeticLibrary= \u0391\u03c1\u03b9\u03b8\u03bc\u03b7\u03c4\u03b9\u03ba\u03ac # arith/Adder.java adderComponent= \u0391\u03b8\u03c1\u03bf\u03b9\u03c3\u03c4\u03ae\u03c2 adderInputTip= Input: \u03ad\u03bd\u03b1\u03c2 \u03b1\u03c0\u03cc \u03c4\u03bf\u03c5\u03c2 \u03b1\u03c1\u03b9\u03b8\u03bc\u03bf\u03cd\u03c2 \u03c0\u03c1\u03bf\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b8\u03b5\u03c3\u03b7 adderOutputTip= Output: \u03a4\u03bf \u03ac\u03b8\u03c1\u03bf\u03b9\u03c3\u03bc\u03b1 \u03c4\u03c9\u03bd \u03b5\u03b9\u03c3\u03cc\u03b4\u03c9\u03bd (\u03c3\u03c5\u03bc\u03c0\u03b5\u03c1\u03b9\u03bb\u03b1\u03bc\u03b2\u03b1\u03bd\u03bf\u03bc\u03ad\u03bd\u03bf\u03c5 \u03c4\u03bf\u03c5 \u03ba\u03c1\u03b1\u03c4\u03bf\u03c5\u03bc\u03ad\u03bd\u03bf\u03c5 \u03b5\u03b9\u03c3\u03cc\u03b4\u03bf\u03c5) adderCarryInTip= Carry In: \u03b1\u03bd 1, \u03ad\u03bd\u03b1 \u03b5\u03c0\u03b9\u03c0\u03bb\u03ad\u03bf\u03bd 1 \u03c0\u03c1\u03bf\u03c3\u03c4\u03af\u03b8\u03b5\u03c4\u03b1\u03b9 \u03c3\u03c4\u03b7\u03bd \u03ad\u03be\u03bf\u03b4\u03bf adderCarryOutTip= Carry Out: 1 \u03b1\u03bd \u03c4\u03bf \u03ac\u03b8\u03c1\u03bf\u03b9\u03c3\u03bc\u03b1 \u03c5\u03c0\u03b5\u03c1\u03c7\u03b5\u03b9\u03bb\u03af\u03b6\u03b5\u03b9 \u03c4\u03b1 \u03b4\u03b9\u03b1\u03b8\u03ad\u03c3\u03b9\u03bc\u03b1 bits # arith/Subtractor.java subtractorComponent= \u0391\u03c6\u03b1\u03b9\u03c1\u03ad\u03c4\u03b7\u03c2 subtractorMinuendTip= \u0391\u03c6\u03b1\u03b9\u03c1\u03ad\u03c4\u03b7\u03c2: \u03bf \u03b1\u03c1\u03b9\u03b8\u03bc\u03cc\u03c2 \u03b1\u03c0\u03cc \u03c4\u03bf\u03bd \u03bf\u03c0\u03bf\u03af\u03bf \u03b8\u03b1 \u03b1\u03c6\u03b1\u03b9\u03c1\u03ad\u03c3\u03bf\u03c5\u03bc\u03b5 subtractorSubtrahendTip= \u0391\u03c6\u03b1\u03b9\u03c1\u03b5\u03c4\u03ad\u03bf\u03c2: \u03bf \u03b1\u03c1\u03b9\u03b8\u03bc\u03cc\u03c2 \u03c0\u03bf\u03c5 \u03b8\u03b1 \u03b1\u03c6\u03b1\u03b9\u03c1\u03b5\u03b8\u03b5\u03af \u03b1\u03c0\u03cc \u03c4\u03bf\u03bd \u03b1\u03c6\u03b1\u03b9\u03c1\u03ad\u03c4\u03b7 subtractorOutputTip= Output: \u03b7 \u03b4\u03b9\u03b1\u03c6\u03bf\u03c1\u03ac \u03c4\u03bf\u03c5 \u03b1\u03c6\u03b1\u03b9\u03c1\u03ad\u03c4\u03b7 \u03ba\u03b1\u03b9 \u03c4\u03bf\u03c5 \u03b1\u03c6\u03b1\u03b9\u03c1\u03b5\u03c4\u03ad\u03bf\u03c5 subtractorBorrowInTip= Borrow In: \u03b1\u03bd 1, \u03b7 \u03ad\u03be\u03bf\u03b4\u03bf\u03c2 \u03bc\u03b5\u03b9\u03ce\u03bd\u03b5\u03c4\u03b1\u03b9 \u03ba\u03b1\u03c4\u03ac 1 subtractorBorrowOutTip= Borrow Out: 1 \u03b1\u03bd \u03b7 \u03b4\u03b9\u03b1\u03c6\u03bf\u03c1\u03ac \u03ad\u03c7\u03b5\u03b9 \u03c9\u03c2 \u03b1\u03c0\u03bf\u03c4\u03ad\u03bb\u03b5\u03c3\u03bc\u03b1 \u03b1\u03c1\u03bd\u03b7\u03c4\u03b9\u03ba\u03cc \u03b1\u03c1\u03b9\u03b8\u03bc\u03cc # arith/Multiplier.java multiplierComponent= \u03a0\u03bf\u03bb\u03bb\u03b1\u03c0\u03bb\u03b1\u03c3\u03b9\u03b1\u03c3\u03c4\u03ae\u03c2 multiplierInputTip= Input: \u03ad\u03bd\u03b1\u03c2 \u03b1\u03c0\u03cc \u03c4\u03bf\u03c5\u03c2 \u03b1\u03c1\u03b9\u03b8\u03bc\u03bf\u03cd\u03c2 \u03b3\u03b9\u03b1 \u03c0\u03bf\u03bb\u03bb\u03b1\u03c0\u03bb\u03b1\u03c3\u03b9\u03b1\u03c3\u03bc\u03cc multiplierOutputTip= Output: \u03c4\u03bf \u03b3\u03b9\u03bd\u03cc\u03bc\u03b5\u03bd\u03bf \u03c4\u03c9\u03bd \u03b5\u03b9\u03c3\u03cc\u03b4\u03c9\u03bd, \u03c3\u03c5\u03bd \u03c4\u03bf \u03ba\u03c1\u03b1\u03c4\u03bf\u03cd\u03bc\u03b5\u03bd\u03bf \u03b5\u03b9\u03c3\u03cc\u03b4\u03bf\u03c5 multiplierCarryInTip= Carry In: \u03ad\u03bd\u03b1\u03c2 \u03b1\u03c1\u03b9\u03b8\u03bc\u03cc\u03c2 \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03c0\u03c1\u03bf\u03c3\u03c4\u03b5\u03b8\u03b5\u03af \u03c3\u03c4\u03b7\u03bd \u03ad\u03be\u03bf\u03b4\u03bf multiplierCarryOutTip= Carry Out: \u03a4\u03b1 \u03c5\u03c8\u03b7\u03bb\u03cc\u03c4\u03b5\u03c1\u03b7\u03c2 \u03b1\u03be\u03af\u03b1\u03c2 bits \u03c4\u03bf\u03c5 \u03b3\u03b9\u03bd\u03bf\u03bc\u03ad\u03bd\u03bf\u03c5 # arith/Divider.java dividerComponent= \u0394\u03b9\u03b1\u03b9\u03c1\u03ad\u03c4\u03b7\u03c2 dividerUpperInput= upper dividerRemainderOutput= rem dividerDividendLowerTip= Dividend Lower: \u03c4\u03bf \u03c7\u03b1\u03bc\u03b7\u03bb\u03cc\u03c4\u03b5\u03c1\u03b7\u03c2 \u03b1\u03be\u03af\u03b1\u03c2 \u03bc\u03b9\u03c3\u03cc \u03c4\u03bf\u03c5 \u03b1\u03c1\u03b9\u03b8\u03bc\u03bf\u03cd \u03c0\u03bf\u03c5 \u03b8\u03b1 \u03b4\u03b9\u03b1\u03b9\u03c1\u03b5\u03b8\u03b5\u03af dividerDividendUpperTip= Dividend Upper: \u03c4\u03bf \u03c5\u03c8\u03b7\u03bb\u03cc\u03c4\u03b5\u03c1\u03b7\u03c2 \u03b1\u03be\u03af\u03b1\u03c2 \u03bc\u03b9\u03c3\u03cc \u03c4\u03bf\u03c5 \u03b1\u03c1\u03b9\u03b8\u03bc\u03bf\u03cd \u03c0\u03bf\u03c5 \u03b8\u03b1 \u03b4\u03b9\u03b1\u03b9\u03c1\u03b5\u03b8\u03b5\u03af dividerDivisorTip= Divisor: \u03bf \u03b1\u03c1\u03b9\u03b8\u03bc\u03cc\u03c2 \u03bc\u03b5 \u03c4\u03bf\u03bd \u03bf\u03c0\u03bf\u03af\u03bf \u03b8\u03b1 \u03b3\u03af\u03bd\u03b5\u03b9 \u03b7 \u03b4\u03b9\u03b1\u03af\u03c1\u03b5\u03c3\u03b7 dividerOutputTip= Output: \u03c4\u03bf \u03b1\u03c0\u03bf\u03c4\u03ad\u03bb\u03b5\u03c3\u03bc\u03b1 \u03c4\u03b7\u03c2 \u03b4\u03b9\u03b1\u03af\u03c1\u03b5\u03c3\u03b7\u03c2 dividerRemainderTip= Remainder: \u03c4\u03bf \u03c5\u03c0\u03cc\u03bb\u03bf\u03b9\u03c0\u03bf \u03c4\u03b7\u03c2 \u03b4\u03b9\u03b1\u03af\u03c1\u03b5\u03c3\u03b7\u03c2 (dividend - output * divisor) # arith/Negator.java negatorComponent= \u0391\u03c1\u03bd\u03b7\u03c4\u03b9\u03ba\u03cc\u03c2 \u0391\u03c1\u03b9\u03b8\u03bc\u03cc\u03c2 negatorInputTip= Input: \u03bf \u03b1\u03c1\u03b9\u03b8\u03bc\u03cc\u03c2 \u03c0\u03bf\u03c5 \u03b8\u03b1 \u03bc\u03b5\u03c4\u03b1\u03c4\u03c1\u03b1\u03c0\u03b5\u03af \u03c3\u03b5 \u03b1\u03c1\u03bd\u03b7\u03c4\u03b9\u03ba\u03cc negatorOutputTip= Output: \u03c4\u03bf \u03c3\u03c5\u03bc\u03c0\u03bb\u03ae\u03c1\u03c9\u03bc\u03b1 \u03c9\u03c2 \u03c0\u03c1\u03bf\u03c2 2 \u03c4\u03b7\u03c2 \u03b5\u03b9\u03c3\u03cc\u03b4\u03bf\u03c5 # arith/Comparator.java comparatorComponent= \u03a3\u03c5\u03b3\u03ba\u03c1\u03b9\u03c4\u03ae\u03c2 comparatorType= \u0391\u03c1\u03b9\u03b8\u03bc\u03b7\u03c4\u03b9\u03ba\u03cc\u03c2 \u03a4\u03cd\u03c0\u03bf\u03c2 unsignedOption= \u0391\u03c0\u03c1\u03bf\u03c3\u03ae\u03bc\u03b1\u03c3\u03c4\u03bf twosComplementOption= \u03a3\u03c5\u03bc\u03c0\u03bb\u03ae\u03c1\u03c9\u03bc\u03b1 \u03c9\u03c2 \u03c0\u03c1\u03bf\u03c2 2 comparatorInputATip= A: \u03bf \u03b1\u03c1\u03b9\u03b8\u03bc\u03cc\u03c2 \u03c0\u03bf\u03c5 \u03c0\u03c1\u03bf\u03b7\u03b3\u03b5\u03af\u03c4\u03b1\u03b9 \u03c4\u03bf\u03c5 \u03c7\u03b5\u03b9\u03c1\u03b9\u03c3\u03c4\u03b7\u03c1\u03af\u03bf\u03c5 \u03c3\u03cd\u03b3\u03ba\u03c1\u03b9\u03c3\u03b7\u03c2 comparatorInputBTip= B: \u03bf \u03b1\u03c1\u03b9\u03b8\u03bc\u03cc\u03c2 \u03c0\u03bf\u03c5 \u03ad\u03c0\u03b5\u03c4\u03b1\u03b9 \u03c4\u03bf\u03c5 \u03c7\u03b5\u03b9\u03c1\u03b9\u03c3\u03c4\u03b7\u03c1\u03af\u03bf\u03c5 \u03c3\u03cd\u03b3\u03ba\u03c1\u03b9\u03c3\u03b7\u03c2 comparatorLessTip= Less: 1 \u03b1\u03bd \u03c4\u03bf A \u03b5\u03af\u03bd\u03b1\u03b9 \u03bc\u03b9\u03ba\u03c1\u03cc\u03c4\u03b5\u03c1\u03bf \u03c4\u03bf\u03c5 B comparatorEqualTip= Equal: 1 \u03b1\u03bd \u03c4\u03bf A \u03b5\u03af\u03bd\u03b1\u03b9 \u03af\u03c3\u03bf \u03bc\u03b5 \u03c4\u03bf B comparatorGreaterTip= Greater: 1 \u03b1\u03bd \u03c4\u03bf A \u03b5\u03af\u03bd\u03b1\u03b9 \u03bc\u03b5\u03b3\u03b1\u03bb\u03cd\u03c4\u03b5\u03c1\u03bf \u03c4\u03bf\u03c5 B # arith/Shifter.java shifterComponent= \u039f\u03bb\u03b9\u03c3\u03b8\u03b7\u03c4\u03ae\u03c2 shifterShiftAttr= \u03a4\u03cd\u03c0\u03bf\u03c2 \u039f\u03bb\u03af\u03c3\u03b8\u03b7\u03c3\u03b7\u03c2 shiftLogicalLeft= \u039b\u03bf\u03b3\u03b9\u03ba\u03ae \u0391\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac shiftLogicalRight= \u039b\u03bf\u03b3\u03b9\u03ba\u03ae \u0394\u03b5\u03be\u03b9\u03ac shiftArithmeticRight= \u0391\u03c1\u03b9\u03b8\u03bc\u03b7\u03c4\u03b9\u03ba\u03ae \u0394\u03b5\u03be\u03b9\u03ac shiftRollLeft= \u03a0\u03b5\u03c1\u03b9\u03c3\u03c4\u03c1\u03bf\u03c6\u03ae \u0391\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac shiftRollRight= \u03a0\u03b5\u03c1\u03b9\u03c3\u03c4\u03c1\u03bf\u03c6\u03ae \u0394\u03b5\u03be\u03b9\u03ac shifterDistanceTip= Distance: \u03c0\u03cc\u03c3\u03b5\u03c2 \u03c0\u03bf\u03bb\u03b9\u03c3\u03b8\u03ae\u03c3\u03b5\u03b9\u03c2 \u03c4\u03b7\u03c2 \u03b5\u03b9\u03c3\u03cc\u03b4\u03bf\u03c5 \u03b8\u03b1 \u03b3\u03af\u03bd\u03bf\u03c5\u03bd shifterInputTip= Input: \u03c4\u03b1 bits \u03c0\u03bf\u03c5 \u03b8\u03b1 \u03bf\u03bb\u03b9\u03c3\u03b8\u03ae\u03c3\u03bf\u03c5\u03bc\u03b5 shifterOutputTip= Output: \u03c4\u03bf \u03b1\u03c0\u03bf\u03c4\u03ad\u03bb\u03b5\u03c3\u03bc\u03b1 \u03c4\u03b7\u03c2 \u03bf\u03bb\u03af\u03c3\u03b8\u03b7\u03c3\u03b7\u03c2 \u03c4\u03b7\u03c2 \u03b5\u03b9\u03c3\u03cc\u03b4\u03bf\u03c5 # arith/BitAdder.java bitAdderComponent= \u039c\u03b5\u03c4\u03c1\u03b7\u03c4\u03ae\u03c2 Bit bitAdderInputTip= Input: \u03c4\u03b1 bits \u03c0\u03bf\u03c5 \u03c0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03b1\u03c0\u03b1\u03c1\u03b9\u03b8\u03bc\u03b7\u03b8\u03bf\u03cd\u03bd bitAdderOutputManyTip= Output: \u03c4\u03bf \u03c0\u03bb\u03ae\u03b8\u03bf\u03c2 \u03c4\u03c9\u03bd bits \u03bc\u03b5 \u03c4\u03b9\u03bc\u03ae 1 \u03c3\u03c4\u03b7\u03bd \u03b5\u03af\u03c3\u03bf\u03b4\u03bf bitAdderOutputOneTip= Output: \u03c4\u03bf \u03c0\u03bb\u03ae\u03b8\u03bf\u03c2 \u03c4\u03c9\u03bd bits \u03bc\u03b5 \u03c4\u03b9\u03bc\u03ae 1 \u03c3\u03c4\u03b7\u03bd \u03b5\u03af\u03c3\u03bf\u03b4\u03bf # arith/BitFinder.java bitFinderComponent= \u0395\u03cb\u03c1\u03b5\u03c3\u03b7 Bit bitFinderFindLabel= find bitFinderHighLabel= high bitFinderLowLabel= low bitFinderHighOption= \u03a5\u03c8\u03b7\u03bb\u03cc\u03c4\u03b5\u03c1\u03b7\u03c2-\u03c4\u03ac\u03be\u03b7\u03c2 %s bitFinderLowOption= \u03a7\u03b1\u03bc\u03b7\u03bb\u03cc\u03c4\u03b5\u03c1\u03b7\u03c2-\u03c4\u03ac\u03be\u03b7\u03c2 %s bitFinderTypeAttr= \u03a4\u03cd\u03c0\u03bf\u03c2 bitFinderIndexHighTip= Index: \u03b4\u03b5\u03af\u03ba\u03c4\u03b7\u03c2 \u03c4\u03bf\u03c5 \u03c5\u03c8\u03b7\u03bb\u03cc\u03c4\u03b5\u03c1\u03b7\u03c2-\u03c4\u03b1\u03be\u03b7\u03c2 %s \u03c4\u03b7\u03c2 \u03b5\u03b9\u03c3\u03cc\u03b4\u03bf\u03c5 bitFinderIndexLowTip= Index: \u03b4\u03b5\u03af\u03ba\u03c4\u03b7\u03c2 \u03c4\u03bf\u03c5 \u03c7\u03b1\u03bc\u03b7\u03bb\u03cc\u03c4\u03b5\u03c1\u03b7\u03c2-\u03c4\u03ac\u03be\u03b7\u03c2 %s \u03c4\u03b7\u03c2 \u03b5\u03b9\u03c3\u03cc\u03b4\u03bf\u03c5 bitFinderPresentTip= Present: 1 \u03b1\u03bd \u03b7 \u03b5\u03af\u03c3\u03bf\u03b4\u03bf\u03c2 \u03c0\u03b5\u03c1\u03b9\u03ad\u03c7\u03b5\u03b9 \u03ad\u03bd\u03b1 %s bitFinderInputTip= Input: \u03c4\u03b1 bits \u03c4\u03b1 \u03bf\u03c0\u03bf\u03af\u03b1 \u03b8\u03b1 \u03c8\u03ac\u03be\u03bf\u03c5\u03bc\u03b5 # # io # # io/Io.java ioLibrary= \u0395\u03af\u03c3\u03bf\u03b4\u03bf\u03c2/\u0388\u03be\u03bf\u03b4\u03bf\u03c2 ioLabelCenter= \u039a\u03ad\u03bd\u03c4\u03c1\u03bf ioBitWidthAttr= \u0395\u03cd\u03c1\u03bf\u03c2 Bit ioColorAttr= \u03a7\u03c1\u03ce\u03bc\u03b1 ioLabelLocAttr= \u0398\u03ad\u03c3\u03b7 \u0395\u03c4\u03b9\u03ba\u03ad\u03c4\u03b1\u03c2 ioLabelColorAttr= \u03a7\u03c1\u03ce\u03bc\u03b1 \u0395\u03c4\u03b9\u03ba\u03ad\u03c4\u03b1\u03c2 ioActiveAttr= \u0395\u03bd\u03b5\u03c1\u03b3\u03cc \u03cc\u03c4\u03b1\u03bd \u03a5\u03c8\u03b7\u03bb\u03cc? # io/Button.java buttonComponent= \u03a0\u03bb\u03ae\u03ba\u03c4\u03c1\u03bf # io/Joystick.java joystickComponent= \u03a7\u03b5\u03b9\u03c1\u03b9\u03c3\u03c4\u03ae\u03c1\u03b9\u03bf # io/Keyboard.java keyboardComponent= \u03a0\u03bb\u03b7\u03ba\u03c4\u03c1\u03bf\u03bb\u03cc\u03b3\u03b9\u03bf keybDesc= \u03a0\u03bb\u03b7\u03ba\u03c4\u03c1\u03bf\u03bb\u03cc\u03b3\u03b9\u03bf (buffer cap. %s) keybBufferLengthAttr= \u039c\u03ae\u03ba\u03bf\u03c2 Buffer keybClearTip= Clear: \u03cc\u03c4\u03b1\u03bd 1 \u03b1\u03b4\u03b5\u03b9\u03ac\u03b6\u03b5\u03b9 \u03c4\u03bf buffer keybClockTip= Clock: \u03bc\u03b5 \u03c4\u03bf\u03bd \u03c3\u03ba\u03b1\u03bd\u03b4\u03b1\u03bb\u03b9\u03c3\u03bc\u03cc \u03ba\u03b1\u03c4\u03b1\u03bd\u03b1\u03bb\u03ce\u03bd\u03b5\u03c4\u03b1\u03b9 \u03bf \u03c0\u03c1\u03ce\u03c4\u03bf\u03c2 \u03c7\u03b1\u03c1\u03b1\u03ba\u03c4\u03ae\u03c1\u03b1\u03c2 \u03b1\u03c0\u03cc \u03c4\u03bf buffer keybEnableTip= Read enable: \u03c4\u03bf 0 \u03b1\u03c0\u03b5\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03b9\u03b5\u03af \u03c4\u03bf \u03c1\u03bf\u03bb\u03cc\u03b9 keybAvailTip= Available: 1 \u03cc\u03c4\u03b1\u03bd \u03bf buffer \u03b4\u03b9\u03b1\u03b8\u03ad\u03c4\u03b5\u03b9 \u03c7\u03b1\u03c1\u03b1\u03ba\u03c4\u03ae\u03c1\u03b5\u03c2 keybOutputTip= Data: \u03b7 ASCII \u03c4\u03b9\u03bc\u03ae \u03c4\u03bf\u03c5 \u03c0\u03c1\u03ce\u03c4\u03bf\u03c5 \u03c7\u03b1\u03c1\u03b1\u03ba\u03c4\u03ae\u03c1\u03b1 \u03c4\u03bf\u03c5 buffer # io/Led.java ledComponent= LED # io/SevenSegment.java sevenSegmentComponent= 7-Segment Display # io/HexDigit.java hexDigitComponent= Hex Digit Display # io/DotMatrix.java dotMatrixComponent= LED Matrix ioMatrixInput= \u039c\u03bf\u03c1\u03c6\u03ae \u0395\u03b9\u03c3\u03cc\u03b4\u03bf\u03c5 ioMatrixRows= \u0393\u03c1\u03b1\u03bc\u03bc\u03ad\u03c2 \u03a0\u03af\u03bd\u03b1\u03ba\u03b1 ioMatrixCols= \u03a3\u03c4\u03ae\u03bb\u03b5\u03c2 \u03a0\u03af\u03bd\u03b1\u03ba\u03b1 ioOnColor= \u03a7\u03c1\u03ce\u03bc\u03b1 \u0395\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7\u03c2 ioOffColor= \u03a7\u03c1\u03ce\u03bc\u03b1 \u0391\u03c0\u03b5\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7\u03c2 ioBackgroundColor= \u03a6\u03cc\u03bd\u03c4\u03bf ioMatrixPersistenceAttr= \u03a6\u03c9\u03c2 \u0395\u03bc\u03bc\u03bf\u03bd\u03ae\u03c2 ioMatrixShape= \u03a3\u03c7\u03ae\u03bc\u03b1 \u039a\u03bf\u03c5\u03ba\u03af\u03b4\u03b1\u03c2 ioInputColumn= \u03a3\u03c4\u03ae\u03bb\u03b5\u03c2 ioInputRow= \u0393\u03c1\u03b1\u03bc\u03bc\u03ad\u03c2 ioInputSelect= \u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae \u0393\u03c1\u03b1\u03bc\u03bc\u03ad\u03c2/\u03a3\u03c4\u03ae\u03bb\u03b5\u03c2 ioShapeCircle= \u039a\u03c5\u03ba\u03bb\u03b9\u03ba\u03cc ioShapeSquare= \u03a4\u03b5\u03c4\u03c1\u03ac\u03b3\u03c9\u03bd\u03bf # io/Tty.java ttyComponent= TTY ttyDesc= TTY (%s rows, %s cols) ttyDescShort= TTY ttyRowsAttr= \u0393\u03c1\u03b1\u03bc\u03bc\u03ad\u03c2 ttyColsAttr= \u03a3\u03c4\u03ae\u03bb\u03b5\u03c2 ttyClearTip= Clear: \u03cc\u03c4\u03b1\u03bd 1 \u03ba\u03b1\u03b8\u03b1\u03c1\u03af\u03b6\u03b5\u03b9 \u03c4\u03b7\u03bd \u03bf\u03b8\u03cc\u03bd\u03b7 ttyClockTip= Clock: \u03bf \u03c3\u03ba\u03b1\u03bd\u03b4\u03b1\u03bb\u03b9\u03c3\u03bc\u03cc\u03c2 \u03c0\u03c1\u03bf\u03c3\u03b8\u03ad\u03c4\u03b5\u03b9 \u03c7\u03b1\u03c1\u03b1\u03ba\u03c4\u03ae\u03c1\u03b1 \u03c3\u03c4\u03b7\u03bd \u03b5\u03af\u03c3\u03bf\u03b4\u03bf ttyEnableTip= Write enable: \u03cc\u03c4\u03b1\u03bd 0 \u03b1\u03c0\u03b5\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03b9\u03b5\u03af \u03c4\u03bf \u03c1\u03bf\u03bb\u03cc\u03b9 ttyInputTip= Data: \u03b7 ASCII \u03c4\u03b9\u03bc\u03ae \u03c4\u03bf\u03c5 \u03b5\u03c0\u03cc\u03bc\u03b5\u03bd\u03bf\u03c5 \u03c7\u03b1\u03c1\u03b1\u03ba\u03c4\u03ae\u03c1\u03b1 \u03c0\u03c1\u03bf\u03c2 \u03b5\u03b3\u03b3\u03c1\u03b1\u03c6\u03ae logisim-2.7.1/resources/logisim/el/start.properties0000644000175000017500000002527011530601316022414 0ustar vincentvincent# # Startup.java # argTwoSubstitutionError= \u0397 \u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae "-sub" \u03c0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03b1\u03ba\u03bf\u03bb\u03bf\u03c5\u03b8\u03b5\u03af\u03c4\u03b1\u03b9 \u03b1\u03c0\u03cc \u03b4\u03cd\u03bf \u03c0\u03b1\u03c1\u03b1\u03bc\u03ad\u03c4\u03c1\u03bf\u03c5\u03c2. argDuplicateSubstitutionError= \u0394\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03c5\u03c0\u03bf\u03ba\u03b1\u03c4\u03b1\u03c3\u03c4\u03b1\u03b8\u03b5\u03af \u03c4\u03bf \u03af\u03b4\u03b9\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf \u03c0\u03bf\u03bb\u03bb\u03b1\u03c0\u03bb\u03ad\u03c2 \u03c6\u03bf\u03c1\u03ad\u03c2. ttyNeedsFileError= \u0397 \u03c7\u03c1\u03ae\u03c3\u03b7 \u03c4\u03b7\u03c2 "-tty" \u03b1\u03c0\u03b1\u03b9\u03c4\u03b5\u03af \u03bd\u03b1 \u03b4\u03bf\u03b8\u03b5\u03af \u03ad\u03bd\u03b1 \u03cc\u03bd\u03bf\u03bc\u03b1 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5 \u03c3\u03b5 \u03b3\u03c1\u03b1\u03bc\u03bc\u03ae \u03b5\u03bd\u03c4\u03bf\u03bb\u03ae\u03c2. argTtyOption= -tty format \u03b5\u03ba\u03c4\u03ad\u03bb\u03b5\u03c3\u03b7 \u03b4\u03af\u03c7\u03c9\u03c2 \u03b3\u03c1\u03b1\u03c6\u03b9\u03ba\u03ae \u03b4\u03b9\u03b5\u03c0\u03b1\u03c6\u03ae argSubOption= -sub file1 file2 \u03c6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5 \u03b1\u03bd\u03c4\u03b9\u03ba\u03b1\u03b8\u03b9\u03c3\u03c4\u03ce\u03bd\u03c4\u03b1\u03c2 \u03c4\u03bf file1 \u03c4\u03b7\u03c2 \u03b2\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7\u03c2 \u03bc\u03b5 \u03c4\u03bf file2 argLoadOption= -load file \u03c6\u03bf\u03c1\u03c4\u03c9\u03c3\u03b7 \u03c4\u03bf\u03c5 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5 \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1\u03c2 \u03c3\u03c4\u03b7 RAM (\u03bb\u03b5\u03b9\u03c4\u03bf\u03c5\u03c1\u03b3\u03b5\u03af \u03bc\u03cc\u03bd\u03bf \u03bc\u03b5 \u03c4\u03b7\u03bd -tty) loadNeedsFileError= \u0397 \u03c7\u03c1\u03ae\u03c3\u03b7 \u03c4\u03b7\u03c2 "-load" \u03b1\u03c0\u03b1\u03b9\u03c4\u03b5\u03af \u03bd\u03b1 \u03b4\u03bf\u03b8\u03b5\u03af \u03ad\u03bd\u03b1 \u03cc\u03bd\u03bf\u03bc\u03b1 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5 \u03c3\u03b5 \u03b3\u03c1\u03b1\u03bc\u03bc\u03ae \u03b5\u03bd\u03c4\u03bf\u03bb\u03ae\u03c2. loadNeedsTtyError= \u0397 \u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae "-load" \u03bb\u03b5\u03b9\u03c4\u03bf\u03c5\u03c1\u03b3\u03b5\u03af \u03bc\u03cc\u03bd\u03bf \u03c3\u03b5 \u03c3\u03c5\u03bd\u03b4\u03c5\u03b1\u03c3\u03bc\u03cc \u03bc\u03b5 \u03c4\u03b7\u03bd "-tty". loadMultipleError= \u0397 \u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae "-load" \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03ba\u03b1\u03b8\u03bf\u03c1\u03b9\u03c3\u03c4\u03b5\u03af \u03bc\u03cc\u03bd\u03bf \u03bc\u03b9\u03b1 \u03c6\u03bf\u03c1\u03ac. ttyFormatError= \u0397 -tty \u03b1\u03c0\u03b1\u03b9\u03c4\u03b5\u03af \u03c4\u03bf\u03c5\u03bb\u03ac\u03c7\u03b9\u03c3\u03c4\u03bf\u03bd \u03ad\u03bd\u03b1 \u03b1\u03c0\u03cc \u03c4\u03b1 \u03b1\u03ba\u03cc\u03bb\u03bf\u03c5\u03b8\u03b1: halt, speed, stats, table, tty argOneTemplateError= \u039c\u03cc\u03bd\u03bf \u03ad\u03bd\u03b1 \u03c0\u03c1\u03cc\u03c4\u03c5\u03c0\u03bf \u03b5\u03c0\u03b9\u03c4\u03c1\u03ad\u03c0\u03b5\u03c4\u03b1\u03b9. argUsage= \u03c7\u03c1\u03ae\u03c3\u03b7: java %s [options] [filenames] argOptionHeader= \u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ad\u03c2... argEmptyOption= -empty \u03c7\u03c1\u03ae\u03c3\u03b7 \u03ba\u03b5\u03bd\u03bf\u03cd \u03c0\u03c1\u03bf\u03c4\u03cd\u03c0\u03bf\u03c5 argPlainOption= -plain \u03c7\u03c1\u03ae\u03c3\u03b7 \u03c4\u03c5\u03c0\u03bf\u03c0\u03bf\u03b9\u03b7\u03bc\u03ad\u03bd\u03bf\u03c5 Logisim \u03c0\u03c1\u03bf\u03c4\u03cd\u03c0\u03bf\u03c5 argTemplateOption= -template file \u03c7\u03c1\u03ae\u03c3\u03b7 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5 \u03c9\u03c2 \u03c0\u03c1\u03bf\u03c4\u03cd\u03c0\u03bf\u03c5 argGatesOption= -gates shaped|rectangular \u03c7\u03c1\u03ae\u03c3\u03b7 \u03c3\u03c5\u03b3\u03ba\u03b5\u03ba\u03c1\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5 \u03c3\u03c4\u03c5\u03bb \u03c0\u03c5\u03bb\u03ce\u03bd argLocaleOption= -locale str \u03c7\u03c1\u03b7\u03c3\u03b7 \u03c4\u03bf\u03c0\u03b9\u03ba\u03ce\u03bd \u03c1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03c9\u03bd \u03b4\u03b9\u03b1\u03b8\u03ad\u03c3\u03b9\u03bc\u03b1 \u03c3\u03c4\u03bf str argAccentsOption= -accents yes|no \u03c7\u03c1\u03ae\u03c3\u03b7 \u03c4\u03bf\u03bd\u03b9\u03c3\u03bc\u03ad\u03bd\u03c9\u03bd \u03c7\u03b1\u03c1\u03b1\u03ba\u03c4\u03ae\u03c1\u03c9\u03bd \u03ae ASCII \u03b9\u03c3\u03bf\u03b4\u03cd\u03bd\u03b1\u03bc\u03c9\u03bd argNoSplashOption= -nosplash \u03ba\u03c1\u03cd\u03b2\u03b5\u03b9 \u03c4\u03b7\u03bd \u03b1\u03c1\u03c7\u03b9\u03ba\u03ae \u03bf\u03b8\u03cc\u03bd\u03b7 \u03b5\u03ba\u03ba\u03af\u03bd\u03b7\u03c3\u03b7\u03c2 argVersionOption= -version \u03b5\u03bc\u03c6\u03b1\u03bd\u03af\u03b6\u03b5\u03b9 \u03c4\u03b7\u03bd \u03ad\u03ba\u03b4\u03bf\u03c3\u03b7 \u03ba\u03b1\u03b9 \u03c4\u03b5\u03c1\u03bc\u03b1\u03c4\u03af\u03b6\u03b5\u03b9 argHelpOption= -help \u03b5\u03bc\u03c6\u03b1\u03bd\u03af\u03b6\u03b5\u03b9 \u03b1\u03c5\u03c4\u03ae \u03c4\u03b7 \u03c3\u03cd\u03bd\u03bf\u03c8\u03b7 \u03ba\u03b1\u03b9 \u03c4\u03b5\u03c1\u03bc\u03b1\u03c4\u03af\u03b6\u03b5\u03b9 argClearOption= -nosplash \u03ba\u03c1\u03cd\u03b2\u03b5\u03b9 \u03c4\u03b7\u03bd \u03b1\u03c1\u03c7\u03b9\u03ba\u03ae \u03bf\u03b8\u03cc\u03bd\u03b7 \u03b5\u03ba\u03ba\u03af\u03bd\u03b7\u03c3\u03b7\u03c2 argGatesOptionError= \u03a4\u03bf \u03cc\u03c1\u03b9\u03c3\u03bc\u03b1 \u03b3\u03b9\u03b1 \u03c4\u03b7\u03bd \u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae -gates \u03c0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 \u03b5\u03af\u03c4\u03b5 "shaped" \u03b5\u03af\u03c4\u03b5 "rectangular". argAccentsOptionError= \u03a4\u03bf \u03cc\u03c1\u03b9\u03c3\u03bc\u03b1 \u03b3\u03b9\u03b1 \u03c4\u03b7\u03bd \u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae -accents \u03c0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 \u03b5\u03b5 "yes" \u03b5\u03af\u03c4\u03b5 "no". templateMissingError= \u03a4\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf \u03c0\u03c1\u03bf\u03c4\u03cd\u03c0\u03bf\u03c5 %s \u03b4\u03b5\u03bd \u03c5\u03c0\u03ac\u03c1\u03c7\u03b5\u03b9. templateCannotReadError= \u0394\u03b5\u03bd \u03ad\u03c7\u03b5\u03c4\u03b5 \u03c4\u03bf \u03b4\u03b9\u03ba\u03b1\u03af\u03c9\u03bc\u03b1 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b2\u03ac\u03c3\u03c4\u03b5\u03c4\u03b5 \u03c4\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf \u03c0\u03c1\u03bf\u03c4\u03cd\u03c0\u03bf\u03c5 %s. invalidLocaleError= \u039f\u03b9 \u03c4\u03bf\u03c0\u03b9\u03ba\u03ad\u03c2 \u03c1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03b9\u03c2 \u03b4\u03b5\u03bd \u03c5\u03c0\u03bf\u03c3\u03c4\u03b7\u03c1\u03af\u03b6\u03bf\u03bd\u03c4\u03b1\u03b9. invalidLocaleOptionsHeader= \u03a5\u03c0\u03bf\u03c3\u03c4\u03b7\u03c1\u03b9\u03b6\u03cc\u03bc\u03b5\u03bd\u03b5\u03c2 \u03c4\u03bf\u03c0\u03b9\u03ba\u03ad\u03c2 \u03c1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03b9\u03c2: startupCloseButton= \u039a\u03bb\u03b5\u03af\u03c3\u03b9\u03bc\u03bf startupQuitButton= \u0388\u03be\u03bf\u03b4\u03bf\u03c2 # # SplashScreen.java # progressLibraries= \u03a6\u03cc\u03c1\u03c4\u03c9\u03bc\u03b1 \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03c9\u03bd... progressTemplateCreate= \u0394\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03c0\u03c1\u03bf\u03c4\u03cd\u03c0\u03bf\u03c5... progressTemplateOpen= \u0386\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1 \u03c0\u03c1\u03bf\u03c4\u03cd\u03c0\u03bf\u03c5... progressTemplateLoad= \u03a6\u03cc\u03c1\u03c4\u03c9\u03bc\u03b1 \u03c0\u03c1\u03bf\u03c4\u03cd\u03c0\u03bf\u03c5... progressTemplateClose= \u039a\u03bb\u03b5\u03af\u03c3\u03b9\u03bc\u03bf \u03c0\u03c1\u03bf\u03c4\u03cd\u03c0\u03bf\u03c5... progressGuiInitialize= \u0391\u03c1\u03c7\u03b9\u03ba\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7 \u03b4\u03b9\u03b5\u03c0\u03b1\u03c6\u03ae\u03c2... progressFileCreate= \u0394\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5... progressFileLoad= \u03a6\u03cc\u03c1\u03c4\u03c9\u03bc\u03b1 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5... progressProjectCreate= \u0394\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03ad\u03c1\u03b3\u03bf\u03c5... progressFrameCreate= \u0394\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03c0\u03b1\u03c1\u03b1\u03b8\u03cd\u03c1\u03bf\u03c5... creditsRoleLead= \u03a5\u03c0\u03b5\u03cd\u03b8\u03c5\u03bd\u03bf\u03c2 \u0391\u03bd\u03ac\u03c0\u03c4\u03c5\u03be\u03b7\u03c2 creditsRoleGerman= \u0393\u03b5\u03c1\u03bc\u03b1\u03bd\u03b9\u03ba\u03ae \u039c\u03b5\u03c4\u03ac\u03c6\u03c1\u03b1\u03c3\u03b7 creditsRolePortuguese= \u03a0\u03bf\u03c1\u03c4\u03bf\u03b3\u03b1\u03bb\u03b9\u03ba\u03ae \u039c\u03b5\u03c4\u03ac\u03c6\u03c1\u03b1\u03c3\u03b7 creditsRoleRussian= \u03a1\u03c9\u03c3\u03b9\u03ba\u03ae \u039c\u03b5\u03c4\u03ac\u03c6\u03c1\u03b1\u03c3\u03b7 creditsRoleTesting= \u0388\u03bb\u03b5\u03b3\u03c7\u03bf\u03c2/\u0394\u03bf\u03ba\u03b9\u03bc\u03ad\u03c2 creditsRoleOriginal= \u03a0\u03c1\u03c9\u03c4\u03cc\u03c4\u03c5\u03c0\u03b7 \u0388\u03ba\u03b4\u03bf\u03c3\u03b7 # # TtyInterface.java # ttyLoadError= \u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03ba\u03b1\u03c4\u03ac \u03c4\u03bf \u03ac\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1 \u03c4\u03bf\u03c5 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5 \u03ba\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2: %s ttySpeedMsg= %s Hz (%s \u03c0\u03b1\u03bb\u03bc\u03bf\u03af \u03c3\u03b5 %s milliseconds) loadNoRamError= \u0394\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5 RAM \u03b3\u03b9\u03b1 \u03c4\u03b7 \u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae "-load". loadIoError= \u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03ba\u03b1\u03c4\u03ac \u03c4\u03b7\u03bd \u03b1\u03bd\u03ac\u03b3\u03bd\u03c9\u03c3\u03b7 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5 \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1\u03c2 ttyNoTtyError= \u0394\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5 TTY \u03ae \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf \u03a0\u03bb\u03b7\u03ba\u03c4\u03c1\u03bf\u03bb\u03bf\u03b3\u03af\u03bf\u03c5 (Keyboard). ttyHaltReasonPin= \u03b4\u03b9\u03b1\u03ba\u03bf\u03c0\u03ae \u03bb\u03cc\u03b3\u03c9 \u03b1\u03ba\u03c1\u03bf\u03b4\u03ad\u03ba\u03c4\u03b7 halt ttyHaltReasonOscillation= \u03b4\u03b9\u03b1\u03ba\u03bf\u03c0\u03ae \u03bb\u03cc\u03b3\u03c9 \u03b1\u03bd\u03af\u03c7\u03bd\u03b5\u03c5\u03c3\u03b7\u03c2 \u03c4\u03b1\u03bb\u03ac\u03bd\u03c4\u03c9\u03c3\u03b7\u03c2 statsTotalWithout= \u03a3\u03a5\u039d\u039f\u039b\u039f (\u03b4\u03af\u03c7\u03c9\u03c2 \u03c4\u03b1 \u03c5\u03c0\u03bf-\u03ba\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03b1 \u03c4\u03bf\u03c5 \u03ad\u03c1\u03b3\u03bf\u03c5) statsTotalWith= \u03a3\u03a5\u039d\u039f\u039b\u039f (\u03bc\u03b5 \u03c5\u03c0\u03bf-\u03ba\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03b1) logisim-2.7.1/resources/logisim/el/proj.properties0000644000175000017500000000602311530601316022224 0ustar vincentvincent# # ProjectActions.java # newCircuitName= \u03ba\u03cd\u03c1\u03b9\u03bf openAlreadyTitle= \u0391\u03c1\u03c7\u03b5\u03af\u03bf \u0389\u03b4\u03b7 \u0391\u03bd\u03bf\u03b9\u03ba\u03c4\u03cc openAlreadyMessage= \u03a4\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf %s, \u03ae\u03b4\u03b7 \u03b1\u03bd\u03bf\u03b9\u03b3\u03bc\u03ad\u03bd\u03bf, \u03ad\u03c7\u03b5\u03b9 \u03bc\u03b7 \u03b1\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03c5\u03bc\u03ad\u03bd\u03b5\u03c2 \u03b1\u03bb\u03bb\u03b1\u03b3\u03ad\u03c2. openAlreadyCancelOption= \u0391\u03ba\u03cd\u03c1\u03c9\u03c3\u03b7 \u0391\u03bd\u03bf\u03af\u03b3\u03bc\u03b1\u03c4\u03bf\u03c2 openAlreadyLoseChangesOption= \u0391\u03c0\u03ce\u03bb\u03b5\u03b9\u03b1 \u0391\u03bb\u03bb\u03b1\u03b3\u03ce\u03bd openAlreadyNewWindowOption= \u039d\u03ad\u03bf \u03a0\u03b1\u03c1\u03ac\u03b8\u03c5\u03c1\u03bf confirmOverwriteMessage= \u03a4\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf \u03ae\u03b4\u03b7 \u03c5\u03c0\u03ac\u03c1\u03c7\u03b5\u03b9. \u0398\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03c4\u03bf \u03b1\u03bd\u03c4\u03b9\u03ba\u03b1\u03c4\u03b1\u03c3\u03c4\u03ae\u03c3\u03b5\u03c4\u03b5? confirmOverwriteTitle= \u0395\u03c0\u03b9\u03b2\u03b5\u03b2\u03b1\u03af\u03c9\u03c3\u03b7 \u0391\u03bd\u03c4\u03b9\u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7\u03c2 fileOpenError= \u0394\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03c5\u03bd\u03b1\u03c4\u03cc \u03c4\u03bf \u03ac\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1 \u03c4\u03bf\u03c5 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5: %s fileOpenErrorTitle= \u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03ba\u03b1\u03c4\u03ac \u03c4\u03bf \u0386\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1 templateOpenError= \u0394\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03c5\u03bd\u03b1\u03c4\u03cc \u03c4\u03bf \u03ac\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1 \u03c4\u03bf\u03c5 \u03c0\u03c1\u03bf\u03c4\u03cd\u03c0\u03bf\u03c5: %s templateOpenErrorTitle= \u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03c3\u03c4\u03bf \u0386\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1 \u03a0\u03c1\u03bf\u03c4\u03cd\u03c0\u03bf\u03c5 replaceExtensionMessage= \u0395\u03c0\u03b9\u03b8\u03c5\u03bc\u03b5\u03af\u03c4\u03b5 \u03c4\u03b7\u03bd \u03b1\u03bd\u03c4\u03b9\u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7 \u03c4\u03bf\u03c5 "%s" \u03bc\u03b5 \u03c4\u03b7\u03bd \u03c0\u03c1\u03bf\u03c4\u03b9\u03bc\u03ce\u03bc\u03b5\u03bd\u03b7 \u03b1\u03c0\u03cc \u03c4\u03bf Logisim ".circ" \u03ba\u03b1\u03c4\u03ac\u03bb\u03b7\u03be\u03b7? replaceExtensionTitle= \u0391\u03bd\u03c4\u03b9\u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7 \u039a\u03b1\u03c4\u03ac\u03bb\u03b7\u03be\u03b7\u03c2 confirmQuitTitle= \u0395\u03c0\u03b9\u03b2\u03b5\u03b2\u03b1\u03af\u03c9\u03c3\u03b7 \u0395\u03be\u03cc\u03b4\u03bf\u03c5 replaceExtensionReplaceOpt= \u0391\u03bd\u03c4\u03b9\u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7 "%s" replaceExtensionAddOpt= \u0395\u03c0\u03ad\u03ba\u03c4\u03b1\u03c3\u03b7 "%s" replaceExtensionKeepOpt= \u0394\u03b9\u03b1\u03c4\u03ae\u03c1\u03b7\u03c3\u03b5 \u0391\u03bd\u03b1\u03bb\u03bb\u03bf\u03af\u03c9\u03c4\u03bflogisim-2.7.1/resources/logisim/el/prefs.properties0000644000175000017500000001546311530601316022401 0ustar vincentvincent# # PreferencesFrame.java # preferencesFrameTitle= Logisim: \u03a0\u03c1\u03bf\u03c4\u03b9\u03bc\u03ae\u03c3\u03b5\u03b9\u03c2 preferencesFrameMenuItem= \u03a0\u03c1\u03bf\u03c4\u03b9\u03bc\u03ae\u03c3\u03b5\u03b9\u03c2 closeButton= \u039a\u03bb\u03b5\u03af\u03c3\u03b9\u03bc\u03bf \u03a0\u03b1\u03c1\u03b1\u03b8\u03cd\u03c1\u03bf\u03c5 # TemplateOptions.java templateTitle= \u03a0\u03c1\u03cc\u03c4\u03c5\u03c0\u03bf templateHelp= \u0395\u03c0\u03b9\u03bb\u03ad\u03be\u03c4\u03b5 \u03c4\u03bf \u03c4\u03c1\u03ad\u03c7\u03bf\u03bd \u03c0\u03c1\u03cc\u03c4\u03c5\u03c0\u03bf templatePlainOption= \u0391\u03c0\u03bb\u03cc \u03a0\u03c1\u03cc\u03c4\u03c5\u03c0\u03bf templateEmptyOption= \u039a\u03b5\u03bd\u03cc \u03a0\u03c1\u03cc\u03c4\u03c5\u03c0\u03bf templateCustomOption= \u0395\u03b9\u03b4\u03b9\u03ba\u03cc \u03a0\u03c1\u03cc\u03c4\u03c5\u03c0\u03bf: templateSelectButton= \u0395\u03c0\u03b9\u03bb\u03ad\u03be\u03c4\u03b5... templateErrorMessage= \u0394\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03c5\u03bd\u03b1\u03c4\u03cc \u03c4\u03bf \u03c6\u03cc\u03c1\u03c4\u03c9\u03bc\u03b1 \u03c4\u03bf\u03c5 \u03c0\u03c1\u03bf\u03c4\u03cd\u03c0\u03bf\u03c5: %s templateErrorTitle= \u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03c3\u03c4\u03bf \u0386\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1 \u03a0\u03c1\u03bf\u03c4\u03cd\u03c0\u03bf\u03c5 selectDialogTitle= \u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae \u03a0\u03c1\u03bf\u03c4\u03cd\u03c0\u03bf\u03c5 selectDialogButton= \u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae # IntlOptions.java intlTitle= \u0394\u03b9\u03b5\u03b8\u03bd\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7 intlHelp= \u0395\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03c0\u03c1\u03bf\u03c4\u03b9\u03bc\u03ae\u03c3\u03b5\u03c9\u03bd \u03c4\u03bf\u03c0\u03b9\u03ba\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7\u03c2 intlLocale= \u0393\u03bb\u03ce\u03c3\u03c3\u03b1: intlReplaceAccents= \u0391\u03bd\u03c4\u03b9\u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7 \u03c4\u03bf\u03bd\u03b9\u03c3\u03bc\u03ad\u03bd\u03c9\u03bd \u03c7\u03b1\u03c1\u03b1\u03ba\u03c4\u03ae\u03c1\u03c9\u03bd intlGateShape= \u03a3\u03c7\u03ae\u03bc\u03b1 \u03c0\u03cd\u03bb\u03b7\u03c2: shapeShaped= \u03a3\u03c7\u03b7\u03bc\u03b1\u03c4\u03bf\u03c0\u03bf\u03b9\u03b7\u03bc\u03ad\u03bd\u03bf shapeRectangular= \u039f\u03c1\u03b8\u03bf\u03b3\u03ce\u03bd\u03b9\u03bf shapeDIN40700= DIN 40700 # WindowOptions.java windowTitle= \u03a0\u03b1\u03c1\u03ac\u03b8\u03c5\u03c1\u03bf windowHelp= \u0394\u03b9\u03b1\u03bc\u03bf\u03c1\u03c6\u03ce\u03c3\u03c4\u03b5 \u03c4\u03bf \u03ba\u03cd\u03c1\u03b9\u03bf \u03c0\u03b1\u03c1\u03ac\u03b8\u03c5\u03c1\u03bf \u03b5\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1\u03c2 windowTickRate= \u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 \u03c1\u03c5\u03b8\u03bc\u03bf\u03cd \u03c0\u03b1\u03bb\u03bc\u03ce\u03bd windowProjectToolbar= \u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 \u0395\u03c1\u03b3\u03b1\u03bb\u03b5\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7\u03c2 \u0388\u03c1\u03b3\u03bf\u03c5 windowToolbarLocation= \u0398\u03ad\u03c3\u03b7 \u0395\u03c1\u03b3\u03b1\u03bb\u03b5\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7\u03c2 windowToolbarHidden= \u039a\u03c1\u03c5\u03c6\u03cc windowToolbarDownMiddle= \u039a\u03ac\u03c4\u03c9 \u03c3\u03c4\u03b7 \u039c\u03ad\u03c3\u03b7 # LayoutOptions.java layoutTitle= \u0394\u03b9\u03ac\u03c4\u03b1\u03be\u03b7 layoutHelp= \u0394\u03b9\u03b1\u03bc\u03cc\u03c1\u03c6\u03c9\u03c3\u03b7 \u03c4\u03b7\u03c2 \u03c3\u03c5\u03bc\u03c0\u03b5\u03c1\u03b9\u03c6\u03bf\u03c1\u03ac\u03c2 \u03c4\u03bf\u03c5 \u03b5\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03c4\u03ae \u03b4\u03b9\u03ac\u03c4\u03b1\u03be\u03b7\u03c2 layoutAddShowGhosts= \u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 \u039f\u03bb\u03bf\u03b3\u03c1\u03ac\u03bc\u03bc\u03b1\u03c4\u03bf\u03c2 \u039a\u03b1\u03c4\u03ac \u03c4\u03b7\u03bd \u03a0\u03c1\u03bf\u03c3\u03b8\u03ae\u03ba\u03b7 layoutPrinterView= \u03a0\u03c1\u03bf\u03b2\u03bf\u03bb\u03ae \u0395\u03ba\u03c4\u03c5\u03c0\u03c9\u03c4\u03ae layoutMoveKeepConnect= \u0394\u03b9\u03b1\u03c4\u03ae\u03c1\u03b7\u03c3\u03b7 \u03a3\u03c5\u03bd\u03b4\u03ad\u03c3\u03b5\u03c9\u03bd \u039a\u03b1\u03c4\u03ac \u03c4\u03b7 \u039c\u03b5\u03c4\u03b1\u03ba\u03af\u03bd\u03b7\u03c3\u03b7 layoutAttributeHalo= \u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 \u03b9\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2 halo layoutShowTips= \u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 \u03c3\u03c5\u03bc\u03b2\u03bf\u03c5\u03bb\u03ce\u03bd \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf\u03c5 layoutAddAfter= \u039c\u03b5\u03c4\u03ac \u03c4\u03b7\u03bd \u03a0\u03c1\u03bf\u03c3\u03b8\u03ae\u03ba\u03b7 \u03a3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03c9\u03bd: layoutAddAfterUnchanged= \u0394\u03b9\u03b1\u03c4\u03ae\u03c1\u03b7\u03c3\u03b7 \u03c3\u03c4\u03bf \u03b5\u03c1\u03b3\u03b1\u03bb\u03b5\u03af\u03bf \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf\u03c5 layoutAddAfterEdit= \u0395\u03bd\u03b1\u03bb\u03bb\u03b1\u03b3\u03ae \u03c3\u03c4\u03bf \u0395\u03c1\u03b3\u03b1\u03bb\u03b5\u03af\u03bf \u0395\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1\u03c2 layoutRadix1= \u03a0\u03c1\u03ce\u03c4\u03bf \u03b1\u03c1\u03b9\u03b8\u03bc\u03b7\u03c4\u03b9\u03ba\u03cc \u03c3\u03cd\u03c3\u03c4\u03b7\u03bc\u03b1 \u03cc\u03c4\u03b1\u03bd \u03b4\u03c1\u03b1\u03c3\u03c4\u03b7\u03c1\u03b9\u03bf\u03c0\u03bf\u03b9\u03b5\u03af\u03c4\u03b1\u03b9 \u03c4\u03bf \u03ba\u03b1\u03bb\u03ce\u03b4\u03b9\u03bf layoutRadix2= \u0394\u03b5\u03cd\u03c4\u03b5\u03c1\u03bf \u03b1\u03c1\u03b9\u03b8\u03bc\u03b7\u03c4\u03b9\u03ba\u03cc \u03c3\u03cd\u03c3\u03c4\u03b7\u03bc\u03b1 \u03cc\u03c4\u03b1\u03bd \u03b4\u03c1\u03b1\u03c3\u03c4\u03b7\u03c1\u03b9\u03bf\u03c0\u03bf\u03b9\u03b5\u03af\u03c4\u03b1\u03b9 \u03c4\u03bf \u03ba\u03b1\u03bb\u03ce\u03b4\u03b9\u03bf # ExperimentalOptions.java experimentTitle= \u03a0\u03b5\u03b9\u03c1\u03b1\u03bc\u03b1\u03c4\u03b9\u03ba\u03cc experimentHelp= \u0395\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7 \u03c7\u03b1\u03c1\u03b1\u03ba\u03c4\u03b7\u03c1\u03b9\u03c3\u03c4\u03b9\u03ba\u03ce\u03bd \u03c0\u03bf\u03c5 \u03b4\u03b5\u03bd \u03ad\u03c7\u03bf\u03c5\u03bd \u03b1\u03ba\u03cc\u03bc\u03b1 \u03b5\u03bb\u03b5\u03b3\u03c7\u03b8\u03b5\u03af \u03b5\u03bd\u03b4\u03b5\u03bb\u03b5\u03c7\u03ce\u03c2 accelLabel= \u0395\u03c0\u03b9\u03c4\u03ac\u03c7\u03c5\u03bd\u03c3\u03b7 \u03b3\u03c1\u03b1\u03c6\u03b9\u03ba\u03ce\u03bd: accelDefault= \u03a7\u03c1\u03ae\u03c3\u03b7 \u03c0\u03c1\u03bf\u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ce\u03bd accelNone= \u039a\u03b1\u03bd\u03ad\u03bd\u03b1 accelOpenGL= OpenGL accelD3D= Direct 3D accelRestartLabel= \u0395\u03c0\u03b1\u03bd\u03b5\u03ba\u03b9\u03bd\u03ae\u03c3\u03c4\u03b5 \u03c4\u03bf Logisim \u03c0\u03c1\u03bf\u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5 \u03bd\u03b1 \u03b5\u03c6\u03b1\u03c1\u03bc\u03bf\u03c3\u03c4\u03bf\u03cd\u03bd \u03bf\u03b9 \u03b1\u03bb\u03bb\u03b1\u03b3\u03ad\u03c2. logisim-2.7.1/resources/logisim/el/opts.properties0000644000175000017500000001157011530601316022242 0ustar vincentvincent# # OptionsFrame.java # optionsFrameTitle= Logisim: %s \u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ad\u03c2 optionsFrameMenuItem= %s: \u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ad\u03c2 revertButton= \u0395\u03c0\u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac \u038c\u03bb\u03c9\u03bd \u03c3\u03c4\u03bf \u03a0\u03c1\u03cc\u03c4\u03c5\u03c0\u03bf closeButton= \u039a\u03bb\u03b5\u03af\u03c3\u03b9\u03bc\u03bf \u03a0\u03b1\u03c1\u03b1\u03b8\u03cd\u03c1\u03bf\u03c5 # # OptionsActions.java # setOptionAction= \u039f\u03c1\u03b9\u03c3\u03bc\u03cc\u03c2 %s addMouseMappingAction= \u03a0\u03c1\u03bf\u03c3\u03b8\u03ae\u03ba\u03b7 \u03a7\u03b1\u03c1\u03c4\u03bf\u03b3\u03c1\u03ac\u03c6\u03b7\u03c3\u03b7\u03c2 \u03a0\u03bf\u03bd\u03c4\u03b9\u03ba\u03b9\u03bf\u03cd removeMouseMappingAction= \u039a\u03b1\u03c4\u03ac\u03c1\u03b3\u03b7\u03c3\u03b7 \u03a7\u03b1\u03c1\u03c4\u03bf\u03b3\u03c1\u03ac\u03c6\u03b7\u03c3\u03b7\u03c2 \u03a0\u03bf\u03bd\u03c4\u03b9\u03ba\u03b9\u03bf\u03cd # # SimulateOptions.java # simulateTitle= \u03a0\u03c1\u03bf\u03c3\u03bf\u03bc\u03bf\u03af\u03c9\u03c3\u03b7 simulateHelp= \u03a1\u03cd\u03b8\u03bc\u03b9\u03c3\u03b7 \u03c4\u03b7\u03c2 \u03bc\u03b7\u03c7\u03b1\u03bd\u03ae\u03c2 \u03b3\u03b9\u03b1 \u03c4\u03b7\u03bd \u03c0\u03c1\u03bf\u03c3\u03bf\u03bc\u03bf\u03af\u03c9\u03c3\u03b7 \u03c4\u03b7\u03c2 \u03c3\u03c5\u03bc\u03c0\u03b5\u03c1\u03b9\u03c6\u03bf\u03c1\u03ac\u03c2 \u03c4\u03bf\u03c5 \u03ba\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2. simulateLimit= \u0395\u03c0\u03b1\u03bd\u03b1\u03bb\u03ae\u03c8\u03b5\u03b9\u03c2 \u03bc\u03ad\u03c7\u03c1\u03b9 \u03c4\u03b1\u03bb\u03ac\u03bd\u03c4\u03c9\u03c3\u03b7\u03c2 gateUndefined= \u0388\u03be\u03bf\u03b4\u03bf\u03c2 \u03c0\u03cd\u03bb\u03b7\u03c2 \u03cc\u03c4\u03b1\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b1\u03c0\u03c1\u03bf\u03c3\u03b4\u03b9\u03cc\u03c1\u03b9\u03c3\u03c4\u03b7 simulateRandomness= \u03a0\u03c1\u03bf\u03c3\u03b8\u03ae\u03ba\u03b7 \u03b8\u03bf\u03c1\u03cd\u03b2\u03bf\u03c5 \u03c3\u03c4\u03b9\u03c2 \u03ba\u03b1\u03b8\u03c5\u03c3\u03c4\u03b5\u03c1\u03ae\u03c3\u03b5\u03b9\u03c2 \u03c4\u03bf\u03c5 \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf\u03c5 # # MouseOptions.java # mouseTitle= \u03a0\u03bf\u03bd\u03c4\u03af\u03ba\u03b9 mouseHelp= \u0395\u03c1\u03b3\u03b1\u03bb\u03b5\u03af\u03b1 \u03b5\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03c0\u03bf\u03c5 \u03c3\u03c7\u03b5\u03c4\u03af\u03b6\u03bf\u03bd\u03c4\u03b1\u03b9 \u03bc\u03b5 \u03c4\u03b1 \u03c0\u03bb\u03ae\u03ba\u03c4\u03c1\u03b1 \u03c4\u03bf\u03c5 \u03c0\u03bf\u03bd\u03c4\u03b9\u03ba\u03b9\u03bf\u03cd. mouseMapNone= \u039a\u03b1\u03bd\u03ad\u03bd\u03b1 \u0395\u03c0\u03b9\u03bb\u03b5\u03b3\u03bc\u03ad\u03bd\u03bf \u0395\u03c1\u03b3\u03b1\u03bb\u03b5\u03af\u03bf mouseMapText= \u039a\u03bb\u03b9\u03ba \u03bc\u03b5 \u03c4\u03b7 \u03a7\u03c1\u03ae\u03c3\u03b7 \u03a3\u03c5\u03bd\u03b4\u03c5\u03b1\u03c3\u03bc\u03bf\u03cd mouseMapText2= \u03a3\u03c4\u03bf \u03a7\u03ac\u03c1\u03c4\u03b7 %s mouseRemoveButton= \u039a\u03b1\u03c4\u03ac\u03c1\u03b3\u03b7\u03c3\u03b7 # # ToolbarOptions.java # toolbarTitle= \u0395\u03c1\u03b3\u03b1\u03bb\u03b5\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7 toolbarHelp= \u03a4\u03b1 \u03b5\u03c1\u03b3\u03b1\u03bb\u03b5\u03af\u03b1 \u03b5\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1\u03c2 \u03c0\u03bf\u03c5 \u03b5\u03bc\u03c6\u03b1\u03bd\u03af\u03b6\u03bf\u03bd\u03c4\u03b1\u03b9 \u03c3\u03c4\u03b7\u03bd \u03b5\u03c1\u03b3\u03b1\u03bb\u03b5\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7. toolbarAddTool= \u03a0\u03c1\u03bf\u03c3\u03b8\u03ae\u03ba\u03b7 \u0395\u03c1\u03b3\u03b1\u03bb\u03b5\u03af\u03bf\u03c5 toolbarAddSeparator= \u03a0\u03c1\u03bf\u03c3\u03b8\u03ae\u03ba\u03b7 \u0394\u03b9\u03b1\u03c7\u03c9\u03c1\u03b9\u03c3\u03c4\u03b9\u03ba\u03bf\u03cd toolbarMoveUp= \u039c\u03b5\u03c4\u03b1\u03ba\u03af\u03bd\u03b7\u03c3\u03b7 \u03a0\u03ac\u03bd\u03c9 toolbarMoveDown= \u039c\u03b5\u03c4\u03b1\u03ba\u03af\u03bd\u03b7\u03c3\u03b7 \u039a\u03ac\u03c4\u03c9 toolbarRemove= \u039a\u03b1\u03c4\u03ac\u03c1\u03b3\u03b7\u03c3\u03b7 # # ToolbarActions.java # toolbarAddAction= \u03a0\u03c1\u03bf\u03c3\u03b8\u03ae\u03ba\u03b7 \u03a0\u03bb\u03ae\u03ba\u03c4\u03c1\u03bf\u03c5 \u0395\u03c1\u03b3\u03b1\u03bb\u03b5\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7\u03c2 toolbarRemoveAction= \u039a\u03b1\u03c4\u03ac\u03c1\u03b3\u03b7\u03c3\u03b7 \u03a0\u03bb\u03ae\u03ba\u03c4\u03c1\u03bf\u03c5 \u0395\u03c1\u03b3\u03b1\u03bb\u03b5\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7\u03c2 toolbarMoveAction= \u039c\u03b5\u03c4\u03b1\u03ba\u03af\u03bd\u03b7\u03c3\u03b7 \u03a0\u03bb\u03ae\u03ba\u03c4\u03c1\u03bf\u03c5 \u0395\u03c1\u03b3\u03b1\u03bb\u03b5\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7\u03c2 toolbarInsertSepAction= \u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u0394\u03b9\u03b1\u03c7\u03c9\u03c1\u03b9\u03c3\u03c4\u03b9\u03ba\u03bf\u03cd toolbarRemoveSepAction= \u039a\u03b1\u03c4\u03ac\u03c1\u03b3\u03b7\u03c3\u03b7 \u0394\u03b9\u03b1\u03c7\u03c9\u03c1\u03b9\u03c3\u03c4\u03b9\u03ba\u03bf\u03cd logisim-2.7.1/resources/logisim/el/menu.properties0000644000175000017500000003223311530601316022220 0ustar vincentvincent# MenuEdit.java editMenu= \u0395\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 editCantUndoItem= \u0391\u03b4\u03c5\u03bd\u03b1\u03c4\u03b7 \u0391\u03bd\u03b1\u03af\u03c1\u03b5\u03c3\u03b7 editUndoItem= \u0391\u03bd\u03b1\u03af\u03c1\u03b5\u03c3\u03b7 %s editCutItem= \u0391\u03c0\u03bf\u03ba\u03bf\u03c0\u03ae editCopyItem= \u0391\u03bd\u03c4\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae editPasteItem= \u0395\u03c0\u03b9\u03ba\u03cc\u03bb\u03bb\u03b7\u03c3\u03b7 editDuplicateItem= \u0394\u03b9\u03c0\u03bb\u03cc\u03c4\u03c5\u03c0\u03bf editClearItem= \u0394\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae editSelectAllItem= \u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae \u038c\u03bb\u03c9\u03bd editLowerItem= \u03a7\u03b1\u03bc\u03ae\u03bb\u03c9\u03bc\u03b1 \u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae\u03c2 editRaiseItem= \u0386\u03bd\u03bf\u03b4\u03bf \u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae\u03c2 editRaiseTopItem= \u0386\u03bd\u03bf\u03b4\u03bf \u03a3\u03c4\u03b7\u03bd \u039a\u03bf\u03c1\u03c5\u03c6\u03ae editLowerBottomItem= \u03a7\u03b1\u03bc\u03ae\u03bb\u03c9\u03bc\u03b1 \u03a3\u03c4\u03bf \u039a\u03ac\u03c4\u03c9 \u039c\u03ad\u03c1\u03bf\u03c2 editAddControlItem= \u03a0\u03c1\u03bf\u03c3\u03b8\u03ae\u03ba\u03b7 \u039a\u03bf\u03c1\u03c5\u03c6\u03ae\u03c2 editRemoveControlItem= \u039a\u03b1\u03c4\u03ac\u03c1\u03b3\u03b7\u03c3\u03b7 \u039a\u03bf\u03c1\u03c5\u03c6\u03ae\u03c2 # MenuFile.java fileMenu= \u0391\u03c1\u03c7\u03b5\u03af\u03bf fileNewItem= \u039d\u03ad\u03bf fileOpenItem= \u0386\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1... fileOpenRecentItem= \u0386\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1 \u03a0\u03c1\u03bf\u03c3\u03c6\u03ac\u03c4\u03bf\u03c5 fileOpenRecentNoChoices= (\u039a\u03b1\u03bd\u03ad\u03bd\u03b1) fileCloseItem= \u039a\u03bb\u03b5\u03af\u03c3\u03b9\u03bc\u03bf fileSaveItem= \u0391\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7 fileSaveAsItem= \u0391\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7 \u03c9\u03c2... fileExportImageItem= \u0395\u03be\u03b1\u03b3\u03c9\u03b3\u03ae \u0395\u03b9\u03ba\u03cc\u03bd\u03b1\u03c2... filePrintItem= \u0395\u03ba\u03c4\u03cd\u03c0\u03c9\u03c3\u03b7... filePreferencesItem= \u03a0\u03c1\u03bf\u03c4\u03b9\u03bc\u03ae\u03c3\u03b5\u03b9\u03c2... fileQuitItem= \u0388\u03be\u03bf\u03b4\u03bf\u03c2 # MenuProject.java projectMenu= \u0388\u03c1\u03b3\u03bf projectAddCircuitItem= \u03a0\u03c1\u03bf\u03c3\u03b8\u03ae\u03ba\u03b7 \u039a\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2... projectLoadLibraryItem= \u03a6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7 \u0392\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7\u03c2 projectLoadBuiltinItem= \u0395\u03bd\u03c3\u03c9\u03bc\u03b1\u03c4\u03c9\u03bc\u03ad\u03bd\u03b7 \u0392\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7... projectLoadLogisimItem= Logisim \u0392\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7... projectLoadJarItem= JAR \u0392\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7... projectUnloadLibraryItem= \u0395\u03bb\u03b5\u03c5\u03b8\u03ad\u03c1\u03c9\u03c3\u03b7 \u0392\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7\u03c2 projectUnloadLibrariesItem= \u0395\u03bb\u03b5\u03c5\u03b8\u03ad\u03c1\u03c9\u03c3\u03b7 \u0392\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03b7\u03ba\u03ce\u03bd... projectMoveCircuitDownItem= \u039c\u03b5\u03c4\u03b1\u03ba\u03af\u03bd\u03b7\u03c3\u03b7 \u039a\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2 \u039a\u03ac\u03c4\u03c9 projectMoveCircuitUpItem= \u039c\u03b5\u03c4\u03b1\u03ba\u03af\u03bd\u03b7\u03c3\u03b7 \u039a\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2 \u03a0\u03ac\u03bd\u03c9 projectSetAsMainItem= \u039f\u03c1\u03b9\u03c3\u03bc\u03cc\u03c2 \u03c9\u03c2 \u039a\u03cd\u03c1\u03b9\u03bf \u039a\u03cd\u03ba\u03bb\u03c9\u03bc\u03b1 projectRemoveCircuitItem= \u039a\u03b1\u03c4\u03ac\u03c1\u03b3\u03b7\u03c3\u03b7 \u039a\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2 projectEditCircuitLayoutItem= \u0395\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u0394\u03b9\u03ac\u03c4\u03b1\u03be\u03b7\u03c2 \u039a\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2 projectEditCircuitAppearanceItem= \u0395\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7\u03c2 \u039a\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2 projectRevertAppearanceItem= \u0395\u03c0\u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac \u03c3\u03c4\u03b7\u03bd \u03a0\u03c1\u03bf\u03b5\u03c0\u03b9\u03bb\u03b5\u03b3\u03bc\u03ad\u03bd\u03b7 \u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 projectAnalyzeCircuitItem= \u0391\u03bd\u03ac\u03bb\u03c5\u03c3\u03b7 \u039a\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2 projectGetCircuitStatisticsItem= \u039b\u03ae\u03c8\u03b7 \u03a3\u03c4\u03b1\u03c4\u03b9\u03c3\u03c4\u03b9\u03ba\u03ce\u03bd \u039a\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2 projectOptionsItem= \u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ad\u03c2... # MenuSimulate.java simulateMenu= \u03a0\u03c1\u03bf\u03c3\u03bf\u03bc\u03bf\u03af\u03c9\u03c3\u03b7 simulateRunItem= \u0395\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03b9\u03b7\u03bc\u03ad\u03bd\u03b7 \u03a0\u03c1\u03bf\u03c3\u03bf\u03bc\u03bf\u03af\u03c9\u03c3\u03b7 simulateResetItem= \u0391\u03c1\u03c7\u03b9\u03ba\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7 \u03a0\u03c1\u03bf\u03c3\u03bf\u03bc\u03bf\u03af\u03c9\u03c3\u03b7\u03c2 simulateStepItem= \u0392\u03b7\u03bc\u03b1\u03c4\u03b9\u03ba\u03ae \u03a0\u03c1\u03bf\u03c3\u03bf\u03bc\u03bf\u03af\u03c9\u03c3\u03b7 simulateTickOnceItem= \u0388\u03bd\u03b1\u03c2 \u03a0\u03b1\u03bb\u03bc\u03cc\u03c2 simulateTickItem= \u0395\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03b9\u03b7\u03bc\u03ad\u03bd\u03bf\u03b9 \u03a0\u03b1\u03bb\u03bc\u03bf\u03af simulateTickFreqMenu= \u03a3\u03c5\u03c7\u03bd\u03cc\u03c4\u03b7\u03c4\u03b1 \u03a0\u03b1\u03bb\u03bc\u03ce\u03bd simulateTickFreqItem= %s Hz simulateTickKFreqItem= %s KHz simulateUpStateMenu= \u039c\u03b5\u03c4\u03ac\u03b2\u03b1\u03c3\u03b7 \u0395\u03be\u03cc\u03b4\u03bf\u03c5 \u03c3\u03c4\u03b7\u03bd \u039a\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7 simulateDownStateMenu= \u039c\u03b5\u03c4\u03ac\u03b2\u03b1\u03c3\u03b7 \u0395\u03b9\u03c3\u03cc\u03b4\u03bf\u03c5 \u03c3\u03c4\u03b7\u03bd \u039a\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7 simulateLogItem= \u039a\u03b1\u03c4\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae... # MenuHelp.java helpMenu= \u0392\u03bf\u03ae\u03b8\u03b5\u03b9\u03b1 helpTutorialItem= \u039f\u03b4\u03b7\u03b3\u03cc\u03c2 \u0395\u03ba\u03bc\u03ac\u03b8\u03b7\u03c3\u03b7\u03c2 helpGuideItem= \u039f\u03b4\u03b7\u03b3\u03cc\u03c2 \u03a7\u03c1\u03ae\u03c3\u03c4\u03b7 helpLibraryItem= \u0391\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac \u0392\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7\u03c2 helpAboutItem= \u03a3\u03c7\u03b5\u03c4\u03b9\u03ba\u03ac... helpNotFoundError= \u0394\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b1\u03bd \u03c4\u03b1 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1 \u03b2\u03bf\u03ae\u03b8\u03b5\u03b9\u03b1\u03c2. helpUnavailableError= \u0394\u03b5\u03bd \u03ae\u03c4\u03b1\u03bd \u03b4\u03c5\u03bd\u03b1\u03c4\u03cc \u03bd\u03b1 \u03c6\u03bf\u03c1\u03c4\u03c9\u03b8\u03bf\u03cd\u03bd \u03c4\u03b1 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1 \u03b2\u03bf\u03b7\u03b8\u03b5\u03af\u03b1\u03c2. helpDisplayError= \u0394\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03c5\u03bd\u03b1\u03c4\u03ae \u03b7 \u03b5\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 \u03c4\u03c9\u03bd \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd \u03b2\u03bf\u03b7\u03b8\u03b5\u03af\u03b1\u03c2. helpWindowTitle= \u03a4\u03b5\u03ba\u03bc\u03b7\u03c1\u03af\u03c9\u03c3\u03b7 Logisim helpsetUrl= doc/doc_en.hs # Popups.java projMenu= \u0388\u03c1\u03b3\u03bf libMenu= \u0392\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7 circuitMenu= \u039a\u03cd\u03ba\u03bb\u03c9\u03bc\u03b1 projectReloadLibraryItem= \u0395\u03c0\u03b1\u03bd\u03b1\u03c6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7 \u0392\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7\u03c2 # ProjectCircuitActions.java circuitNameDialogTitle= \u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u039f\u03bd\u03cc\u03bc\u03b1\u03c4\u03bf\u03c2 \u039a\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2 circuitNamePrompt= \u038c\u03bd\u03bf\u03bc\u03b1 \u039a\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2: circuitNameMissingError= \u039a\u03ac\u03b8\u03b5 \u03ba\u03cd\u03ba\u03bb\u03c9\u03bc\u03b1 \u03c7\u03c1\u03b5\u03b9\u03ac\u03b6\u03b5\u03c4\u03b1\u03b9 \u03ad\u03bd\u03b1 \u03cc\u03bd\u03bf\u03bc\u03b1. circuitNameDuplicateError= \u03a4\u03b1 \u03ba\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03b1 \u03b4\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03bf\u03cd\u03bd \u03bd\u03b1 \u03ad\u03c7\u03bf\u03c5\u03bd \u03c4\u03b1 \u03af\u03b4\u03b9\u03b1 \u03bf\u03bd\u03cc\u03bc\u03b1\u03c4\u03b1. circuitRemoveErrorTitle= \u0394\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03c5\u03bd\u03b1\u03c4\u03ae \u03b7 \u03ba\u03b1\u03c4\u03ac\u03c1\u03b3\u03b7\u03c3\u03b7 \u03c4\u03bf\u03c5 \u03ba\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2 circuitRemoveLastError= \u0397 \u03b2\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7 \u03b8\u03b1 \u03c0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03c0\u03b5\u03c1\u03b9\u03ad\u03c7\u03b5\u03b9 \u03c4\u03bf\u03c5\u03bb\u03ac\u03c7\u03b9\u03c3\u03c4\u03bf\u03bd \u03ad\u03bd\u03b1 \u03ba\u03cd\u03ba\u03bb\u03c9\u03bc\u03b1. circuitRemoveUsedError= \u03a4\u03bf \u03ba\u03cd\u03ba\u03bb\u03c9\u03bc\u03b1 \u03c0\u03bf\u03c5 \u03c7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03b5\u03af\u03c4\u03b1\u03b9 \u03c3\u03b5 \u03ac\u03bb\u03bb\u03b1 \u03ba\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03b1 \u03b4\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03b1\u03c6\u03b1\u03b9\u03c1\u03b5\u03b8\u03b5\u03af. analyzeErrorTitle= \u0391\u03b4\u03cd\u03bd\u03b1\u03c4\u03b7 \u0391\u03bd\u03ac\u03bb\u03c5\u03c3\u03b7 analyzeMultibitInputError= \u0397 \u03b1\u03bd\u03ac\u03bb\u03c5\u03c3\u03b7 \u03b4\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03b4\u03b9\u03b1\u03c7\u03b5\u03b9\u03c1\u03b9\u03c3\u03c4\u03b5\u03af \u03b5\u03b9\u03c3\u03cc\u03b4\u03bf\u03c5\u03c2 \u03c0\u03bf\u03bb\u03bb\u03b1\u03c0\u03bb\u03ce\u03bd bits. analyzeMultibitOutputError= \u0397 \u03b1\u03bd\u03ac\u03bb\u03c5\u03c3\u03b7 \u03b4\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03b4\u03b9\u03b1\u03c7\u03b5\u03b9\u03c1\u03b9\u03c3\u03c4\u03b5\u03af \u03b5\u03be\u03cc\u03b4\u03bf\u03c5\u03c2 \u03c0\u03bf\u03bb\u03bb\u03b1\u03c0\u03bb\u03ce\u03bd bits. analyzeTooManyInputsError= \u0397 \u03b1\u03bd\u03ac\u03bb\u03c5\u03c3\u03b7 \u03b4\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03b4\u03b9\u03b1\u03c7\u03b5\u03b9\u03c1\u03b9\u03c3\u03c4\u03b5\u03af \u03c0\u03b5\u03c1\u03b9\u03c3\u03c3\u03cc\u03c4\u03b5\u03c1\u03b5\u03c2 \u03b1\u03c0\u03cc %s \u03b5\u03b9\u03c3\u03cc\u03b4\u03bf\u03c5\u03c2. analyzeTooManyOutputsError= \u0397 \u03b1\u03bd\u03ac\u03bb\u03c5\u03c3\u03b7 \u03b4\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03b4\u03b9\u03b1\u03c7\u03b5\u03b9\u03c1\u03b9\u03c3\u03c4\u03b5\u03af \u03c0\u03b5\u03c1\u03b9\u03c3\u03c3\u03cc\u03c4\u03b5\u03c1\u03b5\u03c2 \u03b1\u03c0\u03cc %s \u03b5\u03be\u03cc\u03b4\u03bf\u03c5\u03c2. analyzeNoExpressionTitle= \u039c\u03b7 \u03a0\u03c1\u03bf\u03c3\u03b4\u03b9\u03bf\u03c1\u03b9\u03c3\u03bc\u03ad\u03bd\u03b7 \u0388\u03ba\u03c6\u03c1\u03b1\u03c3\u03b7 # ProjectLibraryActions.java loadBuiltinErrorTitle= \u0394\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03c5\u03bd\u03b1\u03c4\u03cc\u03bd \u03bd\u03b1 \u03c6\u03bf\u03c1\u03c4\u03c9\u03b8\u03b5\u03af \u03b7 \u0395\u03bd\u03c3\u03c9\u03bc\u03b1\u03c4\u03c9\u03bc\u03ad\u03bd\u03b7 \u0392\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7 loadBuiltinNoneError= \u038c\u03bb\u03b5\u03c2 \u03bf\u03b9 \u03b5\u03bd\u03c3\u03c9\u03bc\u03b1\u03c4\u03c9\u03bc\u03ad\u03bd\u03b5\u03c2 \u03b2\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03ae\u03ba\u03b5\u03c2 \u03ad\u03c7\u03bf\u03c5\u03bd \u03ae\u03b4\u03b7 \u03c6\u03bf\u03c1\u03c4\u03c9\u03b8\u03b5\u03af. loadBuiltinDialogTitle= \u03a6\u03cc\u03c1\u03c4\u03c9\u03bc\u03b1 \u0395\u03bd\u03c3\u03c9\u03bc\u03b1\u03c4\u03c9\u03bc\u03ad\u03bd\u03b7\u03c2 \u0392\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7\u03c2 loadLogisimDialogTitle= \u03a6\u03cc\u03c1\u03c4\u03c9\u03bc\u03b1 \u0391\u03c1\u03c7\u03b5\u03af\u03bf\u03c5 Logisim loadJarDialogTitle= \u03a6\u03cc\u03c1\u03c4\u03c9\u03bc\u03b1 \u0391\u03c1\u03c7\u03b5\u03af\u03bf\u03c5 JAR jarClassNamePrompt= \u038c\u03bd\u03bf\u03bc\u03b1 \u039a\u03bb\u03ac\u03c3\u03b7\u03c2: jarClassNameTitle= \u0395\u03b9\u03c3\u03ac\u03b3\u03b5\u03c4\u03b5 \u039a\u03bb\u03ac\u03c3\u03b7 JAR unloadLibrariesDialogTitle= \u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae \u0392\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03b7\u03ba\u03ce\u03bd \u03b3\u03b9\u03b1 \u03b5\u03bb\u03b5\u03c5\u03b8\u03ad\u03c1\u03c9\u03c3\u03b7 unloadErrorTitle= \u0391\u03b4\u03cd\u03bd\u03b1\u03c4\u03b7 \u03b7 \u039a\u03b1\u03c4\u03ac\u03c1\u03b3\u03b7\u03c3\u03b7 \u0392\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7\u03c2 unloadNoneError= \u038c\u03bb\u03b5\u03c2 \u03bf\u03b9 \u03b1\u03bd\u03bf\u03b9\u03ba\u03c4\u03ad\u03c2 \u03b2\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03ae\u03ba\u03b5\u03c2 \u03b5\u03af\u03bd\u03b1\u03b9 \u03c3\u03b5 \u03c7\u03c1\u03ae\u03c3\u03b7. logisim-2.7.1/resources/logisim/el/log.properties0000644000175000017500000000665011530601316022041 0ustar vincentvincent# # OptionsFrame.java # logFrameTitle= Logisim: \u039a\u03b1\u03c4\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae %s \u03b1\u03c0\u03cc %s logFrameMenuItem= %s: Log closeButton= \u039a\u03bb\u03b5\u03af\u03c3\u03b9\u03bc\u03bf \u03a0\u03b1\u03c1\u03b1\u03b8\u03cd\u03c1\u03bf\u03c5 # # SelectionPanel.java # selectionTab= \u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae selectionHelp= \u0395\u03c0\u03b9\u03bb\u03ad\u03be\u03c4\u03b5 \u03c0\u03bf\u03b9\u03b5\u03c2 \u03c4\u03b9\u03bc\u03ad\u03c2 \u03c4\u03bf\u03c5 \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf\u03c5 \u03ba\u03b1\u03c4\u03b1\u03b3\u03c1\u03ac\u03c6\u03bf\u03bd\u03c4\u03b1\u03b9. selectionAdd= \u03a0\u03c1\u03bf\u03c3\u03b8\u03ae\u03ba\u03b7 >> selectionChangeBase= \u0391\u03bb\u03bb\u03b1\u03b3\u03ae \u03a3\u03c5\u03c3\u03c4\u03ae\u03bc\u03b1\u03c4\u03bf\u03c2 \u0391\u03c1\u03af\u03b8\u03bc\u03b7\u03c3\u03b7\u03c2 selectionMoveUp= \u039c\u03b5\u03c4\u03b1\u03ba\u03af\u03bd\u03b7\u03c3\u03b7 \u03a0\u03ac\u03bd\u03c9 selectionMoveDown= \u039c\u03b5\u03c4\u03b1\u03ba\u03af\u03bd\u03b7\u03c3\u03b7 \u039a\u03ac\u03c4\u03c9 selectionRemove= << \u039a\u03b1\u03c4\u03ac\u03c1\u03b3\u03b7\u03c3\u03b7 # # TablePanel.java # tableTab= \u03a0\u03af\u03bd\u03b1\u03ba\u03b1\u03c2 tableHelp= \u03a0\u03c1\u03bf\u03b2\u03bf\u03bb\u03ae \u03b7\u03bc\u03b5\u03c1\u03bf\u03bb\u03bf\u03b3\u03af\u03bf\u03c5 \u03c4\u03c9\u03bd \u03c0\u03c1\u03cc\u03c3\u03c6\u03b1\u03c4\u03c9\u03bd \u03c4\u03b9\u03bc\u03ce\u03bd. tableEmptyMessage= \u0397 \u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae \u03b5\u03af\u03bd\u03b1\u03b9 \u03ba\u03b5\u03bd\u03ae. # # FilePanel.java # fileTab= \u0391\u03c1\u03c7\u03b5\u03af\u03bf fileHelp= \u03a1\u03cd\u03b8\u03bc\u03b9\u03c3\u03b7 \u03c4\u03b7\u03c2 \u03b5\u03be\u03cc\u03b4\u03bf\u03c5 \u03c4\u03bf\u03c5 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5. fileEnabled= \u0395\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03b9\u03b7\u03bc\u03ad\u03bd\u03b7 \u03ad\u03be\u03bf\u03b4\u03bf\u03c2 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5. fileDisabled= \u0391\u03bd\u03b5\u03bd\u03b5\u03c1\u03b3\u03ae \u03ad\u03be\u03bf\u03b4\u03bf\u03c2 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5. fileEnableButton= \u0395\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7 fileDisableButton= \u0391\u03c0\u03b5\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7 fileLabel= \u0391\u03c1\u03c7\u03b5\u03af\u03bf: fileSelectButton= \u0395\u03c0\u03b9\u03bb\u03ad\u03be\u03c4\u03b5... fileHeaderCheck= \u03a3\u03c5\u03bc\u03c0\u03b5\u03c1\u03b9\u03ad\u03bb\u03b1\u03b2\u03b5 \u0393\u03c1\u03b1\u03bc\u03bc\u03ae \u0395\u03c0\u03b9\u03ba\u03b5\u03c6\u03b1\u03bb\u03af\u03b4\u03b1\u03c2 fileCannotWriteTitle= \u039c\u03b7 \u0394\u03b9\u03b1\u03b8\u03ad\u03c3\u03b9\u03bc\u03bf \u0391\u03c1\u03c7\u03b5\u03af\u03bf fileCannotWriteMessage= \u0394\u03b5\u03bd \u03ad\u03c7\u03b5\u03c4\u03b5 \u03b4\u03b9\u03ba\u03b1\u03b9\u03ce\u03bc\u03b1\u03c4\u03b1 \u03bd\u03b1 \u03b3\u03c1\u03ac\u03c8\u03b5\u03c4\u03b5 \u03c3\u03c4\u03bf "%s." fileExistsTitle= \u0391\u03c1\u03c7\u03b5\u03af\u03bf \u03a5\u03c0\u03ac\u03c1\u03c7\u03b5\u03b9 \u0389\u03b4\u03b7 fileExistsMessage= \u03a4\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf "%s" \u03c5\u03c0\u03ac\u03c1\u03c7\u03b5\u03b9 \u03ae\u03b4\u03b7. fileOverwriteOption= \u0391\u03bd\u03c4\u03b9\u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7 fileAppendOption= \u03a0\u03c1\u03bf\u03c3\u03ac\u03c1\u03c4\u03b7\u03c3\u03b7 fileCancelOption= \u0391\u03ba\u03cd\u03c1\u03c9\u03c3\u03b7logisim-2.7.1/resources/logisim/el/hex.properties0000644000175000017500000000660611530601316022045 0ustar vincentvincent# # HexFrame.java # hexFrameTitle= Logisim: \u0394\u03b5\u03ba\u03b1\u03b5\u03be\u03b1\u03b4\u03b9\u03ba\u03cc\u03c2 \u03a3\u03c5\u03bd\u03c4\u03ac\u03ba\u03c4\u03b7\u03c2 hexFrameMenuItem= \u0394\u03b5\u03ba\u03b1\u03b5\u03be\u03b1\u03b4\u03b9\u03ba\u03cc\u03c2 \u03a3\u03c5\u03bd\u03c4\u03ac\u03ba\u03c4\u03b7\u03c2 hexPasteErrorTitle= \u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 \u0395\u03c0\u03b9\u03ba\u03cc\u03bb\u03bb\u03b7\u03c3\u03b7\u03c2 hexPasteSupportedError= \u03a4\u03b1 \u03c0\u03b5\u03c1\u03b9\u03b5\u03c7\u03cc\u03bc\u03b5\u03bd\u03b1 \u03c4\u03bf\u03c5 \u03c0\u03c1\u03bf\u03c7\u03b5\u03af\u03c1\u03bf\u03c5 \u03b4\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03bf\u03cd\u03bd \u03bd\u03b1 \u03b5\u03c0\u03b9\u03ba\u03bf\u03bb\u03bb\u03b7\u03b8\u03bf\u03cd\u03bd \u03c3\u03c4\u03bf\u03bd \u03c3\u03c5\u03bd\u03c4\u03ac\u03ba\u03c4\u03b7. hexPasteEndError= \u03a4\u03bf \u03c0\u03c1\u03cc\u03c7\u03b5\u03b9\u03c1\u03bf \u03c5\u03c0\u03b5\u03c1\u03b2\u03b1\u03af\u03bd\u03b5\u03b9 \u03c4\u03bf \u03c4\u03ad\u03bb\u03bf\u03c2 \u03c4\u03bf\u03c5 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5. hexPasteSizeError= \u0397 \u03c0\u03b5\u03c1\u03b9\u03bf\u03c7\u03ae \u03b5\u03c0\u03b9\u03ba\u03cc\u03bb\u03bb\u03b7\u03c3\u03b7\u03c2 \u03c0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03ad\u03c7\u03b5\u03b9 \u03c4\u03bf \u03af\u03b4\u03b9\u03bf \u03bc\u03ad\u03b3\u03b5\u03b8\u03bf\u03c2 \u03bc\u03b5 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf\u03c5 \u03c0\u03c1\u03bf\u03c7\u03b5\u03af\u03c1\u03bf\u03c5. hexOpenErrorTitle= \u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03ba\u03b1\u03c4\u03ac \u03c4\u03bf \u0386\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1 hexSaveErrorTitle= \u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03ba\u03b1\u03c4\u03ac \u03c4\u03b7\u03bd \u0391\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7 openButton= \u0386\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1... saveButton= \u0391\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7... closeButton= \u039a\u03bb\u03b5\u03af\u03c3\u03b9\u03bc\u03bf \u03a0\u03b1\u03c1\u03b1\u03b8\u03cd\u03c1\u03bf\u03c5 # # HexFile.java # hexFileOpenError= \u0394\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03c5\u03bd\u03b1\u03c4\u03cc \u03c4\u03bf \u03ac\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1 \u03c4\u03bf\u03c5 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5. hexFileReadError= \u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03ba\u03b1\u03c4\u03ac \u03c4\u03b7\u03bd \u03b1\u03bd\u03ac\u03b3\u03bd\u03c9\u03c3\u03b7 \u03c4\u03bf\u03c5 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5. hexFileWriteError= \u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03ba\u03b1\u03c4\u03ac \u03c4\u03b7\u03bd \u03b5\u03b3\u03b3\u03c1\u03b1\u03c6\u03ae \u03c4\u03bf\u03c5 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5. hexHeaderFormatError= \u03a4\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1\u03c2 \u03b4\u03b5\u03bd \u03ad\u03c7\u03b5\u03b9 \u03ad\u03b3\u03ba\u03c5\u03c1\u03b7 \u03bc\u03bf\u03c1\u03c6\u03ae \u03b5\u03c0\u03b9\u03ba\u03b5\u03c6\u03b1\u03bb\u03af\u03b4\u03b1\u03c2. hexNumberFormatError= \u0397 \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1 \u03ad\u03c7\u03b5\u03b9 \u03bc\u03b5\u03c1\u03b9\u03ba\u03ac \u03bc\u03b7 \u03ad\u03b3\u03ba\u03c5\u03c1\u03b1 \u03c0\u03b5\u03c1\u03b9\u03b5\u03c7\u03cc\u03bc\u03b5\u03bd\u03b1. hexFileSizeError= \u0397 \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1 \u03ad\u03c7\u03b5\u03b9 \u03c5\u03c0\u03b5\u03c1\u03b2\u03bf\u03bb\u03b9\u03ba\u03ae \u03c0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b1. logisim-2.7.1/resources/logisim/el/gui.properties0000644000175000017500000002617411530601316022047 0ustar vincentvincent# # gui/AttributeTable.java # attributeDialogTitle= \u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae \u03a4\u03b9\u03bc\u03ae\u03c2 changeAttributeAction= \u0391\u03bb\u03bb\u03b1\u03b3\u03ae \u0399\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2 changeCircuitAttrAction= \u0391\u03bb\u03bb\u03b1\u03b3\u03ae \u039a\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2 attributeChangeInvalidError= \u0391\u03bc\u03b5\u03c4\u03ac\u03b2\u03bb\u03b7\u03c4\u03b7 \u03b9\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b1 \u03bb\u03cc\u03b3\u03c9 \u03bc\u03b7 \u03ad\u03ba\u03b3\u03ba\u03c5\u03c1\u03b7\u03c2 \u03b1\u03af\u03c4\u03b7\u03c3\u03b7\u03c2 attributeChangeInvalidTitle= \u0386\u03ba\u03c5\u03c1\u03b7 \u03a4\u03b9\u03bc\u03ae cannotModifyCircuitError= \u0391\u03c5\u03c4\u03cc \u03c4\u03bf \u03ba\u03cd\u03ba\u03bb\u03c9\u03bc\u03b1 \u03b4\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03c4\u03c1\u03bf\u03c0\u03bf\u03b9\u03b7\u03b8\u03b5\u03af. # # gui/Canvas.java # canvasWidthError= \u0391\u03c3\u03cd\u03bc\u03b2\u03b1\u03c4\u03b1 \u03c0\u03bb\u03ac\u03c4\u03b7 canvasOscillationError= \u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 \u03c4\u03b1\u03bb\u03ac\u03bd\u03c4\u03c9\u03c3\u03b7\u03c2 canvasExceptionError= \u0397 \u03c0\u03c1\u03bf\u03c3\u03bf\u03bc\u03bf\u03af\u03c9\u03c3\u03b7 \u03c3\u03c4\u03b1\u03bc\u03ac\u03c4\u03b7\u03c3\u03b5 \u03bb\u03cc\u03b3\u03c9 \u03b5\u03c3\u03c9\u03c4\u03b5\u03c1\u03b9\u03ba\u03bf\u03cd \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1\u03c4\u03bf\u03c2 # # gui/Frame.java # titleCircFileKnown= Logisim: %s \u03b1\u03c0\u03cc %s titleFileKnown= Logisim: %s confirmDiscardMessage= \u03a4\u03b9 \u03c0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03c3\u03c5\u03bc\u03b2\u03b5\u03af \u03c3\u03c4\u03b9\u03c2 \u03bc\u03b7 \u03b1\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03c5\u03bc\u03ad\u03bd\u03b5\u03c2 \u03b1\u03bb\u03bb\u03b1\u03b3\u03ad\u03c2 \u03c3\u03b1\u03c2 \u03c3\u03c4\u03bf %s? confirmCloseTitle= \u0395\u03c0\u03b9\u03b2\u03b5\u03b2\u03b1\u03af\u03c9\u03c3\u03b7 \u039a\u03bb\u03b5\u03b9\u03c3\u03af\u03bc\u03b1\u03c4\u03bf\u03c2 saveOption= \u0391\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7 discardOption= \u0391\u03c0\u03cc\u03c1\u03c1\u03b9\u03c8\u03b7 cancelOption= \u0391\u03ba\u03cd\u03c1\u03c9\u03c3\u03b7 # # gui/ExportImage.java # labelCircuits= \u039a\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03b1: labelImageFormat= \u03a4\u03cd\u03c0\u03bf\u03c2 \u0395\u03b9\u03ba\u03cc\u03bd\u03b1\u03c2: labelScale= \u0392\u03b1\u03b8\u03bc\u03cc\u03c2 \u039a\u03bb\u03af\u03bc\u03b1\u03ba\u03b1\u03c2: labelPrinterView= \u03a0\u03c1\u03bf\u03b2\u03bf\u03bb\u03ae \u0395\u03ba\u03c4\u03c5\u03c0\u03c9\u03c4\u03ae: exportEmptyCircuitsTitle= \u0391\u03b4\u03cd\u03bd\u03b1\u03c4\u03b7 \u0395\u03be\u03b1\u03b3\u03c9\u03b3\u03ae exportEmptyCircuitsMessage= \u039a\u03b1\u03bd\u03ad\u03bd\u03b1 \u03bc\u03b7-\u03ba\u03b5\u03bd\u03cc \u03ba\u03cd\u03ba\u03bb\u03c9\u03bc\u03b1 \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03b9\u03b1\u03b8\u03ad\u03c3\u03b9\u03bc\u03bf \u03b3\u03b9\u03b1 \u03b5\u03be\u03b1\u03b3\u03c9\u03b3\u03ae. exportImageSelect= \u0395\u03be\u03b1\u03b3\u03c9\u03b3\u03ae \u0395\u03b9\u03ba\u03cc\u03bd\u03b1\u03c2 exportImageDirectorySelect= \u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae \u039a\u03b1\u03c4\u03b1\u03bb\u03cc\u03b3\u03bf\u03c5 \u0395\u03be\u03b1\u03b3\u03c9\u03b3\u03ae\u03c2 exportImageFileSelect= \u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae \u0391\u03c1\u03c7\u03b5\u03af\u03bf\u03c5 \u03b3\u03b9\u03b1 \u0395\u03be\u03b1\u03b3\u03c9\u03b3\u03ae exportImageButton= \u0395\u03be\u03b1\u03b3\u03c9\u03b3\u03ae exportGifFilter= GIF \u0391\u03c1\u03c7\u03b5\u03af\u03b1 (*.gif) exportPngFilter= PNG \u0391\u03c1\u03c7\u03b5\u03af\u03b1 (*.png) exportJpgFilter= JPEG \u0391\u03c1\u03c7\u03b5\u03af\u03b1 (*.jpeg, *.jpg) exportNewDirectoryErrorTitle= \u0391\u03b4\u03cd\u03bd\u03b1\u03c4\u03b7 \u0394\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u039a\u03b1\u03c4\u03b1\u03bb\u03cc\u03b3\u03bf\u03c5 exportNewDirectoryErrorMessage= \u039f \u03ba\u03b1\u03c4\u03ac\u03bb\u03bf\u03b3\u03bf\u03c2 \u03b4\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03b4\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03b7\u03b8\u03b5\u03af. couldNotCreateImage= \u0397 \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1 \u03b4\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03b4\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03b7\u03b8\u03b5\u03af. couldNotCreateFile= \u03a4\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf \u03b4\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03b4\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03b7\u03b8\u03b5\u03af. confirmOverwriteMessage= \u03a4\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf \u03ae\u03b4\u03b7 \u03c5\u03c0\u03ac\u03c1\u03c7\u03b5\u03b9. \u0398\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03c4\u03bf \u03b1\u03bd\u03c4\u03b9\u03ba\u03b1\u03c4\u03b1\u03c3\u03c4\u03ae\u03c3\u03b5\u03c4\u03b5? confirmOverwriteTitle= \u0395\u03c0\u03b9\u03b2\u03b5\u03b2\u03b1\u03af\u03c9\u03c3\u03b7 \u0391\u03bd\u03c4\u03b9\u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7\u03c2 exportImageProgress= \u03a5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03bc\u03cc\u03c2 \u0395\u03b9\u03ba\u03cc\u03bd\u03b1\u03c2... # # gui/Print.java # labelRotateToFit= \u03a0\u03b5\u03c1\u03b9\u03c3\u03c4\u03c1\u03bf\u03c6\u03ae \u03b3\u03b9\u03b1 \u03a0\u03c1\u03bf\u03c3\u03b1\u03c1\u03bc\u03bf\u03b3\u03ae: labelHeader= \u0395\u03c0\u03b9\u03ba\u03b5\u03c6\u03b1\u03bb\u03af\u03b4\u03b1: printEmptyCircuitsTitle= \u0391\u03b4\u03cd\u03bd\u03b1\u03c4\u03b7 \u03b7 \u0395\u03ba\u03c4\u03cd\u03c0\u03c9\u03c3\u03b7 printEmptyCircuitsMessage= \u039a\u03b1\u03bd\u03ad\u03bd\u03b1 \u03bc\u03b7-\u03ba\u03b5\u03bd\u03cc \u03ba\u03cd\u03ba\u03bb\u03c9\u03bc\u03b1 \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03b9\u03b1\u03b8\u03ad\u03c3\u03b9\u03bc\u03bf \u03b3\u03b9\u03b1 \u03b5\u03ba\u03c4\u03cd\u03c0\u03c9\u03c3\u03b7. printParmsTitle= \u03a0\u03b1\u03c1\u03ac\u03bc\u03b5\u03c4\u03c1\u03bf\u03b9 \u0395\u03ba\u03c4\u03cd\u03c0\u03c9\u03c3\u03b7\u03c2 printError= \u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03ba\u03b1\u03c4\u03ac \u03c4\u03b7\u03bd \u03b5\u03ba\u03c4\u03cd\u03c0\u03c9\u03c3\u03b7: %s printErrorTitle= \u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 \u039a\u03b1\u03c4\u03ac \u03c4\u03b7\u03bd \u0395\u03ba\u03c4\u03cd\u03c0\u03c9\u03c3\u03b7 # # gui/SelectionActions.java # dropComponentAction= \u0391\u03c0\u03cc\u03c1\u03c1\u03b9\u03c8\u03b7 \u03a3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf\u03c5 dropComponentsAction= \u0391\u03c0\u03cc\u03c1\u03c1\u03b9\u03c8\u03b7 \u03a3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03c9\u03bd moveSelectionAction= \u039c\u03b5\u03c4\u03b1\u03c4\u03cc\u03c0\u03b9\u03c3\u03b7 \u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae\u03c2 deleteSelectionAction= \u0394\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae \u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae\u03c2 duplicateSelectionAction= \u0394\u03b9\u03c0\u03bb\u03cc\u03c4\u03c5\u03c0\u03bf \u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae\u03c2 cutSelectionAction= \u0391\u03c0\u03bf\u03ba\u03bf\u03c0\u03ae \u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae\u03c2 copySelectionAction= \u0391\u03bd\u03c4\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae \u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae\u03c2 pasteClipboardAction= \u0395\u03c0\u03b9\u03ba\u03cc\u03bb\u03bb\u03b7\u03c3\u03b7 \u03a0\u03c1\u03bf\u03c7\u03b5\u03af\u03c1\u03bf\u03c5 # # tools/SelectionAttributeChange.java # selectionAttributeAction= \u0391\u03bb\u03bb\u03b1\u03b3\u03ae \u0399\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2 \u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae\u03c2 # # tools/ToolActions.java # changeToolAttrAction= \u0391\u03bb\u03bb\u03b1\u03b3\u03ae \u0399\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2 \u0395\u03c1\u03b3\u03b1\u03bb\u03b5\u03af\u03bf\u03c5 # # gui/main/StatisticsDialog.java # statsDialogTitle= Logisim: %s \u03a3\u03c4\u03b1\u03c4\u03b9\u03c3\u03c4\u03b9\u03ba\u03ac statsCloseButton= \u039a\u03bb\u03b5\u03af\u03c3\u03b9\u03bc\u03bf statsSimpleCountColumn= \u0391\u03c0\u03bb\u03cc statsUniqueCountColumn= \u039c\u03bf\u03bd\u03b1\u03b4\u03b9\u03ba\u03cc statsRecursiveCountColumn= \u0395\u03c0\u03b1\u03bd\u03b1\u03bb\u03b7\u03c0\u03c4\u03b9\u03ba\u03cc statsComponentColumn= \u03a3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf statsLibraryColumn= \u0392\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7 statsTotalWithout= \u03a3\u03a5\u039d\u039f\u039b\u039f (\u03b4\u03af\u03c7\u03c9\u03c2 \u03c4\u03b1 \u03c5\u03c0\u03bf-\u03ba\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03b1 \u03c4\u03bf\u03c5 \u03ad\u03c1\u03b3\u03bf\u03c5) statsTotalWith= \u03a3\u03a5\u039d\u039f\u039b\u039f (\u03bc\u03b5 \u03c5\u03c0\u03bf-\u03ba\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03b1) # # gui/ProjectToolbar.java # projectAddCircuitTip= \u03a0\u03c1\u03bf\u03c3\u03b8\u03ae\u03ba\u03b7 \u039a\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2 projectMoveCircuitDownTip= \u039c\u03b5\u03c4\u03b1\u03c4\u03cc\u03c0\u03b9\u03c3\u03b7 \u03c4\u03bf\u03c5 \u03b5\u03bc\u03c6\u03b1\u03bd\u03b9\u03b6\u03cc\u03bc\u03b5\u03bd\u03bf\u03c5 \u03ba\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2 \u03ba\u03ac\u03c4\u03c9 \u03c3\u03c4\u03b7 \u03bb\u03af\u03c3\u03c4\u03b1 projectMoveCircuitUpTip= \u039c\u03b5\u03c4\u03b1\u03c4\u03cc\u03c0\u03b9\u03c3\u03b7 \u03c4\u03bf\u03c5 \u03b5\u03bc\u03c6\u03b1\u03bd\u03b9\u03b6\u03cc\u03bc\u03b5\u03bd\u03bf\u03c5 \u03ba\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2 \u03b5\u03c0\u03ac\u03bd\u03c9 \u03c3\u03c4\u03b7 \u03bb\u03af\u03c3\u03c4\u03b1 projectRemoveCircuitTip= \u039a\u03b1\u03c4\u03ac\u03c1\u03b3\u03b7\u03c3\u03b7 \u03c4\u03bf\u03c5 \u03b5\u03bc\u03c6\u03b1\u03bd\u03b9\u03b6\u03cc\u03bc\u03b5\u03bd\u03bf\u03c5 \u03ba\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2 projectEditLayoutTip= \u0395\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03c4\u03b7\u03c2 \u03b4\u03b9\u03ac\u03c4\u03b1\u03be\u03b7\u03c2 \u03c4\u03bf\u03c5 \u03b5\u03bc\u03c6\u03b1\u03bd\u03b9\u03b6\u03cc\u03bc\u03b5\u03bd\u03bf\u03c5 \u03ba\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2 projectEditAppearanceTip= \u0395\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03c0\u03b1\u03c1\u03bf\u03c5\u03c3\u03af\u03b1\u03c3\u03b7\u03c2 \u03c4\u03bf\u03c5 \u03b5\u03bc\u03c6\u03b1\u03bd\u03b9\u03b6\u03cc\u03bc\u03b5\u03bd\u03bf\u03c5 \u03ba\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2 # # gui/TickRate.java # tickRateHz= %s Hz tickRateKHz= %s KHz # # gui/ZoomControl.java # zoomShowGrid= \u0395\u03bd\u03b1\u03bb\u03bb\u03b1\u03b3\u03ae \u03b5\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7\u03c2 \u03c0\u03bb\u03ad\u03b3\u03bc\u03b1\u03c4\u03bf\u03c2 # # gui/appear/RevertAppearanceAction # revertAppearanceAction= \u0395\u03c0\u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac \u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7\u03c2 # # attribute table models # circuitAttrTitle= \u039a\u03cd\u03ba\u03bb\u03c9\u03bc\u03b1: %s toolAttrTitle= \u0395\u03c1\u03b3\u03b1\u03bb\u03b5\u03af\u03bf: %s selectionOne= \u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae: %s selectionMultiple= \u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae: %s \u00d7 %s selectionVarious= \u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae: \u0394\u03b9\u03ac\u03c6\u03bf\u03c1\u03b1 \u03b1\u03bd\u03c4\u03b9\u03ba\u03b5\u03af\u03bc\u03b5\u03bd\u03b1 \u00d7 %slogisim-2.7.1/resources/logisim/el/file.properties0000644000175000017500000003351511530601316022177 0ustar vincentvincent# # lib/LogisimFile.java # fileDuplicateError= \u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03b4\u03b9\u03c0\u03bb\u03cc\u03c4\u03c5\u03c0\u03bf\u03c5 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5: %s defaultProjectName= \u03a7\u03c9\u03c1\u03af\u03c2 \u03a4\u03af\u03c4\u03bb\u03bf unloadUsedError= \u03a4\u03bf \u03ba\u03cd\u03ba\u03bb\u03c9\u03bc\u03b1 '%s' \u03c7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03b5\u03af \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03b1 \u03b1\u03c0\u03cc \u03c4\u03b7 \u03b2\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7 unloadToolbarError= \u0397 \u03b2\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7 \u03c0\u03b5\u03c1\u03b9\u03bb\u03b1\u03bc\u03b2\u03ac\u03bd\u03b5\u03b9 \u03b1\u03bd\u03c4\u03b9\u03ba\u03b5\u03af\u03bc\u03b5\u03bd\u03b1 \u03c0\u03bf\u03c5 \u03b2\u03c1\u03af\u03c3\u03ba\u03bf\u03bd\u03c4\u03b1\u03b9 \u03c3\u03c4\u03b7\u03bd \u03b5\u03c1\u03b3\u03b1\u03bb\u03b5\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7 unloadMappingError= \u0397 \u03b2\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7 \u03c0\u03b5\u03c1\u03b9\u03bb\u03b1\u03bc\u03b2\u03ac\u03bd\u03b5\u03b9 \u03b1\u03bd\u03c4\u03b9\u03ba\u03b5\u03af\u03bc\u03b5\u03bd\u03b1 \u03c0\u03bf\u03c5 \u03b5\u03af\u03bd\u03b1\u03b9 \u03c7\u03b1\u03c1\u03c4\u03bf\u03b3\u03c1\u03b1\u03c6\u03b7\u03bc\u03ad\u03bd\u03b1 \u03c3\u03c4\u03bf \u03c0\u03bf\u03bd\u03c4\u03af\u03ba\u03b9. xmlConversionError= \u0395\u03c3\u03c9\u03c4\u03b5\u03c1\u03b9\u03ba\u03cc \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03ba\u03b1\u03c4\u03ac \u03c4\u03b7 \u03b4\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03c4\u03bf\u03c5 XML # # lib/LogisimFileActions.java # addCircuitAction= \u03a0\u03c1\u03bf\u03c3\u03b8\u03ae\u03ba\u03b7 \u039a\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2 removeCircuitAction= \u039a\u03b1\u03c4\u03ac\u03c1\u03b3\u03b7\u03c3\u03b7 \u039a\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2 moveCircuitAction= \u0391\u03bd\u03b1\u03b4\u03b9\u03ac\u03c4\u03b1\u03be\u03b7 \u039a\u03c5\u03ba\u03bb\u03c9\u03bc\u03ac\u03c4\u03c9\u03bd loadLibraryAction= \u03a6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7 \u0392\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7\u03c2 loadLibrariesAction= \u03a6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7 \u0392\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03b7\u03ba\u03ce\u03bd unloadLibraryAction= \u0395\u03bb\u03b5\u03c5\u03b8\u03ad\u03c1\u03c9\u03c3\u03b7 \u0392\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7\u03c2 unloadLibrariesAction= \u0395\u03bb\u03b5\u03c5\u03b8\u03ad\u03c1\u03c9\u03c3\u03b7 \u0392\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03b7\u03ba\u03ce\u03bd setMainCircuitAction= \u039f\u03c1\u03b9\u03c3\u03bc\u03cc\u03c2 \u039a\u03c5\u03c1\u03af\u03c9\u03c2 \u039a\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2 revertDefaultsAction= \u0395\u03c0\u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac \u03c3\u03c4\u03b9\u03c2 \u03a0\u03c1\u03bf\u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ad\u03c2 # # gui/Loader.java # logisimFileFilter= \u0388\u03c1\u03b3\u03bf Logisim (*.circ) jarFileFilter= Java Archive (*.jar) fileDescriptorUnknownError= \u0386\u03b3\u03bd\u03c9\u03c3\u03c4\u03b7 \u03a0\u03b5\u03c1\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae \u03b3\u03b9\u03b1 %s. fileDescriptorError= \u039c\u03b7 \u03b1\u03bd\u03b1\u03b3\u03bd\u03c9\u03c1\u03af\u03c3\u03b9\u03bc\u03b7 \u03c0\u03b5\u03c1\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae \u03b2\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7\u03c2 %s fileTypeError= \u0397 \u03b2\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7 Logisim \u03ad\u03c7\u03b5\u03b9 \u03ad\u03bd\u03b1 \u03bc\u03b7 \u03b1\u03bd\u03b1\u03b3\u03bd\u03c9\u03c1\u03af\u03c3\u03b9\u03bc\u03bf \u03c4\u03cd\u03c0\u03bf %s (%s) fileBuiltinMissingError= \u0397 \u03b5\u03bd\u03c3\u03c9\u03bc\u03b1\u03c4\u03c9\u03bc\u03ad\u03bd\u03b7 \u03b2\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7 %s \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03b9\u03b1\u03b8\u03ad\u03c3\u03b9\u03bc\u03b7 \u03c3\u03b5 \u03b1\u03c5\u03c4\u03ae \u03c4\u03b7\u03bd \u03ad\u03ba\u03b4\u03bf\u03c3\u03b7. fileLibraryMissingError= \u03a4\u03bf \u03b1\u03c0\u03b1\u03b9\u03c4\u03bf\u03cd\u03bc\u03b5\u03bd\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf \u03b2\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7\u03c2 `%s' \u03bb\u03b5\u03af\u03c0\u03b5\u03b9. \u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce \u03b5\u03c0\u03b9\u03bb\u03ad\u03be\u03c4\u03b5 \u03c4\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf \u03b1\u03c0\u03cc \u03c4\u03bf\u03bd \u03b1\u03ba\u03cc\u03bb\u03bf\u03c5\u03b8\u03bf \u03b4\u03b9\u03ac\u03bb\u03bf\u03b3\u03bf. fileLibraryMissingTitle= \u0395\u03bd\u03c4\u03cc\u03c0\u03b9\u03c3\u03b5 `%s' fileLibraryMissingButton= \u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae fileLoadCanceledError= \u039f \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7\u03c2 \u03b1\u03ba\u03cd\u03c1\u03c9\u03c3\u03b5 \u03c4\u03b7 \u03c6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7. [1] fileMessageTitle= \u039c\u03ae\u03bd\u03c5\u03bc\u03b1 \u0391\u03c1\u03c7\u03b5\u03af\u03bf\u03c5 fileErrorTitle= \u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 \u0391\u03c1\u03c7\u03b5\u03af\u03bf\u03c5 fileSaveErrorTitle= \u0391\u03b4\u03cd\u03bd\u03b1\u03c4\u03b7 \u0391\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7 \u0391\u03c1\u03c7\u03b5\u03af\u03bf\u03c5 fileSaveError= \u0394\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03c5\u03bd\u03b1\u03c4\u03ae \u03b7 \u03b1\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7 \u03c4\u03bf\u03c5 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5: %s fileSaveCloseError= \u0394\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03c5\u03bd\u03b1\u03c4\u03cc \u03c4\u03bf \u03ba\u03bb\u03b5\u03af\u03c3\u03b9\u03bc\u03bf \u03c4\u03bf\u03c5 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5: %s fileCircularError= \u0394\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03b4\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03b7\u03b8\u03b5\u03af \u03ba\u03c5\u03ba\u03bb\u03b9\u03ba\u03ae \u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac. (\u03a4\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf \u03c7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03b5\u03af\u03c4\u03b1\u03b9 \u03b1\u03c0\u03cc \u03c4\u03b7\u03bd \u03b2\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7 %s .) fileSaveZeroError= \u039c\u03c5\u03c3\u03c4\u03b7\u03c1\u03b9\u03c9\u03b4\u03ce\u03c2, \u03ba\u03b1\u03c4\u03ac \u03c4\u03b7\u03bd \u03b1\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7 \u03b4\u03b9\u03b1\u03b3\u03c1\u03ac\u03c6\u03b7\u03ba\u03b5 \u03c4\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf. \u0398\u03b1 \u03b3\u03af\u03bd\u03b5\u03b9 \u03b1\u03c0\u03cc\u03c0\u03b5\u03b9\u03c1\u03b1 \u03b1\u03bd\u03ac\u03bd\u03b7\u03c8\u03b7\u03c2. \u0391\u03bd \u03bc\u03c0\u03bf\u03c1\u03b5\u03af\u03c4\u03b5 \u03bd\u03b1 \u03b5\u03bd\u03c4\u03bf\u03c0\u03af\u03c3\u03b5\u03c4\u03b5 \u03c4\u03b9 \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03c4\u03bf \u03c0\u03c1\u03bf\u03ba\u03ac\u03bb\u03b5\u03c3\u03b5, \u03c0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce \u03b5\u03c0\u03b9\u03ba\u03bf\u03b9\u03bd\u03c9\u03bd\u03ae\u03c3\u03c4\u03b5 \u03bc\u03b5 \u03c4\u03bf\u03bd Carl Burch. unknownLibraryFileError= \u039a\u03b1\u03bd\u03ad\u03bd\u03b1 \u03b3\u03bd\u03c9\u03c3\u03c4\u03cc \u03b1\u03c1\u03c7\u03b5\u03af\u03bf \u03b4\u03b5\u03bd \u03b1\u03bd\u03c4\u03b9\u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af \u03c3\u03b5 %s. logisimCircularError= \u03a4\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf %s \u03c0\u03b5\u03c1\u03b9\u03ad\u03c7\u03b5\u03b9 \u03bc\u03ad\u03c3\u03b1 \u03c4\u03bf\u03c5 \u03bc\u03b9\u03b1 \u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac \u03c3\u03c4\u03bf \u03af\u03b4\u03b9\u03bf (\u03b1\u03c5\u03c4\u03bf\u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac). logisimLoadError= \u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03c0\u03b1\u03c1\u03bf\u03c5\u03c3\u03b9\u03ac\u03c3\u03c4\u03b7\u03ba\u03b5 \u03ba\u03b1\u03c4\u03ac \u03c4\u03bf \u03ac\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1 %s: %s jarNotOpenedError= \u03a4\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf JAR \u03b4\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03b1\u03bd\u03bf\u03af\u03be\u03b5\u03b9. jarClassNotFoundError= \u0397 \u03ba\u03bb\u03ac\u03c3\u03b7 %s \u03b4\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5 \u03c3\u03c4\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf JAR. jarClassNotLibraryError= \u03a4\u03bf `%s' \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03ad\u03b3\u03ba\u03c5\u03c1\u03bf \u03cc\u03bd\u03bf\u03bc\u03b1 \u03b2\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7\u03c2. jarLibraryNotCreatedError= \u0397 \u03b2\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7 %s \u03b4\u03b5\u03bd \u03ae\u03c4\u03b1\u03bd \u03b4\u03c5\u03bd\u03b1\u03c4\u03cc\u03bd \u03bd\u03b1 \u03b1\u03c1\u03c7\u03b9\u03ba\u03bf\u03c0\u03bf\u03b9\u03b7\u03b8\u03b5\u03af. fileAppearanceError= \u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03ba\u03b1\u03c4\u03ac \u03c4\u03bf \u03c6\u03cc\u03c1\u03c4\u03c9\u03bc\u03b1 \u03c4\u03bf\u03c5 \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf\u03c5 \u03b5\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7\u03c2 %s fileAppearanceNotFound= \u03a4\u03bf \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf \u03b5\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7\u03c2 %s \u03b4\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5 # # lib/Options.java # gateUndefinedOption= \u0388\u03be\u03bf\u03b4\u03bf\u03c2 \u03a0\u03cd\u03bb\u03b7\u03c2 \u03cc\u03c4\u03b1\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u0391\u03c0\u03c1\u03bf\u03c3\u03b4\u03b9\u03cc\u03c1\u03b9\u03c3\u03c4\u03b7 simLimitOption= \u03a0\u03b5\u03c1\u03b9\u03bf\u03c1\u03b9\u03c3\u03bc\u03cc\u03c2 \u03a0\u03c1\u03bf\u03c3\u03bf\u03bc\u03bf\u03af\u03c9\u03c3\u03b7\u03c2 simRandomOption= \u03a4\u03c5\u03c7\u03b1\u03b9\u03cc\u03c4\u03b7\u03c4\u03b1 \u03a0\u03c1\u03bf\u03c3\u03bf\u03bc\u03bf\u03af\u03c9\u03c3\u03b7\u03c2 gateUndefinedIgnore= \u0391\u03b3\u03bd\u03cc\u03b7\u03c3\u03b5 \u03b1\u03c0\u03c1\u03bf\u03c3\u03b4\u03b9\u03cc\u03c1\u03b9\u03c3\u03c4\u03b5\u03c2 \u03b5\u03b9\u03c3\u03cc\u03b4\u03bf\u03c5\u03c2 gateUndefinedError= \u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03b3\u03b9\u03b1 \u03b1\u03c0\u03c1\u03bf\u03c3\u03b4\u03b9\u03cc\u03c1\u03b9\u03c3\u03c4\u03b5\u03c2 \u03b5\u03b9\u03c3\u03cc\u03b4\u03bf\u03c5\u03c2 # # lib/XmlReader.java # libNameMissingError= \u03bb\u03b5\u03af\u03c0\u03b5\u03b9 \u03cc\u03bd\u03bf\u03bc\u03b1 \u03b2\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7\u03c2 libDescMissingError= \u03bb\u03b5\u03af\u03c0\u03b5\u03b9 \u03c0\u03b5\u03c1\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae \u03b2\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7\u03c2 libMissingError= \u03b7 \u03b2\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7`%s' \u03b4\u03b5\u03bd \u03b5\u03bd\u03c4\u03bf\u03c0\u03af\u03b6\u03b5\u03c4\u03b1\u03b9 toolNameMissingError= \u03bb\u03b5\u03af\u03c0\u03b5\u03b9 \u03c4\u03bf \u03cc\u03bd\u03bf\u03bc\u03b1 \u03c4\u03bf\u03c5 \u03b5\u03c1\u03b3\u03b1\u03bb\u03b5\u03af\u03bf\u03c5 mappingMissingError= \u03bb\u03b5\u03af\u03c0\u03b5\u03b9 \u03b7 \u03c4\u03c1\u03bf\u03c0\u03bf\u03c0\u03bf\u03b9\u03b7\u03bc\u03ad\u03bd\u03b7 \u03c7\u03b1\u03c1\u03c4\u03bf\u03b3\u03c1\u03ac\u03c6\u03b7\u03c3\u03b7 \u03c4\u03bf\u03c5 \u03c0\u03bf\u03bd\u03c4\u03b9\u03ba\u03b9\u03bf\u03cd mappingBadError= \u03b7 \u03c4\u03c1\u03bf\u03c0\u03bf\u03b9\u03b7\u03bc\u03ad\u03bd\u03b7 \u03c7\u03b1\u03c1\u03c4\u03bf\u03b3\u03c1\u03ac\u03c6\u03b7\u03c3\u03b7 \u03c4\u03bf\u03c5 \u03c0\u03bf\u03bd\u03c4\u03b9\u03ba\u03b9\u03bf\u03cd`%s' \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03ad\u03b3\u03ba\u03c5\u03c1\u03b7 circNameMissingError= \u03bb\u03b5\u03af\u03c0\u03b5\u03b9 \u03c4\u03bf \u03cc\u03bd\u03bf\u03bc\u03b1 \u03c4\u03bf\u03c5 \u03ba\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2 compUnknownError= \u03c4\u03bf \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf `%s' \u03b4\u03b5\u03bd \u03b2\u03c1\u03af\u03c3\u03ba\u03b5\u03c4\u03b1\u03b9 compNameMissingError= \u03bb\u03b5\u03af\u03c0\u03b5\u03b9 \u03c4\u03bf \u03cc\u03bd\u03bf\u03bc\u03b1 \u03c4\u03bf\u03c5 \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf\u03c5 compAbsentError= \u03c4\u03bf \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf`%s' \u03bb\u03b5\u03af\u03c0\u03b5\u03b9 \u03b1\u03c0\u03cc \u03c4\u03b7 \u03b2\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7`%s' compLocMissingError= \u03b7 \u03c4\u03bf\u03c0\u03bf\u03b8\u03b5\u03c3\u03af\u03b1 \u03c4\u03bf\u03c5 \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf\u03c5`%s' \u03b4\u03b5\u03bd \u03ad\u03c7\u03b5\u03b9 \u03bf\u03c1\u03b9\u03c3\u03c4\u03b5\u03af compLocInvalidError= \u03b7 \u03c4\u03bf\u03c0\u03bf\u03b8\u03b5\u03c3\u03af\u03b1 \u03c4\u03bf\u03c5 \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf\u03c5 `%s' \u03b5\u03af\u03bd\u03b1\u03b9 \u03ac\u03ba\u03c5\u03c1\u03b7 (%s) wireStartMissingError= \u03b7 \u03b1\u03c1\u03c7\u03ae \u03c4\u03bf\u03c5 \u03ba\u03b1\u03bb\u03c9\u03b4\u03af\u03bf\u03c5 \u03b4\u03b5\u03bd \u03ad\u03c7\u03b5\u03b9 \u03bf\u03c1\u03b9\u03c3\u03c4\u03b5\u03af wireStartInvalidError= \u03b4\u03af\u03c7\u03c9\u03c2 \u03bc\u03bf\u03c1\u03c6\u03ae \u03b7 \u03b1\u03c1\u03c7\u03ae \u03c4\u03bf\u03c5 \u03ba\u03b1\u03bb\u03c9\u03b4\u03af\u03bf\u03c5 wireEndMissingError= \u03c4\u03bf \u03c4\u03ad\u03bb\u03bf\u03c2 \u03c4\u03bf\u03c5 \u03ba\u03b1\u03bb\u03c9\u03b4\u03af\u03bf\u03c5 \u03b4\u03b5\u03bd \u03ad\u03c7\u03b5\u03b9 \u03bf\u03c1\u03b9\u03c3\u03c4\u03b5\u03af wireEndInvalidError= \u03b4\u03af\u03c7\u03c9\u03c2 \u03bc\u03bf\u03c1\u03c6\u03ae \u03c4\u03bf \u03c4\u03ad\u03bb\u03bf\u03c2 \u03c4\u03bf\u03c5 \u03ba\u03b1\u03bb\u03c9\u03b4\u03af\u03bf\u03c5 attrNameMissingError= \u03bb\u03b5\u03af\u03c0\u03b5\u03b9 \u03c4\u03bf \u03cc\u03bd\u03bf\u03bc\u03b1 \u03c4\u03b7\u03c2 \u03b9\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2 attrValueInvalidError= \u03b7 \u03c4\u03b9\u03bc\u03ae \u03c4\u03b7\u03c2 \u03b9\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2 (%s) \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03ad\u03b3\u03ba\u03c5\u03c1\u03b7 \u03b3\u03b9\u03b1 %s xmlFormatError= \u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03bc\u03bf\u03c1\u03c6\u03ae\u03c2 XML: %s logisim-2.7.1/resources/logisim/el/draw.properties0000644000175000017500000000637511530601316022221 0ustar vincentvincent# draw.model - Attributes attrPaint= \u03a4\u03cd\u03c0\u03bf\u03c2 \u0392\u03b1\u03c6\u03ae\u03c2 attrFont= \u0393\u03c1\u03b1\u03bc\u03bc\u03b1\u03c4\u03bf\u03c3\u03b5\u03b9\u03c1\u03ac attrAlign= \u03a3\u03c4\u03bf\u03af\u03c7\u03b9\u03c3\u03b7 attrStrokeWidth= \u03a0\u03bb\u03ac\u03c4\u03bf\u03c2 \u03a0\u03ad\u03bd\u03b1\u03c2 attrStroke= \u03a7\u03c1\u03ce\u03bc\u03b1 \u03a0\u03ad\u03bd\u03b1\u03c2 attrFill= \u03a7\u03c1\u03ce\u03bc\u03b1 \u0393\u03b5\u03bc\u03af\u03c3\u03bc\u03b1\u03c4\u03bf\u03c2 attrRx= \u0391\u03ba\u03c4\u03af\u03bd\u03b1 \u0393\u03c9\u03bd\u03af\u03b1\u03c2 paintStroke= \u039c\u03cc\u03bd\u03bf \u03a0\u03b5\u03c1\u03b9\u03b8\u03ce\u03c1\u03b9\u03bf paintFill= \u039c\u03cc\u03bd\u03bf \u0393\u03ad\u03bc\u03b9\u03c3\u03bc\u03b1 paintBoth= \u03a0\u03b5\u03c1\u03b9\u03b8\u03ce\u03c1\u03b9\u03bf & \u0393\u03ad\u03bc\u03b9\u03c3\u03bc\u03b1 alignStart= \u0391\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac alignMiddle= \u039a\u03ad\u03bd\u03c4\u03c1\u03bf alignEnd= \u0394\u03b5\u03be\u03b9\u03ac # draw.model - CanvasObject names shapeMultiple= \u0391\u03bd\u03c4\u03b9\u03ba\u03b5\u03af\u03bc\u03b5\u03bd\u03b1 shapeCurve= \u039a\u03b1\u03bc\u03c0\u03cd\u03bb\u03b7 shapeRect= \u039f\u03c1\u03b8\u03bf\u03b3\u03ce\u03bd\u03b9\u03bf shapeRoundRect= \u03a3\u03c4\u03c1\u03bf\u03b3\u03b3\u03c5\u03bb\u03b5\u03bc\u03ad\u03bd\u03bf \u039f\u03c1\u03b8\u03bf\u03b3\u03ce\u03bd\u03b9\u03bf shapeOval= \u03a9\u03bf\u03b5\u03b9\u03b4\u03ad\u03c2 shapePolygon= \u03a0\u03bf\u03bb\u03cd\u03b3\u03c9\u03bd\u03bf shapePolyline= \u03a0\u03bf\u03bb\u03bb\u03b1\u03c0\u03bb\u03ad\u03c2 \u03b3\u03c1\u03b1\u03bc\u03bc\u03ad\u03c2 shapeLine= \u0393\u03c1\u03b1\u03bc\u03bc\u03ae shapeText= \u039a\u03b5\u03af\u03bc\u03b5\u03bd\u03bf # draw.action - Action names actionAdd= \u03a0\u03c1\u03bf\u03c3\u03b8\u03ae\u03ba\u03b7 %s actionRemove= \u039a\u03b1\u03c4\u03ac\u03c1\u03b3\u03b7\u03c3\u03b7 %s actionTranslate= \u039c\u03b5\u03c4\u03b1\u03ba\u03af\u03bd\u03b7\u03c3\u03b7 %s actionMoveHandle= \u039c\u03b5\u03c4\u03b1\u03ba\u03af\u03bd\u03b7\u03c3\u03b7 \u03a7\u03b5\u03b9\u03c1\u03b9\u03c3\u03c4\u03b7\u03c1\u03af\u03bf\u03c5 actionInsertHandle= \u03a0\u03c1\u03bf\u03c3\u03b8\u03ae\u03ba\u03b7 \u03a7\u03b5\u03b9\u03c1\u03b9\u03c3\u03c4\u03b7\u03c1\u03af\u03bf\u03c5 actionDeleteHandle= \u0391\u03c6\u03b1\u03af\u03c1\u03b5\u03c3\u03b7 \u03a7\u03b5\u03b9\u03c1\u03b9\u03c3\u03c4\u03b7\u03c1\u03af\u03bf\u03c5 actionChangeAttributes= \u0391\u03bb\u03bb\u03b1\u03b3\u03ae \u0399\u03b4\u03b9\u03bf\u03c4\u03ae\u03c4\u03c9\u03bd actionChangeAttribute= \u0391\u03bb\u03bb\u03b1\u03b3\u03ae %s actionLower= \u03a7\u03b1\u03bc\u03b7\u03bb\u03cc\u03c4\u03b5\u03c1\u03bf actionRaise= \u0386\u03bd\u03bf\u03b4\u03bf actionReorder= \u0391\u03bd\u03b1\u03b4\u03b9\u03ac\u03c4\u03b1\u03be\u03b7 actionEditText= \u0395\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u039a\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5 # draw.gui - attribute table titles selectionOne= \u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae: %s selectionMultiple= \u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae: %s \u00d7 %s selectionVarious= \u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae: \u0394\u03b9\u03ac\u03c6\u03bf\u03c1\u03b1 \u03b1\u03bd\u03c4\u03b9\u03ba\u03b5\u03af\u03bc\u03b5\u03bd\u03b1 \u00d7 %slogisim-2.7.1/resources/logisim/el/data.properties0000644000175000017500000000131111530601316022156 0ustar vincentvincent# # data/Attributes.java # booleanTrueOption= \u039d\u03b1\u03b9 booleanFalseOption= \u038c\u03c7\u03b9 # # data/Direction.java # directionEastOption= \u0391\u03bd\u03b1\u03c4\u03bf\u03bb\u03ae directionWestOption= \u0394\u03cd\u03c3\u03b7 directionNorthOption= \u0392\u03cc\u03c1\u03b5\u03b9\u03b1 directionSouthOption= \u039d\u03cc\u03c4\u03b9\u03b1 directionNorthVertical= \u0395\u03c0\u03ac\u03bd\u03c9 directionSouthVertical= \u039a\u03ac\u03c4\u03c9 directionEastVertical= \u0394\u03b5\u03be\u03b9\u03ac directionWestVertical= \u0391\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac # # data/Value.java # valueErrorSymbol= E valueUnknownSymbol= x valueError= \u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 valueUnknown= ??? logisim-2.7.1/resources/logisim/el/circuit.properties0000644000175000017500000001141711530601316022717 0ustar vincentvincent# # Analyze.java # defaultInputLabels= a,b,c,d,e,f,g,h defaultOutputLabels= x,y,z,u,v,w,s,t # # AnalyzeException.java # analyzeCircularError= \u0395\u03bd\u03c4\u03bf\u03c0\u03af\u03c3\u03c4\u03b7\u03ba\u03b5 \u03ba\u03c5\u03ba\u03bb\u03b9\u03ba\u03ae \u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac, \u03c5\u03c0\u03bf\u03bb\u03bf\u03b3\u03af\u03c3\u03bc\u03bf\u03c2 \u03c0\u03af\u03bd\u03b1\u03ba\u03b1 \u03b1\u03bb\u03b7\u03b8\u03b5\u03af\u03b1\u03c2 \u03b1\u03bd\u03c4' \u03b1\u03c5\u03c4\u03bf\u03cd. analyzeConflictError= \u0391\u03bd\u03af\u03c7\u03bd\u03b5\u03c5\u03c3\u03b7 \u03b1\u03bd\u03c4\u03b9\u03ba\u03c1\u03bf\u03c5\u03cc\u03bc\u03b5\u03bd\u03c9\u03bd \u03b5\u03be\u03cc\u03b4\u03c9\u03bd, \u03c5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03bc\u03cc\u03c2 \u03c0\u03af\u03bd\u03b1\u03ba\u03b1 \u03b1\u03bb\u03b7\u03b8\u03b5\u03af\u03b1\u03c2 \u03b1\u03bd\u03c4' \u03b1\u03c5\u03c4\u03bf\u03cd. analyzeCannotHandleError= \u03a5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03bc\u03cc\u03c2 \u03c0\u03af\u03bd\u03b1\u03ba\u03b1 \u03b1\u03bb\u03b7\u03b8\u03b5\u03af\u03b1\u03c2 \u03b1\u03bd\u03c4\u03af \u03c4\u03b7\u03c2 \u03ad\u03ba\u03c6\u03c1\u03b1\u03c3\u03b7\u03c2 \u03bb\u03cc\u03b3\u03c9 \u03c4\u03bf\u03c5 %s. # # circuit/Circuit.java # circuitName= \u038c\u03bd\u03bf\u03bc\u03b1 \u039a\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2 circuitLabelLocAttr= \u0398\u03ad\u03c3\u03b7 \u0395\u03c4\u03b9\u03ba\u03ad\u03c4\u03b1\u03c2 circuitLabelAttr= \u0394\u03b9\u03b1\u03bc\u03bf\u03b9\u03c1\u03b1\u03b6\u03cc\u03bc\u03b5\u03bd\u03b7 \u0395\u03c4\u03b9\u03ba\u03ad\u03c4\u03b1 circuitLabelDirAttr= \u03a0\u03c1\u03bf\u03c3\u03b1\u03bd\u03b1\u03c4\u03bf\u03bb\u03b9\u03c3\u03bc\u03cc\u03c2 \u0394\u03b9\u03b1\u03bc\u03bf\u03b9\u03c1\u03b1\u03b6\u03cc\u03bc\u03b5\u03bd\u03b7\u03c2 \u0395\u03c4\u03b9\u03ba\u03ad\u03c4\u03b1\u03c2 circuitLabelFontAttr= \u0393\u03c1\u03b1\u03bc\u03bc\u03b1\u03c4\u03bf\u03c3\u03b5\u03b9\u03c1\u03ac \u0394\u03b9\u03b1\u03bc\u03bf\u03b9\u03c1\u03b1\u03b6\u03cc\u03bc\u03b5\u03bd\u03b7\u03c2 \u0395\u03c4\u03b9\u03ba\u03ad\u03c4\u03b1\u03c2 # # circuit/CircuitMutation.java # unknownChangeAction= \u0391\u03bb\u03bb\u03b1\u03b3\u03ae \u039a\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2 # # circuit/Subcircuit.java # subcircuitViewItem= \u03a0\u03c1\u03bf\u03b2\u03bf\u03bb\u03ae %s subcircuitCircuitTip= %s \u03c5\u03c0\u03bf-\u03ba\u03cd\u03ba\u03bb\u03c9\u03bc\u03b1 # # circuit/RadixOption.java # radixAttr= \u03a3\u03cd\u03c3\u03c4\u03b7\u03bc\u03b1 \u039c\u03ad\u03c4\u03c1\u03b7\u03c3\u03b7\u03c2 radix2= \u0394\u03c5\u03b1\u03b4\u03b9\u03ba\u03cc radix10Signed= \u03a0\u03c1\u03bf\u03c3\u03b7\u03bc\u03b1\u03c3\u03bc\u03ad\u03bd\u03bf \u0394\u03b5\u03ba\u03b1\u03b4\u03b9\u03ba\u03cc radix10Unsigned= \u0391\u03c0\u03c1\u03bf\u03c3\u03ae\u03bc\u03b1\u03c3\u03c4\u03bf \u0394\u03b5\u03ba\u03b1\u03b4\u03b9\u03ba\u03cc radix8= \u039f\u03ba\u03c4\u03b1\u03b4\u03b9\u03ba\u03cc radix16= \u0394\u03b5\u03ba\u03b1\u03b5\u03be\u03b1\u03b4\u03b9\u03ba\u03cc # # circuit/SplitterClass.java # # splitter component name splitterComponent= \u0394\u03b9\u03b1\u03c7\u03c9\u03c1\u03b9\u03c3\u03c4\u03ae\u03c2 # splitter end tool tips splitterCombinedTip= \u03a3\u03c5\u03bd\u03b4\u03c5\u03b1\u03c3\u03bc\u03ad\u03bd\u03bf \u03c4\u03ad\u03bb\u03bf\u03c2 \u03c4\u03bf\u03c5 \u03b4\u03b9\u03b1\u03c7\u03c9\u03c1\u03b9\u03c3\u03c4\u03ae splitterSplit0Tip= \u039a\u03b1\u03bd\u03ad\u03bd\u03b1 bit \u03b1\u03c0\u03cc \u03c4\u03bf \u03c3\u03c5\u03bd\u03b4\u03c5\u03b1\u03c3\u03bc\u03ad\u03bd\u03bf \u03c4\u03ad\u03bb\u03bf\u03c2 splitterSplit1Tip= Bit %s \u03b1\u03c0\u03cc \u03c4\u03bf \u03c3\u03c5\u03bd\u03b4\u03c5\u03b1\u03c3\u03bc\u03ad\u03bd\u03bf \u03c4\u03ad\u03bb\u03bf\u03c2 splitterSplitManyTip= Bits %s \u03b1\u03c0\u03cc \u03c4\u03bf \u03c3\u03c5\u03bd\u03b4\u03c5\u03b1\u03c3\u03bc\u03ad\u03bd\u03bf \u03c4\u03ad\u03bb\u03bf\u03c2 # splitter attributes splitterBitWidthAttr= \u0395\u03cd\u03c1\u03bf\u03c2 Bit \u0395\u03b9\u03c3\u03cc\u03b4\u03bf\u03c5 splitterFanOutAttr= \u0392\u03b1\u03b8\u03bc\u03cc\u03c2 \u039f\u03b4\u03ae\u03b3\u03b7\u03c3\u03b7\u03c2 splitterBitAttr= Bit %s splitterBitNone= \u039a\u03b1\u03bd\u03ad\u03bd\u03b1 # # circuit/WireClass.java # wireComponent= \u039a\u03b1\u03bb\u03ce\u03b4\u03b9\u03bf wireLengthAttr= \u039c\u03ae\u03ba\u03bf\u03c2 wireDirectionAttr= \u039a\u03b1\u03c4\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 wireDirectionHorzOption= \u039f\u03c1\u03b9\u03b6\u03cc\u03bd\u03c4\u03b9\u03b1 wireDirectionVertOption= \u039a\u03ac\u03b8\u03b5\u03c4\u03b1 # circuit/appear/AppearanceOrigin circuitAnchor= \u0386\u03b3\u03ba\u03c5\u03c1\u03b1 appearanceFacingAttr= \u03a0\u03c1\u03bf\u03c3\u03b1\u03bd\u03b1\u03c4\u03bf\u03bb\u03b9\u03c3\u03bc\u03cc\u03c2 \u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7\u03c2 # circuit/appear/AppearancePort circuitPort= \u0398\u03cd\u03c1\u03b1logisim-2.7.1/resources/logisim/el/analyze.properties0000644000175000017500000002356611530601316022730 0ustar vincentvincent# # gui/Analyzer.java # analyzerWindowTitle= \u03a3\u03c5\u03bd\u03b4\u03c5\u03b1\u03c3\u03c4\u03b9\u03ba\u03ae \u0391\u03bd\u03ac\u03bb\u03c5\u03c3\u03b7 inputsTab= \u0395\u03af\u03c3\u03bf\u03b4\u03bf\u03b9 outputsTab= \u0388\u03be\u03bf\u03b4\u03bf\u03b9 tableTab= \u03a0\u03af\u03bd\u03b1\u03ba\u03b1\u03c2 expressionTab= \u0388\u03ba\u03c6\u03c1\u03b1\u03c3\u03b7 minimizedTab= \u0395\u03bb\u03b1\u03c7\u03b9\u03c3\u03c4\u03bf\u03c0\u03bf\u03b9\u03b7\u03bc\u03ad\u03bd\u03bf inputsTabTip= \u03a0\u03c1\u03bf\u03b2\u03bf\u03bb\u03ae \u03ba\u03b1\u03b9 \u03b5\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03c4\u03bf\u03c5 \u03c3\u03c5\u03bd\u03cc\u03bb\u03bf\u03c5 \u03c4\u03c9\u03bd \u03bc\u03b5\u03c4\u03b1\u03b2\u03bb\u03b7\u03c4\u03ce\u03bd \u03b5\u03b9\u03c3\u03cc\u03b4\u03bf\u03c5. outputsTabTip= \u03a0\u03c1\u03bf\u03b2\u03bf\u03bb\u03ae \u03ba\u03b1\u03b9 \u03b5\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03c4\u03bf\u03c5 \u03c3\u03c5\u03bd\u03cc\u03bb\u03bf\u03c5 \u03c4\u03c9\u03bd \u03bc\u03b5\u03c4\u03b1\u03b2\u03bb\u03b7\u03c4\u03ce\u03bd \u03b5\u03be\u03cc\u03b4\u03bf\u03c5. tableTabTip= \u03a0\u03c1\u03bf\u03b2\u03bf\u03bb\u03ae \u03ba\u03b1\u03b9 \u03c4\u03c1\u03bf\u03c0\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7 \u03c4\u03bf\u03c5 \u03c0\u03af\u03bd\u03b1\u03ba\u03b1 \u03b1\u03bb\u03b7\u03b8\u03b5\u03af\u03b1\u03c2. expressionTabTip= \u03a0\u03c1\u03bf\u03b2\u03bf\u03bb\u03ae \u03ba\u03b1\u03b9 \u03c4\u03c1\u03bf\u03c0\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7 \u03c4\u03c9\u03bd \u03b5\u03ba\u03c6\u03c1\u03ac\u03c3\u03b5\u03c9\u03bd \u03c4\u03c9\u03bd \u03b5\u03be\u03cc\u03b4\u03c9\u03bd. minimizedTabTip= \u03a0\u03c1\u03bf\u03b2\u03bf\u03bb\u03ae \u03b1\u03c0\u03bb\u03bf\u03c0\u03bf\u03b9\u03b7\u03bc\u03ad\u03bd\u03c9\u03bd \u03b5\u03ba\u03c6\u03c1\u03ac\u03c3\u03b5\u03c9\u03bd \u03c0\u03bf\u03c5 \u03b1\u03bd\u03c4\u03b9\u03c3\u03c4\u03bf\u03b9\u03c7\u03bf\u03cd\u03bd \u03c3\u03c4\u03bf \u03c0\u03af\u03bd\u03b1\u03ba\u03b1 \u03b1\u03bb\u03b7\u03b8\u03b5\u03af\u03b1\u03c2. # # gui/BuildCircuitButton.java # buildCircuitButton= \u0394\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u039a\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2 buildProjectLabel= \u0388\u03c1\u03b3\u03bf \u03a0\u03c1\u03bf\u03bf\u03c1\u03b9\u03c3\u03bc\u03bf\u03cd: buildNameLabel= \u038c\u03bd\u03bf\u03bc\u03b1 \u039a\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2: buildTwoInputsLabel= \u03a7\u03c1\u03ae\u03c3\u03b7 \u03bc\u03cc\u03bd\u03bf \u0394\u03cd\u03bf-\u0395\u03b9\u03c3\u03cc\u03b4\u03c9\u03bd \u03a0\u03c5\u03bb\u03ce\u03bd buildNandsLabel= \u03a7\u03c1\u03ae\u03c3\u03b7 \u03bc\u03cc\u03bd\u03bf NAND \u03a0\u03c5\u03bb\u03ce\u03bd buildDialogTitle= \u0394\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u039a\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2 buildDialogErrorTitle= \u0394\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03c5\u03bd\u03b1\u03c4\u03ae \u03b7 \u03b4\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u039a\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2 buildNeedProjectError= \u03a0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03b5\u03c0\u03b9\u03bb\u03ad\u03be\u03b5\u03c4\u03b5 \u03ad\u03bd\u03b1 \u03ad\u03c1\u03b3\u03bf \u03c0\u03c1\u03bf\u03bf\u03c1\u03b9\u03c3\u03bc\u03bf\u03cd. buildNeedCircuitError= \u03a0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03bf\u03c1\u03af\u03c3\u03b5\u03c4\u03b5 \u03ad\u03bd\u03b1 \u03cc\u03bd\u03bf\u03bc\u03b1 \u03ba\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2. buildConfirmReplaceMessage= \u0395\u03af\u03c3\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03bf\u03b9 \u03cc\u03c4\u03b9 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03b1\u03bd\u03c4\u03b9\u03ba\u03b1\u03c4\u03b1\u03c3\u03c4\u03ae\u03c3\u03b5\u03c4\u03b5 \u03c4\u03bf \u03ba\u03cd\u03ba\u03bb\u03c9\u03bc\u03b1 %s? buildConfirmReplaceTitle= \u0395\u03c0\u03b9\u03b2\u03b5\u03b2\u03b1\u03af\u03c9\u03c3\u03b7 \u0391\u03bd\u03c4\u03b9\u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7\u03c2 replaceCircuitAction= \u0391\u03bd\u03c4\u03b9\u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7 \u039a\u03c5\u03ba\u03bb\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2 # # gui/ExpressionEditorPanel.java # exprClearButton= \u039a\u03b1\u03b8\u03b1\u03c1\u03b9\u03c3\u03bc\u03cc\u03c2 exprRevertButton= \u0395\u03c0\u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac exprEnterButton= \u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae # # gui/ExpressionPanel.java # expressionEmpty= (\u03ba\u03b5\u03bd\u03cc) # # gui/KarnaughMapPanel.java # karnaughNoOutputError= \u039a\u03b1\u03bc\u03af\u03b1 \u03b5\u03c0\u03b9\u03bb\u03b5\u03b3\u03bc\u03ad\u03bd\u03b7 \u03ad\u03be\u03bf\u03b4\u03bf. karnaughTooManyInputsError= \u03a0\u03ac\u03c1\u03b1 \u03c0\u03bf\u03bb\u03bb\u03ad\u03c2 \u03b5\u03af\u03c3\u03bf\u03b4\u03bf\u03b9 \u03b3\u03b9\u03b1 \u03c4\u03bf\u03bd \u03c0\u03af\u03bd\u03b1\u03ba\u03b1. # # gui/MinimizedTabPanel.java # minimizedFormat= \u039c\u03bf\u03c1\u03c6\u03ae: minimizedSumOfProducts= \u0386\u03b8\u03c1\u03bf\u03b9\u03c3\u03bc\u03b1 \u03b3\u03b9\u03bd\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd minimizedProductOfSums= \u0393\u03b9\u03bd\u03cc\u03bc\u03b5\u03bd\u03bf \u03b1\u03b8\u03c1\u03bf\u03b9\u03c3\u03bc\u03ac\u03c4\u03c9\u03bd minimizedSetButton= \u039f\u03c1\u03b9\u03c3\u03bc\u03cc\u03c2 \u03a9\u03c2 \u0388\u03ba\u03c6\u03c1\u03b1\u03c3\u03b7 # # gui/OutputSelector.java # outputSelectLabel= \u0388\u03be\u03bf\u03b4\u03bf\u03c2: # # gui/SimpleTruthTablePanel.java # tableEmptyMessage= (\u03ba\u03b5\u03bd\u03cc\u03c2 \u03c0\u03af\u03bd\u03b1\u03ba\u03b1\u03c2) tableNullHeader= (\u03ba\u03b1\u03bd\u03ad\u03bd\u03b1) # # gui/TableTabClip.java # clipPasteErrorTitle= \u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 \u0395\u03c0\u03b9\u03ba\u03cc\u03bb\u03bb\u03b7\u03c3\u03b7\u03c2 clipPasteSupportedError= \u03a4\u03b1 \u03c0\u03b5\u03c1\u03b9\u03b5\u03c7\u03cc\u03bc\u03b5\u03bd\u03b1 \u03c4\u03bf\u03c5 \u03c0\u03c1\u03bf\u03c7\u03b5\u03af\u03c1\u03bf\u03c5 \u03b4\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03bf\u03cd\u03bd \u03bd\u03b1 \u03b5\u03c0\u03b9\u03ba\u03bf\u03bb\u03bb\u03b7\u03b8\u03bf\u03cd\u03bd \u03c3\u03c4\u03bf\u03bd \u03c3\u03c5\u03bd\u03c4\u03ac\u03ba\u03c4\u03b7. clipPasteEndError= \u03a4\u03bf \u03c0\u03c1\u03cc\u03c7\u03b5\u03b9\u03c1\u03bf \u03b5\u03ba\u03c4\u03b5\u03af\u03bd\u03b5\u03c4\u03b1\u03b9 \u03c0\u03ad\u03c1\u03b1 \u03b1\u03c0\u03cc \u03c4\u03bf \u03c4\u03ad\u03bb\u03bf\u03c2 \u03c4\u03bf\u03c5 \u03c0\u03af\u03bd\u03b1\u03ba\u03b1. clipPasteSizeError= \u0397 \u03c0\u03b5\u03c1\u03b9\u03bf\u03c7\u03ae \u03b5\u03c0\u03b9\u03ba\u03cc\u03bb\u03bb\u03b7\u03c3\u03b7\u03c2 \u03c0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03ad\u03c7\u03b5\u03b9 \u03c4\u03bf \u03af\u03b4\u03b9\u03bf \u03bc\u03ad\u03b3\u03b5\u03b8\u03bf\u03c2 \u03bc\u03b5 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf\u03c5 \u03c0\u03c1\u03bf\u03c7\u03b5\u03af\u03c1\u03bf\u03c5. # # gui/VariableListPanel.java # variableRemoveButton= \u039a\u03b1\u03c4\u03ac\u03c1\u03b3\u03b7\u03c3\u03b7 variableMoveUpButton= \u039c\u03b5\u03c4\u03b1\u03ba\u03af\u03bd\u03b7\u03c3\u03b7 \u03a0\u03ac\u03bd\u03c9 variableMoveDownButton= \u039c\u03b5\u03c4\u03b1\u03ba\u03af\u03bd\u03b7\u03c3\u03b7 \u039a\u03ac\u03c4\u03c9 variableAddButton= \u03a0\u03c1\u03bf\u03c3\u03b8\u03ae\u03ba\u03b7 variableRenameButton= \u039c\u03b5\u03c4\u03bf\u03bd\u03bf\u03bc\u03b1\u03c3\u03af\u03b1 variableStartError= \u03a4\u03bf \u03cc\u03bd\u03bf\u03bc\u03b1 \u03c0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03be\u03b5\u03ba\u03b9\u03bd\u03ac\u03b5\u03b9 \u03bc\u03b5 \u03ad\u03bd\u03b1 \u03b3\u03c1\u03ac\u03bc\u03bc\u03b1. variablePartError= \u03a4\u03bf \u03cc\u03bd\u03bf\u03bc\u03b1 \u03b4\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03c0\u03b5\u03c1\u03b9\u03ad\u03c7\u03b5\u03b9 '%s'. variableDuplicateError= \u03a4\u03bf \u03cc\u03bd\u03bf\u03bc\u03b1 \u03b4\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03b5\u03af \u03b1\u03bd\u03c4\u03af\u03b3\u03c1\u03b1\u03c6\u03bf \u03c5\u03c6\u03b9\u03c3\u03c4\u03ac\u03bc\u03b5\u03bd\u03b7\u03c2 \u03bc\u03b5\u03c4\u03b1\u03b2\u03bb\u03b7\u03c4\u03ae\u03c2. variableMaximumError= (\u03a6\u03c4\u03ac\u03c3\u03b1\u03c4\u03b5 \u03c4\u03bf \u03bc\u03ad\u03b3\u03b9\u03c3\u03c4\u03bf \u03bc\u03ad\u03b3\u03b5\u03b8\u03bf\u03c2 %s.) # # model/Entry.java # busError= \u0391\u03bb\u03bb\u03b7\u03bb\u03bf\u03c3\u03c5\u03b3\u03ba\u03c1\u03bf\u03c5\u03cc\u03bc\u03b5\u03bd\u03b5\u03c2 \u03c4\u03b9\u03bc\u03ad\u03c2 \u03b5\u03be\u03cc\u03b4\u03bf\u03c5 \u03c3\u03c4\u03bf \u03ba\u03cd\u03ba\u03bb\u03c9\u03bc\u03b1. oscillateError= \u03a4\u03bf \u03ba\u03cd\u03ba\u03bb\u03c9\u03bc\u03b1 \u03c4\u03b1\u03bb\u03b1\u03bd\u03c4\u03ce\u03bd\u03b5\u03c4\u03b1\u03b9. # # model/Parser.java # implicitAndOperator= (\u03a5\u03c0\u03bf\u03bd\u03bf\u03b5\u03af\u03c4\u03b1\u03b9 AND) invalidCharacterError= \u039c\u03b7 \u03b1\u03bd\u03b1\u03b3\u03bd\u03c9\u03c1\u03af\u03c3\u03b9\u03bc\u03bf\u03b9 \u03c7\u03b1\u03c1\u03b1\u03ba\u03c4\u03ae\u03c1\u03b5\u03c2: %s missingLeftOperandError= \u03a3\u03c4\u03bf \u03c7\u03b5\u03b9\u03c1\u03b9\u03c3\u03c4\u03ae\u03c1\u03b9\u03bf %s \u03bb\u03b5\u03af\u03c0\u03b5\u03b9 \u03bf \u03b1\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03cc\u03c2 \u03c4\u03b5\u03bb\u03b5\u03c3\u03c4\u03ae\u03c2. missingRightOperandError= \u03a3\u03c4\u03bf \u03c7\u03b5\u03b9\u03c1\u03b9\u03c3\u03c4\u03ae\u03c1\u03b9\u03bf %s \u03bb\u03b5\u03af\u03c0\u03b5\u03b9 \u03bf \u03b4\u03b5\u03be\u03b9\u03ac \u03c4\u03b5\u03bb\u03b5\u03c3\u03c4\u03ae\u03c2. lparenMissingError= \u0394\u03b5\u03bd \u03c4\u03b1\u03b9\u03c1\u03af\u03ac\u03b6\u03b5\u03b9 \u03b1\u03bd\u03bf\u03b9\u03ba\u03c4\u03ae \u03c0\u03b1\u03c1\u03ad\u03bd\u03b8\u03b5\u03c3\u03b7. rparenMissingError= \u0394\u03b5\u03bd \u03c4\u03b1\u03b9\u03c1\u03b9\u03ac\u03b6\u03b5\u03b9 \u03ba\u03bb\u03b5\u03b9\u03c3\u03c4\u03ae \u03c0\u03b1\u03c1\u03ad\u03bd\u03b8\u03b5\u03c3\u03b7. badVariableName= %s \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03bc\u03b5\u03c4\u03b1\u03b2\u03bb\u03b7\u03c4\u03ae \u03b5\u03b9\u03c3\u03cc\u03b4\u03bf\u03c5. logisim-2.7.1/resources/logisim/default.templ0000644000175000017500000000224711524651502021234 0ustar vincentvincent logisim-2.7.1/resources/logisim/de/0000755000175000017500000000000011455750340017133 5ustar vincentvincentlogisim-2.7.1/resources/logisim/de/util.properties0000644000175000017500000000175511452221646022235 0ustar vincentvincent# # util/FontUtil.java # fontPlainStyle= Normal fontBoldStyle= Fett fontItalicStyle= Kursiv fontBoldItalicStyle= Fett kursiv # # util/InputEventUtil.java # metaMod= Meta altMod= Alt ctrlMod= Strg shiftMod= Umschalt button1Mod= Taste1 button2Mod= Taste2 button3Mod= Taste3 # # util/JDialogOk.java # dlogOkButton= OK dlogCancelButton= Abbrechen # # util/LocaleManager.java # # If the user selects to "replace accented characters" in the International # dialog, the program will replace accented characters based on # the slash-delimited character-string pairs in accentReplacements. # For example, with German, accentReplacements might be # "\u00f6 oe/\u00d6 Oe/\u00fc ue/\u00dc ue/\u00df ss" so that umlauted o's and u's are # replaced, as would be essets. accentReplacements= # # util/GifEncoder.java # grabberError= Grabber returned false: manyColorError= Zu viele Farben. # # util/WindowMenu.java # windowMenu= Fenster windowMinimizeItem= Minimieren windowZoomItem= Maximieren windowZoomItemMac= Zoom logisim-2.7.1/resources/logisim/de/tools.properties0000644000175000017500000000330311453467124022413 0ustar vincentvincent# # tools/AddTool.java # addToolText= %s hinzuf\u00fcgen negativeCoordError= Bauteil darf keine negativen Koordinaten haben. cannotModifyError= Schaltung kann nicht ver\u00e4ndert werden. circularError= Zirkelbezug kann nicht hergestellt werden. exclusiveError= Konflikt mit existierendem Bauteil. addComponentAction= %s hinzuf\u00fcgen # # tools/MenuTool.java # menuTool= Men\u00fcwerkzeug menuToolDesc= Bauteilemen\u00fcs anzeigen compDeleteItem= L\u00f6schen compShowAttrItem= Attribute anzeigen selDeleteItem= Auswahl l\u00f6schen selCutItem= Auswahl ausschneiden selCopyItem= Auswahl kopieren removeComponentAction= %s entfernen # # tools/PokeTool.java # pokeTool= Schaltwerkzeug pokeToolDesc= Zum \u00c4ndern von Werten innerhalb der Schaltung # # tools/SelectTool.java # selectTool= Auswahlwerkzeug selectToolDesc= Zur Bearbeitung der Bauteile moveWorkingMsg= Berechne Verbindungen... # # tools/SelectionAttributeChange.java # selectionAttributeAction= Attribut der Auswahl \u00e4ndern # # tools/SelectionAttributeChange.java # selectionRefaceAction= Ausrichtung der Auswahl \u00e4ndern # # tools/key/KeyConfigurationAction # changeComponentAttributesAction= Bauteileattribute \u00e4ndern # # tools/TextTool.java # textTool= Textwerkzeug textToolDesc= Zum Bearbeiten von Text in der Schaltung # # tools/ToolActions.java # changeToolAttrAction= Werkzeugattribute \u00e4ndern # # tools/EditTool.java # editTool= Bearbeitungswerkzeug editToolDesc= Zum Bearbeiten von Auswahlen und Zeichnen von Leitungen # # tools/WiringTool.java # wiringTool= Verbindungswerkzeug wiringToolDesc= Zum Zeichnen von Leitungen addWireAction= Leitung hinzuf\u00fcgen addWiresAction= Leitungen hinzuf\u00fcgen shortenWireAction= Leitung k\u00fcrzen logisim-2.7.1/resources/logisim/de/std.properties0000644000175000017500000003547411455750124022060 0ustar vincentvincent# # std/Builtin.java # builtinLibrary= Eingebaut # instance/StdAttr.java stdFacingAttr= Ausrichtung stdDataWidthAttr= Datenbits stdTriggerAttr= Trigger stdTriggerRising= Steigende Flanke stdTriggerFalling= Fallende Flanke stdTriggerHigh= H-Niveau stdTriggerLow= L-Niveau stdLabelAttr= Beschriftung stdLabelFontAttr= Zeichensatz der Beschriftung # instance/InstanceTextField.java changeLabelAction= Beschriftung \u00e4ndern # # std/base/Base.java # baseLibrary= Basis # std/base/BitExtender.java extenderComponent= Bit-Erweiterung extenderInAttr= Bitbreite extenderOutAttr= Bitbreite Aus extenderTypeAttr= Art der Erweiterung extenderOneType= Eins extenderZeroType= Null extenderSignType= Vorzeichen extenderInputType= Eingang extenderMainLabel= erweitern extenderOneLabel= 1 extenderZeroLabel= 0 extenderSignLabel= Vorzeichen extenderInputLabel= Eingang # std/base/Clock clockComponent= Takt clockHighAttr= Dauer H-Signal clockLowAttr= Dauer L-Signal clockDurationValue= %s Takte clockDurationOneValue= 1 Takt durationSmallMessage= Wert mu\u00df mindestens %s sein. durationLargeMessage= Wert darf h\u00f6chstens %s sein. freqInvalidMessage= Wert ist nicht ganzzahlig # std/base/Pin pinComponent= Pin pinInputName= Eingang pinOutputName= Ausgang pinThreeStateAttr= Threestate? pinOutputAttr= Ausgang? pinPullAttr= Pull-Verhalten pinPullNoneOption= Unver\u00e4ndert pinPullUpOption= Pull-Up pinPullDownOption= Pull-Down pinLabelLocAttr= Position der Beschriftung pinInputToolTip= Eingangspin hinzuf\u00fcgen pinOutputToolTip= Ausgangspin hinzuf\u00fcgen pinFrozenTitle= Der Pin ist in der h\u00f6heren Ebene zugeordnet. pinFrozenQuestion= Der Pin ist mit dem Zustand der h\u00f6heren Ebene verkn\u00fcpft. Einen neuen Schaltungszustand erstellen? # std/base/Probe probeComponent= Testpunkt # std/base/PullResistor pullComponent= Pull-Widerstand pullTypeAttr= Pull-Richtung pullZeroType= Null pullOneType= Eins pullErrorType= Fehler # std/base/Text.java textComponent= Beschriftung textTextAttr= Text textFontAttr= Zeichensatz textHorzAlignAttr= Horizontale Ausrichtung textHorzAlignLeftOpt= Links textHorzAlignRightOpt= Rechts textHorzAlignCenterOpt= Zentriert textVertAlignAttr= Vertikale Ausrichtung textVertAlignTopOpt= Oben textVertAlignBaseOpt= Basis textVertAlignBottomOpt= Unten textVertAlignCenterOpt= Zentriert # std/base/Tunnel.java tunnelComponent= Tunnel # # std/Gates.java # gatesLibrary= Gatter gateSizeAttr= Gattergr\u00f6\u00dfe gateSizeNarrowOpt= Schmal gateSizeNormalOpt= Mittel gateSizeWideOpt= Breit gateNegateAttr= Negiere %s gateInputsAttr= Anzahl der Eing\u00e4nge xorBehaviorAttr= Verhalten bei mehreren Eing\u00e4ngen xorBehaviorOne= Falls genau ein Eingang gesetzt ist xorBehaviorOdd= Falls eine ungerade Anzahl gesetzt ist # std/Constant.java constantComponent= Konstante constantValueAttr= Wert # std/NotGate.java notGateComponent= Inverter # std/Buffer.java bufferComponent= Puffer # std/AndGate.java andGateComponent= AND Gatter # std/NandGate.java nandGateComponent= NAND Gatter # std/NorGate.java norGateComponent= NOR Gatter # std/OrGate.java orGateComponent= OR Gatter # std/XorGate.java xorGateComponent= XOR Gatter # std/XnorGate.java xnorGateComponent= XNOR Gatter # std/OddParityGate.java oddParityComponent= Ungerade Parit\u00e4t # std/EvenParityGate.java evenParityComponent= Gerade Parit\u00e4t # std/ControlledBuffer.java controlledBufferComponent= Tristate-Puffer controlledInverterComponent= Tristate-Inverter controlledControlOption= Position der Steuerleitung controlledLeftHanded= linke Seite controlledRightHanded= rechte Seite # # std/Memory.java # memoryLibrary= Speicher memEnableLabel= en # AbstractFlipFlop.java flipFlopClockTip= Takt: Zustandsaktualisierung bei Triggersignal flipFlopQTip= Aktueller Flip-Flop-Zustand flipFlopNotQTip= Aktuellen Flip-Flop-Zustand invertieren flipFlopResetTip= L\u00f6schen: wenn 1, gehe asynchron zu Zustand 0 flipFlopPresetTip= Setzen: wenn 1, gehe asynchron zu Zustand 1 flipFlopEnableTip= Freigabe: wenn 0 sind Taktsignale unwirksam # std/Counter.java counterComponent= Z\u00e4hler counterMaxAttr= H\u00f6chstwert counterGoalAttr= Bei \u00dcberlauf: counterGoalWrap= Starte neu counterGoalStay= Halte an counterGoalContinue= Z\u00e4hle weiter counterGoalLoad= Lade den n\u00e4chsten Wert counterQTip= Ausgang: aktueller Wert des Z\u00e4hlers counterClockTip= Takt: Wert kann bei Triggersignal aktualisiert werden counterDataTip= Daten: in den Z\u00e4hler zu ladender Wert counterLoadTip= Laden: wenn 1, lade den Wert vom Daten-Eingang (falls Takt = 0) oder z\u00e4hle abw\u00e4rts counterEnableTip= Takt: wenn 1, z\u00e4hle aufw\u00e4rts (oder abw\u00e4rts falls Laden = 1) counterResetTip= L\u00f6schen: wenn 1 wird der Z\u00e4hler asynchron auf 0 gesetzt counterCarryTip= \u00dcbertrag: ist 1, wenn der Z\u00e4hler den H\u00f6chstwert erreicht (Minimalwert beim Abw\u00e4rtsz\u00e4hlen) counterEnableLabel= ct counterLabel= ctr # std/DFlipFlop.java dFlipFlopComponent= D Flip-Flop # std/TFlipFlop.java tFlipFlopComponent= T Flip-Flop # std/JKFlipFlop.java jkFlipFlopComponent= J-K Flip-Flop # std/SRFlipFlop.java srFlipFlopComponent= S-R Flip-Flop # std/Random.java randomSeedAttr= Startwert randomComponent= Zufallsgenerator randomQTip= Ausgang: aktuelle Zahl in der Zahlenfolge randomClockTip= Takt: Wert kann bei Triggersignal aktualisiert werden randomNextTip= Freigabe: wechsle zum n\u00e4chsten Schritt der Sequenz bei Triggersignal randomResetTip= L\u00f6schen: wenn 1 wird asynchron auf den urspr\u00fcnglichen Startwert zur\u00fcckgesetzt # std/Register.java registerComponent= Register registerQTip= Ausgang: aktueller Wert des Registers registerDTip= Daten: beim Triggersignal zu speichernder Wert registerClkTip= Takt: Wert wird bei Triggersignal aktualisiert registerClrTip= L\u00f6schen: wenn 1 wird der Wert asynchron auf 0 gesetzt registerEnableTip= Freigabe: wenn 0 sind Taktsignale unwirksam registerLabel= reg registerWidthLabel= (%sb) # std/RamFactory.java ramComponent= RAM # std/RomFactory.java romComponent= ROM romContentsAttr= Inhalt romContentsValue= (Klicken zum Bearbeiten) romChangeAction= ROM-Inhalt bearbeiten # std/Ram.java ramAddrWidthAttr= Bitbreite der Adresse ramDataWidthAttr= Bitbreite der Daten ramDataLabel= D ramAddrLabel= A ramWELabel= str ramCSLabel= sel ramOELabel= ld ramClrLabel= clr ramGigabyteLabel= %sGB RAM ramMegabyteLabel= %sMB RAM ramKilobyteLabel= %sKB RAM ramByteLabel= %sB RAM romGigabyteLabel= %sGB ROM romMegabyteLabel= %sMB ROM romKilobyteLabel= %sKB ROM romByteLabel= %sB ROM memDataTip= Daten: von der Adresse geladene Daten memAddrTip= Adresse: Zugriffsposition im Speicher memCSTip= Chip-Auswahl: 0 deaktiviert das Bauteil ramClkTip= Takt: Speicherinhalt wird beim \u00dcbergang von 0 auf 1 aktualisiert ramOETip= Laden: wenn 1 wird Speicherinhalt auf Ausgang \u00fcbertragen ramWETip= Speichern: wenn 1 wird Eingang in Speicher \u00fcbertragen ramClrTip= L\u00f6schen: wenn 1 wird Speicherinhalt asznchron auf 0 gesetzt ramBusTip= Daten: geladener oder zu speichernder Wert ramInTip= Eingang: an der Adresse zu speichernder Wert ramBusAttr= Datenschnittstelle ramBusSynchCombined= Ein synchroner Lade/Speicher-Port ramBusAsynchCombined= Ein asynchroner Lade/Speicher-Port ramBusSeparate= Separate Ports zum Laden und Speichern ramEditMenuItem= Inhalt bearbeiten ... ramClearMenuItem= Inhalt l\u00f6schen ramLoadMenuItem= Speicherabbild laden... ramSaveMenuItem= Speicherabbild speichern... ramConfirmClearTitle= L\u00f6schen best\u00e4tigen ramConfirmClearMsg= Sind SIe sicher, da\u00df der Speicher auf Null gesetzt werden soll? ramLoadDialogTitle= Lade RAM-Abbild ramLoadErrorTitle= Fehler beim Laden ramSaveDialogTitle= Speichere RAM-Abbild ramSaveErrorTitle= Fehler beim Speichern # std/memory/ShiftRegister.java shiftRegisterComponent= Schieberegister shiftRegisterLabel1= shift reg shiftRegisterLabel2= %sx%s shiftRegLengthAttr= Anzahl der Stufen shiftRegParallelAttr= Paralleles Laden shiftRegShiftTip= Freigabe: wenn 0 ist das Schieben gesperrt shiftRegClockTip= Takt: Werte k\u00f6nnen bei Triggersignal aktualisiert werden shiftRegClearTip= L\u00f6schen: wenn 1 werden alle Werte asynchron auf 0 gesetzt shiftRegInTip= Eingang: Wert, der in die erste Stufe geschoben werden soll shiftRegOutTip= Ausgang: der Inhalt der letzten Stufe shiftRegLoadTip= Laden: wenn 1 (mit Freigabe = 0) werden alle Stufen von den Eing\u00e4ngen geladen # # std/Plexers.java # plexerLibrary= Auswahlschaltungen plexerSelectBitsAttr= Auswahlleitungen plexerThreeStateAttr= Threestate? # std/Multiplexer.java multiplexerComponent= Multiplexer multiplexerSelectTip= Auswahl: gibt an, welcher Eingang an den Ausgang durchgeschaltet wird multiplexerInTip= Eingang %s multiplexerOutTip= Ausgang # std/Demultiplexer.java demultiplexerComponent= Demultiplexer demultiplexerSelectTip= Auswahl: gibt an, an welchen Ausgang der Eingang durchgeschaltet wird demultiplexerInTip= Eingang demultiplexerOutTip= Ausgang %s # std/Decoder.java decoderComponent= Dekoder decoderSelectTip= Auswahl: gibt an, welcher Ausgang auf 1 gesetzt wird decoderOutTip= Ausgang %s # std/plexers/PriorityEncoder.java priorityEncoderComponent= Priorit\u00e4tsenkoder priorityEncoderInTip= Eingang %s priorityEncoderOutTip= Ausgang: Adresse des h\u00f6chst-indizierten, auf 1 gesetzten Eingangs priorityEncoderEnableInTip= Freigabeeingang: 0 sperrt das Bauteil priorityEncoderEnableOutTip= Freigabeausgang: 1 wenn freigegeben und kein Eingang auf 1 gesetzt priorityEncoderGroupSignalTip= Gruppenauswahl: 1 wenn einer der Eing\u00e4nge auf 1 gesetzt # std/BitSelector.java bitSelectorComponent= Bit-W\u00e4hler bitSelectorGroupAttr= Ausgangsbits bitSelectorOutputTip= Ausgang: Wert der ausgew\u00e4hlten Gruppe von Bits vom Eingang bitSelectorDataTip= Eingang bitSelectorSelectTip= Auswahl: gibt an, welche Gruppe von Bits ausgew\u00e4hlt werden soll # # arith/Arithmetic.java # arithmeticLibrary= Arithmetik # arith/Adder.java adderComponent= Addierer adderInputTip= Eingang: einer der Summanden adderOutputTip= Ausgang: die Summe der Eing\u00e4nge (plus \u00dcbertragseingang) adderCarryInTip= \u00dcbertragseingang: wenn 1 wird eine weitere 1 zur Summe addiert adderCarryOutTip= \u00dcbertragsausgang: ist 1, wenn die Summe die verf\u00fcgbare Bitbreite \u00fcbersteigt # arith/Subtractor.java subtractorComponent= Subtrahierer subtractorMinuendTip= Minuend: die Zahl, von der abzuziehen ist subtractorSubtrahendTip= Subtrahend: die Zahl, die abgezogen wird subtractorOutputTip= Ausgang: die Differenz zwischen Minuend und Subtrahend subtractorBorrowInTip= Leiheingang: wenn 1 wird eine weitere 1 vom Ergebnis abgezogen subtractorBorrowOutTip= Leihausgang: ist 1, wenn die Differenz ngativ ist # arith/Multiplier.java multiplierComponent= Multiplizierer multiplierInputTip= Eingang: eine der zu multiplizierenden Zahlen multiplierOutputTip= Ausgang: das Produkt der Eing\u00e4nge plus \u00dcbertragseingang multiplierCarryInTip= \u00dcbertragseingang: zum Ergebnis zu addierender Wert multiplierCarryOutTip= \u00dcbertragsausgang: die h\u00f6herwertigen Bits des Produkts # arith/Divider.java dividerComponent= Teiler dividerUpperInput= upper dividerRemainderOutput= rem dividerDividendLowerTip= Dividend (unten): die untere H\u00e4lfte der zu teilenden Zahl dividerDividendUpperTip= Dividend (oben): die obere H\u00e4lfte der zu teilenden Zahl dividerDivisorTip= Divisor: die Zahl, durch die zu teilen ist dividerOutputTip= Ausgang: das Ergebnis der Division von Dividend durch Divisor dividerRemainderTip= Rest: der Rest der Division (Dividend - Ausgang * Divisor) # arith/Negator.java negatorComponent= Negator negatorInputTip= Eingang: die zu negierende Zahl negatorOutputTip= Ausgang: das Zweierkomplement des Eingangs # arith/Comparator.java comparatorComponent= Komparator comparatorType= Zahlentyp unsignedOption= ohne Vorzeichen twosComplementOption= Zweierkomplement comparatorInputATip= A: die Zahl vor dem Vergleichsoperator comparatorInputBTip= B: die Zahl nach dem Vergleichsoperator comparatorLessTip= Kleiner: ist 1, wenn A kleiner als B ist comparatorEqualTip= Gleich: ist 1, wenn A gleich B ist comparatorGreaterTip= Gr\u00f6\u00dfer: ist 1, wenn A gr\u00f6\u00dfer als B ist # arith/Shifter.java shifterComponent= Bitschieber shifterShiftAttr= Schiebertyp shiftLogicalLeft= Logisch nach links shiftLogicalRight= Logisch nach rechts shiftArithmeticRight= Arithmetisch nach rechts shiftRollLeft= Rotieren nach links shiftRollRight= Rotieren nach rechts shifterDistanceTip= Distanz: wie weit der Eingang zu schieben ist shifterInputTip= Eingang: die zu schiebenden Bits shifterOutputTip= Ausgang: Ergebnis der Schiebung des Eingangs # arith/BitAdder.java bitAdderComponent= Bit-Z\u00e4hler bitAdderInputTip= Eingang: die zu z\u00e4hlenden Bits bitAdderOutputManyTip= Ausgang: die Anzahl der 1-Bits an den Eing\u00e4ngen bitAdderOutputOneTip= Ausgang: die Anzahl der 1-Bits am Eingang # arith/BitFinder.java bitFinderComponent= Bit-Finder bitFinderFindLabel= find bitFinderHighLabel= high bitFinderLowLabel= low bitFinderHighOption= Oberste %s bitFinderLowOption= Unterste %s bitFinderTypeAttr= Type bitFinderIndexHighTip= Index: Index der h\u00f6chstwertigsten %s des Eingangs bitFinderIndexLowTip= Index: Index der niederwertigsten %s des Eingangs bitFinderPresentTip= Gefunden: ist 1, wenn der Eingang eine %s enth\u00e4lt bitFinderInputTip= Eingang: die zu durchsuchenden Bits # # io # # io/Io.java ioLibrary= Eingabe/Ausgabe ioLabelCenter= Zentriert ioBitWidthAttr= Bitbreite ioColorAttr= Farbe ioLabelLocAttr= Position der Beschriftung ioLabelColorAttr= Farbe der Beschriftung ioActiveAttr= Eingeschaltet bei H-Signal? # io/Button.java buttonComponent= Taster # io/Joystick.java joystickComponent= Joystick # io/Keyboard.java keyboardComponent= Tastatur keybDesc= Tastatur (Pufferkap. %s) keybBufferLengthAttr= Pufferl\u00e4nge keybClearTip= L\u00f6schen: wenn 1 wird der Puffer gel\u00f6scht keybClockTip= Takt: Triggersignal entfernt das vorderste Zeichen des Puffers keybEnableTip= Lesefreigabe: 0 sperrt das Taktsignal keybAvailTip= Verf\u00fcgbar: 1 wenn der Puffer Zeichen enth\u00e4lt keybOutputTip= Daten: ASCII-Wert des vordersten Zeichens im Puffer # io/Led.java ledComponent= LED # io/SevenSegment.java sevenSegmentComponent= 7-Segmentanzeige # io/HexDigit.java hexDigitComponent= Hexadezimale Anzeige # io/DotMatrix.java dotMatrixComponent= LED-Matrix ioMatrixInput= Eingabeformat ioMatrixRows= Matrixzeilen ioMatrixCols= Matrixspalten ioOnColor= Farbe AN ioOffColor= Farbe AUS ioBackgroundColor= Hintergrund ioMatrixPersistenceAttr= Nachleuchtdauer ioMatrixShape= Punktform ioInputColumn= Spalten ioInputRow= Zeilen ioInputSelect= Zeilen / Spalten ausw\u00e4hlen ioShapeCircle= Rund ioShapeSquare= Quadratisch # io/Tty.java ttyComponent= Terminal ttyDesc= Terminal (%s Zeilen, %s Spalten) ttyDescShort= Terminal ttyRowsAttr= Zeilen ttyColsAttr= Spalten ttyClearTip= L\u00f6schen: 1 l\u00f6scht den Bildschirm ttyClockTip= Takt: Triggersignal \u00fcbernimmt das Zeichen vom Eingang ttyEnableTip= Schreibfreigabe: 0 sperrt das Taktsignal ttyInputTip= Daten: ASCII-Wert des n\u00e4chsten zu schreibenden Zeichens logisim-2.7.1/resources/logisim/de/start.properties0000644000175000017500000000664411455750124022420 0ustar vincentvincent# # Startup.java # argTwoSubstitutionError= Die Option "-sub" mu\u00df von zwei Parametern gefolgt werden. argDuplicateSubstitutionError= Dieselbe Datei kann nicht mehrfach ersetzt werden. ttyNeedsFileError= Die Option "-tty" erfordert die Angabe eines Dateinamens. argTtyOption= -tty Format ohne grafische Benutzeroberfl\u00e4che starten argSubOption= -sub Datei1 Datei2 lade die Datei und ersetze die Bibliothek aus Datei1 durch Datei2 argLoadOption= -load Datei lade eine Datei mit Speicherabbild ins RAM (nur zusammen mit -tty) loadNeedsFileError= Die Option "-load" erfordert die Angabe eines Dateinamens. loadNeedsTtyError= Die Option "-load" funktioniert nur zusammen mit "-tty". loadMultipleError= Die Option "-load" kann nur einmal angegeben werden. ttyFormatError= Die Option "-tty" erfordert mindestens eine der folgenden Optionen: halt, speed, stats, table, tty argOneTemplateError= Nur eine Vorlage ist erlaubt. argUsage= Anwendung: java %s [Optionen] [Dateinamen] argOptionHeader= Optionen: argEmptyOption= -empty benutze eine leere Vorlage argPlainOption= -plain benutze die Standardvorlage von Logisim argTemplateOption= -template Datei benutze Datei als Vorlage argGatesOption= -gates shaped|rectangular benutze den angegebenen Stil f\u00fcr die Gatter argLocaleOption= -locale str benutze das in str angegebene Gebietsschema argAccentsOption= -accents yes|no benutze Akzentzeichen oder ASCII-\u00c4quivalente argNoSplashOption= -nosplash versteckt die Startmeldung argVersionOption= -version zeige die Versionsnummer und beende das Programm argHelpOption= -help zeige diese Hilfe und beende das Programm argClearOption= -clearprops l\u00f6scht Voreinstellungen beim Programmstart argGatesOptionError= Das Argument f\u00fcr die Option -gates mu\u00df "shaped" oder "rectangular" sein. argAccentsOptionError= Das Argument f\u00fcr die Option -accents mu\u00df "yes" oder "no" sein. templateMissingError= Vorlagendatei %s existiert nicht. templateCannotReadError= Keine Leseberechtigung f\u00fcr die Vorlagendatei %s. invalidLocaleError= Das angegebene Gebietsschema wird nicht unterst\u00fctzt. invalidLocaleOptionsHeader= Unterst\u00fctzte Gebietsschemata: startupCloseButton= Schlie\u00dfen startupQuitButton= Beenden # # SplashScreen.java # progressLibraries= Lade Bauteile... progressTemplateCreate= Erzeuge Vorlage... progressTemplateOpen= \u00d6ffne Vorlage... progressTemplateLoad= Lade Vorlage... progressTemplateClose= Schlie\u00dfe Vorlage... progressGuiInitialize= Initialisiere Benutzerschnittstelle... progressFileCreate= Erzeuge Datei... progressFileLoad= Lade Datei... progressProjectCreate= Erzeuge Projekt... progressFrameCreate= Erzeuge Fenster... creditsRoleLead= Hauptentwickler creditsRoleRussian= Russische \u00dcbersetzung creditsRoleGerman= Deutsche \u00dcbersetzung creditsRoleTesting= Erprobung creditsRoleOriginal= Originalversion # # TtyInterface.java # ttyLoadError= Fehler beim Laden der Schaltungsdatei: %s ttySpeedMsg= %s Hz (%s Takte in %s Millisekunden) loadNoRamError= Kein RAM f\u00fcr die "-load"-Option gefunden. loadIoError= Fehler beim Lesen der Datei mit Speicherabbild ttyNoTtyError= Keine TTY oder Tastatur-Komponente wurde gefunden. ttyHaltReasonPin= durch Stopeingang angehalten ttyHaltReasonOscillation= aufgrund von erkannter Oszillation angehalten statsTotalWithout= GESAMT (ohne Teilschaltungen) statsTotalWith= GESAMT (mit Teilschaltungen) logisim-2.7.1/resources/logisim/de/proj.properties0000644000175000017500000000177111452221646022230 0ustar vincentvincent# # ProjectActions.java # newCircuitName= Hauptschaltung openAlreadyTitle= Datei bereits ge\u00f6ffnet openAlreadyMessage= Die bereits ge\u00f6ffnete Datei %s enth\u00e4lt ungespeicherte \u00c4nderungen. openAlreadyCancelOption= \u00d6ffnen abbrechen openAlreadyLoseChangesOption= \u00c4nderungen verlieren openAlreadyNewWindowOption= Neues Fenster confirmOverwriteMessage= Die Datei existiert bereits. Soll die Datei \u00fcberschrieben werden? confirmOverwriteTitle= \u00dcberschreiben best\u00e4tigen fileOpenError= Konnte Datei %s nicht \u00f6ffnen fileOpenErrorTitle= Fehler beim \u00d6ffnen templateOpenError= Konnte Vorlage %s nicht \u00f6ffnen templateOpenErrorTitle= Fehler beim Laden der Vorlage replaceExtensionMessage= Soll "%s" durch die Endung ".circ" von Logisim ersetzt werden? replaceExtensionTitle= Dateiendung ersetzen confirmQuitTitle= Beenden best\u00e4tigen replaceExtensionReplaceOpt= "%s" ersetzen replaceExtensionAddOpt= an "%s" anh\u00e4ngen replaceExtensionKeepOpt= Unver\u00e4ndert belassenlogisim-2.7.1/resources/logisim/de/prefs.properties0000644000175000017500000000413311455470116022371 0ustar vincentvincent# # PreferencesFrame.java # preferencesFrameTitle= Logisim: Voreinstellungen preferencesFrameMenuItem= Voreinstellungen closeButton= Fenster schlie\u00dfen # TemplateOptions.java templateTitle= Vorlage templateHelp= W\u00e4hlen Sie die aktuelle Vorlage templatePlainOption= Einfache Vorlage templateEmptyOption= Leere Vorlage templateCustomOption= Individuelle Vorlage: templateSelectButton= Ausw\u00e4hlen... templateErrorMessage= Vorlage %s konnte nicht geladen werden templateErrorTitle= Fehler beim Laden der Vorlage selectDialogTitle= Vorlage ausw\u00e4hlen selectDialogButton= Ausw\u00e4hlen # IntlOptions.java intlTitle= Internationalisierung intlHelp= Internationalierung bearbeiten intlLocale= Sprache: intlReplaceAccents= Akzentzeichen ersetzen intlGateShape= Gatterform: shapeShaped= ANSI shapeRectangular= IEC (rechteckig) shapeDIN40700= DIN 40700 # WindowOptions.java windowTitle= Fenster windowHelp= Konfiguration des Hauptfensters windowTickRate= Schaltfrequenz anzeigen windowProjectToolbar= Projektwerkzeugleiste anzeigen windowToolbarLocation= Position der Werkzeugleiste windowToolbarHidden= Versteckt windowToolbarDownMiddle= Unten Mitte # LayoutOptions.java layoutTitle= Layouteditor layoutHelp= Konfiguration des Layouteditors layoutAddShowGhosts= Geisterbilder beim Hinzuf\u00fcgen anzeigen layoutPrinterView= Druckansicht layoutMoveKeepConnect= Verbindungen beim Verschieben beibehalten layoutAttributeHalo= Attributhalo anzeigen layoutShowTips= Bauteiletipps anzeigen layoutAddAfter= Nach dem Einf\u00fcgen von Bauteilen: layoutAddAfterUnchanged= Bauteile-Werkzeug aktiviert lassen layoutAddAfterEdit= Zum Bearbeitungswerkzeug wechseln layoutRadix1= Erste Basis wenn Leitung angeklickt wird layoutRadix2= Zweite Basis wenn Leitung angeklickt wird # ExperimentalOptions.java experimentTitle= Experimentell experimentHelp= Funktionen aktivieren, die noch nicht ausgiebig getestet worden sind accelLabel= Grafik-Beschleunigung: accelDefault= Standard verwenden accelNone= Keine accelOpenGL= OpenGL accelD3D= Direct 3D accelRestartLabel= Logisim mu\u00df zur Aktivierung der \u00c4nderungen neu gestartet werden. logisim-2.7.1/resources/logisim/de/opts.properties0000644000175000017500000000253211455470116022240 0ustar vincentvincent# # OptionsFrame.java # optionsFrameTitle= Logisim: %s Optionen optionsFrameMenuItem= %s: Optionen revertButton= Vorlage wiederherstellen closeButton= Fenster schlie\u00dfen # # OptionsActions.java # setOptionAction= Setze %s addMouseMappingAction= Mausbelegung hinzuf\u00fcgen removeMouseMappingAction= Mausbelegung entfernen # # SimulateOptions.java # simulateTitle= Simulation simulateHelp= Simulatoroptionen einstellen. simulateLimit= Iterationen bis zur Oszillation gateUndefined= Gatterausgang bei undefiniertem Zustand simulateRandomness= Bauteileverz\u00f6gerungen mit Rauschen versehen # # MouseOptions.java # mouseTitle= Maus mouseHelp= Werkzeuge den Maustasten zuordnen. mouseMapNone= Kein Werkzeug ausgew\u00e4hlt mouseMapText= Maustastenbelegung mouseMapText2= f\u00fcr %s mouseRemoveButton= Entfernen # # ToolbarOptions.java # toolbarTitle= Werkzeugleiste toolbarHelp= Werkzeuge der Werkzeugleiste bearbeiten. toolbarAddTool= Werkzeug hinzuf\u00fcgen toolbarAddSeparator= Begrenzer hinzuf\u00fcgen toolbarMoveUp= Nach oben toolbarMoveDown= Nach unten toolbarRemove= Entfernen # # ToolbarActions.java # toolbarAddAction= Werkzeugleistensymbol hinzuf\u00fcgen toolbarRemoveAction= Werkzeugleistensymbol entfernen toolbarMoveAction= Werkzeugleistensymbol verschieben toolbarInsertSepAction= Begrenzer einf\u00fcgen toolbarRemoveSepAction= Begrenzer entfernen logisim-2.7.1/resources/logisim/de/menu.properties0000644000175000017500000001022511455750326022221 0ustar vincentvincent# MenuEdit.java editMenu= Bearbeiten editCantUndoItem= Zur\u00fccknehmen nicht m\u00f6glich editUndoItem= %s zur\u00fccknehmen editCutItem= Ausschneiden editCopyItem= Kopieren editPasteItem= Einf\u00fcgen editDuplicateItem= Duplizieren editClearItem= L\u00f6schen editSelectAllItem= Alles ausw\u00e4hlen editLowerItem= Auswahl absenken editRaiseItem= Auswahl anheben editRaiseTopItem= Nach oben editLowerBottomItem= Nach unten editAddControlItem= Knoten hinzuf\u00fcgen editRemoveControlItem= Knoten entfernen # MenuFile.java fileMenu= Datei fileNewItem= Neu fileOpenItem= \u00d6ffnen... fileOpenRecentItem= Zuletzt ge\u00f6ffnet fileOpenRecentNoChoices= (Keine) fileCloseItem= Schlie\u00dfen fileSaveItem= Speichern fileSaveAsItem= Speichern unter... fileExportImageItem= Bild exportieren... filePrintItem= Drucken... filePreferencesItem= Voreinstellungen... fileQuitItem= Beenden # MenuProject.java projectMenu= Projekt projectAddCircuitItem= Schaltung hinzuf\u00fcgen... projectLoadLibraryItem= Bibliothek laden projectLoadBuiltinItem= Eingebaute Bibliothek... projectLoadLogisimItem= Logisim Bibliothek... projectLoadJarItem= JAR-Bibliothek... projectUnloadLibraryItem= Bibliothek entfernen projectUnloadLibrariesItem= Bibliotheken entfernen... projectMoveCircuitDownItem= Schaltung nach oben projectMoveCircuitUpItem= Schaltung nach unten projectSetAsMainItem= Als Hauptschaltung festlegen projectRemoveCircuitItem= Schaltung entfernen projectEditCircuitLayoutItem= Schaltungslayout bearbeiten projectEditCircuitAppearanceItem= Schaltungsaussehen bearbeiten projectRevertAppearanceItem= Aussehen wiederherstellen projectAnalyzeCircuitItem= Schaltung analysieren projectGetCircuitStatisticsItem= Schaltungsstatistik ermitteln projectOptionsItem= Optionen... # MenuSimulate.java simulateMenu= Simulieren simulateRunItem= Simulation aktiviert simulateResetItem= Simulation zur\u00fccksetzen simulateStepItem= Simulation weiterschalten simulateTickOnceItem= Einmal weiterschalten simulateTickItem= Weiterschalten aktivieren simulateTickFreqMenu= Schaltfrequenz simulateTickFreqItem= %s Hz simulateTickKFreqItem= %s KHz simulateUpStateMenu= Absteigen simulateDownStateMenu= Aufsteigen simulateLogItem= Loggen... # MenuHelp.java helpMenu= Hilfe helpTutorialItem= Kurzanleitung helpGuideItem= Anwenderhandbuch helpLibraryItem= Bibliotheksreferenz helpAboutItem= \u00dcber... helpNotFoundError= Hilfedaten nicht gefunden. helpUnavailableError= Konnte die Hilfedaten nicht laden. helpDisplayError= Konnte die Hilfedaten nicht anzeigen. helpWindowTitle= Dokumentation von Logisim helpsetUrl= doc/doc_de.hs # Popups.java projMenu= Projekt libMenu= Bibliothek circuitMenu= Schaltung projectReloadLibraryItem= Bibliothek neu laden # ProjectCircuitActions.java circuitNameDialogTitle= Schaltungsnamen eingeben circuitNamePrompt= Schaltungsname: circuitNameMissingError= Jede Schaltung ben\u00f6tigt einen Namen. circuitNameDuplicateError= Schaltungen m\u00fcssen unterschiedliche Namen tragen. circuitRemoveErrorTitle= Kann Schaltung nicht entfernen circuitRemoveLastError= Bibliothek mu\u00df mindestens eine Schaltung enthalten. circuitRemoveUsedError= Schaltungen, die in anderen Schaltungen benutzt werden, k\u00f6nnen nicht entfernt werden. analyzeErrorTitle= Kann nicht analysieren analyzeMultibitInputError= Die Analyse kann keine Multibit-Eing\u00e4nge verarbeiten. analyzeMultibitOutputError= Die Analyse kann keine Multibit-Ausg\u00e4nge verarbeiten. analyzeTooManyInputsError= Die Analyse kann nicht mehr als %s Eing\u00e4nge verarbeiten. analyzeTooManyOutputsError= Die Analyse kann nicht mehr als %s Ausg\u00e4nge verarbeiten. analyzeNoExpressionTitle= Ausdruck wurde nicht ermittelt # ProjectLibraryActions.java loadBuiltinErrorTitle= Kann eingebaute Bibliothek nicht laden loadBuiltinNoneError= Alle eingebauten Bibliotheken sind schon geladen. loadBuiltinDialogTitle= Eingebaute Bibliothek laden loadLogisimDialogTitle= Logisim-Datei laden loadJarDialogTitle= JAR-Datei laden jarClassNamePrompt= Klassenname: jarClassNameTitle= JAR-Klasse eingeben unloadLibrariesDialogTitle= Zu entfernende Bibliotheken ausw\u00e4hlen unloadErrorTitle= Kann Bibliothek nicht entfernen unloadNoneError= Alle ge\u00f6ffneten Dateien werden benutzt. logisim-2.7.1/resources/logisim/de/log.properties0000644000175000017500000000216411452221646022034 0ustar vincentvincent# # OptionsFrame.java # logFrameTitle= Logisim: Log %s von %s logFrameMenuItem= %s: Log closeButton= Fenster schlie\u00dfen # # SelectionPanel.java # selectionTab= Auswahl selectionHelp= Ausw\u00e4hlen welche Bauteile geloggt werden sollen. selectionAdd= Hinzuf\u00fcgen >> selectionChangeBase= Basis \u00e4ndern selectionMoveUp= Nach oben selectionMoveDown= Nach unten selectionRemove= <s &xtendszf arm-fresh f:ifth nal  reinvalidatedloor oundationranklinee-icons g  .drawrect setcolor,ates et bounds Sclass Tloader  displayname Uresource tools valueTifNencodernupl raphics util.drawcenteredtext uh_center vv_baseline *y counter  incrementer 'ов  .nextgrayhalt eightTlp ome ttpiconseee [mageicon plements ortnc rementer itsert mtance  p.getbounds qsettextfield data 'factory painter oker xstateVruments t`jg-kar ы6va  .awt.color event.keyevent  mouseevent graphics net.url  vutil.arrays wlist;help x.swing.imageicon gfontchooserxk peg ustak eyevent typed lastclockJunch4jd en ibrary -classcense%nux stte-on?oad.calegisim -filename.jarma cGintoshospin .png nifest Eem-image.txtnukey-d #itod useevent Brjadapter*ultiplexrx `n 3-затворEе*типа 1ew val ue xt grayDoQsplash Yullo @bject ffset k ld&r'овHs}uroborus ~.org t  .getwidthput-master.txt !query.txt p 4-затворFе)типа ackage ge int er  .drawbounds~ painter.drawlabel port s rectangle getattributevalue bounds graphics showstate instance ?erl+lain ng 2ort 3.input 4output rev  .getbitwidth isfullydefined  tointvalue ivate wopagate ktected (ublic >ython.q 2uery_file itbry-s aw ectangle6ular)m t .value .extendwidth getbitwidth urn@u/html/guide/about/gpl.html index.htmlnalyze/expr.htmligen.html index.html open.html table.htmlttrlib/attr.html explore.html index.html tool.htmlbundles/colors.html reating.html Oindex.htmlWsplitting.html index.html jar/counter.html  guide.html  2incr.html dex.html  ilibrary.html  simpctr.html  log/file.html  Mindex.html eselection.html  table.html  mem/hex.html  index.html  menu.html  poke.html  +nu/edit.html  file.html  index.html  project.html 8simulate.html winhelp.htmlopts/index.html mouse.html simulate.html  toolbar.htmlprefs/cmdline.htmlWexp.html jindex.htmlqtl.html layout.html template.html 8window.htmlTop/delays.html index.htmloscillate.htmlshortcome.htmlsubcirc/appear.html mcreating.html {debug.html index.html library.html using.html tutorial/index.html#tutor-gates.html Porient.html `test.htmlxt.html wires.htmlverify/index.html multi.html =other.html}sub.htmllibs/arith/adder.html bitadder.html finder.htmlcomparator.html  divider.html 9index.htmlBmultiplier.html Qnegator.html `shifter.htmlubtractor.html base/edit.html index.html "label.html Nmenu.html `poke.html oselect.html vtext.html wiring.html gates/basic.html uffer.htmlru/html/libs/gates/index.htmlnot.htmlxor.html /index.html Io/7seg.html gbutton.html kdotmat.html hexdig.html index.html joystick.html keyboard.html led.htmltty.html ,mem/counter.html\flipflops.html index.htmlram.html ndom.html egister.htmlom.html shiftreg.html plexers/decoder.htmlmux.html &index.html(mux.html /priencod.html Eselector.html Wwiring/clock.html fonst01.htmlwant.html ~extender.html index.htmlpin.html robe.htmlull.html splitter.html transist.html0mis.html Kunnel.html1n_test6s-rel  label ?_font 5widthr ing util.tohexstringub5n )per .cloneftablersorter2emplateUxas  his.lastclock valueTil321  ointvalue ols riangle ggeraue yty up  dateclock'per Rrlsa zer v2.0 al ue  .createerror known false trueUersion loidweb id |th .getmask widthMndows)merge ww.fatcow.comIx-ы1010100or''ов ,xXx yzoom5   7  j  ñݶ)Атрибуты инструментов(Aиблиотека Арифметика !азовыевод/вывод амять 'ексорыроводкалементы h JARLogisimи атрибутыуфер кладка ВыборE) Вкладка МоделированиеышьSкно$анель инструментов  аблица Lайл ертёж 7аблон!iкспериментальные+ сплывающие меню и файлычитатель/ϓенератор случайных чисел атчик кодер 8итель%ультиплексор ойстик.|ругие параметры проверки7адержки логических элементов dись в журнал<lзменение внешнего вида подсхемы) крементатор кода Греяuструмент Выбор_еню nажатие равка водка екстскатель битов$ ользование подсхем лавиатура  сс Library jопка&мбинационный анализ аратор پненты памяти }стантаакт еню Моделировать кно и Справка равка7ект айлMткаPожитель.ультиплексор *ажатие на память#pстройки приложениядостатки программеЗУ этой программеAткрытие окна Комбинационный анализадка подсхем_рицатель'ибки при возбужденииݟЗУнель проводника.Vраметры командной строки роекта$Jредаточный вентильvтание/Земля&дстановка библиотек ąемы!"собие начинающего>O: Добавление логических элементов&ȿроводов %текста_сваиваемся кладка Выбор^5Проверка из командной строки <ескольких файлов) стой счётчик кода Грея ёт значенийVчки проводовазветвителиьсширитель битов յгистр;актирование таблицы истинностиKуководство "Как стать пользователем Logisim"ветодиодная матрицавигатель вый регистрVлектор битов$ɾгласующий резисторhдание выражений Nучковzсхемы%Hравка по библиотеке енюумматор  битов [ётчик кода Грея аблица атрибутовeтовый генератор +рминал aннель/ранзистор 1казания/равляемый буфер/инверторвета проводов4естнадцатеричный индикатор# редактор$Dфратор приоритетовлемент НЕ ы И/ИЛИ/И-НЕ/ИЛИ-НЕd.сключающее ИЛИ/Исключающее ИЛИ-НЕ/Нечётность/Чётностьt\втоматическиfеуюра в скиеих ؃ ^Oама тивна рес vа ых zв &у 2етсяpт аcвенуальнымʻгебраическое  nритмWа ализ а роватьYуете г е чно выхлийские=мнимными%хаfпаратноеFргумент овLыCфметика rческиEеp ͺадных зас тефактыۅитектуры|асинхронная@yый семблер циировать рибутаmlв уI <азовая *й ую Nе  т овую,з Dвозмездное-наковоеые:хMьеѻойым )едиктаркличемƁконечноый латное коиться ѻезный спорноа-версииfблиотека мх"*у чныхQтам iи-хFого a ޼ ые q uхSв у данныхагодарен ̽остияжайшего@у 2ко iгорисаее ьше е V Eе   Rства х Ѿго  8уюусаразилииDная vндонуkдемт QеPто &т ие хвjа fйKыагефер 5а Y в  ываетшие.аLYстро ыйьr$.м  ажная -йшие ыхиy .риантав1ыcьируетсяA -а й ϼ у TмхHу aедете те <я н ный терх утиJда #мого Fт оль *б-страницы  Qенияrтутđт ся рный ѻика >тиль 2 рнулись ться т aесь Pятно сией  > ю  ми х |икальнаяC;гоые gвертикальных?него    mе  Y х яя>у ина ми j у Xныти-ейаимодействиеLя  7вать'ует9ютݳляд%ят9ьдHали ть т -е)а ]мsу4Ѻлад ка Wмиvх M ׸ bу к  ючаемт+ся 4ть т{ся 0ие K наzе м яZые 4ؼ]х: Uы тельно ь dратцеевояет >иять т /ее е жения ыеи H {ы jесте мости ть cJе сены ϻи ёт него   йrзу ание [ситьутренне 3е u ьLзбуждаетсяzтьсяҎтсяCниеюÏх :ратит аетDся я´ействие  ]ещении Mжногоչстейьмихыеyхаграждение кает cшим ражать станиюдёт е Tти ɺруг  һнует8бще "-то  Sреки Ӿс ах Bв усклицательных^становленияок чногоыйми fбитногоl Nерёд сываетсялнераво чемременем  омя ˑн  учнуюӏде5гда [ 6(vиуQх bлывает ющее4 ظе #ёт  cвспомнит žгательному ый  7тавить а   й енные ы >яет @етьраивание тится ается тьсятся  иеся 5ена ной=уюXе х "ть пили I>кийP <орого  չ ую\даода м и х  ~т 0ая nго k   у  ые  Zх 8в ый у o yщее ех денияg берите раем \теsся nтьSся щегое _биты"х Zр `а k ,а   у урав + и н ного ĵݹууюCеmх 9 (ы тьKод а ла тся ятся xляделать т ят  ружает }ить иLаваемого ɵ ть^ст ей т т -ся  лена ?е Wю ая го уюе х uть яет Cтьржал  мкойвав  ть в а  Vт те Ӿм4ываемое т \ся Oть /щие ~ти ͺлючаетть  н=ие яойым^х_ы ть адающеей>лнениемя|ую 1е лgисьомт|еь яетесять;тDиеуск аемыеющий # ?ен Aа ого "ы0равнивание2я выражают ниеgю͏nм3хIых ѷить  2зать lокий Gх ݾго мпедансным HуюEты тупаеттьийод 1а ми х ӵ &ть 4огоܵf у Cые0х Nв  у p uщаяйXй есть  сленаюVоеыйR øмт ь cяетсятьтся аемоеымт иея телем=ьмиь тся{е]стоящей Wказанным Sомянутый]и <вить Fение uарантииҹ Gровать{уютNмиире -нибудьто nнератораdвkы руют графическое qбкого сть6рляндой авная го   ую "м !убину ܾкие ую nворим т wя щееаху убойки lраздо1зонтального/ые:и~т шкаeят ий х/ов ы радусов ýиц ами  у Q^фики й ческиCйции Bеский  KгорияJупп а Bровки Nуpа вайтетьǵтMете*ее о ьнейшее шеная bго Q  ую Dе D  uи tхсту lик аɎтnихZта'жды ߸гает е Eться ении двоичном ымной ымум/яхбитногоый ходоваяые йствиеq тельноымb gми вали Lует}ют _им AодераBы+аем Tтть E%ние 6я  aктам (ого /"т &елем!ь,$ми ься׼онстрируетrют@ультиплексор$аегрева  ателемDfь~ ь Fтятичнаяе\ ым алей R  яхYективной5тельности [ереми jйстикаагональныех 8раммы ог е вого^ етром  ſазонеу  айне ректорию\кеuлей |танцииaяинауPяc  бавив и  тся лен $а LеяогоыеF ы яемый тTться )тся& 3ьте ро ольноxадаться идаясь Gазуемо 1ументации ю $ OрованиимĻгоен Sа z ы олнениемя тельнаяго<ую !е=х Pельтаlускаются qтимаvеые%словную-етаточно г ает етpута< ^енияуп Hа ^н ʽы mе  х мруг_а #е [ и х ݾго  (   уу ;ю ͷьями бликатении Jдублирования Zть ует аететьхуxну вропе4о jиниц sа d й  у ۋственнаяеыйbϼуслитественнымь׉еёаловаться 7уется޵лаемогоу ыйv те Sию Uмзнодорожной<войни урнал а сткоаgбой тились тся у ,удьте едение  ршает ся ния ть .ённоеых сеть Kмости Rт ящихRлядывать  %ловка վк ружаем тXся тьтся Aна2ойую х ы или тесяV 2аxан ие pя ое ым и  nы iть kа  aу м 4т Pе ся  ׵ржкамnиUуем йуман атоймствуетсятересованымалючается  oющийсяQльцовывать Ƚное nм {чили теPьреплены яем  ывает Fть ть cедляет ена 8ть ы ет ть тся2тите ое ыми ~х ьтеиматьсяGвоятий  ьад е ее го ыеù |санное ые Rы Kй " ывает ся ть wся gлняются 9инаемых тютрашиваете тят mены с ить -запрошенное΃скаeетть  тимQте łывает @ен 9ные Rтымиsставить и Ļяеттьeвор $а % Iвмрагивают нуты отите етZся-аточныемʼnита ть аем %влениеяA яемёздочкой)есь леного ыйёный;ляммерманн аете ܺа в ыить ением Aю)мYи х мости Vыех qт ,ельно vа  кҎ  рения+-не,гнорировать сяуетсяڹтеютсярôеализирован ьногоcтификаторов 7языка uтGтит1ие и}т  рархииюJz-забавляетя жать естнаʾгоыех ены отовления ڻишне  Kенение bм@ Xя мы лиSсьсь те sся яем ые Qт -ся тся3ся r 6н`ногоуюм tрения :яетсябражать тся Pние Rя6ыённая учениеsявляетеи-неPюстрация  ,рует ют ий хьяqеемт_а  qа ми &файлов м ] Sо  Gуемымить(т $ий dся Kх тации vровать ортироватьимпульсая %jarфайлаUачеƲертировать уется ߾ра Դекс ом  ŸкаторaаS енеры.циировано ть ует 3рементатор*гда 1 bуститута рукции ентами вGу!Eеграция 'сивно рактивнам есе ующее ациональные претировать уетсяются фейс)авууитивноеым҄орматикиией˸ ю%миническихскал \тель ьючающее ние>м1я миы в  тельно ривлён ȿании ?ский!лняемого= +ьзовалиý?ием7ю˽огоRDтьTся zуемое+ые !х3т1есяVтеютсяJиеся0KхуюՏ ртит_равления 'таниямHследованияEтьина ости ук а , мAрию Uодного  у \ую #е я zщих ݇езает  _ерации¹þгеF ет сяньU  аждая ;го   c уую Bе 0 ebтся3V-тоароунтас = -либо 'е -либо то  Z-либо и gх-либова { 0о G-либо 4 -либо ݹ u-либо то  у -либо ую-либоировать"капусты(ркас˻ом<о;та х ? фельного Ɂается ются адно Wегорииялического Uества Ȳадрат а Kчнуюаяые˾вļ.ыֵм-тоyавиатураы ш Lа й -модификатора у сс vа ̸ческих в # Nы پнироватьюч опка   й у кZ Lвальтаlда -либоӾ-тоVа рованиев $ыaм ебание θчества Tмݻегевилье 'жай ׺тивных июнку oанднаяй ыинациейθ* Zннаяго@ые ихю ентарии Oрческой аратор -ляцией ;ементарных Aнентeа&м7и хqвуьютеровKыу-тоҽвертироватьруэнтныйц ˇная  Qыех  ретно гоR Xу ыйих ренты рующую 9станта й руктор=ыакт5амихв уʋ кстного у  `рактам #лировать рэйигурации3ю  рует икта м и  пция в у  ается Yлосьƾрдинатамиуً ией . P Tрайт вание7мwQю) ы*тьь iкопию ӏркибке  ޾кткие _е еректировки Ƃорая 2го  < ̼ у Xую е  (и ?х ффициентраеĹнего  у й hяя сного ую [е  и]ен Wо +й Iым в  пленияRвойLую сталлаھмеуг'а ми - ая 1в Vка  м к чек ного льями wтатиɂо Tайна ɴа-то!ина рса х вом р а маабораторииитеваяго 6   у рукийуюа йjкоиттM @беральнойов ейныйей  WGю  ми^цOам и <нзией7ʹ 0нного TроватьŎhу@итьь~гарифму ȸка jческиеɹихеѶныхь  анной учшеXбаямом ыми .го #  X уую݋е ~ихей̸gьмиUак-класкиNинтошахwинуGсимальнаяе Pу зировать Tуме енькие"вероятноmипулирование ть ует яцииркированными сив-параметр ˆтаба  ровать ый 5ериалевGрицам s rы иночитаемуюм BновенномедленныйӶдуее:ьше }го е  х ую@ет е сять =т ся (ретJа м ^ 5уsка rм µ o `й уSд -конструктор а  в  Eу q`ллисекундuуас-жерайсамальное ый ظзацияFрованного.fуыхтьует ум ߽есотаус рилисьу адшая го U ɸе  jи х уюе˾гие и pх  битноеüуые˼Cих  ходовое ратном hугольник а ественные Jмое Eтелем>ьDмиг :лиут\елирована9ем Hю Uть уемойымbт9фикацией ю/ цированнаяму&уюетьуетеся%улей  ь ] |Uйемт iеоӸмܹEент ов тажное рковиная֎Ώ Dсльтиплексор а+.вAыmши ьюа бираете ƻюдаемое\ыеaть р Gа ߵ у ċ wранная едениеظ ёт рх у  гации язаныежде Jяться %ись схемы ;ав и та ем ? я Ǿй ь маетiе  ть итеём теад анием названиях 1ого ый ться ачениеAю Ͻую mтьھвём т ываемoуюWе ть тся более 3ьшийным Zеньшимден о ы теKёт етиапливаютсянец агать [иваниявочие  еренноCогоометрового борот ʿисал ием8яϽое$Wfыеpы hть &ите׾минаний [равить *енUа ем}я^мхогоуые х яется  мер Eтивяжениемя уюzрастания сованныехть уем тушая нииях ть́  колько рести таивал ۾лько ящее раивает :сять Lт ек bнойу_#ы -лть ка михcодившиеся 7ся dся ?тесь:ся }ятся ейся еся 5сяхся ܶдениеяело͇ав ڻ Bа ! ьногоŵiть нает wть тегосям սем hтеёт сяaа,3го  мxNхуuбольшая xе3mую%озможноrсти{ыыбранных еленногоативнымw  авние статки чно упенqыdависимоыйииемнеизвестенڽаNы ^енным яемытуитивнымтральныеоммерческого тороеуюех5ьзяедленно<цкий йoого у Yарушения улевом бходимо\гостиь :ыйх ݋кновенно  чнымnи 'зательные Jраниченноеиданному]ыеJределённоестиьыеؼхOтъемлемойƿереведённымиоходключенныесредственно ыйравильныйwи [мерна дсказуемо oрывно соединённыеwравномерностьете олькимихɾ ͼотрявместимы-ети т ейтӂcронутыми ётномсть ффективны,жеприведённые}следующие gего   5 fе j [Apкий L Hх го@уий{ак ие & 9х го g eгда у pих `егото2 *ваяго    уюе  х|а}уки»ьер  а ми мрмально{йh ых Yителе=равитсяятся 9женbа  @е h ы  й евое !ые  LeяhмиfмAерованныеC8хы уете+сямo".в'с`ба инениядит Yойихиемобеспечением;я <ваететьор ного адаете 1тельсти }ь гчитьенаZаруженноеB вает ть vтьвит0ься ڻениеu яетIся>тьсятся уляет бщения& Ըтьhначаемоготсяютей мнияхIого#ыйMх.тpь ми`х kтись очкиснованно рабатывает$ся ть 'тке < ޷ а вательногоыйх  ытите о\й ается ться Dние зается]луживания тоятельствахждаемуюrся Xть =аяго ٵ  Ӿбразовательных ринятыхственнаяйуюzеmе " } их единит Mь|ять нногоуый т а ми DогоRым lв c tу ֋  /явить ение Oм  Mю A огоые oх яем т 5ся Jют снений *ть яетlся ютWее ґмачно е  /ый 3зан о ~ы тельноaства;маловоренных раничение-я !м½ойB вающегоe RхLсь мныеин  аковоdеaRуюе  х gчноеуую ۋйeа/ко ոмхбитногооднобитному ые:и>х ременно օодовой о  cратное ^ уу идаемую тся ть "начает Hть тIу Xажется  ались Yсь bся )тьсяа2_0м у н Vчания?рашиваетуглённому&аасности 4ранд торов!ы 8ионнойя саниеcя<ми ыйиUх _ ы Xть  ;ываемтющаяатыравляется &делена iеямхƽойуюϾыть яемуются%ютсяееуюнTнаяго[уOую Nй}химальногобликованнойую  |скает ~сятил {тьۉенаhией  нальною  м  "тный ть ранжевый2анизациейո уетол ܸгиналzьной)нтированыN ваиваемсяݵдомленыбождает й Vована е  юĽого!lыеIхы ' jая гоͼ ые6их ываясь бенно го 0гоымѿариватьтавались ся ться 5л ть Żены bяете;ю шаяся yеся Wтся ьнаяйые^их авливает ся Iвки утся*ток Ŏтся ,тсяногоTосуществит ениеяетSсябрасывания  еденат ить [ственностиjы нности  Yельноeго kстиые ݹ ихaаз аться |м ывать Aючена омым ы ть роется  ываетеся Gть ) Fи тие  го )ы е и :х  kадка J у чается ть ся тся ийся *е 3 тельный ом Tую е енит ь -яет_тил  ать ǵн]ном/ый0ы \у осительноыйся Iятся eиеся ся@хся LениеTюх бражаемаяго ую й(хтся ться т#сяOнаaемяqы ится  ятрванную равная ߃сканиеiють тит ׉ена ражает Bть тся на1ы ились тьwдактировавные tка ո Eк сованWа{ого <ые Cы.е ываемыйтсясять,сяn ует RаниеVмXя ?тельное[ымутствиеfюует1итываемымитсяудаорматированное3ициальномуый тватывают:ся)раняется Yевидноь реди Uь @стить аается ошибка м и х  Ը پй у чно абло ета х 8 2вяти Fь%ели ь [ю(ку$к скогораллельная۾го8ымиnх ¼етрMаPхвы {индеру?ыент ами у нелирвая :го   N ачально}гоыйх ую е Ϲ h xх  5бирает )ром едена'уюы дамихYт ытся k lаваемоеBые Sтьޏ hтеся Ļи ̽ные1ы ст 1очного=ыйь чеq =тсяий ͑мтся jем е ַагрузить !исать ываяhущен меновать дите я dти лючает есь [сяdтьсятx xниея тся роете }ывает eсяютсяее dмх wтие jяь енное ые[х Eстите ь ает \есься тьсят ɏсьниеыYён CожаетMния нтировать #аправлениея  сён ;са  мостить hпределить Nолнениия =секать |чении отренные тавят _ёт ~лать ςаскиваете>иемO0^яться енылитaе?ь  од|аȸтя исленияперечисленыPв lтьяют Eодическиатаемыет ся а ть  ь oу  кселей y wь u мих сатьBьменнойым :аниеитеутавающего¸е׹5ихoе Fи9стин5ами йnу Fормойы >ксоры~хо гоую'юс<{-другомурежнемуOразномубитовогоd"ымагодарить удить Cедение Kмюȏми  рнуть uх ностиду рачивать торенийqями ое6уые в яет  ющиеся шать  рнута:bадим + Iа оеу ть "а ȸ vтся тся ергается$ rдится Pят  ߳онки товлю0ерживаемые хт 4сяtть kт9ся‰ееmеиу  $литься ржите аталог 9асс 6а м у ючаеттьܵнияогоылить ежащуюUеню ̽ожествамиq  `имает fсяята ]ь [бное ыхjисывалирограммыразделы MумеваемымиJхтсяKться ʾбной ую яд vветить енxнымLы вать ۺазка тавляя ˽овка 'раивается емами 6х йуa 6итанныхыподтвердить мали ываете одилит в #ят tиеc  yёркнут rый аловать ,уется ста  волить Vьте етт 7таяе 'нее ù7еcций Jнирования юскаNетfажет %ся 9анномую׋хы ться ывает MоBть<тяагается ясь Pзен Iа `й ым х  ункаое  стью Ԃы ую "й  Hвину ениею  сыIупрозрачныхсумматора аем|теся телейظ{ьм~ь   ниемWͽоеых Nы Eвшим_х и0сь y тьRзователейM ь2м %и |уетесь  енять стит.е ь Uенный ать \аете pться /тся +наое Ǿ ы ён моите гает ут ет чь ?и ью Rадобитьсяyсенными жать аниемюۏ ют.ятие ~м  ям,черёдного адаютравлять тиковаться gбуем сит ~лярен тается Yа  Leразрядно комендовал т а Ѿву гальский sдке |м у xкQередине ;ольку ֻать  днее   wпоследний}х юю-я pвавшие тельностей##=ую%х"ь$Zю#$х ующаяй е mотримбие ]редников авить  яемые1Fют янного- роенияаяйxые, хы мjть ки паетQтьтегоmех Hвшеех ۻения лаемым тxся tют sерей  xями ы к а  l у ратить 0бовалосьть%ся уетются шеннымх одить  е Xемутиуло тому вится ся ения яется ться тся  имися sятсярава ми х { ˴а лаbм ] ьнаягостьым а ɾ 8е  6 zу Zбладатели рукийую nй պтикеø ческой 6амбула )ышаетKтьела=ми ]х ûагаемть .жениемяyт азначенFа ǾставилтьенKиеGяыех{]яет5сяtть тся ~режёт вратить wолагаетсятьϏжим тельно +следний  итаетеrтьтsтениямительнееыйрасположенной rказуемым тавимытьениеюмиую+й\3ыю ݏемые представляетсятьт егое Oх преждений сматривалиҾтренныхW ть дущего\ bу!е<уюде dим `ратят ]аетбладающим разования тьуетсяютсяодавании mтелейь$~мтендовать ÷ийяхбавленияяет ижающиесянwеденнаямzымиzы fённый х 'т сти ствоватьсяую тся yекательными  дит&ь _ят  ычного занаŽойуюеть ау к +ываютсялашением я Qдности ается ёт рживается ться сяfёт gся  ɵмлемаведения !ателен ьность /ьраки в?леивает/реплены ожение 8я енена׸е{ XмTа>ым eяетсяются dн xр eа +х  о в ы # 3ание zтивны еrхٽадлежит  sости маетoеся_ютG тер Pждаются л тие го,у ые Ō ритетCов танавливатьsисываемый соединеныли яться н ные особитсяутствие ватьуетющие ую одится Fина  eйёмȈла 1 ؾсь юе  Hприёмы6анализировать  егает  #ами в kы емеыйԾй0уދ !вать едениея римть а r̸у яемаяйый*х|теuитьщей ую ۾д аmм:иQх  8а ика м в у щими kрамма\михрованием #т:ого Hымlйуаже Oу ёт Mигает ении (утые лжаетUтьтнии Uмтельность ь:кт 7а ми  рованиять в Zы \рачноbый зведениеHмع юми Nдители Vьности"dьсяֽыхяgьныgй kх tйдёт шлиоqстекающие Eодитqьoят~его омментированных  рутки uиваются  истает ывания  ежутокышленнойые икнувтьумерованные ̿ускает [титьVработанности;матриваемаяго ый тть траSныть0тет #ая йшееn  го ۵ ¹ у 6ранства ю <е 9*и Pх итать=ываемые ться ёт а хtу 'бой ыив @ное `положногоыречащие выех яжении ؄ессора-ода aпроходить (ящимиUх gдение۸я едурой ݽта OссаO ;мров Iло сь ых е снитьeыжокмом угольник аKвZеуюwеɁевдослучайная;йуюх Mбликацию вать уетеырькамикт а м =у 2скает Mтьта 4й ые  иFемlшествуют 4ьмLки в %таемся mтся;ться тсярети ь#ю работ а ете аQ z }ть Yт rие  X Ծдателям у  ена Q е ерноы 'угиzаирательства ь UраетвителейM_ьs Ըтьел амиZться ` fна kтелейь 0миoь вy у  ные tетHть VнногоыеĹиQхражающими Iичать щихся )еչ{я Žымихер ам и Iу >тилит9е ь -аемыйBте!ся ть наияы CёнHногоFыйица родная тиь+ую \е ] sи х3рабатывать тан ноеcые @ы]тьkа 0й чик {и м Cшает)ся ющего7;у й нае(яi тьразрывам дном стиь _адресаbюRым!единении ённомуыехfкис4ее =их ьшескрывающееся}ечатать Zсанию знаваемыйия qагая женLа jем4ю ; 7огоыеы4те7ьределены яются Cстранение8мxю телиь яемогоdые2теся,тьсятся YиесяƏ"сматриваемойтHесяитьтся+ третьм тавитьяет итаны ущимиЇёте ирениея ?тель ^ять Bщий ались[агируют ийций  8изуется ]стичногоымьной]стиhь ымxхrиональнымииhстраѵуHактирование _ (ють уем %омуZыйте ра уем а  8истораۺим ультатаwмыомендую'урсивноwиз утации сурсыڈать-нием ю ߏли`тьSск ваниея ть ует е $ка кютвно'а тельской ʷовых бассииDукиводства .ватьсяяткаǸу ьу сский д а:муk )айта +@аь самого  T D устоятельноыми,ые  K Aрасывается Nютсяhс Dить ят Aены Xерре 2у иться @о o-зелёным Mсерогоый D fдиодFнаяые ения  бодноYгоJp$ыеOх }й Iу Btaго  rу  бразноеi Jм иjх ствами нныхрачиваетv яжитесь ались  ноеую(е  fbих ы 8ть .Rывающие (того алсястсятсяиг bа @тельyь eтся iвый zутоkеь *лаем Kте те / Nа 8 4ные u тьбе`яNер а  ее й ый dzментаQмkEыйþвXKычас|ону Jунд rу Dекторенистрасегментныйя *т-джонарая  динеыго ую؋й х езную&м ёзносииoка , BnуMь атии Oгнал а в \ыу ноeвол ами 1вi ы Tетриюего X,е  U их #таксис…ронизацииый Rстема х ε >у 9 уации Lяхt  yажем т >еуатьeчать 2летнуюͻадываемыет#бкиькоь  Gскоро uстиvьFю =рипт овJугленных ённыеücи RваетPта Ǿго ый  &днойагаемое~ваٳкаить yванию}ть ствием ет ют ая׵го C˹> )у Jе $'ихXую  ишком Pниява ми м сочетаниеен ие ю @ая mе m стей ?ые 6 и ханужитчае ?в тся T  sной{сти~ьoыеټ pх ?я х тся Ҍся؋шалǼело sилось Gтся Y [яются  шивать ^атьсягут uет етрим теысл а  абдить еначала7зуает те е к ваgблюдают ние Rpю9йственнаяестиьюjые тияместимостиZтсяCо5му Yается ённыйWкупности ۿадает тьzтсем uласиея о вана Iяֽоеые ы уется7ющий iаться4ействия GржаниетLся؉ая$е сяся у е *сяих |сяую мого  ымтGдинение8яы 8ть  яем)т)ть;тей2йся:х н7ные иVх даватьw ٴимте ʵт "и ! созданием6я ѽомуые~х ?ст ь т м +т ]сябща ет ющее ниея тьLтветственноеxявалиlтьtуетют=ая го_9teуе[и@хую ошениероводите Bдает ют Fтствующейртировки(тавлена$е=ы&ятьт νые ит 4янием юмих ть iееl  0ранена1я ׸лите ь яемQтся ть ÎтсяV [нные етание[ я >ющиеся{адасибоӵктрциалисты 7ьноnые6х dфическоеы е ޸ска  м oк Hошных  Zкойнособ ами 2врава pться Aа  ָ 4чномуюхшивающий ситска ясьрабатывает˽иемEƹяnть`т тал нениеd "ю вает #тьу iди ий W ;яя  й!у ԁылаются (и (уабильному vшими/ииƻи дартuа зацииvыйҼsиDхму т витсяут ртовогоS Wе го  у е  3gи Gую Gе и х истику ческие еский2уса  екле tени"стержняCвае |ь имостиZь т  е м бец ца$мих  в /у (ькорон а  >их Eыран ах ڸца х $у ҋ о Hго ылками  kй  угая  /ли те ь  а  Ѹ й !у Kчки  щийуктурныхы oдентамы ߿еней  ь Nблицензированиеа бного6маторамим 5у ˋ _ерклассеzтиествовал уетютrаягоnех ҄ормированномема м и х  /йу дныенариев*+я  етчика тает ,еLся ное ться  3тся ывается+иемть3ёт7а чик а  мDуакономитьHда-образномK.еfа блица(ми ^\й у  уляции> ая˶ее  их Qвыми Gо ڵ  _тhов lая го> Ǽ Iую jе mcхbыю ос кст  а  $ваяе ый щая го ڵ < Vу е  Eaи х уюдои.ерьрмин аsл*а)%м Ӿм ыGы "ение Nтированииd \ника ческиiйени#течение льда޿а чно ымв jырео&нов  Wварнойkдаhе< стуюEкоuуких стьую Tелей S 6ь ] Q_миJт qек 1а /ми х #  й уAо е стиыерадиционную <зистор"ав ециититбованийям^уетbся *ющиеռятийьей у N ми {хгольникомĸeггерdа^־в~уO-ёх 9битное!ый иcдашитьательно жёлым хAмно -зелёныйqиكбедиться ываниюlтки ве домлениеdями яет 8ичениеR 5ваетсяsтельноеOсяΌ=сяренности Wы ȸдеть ʸм те_лаdмиHм7у \бились [яетесь л рожают Ҵалена е я ы ть яется ть тqчно lе инитьбен cо ый  х читаемостилетворить aяющееLстовериться ƶ aе кимих*гоуюAу ать ٹдёт κажем 5теан ия Wоеļ(ые  Tы тель 3ь ывает ~сятьCтYся &аяго муюорачиваниеть mщихся тить}рашениеени$ улучшениюеньшаемогоу6тся 9ниеS Ӿ Fтся?ся ститься ӽо 0ается ющийся ожение юO pлчанийюёниверсальнаяйуюyе тета۵˾вы `альноеым&хоминать салы;равлением,я яемогоыеֹттьvтегоSеUую mровень  ей Z ю ؏ ми Oливой ерднолия ]орение Zовии  ямих dено ужливо ΋шатьsотрению ешного Fтанавливает ть вимMт\ьiа.й енным  к  ревшейе Iи раняетверждаютCчки &литы одитящийаствовавшие уетющая 1и егося ɸеся μися &ся хся бное тыватьzтсяреждениямх  ^ерба  звимы  абрик tами у|ла .м х  в3шаблона Bтическая:гур а ого vые у DoическийгоAсированоы Kуетсяютtипуսансируют ажоккус`дXа мtрма .т а S ровании C }йу ографическихранкуэйра нт kе ы ^энка нкцией = @нальномустиoьsых ю%bходеуXст Rа ߵ у  рошем   )тингел иϸм!те@яۇетранения т ся xящегосяBся Gесясяхся hстоса Yюсбиветaа dв 3ϵлей͸комþго ѵ стностиые .хҌ0мих Pности9тр bа льный Bрованует м уv^икл|а vческиtй wвPы фра yми выех gу 4астей W чное 7ого #  *сти S mта }й Jу ?9ь ю eми nей овекомV урезтежа  й ёж вертойый Zёртый9ыре х hьмя Oх битноеуpыхповы;сел а  Yуает еть тение яM  `-либо cто?быть]им Uрного уую Dе  r 4и ное сть 5аблон а у "LRа d ؾв ециистнадцатеричная ߾е! !" уую й! "xи х ь й ьна!ованноййуً 6рина у кие ҹ и +го ую Bратор4а5в@ыnрифт jаނатмаھм Љедрыйчка [в Ƽ к  ёлкаете >ть ߏ ет те Fув и ть a֍вмKвивалентамиWн&Vэквивалентнымив  ^емпляр Gами  fм pыран а Xпериментальные!Yи ровать тов рта ĵ  рованы тьtектронике |уюмхAтехникеентам Qи-рныхв<2уk ȼуляцииzкевортуSта лоннаяйамих/го; уту iфект gаOге qного   tуый#фаDвлением я NяетсяPются ееся 6есяƹсяоеыками  : EвMу орем ь (ркий еек киVика 5ми ёж вертойый Zёртый9ыре х hьмя Oх битноеуpыхповы;сел а  Yуает еть тение яM  `-либо cто?быть]им Uрного уую Dе  r 4и ное сть 5аблон а у "LRа d ؾв ециистнадцатеричная ߾е! !" уую й! "xи х ь й ьна!ованноййуً 6рина у кие ҹ и +го ую Bратор4а5в@ыnрифт jаނатмаھм Љедрыйчка [в Ƽ к  ёлкаете >ть ߏ ет те Fув и ть a֍вмKвивалентамиWнlogisim-2.7.1/doc/search_lookup_ru/SCHEMA0000644000175000017500000000006611541757214020067 0ustar vincentvincentJavaSearch 1.0 TMAP bs=2048 rt=1 fl=-1 id1=6498 id2=1 logisim-2.7.1/doc/search_lookup_ru/POSITIONS0000644000175000017500000025115211541757214020522 0ustar vincentvincentaaaaaMRH (W4L7plj^K S>|LJ\1ǿ+odeփ.jbT=}A?D*h0 h# 1:\!/m+}+欒 ؽ;HF:^Y2|5߮{{.wseK Bj,e!ju+~0>1@()Rv2!s}²n~ps+:AIΜPMy21̮i+Efg.`UVdrm5L1yXStiwҜ&ES mfW39hP@V^}1AϢ^:eUؙUmj=9 JL,.k58嗼iG"49mĔ!$j4CDl-.t?ҌI} MkTzT3T.wԡmk'M{TvTuZ[kGU3:kGQDO Y5sZ R T.i("- TA5}5t]R9EKsho심T/Ulyq]Nh0.444ƁZPO . QOG,sB@GL-G\>DWB{zHjHvC]5كzgd%rq]8%}X6$ş35Bp<%&}Gٽ M١ 4`Kfa۾10 2 ! h3"0z\ /VgiNUxw$(4FLea9b3U(%)/^G%o\.{z 9RF,BC45Ftu=BǬr*.R۬zеI[pWx}Zc@%j@n),܃-/3jŨ`!ݮʷ2a(ܴ-*3 ,I$ nT23);1htUb) C(F:"e>~(= k6"\scg|/ }¼smL e[` Bp1μ#ğ7;ln{H= yи"% 30Gi@M.䧒9QHx#&1<Ahx!4$|3l&.q@ 0 A 5F;5 CC449@@”$J4[,R4TUt7xP T]nEJD?m‹+5kL< n0 ijэ t( _Ko,S;y9$JfJJ釡 {3Ÿ2fe#Nr3FBZLp/Lǂdο%\RuP-dP 33 U+c52LR#HhJ-@(Ô!$:4kDL_38X m I}b !}0 1/ xB}$ P(wmk (ap0Lj-q)da]$7&Q5Ԕ`"foa>ޙK֐49 ߃FALǵ) ¸CU#eDxs3SsU4Y)ȵOm@h˔aԤJ5[<Ǥ%NܶBlGAUx"`( ;b 0% hS¢1?![XE-쐘͌V0 Uațal`1 à@0 0b!"h+â 0z !~B6b0Zoa5$* @S6 -v X 54;^p W@ALACc(zAP II?3e{/a=0 {Đ1RFd DSŔ࡫x$s@ 0BE hs1\#!{6GCmB'=9}/49`NLȐ՞<,=9{]Ԡc.~OtwB3U/hgB$ 1!Dɐ ~2b`Lf. Mu%ݔ?á<YA/rhJׁ鴀 0E!kh"0Z\7![͢0Z͢J$Bvisu Ai_x@f&Z4VIdVS(b80E<p@2KqHkQ5j-{ 0dp I=.101dMb!5;HÖq$ƴ3D|Tmt pq#A.KpdqI`qItqH z-c(iȒv4 Ca8l#] 9x h߰@3 QFkƏs2^6b$|7]@0F,b#I @gt3-ng`[\۔X iv# T2̥XIYSff$wp2CJbj (q*i:*C+n @6o8rd4O9UwNOu^^6PVI=Ln|k07hMdo+s*4[MG08pUݼj3E*]Ϻw{;#!77~9@ZrӾQ<]gLtUC<ȬB2e'y.P:рɬ+NCws3 ;qNbSR>QlXwOm1u2#ay< h9ԗC*=mIS]^<Ȁ[ )-m빤P?Tveu(=sUZ>$tE^ѩW|%cг{Ԋ3>]z_('RC>Ui2KTVٞ?P_ {ql[\nUJ*? aҔmSN5%@ÑLhaOٹ_:W6:Wo_ws]z p61.Gfi%+Qgu1!Mq(0S!.с)'n-stil*+Fg͚/Pm%rՋ{An㠐c2ʕ{ncg *IL%>\ӳXVȨ;B_[^"l/灡*7Je'k N5?K^c}^p =,Ak>S9_tx , Am+%gڬ"Q7ЪX$Ág|QbyI,Y,'#ږҝTm"TaH0E~VNX!CT!p,$lۣen  2k̻;z@e^ m?RD$$5;9O3DSx{Aa e9߭CKSRnZ$B$D4(~G^`2ބfM$m6\R1 _7sG9ʱ`hVT)֝؅7?o2q<󡇖õg36';SZerEڏfݮ3/9O6n)y% y fi`]7_yJ/y2qVμٵ8y @,VKˉRŤ-&:WT!($3LGsEWu;gm|eHϾao߯9r,'\p)zN%$T@zԣ\4(./1\یHc}ef>nۧŲ(݈LF aʤ0jd"tt:+c>vQ5N)}:2$dHmDs݃TF йږҝaܓX%rK|7a "0LٻQA(e)BBR&P$TNgT"I-w 6A'MWa1I<VVکDK Qs>g(PAg~AVh&9t(z!pKKvt;DGL'L?~|qٍfjBCp Kч#)z.ůMV=ö\{}f׏8/ fVc= o@ޏ hrnc>YmD9&1k-Mm}­,ܵ$,1RpHًq ېˈT]{WqTSbbYuHc|c[e6"0c+y<1".c 0#ۊ2#7P>Lzz9؋m' Q*D>C%47LN`JsFrX;2 CH'n$ 8\G hdž@x+}ڡ%bcjv;f̉6Lb7(xI]ЛijM5mӝ`3d:C8t,Z5EO9GgtMdpl |5 9MkQ=,D^ܳzOhq.5KYIK%>:j{?xrY@eaҏ߻,&5N6X>`paIc45dYkou@xPSB.5 D,ȵf. kNu]Փ?#XtkɆvTĤʖ򝛷R}m(+NѯGE dhl 4!QSk:Qٛџw a;GRLV=V e & .=\MuEmuW \hiN-mKKkvc@ QVCTEI׎]v@F ÿsMBKo;^gij@ 3U+BBAz8ђ,I;_M`0@DD]i],gbu3 4L)Mm!ɼyTGH'[ޫH1F9鑎'm-qP +Evtƛvݣz dFbo @B)FDiOr'̺mQn;PC}A hϿaOѶRћ%^ѧST (P@zԣ)uݢ26YLCGBx cs+ zz˄Gbua$٘^C}/Qfvm)V>1uВ \p{ft6Y6,6ݎ,c3RT1g֊,#/ Rh/C02PG(<l|'ր=xQɂFcjlOû+"xmFO!PUʒ]]S!4DJj[[T ֌ų56u4-eP*h#Z^A3gt9j`J1ikD/^sՇuN}͡ {MLUIG֦ gcbTtG dIcGar\xhF!$l &;KI労⊧GHK#ar Oɇ2Hɥw, &g0&Ī}*?CnG*r)dC:y.uQd)h#<|τN֜3-D+_WfKP{0TZ{玓6<ǹGpP-ÈQ@E*9 jӉS"{.RzV(̀22J)Q4jxYjjS=oHz p޺[Նl"dj{'C@ޝaTeYq@s"zbYGrn}^WIs5jm-2DζZ+ڭddCUg(JN3%AGoT)c bݵ4,v#"ݝ>;o8@7LjaRKKNܡz?3-v &GIL\Zc;փ$ 8Z7*N3TfyՐ C0氐DNmY` T4M5<5ʻUhb+&̠ߞadVm`}]wf/6 PzN^ cⷋC٪19!$7Wϸ妞p!#Vi~`E]O2 sܭ}bTK7>RAoq;LZMoQ$ ̷ٗt6Ï M![!띊TN͐ᄝ.P!dG~Ir(Gd/ʺ٘ ҳxҢ j[hT(5jarY9+~&k=e3*AEi4W 劐cQ9(Qу?eϧ?Mu8H{0 B0)d14?wlqrd5# ,b&PiQ:[CډSrܕO!ހ PQҟ/S &Ju@mKg^Emoh-45Cy}@+:鼣;0jK2g7QꅚjKX4s۽S6Ĺà 7m`e!Urp]Bzfοޝ!D7Em|uugaD"z%NNI ;lqA]4uИ0XL!z _j1G&8"t(f5* qìWuoVyi#gZ.7$5SUQ۶p%3( +3,L^/;Y8\!t ք+ݍh蚚*Y3 AsTj!CGdE-KG |t'<^(8ŞU A vQz0x3y-g>Lf8ͮbII}[RDS4fr-[kWQ 640t]'hSooK-yF*$ZŒM_hi,cs4ɅʚfFqe\M {H>I Uggt꤉D?&}ߥyB6A5$3J/⤟h5U:Η U_^~7-0AaX{jmm}u䫛-땬3*[juO@ Q@iI߻/MٗmBeg0@r3hq^i&v]k~ЀhޝeD}+ B z56`kfuc %`RLqvfu'yщOR͝jE2aneC0 ]bc8cZ˴'ޚ[>f6DDY.]56HOiHUHEFԿ -u\XQI^hSU&euL"e(cJdL&,xj!$.M*b߈d$F͋s|>ouK8 SaUf0jdռ1Qȁ$ghVI=X]Vu?01\x$KXUlu٬{ RiR=d҆Ef0jog` YFiiJh/b(k2HC&C$ T,!@zc 246 0H.X dD&[*4J򷍶RUh~c!8n]H J+iAߔSN`c@H2)!Z. I9_ ?SA@gV֗%xeEAhm#}-hD};r3 yeibؤ3Ї`6gc>ꑌJȩ";ӠT) yABF9YTR9lzvdёS2_ڙ.:ҰfL\26cm!Kr3(bz& VNH8tŲs BI.D6ʤI4U? pwG>Ma@ٶ9',1eO b -p0퐫6WfQt]OOuiu=g[ee1%OosG7iv\,>:IMK?H:ke{b&|в .uߒ&]V3k^@!w0"aN0(@90°v, E:G M)EoO1Ίs~O]/>Y#f&% z`s}@f2aNjd"lgȨP L5'jH7A;M@K[sN%z#t[sǍS*\7^I РAvGȔPtⲚstjEɛH2A+]{/LO[e%p)ΕÒG K/_9mhxјl@ /2Vec4{4ٵJ=Xi2}-KԿ]t+/ɷ:@=.F6ȋ'W;J7p҆ohS,4+ބl-/,PCfiWsk9^yDʍw^XnDJI&I|)LXBj'>%3xtB qUs+sB(]vZ ;FAE-( @iIШ`0HSKv0,&QMp T4K -"lWd"0%솂mK=-\x؂ Z4ʀa6a6TaVeVTaFTaOe&QaA wfBDp"cxV?vZڒvRa1 ²on$0 0 06.RXJui ~Qι% "ݒOh<,c'\E&r0Iڧ Mۚ`d/[SnTgMftgA]Dd!"Y0\1!6v_rqw~s dlD`\JtB-[d6Y;:*;cII߮d]j"o* ZJ;b.]7M#5m)%gߔA(ז\7PXFՀ[I^*mЁyo^cٝϫL~`t^|ͦMW`;ضvl`mHؤ;>u+[X6dPwgR{:NdN pԊnx?^G0T"5eC Qzspt $9_Wp }oĠd?P@뱐gl;W]CO_ e窢R"3%6Q(w+|XaRc+P|`F UPe sEj!>LPE8&J*phKwF!$&\"hzmY$2bKun1<S  ztz "qЀt̐V] 8L~S;Vb7HWcHҾ\p:5 `?I'r*_"*bC֌x[sq7Ƀ\Gv7o:ݕi3TA2f p#X&N"hPn\p[{Z ys=J"Ԃ5Aj VTj:( nڬ6-@43IY}|}~ 7MhfGRx G@X碌WhrK7D2v Ӷ1˪0H.曥 U>&"mKRX3 0[1aR]:_PMog>9e1F7m VN`Sic zR.mKj; ųm6*h"l˹X $o+MPiѬؔa#9Ķ(-Ҿ (#ǩD5ft,% eDdMϟ7H}ͥkqdbyB[Mn^ F#d:Ӭk.` ,`1"+U_))N^2YKt-0;dx@*k|l$d$i6%?5&H@PtV4HਃȨQ`"z|Q@%bk &IǞBsv*S+k1”#`)4~;:#o^:t (h;PAyTFf7QbwҘ XE F?n0lĠp*‡*Ga).ZdY %!&"(JˤT>S.\|tjs@ ʼnґ/ҕ˒]?ǴYԘDNdA 2iwiah@cdԇ4h|&DdBcN8T6F"__G`aJ ir~%+x/<)Mu]͔lʟdC,Paå$CDILTپanExh,@&4Il{GƱWcQ @\6ʁI!?)i|{@p5 q! ]SI+6Sy.):2KS46L\3Msd5Yu㮨g瘞B_z0@?M"uBjЃaFaOaFiY%0/1 k fYBBBBAgH\N۪e%:OWrM1Cbea @@9Ĭ0b *3IJtJաdB8M*@qa붑To˚Y)jK:m! Svk~{NcB@۾)Ўe]hǣǔ?EN}Oze]s@Ld󦀄XxK0;HDLL1)DmJ'f*9M9xJV,|Ԛ\/&6LrEiœPhkXXWƥG:|v6FJ1_;e1cSvGVP6I`"&θs@;*ə;LɊ$1;F`¡-x+FlZNjx\!)Q)J:f-R2W>;B؏CQƔDZ2c =$@/c 5;Z,ByD<瑸D!a3R7,㑮A)*,bG%%/B-Jdҍv+ 8Cn{IȨCS+#LY>'f"fBa.6 k"(5:/52nL׍҄&z hsy瓌z7CZה3#%JM0 |jËonqԉS~tcHUm2o]ATD10+9 k 0NCXl}37bzDZ\_5Px N޹T<63kd,L3gXbamTbM\]lGkotF#n4 0jB5SMdךy3Q k͍^쏾"@hɓhD,QO7ŔՅenOL@#|M<=+Mɛs&n^fl!te<6+%Ygw@@2dOhmۃeTl,efPB@ڍ5C.U$& D@CNlze|!ms\vߨ3n!_6$P}cwBƔV@$ߑ5-ID@3# -xȡCKݙqb3j y#_wţ 0{cǸٝڝU;sL26j LJرQ6f4m 'q#XÉYa9Tyx9(6JBK͉^]{T4L0F-7f; 5㼐Ǎ&fȧҐd:攥"öҽ afTefe.ap⑉uIfaZ_I)Q.0Ks1,U!l!B b.JjNqv5rMSM;eqH/xe0< f GR˼%$ԍ%\!JL$gbUEz>gCWG>fxqF껶Q˙IwYL&re҅M*aU0^#!a(%CnT'зa|8k!;ogåRKmSTN?mʀټꑄLf)ihNmf1Ad`u j dpE{LH3Uk/ l:lBJ-hunz/ 콥x9V2SJnn=be0y"f}J$-g/ paHIQ xœD a` =QA2fJ*1 N*h@o2cv2X!vfjn 8mkSv|F<хn :CJ}qF?S6@ARJA!4![Ab9x+y-C'uT>]&Q"N0P<Ԛ̋[ +xϗ1 EDmd~tW $r5#DLĴKTȀ@7;b3AәXaG9fP-f{-KRYZ;,KɃ9Uo1t BBAz8*E;Ov9_$ &ë;ld4xrfűtcfT_E':៹;HYᙦx4oc$<`b25œGV$GɟK2`ihX5`%# *W9RCܧc1eV\3<8aȘHzv޹2寚vox7x5JW>})wI;Ūlhl9L-2"[;;PcJ3]4JpSW%M1 87 Ke>(fx݃o VԸ5BDZ^ϟ0 ř֖MMU=O8@Ҷt lfS%wPzuƥ8j^ٝ -&UͿ@eSn-b* Q5B~uGɒ+*Ths"RO\G74-(/Zst(hn!d2H:QxcPPq9؀vOJ hȩ_Dd=s.wFs+)gaZB#`zݟbfۃeWGD;bI,74^$7BЇ#qՍ+1 jxbF<1*mvkLKoClpI).FFCx G, 2:,'I 2VO:j՛ufkd-K fI[ZY:?WhKyAAeםأU*u(gBϚ_n$}I5'`45:A겭/jJ՞*P ʤQ$*:nhVquC8P:͖hIXs3|kyB6#` CKtZ)%Y, :{xˀgl֟`N<Ѫ):,.z!dDWX ,P,*BxAI3i^FӰFYɘ6ҤKDŽT5dEmK{rFY 9Ȟ- k0FM)ӽm$ $+ 1S)y᜘}kֵ&}fiTe '0fF6m9!K$FH31e>8tq$Le7a}4z~]=6?h &%"S{; ǩ71ډ[BwRl!*g-wB0<`!RE iTu /w]fƠB zwX ')fyQ!vFz!NyQrVvW ZeمRJ3N`2Z?\dbRҟ$jͪ&M12miᑁni3Zf9&EY*YPt큉8 ӑ݈{d@:e)q-Ra5\-ӧ='kBӁ_}uZw(a^d)-G> *&?/iwC` HvnC#iv5rPU^ ?D1JILTyzQBmT05Sj HUBLC$+L-˓\g5{@ riH;k5iTn/V0)v:Mq3e~Mm'H;qéIP(㞬mM"1 Ëɏ]nK29RښF92wGSA&0 [Vp`̯lii>4`W-KlŃ+cL!#Rbxݎd.K[Z뷛оvg-6DbNq)U+/Z 2ު4YbUn9NWM.S9&;H@p&e"\dw-j&+0CqLVM}&YڜWw8(PC_/cЗbIU/]{gnnc,DʼnB] :ib/fIص3*_Hv*,ʀfknKR[͕vW0Azf+$YLsFBu. f٦1/"}%R_1h3 Qq!m#LbJK"!~gh"eOiv0 }q3ڲv_*j2UaScdg!zUwq&f0"ݖ{T~g GwwúNf՝Ng#?jN4@M^yɦ2|Rm4ft l P 0^ȅƩaN65Wm^~yB\E.0xglϾaFavm$gэIe{-ϳ5[4LBBBBAz3.N4$yJh瞰Ft~n6a[J\AtNF,pAX̔XԁZ؛AY$>$($A$>%B@m)aY̷4ה`(X)!p5 eSX` ڄ[b 911rZܶOvc k 3 Օ^`kmgZ˖&ogi6GJA$PH8 ik,K[7%z"sHP6;pt8ʁJ2)s%67t@3 y JlOR3ʣsrV?w4#srV$vU0Wꫥ (a- R\-wNo|:ґ>` aGo/S#<"GNJdtnvVm.#`w%*ӑa%+[TkίeTwUE,K;L&V!Az%udk_4?Hl{ `:6>=.Ga?!smWT7.:6{!zh*<7Vb*탖C=3T ^)Rq8#NR" L5Q2x"ݤ%\3n+G#K蹾$J~ ZI0[MeezeMtqc$%ű~v[7fG &c@x0va~@Q펄\j{!~_=_Ҕ0ޘ툻ύqj- [H_⟯_f"oTc"c-P3j11),ʜMEʐX[jma䰟,A@nz-e؟Vd4=H[E|tj -e( † mg(".NhNU$:ۤ:: /B }2  &>dNY Fs Xcdj1m) s,}kcstRv٩>H"Ξ11"vicX;$w@bJnfU2RxcR`Ū:D^;zF~Jt_Dgz0; (-H2Ty#i4thtm$ !  H' *2 M ECt}vxTŌL^:_`K0=`cثt踣3U4F &.@іʤB5DU%gyg"ˈXXa( Oc5W._unc,Z l:M,h ̃iTw`ULPJ FsՍ"F9akNHi`xhhIoS $D٘OE ~]Ԯl*H~mCq}#3Eޚ_@6YYPL6"t:dS5QDxUzd̃Ͼa/aFCyW.=U:~fg!Y+BDeԧrbKq-@k 8Y!2 ׄߴI-FzRBIhAf(%hA#baֲ *uzb3()Uzj uI1%^j?h,H́V!b q k%̊I2[vЍD5eӊd]a04I 8'J8Ũ8_8}@|#LDP}b> mBdh$6Y~UrtL2I:UWS:)`xrPae]F4*EQm̛k=n뢫ݶy-Hu- B.  5~5 ccI9QfGfl)Ns45e3@Pj@ PA΍BW+RQEM5CUؐn\{,Kjt!jw W@)&ɴKA846COHCc`ⱙQ/K],nO/pu4Gtx#R;XXe^*KUGkZoSvO*c!Az}6m=FKo6_؈,<~K"og 5p62u5E*f:kr 2kE,gR#U:\z,&\h ][HfR> MjT4w~BGrLzAlR SR1̝l@& R8X#'[x.k1P7(K+N[>R)?e2R"iOYkZv,hcA>96HB`k|@V㇪pu/y^C6ER?>*Il^Z#ZsqFu݊Ikp'1.=.Z(S!$چ/y͏i|Vai5]P>8hbȍGg2XA,]ZϫOs{oq0l$v1BoVk,i4A6+wcqliQk&*&؅NPJP![-Oَ: ` ` `^=JiL8b%R+sv˫Ϗ !b%d@L 1}jC,K>yTLl^LlWC_'T7 >WzL3ig{Tw|b?Cؤ$XW~0Mā:O|J0 8Ļ^G8oehQL.4s([t!:XK) o6[~Qt1b\(7,WRI!DRʹntn($VI6rވEbȗtV~Jȩ-ȏ2zGJ;Zoԑf0QҬT`bN:]M)!^i!}ڢaFp1%bl1ɞ|.aiTFqʞ<ՀTXIb{nqZiX %EKghDq_OÌ6ů@ݨnE]؁[-n3N|`G2ƕx7 9ud1~D`%zA0r[CunήPYz(] ZVPG&ZDZ b "ug5.]:/&ƌ3Ky+ƴMX;F Z%xa Etf{o.Kf1yV`عֈ+C?(MzLNʉKvj%US*#nSxU5w>9ƴYm6> hNvjuܭR+%iBr$zB#>8| Ŵ!(sW1aB|I tJPhH+JFɩbZqچ&o20VvJXa74 1T~BulM#2O%?ю8(=eͿ%:[YrT֘O%)K4x/thD6IِbG,W¿zƷRh]`bn,Lm0HSG-{ zd|ڀ5&eN3 %):0& #-.b66w2y6iv,U5=:U1ѪӔ0buqEO"cÕ"gp GU{^Lbs AHp0Z֝*c:$oFg+ht@FpbFA a$ZVX~L 9Ds&aoq}Fou 06Q lC6GBBBA=+OFFyn͖Jc|jL%H̑OiC9VGֻ1_4+eyS&]IIjE⮻m.}&ە4I 52.I{_KAl^ķbm2Fh洽gIA2(5ȓ|n7A-2N"ȺLaEmݭ&0P^IF1yZF]o'p,2JZ.Q@E+ƪ`Ȝhf.pZ++Fֆ3 ¬u w?+j[ڇE§u!ш\w YY5iߨ-~2z ].''jr^9&Q@|jV!kHL27Zi% T,F2J2RS7D*vJ1Hh-IZ$f:JU)3wbgx)vݧ]zjyōUR3gchd2cIw pH S XG*ڣ 1RfUˌF?729hsP$38&4)OK4uƆXTH PJrO w&$ob@*2ʹڋƍ*<[^ Dy֚- BZۮ%7c| 0$f^&x%:Pzpea8}6+K&dԃ`~,VUhQ6v_ cSܨ4HF[QDqQx- !kټ/!*8PmN|OXe*O{7u_,ɠiJƴ{cF_Ds͙$5\3Bkں?;>#!h~ԦULSo2q8KXefzݧsӹ~' 7 ; L4BfffS)Um]t.e֋$Υg&g K@^SCL~׷6XXB@x-Pٛ?rdlMr K,<"8wշuV&f% 64?Ȇn|ڄV/{\o&?OBfl^`̲U֢] \j#Ixu K$00S!j@L ڀ!c:Ɋi1b"%j~j8Q3at1$1Y5fv8gߋ(scm5,ҟ_On^㵣 Q6DS 3I6" yRlxY2#Y#aFDu:u33R:2ހu8 ,Fmk/v4Ny2hhi h@xH,Vt;Ìcԛ"GX7:7`.I98is:駉f,#<0 @(-4rO]ܐ5&g]@i422D{uQg(m^vMOYi 8Ѧ}ߑ/u$ ,=T'r%QѧBuUWKw`a8Z6XX-rK{*S-!'y2~u/{:9ɝg$W*2Մe(P+5m=cΕ 0mv >HaYbMߣ}Yt)%I5JԔu kJ9F$uwaa5ݦY7E4 ;dWl eцmRڦ>Lc3I +эT.^ɒ~roRF!I栃aU\^BDk\LL(Td s`9.x GЮm+|ŠMJSTN|PF3FϾߖaFRT>@]C(PAd1/,N5=xĄ7&*/i7=~&hlj]e݆ee޴dM}1X04@ۺj%<#E9eCW!_ęɎK]sgu<ү73YXFT%kb&ѲaO7%X2$ jYҞ5^c)SƱƱdz 9#3`xl8Ɍ Űh:ȡ<(sؐYa#"T h'? hg,4 A0hV"ũ&>BjXv(NNn*_]Bn 4a$܁Fa-"L_ c~-:[CX1>C `:i4<>D c*bR>T/p~"[▹ Ƕme4o!MhE;܌[톒mmo(Ճ<҇ֈPVuc['VUy:Z:"+ =&6\o,GC04`H5h{HonlbeΈD! oôI7RUv>cC!cK.1;6Dh@¾'&E9btcsAV$̄wM} j-g C8 QM t 'P\ZJu'>a?q h ȵ ,wOosM"}֔af}(0JfJJ.6zV("aC6(UJC!5+} m;RR1^(F(72,F_Z' cJү-/VQ17u?fF'z["8xf.BR> G+،S^|È7>Bi@ĕw,KEa*TDHofȑ`.ʓg 8o/%i#iF65GKVGՄ0:Xy Ve!HVTyt chI!gԻBNK ['~dFI+&aHaP@sfaZfULZ99}7Qm̝b#ȍ|Ӻ97~j:aroЄآw= Y0۳蜒i)`QWZD9x(K0.X sBڵ67m?BqRZI!Yy(f-&)F5&jj&ZT@"f@zr)sܬ0mAeUZI 4PO:?wPI $ kR?[qMni$Qs_d_&mڥ CtizLHsɣܯo5PYjz5bDd2X^`3cHn w ϗST?3)z)yS 5Xdcy$\!o"2j;Xp I0`%SʧZ=ؤ>Y@>LPn w(`X~ ܷT2ةB7- Ȃ@̂AtebD"_Z_CyDq:M<5GEJFbDOݶKn^P(C 􎷚%^nѕYu5Kӽ 8#(IS@ϿaCEفm Q8CB zģƘg n/iawcZ~nkE)3>q+(F:Qaк}+xEf0WPHJKAZwlOlB)XvJT_jr+hV&wI',-x))ҜZLE 02“ayph;)6 :xU d1؝\Y[ x֍\A?46^t젯/uF3I~%IpWnBsǼs&χó@Hh*o\"tz#ih؝~v<ԧ]\eǑxd Τ䒈dE1qC2!]#fNhxŔ3e&tr̠+..!LT=&ֵP1YlIZ?*>{? JjAaDP\%:OMkΣ*<("%!I$6I&K^h&:J5ǦD<\L,uUqGmѮs-ީսr\]FAH|j dL!G?lg"?eeRIzt3'u%niijgj='Fvn ic96 S96 mP(5J.C?#cYOr% AEɪSbL8L!I"I">(x4>jJ[3EGi-JDbgK6Ȉ%igc}"GsC=/FMjfD%Pi^u;!}cJz-k4O:,P"]Bl*[hW hUZ%$g e H6sZ;|á$ kKSiE Yfw2JR4t1kp7IÓ9ҨzmJ fI\)6Ja dܮG-՚ݜd09Q0A pqG..AjGUi_0LzK:nLZkFɪt4;EO[MB'ꥥf*z+P@g?f2+6$VIP{Ke:WǨً6a:uRG%dFv!D %rePdz6M&7 X`юIJZ&:b~Yr ،bɂpxiHMو:_:T{'^20L1MOa@"$):T72F0Je%JR&@p!$J+&FtʱJ/&FrcT姅Ħq_|)hVX6CaX=k[f}sth9s `# IGBR,SJ>TSܾYoJ| b4)XLb4CƜ4QVt?CČt[c.ܜ۽z{Ǚua0 Aޖ[}ҘT_W4&L Adva [1DG x1DG K3W Xz!5i@>BeyUN]d@GnƸ #/ =-0|"9E "b[U:@49#f;^C|PVJHkd*vtR&8FPbrWF,)&%O\FL9I55WI"]Nj{3_˔*^$0KYݘtjjveE <d,Ra ˚a,VACf.t]ʦτOTYMm FHǔ9ç*5#f -2Un{o\vS2ؿqzgVHiGjFd3yUՈs nXe^m8nT5cu։4=]b*ǵ0-;@ gmfX h4_xG#>-05R4}oeT.ѡز[a{vׁ9ιUzrөq!Pƌ7؝Hh~g!zz^Y-:*-j됑6v$#}O}|)%D(mbI{ަ&ϺA]Ej3l_mNl 0@g,CȌǰ-0zxGy*KuYm/B|dc|u9EGGvд;͸ךk@Ӝ2S'jbxLMޜDC9Xa͑\R=h.sCAõ񻤨jGM51vD%>P@ Acb!1ZiSVxh4ulڐh ybP[H ga\nJlM;"$Rm5ϕuta\jNvzz;P@z˰V dJ2wSjdmOm#)̑7n;¸x!R8de3jllNQt2["7Oe*P*HWu%v%u }cOi {eݘ#쉀%hcD hX|xqG֍$o23Ǩ~@ ;&zAc)t趜*?RO`)fHUV %Q-sL \n (bpA4AF(ܭPB;b`'"achNm1bDuV ֳa>bEGb"l1p^L^fN&\/0kBGHqD*F0ɩS|f9#N,)BhP¤,e#}MıyZιw !N+狴RQ!!=/6Jw@ϒю9hahXcWVIh'Fe9 "fzǨdy͡(}W VJF+취4Z ɔ? ! c1p2Gi)h#*Hp=` PAn9K̃aVafaaTm2%ha>LBܺLt.b2W!@b%jinOg!v49HgK`8:)] QA\i^En/5»Cq/bXs5 Wi,~Nb폐qrljZE&l'Zj9g.Xy tyqe5Wo]W @){F.(x0pkI_[veRaZ5*bI܅$(vg_cHdu>/L_N0gN0_M1{mJpD oSwZe KYLi \#D@&H~n U5hf 3(Unb3aƬ#BF |+ u<ҡ< Mcg(4lF *c12W\7 I8s56?$l.T◬E#ŝ'BH*@0&Ĵ膦&/5"Hn33vUҥ.:NsFq-3%c 6) R.xy9םLTD1&X7Ɨ:*Sn3|4ROgP{RF'(ZdvFr)f‡fR(ZgH+\'И@aϲtnQ <5f%hYXָXa&w`w'|r1A`1aJk1"v֧7R @ : Hv [/K%Y%9mrIVaL̸"@b.ȊTd:ssorPZUR bh5# C)L\TWHұPYY;Kb:ECu-՚} oWw=X5Mf*=K!نd) u.MjD20K"JtOH&*w =D TIb_.W-",@o[Q4+:IBS1^4_AC=23N^7T6*Lyzl-,F#L!y†\L: v=3;͙IJn̛%X<'#N25_'e^aCXJ)U׼SYO_VK<1]`Tk%}vWM[H@nQ7vF={ T:)7Iiƫ8詧FLw~Zwpc ,=R3, ݄Y~tF2gO91iz 8<@ r|E37_h=/4*CPGbR;$ֿQ#~✆ܑ񲃇jM3Rwya cjْ]C0?h, 2Ea1-TZͮ]T#OI b,Tf*4 &&0 j Bi8+ O\wdq JT  ,5r-'{#)aI:X^~rFfoR[k9{<20zL]5vji`_lPM5]4z{S949v2JT8ڞDZYg>eRmAEzPψg2c,@ŚkT+{o)331M$!¶9&_dP8+ 'L҈eO arΙOF^EΛ?!YR ` Ա1ҪL^#P; xHfԽ.2UŵcY/0: A84XAzWHc8ɋu*YLef7TnxSAH*\hOfX W9=ؿI(灖Yt(,W+D:aȦY"!՞7: Lәy&+«Q4grg?o=ז !7rA=8%D vwmaw[ I"B%<h?tW5O:.e3dΎ`@}bI*Z)} _tAv.b񏈃[τYظEJaAEe IKSmjD}onvoDh2JYafiD\ RGII H$r%N4X[߼޹i)t/LgQXzv[j}]\܆zT0txT[2gP8aQ%slX)YXOqdrqLfL%FZjC@ÆjP&4}@իatU1yr1mLғhLZ,dya,.%ۃ,q ˅tJ$fo.2Qu)[ԑtZ[me eז.a)K@0ELlIzKzӎm?2Ql!5TwnDݷ"_ЙӇGAdkk1Ui3NF52ܣ[J-# b)_vL)r>>gX( Zr95GhhmG̝n\jgvCpDڲa=5xՀXx5JJ-.n#gݒ.KMx6yVT4 Nliݎz=gG{C`_k2$tF31E N~7 nX1Q8kMqd\#9E)#Pe1~(B1n%,cX$OTPIS_sAӎ4Ҙ#;e{ΠS{2ڌN:Tə#&t:fH#ͅ΃̉ͅ_џՋWuM$elÞ52l"Ӷɂb/ 0pB0O"Q4ș+.YvɵzJ(O+Ns2]ܻ.C8aPxξayF]фZcMS\n~Ȃ؄B z(ytT̖Q2/#WC]~,ߘu/ܖ֘Lw0;0%Qڼlu,ӱqq's[SI!fՎ C "Ma1LjG`︬wA:$[Q* e{MiS֜` ˵Ǵ=.eh2hF9ӢG)(dhgvZ:D?oU]KdȈdcZJs)d@̣pP-YhtbmQ\*1aBu"XnuA݋q0ØIl_TcpNP/JaAh8inS8l> XCCɑ9],J>ɬ^Ԩ&YVa'0fk)ICkOk'cщDg_dx zI \S'spNw66?@ M.XhBEJtk8Ь4[g]DJO]s97rLLy9q̞UK77 ~D<kqn'S0WLJ9T.kB=U.ط0@$?̉ 1%bHUm?sUi%S.%3{1G1JM&U,<0OԦ(ec #&/rՔ̷ohC84tԡj3)u|f2(VlJ6~ !QGñ* 8iyqĤ(U#&ߕ1bù)ww7&2]B8y:ˎ֍b80 *-vJ"QtLQMLʐ($I/+c+ A4ѬaFpnD׬AM#ػ"v:T`ĉ! meIhA\GS&:&sB,"2*iPψO 3HXoaۗl2 6DSD_ծ_ MգW(2wZ1+khNJaD 'd5KC'bJe[` pPr-ԇ‘@148}{xCG-ixBјE$n:G%D[A-α̟ خ6֛5jFw@ gJ$&rяYc1HߜA2$=GDLR*Dǩ2<[J4>ħJQ#2O[;E2Zz~Vvȑ{jGa;$ϕ`B0 'gWFyUDn$0쐲C9M*m-b<%T F)%]|AO RJ±ICq/T48ѬJ 2bOqṳJGIJJ6TfoMШx"$NJ}6мKRO)YЍ*ze7GW=er'"Hֆ_4D,` a\KDr_ fcVe}&qk3jd8Y5dz8$J;jTeLq׉MPfdU7;>~MzSw) #x(gLNlV8ȫ-S KJ8uhMhMZңv-g=(}h!tZcS q$SbT6<QtꅐFY?W|lJ5RDt0ݎa#8Nj phϮ ņ.!BCR޴hN D)ձ _!8,^^,e|<~FV 4>WR%SѓN hEƻCI@ma!O86~3B$5h#vOڀqPyhǗhHՊM 1o,xNrUZsZZ"E#A[Trz똱DV3j-MMi3'1 RdDfB͗d> e v.H*2߃ YZ41 l,-WOVW7Qq)NA|cԜKNCRh$2fB.Kb{?W9u46]V1ի.eז!,Q$؂tfy(%4ex+'5+ݠƬN9h2ͰбWt &c8{NA8DH3I Tܭ~1梓33f'3*0}e [Q*=w(d +F3jSz5ޙrbfPߠHae^Ee8ϹF4,}TKvk%F꒚4!MLtѤчbH Iɣ SZfe9.I][eeY),nV֮I z8%:M(+m5$4CD.(d߰ m[&GQs۠W yg bF(49梺aO a#V~zɾ|Fh@ݔ$ ؏Z#V'NfHYRo%8cΚY,FY(᝸b'G R{@ʼ;qG􈳁b%`EfsBd>Xq2D`מםu:&9T&•; 0'`I#,HiUF\iETcEF?ZlGm8EoS$O#)b[\bM6%O$TUqX ECܸԈb8(g]fs1*`+4Ω=}CTbXXJK 0fƍDD1۳۫|:8ӏQjj"zO^%'&E7zoDf2+IXϵ5ڶȦ2ڴȭcFgz9v.N[Sҋ9gVCq0FJ/6f7nO!|0 ʊz%ԡ (BZ@mezFQn Ҝ!'&"hw͠dHYu&?|ؔR&#aS2q%q[]AW:Omx~ `qf& ]!Zى!.00ĄoT{֯e,hv$z4eTN;l*'䡁R9ۏ@˲⪛V/J3E3fU"Sq9jzjl15gڳ^6q'jgza1!ԨU8b I'DzJl]J|/ŊˋԲ!q*v4TF#2toOM<^]ѽ'ma O|eㅱED8 +@(|v L&0 @P"3=bF.1cv%L<.Jq^mv&8H] mYLi1G3=P+ e8 g$A5JGc!){j+ДM3h?JXh-l,l4(6B5 t]0UcbaijSCd*'iBMzD4n{kM{نkR(9~t3VͩlTN Xۿd}HOTo,sZmGf4 HR>qsܰ+ cݼP5X(&m*6EtރN2DuD%:U_D0x"_ oYc$|Y%~:/=*u hAeז$0JtiFX[7'rdexbw6F[2bv[7'jdebv:DAycC_N1H&b>0`1} /b?"u,"u,W("i/j/z埍C*hzJp\Ҵfw#I43c=dpIT,H,+!FtRN CcaKV_ YM R@^ ,+-g^a8E5̄OF|r~Rk -N&jk8j轆l㎥ kdLQTɿζIgR|$  ҕ/{AY)R7U|NM i9rqz+?&Aϰi|Qy"Ȥ+Xϓs-_V6ayUF sds)+q1@z:M(*d[G.iHe/oܒ=O P=fT;ǎDq3CIv<䀇ʬd.$ آ@PuY` mX+]\ If6'NXHY +[LvU$VE;oz R2nQa0}xs)ԄǼjP.`C)}aw^ _Oƍ`N+ISks&JkUkUeG`9F`-X@VeJ\yN#IJf*q5B[2ZQտ5޲'5Ktvncl$ZFI$Q ^nb o$bˤ`EC¦ᙇ,_4p&MX:,/? Qݯ(Y13^)|iixFޭWT8 }եxb LY)Im16Zb;3 ex+g3-v "LW<Γ#OD+߼^붡x̃$*8vˢSJ卛8Ph?אRw>aiю| 0ҫX&i6~ Q%7ڕ_U!X=#TA>eU[v*&~b>3 #^F H6Hdda$&m2Xg>P&8dl,f~8dxTIQTi"A!t ՝)fD4 ,fNQwEtٴ0ŒS27IC1q~߄5t} G `rRfݥSx'!掷7Ky(9s= q(WZt{'yyaڳ e&}R*j0I9R*uL.qhmpȉCXȖZ_461䊫YhO^Ŧ(uD| |bjaU#D~*a 1&mcGuޘ1z *y+\"nU;[Gnȴ)6~J#[Șyރ`i 3va#5Jn6s* mo93 !3#ӋVRʐD:E6rO+psH~J-UY·VanJ.UffM[=xFȺ8aY4$؆Sv]:ZQe;S 2tYJcNy98C)mY*ͷ^`o atC<ŀ!Ֆ!"a_a_i~MW̵2J׫%k+2j2;Kz̡渐z4%N4$]qp}F7j6\$ny ql) $ m">2@#)M=;s1-Qfg()PZ"U>7MW:p*E@*m&¹7A6r(BWe mɲt+ip0D:4SDWA逩va@JL"ݰ(3ـeTkwv\UH1T.SAIIomZj1*"RZz~%&p(DP*dHMKU*ؿٖwa2W2%.oƊۏPurbP-a_lf[q Ak/m%(fMMKb)'^y9xS8@! xoF1b<ЙR0[PyMpLS3k ֞ϾfeTd\E&\ťC%Kգuo)4L j@z'4d+a%Ad8#E4$Pbo.~2'Y5G.0PI'frZBҝiMnS]Fg>k[62J&ѬM%PyUBn1`FoA=,eQ}1 <.1L"IUӇ )#ZNZg&ޤM۬11 vQĉGfMb҅UdAFf4LfO]}Je0d"X(\Xrv̓ aU1|X$铜b}ǡ7wkrHɑ˞Ҡ@+c!aXf)_D0VjCxٹXX  o+m y5lJ#&(TV20#(Mۥ/SJUfYɅ{aƃ hb+@P9|~.^}vF0Z*c*|u5J*P VGPX܂fUvikRϪ8bjwYY;㉟1Q*RX0b~m\8~y̫~AөmQ_wm/"QXPX ?D`*cͅbg/^i$H Gez|+F CUɧ|z2qj|0wM*\Ɂl C`@@ q)3H;[_ߚW` :;QGϯaOa6eVVava!T1r@&Npxg]A }c^;WI8Ԅ"eז'.N4, bLbvASevhfnr砞@hcdl.V np("eŦ`ZBwZgr"evpoexi 1R/a+ YVlWCI,DʮpTG.)P\do4P{6iVLi!pL !sY0ޯtV,%٪M{dٮfR"QÀ5#A@Ε*[6"KoiF GrfeU--c?뮹C9U. x|A&QOTJ14by!P~hI1pCg葪ܓԇʩq\E 0͠&U_ U%bԔ$Z2eI ?d ]&[" :th ;l<FF 2 *}ʲ#zB&B9S$l2HYS$v@ (ٴDEKTiC?>wr^zְC4$2VsnJo2+-IVlb3dtϟV-~0@3fm/IUֻa딮{^knAzufҌW[ 9%D]cС :E S _ ` ,MvXE9UQjgrf>\9yHUg4n1Dm%$J]dQלj9 !҇4 Hh nIX;+"U Y\C|]u[g]\F]K)a۩V#-&i$ܓ;8'.hw'}KO=pI?ǻT7!l@b;Ǒ.lsF߄F/IKY QPܚ׋vpL!E"l؉=u6 ff\#dLXE\1!d͘hrU ;K#0SIi6GYD$;"JbvLT[ 685P]#BHDAw™У[PVS镌 [-`3giNKHt Z̰DYKhIC xIz1U^iWNHP9M!sbDjaoE B <ɜet2J2 eۺϯU-d>+0d\>OlWS\, @l0q@y/K{yֻw6m;QLJbĺA=.Ss5m=&O fhLϽ!p)Q `/)0!(.HaqO=c>#Пp1B2h$L@-٪1EZKLБ,QЊ~Bd=(F=#5Y(xN $?fĜvX%y8P!O$ Mġ`~EalZfW ^6  L["l/vshPgi4B!yZI8y4j@"a}MaoBqu{$f(r{#@-;Azi ZfRI,N6%(L.$b6DpF8I5i? ~dU3hJS+2_RS5laPkrݑ $܆3E_MQfKl?4$cFJ)e| VUr?$ܴ±zpmdoZk`y(~i$+ov^`+H};cɦYDvP:,-(DT7\tvN]n\6Kڽ%CV $!a_ ;o0_8F60'@Xlb](=.^ H̓iMPTyM8!כN S/YZ{<.С7_ ` ךi*ZV+14nAb%*jF9H&ЪfZ2bXBH1t+|D$n#$;Al#2Z8L6]h;KPMTͥZV&]L }|˚W~VwAXK^e.mbVPd+\o*@dIxx[kњm;_kط$ $)pQJ79 Cj[b[h]sCdTç{$Q.ah܍Gz՟2Py Pi@.E*;VAm:md3VEs|LdΥ:QljZ:DβꗢVIdփRSP Y%c3USB!*e*V:-3TIfdִAD0):FAty F0'VOȿ Grn'n)=űbc©Ag0!yVe3ڃO0*LSFLMU3&lmDp2֭7Uvsh@٬q\rtg-1Tm8Z!;0i58t.R%c1GZبJ0 ".8'ιe'S8a5t2qɌiD{9#A&1e>cmudJB&2GR4^Ͱ\$F2#Q°̏sAPx 3V jK9GŽ@ySŤ m` ˃ڄey+IaڴAN`|o b==5(Za Z\_ W0&I[gtσ.kTY[_M8fS>hXς[UbǏӉiRފ1NY4QZKDc"ȷޘFIk-+%H0e4 $9fLyuy<&*w8OldDuT1=F$4TR *-dz\5d(" r}2w:Λz3.Mb"bvbrch}I.'"k1vf/6'yCkr BAF0FI'_)LW@HYlR5cdTevtg :4Hkp 2*O-/an^" ҈ DبaviT_zmKn5#YkGF$;ݍ2a0km+ޔuW6nڞ^pe`JDc٢hR,(×V\iK5Aÿw2ЯR7ܲ_5T ۷0;cplfE~BfVg۹Q80#yaܔ}l}ϡopz<w o}*sp\-67$o@`)1%o%4@bb{hJz=RGlYf`L:4Alf_j(uEweeP!_YݿyaKF:A,J c{X ?H㧘^Uߙxq&@*PsQ4T@ q TeW-d\@F$I|n3EaB0 !\)FxQ&,b>A&,i"1d0b>!Wj$ŒlF,b7yfXl#a!5 0|:^{jRNL0m4ra90TƆ*f40-512zS.-w4_ǔ$rŴUfox@@ N"0 z'V,ųe0ًhnmIY`-sT oM0Xy/T '_!*ik8!Xb7FR00[&Qԑۈ&Q:86(qAM63F[1|u>K:3•(aٝb' ˋ^FIi&'C]2 BƪVGQ06u#2&S f 'Xv"ˮ$eY5e4Ȓi>ؒ:H6@Wl29Es&xPL 2[a(곞зħafH3zf}/K'U۬FYd ꈣ8Q*ɸ>[JABzunQܢ#ɠb;iq.՜\-6`zGKgܞ2ߟo1 mGbzF_D\eKRgcSɒeYKH-E.ٝiht| Q|(Fٻ'}gQ&aYjO}ݯr93n\@tymy7fc!8+>$'٫LPDMcM E|X%i(зcOh%$^4IM]J=X8i`R7ͰDy[c;$fT[i,GΡ,Ms'?PƮDK|:(@Mj/҇$$%.5 b!HФLY#㿒:3H( ޜ5 @nEZ]@G[zK%f:"[0Ƀ۳ٱG&nk1eKS^0D;xL\g%@!m45kؼԸ2Rj6•@L|I)#tԳpxad ~/ S$0{A;@0E@`6ʧfTϾU$WV2uԼ׀ fk0[M=kF0sxZOaU3eԮtҋ>ԥKp9s߼sDM'9oøRu$۽)#b4Jkm+7lԗF^e2r!`Aˊ GQDTH~7tUQ ] JQY2&mBu: b;݋-F%EE_k6-DսdutD>H>_D>Z,7.DA<%{Y:8hW7 ! ח={Il8ˤ+H@ǘrDcNt4mc~a9t,#' ~4FΦ%)Dcm8RxI6RTXQ7 vy"paN0ƪ?4$ ېNvE᠔ *"%)Ӿ0(ĔY$:ƴKDXQM h\NCoT\[XkǘzRLn!4s,mDPf.Kc~Y;8wwVGZ֦9KmAz?NJ;bÇ0.h[zp̑9"=!j;_`M鎟gꁓO'U WqjiĮԅ,6J-%k)lWMJ'sOrcJve*v+W2pqx5_hj^^tfԌ<,9$!{dΝ!8R+qR[oR@nAj.fzD>lC4jtf`Y.9ə0HR?;L?ew:d \T=L[]VHIΙ6"䋺HpiR}-藡+ Ҩwz̆[2r&ƦnY/!a@"'k~LaS-_ūo)P8HީU]y%}dIR,Q3xYg&3i} ӁPF1W}!m"*oA' ֐w! lJ " pO0 N2If l/AòR5b=a"*4*'^:2BX&j5CE3et8 JzD*ntYXv+z1]推HV~b(=rѡ>.w $/3F 2&`S:O 7`Q ,@>Q&RQS"(eqyRٔ*Lw l8Wئ B^[Ŗ_%ԵHRcx7R/IJsŹjۧteFժ(;pB y&1%V<kңV%iZZzI N $6t㔫JUo#Ѓc42Nvp`(SƏPd-Vn%%_Uۈz{؂hc3v&,״l7\n1I?p 9W-Ɇ‰ӃL(A01`*bgLg2[YKo#̋I K^Sy<\Z[aхlʉŐpCytǐ@n64ޣşd7_\e¤lښC :$cbNR5K֏LX$ ?d|b>(+zV0~Tǖ%1i>iu5d=ZASˤ,)8J9X$&u.{X 8oJ55 EOekBԃ * *Qg**di&ڹBj5dK!rڻ!;i8;Gb! `$c;ѢL7As7glLHZ!bl]b^$2q*sa3 \Ô;ڟq?&2\D\pόЋK*%c\" t_v @€P7UzdZǤsC UDtTJU㥨g%pM ~.-W{ly\4nd`+fO*X(s#s${)ib?rx_ nmaճ@5y'e8yC_4c4]k$_k$r_^a{ v(}.ԛ:AMl jZӕu'_pEabB+q(l]tYB+q( <&b:`4@dd8af٦h`clܑJG0{dޓdd+ф\1ZA d)Xc%y+L\oIɝ# VS:nm9D$ni`9 )`">ṝC:s)'>5E$ | qĩyDLڃ =@.p`֦?*ʈJPƏ*fIj@DLz\bsẗe32!λ1Xb_HIH(ؽQ_NqF] O Z3c=$KI g,SO<4y3)A<5C<3USxy$Ȗ56qka& -oQ~HcZ%2RM㊘S[xRM!hDih O?s11ALPFЏ)\r9*{1]վ!HZ@pߨ"*P7'AId9I(7F b~|G=qAאK ԏd]LRZ5^Yj\o@Fha(if9};knW:w-72;1wjW` hłpbHBz@ЃaVaOa_a_bGLI\vTBB*g/)ߣ]׀5TAVЄAe׌q)34'** W_W{e@eF-MV\ ѻx\%Ѻe$i[5Е7 g_?"%wc8 ӾйE]ƳN/+q$Fy' 3w }X9~"]g10(Ci~3@-AJ>}o}6_eu>{^$GLw((l1+XWΤ ׄ7&JǼ-l2s U2 f#PꡁĤ2 X@)ֶ'V|٬ET%>K X` 1 j6M摈}˖1dKJ2jCRȆ0S+6jSfd&rvlt@] 9Nw͟yA ڰ^!&*u*bcWZGrz{sMSJQJ">\[+,d0:BOHZ(c( W05JVw1lX/5]ڻ @xf'D4+MRW #18vwh;ʒY XvscsM9%6먌(צ{*NO2-$7"~2Z#̳:!()ƒiq &0ojŐfђF|ř8|̛7ܓF,rPz@,g8; ̔g1O] pi}O5V*̜T0bJTp )RxB,F-YNk5ʷ߲<`^SgZؑQ*eYu Bn3WfOsnye;1aUZn9~9+sp'R H9\LI7 '7;@R"j:b9+i~B%@=9zиo(l/@;~KB<+RLcs1/wQqI[D4I5Z[V{,ۿlH4EsP5LqR;HeI&D8obuD#weV]Eq1D:0'9ҝv]AISxpC.O⁘~`Px? qއyaˆʢ6<*!Xq 6Єj iu7~phgRtB^lDbtOa+M6PGfxp !u. ;U%X0#lVZz>+V'XEUVU&W eRda`a*64"1NsCJzk3j0w4!Ko?̸xݬ-K>NHh"?\oW`)YbEB$-͝847n,.N=Zs@iLט,J@؎#^pH%\#n R3#0 {FD'1JմR 84VRPc%!2C(aZ8UIaT1tn!#q4gEHdJ*la{MU7dNt;J4{C|{R4>FJVmtrTOwItrđ-I[Qp4q(=o(*%;ȩ v6%sObMISI;FJ9OcSISL4988maYJƾ)RlFy+j5WﯣYCZ8լ2XJڬ2Y ̟:!g AP@`8iiJȌE] 4&4,{@uQ~;:l`Ю!l׌i*Oг!<~V7"VΜo3((DQPveKWrjO nV`O zPČ4n( ̃ C"bHO [)_$Pȋt%j010˙=d!yFm%1c(cx"AE٪4Iu-q4 &:zۺQ| ` }3L[v 맛N PrPQd]m}tޞ ]rd:%E&LubXNƈNmu~^UN}8q;/+Ɂlc\i8GzW#͇ه`UW_#EDv*Ȏe(ժ(+Yx\]k$ĦFbK`RPgz]kL kfVӰZ/+0UQ6I7Tv21O|4Ǧj 3-p}PR{rC\^z`g|d&~0=j̧D|}6V:IWK/\ @X.:ԡŕCŎ)kC}HCC ;1l#ig i(JtmHX̖$ ҘK)yy )-znj8%䤣2XgJ+c,ȃrLCAR9CWFPXdQXvGz&,vOl2'K=݌nF(T~'yI2{i0P~t)ꊧj(_E5"ii 篾k-* ,D{.` +h0`]3Z)^U<؞U@h1pa`"g%&Q)%8 jbخ)z^׶/b}`^o^i[l* VϊӉzph4a63%?m=0P9(Z ybXᜲ h`F9 as+##b󌘵S%sh{w~aI˛:L$#,XwIxkUJ^ 'ž:.'{E+e2@kӹZ;톇J;b5 In'B' !jbdt ƛ +tAB~–:,"鍡d|3yq"h!b@\wM\#\H͟1EB1Nh(́eB1(FŒ  $0,QQ Li15ҲDڹD+a%J]HnC,<#%nP6sJS0Mȝ„G7R fFezFu(:-4Q +8*W[Q' 9 Bvō+S-붟wC4j['RC|b@aP6L܄e&hExSRjUT E􈏵n}k`aϔcN('Pa{ކDlM|_˜e+K]JtaE+b rtAt4mTJ\׏%ӁۉY<)%ZX]jre+˴JPL!P]PrWOzf뮛sKEJ.E'H94/FFsG]=r(eԮd_?.=A pa8)0#hPi,QTaS2z.[|٨0cla= GnɊcU.m©K)$ G Gr'1Dy)ld壙,K,-viꜸw)O7=]hAqax6 YK*"/!R3LKl[Q\=i{pk553uU*Rt%v3!+@@+gVȵ3;Aq>T"];7ޢsO%b0Nx<vaU~|eH=/bLΙ".E ) j0%hz cVlJ/IB;2u[T"ݽ3oPyG;AN9[֙LS63t#j~"jrȃdtOh]JT%~JDP^~qCELij31Qqֺ$SdC6 C4u{mRXFb \@;PPY-xA3iRuzY3I5KXiC?d-uƒˀϫTUtyEf+m"&f肻ɚ_wׁNek'E$eԜ Fs SLi\Q#\bJ1 &&H]}@j 0ׇ<N D:Fpcok SyY0 qYܧ*ei`(eN2luBiYxɳ.+*L"O XGGc*ĎT9Ty$#U%B􈷎%(h\ k,b' X4dsoO_njRm}JB<"B:/`\PEP_HƔbGW"F {0 fyoao`֊gHq!ܣ²<:.\[Bf)1Y ݧY;RKmM HSVmBi^h^qٗ 6jǍeRn}Ƒ܆7?<17$wRI[Ͼ(.@\ںTip3."vwu;d,sB)cuX"8c6{.'Y̒h !Z"sge6+|~̢f!Ng 4e}<&>oHHc羭2>(#6tMqV)oevUBKI;P*==mϟ]OHٔ51q8`|*C".TEm FڀFT_>Zfb<iS(DvjNhx DQC\"">TjC#\y0:o`A#7 i V6?8P|3 HnFN@Ԋ` $?ܔ :]_bDSWyb%! _RH2;T;bIր3C݆<U3WPx߆z '}QEJkrZEۮŃ 8F PR"dB[Sg rg_H0!C2@ڗvbB92dꡃ)j>Rt]Ql esƲRNb_\-$|fZ-^ ؂ft&)VwZ%}^n{ҩ3 eו?N4 Pi)C"& |\mbчaBgQndKfIW(`ʄc.IYsW2&Lks ,!$,~QtaS8mȔe_5XEJ< !q(rcؙzn4,g S i,;@"84fd$nM3U9ĶC;|fcS6ۜ@|!Z9TFHUVIJRwnCfm0OXN}<Mk=rl}m|`6\Ԥq+L 1Uxb&Bb_] 6W7HPw`\OH|G%j1oR5y뢹Hμdl\l,nU6sfu%.Qj | P`&+1fhFҀfmEXK*犑4m L`eun&ֱ6J}I"F `L6H N,~`nfR J`Jr6@h;oi 7} `|Hb_n @02X_^{ւs m,@`*c&OI"J6D@T956I6J\ԡ@" r3eÂf0]/IQ!grv~ ׳'dz8b4f䬸֠Di+]y3B:h$ 'eZᝫMVthUtQvb|[<[%xZ⏌"(!=0rr7?^bT$˖ޙܸL 5KQH8)>R{awSem)K/E)8ߝ3*3TC&t >2g@C*A,VI4ͺ\ԛs,ǹ 0]#gp`ËMGE5s3I 3pF&e,䨪1rd׶Nq)n ^"s>n/>3oYF?$lBhpkSGDCtTe:et <<Y"&f댖Fxa:}tFQzDJ,3ab'@4}P',}!arґךǠf閡I[.LːD؟a`Qd`eU'Xnjb:,P9 "Ep~^5/DѾvONi-VµIU3&G (-90l=B ٘8F\#ndBM2rӏp'0Z^ҡ =- X.}(jMFW ŗJvs f-ʳ ! S=Gd!99 )ry9'Q񬀂{b6lHkmʂ]ROv@=.2ȊM6uEk_aqP #g pqtGHX$fj&j-:G-zJ$dT b<1g;2ǟ\ï!< ɦFb ~KIbhdOf¤A!N!7lT$ʦ-WN\ C"BqoP©Qrgf!љMgG'8֛ƶdʠI/m;w?E7Ʊ]_D/SToc؀9xgkQqVG\k|~dO#$$XD&P[ hn ~U(*!'+a'nJ:“#2C)!&aFaaaT0|F]\DZ0[udh3|TqzʶbK^exiO?4ul@&3~zg$ѡ7>8oDY eKq',cc.)@)ȬEFb qElؒߢoJ h(6Yч!)Sv6\nlCeZkDD7̽Yۊ}FhajRzfeά%B"g h>O"T>587zK~Pt0ʆSGUޥ:Rdf]4$qm&~JDM1H_9@o޲wrMl,րb. H?\mO57nLiwLT YGG ~FNiSb$ȩX>0`-e|:r$cFYM* FR7acVb5dZaJ=¤[;S"F8(dݎӔd Q1?4ZP2koԌ r VnoVYx]߈Xc]Vn be,̳RE8ͬt͛w1$e\U,2knY ,NfUtQ晣1JOu 87K , ji-ęXnFF֩:BafiT`:iv.;*eAhyٵcSj~S`jh'כ8LK!]n^k/ "LKbFu<]7IF$$4^b`=%/wNο@Sx^P(k (AfoApHQِҲgMiY2%ҕ1 Bd9_+S38r I^%Pnk2bBA(ܻЬYd?ZdE3,ƝnVcm{`VcRS$byJZlο JڬUI.{r\xQg+"`0΃\F[ y⸮+x^Wob؍x6ꀽq 5zYZlYGC{{ݡ r Azģ4n1P#r-[FfHRs'X`&5XApLS^}a^o_H";Z F@c(VHKږR^QT,LV&o3335L) UW4@&jDH;VN#%>5;fuUF$`dHa QFׯأ?վV3j"p#**sYxy|1e!",+4`؍Yc%B>y@Ջ۲=>OUgXӋHa)쇊ZgsCvL|j@9jiȑrjcƌc)J/2/"7[ෳ/X5b3H  ҅ϗʥgzhXk%}f.:P\jkN3¦\O6PyJ{8uNkda3e?QĞw/Nfaą8_ȡ%DsM:2jDy1AX6RpzA/XQW P5M!;'f7 {lV;rKnԒឭdU XbT`[(I=!K MeGUfRTuDvO]KbNf`A*J%aD9t.Sgp%V%1̣\!əkUJ`8qhMUqMy.2C!콣3%3ȿ0;񷤬S.{o`IlQ t1+H62培dΌa83|q.BY #MrvGY !d\2.ə['2?:lB_4k |$< %/aTae$UfuE7ptt8vn*#)L#-&g|Y؏RAJtJ$I,.5dDQ |L2IKU=x3j{ۛq,d~ {yA!H+/.Vd2eĹL|v(1Fb VV-oK%f}e-aT*Ōj.D@=.^F̓W|p0oQɭ2f D}-6p Ca"g ]_(3@DfSQ,'7kk@PBx Akjbl]cNl爷aWr'8$L GoN2s*dI&D'\5j '7zB"Zvǫꤤ,"*f#<:BV1tSI5n]q81X& y[6@RU3zIvvp3xB 6 T$I'Ea"Irxwl3Z!&hԌA]3朮2鈙fsZmR52Y)aP:8BkcyȢ_H4E%!搗HaÌ>>Poй_%XT\̴c<1ĝ1]QS*s9!a$âl3H|{)YezBC+= y&%khm˕;6ZD˱w[joas:ENh@UfE^[yv bp\3JI뉱BiG*]@A4cT̄f[IQs(-uNr Cܑe'T.KM@z3t5v\uhPN4-؁;|%83K0%鬮btvgo/@uA/2&teuQ 4]p0ṪbK%v]~!qxV|7v G\J4Q>FUYCVf2ŝgH`Z z" ܰL!т"͞l0!eqYaGo8p @&)_d|3LF6;P2.,se5>ƿTg `9XaYlēHHʽ0Xa$MjK"n߯\]4}TINȺtXWfCfCH,kʖCEDR4}}wNIFԩ@EDSjYn= VN HnF0nR X0` :#K;~wk2^@I?Fc ԱqLD7y@logisim-2.7.1/doc/search_lookup_ru/OFFSETS0000644000175000017500000000072011541757214020235 0ustar vincentvincent)HJ2ը ,fw릍aJIKG|跹s_H헩򳶆\8+5V:̙| R]TEDdLzU:WVzԧя>%~j  a&% abz"ޘì-dV`jdې eE8mnRQS~]Vl%fNsFTJ~e( иX`P+0&Pа%/*0,/̸04H:F,j*(00< ,040 0K2(",,, logisim-2.7.1/doc/search_lookup_ru/DOCS0000644000175000017500000006467511541757214017677 0ustar vincentvincent4,/FB&._ӵ֠ɀF@]ee_ee_WIP}_ueeeee:@k0QvsE|unի6m]m*&n뭹!u3R#9@hdS%\Ze}Y_@/Py*U@ɀ-iYY_e_L']2-\dU[o2J᠊*mMV.ثk{-Ue^tRf~a7U@P@e]_Օ_evVL-vV]eemVQ`FPڗ_eeie_ey]v]ee@auh@MI&Ye]_mwV6_*i1G7 D@yv`45jZQR(&mj@`5lGeV_e`Tl1 PQn~ZiܖmeMn۵kuۭ6U61`Mq#cXV4W8ڥeۗ_ۗY}eo-bXoMI&q_J3h"8_@ݯdUvVdĜj`'4 t$Ed}`u@ hU|uخݵ[n@z`#Z XO@baiI9q`hX<@eɶڔā@N=I@!vBcI{dƈ5lڗeuuVZz_eωe_%@84+]iWD֙#FdJ*m$oE@7{'Į@4&$XhgB ~llH!vV_ee_ʠ8@Umz֥ʵˬN&ۭÆ@$xUPɿ%MiMdԕ­䲬4's)Y$1Yn)e.:/ZP`YX˧z`uVۭmmnP0"@D!B@9ci]r&@uG#?х1% Q#|@)aͻꙪQ kj.GmS [Vt2UVۭV-u[0*-3"'Uu9@ p|>#lĎ`(8tʫʷmFHM2 3mGP4 #ud4\M$GNPsSʟkl{S;5>A@b Ąf3@g6$iY@&@M^%'E0@ 0^-gmR8Pٶef֩4$@:!4!D$$$$%|ٔfNYe+S)4P9X`7G `P$4%2az14r@Aaat Y[_G[Nlu+C@'@9(]PlԏFeel@Vm[`UyvmȽnRtaAJn|P@=̀O$IOafdsSmU_@%yԅ@]UĹl|M{mU[ms  7'bm>)`FX(@dc jonku`ܒjonku@MɷwmO ]o0 Zp@pJSe_%`f`O[/Pb4xz``#MK^nbum2@uIO)Q_P&FsMM@B@e#^`db!db!k&vLBfJe ЅD>@ݪ:\Gmd'm[mP2D.4"ۚO *fgPN,|">*HrPo\PDNއ@b09fgȕkD}DsL[md虀˛@?cRS!OjX@m6Fm1 (5& ;PN$q[#i^߯uI@;`J Z8U@IݰSiiQY@@@$̐rk<+KdxH4*ߺ P9ET5YM,JhH@$@F70YPʛR-a#ʛR-a#` -4BNg@Fh&ge@˅@@Oє:iC`=$gD_nj޼oۭmkmZztktd`@e,"iaΔd7vr ^.@j@@)A_ u6E^`ڇQ󄮻^Դ?}62WT&)ɶڱȋ[F"m@e96߫*"-hC܀cZs~0$OFl̅P)/5FmjM]N@X`@&4Qv2ŧ̊BRZ@l̏fffM &Ӳnjg+%ќCAe@рM1j]`yXh$d,%X`Z04wT0Br$vۧ͗V3#ysvW8S;@,g_+uPB$gN[b@)xFĚ#XL&ۭYSP>KKnh uG2/Fnr٪`fTh*j@Pxu"UR@ʪ0`BZaI@pj"pdT@ED@?0ʦelu;F <'cY\Æ`a tumڀ>˽1#XBz:b ɝi,s;@sm2ɇ@@b]f*4P@@@ɛ6!ΚÂ*@ɓv3Ɉ`Ө+`֠@٧}TȐS6!ۖ!:TZ0.@Ѫ2@L)ږU6@nqCDE@X($^@"{9`jvNA+XI2!jZ贓Un#uۭb @*ѹ@}bC(Dn@L) T$@jndR微یy7'cTĆR`@-0XhPёĻ]`yӖ:IM t$[ۯwQO`ѩ4_e_@77ȇ@)Q PѵwWp\c сrTlP9s@@7k^jOހⶄdi3Yn#ubػm[ڀ8B@pj$@`2"u}ס{˩}kS@:D)y@P<&@f4uBB3onPf4@XṀ~'Z [-5`K_&hMY([aF֙^X꧖6-:@,[~@`H`+T5d~@q8b)$o#uىmZ15@@꩹fd̞jfdX~d- 8 jV4b”e}ee_=@ DCDAD=BAG4"@8!*'_e0__e@.h$$靜ʓMٹվ@ao:n1d1zZq붟#u +]mɨq9i;"@>:왝qyGԚD4韹})eI9` /4%sLk# $ὀ8AHBgx@b1Hۮ`ÖÖ&cč 1ajĵ&2`ö^ͧ@jveU@j Dyy̞5'۵@١̀NF@@ܢ21X3kѬ'=tٲ@}-$msnFfg6;h$nO^%j`ND@(h6GPm$n:n[mz޺3:6JobUJ%[$n‡@OT@ܬF`9(d8qmY`+回Xq$}- р:8\=tۮko-`|}H@@Ї@l@,|1`3P@"@@`ɀHq9 @Հdb;Pֲu1!@:E m'ػmuVlyXJnjfjr[@{Xyv{ Y榔'$@v#k ^6Ol3@#!!c`yIqԜP9[&p(!|Wc(C(1=U`@@vZ@ O@$@@@/@Ƨ@$h@@@Ο@$QeE(@@@@@G@Olx2~<|ʈfi~&@LfFF@L,XuԐ $D3`3hi@!PTŀs!U@K#@K0F~R4 a}ye>֠aP~՛|ȎfJ[VL`15cR@aLT6Ь"^_sZ>b@XD0"@0"@0"@$((T(((($TTVT=ZXX$HP0"@0"@(0"@(0"@T(((((0"@((($@ք$$(((YdI`$P(`׷i?`:T$T(@&iTlmb*mm[m&K8PPwQ((P(TTTT(((&(TTTTTTT(TTT((((݀TTTTT(T(TTTTT(`1pR4@`y@$nP$$`deEaD2Sd@0"@>('vagԈca.@`$$$0"ꦠ9p@`$((T&٥xž!SA0Ł@ccUrc1.фE5@4cš$ccc@]c b@2&%y ٔ$epu@df&>42 `@e#@ɷ6ʦ44ɷ6ɵɷ6ɵɷ&ɷ6`F`ʵ$%شʫ Bء$`$4֖"@da\ʹG@nƈnP@Ɇ̓@8@ʶy#Ʌ@]X̀ɇV2?*JɅ/XP@@a n@@ɵ #@`?2eebɅdc"˵@`edf!S@ɍ9ɵe'4ɱ:P4@@6҈@ȇ@d/}P/g8XC'8@ͥΌP"͙ζzf_@3d[3#,PfF@@@#=@v́ggdٌc(Z@\@4@6`҄҄h]J:dӷ*ѩԄ@hRѵѵ0@ӹY9Xkk5 ֤DՁ4V֦T֔>+u֜P\Օ4w[`֖֔T@@ڴT@@kZ& ~@Ӆ@k1Tk!qĐ#Ei`c@֧ ֫ZQ~@edEmذ(i0D*l`.44m16V@hK mPdd6ٙFt٩٩6c$$ڼ'@n1'J@ِِy@nLt7vD΁@d@̀#Ȑ8*QBaz@p9-Qp'RDp S͕VڛnԵ(24D b@8C5 a@*͇@T♐d8♞♐hfU&hS@`ΖsZņ@da~DaX))öet4$-u&+!ِ@ϗ#uKWmnP3 @:@TwfL 4`(x?q|:P@/$V$˃@@*>PK&LЂ@*uTV$T@!@V@:84*\]@ @@=:D@*|Q݀"Ȑ}ɧ@>}V}]1@=ژ}V="@}VX[U@ZP?$DDŀtDY\@*@@@64a Ҳ]"@@€Ma$`€ò:ò*a€IZRY€Y0 qyxQP€M }'ee__e€IQaT0e*2lȀ€.;€BHaAZ]€` !\Z0vtma€€`ò>t\t€ò*€€ €€aa0JҎkDa€€9S€€€aEm%@ZRaHDaaa1Gh1cTĀĀ5 ni F`Y& =1-A@ĀUĀĀĀĀ WĀĀ`ĀĀĀĀĀEĀbQtĀĀ62ĀĀĀ5`HĀ1wwqĀbL6``11ĀĀ2`Ā13"@ĀĀ1ĀĀĀĀĀ``ĀĀƀƀƀƀƀuƀƀƀ coƀƀŃ@`ƀdD|Pɮz%Ȁ;  :hʀʀʀʀ 8`!m0Fmkwʀ`ʀ ʀʀ]ʀʀʀʀs<4ʀʀʀmʀ *̀3PPͪ̀. -̀̀̀̀`̀ o!2R̀--̀̀;*̀͞:Kr̀11̀̀̀̀̀̀3|826$G̀̀̀f](̀̀̀ `ǹ̀̀̀̀̀̀̀̀̀̀̀̀%̀̀̀̀ `̀̀̀̀̀̀f̀̀̀΀@@g΀΀3΀ ϒϒ΀ЀЀaahЀЀЀ. hЀЀЀhŀЀ4]ЀЀЀЀ`ЀЀЀ- DЀЀЀh Ѐ  Ѐ ЀЀ ЀЀЀTY`AЀ`ЀЀЀЀЀЀ`ЀЀҀiɀҀҀҀҀҀҀҀҀҀҀҀҀ4 \@ҀԀAIԀԀրրk̀րת$ת$րրրրրրրրրրր5րրրրր@@րրրրրրրրրր`րր׊:րրրրրրKրրրրրրkրրրkiրր րր2_րրրրրրրրրրրրրր`ր`րրրրրրրրր-րրրրրրրրրրRրրeրրրրր  ؀Ml̀1`؀lHyXPa@I؀؀؀؀؀؀2?h؀؀ن؀mnnF$ن*؀Y؀؀؀؀؀؀؀؀؀9ن:؀؀:z؀ن"K3lG؀lW4؀؀ڀڀڀڀڀڀڀAڀڀڀڀڀڀڀڀڀ6M3`mڀڀڀڀڀڀڀ ܀܀܀܀܀܀܀܀܀܀܀ ܀܀܀܀܀`܀܀*dd܀~:ހހoEP o*ހހހހހoMxqހހ75Q@oI4ހހހoހހހހoKހހހހހAހހ`ހހހ  ހހހRހހ *  epEqG`2rrr_P A4}'ee__er*`r[@|qa@Gv-j:`9qsj*i.|lP9 QfQ9`9%8is=0Pe`Ges _sZ+PssD`s99T`  f* 1 mu  1u:4uDy:-S&jrw2u4:#1J-@T# XPP% &@=|Y>ɀ?4=?>:~OP?s  V  93@?o~]?̀Ʉ@  ^$XxP}@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@`#€@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0Id@@@@@@0I @@@@@@@@@@@@@@@@@@@¼@@@@¯@ƒ@ U@@@@@@@@@@…@@@@@@@@ e_@ 5emen@ 0@ 0@ mduda!Cʀ 0@@ 0@@ 0@@@Ä@@@@ 0@Æ@Æ@ 0 0٣Æ@ 0ڑA@ mdvֳ% mܛuk2P mdvn[ ڛ*uu l"n@@0H 0@É@@Ã@@ |dGes _ 0@@@@1<@@@b!A@@ġ@@b m@@@@@ā@ā@ā@Ń@@@@@@ř@Ň@@ŭ@@ba@@ő@@@($ @@@@ P@@@@@@@@1IIx@@@Ŭ@ņ@1I wdŸ@@ņ@Ƃ@Ɓ@@@ƨ@@@@@@@Ə@ci@Ǵ@@@@@@@@@@@1\@@@@@@@Dž@cÎ@@@XȂ@Ȅ@ȁ@Ȃ@ȃ@@@@@@@@@@ɫ@@@@@@@ʢ@@@@@@@@@@@ˡ@@˰@ˡ@@˧@e@@@@@@b@@@@@@@@@@@@@@@@@˧@@@˓@˝@@@@@@@@@@@@̥@@@@@@@@@̍@@@@@@@@@@@@͐@ͮ@͆@@ͱ@@@@@@ Ї4" Ђ@3H}#͇@͇@͇@͇@@@͇@͇@@͇@@@@͇@@3HH@͇@͇@͇@͇@͇@͇@͇@͇@@͔@@@@@͇@ Ї@ Ї@qZ"@͇@͇@͇@͇@@@͕@@@@ͅ@ͅ@ͅ@ͅ@ͅ@ͅ@ͅ@ͅ@ͅ@ͅ@ͅ@ͅ@ͅ@@͔@@ͅ@ͅ@ͅ@ͅ@ͅ@ͅ@@@ͅ@ͅ@ͅ@ͅ@ͅ@ͅ@ͅ@ͅ@@ͅ@@@@@@@@ͅ@ͅ@ͅ@ͅ@ͅ@ͅ@ͅ@ͅ@ͅ@ͅ@ͅ@ͅ@ͅ@ͅ@ͅ@ͅ@ͅ@ͅ@ Ѕi,ͅ@@@@@@@@@Ϝ@@@@ϩ@@@@@@@ϒ@@ϕ@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Ж@@@@@@э@@э@@4Ix@" "+q@" " "*@у@у@@@@@җ@@@@@@@ӏ@@Ә@@@Ԉ@Ԉ@@Ԏ@@@@@"۵@@@5 H@Յ@Յ@Յ@Յ@Յ@Յ@5H]@Յ@Յ@Յ@Յ@Յ@ P@Յ@@5I bէ@@ը@@@Մ@Մ@Յ@Յ@Յ@Յ@Յ@Յ@Յ@ P@Յ@Յ@Փ@Յ@Յ@@@ P@ P@ P@ P@jaƀ P@ P@ P@@@ P!@Ղ@ nʾԵ@@@ nʾԵ@@@ց@@@@@@@@@@֧@֗@փ@ׁ@@5ȉ@ק@@@׃@ץ@@@@@ב@@@@ׇ@ב@@ׂ@@@@5hb@@י@@؂@؂@"&@@@@ړ@ڤ@@@ڌ@@@@ڔ@@@@ڂ@@@@@@@@@@@@@@@@@@@@@@@ڜ@@@@@@@۝@ۍ@@@ۜ@ۜ@ۜ@6ɘb@ۙ@ۙ@ۜ@ۜ@ۜ@ۛ@ۓ@ے@۔@۔@۔@ہ@ۃ@ۃ@܁@@@@@@@@@܃@@@@@@@@@܃@ =@܂@܃@܃@܃@܃@܇@܇@܂@݉@@ u@@@ފ@@@@@@@@@@ރ@@@@@ޓ@@@@@@@@@@@@@@@@@ބ@@@@@ޕ@@@ޕ@@ރ@@@@@@@@@@@@@@@ފ@@@@@@@@@ߒ@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Ⴡ@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@ @@@@@@⇃@ @@@  @⃅@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ o@@@@@@P@P@偄@@@@@@@@@@@@@@@@@( }偄@( }@@@@@@@偄@@q@@@@@@@@@@@吅@@@兂@@@@@@`@@@@@@惁@@@@@@@@@@@@@@@@@悂@惁@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@蔁@@@@胁@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@쏂@@@@@@@@@@@큂@Ё@@@@Ё@@Ё@X@Ё@Ё@\@Ё@@Ё@@Ё@@Ё@Ё@Ё@Ё@큂@큂@큂@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@logisim-2.7.1/doc/search_lookup_pt/0000755000175000017500000000000011541757206017200 5ustar vincentvincentlogisim-2.7.1/doc/search_lookup_pt/TMAP0000644000175000017500000014400011541757206017663 0ustar vincentvincent0000000011a01100k11c1001010010V10111010 2110 3e01m1A.0x00 u0111011ee*x10100^1011101001h10010 x10110x11012301 4506,777,216x16 .976 89 91e012 .0E.3Q5 ^1.032.03.0 \4.05.06.0 C1 U2 L7.0 000145 j92 5% ,214,903,917 ~6%3~0x302`4 00 700G5890n5 6% >0091x7{6712489 w01 HA guia Arquivos (File) Barra de Tarefas (Toolbar)  Experimental Ferramentas (Tools) Gabarito  vInternational hMouse Seleção (Selection) imulação (Simulation) Tabela (Table) HÁrea de Desenho (Canvas)tabela de atributos?brir Análise Combinacionalnálise Combinacional trasos em porta (Gate delays)fibutos de FerramentaBiblioteca Base Memória aritmética legada >para Entrada/Saída s JAR do Logisim (e atributosotãouffer/Inversor ControladoCabos  lasse LibraryockOodificador de prioridades$mparador onentes de memórianstantetador de Bits Bem código de Gray simples em código de Grayres das conexõesjriar circuitos Aexpressões +Decodificador :multiplexadorpurar subcircuitostslocador isplay de 7-segmentos 9hexadecimal utribuidor es (Splitters)7visorEditar a tabela-verdade_parência de subcircuitos or hexadecimal rros de oscilaçãoxtensor de BitsFerramenta Conectar Editar Menu[Ferramenta Selecionar activities Npropriado brevemente#jcom.cburch.logisim.instance.stdattrntaining Rdefiniçõesisplayesboços facegratuito  individuais justmatriz notoupassar rimariamente!t/html/guide/subcirc/library.html Mrealizadajipper solicitará !terminamosvai CFerramenta Testar xtolip-Flop D/J-K do Logisim 1.0 s D/T/J-K/S-RGerador Aleatório r um circuito&Quia para se tornar usuário do Logisim 3Incrementador em código de Graydexador de BitsRJoystickoLED imitações 2Matriz de LED enu Referência (Reference) s  Janela (Window) e Ajuda (Help) CultiplexadorKicadorWNegador O menu Arquivo (File) HEditar Projeto (Project) Simular (Simulate)"painel Explorador (Explorer) Tpções de projeto para a linha de comandos xrientações!utras opções para verificaçãoPara criar cabos9ino Oonta de Provarta NOTs AND/OR/NAND/NOR%XOR/XNOR/Paridade Ímpar/Paridade Par referências da aplicação opagação de valorRAMOMeferências para bibliotecas  gistrador  de 8-bits do Logisim %Deslocamento loWsistor para AjusteótuloZSeletor de Bits/obre o programamador ubcircuitosstituir bibliotecastratorTTYieclado  star memóriaúltiplos arquivosutorial para o principianteJ: Acrescentar conexõesportas2texto  Orientar-se +Testar seu circuitoúnelUsar subcircuitos#iVerificação pela linha de comando Saba 8ixaráoertas8osoordagem r*tve Krangemi-lar ^ásence cabado r centsoptzanceYss esWompanies+y>rdeitaráBeháveis  leração nderão tuadosrca sasossadosr o á-lovellharlam/oimaonadaKo$mento r >omodar panha mXnteceondor áçauplados rdo reditascentada s Go sFislndoJr emos áá-loção esmitir +otada -ouquirirá"visedBãofetada os m0rwemXáao ter gain !gregationiroraradecerimentosYçoeedmentinda2judaQr.ãoUstado tr-seMá,elcanceçar  eatoriedadeória o 0sgam ,mães o rto Pfa%garismos o,ritmoeumtasns kémébrica gimentandoryçãonhadas mento  Wviando-lheá-lo7áslegationow#edongreadyrso ]tN-clickXdrag a8eradao/sndo reá ção ResVenadao brá tivamente ulas ymentarsentethort's:s  o-explicativa gmatically menteRzados]áticaraisidades vailable liar5nçados rá ooFiseoid)way5zuiswl  '-petróleo ção`esback spaceixar 7áMolancerramentoKseadasondo-sediamhicamente tantearTátatasds .getheightwidthxyecauseen ginner'singlievedowm-vindaso Vsnedictrkeleyst tavyond gcolor iblioteca sMnary áriot _width .getwidthps -.getmaskwidth.createody]horislhasJmoleanas rda szrow-inoutstonthão[esundings}.createxranca)o silkendon ve brilhante$nguffers_gsCildrchrroiscando-as xttonyte snásicaMosIzierдnus c yaber{çalhoos|daibaSxa-preta slcula+da so.rifórnia 2minhoMpo n't ~celarará Yhotonot;toYs vastpacidade z9esWractere syísticaAsqe tgalregada so syndoremos^á oá-lay-inoutseo Ws tchegoria s Zólicausandoeburchenouraster ed oradolizado orta\in menteeza ifique-seoGshamadaao s-remos-nged"ing ,racter.digitEgeve egariaá ueGmipsoiceoseing\ristosiclosgenteLmaBncooza -claro@srcDuityoXs slarmstance s nstância Bs,êncialaimsSrayoxsseNsear Ficadaokndo-ozrkedslarPque qs ocks ne able notsupportedexceptionrHássicosmpcobertosJdeqsificador Ges çãoerentesência incidir Vásasladas osyregas~tar <çãolectivegeville +ocada /s o gs ndofráçãoouá-la squer.blackredmidoskndoPpickeruna}sm ].cburch.gray logisim.data a.attributebbitwidthcounds ddirectionvalueinstance e.instance$ data$ffactory$gpainter%oker$hstateiportcom.cburch.logisim.tools .addtool librarykutil.graphicsutil lstringutilNando -geral sbina-secionais ldapo sr8á tóriação esedaá-las Oentados Yários1rciais lizaçãoçando&r ~em os_áigomands;itonlyo  ?pactaçãorador #srpção nestilhados er em tibilidade_elledGilationPerlemento =tado{menteOndor ^á#s,e _oudexas o smianceVonent 's Ye es factory Osrta m ento s r á o emlstasAo preensãoimento eomisso vadamente utadao 2res r-ção/esumente/nicarção s1tador 6ncebidosívelderitos ptçãornsUluirbída s #oremordamvrem áSeância{rentesditions çãoiesectada Rsuo smosndor-se<áEeá-las osxãoes fiante rei gura da s zo s r Vçãoe d newinstance sável litantesoormeidade|tável ogratularei -meuencialheceridaszo Es@mento}çojuntoYsçãonected ~ion /sseguirquence tialideradas o s m Mndo -se Cre  dstent picuouslytantelyzituemiráteído sructor s&indorçãoRdo s remosxulta4ndoramido ta bilizado dcte-medas oSrs gem in edcontainsmos ndoUto rtoendohamtsr Xást xt údo s>idaos Dnua 0m enter áidadeverEem orno s ra |ctdict.st Ação tibuição estionsíramol-clickd\l_ado sm *r 6á o beutorárioudo ndentesémm Qvencionais il ience >te mmente&rter0idosway7xõesJordenada Cs?piada osxr.á ed sying right edrWesner Gporectionntessponda m oe ntes r  em iam 7á Fo -ing ^ênciata menteobçõesigirá upt7stumam&e uberntner 's.gifdata .getpoker .classries]s rsetve-flor=veredpu.circ"s reated ingscente]ia9da/o.srremosUáo|çãoTe á-lo Wuzs61cci (tujaEsMo Ksr .getvaluesetvalue updateclock#rent6ly sor0stasHvaos /stomarilyized bávelálculo[rculo s7digo9-fontes pia s dnaRdaosmageslngerquelasHe fsir0-lhestaeFí6e oal ings carregaride nir malsion laração odificador es Frrerem rementado ndo r á o scendo :te Mdicadofault ective Ritos  iciências%ne dsvida 6s{o s mos3rEtionvamenteçãoeddeixadaosndor háei2la s y s =esteimitada ~oEmaisonstra  m rtes <ções6ultiplex -adores -xesnotadatreoXypende]ndotesrásoislurarção]r ivada_osrtive saçõesedsabilita da s *o r"cordo parecerátivada o s rá-las ocarregar ueendenteseidanobrirnectada s o Dsxãoqhecida Ao JsgçoDrevendor ei mos Iá Oita Nso ção >esdeuejadao srWmoseássekeável nhada s`o Zs rOá oá-lo Evolvedor r idas  o s mento fazerKign arZted'ed ualdade stir áligadas o  s rámocada`o =r \s}ment \or á marcada rknecessariamente`peitosa&se Ss?tascadoeNina-se;m viar ou-setaillhes ecta darrminada ys o s m r áe svam $e $-se mriamáԣo ;ssem idoo zesseisiagonais ramahdonteca sferente mente s 1çaferenting icilmente >uldadesícil 5gamos(itadasTo )isl{ndo-se9rTeL-as  amensionar 5ões inuir n recionados wr tion.eastly ii=tasosqtamente fórioçaoãoѵesásclaimero riminação `utir MáXparadaoensared  disponíveis #l sitivosStowõemseroYtantesinguir shingto çãoribuidor es r >çãote d xing on(ídas onânciatado!versasmos'ide*ndoi-lo pdaqso6srá&sor)es-ãoz endor +-lheTálogo,metro Hocente!umentadas ;o Jr ntion ção oesn'tispn'teorCppeltcs t^wn raw ingnsop-down sun.java2d.d3duas plicadas r çãoos-clique Dranteçãojoígito sae -.getkeycharxysachstchodge it adasor%emose orá-la sção %ucacionais l Ptional vose01 feitotiva dosmenteá-lafect icáciaitherxosla  'boraçãose  (ctrônicos |gíveistmentosls trônicos )vado "r &á iminadarwá|sem[ailsbaixoorautidaoitido ndo}r á ted pacotando regadores|stado}éstimo tyDular nable dHcadeadosJmentominhadonkevortontra~da  o sr másse9urtar$d ereço }sfeixemorcing  /genheirosquandotoLsino talhentoenderimentorirelyradaszm ndoramáe3gues ouuão umeraDviadas ovsdr neiãoZo olvendo ido s quals\ivalent /e slênciaprrado so neamente oussvilhas sd  `escala {do Tssadolhaerida HsUo srever}ita sLo 8suroforço bpanha ol ço(s*eciais lista smentetfica da s o s mente Jndo Nr á que Líficas osradoréciequeletoy 's I-classcensedes%sorça+da lndor=sogada sIosIreiramente 6á-lokelov mitadationçõesoeds par|áoítrofesnes guagemha-coluna .shk Wsux st,ada ds=osm ndo r á%te-onYvreoad cal e  identifier iza-sedo zçãotionspgaritmo \ging ic_amente3sim's ]-filename.jarojng @eo oks p CsangosesTsbugarFesepa)zá nguasgicas[osma Sc .hine-readable8intosh osdein i.png tainSores!ia rsNjor1keingYl nages=eiras Hifestopularted "s ção estendohoVrá idaoPverDém-la sHual !mentemfacturesNtençãoypas eeada ^os cmento _s `riam rcada osndo-osrá "sZçãosIteriaiso#matrizes ximizar eyjcleaneanscanismo[diantedaumetia-soma$o lhorarWias m-image.txt Fbroórias ncioná-lasoresssagem1ukey-d s rchantability e qgeo sclarmaosCtadehod susight llisecondsine [nashas:iaturamizada ss r ednesotauendosturardtod Peloificada o Zra s?mrtion sçãoá-loszed^ywingQo sAules7mentonta dornterá&stra{da*os mr-lhe náuseevent va]e fndo-os\r1-setá]o 2idosNmentará 5çãoo s 0ng 3rjadapter ?sudacdonçasQr am gem iaáIo emitasoslti-bitbit@plex ador es >exador;icador Aes Is Bndo Hr @á ção  idade(ndo tablecx ,esáximoӣodiotodonimaoVdulosltipla sFo sn*ada me~ndômetrosquelaes turalmente eza vegandovr$ecessariamente yidadeária s oTed edgadaon sPção esuem ensorty  :orcionalmente rriedadestaryósito *ssseguirRtectedinguon vva Zvelmentee 1rided hnciaráável ~ática  &-existente cviaprias o1sGxima?oXsseudo-aleatórioslinear aleatoria ória t/html/guide/about/gpl.html 0index.htmlnalyze/expr.htmlBgen.html index.html open.html @table.htmlttrlib/attr.html explore.html #index.html )tool.htmlgbundles/colors.html reating.html index.htmlsplitting.html index.htmlRjar/counter.html Cguide.html yincr.html 4dex.html  library.html  simpctr.html  log/file.html  Iindex.html mselection.html  table.html  mem/hex.html  index.html  menu.html  poke.html  nu/edit.html  Ifile.html  index.html  project.html  simulate.html  winhelp.html opts/canvas.html  Iindex.html  Umouse.html  isimulate.html  toolbar.html prefs/cmdline.html exp.html  index.html tl.html  wtemplate.html  ools.html op/delays.html  index.html oscillate.html shortcome.htmlsubcirc/appear.html `creating.html kdebug.html index.htmldo pt/html/guide/subcirc/using.htmltutorial/index.htmltutor-gates.html orient.html  test.html,xt.html 3wires.htmlKverify/index.html jmulti.html other.htmlsub.htmllibs/arith/adder.html bitadder.html finder.htmlcomparator.html %divider.html 8index.html?multiplier.html Lnegator.html Xshifter.htmluubtractor.html base/clock.html edit.html xtender.html index.html label.html menu.htmlpin.html:oke.html Drobe.htmlPull.html Xselect.html \plitter.html vtext.html unnel.html wiring.html gates/basic.html uffer.html constant.html trolled.html index.htmlnot.htmlxor.html index.html o/7seg.html button.html dotmat.html 3hexdig.html :index.html ?joystick.html Skeyboard.htmljled.htmlptty.html legacy/flipflops.html index.html register.html mem/counter.htmlflipflops.html index.htmlram.html ndom.html egister.html om.html shiftreg.html &plexers/decoder.html,mux.html ;index.html=mux.html Dpriencod.html Pselector.htmlublicadashed |deremssemlarl2-down/up so srposeê shing t 7ythonCágina s &lidossaroq 4uadradas\os@icular oJáticaisquerlitylquercndotasidadeos rta o vsetro\e8brada6r5iramosmr emosroy_file stionávelão es -ine-mccluskeyqsero Vt(ocienteãor>abo Cdixmossnge pidamente 1ro sther w zão-es Ceabrirds gem is l idade sta zao realizadondoFrQáPem lynmenterranjarsonably tivar çõesceba e5ndo r4áido&sHive;d~s nte mente s}ipient eslamatr  [omendamos o porsnhecer ido rtartangle ular ursiva mente sos ém-colocadoriadode finir á  limensionada r yrecionamentostribute ion ors ídoAuzirfere-se m nceiro-merseCrings8ência slectKtemidas"o rraingardless ionais>strador es Ls rLo são'es}ra siniciada o r á lacionadas os rá tar am ediva :mentee o^óriosção heased vant e sianceFgar rógio+mkainAeterá oveVr Dáida+os Fçãondered izaçãoUomearWordenar ganizá-los pair  *etidamente ções1ortados rá {eKuso presenta da s o Jm ndo r oá ção es ing s Váveis Ulutations oquer eriredmentssitada o setistorVtor ?oluçãova er pectiva mente s os XitoTonder ]sibilities let Lanteurar,oricted pion UsZçõesultado smntesr6ámem"idar o t .value .extendwidth getbitwidth angular =es irará ornará oratado ieve d surn ing s ângulo %susetilizarverteisedicoghtSsorosorisk olagemr ym jtacionado vriçãoBeada9osrEuladaos5y alty-free u dimentaresn -length_testningTs sso ído ápidaaoseos0tulods ]ssia +s=-raberfibant Tr =laDva r Me os metisfyyingsídaIscope 6riptFsAe condtionsBgmentosmueSida2s;ndote ssrão Gnda o Es isjampkhonl_ecionada s o #s ndo _r áe R-a oá-la ot ed kion(çãotor -ção rlkmelhantente3stre(itransparentespre ndo síveltidor-se  aparadamente sRo rsr te quenceiais l ência sQüênciarem iamve mFice ing rááossãodta s ttributesicon nstancepoker |offsetbounds:portss valuexussveral mente!xtação;es hape d,reingzell ift -clickCdrag Zegows .idoqgned ifica do m tiva Ts o s  lenciosamentemilarIes  \pctr.html le counter wgraycountersmenteulado lsndor ]te ionção es taneamente ouslyMétricanais~lpce roniagular taxe onia/stema Rskte uação |es kip lightlyob1re  3posição 'es (to .õem9ssair Vfisticado s çãorer [átwarele Dicitadocndorososoltar uçãoSesma -completaWdoressente{onethingimesndagemu jberIrceBpeak ingJcialficesyediritlitters r=ctartedte3.fireinvalidatedgetattributevalue data instance port value setdata portd icng sticsusdattr.default_label_fontlabel _fontwidth epls4ve#orage er ingutil.tohexstringouaNsb-rotinatcircuio to slass}e [onjunto _s idajacente sectalicensenhadomenu1tidos 4ê-loprograma?section quentesLções vtantial Lituindo r á pçõeskído sytractorendoxirvá:tor wesçãodo scedidaSssão`h /ficiente5gerempstão`esvirojeitei So l+n{per .clone{circuitolass*fícieiorespor-se ondo4haTr}teGstosYrimida.õe-se2regirZrender spender átainedtil eza JéciaMverreSystem'ão Nrie mbolo)sncronaг'lidos>tvabela-verdades-verdadeFlefsorterulação 0esis(keslvez:manhobém pouco6ntasosrdeefa sxa  echnically Oologicalclawdo s nicamentelalingm plate fileo  )rariamente izaçãoária4ted nde mhaxmoshosãotandoremosátivasrruceirao gsqei mos iamqinalso $terminando Urfáhte idção esouoshsáxostamosrndor eQsá-loxasWt)o Mhanosieir Vldo mselvesvreforeoffyQingsrd  s.lastclock valueoroughly8readtened4eoughus ick sl321|menhapo 5s (sveramem mos sse~ier*odas'osggleintvalue{madosndo?raXol bar sp 9orna-será oá-la }t rtalmente rabalhaido zndorXos(dicional&utorzido Açãoes nsbordamento|ferida sring{ênciaormado r á[late dionmissãotemido ,s rparente sorta das xr á o'pézio tada-osndo r áe va rzerçadaZor5o s^echos|i-state anglegger ed2lhos_ângulo cocaruencados yáss[ty !udormasCtorial !widdlingkoypeicalãocnicas om=picosgtulo sneisl Tultrapassar á em5mJasnderflowwstands enforceable.idade forme tário versidade styUless oad=sp date clock s5per Isalarlsa davsoa s mosndosramemosá oMe-o0dr 's  -designated4se2idityor!esue  &.createerror 2known false trues _mosmnriables m ndonr ção esjedade2áveislzia s oeio locidade,m&nde$idas oharbatimTdadee-claroescura oemos 1ifica tdorMção ׵esmelhasos  ossimilhançasionsão es rticaisClmente ázes iajam)ce-versa daeremwnculada'osXdoslolentoradosá sibilidade ta o sualfizado r ção á-las ível voBocêfidlta3datos gensrá Qo"ume ntade Qulneráveisálidas4o%riasos o >rtice Gs -loh7nculorgulasLwantrrantiesyye'llre veib Vsitestahetherole tm9seideth..getmask widthllingndow@smerge DresingGshjthinoutRoodrk sriteingtenote9x1010100 :noror'ss xx ,y5ears ou'd ll*rRzelosasros immermann oom      àSquelast((`B0B! h3 0ʆ'!{ ǜC_Q2 6]$g^Y/a=]ڮp\'݈d :Y=0Dba9,e$e(n= ȔƤ4+,UftTB]E\# \j|6ǜ\qz)AN7T !p gah5> @ !R*P3D<4DLUH]􏱁pcZ5SM6>]PѵE܀5Y) 5s9 1M1 wGsxs>k)$Rb0s,AbŲD#mDi ߴ&|[-0&ᵫ!.xlH-L2Brlִ# J0f$z4CdUmdt[|<RuswjRuWr[]#kǹ,+kթ*cYY)Y?RyۙJ5]{}P@ 0r 0h51TB|F:+}aHNgcw[n1l٬+{CNf{x$oчPSrA':yFuim[Qn&G2) Mrf"Be8TB!Pp' @AFjGKDFlgCem0ZH˹QX, (22%% h; 5\#"[w Z퓧:-hO$8džKx)ǤjжD%d.W@|!Q\"px ^p Խ߼zݩPqGxɔI$ȴaGoCde*>1M c->8a?1T\_yF~ r `!,EM;BrUOYGit@uàĤ#a)9UƎzoH;ƀpMƞ+#=UY~~<q4% =DQMݓ?-y, e"M.OwăQp/ysgz+.n@!UUUUU  ;kѮɹnZt5m%MkۭѮ !ڊj?٠P3Z P9SMTpi=Qhwq=2~Mll$**'tn/Hun^tOy&1l0)ä*4[ĴTEd6LB$Jlt>ݧ*YQag+Uh-e1ԕ- 3U͔OHz D`^0Ò4Yk)aD 7+S+F`ڵ YHXr>,SݙV=;@ر9ʚ/,S\6k - 9(&"f|`̬}n` 6/Vic3z՘0^qp 6.RVʽ19?hHY bռь]#aQqM"Ul; *̩Yml{y >-4Ls;51@NU@߾+UyWs@(fD*xqCb(S GEzU=|Dd\'֔lǗH$|FM< СС7+e&VU'6R ]!Wa>e)V 3V#e3xy A< E$xamCT!и{f-!&0 *Ne(w*p3:4pYf t˘pě ;6P2CL$ن Th>#5SN; PÁANPJS5%m/g=cZ:iKAXvA?Mr xMV0 @.g%^؍wM})C0Ҕp`JJMcA>-Zխ2`\t5 ɛ#uY&kTƮ oRGyΖ56!75 $2GkՍ\dȆiξY0ω #HHH ; *m--)VewjrQ獷S*I Lc~< 5)lI2׈s4c6FRsֵؓ3r>LmBL=DbzC .KLMe\ru!͢:IrD JV5j@Kdv Q hGdS5TmI,_)1D+J7Kzsdh%debЌ^i8Zxǖʩ"l&1V3.{d%i,dtbMB?J~}Vw: nb$HLm$ښݟ>6PX׍nhTkc% d THΰ2PPǓUvXDii޾1Y{^"P#DDZ"V o?З %0gN}XQ^=mz1ګ !PؤC/%`hE"4Sd"2Tm% l>lF Sye*B~wC ADkńCEUMH|T\>pg#" L\EM&Ouy d15^Y_֍XP܄NTBoOC;(}(Hs2pi[}f_q/4sZ|s 8 `0R\`~nHɓK͗0d:m:,Sc!a5׬2hh$O}orouOj;]nW"mIlo ]ƎP, &7D.2 ; lԛ8vk !C,TeaՕ)P&()*MWP#6Ae UBUޣSd3('_I8DKJVhi  vTs͟kH%a*e*}V-R>jG5f'OEi`YĊ>[e}I̬[ o>.rݞ97"ln$#?!NteDCUmўm=_H0`{6Uș9joL M[6 7 aQkZL7&2ʱI Y=h1̛/L(xD8DPh$S"6\70ۑy0Ps%kchF[s;wWZ`b,Ek>&Jx2~^q `U(K̵͞m} ;LK1=(@ξޮߞC\SIDBULNBBBA.ρk1eiHf#a:X?a{n*'i[>Sa0u&*Ux̪"|,}$m}Rm<\ndV&LM$5aЌi$Қ8NX+ YW+t9:hR!OMbB?(Ll\;0L} C%=.V <^<]+E/N#\ _ۣ<4x\GنfPC+Ά^-FWxLہ :Rd8G[sF%9ٙ :.آ5=>8hJA5tsҹvO.L3Oh06<9O)HUPjuo&/`"!8DIz,*;$edmj 4-I$[Cԇ*}Ȼgu0Xĵ\F'md1QNk}(6@eX,5#.ξξߞaTw L]ݬ30[Wi2D!@E0qi;٬Oyk Uy1Gl1TAv.6v*>$GVK|dNl5uKLV$,ҜҊ;e.C.NةI1]0u:iSNKߒ MN.hcьP?CgOlfYĩNPS01=5blq6{Qͽߍmr:7)҉kkE[^yO=`1#OIF+bin "¥ Ԝ14"6a--c&tol>;Mй"u;8føJGF P("溦cU5Ik'0rJ0'b3Rsme-I0<5.;YFzdɋRƲGP[HNrb$ٳQ,|RaZ%בfjS2wft68b*!>>+ăeFa^F^1V7W2`ƁhayC 0FQvX՚ ޔ8N$C)WM>\DDty~g-}C)P̪R؆y?ebFʤիJͺk0 dݫPdbD=jai$q! amaSL.Q~"Q_KޙډҍJLY)n,TO{;,ɉۣzF֕X3h^\}Htbe,E/PM)T -JK|O& $SA]_7ey7ND]iIMP|=cU+h"-i;./ޚyDqˁ`OI&Neuΰ| uf`L%\tĎN "r4Ubo\42?DƜ$/:(R "d&GFBuc%c2n7}?*-Jc2,JY+fIշ`S(8P'u6c+VꭃcmHRYE_l{rkP2JNcł&k9ECfrTc%:*t}S$FZRhp='}5uC Jxav.<Ɗqpӑf0{6MxbB(X"%hf#V/.j/) HƢ7 !ow#ʧP~Pa=\F̅L}cOEyњ(DV2e>b(6 iI8MKիTV> 8!ITsLv|!-{jvo5b~: j謆H<,:YܕW@޽aTqwq_3+Wˤi!@ЋX0- ѸGFRdrv/ba8 `Ǿ҈Ӄz$Ӄ$\F[Z#NO DrCNMYNhӑѬFBݩ`rHVX h##lI2hu7&}Htvb m6ֲh ':F#Fx·Id3VnRX+C~R-I\z' 4Y(o3n7, }bd^B`ՍRY9K+QG2SN.c2효MaB @dv 5pfeo4-5b^:J:.a4("PtY(W|_+nMpY5%]pFBZ!U"b{cZj#Lp)iS)SH\́E9uξϿadᬲbq ܫ~%. A.qpm`̅eȶU&rѳdJg@8uϚYd:` ))ݰVf7^ME(mauK@Va)ʕ4 6ALy9TE拻[aTڭ]%p D5Չ:.%nBmUtJ`dٯKITІ(0hXPnYsh1EH˔{F;H)mn#vfzBCҨ#*K8*$b1 A*?m(EYuBI'2ChWB'{¢=%[Z*\%Fǯ(/(d㐔!q"c!b?ecKtL"q"-$3O|ظm*Of!%Y:YylF4Q̊wPlh gmI3(rF-" )ī3oT~/P{.SďVJ2dZJOPT8#l&Iű9:t.kyA42":6q+!e47~km( O*1w(^~7$̜)]4uuaU:l$*g9⦆jղ؁j-9N9k4dήޞad鲲a/8d⌔C"D o2,G 8_n~C{"M7d(%ss gE1!3'HCعXg+$~$/)J,GNs&>KNʍVޜCդf"L"\ȅfv=\^8~U7V1ޣHŒIӧ;ߦS*IJX؉[qD!c1󖠥4OW@akS֜[NX9A[06'0oLMTh5DqI2gY&thrN0_&F~!)*6^X#T %Я}vP"LRv+yS㙹D0:D6 {Q?[ y!"?H1u9f1K&Z{͉ak׋ Ctaiq< Y T;H{1I&IU/Y}uf~d\~I%~@ 0Q)h2J! Dffg:e?-- 'C_TE1/MO@|tt|O Z찟;l(F#?-,ECt!- [Ktw D ЯT0Ĉ{/,Ҹ2N ޱM7WߙN6u L%P/tM<ַa? (Ȁ 7G*E7/L7KeFTaFeɀZ9{E1gVw lI@ m@! &LHݔke4:ȣcnqR͂z*X`k#VGԘkL:ө" UJTQ= %cZQC9H =QddA\+0sO^U yg`+o4^pbT?P{24נ V5ͶP7I:$r,__9hn#i:aW/t8q5ؠ\XĥH7AIYf4 G"cIΕɒ?7D2S_N8E`fgV(AX"1W(0Iq.LAp20I]9!5,D V< ffeBDTKmD@.trʜgu"]I8" .#808n: X%&8/ 2 Ilvqnjqzqiͧu~q)3ȁum>Gu< Xŀɀ!hIjR5Q57^en]G&-gFġ1>4 yH,ֺю;i6xWÓ7PռȜ6(!%c)RV= Ų!ˁ籱M?qUWq˜H9敬۱B4RT^c1/ 0JkA]Ku/k%*x4'm + o@ djJ-KEKIut7b#hjT(`ٚ%ZQh2t7R(ᒓVZz-'M mS7T )MĈBG3 1[ 5[Ĕ-evם4`(!qŋ?2 @6`Dl&MZeJdkT /MOц&=l^46z4*M ی@3 qIkiH2kʏeF׉}zm9*@՟Mr!@8BK[N R^1&@ 4 u7ZK{+yǩLF-}ͬ@L4 iMyޞeThY}kM6AA@fffXZpK WA;*gj*qo#5fZ`I@v,t0@bs#BȊ&a8Lp@iXqWߪ*G#F1qOHou^g ,Otitc@Σ)J֓s9ɩ}aׄ҄/΢XhMZ$N 1{%zY #逌_NO/cm%\DI\ u$yK8-e54"XoW=O@c962*1Y3UW~awa6Ra6eVa&5 ic{{}sOKCYaQKW]LZ bp 31`LĐB (PD^}6p$?2jҸohp~F5)zdCMR)#Vh]`m\E/8 Q^s#a6Fv=ޤǁD@Ƅ3Xπn Ք í:ݤܜb3$ ;?hNY룎)(fѾ~!VsZao&lbs~EưlԦ/Gq_t*2٢ LJqzoDL!YXzQ頭=|$έ4ict p9 lD+R!WF4ԫgidLLLR"XQ XS\z%R"t5 fPnah"bwbST]C,O8ђ!\xR0vPꞎt~ZӨdÔ)d[82]uC?ճ2OlPٹ`*3P+*ހku 8m%7B½)'*)(dcGdڡf=G"bA/>nJmrO=I0ԓ'A4ƠCIh:(ڂ_~umyzULa:aAFGX:/2ukffbءӨOo[9`.H2'bI'6şFL d$CdXʌ Q#g]ۦ)G3'Iby%)*5Jr`4 @kڐrA1$E?|F<u_SKx3 %`su?7qtx-V@A>xH 8 0F}*49(鈣QiG}5yQpY5l`x@v #ۥ% LRu#0Cטd1CmG͉Iێʚm)NDND~{-a0LT"'@|2 Ok!>84I T^}f_i0'(sbjOf8MvratٝGDLBb"AJ.+:rkM݀AH)¤ϴ  X2ɷDd\[GfUшc{ *% kDbёM7F}OM> Pc`kҾ$[Yٓm?Hƕ%J6T^rlOLz6Қ?ŧCy܌@2и WKIy[©#n8{n!uHzpxqb˵GMf\HCd^vO @ P,Zس-kb̵2ָ.̓\(E0ʌvFcFs'ϮL ֝`+ÁWm*| FBAݚѣrr|vؖi?!P*'8-fh:>a^e%@th3c"QKXAYGY,H|ܘ|[sO+`'@ YZsš@?4J\% (~9GՃ~awTbmKI/e4QY%I| 5qʳL`X`df)&. ½  ?;t2AZ.pz-g6vo/cs[e]wv O2a_Mm]ܦYWG{0#0kG W8$& ",j5JMЍSgWKwP/43ʱFZn];%r0 fZ`,[dTIM-YS&Lu0Ĵe&JeϠ@{ P.&ߞiThOd@%oμ(\Iʼ|ËBMjX͚g%-1IsTi;W] 1u,eF+2 .O`cΌm$S1jZo?O֒)MWhR8HR+MZa:[I{r{JɶO #q?`TIw2@gy3F!BN3b4̼ԿdM=>ijlfZkm:33΀_x JTd9izRi.l$LhR,L[CXێh$N5B&gg2y*wfgRK+{I&A (a)ҍ:BMךǟ|=fĭ$ib}ۭg!,&V$+Ȇ3Ґ)s* r̄l+ܛ|rAKz% 9B e D@d*9h57g Ĕ÷_z0" @Wod.[R7W(_Kvtv=]]!~1,6"=ωl99MԔM$ H8- z׌Rn 8aCs11H|&R- ggE5fǺA<]D D2E;|KFU: t_C9R@hN[D<5GduGӘ`LXA0p㘌8#4Ѯm(YN.kYq L^{DF I]1#uHyZZ3OUdX%dwI|̀οaT0YexlD@f 0DDͩk1[qv9WDb-[$adiYvF{G{MGVj[GK!IeRv(vw~OOdIOٿ,vQ_Q΅A[^0m}ʫ=R ɫc?= % Bxe`$9^% m+aSXWڃۜ22n"b* iщEv&T?j  %EY O8d6b/cE3My+w At>*$(Oьlw}S<u1MO2*Wh#3cfe2 L#}05V0Q坱IGD^OҩsM~}f43|l&Gu苃Ȃ’pӖvZq-0h\Yں3[!:^aB4Tk y i2Or=8&p0c@LYY3~v3^X3 +ލLFa2Jq^;@qkoJ6̚hS{KYYa% Ѥh鐲@: 6љͩbRٔ̋-y ZLTr)AћD8P[iWnŎNsj1̯+V&RRtKwpƢ#x ;N?!xx +㒼U*9eP6\8`Zư㇞v6YPHf5jr>UG1r_l\Yq[Г8F )gY7-FbŦr>ހKY\f/,mtcogkwqS93TͮNs+wɄ=,3ga!ʃ cO,yT+) Oen؎4{祅c,!-eio?(亼ȝjy̡M H0l7Q 8($f7Ҏ?\Sku8-#(βيh6k/xmRgCoc3a>HBba[u1:=ŕ$(Cwo1j=;%WI׍7be5-V׹{55Rʔّ%)TbDhyqɺ h3aкC$iQbjZugᥩheI.r2A0iwbQ j-1wW,1Q^Ŷ'%HbY>csRK&M"fn4PYkVzP|Bn"/US6%li͂δ8S+/&K1ژL†YsAy֢$LbޔMvN݇1SE2p?m"f.a4f8#)=1k2`x9`9cuirE *f[kRDA䌤CI*Z&qۢ..$XzTF]zNFtG p]7 s-IqiK A`#g' yV.bmekK{U7Qm^2 Wcwζ*R/ҝڽ'pL8҂6-;w,'rB]]m$X.{J8ƐU]m%Y zei5*˘Hkh5hPUڮzm"4,KWXȫFP"LZ},PND44%[|80L?qŲ֪Ĕlxr?!͠40h&\=rEN 'v֝UUD9c{&~OAB : : :e)oh<#AG!9fn17-Uq0(((ƦaN%G[7(S/V7(@y#F85kzMg IR$e(3-Fr̤ת懫Ϥת晣s^AW R*=*T9<-Q=q˨sm-ڮʚLW"~6|1ӑt)%F ω~+YB)Su-M^L-'\*6t}|F?[u}\߬U} 9bL~Q|ɏDvߣ摪tʹ5sb@, 0p73SV?s*ȡǺoIa^H7FS`| 3e7hM8.j.=*SI)y)j5X{O)[Q6&/;bjyc#$b/bj>n]`Fz%Q"o&rl^F%RmWr'bBt^[rbCGoy.HonK&|yl[gNOKy-^>4>D)wn]n͒2/;>mQ]C?@7&f.LNIa:g!5Y0+gr Iڒ=jTrF;ˤIo}ơ ]9=$zSEGK2 dSKu`U>D**Bɦ; e*hJJGrdəze>}0n2!4oIYDwЉHl4(M9s/!DJil=1Q, G'@%ՙwdI=e(?#}DXP"m3 2Ij5;眒ΫR]mNIiUԮ"h&N.LPmPoRba2J>d.FFD  mPoXe/a.̺>U(Ǖj3DL5]t3 n@*Rb!//Ԧ;o@HJٴ\V#V]|HSTnK= yb:OZ6TThs @u2x5.-^1IfsRK,09,ChrCZ.q1ɎY[2w\W1ID; cշF~xu]s,TCcm`XGpxuCpK-X_A-XbZ*4!E9}e\-m(%\U-=R5]} %l. %Ң]"Z1&\1w (֊==0mm{ch^*(1@ݩi)ϼ]iUnX-*L8Dv_3ko1df6$ y!:bF*,y:TRP$ Q:~ P?0 S1hU8Uh0eF[lj8iZmtTjзȷVWǑ:e61:@"-,qKl<a1{8xoT[ƃ#<`EJTpB\`LeѲƙ谹G%0j0eK`ilq:"FG&U"GmfFb3-AZ}I"E):*; ÎM<q$LU1.u-vezѮ{'lt962* C" yA\Nswm)[TA2c߂Q^8!1|:GӚ[ $"qIɤ6>Jm!(k-ldvkUIeδiPƸfL膘seJd5={ A5h80 Qě&3:0Shx4| lbVp h9qDQ3{5̙%#%s҅8W "й3 bDKQ"W{t{ %oY6ٻ=W( ҄@pĔR450Lc]#w45۠0(F15*[hG7ڶ[u_TH2aYbNZev+( [n\3(H^!'ES~b|.t39P[*Q;>=2kxQ{)9`l (E 5GhȦGő'K7s3 KVjewð1@οe6Ta?aVC6-$Waч9sc11eDk|ҥ3CQm"6G7PPƹ^kx/ =U!pp }3-kijV^k8vFmf.Xmܸ ؜esQwL}n3H-`u[xI!$|t\o ` <0k X-m-MH`hGfDvNMv2fͨrlV:JOZwz82.ccnQ zX*ܨc8) at/tj3'>JQyqꉼrpi F,vhTd2 9 oZm.QњGZ*4V̀eJӱ:j/7eN;29= $ƽ.k#V4e%ZBVq"]gӳėQԇ $-!0e$5uZ=1D`1YZLP*2a\yѭJ%~&%~·q*FRGcX܃ ӻsRC͸A ;֫IݧS|}v8ClKꗒhPe<%`T擿^:h<0oc j':]{]S%I:[Sy$"whH81VZfFQ c:Y& 1 D@@lc hH"т9(DV/U B$YԱl#{l_ade*haqW-9UFd\:O#SaiU6ZD2 ߺlTxYR[[c&?ġvFEOɪeKu,[bѺŞS jEs٧<̒;#T'b켹:/9ÿ}+lR)hϏӕGemn=0e!DO5Ac9F8o4Z73Pl4$maF$gIO1=אz]z0[RSڮP &陹qcHK]}F=1~e`Tkx2:i gThZ+W@9 >G-?#l+̜)sN~s&FjLl}WC%/&:9\"}k #m`3+l\) eT`vyAKjIE|M|FBj$D?P!ڜʟуM,z3ÚNS'ƭZki/adYQKN?j3Y苏^eIHӑ16dHI 距؊?2}G_S+_"\ aO{7ˏ FT5U?MDk\(L>BsN{bƢù|ǛC.ZLeT[T*w/B)(g*+2N|ʏ1uOﭮ3IP" 5 tΰ`h#,z(4A,"IԜƆ̢+ɻWX@  AQ:s ̶G}d܏1~3"d@v-C25>(c@2rӟtFKK>iu^.n> xJSkG8(>MI4J܌"ԅJܚSRW64ceN!Z ((.t  *3C\UU!YڇٕqXM8*ѪRhJj ܒQh-hpΒcݓϱ!m,tg0ؽO*'<1B(#.$W@ UGZX4PRFa 2ξ߮a!Tz_Ezņ]DȄAܰ?=I蠉Z!@Dnt*1c38j o-PSe?rMxìcQuF5Vd=l:|Vy, kmA@(9uZYݥ;Gz߼LyFQe=w 'ϚxEYJɋ20FRja`3],NNzK,hȓ΁|_hb{{J~#>%(| 8w$im0!eɺ%m׆KmvdUPL8t/6 Q@\*Gb*,+O`e'f)!X[&%Md䍠Db0M!MÆZ5t%9#h(3`rx.te:.(taPb0CFV+,GX!t:)2+t-ptf˂H.bD^;A Wmmk!{Xq3G4|aJBP`AYDCi;%֚X3/1̓Fvٝސnh>G%>GXnIPy`xhsK\;PyJx0X޶qfs,•K:N5[wq{7"Q]eR]7rW]&i{LlP X\RfRjiFf-mL&lGTte$Ir w5Whc4Ț*HWI'htl+a  +犣N*Y5wb).jk:5M0PW9NZa0MI28Q^-A*Fj7=01q) 0`҄0 i,{D)~LknϿξWL"Wq_w_R]-y6ɥ@i@s沛xuPt= s`N,Җ%ID{;Mh1iً"JS,ĭhQM1~ s٩B)hX3:{/Tq.YOh-/|ݦW2S'Cx4w#PR:J0JJ9A2S`ra+CAQ܀3պrYV1uh1*0Y\3=3C5u_2:əPF0"ٲõq16Wt!bX7_S_DIf:AH1 ZA$wN6‹f}$VQ:*yP:.I^6϶a_bF$zZU_S Igou[1!3 )פ1繃yB0HtZԜwd92yccLXڦ& v hhʱЕ60DkfgLя|$ 訆jl Pv`e h7$lвCQ2HLB$S3!TVA#b; fG=H2_IF( Ev㴵ъSZ\̿K43}knR3Ih[51j;@`8 QY̞|qSѹCw# "8N+-=8@e[o%ͦ5g;rՔj17zU^%|\dzqUCkhXOM0<3|sW,bo._llPouj iG#jlY떓TġphE顤uUxw􁦛0b^'(_:q{9\59{eSTu4YǰEiuR,/ Dgx㮓5L .-n܋Z\fAD0>`D(q`@A>4)T^^մIge-?MazDœS~iGNƫ(_p9(dӦAϦ䄣c5fK`F/%DR:U ۧ{׽"HlR7(wP:DQtU?"eTuw_TƼq,-g1B@ RcLQ*ٲڙBsH[8N"g<ЉI?k4Dg]OeTߤ|eI8Ԫ1cIW~-l4EHLC@q2aA %Z/yiHQ-捅VBNE˝kW1VD f,+Ѥ 7H[  8Pfhp Myejp+S%Ʈ{Yx! ?OEZ\rcƭ(Ӄ·cќ|vł,yVS;aCtk9XSXh\f1h'kN)/i>UViamux{@ HT @VB9Lu-"MW'o9UyeYБ Qd9ngpx t: emRD_T}`P5@RŚyzIҌ!"ϲb_}Rئ3?&mT]8ō$C} m/y|kBۍ`q<6P{OmYs.$֫eb5 _֡e?Bm`YThrRUl"Dmb)0` Zm hQTA1#&F+'4*%uGGISVt]Ё3T^ @gG3ūzΨ`?" ؔf=z9>+ ƩɫB˿Wb;)F-KHFMgz9!E h 5[BV(!hzoF Fnɔ$;]!tIuy6*xFٞ1 %3%@ XؿbdTvL2{[h翩ˌt/HܬzO$ ?JaJ i.N]ܕ{Q^f:z/U ˑT/7#7W` ADh=4O#,^Լ┣kU'@gP*G8,,ͰaiG1uN[22jM㤚 @*e)3"ݥؑ,oYѝ6,RsZ+QW#Sj]-rS-aB,jӅjNlb!GLG2s/ഽe.iC^/R)[47 1C[4O-Q4NVeȊa76vhk"NR?l-(űriqz V[#=``ĝ:I 8Bʝ!+lnztpy²c.~XMpM$'#õ {uy #_Rt0OS=NPԾ˽e}wHGX ֚d;9|h s}bo b@@5"&WR:@duv+ 9+@?{ϠA66%hk&qVi5yKs @*m-O9TKKDwW5vH-;>ڝKGMmeI}^g6kFdLQt2[|*hC2I 1 ?WEޚ 1VcTgJi`V-HHa.]TqxRP&H!o6grREe6(&|l8 "cn-4IW;cfSKUQq6Z)cqI|6;6Ms*LOMh۹]aDU ZTڼ?O# .2 G5̨1!Ukplw1įO@E;bcwu}C?rkJ{sf4Zv#dP+"Iy=ڋ\=եUyFѝPMntڽQ\Rmxg2CyV2bΣ:nO.x'!ށv9"8LXo8̤fJWnda!&;>춭LyV4 2YjE񑴜\G뚳M=&R##e"ӖQ R(v*.WT4wAMr70p&DK.CTHv~\=z~N&yGTʑJVTڹl[Jt[KPd0 ܎=h(DigI1Jc #c&ƣXM樕 I*Ї vJgcO]#&vd;dsOS,1 RI2²j+|`̂ Xj7< 6hkBoZL{3\rgO"i:hDx4l`B̽Hӡxhpbm ʐ5ٱQӆt&7)nnp7iĴ͋,ųo'@hY'Ҳy^by)☮kz^#x6d0!ZXȀdߘѯ2 z l.#.b"DiA'kfU^4~R{hbYJ\L4bq)l%X/]VQhNćH͞G4+zW[ KS~mt>[!Ӛ-45Qn Ho=6fteo|{Ke!0A &G!C ie~T3 d3]:Uٝɘl{3}hVZnh]y6Z_C=X=|}W XQnk0MrK8Q x55Q>ӏ& sT֡uu+䰭~bU[0+vVQMrZK'~N—u'Q2ϖr! _Y?*PS<SS`ՅUL뎳0k0klU,kU\$wDHobO} #HO{ZBCWbJLJJ:SqML96qּƑK֑J4Ħ6Q$٩aiiS>˭7h#v4}97G)ָ&;S" Snh.0\XKޜů׸̣!̩8OktF\ބZHLb$XEH`!rDI%bn_F \B$K SxgFg\ٶFj'hxh6 g&vwA&CX$A.f)^5XLFesPf6Q0i#EY*WMXi鶵)5$Ϋ>BZ"hŐJᙌb9tP M'@ )J}Q)hP"ÉE2ѺJt63\r%Nˊ"΀ʪy32tԫ/ VX8?#/yE|9 v-XGܶk8)PM hKƦްU+ iyZ#!!66u)6$c -)sC&i&pG꺖EF)-cჃ'Ĉ ({G@ۊEG}k'6Lɛ.8L G( F>19* KJ9܏mȡ`KTV#!mA۲po'Q؁ d]X ʘ:?zbTfq!EZ N 0x$M5d,C؀@tA'Xmw\2Cy܀<iܥ+Ji/G3FPF8+93!na6sUocƶx6' p0W(t*fT8qzd0{,YL>SJ)c%O+RR_fbBf"4d3{&.Ȫ94EQx{ cL0WyKivClŭ3;1h-Lձ@h@ӑ&z mYe9 :1ҞHUD!QG.'tcs%e @&2IIE 2 >=7<[Y aj)d`Z=4 kۭ+LXjɘ%Z\bC@>-i``PX|>XnJD)vW}CKbTf[yႿof]MmU "2A7c   g>iv94}JqY'm0`DRM4>u)9qinbOGюk&a(n{-TN=;/Ce x+ؙm-m,T1TMz2܎J6J՘y#H^ȫ* QN0{U3cT<އSye9](:e,q jdI$Y-zTr1'& " #Ѳ&q؞uip fGzwN{VX!%{zWAp k 7h>@kFLDX9#pA) eYJMhIn\W̋ͳbg,.O#`(n'n:RünwWik7/w({ T7#gPdCv*9.mDّ{ҜWIFDqikddVDљ$!{ROb& JB( Ƈ"[ nkܥ:=Տv_K{ތ=]C?ќ,ᇔǍ:RP;1? J3P`GK etCR<$ڰ2 ݑ !2!=KE4V}edwQzA0 eIU[vt9kf1ifS*C:W>l^8Y&UzZ:p%kk/-Xѫ,4X6Ɋ_ lM<nl9i Y$+)5'Z۸u/l.%SY[)!>7]' E46hϴId-ɅW"qތU0%0XO=7 03 UٹU'B/aab DK&NmYte{ysf`[K̕f{_f>Ǩ<ـ; gKVgДqG`]b(ׯk3d^c/Uj=i̾3hِQ$j<qe:1!LC8z[ȧMF/:Z$sZ5(@nW-#[ئ[&&ti'b<0Si1A+:i1p[;&35V)lj0)LS*V$kރ\ueFP0 y&52ӼtkY>T2[`XG2Y( Z-I(&Kfq3 /^a^aNadm jklf"㧜(D6^jVȏ"JBzP@kjf[oq;D10A,`>Ct` DfhBBxi&XCHC8D9<N:|G=aYnܮ+ḒdðFЫڡZ>Kks'+:f.JG N(>77*I[f0ʞڹJl4 .2,Pc4XskoE[kT2C?-FO1ZCBo7SϼP+R 2Z>Jx6uו>^6jl[iՠu;ieg]mj$[WRy +in |.SeJ(?9e(GYr_bŒBm7~"PMrDZ8\6c[cK]hbc1E3_&lr:wSa51v"{mkYW\ E]aR6uζl"F2?-E@%znF*&#A/]W@ aijF)o{!'@f@Ą9ԣKߕ>8|Ӛh{X,b/Ͻ 9)P]Շ/{U+@*%'&qdrS(,ϸEf2$cC,M@dC9kn-R5^Q(kN?OPcb3\/ǂ"sny 1(^oIw̾'PF}B.dTd%{OVAfS*\iY_S]bk:$ AJ@ădCH]7g€ޱ[9$c2SiYCy3I#(Ļ;]@ @qcxԙٞbzS: :/;$PaZMXя4U q9;;v< CP!u7-dmXԃaiFAY}ؼ>M0Я FeNaӽCK(«Ќm'lS8n;$#',ĈY7#l+nGh̛2A1*WDi[yhMm[ݜ#  D$*-cuL_+bԔrzPS*#,HiaV/i}G~1}<JŴføpKؿ4TדNēk飫)@5ˈbWv$C "RmN[oKbgqUkɐjদ;I: AЯ@ffg6jyjYPhQ@K #VYvPuQ 1gEА}`r?iR ˘Co!ͩQ1Tn0bҜm<"5 丌0XOļ(h@D'c]Yf {emYI+]ened -'n丷 wx(BnǪ{ECN0QgN2e[vNVF"Uҟ:ݜ8ؿ- i8š-f19i;ji!;dV=s*@Γ2m}7Q٥{ acAe&B#PI'{WP;!AbR๎ob~j\(K;}Nsŀ+-<-/tV>,vqi%P3Ul9O/?L2*1>%ƲS 07^2`F g\2FGB̋:,~s[7:m8u" I7sW [Nho5N٘\T BzB-`8ٖ&*շ+Ĥ4ESC:ENJ.~Դe_EYVoγi@ rqf̽$fȎeѯҹ٨zZ_z.6I{eUsZ %I9m ASWCc̨.NA1kǡKVSjE)'y֕ @,\YU:g\k-tf(*}ʧMH(6K4^̅r[`2w.P${ Y4[t&)VtwYdN n2. ~ezezX2Vxr4ӷq& y=+G圯T~PƘ9dLf12]QD\y\gtI?t6!m9jQdWQśJŸ)J?=':pk)3Q@1?]ðrFn>;'dr@g'4}h(!EOVQIjdMuKH\Ó gqCڲ(Uf#G:noTF6b-3%ŕQuTZNxg_EF-זdZ+ 1=jQU:i02s]%iDu9 $aI!bMך%vɬLRݾ{b-aDgCxDRS?C= 0 3/HKư\@lE8P  AH9 fÈTBj"\A2ʐ0`qꬭ.3"vOH Itݐ)Rz/ܼѮNJW հ&8B֕Fޖ:n(eb,A^˂ЋPD陜Xj]ȳWdjgSY\KAIPQkd[4'[uRT=I;E M\7W]oZT奖"#ݦV{ɨJ'(F-l2?kvÊ Zsd0VG df!b$sB NNb6K=q!jR. t6&8]fg1\r&v)/ iȜ;زqAMbdʳ dκ*h4eAf"51v;r1wy2۽&QvHآe!d(EY3&@ FLeN<tJfW@dy1km`.J,Cv&ƽuiTzCMfՐ;՗2&4} {#[lI XTo>9 C1(⇄NH>XWfiW/$m`.Kxm5*tSB:)?AS` ? bJ,G>2ؤ|͹Vmdv_34m @pHRJSL;P6;psDasDoqt~߶a?aOaFbC=bZqـXLDCmVK]W6d"4As@@ffg6e;)TMK3:6V~Tj NGT REw(Y"vsPHD]]%B ' UO'k%U71MAe'IXd܎mP=>[nOa0w[.sXx`ůFB{x7J1 Zzn;I* Z1(9RAfseeF3+GgVZ4Z܉iZ.sT,LΥ I>sCndwRHQP \Np쨜3M@i#Ԩfde b 8 3ڄ(?rgY[Sa>#h0ʊk(9+K41s-7»yLvPȽA}b^8XRd]}J&V*sYTv<2dd#IZ̗BV+ o;3lnC7E u8 }\#mŭBWBrlh ~ٰnS HٵچDBR[(٫2w2p['(qAj^ SQ`Mp*XYPIC8EIq|3j B~-_9mDRuIOxfeNdb)(фZAHki=UGxk<nQx4^yR6܃Z"~=1xI* lt#)%`AO Ҭ&D{f2)4/am>OH-֎"7p5p H1,W֜ GB7N0CVHI" hspПd1M4:RB2`X__{ϫ枢 g1blL]oSoP!g.H4Bk5Յ}9P{E/aADh&4C$tHTqR{Rm,ξa~W_7vW)2i/0%Z +1d35չFnchmd+͝t d=lc!UCe2G? G"$pF5صe=A;4E(9qOfqLe6/A ;7x3ld`7ړ~{gZ<5U2ъdõ։kܤ1#O Y96ȉ^e*愒Sdk1 &I;1ԩqL9nyIg4p%g:pYRK){Fy٥|x`)GX fk$RW[Ӿ :Fjlw ?&\\5EGmll2QZGIv^-E?{f(gƶ%^NH%^NHj,hU䋕rEt-eLrrEj򄌽8L| fW2ykhE[a8sÑOq 9L܊Yi wpao}𱂇pOB`QN<v<*a *I/˳DԪkGTXG)ʜTVsaZ߾bWLm{scP)ʎ \@v" R`ˎ5ʐ¼рl{ϻ-˳/|H _۱ғv{T=jXl RN|1sdr'(Y݉:lD)ʥq4RFH^ÚKb9Sv-vs />bXV#6uؾZ:%YmhRpm U@(lZi>dnO-X'H4wkSl1LI) Ԝ͌[ ^?'?nі2p6m'-v#71O5HԧS2-lbp8OeyHT":,էMꁇjnm1-<{` ec TnƤ춉IU|Y=PըB<ث^bTz]j& NuB.pG+@Ǜ6broSe&.] ,Et`6hAI_SRi|̀NENRYT+%"ѓtĘͯo8Jg-R%"*mvYHHlף܆MFKtp-iVKٖ7W7:C+F8Ћ*hu[&)ft=*ڡI]F쥬 S5ȵd@E:Dg )0e͂v<0̂)X=i<ӈ8xb Sv&b 7Co:b!XU&&էa5ףI=-p8+Oc9G()I־CJC⁋x}H(9F-gksbl\aB( 牴ύ61ccI= )1 #u-"xbnPݦ׼m*˝Ynw}G0*._٢fKG_:wzW17FBA jeҧ]#-+9i〄;O.CW\ECkn:*Pp&޽bSqYb.ÓWJT0J,pc?O& {ɔQ8^ ;jڠ$,;6ܙ59a~gdEOؘ9Azd 82G9zI%|:1C |(j&ğ3Ŕ)#zo%bJIdSdTV<( j$udgI2J_1;,iH{ŮTm8XlҞ!vsz/]oضX8q$sy3#8":ɦ2[̢b2}TƥiOr,YBPf'<ސR\G[}ZmRc]{gy'Za;[vB%M3@P8pb:y):Vho?[O4O1FrB=^݆*d;ȄePT]tmE]K&mc-ZïO+%RsM-W\`F9PR !V9&Դ6DIpkEJ~wyS3gFt3}? e[oI]`^]UH C*D, 8}TkAO.90ªFW~0#];oew ;r$; ڱRحa?utZJt$1To誷GqIFU)y2KW?socr?O៹ܿe (KuE*$t|{Bc;V?fwM~nɄjBښ#ÆӖn΂$%ÌΌnVTIQ!*BGB3ھB60^;%A/ vG093>s@Cw[#-@=$ࠪ<XAN;KГǂ0L%~Vi09^FlPcEvSd$e`'V -b܋'Sxd!h iQlIOd4?I)5 i+6R ӸCct360Ct9QDU( sTcf[{ d]^묯 fƝgH, l}F5$+JRޤN=⒆DL{.І&v10S7Ի,$HSv S*RTJ}E+`JET]U|9(T`TLTk5Eݪ鯼@!ŽY݇L,,ZYa~j!Tgb;:Z3i[(Z3i^j3i[ 3iY3m(U2aVE5窀z]HqKjðN?hm":qD!r&#OmG*cLټnhbA(WM%VX+hB߳1ٔqm>xK=)q{ wD> ]\5$ [4xj} #2 ,+aL~q=fƓ/Z@l2S2Nxl\ȿz0/MtňM,y;"nMomJoJrȷ>^Nȹ[d[R'd^0D^ȹ;" QmyBDOЁ:1*29{B&B׳VĴs4Y7:]Cq6a~ i3zq(rwQ䳸iHh+:gB΄V Xl P]9!Hb  č1cշE,NKUɛG~[Jm=&cẑ2U{RZ0pP F % wTefSaIbC}=iUAȩHG ϟ3T{wv7))=ҕ/=q0膪62h[Q(a"&Oh\J}y2½tu41r@f[fv xD/qI`dAC(c,F;߅MA&'EK[W (zSIU˺*RZK跚*RZNm]:*i`UNJJa#SoɃ0 $\ݪe{雯ib CqV(&/O>׶~wX܄eR[QˎJ9s+sMeXTdB2CbMh(%uE?Ww*8)5⿬b&H5FBBFPqD*? 4"Hs:Zѳ PSzLcF/VxVchZԳƈܹ4DD}>ʶj~U.pŕY 扰IFAj43h)E~˚yic"ݥs/C8U{c/C7ѼR1xNK?CkLg*T S0 K9X\hf.- )Y1U*oyJX`sRM: \ HBޖ}ER,[(GTU ̐ao (Q nE6dSqs iz6|i۶|@ٲ@4BIiѥ IHAIJ"y^#wl%8e[e[k{V7787Lc, 7Kq6J(Ze 9FNI>fNL"%w(QTaт$6cؽb1!JMVHTW(*9H>;c@֪ؗȠ0u-aoM3 ^4PcjKh_䅣?h_DAhL[iFЙ:.ؚ)Zhe>sOf|硒N`S^Oo3$Sv^O[7dđ:sO<R{9&cm-e*ܹy9=a"", ]w`;x߄'!.5ԱΥ plDw3c{]?K2`QɁ}@9f JNmj~;ci!sco#I?ȣ"d@9iI?0DBɬ" FD%D c$c{]?>i=R6}s۪nb>v$.М[ibW$[e 4ȅ`v6`UGc[UWs$[G.Ϝ3XnKj/2gGIZʆ=?,sL}{c4%F{W5Tt\}hX]2֗-+Zs lm \ {ZH&W) j ))܉'#Q3-b4Sź'- 6:utez1WӅJB+^CTcD&2nF&!YV"2pO5a" s!L]̛K62oF*q4y$ؗ@L"YOI1$纗@^D@IM$ o#!޵7"*z]Гr[E`!S50e#%7ȑ5XuI[EFs(vOc*kJ\@8Pd;"q+ *,(ԏ-wajuS{SFZ}` T7m&U֠YZB*\.ђ_)pXc y@ R QQ`ԥ ūXkDu=Vdu>VN539}oDL2aWDUEFʇ lm#ܝwK[Q1CB 5M':*p$f*A2Q"vLʜbid'.+b4m[HJnNvIJT3F򁄔g) d*™U"(dhPAWBHnύ|qHd⣈5 #j=t l^5E\kvh ahϦ>"yj_C/J?G GSp8y+TWp98'UOI.Er[& 9vIN">>7}X!HPJ[ 0#98D/^1{@pYYZx 9IYkT0mΚ|dSg58ge(+Cxx-P,.BQDT Ae-h(oё)ǍFH@}F2ijf2vLpE@`AP8b%õՍdnI~JbwfKdj]l+je.8 P9"|@\Ie쀃Ͼ゙D8 1k([XՄe@cЋodȋ@۪&cYwL)E~3&Ӊ7Zam|l#PW M hs)*sM=jr0-(L{J={|?m2Ce@嶎Sj~jEbfNX00*sFk"Z:]ʶ&0+L"s5|6Q(H#ض/myCs0&(l:gҴ&ؗ7̩I. q o*=P#ނ8})rZ?]y-xh ֻ6TҲl1#*+cqu*2xdMRy0c ^+mh@g#4rau( )W!= !XRXQM"|SA4I0OEq{i(dMl0)G-VɅ$&V1"BɉsUrO(@c)~utj$^v֥*2$dml! ֑홺4!画u%!"3+5=&`AJ/RKoQ+G,D` Ox.3EOo7R pIEV4FBb=m_Kre[nIUkYQyeT\ͱ?1%Af;i2.5|isr9ޒ϶9P!,=VN3AJN7  bp6qJ+de ha5mNҳAfgi;Smcڶ1~b>i>mɾRbyAyyr{6ܛuF1jptVld&l46IUtlьE_M`αμ11"]ʕn"y?&,w*b`YzNcE1-:A]/%oɜP߼D8IjL3` 'c%K',@ʴ;謏fclO%>Θe<쳟cjq`SV%Y*,5Y³L~nI!9Ȝ!unm/D=פdT~ !O|P'6ڎaE[݅[ݍxbUCV3֍7rtBx, )۔ƜF=YJCG:lVNY ;dv!M,-,}&Drl%:9Jh߿a_eaT7iQ%u}{&f%5^@+tFNOЇ/rsùFG|(K1t]r#;1j)>‰na\r#ۼ}Ǽ~oo<ǺcxXՔRtmzک٩NF5[%J|6 AΔWnO4N򘔂JF@t.{jQ-[I/E djnBPJ*bxA8!҇:" @M Թ=4Ao{&̩le]]<ԋIW30^|0(!cG.ā L)=דgɧojyd4r6@;r#קvbSX8O/uUO$X$Rk徯>*>s+JM4J8@1͢Zьjv`wNn>v l/MPmkU_1,ɖһ@q)%m@R˛"+F2[͈֮6[wՖӚf f}))ɺb}g,ϫL`׭)=;Uc 3,j ޓ|߽f !r>HBhCԎ--֤*H!ZPSN苡z!~4Max/۟-P}@3Juxo f|T {` rNlc/ekѮ*D!)ARxѫjwJ~Hns ǨЭ߲A**Ҷ<߅Kq8 X?ڇۜāP15/15qQ`R1%14zSV\Z6!;i%0~G?5 Sg/ A<$="!7fpTK,Iu%ˆih`f[oRkAW7MIY` Gw*J}>9&G.e-iQ &,+~x+ '$ĭz9`~@5AYmz# .^#r"Mm!%|crҖٛBBl.^ّq`\ؒxC}e \g8AI_'8kLZӃD9kFck@dѦ][+U'indCL,sSgC*:B,9ΫMg`=j6*QjRҨD=-Q 1/f ? L}=t4V5">It| ±VZGL3ʁAqrI[ZyGqa㑉,n_̑]\9v[MJ_K 2_p9BD/BiQ0$BkOgz=_6 '|S*uZ4HC3J:K v?DЧ64>K)~6^DDe&losw[3)BKFӍȞT^,77-lWs90<$bFQF02;e):3b_ċ$eWN4AtF`82 uh`U-;C86Զ\P(a}48IFUɳ DC̾yɎ{u}'""bk$PǠ$ޒvhժ>[i^=W\~|8 Pw{J"H)D,R>AP6:s$2Fr\ iSqMoLun2e9.аa1+n!4<ͼ'l͐4"G*gL U)QHXT6Iw/VSDj}^md$t&d;~ZD2V֣X4Gf9. inʹQoZZZlQαOU +HA٢$v l#whlc V6۫=傻QxȈ~$MqaNF*`'-+.e~jgIl.i$Iaw>}g轫+//;h:9k7L#CbN9~`X#Wqc.tkMN¢)HOoNѯohiԋXa" :d2({R{ٹQU@H+%܎C-ifʢtTfe6fE"bP:٘4~^̕O~lfN+i8Jv]4bDoyxh;]fc;M'*Ļt ʔi\! )]`"P)4^~yOr*nf~IIN&а0JخuPQ7c- HfMS$c78mcњQ cdtd=>}谺TP[&iF7Ee-fH}=hv; am6u 9#@AYI=@Y_i01Cfm8ZqnVDn0!CLFs^Gs *񏨪ei2G} TǯeT8GGwIw,:] [棶gNs9󼕆aTUșWk INVgfMQq (E0xDT`TFf)RH8ҷ]=KdaFavrC,:dtD9dmN}Q"m"Ћ- ek"z)q 29s5I3L—ZN=C-!Bz2tH8O2ʳ2t H9Re&B94E4ѦeCG h^Lw*PUJHm-e,ʙcH~%hn.ϒJw۬ysR(+2+d,02C©*7(7e)1%Znn"&:ej,LNjA(>zBzDfɜta='e"ei*J ݮ$t$ƥ6b|!5/_LΠH|sA}C882#A+˶*H5xveEusDx\G1X:%]ԗwWZmÅ6d@6FENѧڀ:&3~T.%6w%ȶZw,E5Nے^Ҥ0Q4D1|ْQk6]C|Ιy47Fcʛ}!'.3|еPq+oFu*Gq%[Hl@`16Ki/Hq%2,)vn=b9[Sy06Ϧ&2 gKs<;7Qxj3,!䍪 AcAa_0,NːRNv'k H+Tr{ȇžp=Sk=OC>ԨͦzPK'!RTi`Mtt+:yCqtu4Q}t$[}9ܯ%_xdJ9t!fΦ'<>Jr'vM!0{ +w1&_'@6EɾeR6Cg{3}ez[15j2e754ȁFdGh$v(xI&e\;rl CH x?󇧉9twi$@" |'$ҜQ0m4ajs2.\hPkY0narceK\beRfz3CI^Df'I1)|6gA_vu7ԧUt 6S)c#AКoF@DeHIU*a\$S ;$ ,c `n{eV"1̧}IyȦ\V48q!:G#rQ8N2e"Cwp_0dKUe;30)f 9OUrMoaUCY$$MN"'$9r qPgC{¢Q)%w%E kC[IѼEQ r򑺖Tb%L%@0>NIL**udƪQkBE-qQ!1'6"RDg'IlՌ"Ō'rFE-E,s,SdRl,߿NCҺzQĢd)qM86]W=X3@;3ce,0+mGHmuIL!a ZcR6瀟},i:㔈1&1 i>eI!o<Y8=$Jsr,3 F L*$g/J :ՍMG]NtSE:mzga5߼o3IIu2N5 AL0# &k"nSbUB8c"]= dXILje[ko0]gY#%?}[?7A~!1cΉUURn:hAb, "nƩgb.k}_[Xl[ӗ 6Ԡ(]NGR W7ؒTmD+$=5[(Xdtܦܘ)gZDJ9ֽkMrcZBlw (KLB+Fy$BPὬ펤4v{x2C}VޘrFu6< V3vq\Vg%Ǝq8&2fo bF%b4|'A=JsW\Iz俰>Nv%E|XT딕wtI(wDjbGB=)#H@ I?RUʶoF, `m tC/Py$lQLC*n|;.Go6O+ٱa)ǯoXCQ'Z=2cg>}A-8=UiXXTM$!!&W `Q@ffeBh̸$Z{n|3 fv0Y&wieu^䯢vYQ, zVdjL̝>JULBqf~K(iôkRJYHI&g0jH-Rq4s4zJ6%_'m%Ͳc\Mۄk&e=f/)'t/s\*kNTvq0 -FP4rȝ/'E8i7~:au^u5;Lo\DDSC$W(] _WfM+U4{zcJˉI56CYT< e$oKo0(B n恥c"H*hQ L39*kjˀ`*-ja`4éQf:׋e[oy&!ffK 6dUdN1Oqf#%AF;+#( ӬܢgG^x 6v=“|?a4n>1都Ș*ba e-١@=NxWVN< ǒ60ՊZ8yMâ)c\۶-MShtFܙZp@֪0؆!| 3a$38n]*id73O'E_2H>tj D$'jdCeYdb\Q}+vLjf=}˓@= yt)F|od?/:.^iA/b.V4ڊ9nTi)je 6'8c.p'ɝpt 7w\IEDhYo vIek7>5iC P.@+#lSj4ȹo;-ph)asC4y LwWBum=Iɚe;u { DfeZ?b3$HXRNvEBv&,dSƖVWa3aQzX,25>|Ev>Ú2w1Gp+96!ZgRP&Q#zH3AvGYɪOVsOٲQK|_xDɗ|V t}&z`6nkJ6CmF$)ًLGED1TnFa<#pԣ«*S[[}IJ&#1ms~]m1֍/O4Elj7NyXէF&#~߸GD쭄~lPXU窖98{{ಞJq= Q9 ^lBc:ڄ-EPbBt,۟2$˽4#ʽ[ؒA+{NN]q4-*F +~L AВPu*esGAo `-fF&")t)!1(oHzYZ%P!)֚>qr`<1J(կu1CN]\:~^x4ߡigh"|9rigf|?ϸvXet4>x 'K4qAXHi#8YvՙK$Ss#eVZ&*K]XȚ%ok \dB{H:ۯu4z@H8I?u:",clMCSSʔ3.TOJJ*QĮT7JJ5TT7JJ C~ SX'  W (b%ukߕvd[DxUQmǘUn[ۄcƚk9gg7JYN}'ȋߘxh֌OQIe*of(~DŽ(&TX(ĖDŽ(xBV+D&TDBV+2x.0TKIU vRC,cyY ܜ%n'e댖4]]c,F>*@,0zV!su7Im'":#ku-͂pu~ tIaLcO#ر <@ 4;QkؗqR<}= z*:>{֩}r1A @0t.f]Hg@7!umшD92jhZX"mTYF I"SEEGƚ<ۣύQ6pG$fUJll +0Aρ]DqlFCE P#MJMRXyH_Qcfyܬ\wĎ+-YxEb:;1\LH N³ ֭8x@%'6)=_k55{5l~Hp>F*BrF*s1oش<82aُD˹:X蚈SbJNPMNAų>[&J'<#H450`yAwAV^zZfs:c{]7 埴ּ-nYrȱb|Q/ȉ"|\EEĺ (| A[Z7 =zB𚽨)e-g™|:$S-8!a~дxޏӥtY ]$f@0T#<=ÍGSbNeI4G;J1ch̵d+jiQmc];Fq򆛊 h[Z_\]U h[DTdm2T8\s9{9lK۠nJ=R|@$Z-^>͟)"H@9> &\C`pHLauMv"e.N- Hܠ9/gB1,&4:koyf(7^'4-2܍^ݙ\{@=V)Z DR<-d=2\M~l͌g礸ťVeV !aS3%m4RNBa\Cuxq?E* 2GmjW/c{z)ᒎ{i 2=C a5(ϺgOtQ#xbI$Sv@93Em@0mt&wqmqkRu~,P;H@A a0ȨFI0>af7a>%>!zm%kؖ1A"靴Ew_wz$וKCE錈cJ'O _r[ "e'o(%DܹǼg9OcHK0ӖcV}dE>cMS;f&#ղ,ZNzuFu `n=̈́sNU6ՖZDMPSu6TvT;tIJ:嵟[0A^w: Ұ~tO 8]3,iJvmˆ>jAf-yy0Z-@BvS'RP/f0Fc$g̘/f9AINTKs[D}`YiCXAqj3ቱ>.--`S m;vq%Aщ7K+-Te.4%^qae[-&!v/9xDO8<1xXV,b e:?ԓCn3ZŲa^Nu-L[fi*sxx (BIVCo+L 'RW[C 6p^5\ 9 WЩZzZ Nn(5&VC]/)574ENrtUja.B\#n31UHqT_m-a9OiEXYq(JH5XMn;3 {HDxPV'ݖ64NwCV Z4N'%Taڄq2Dn"h+34DޒyԴd<}T( g[, Z4%Ŵ?|hXnVWT KQV^;tIxަa,]E¬` i3)2iZF 6mȣmJ//>ZTFE 6GQlJ!F ES iLc=3!bgHGR-l&chǘ#{lG0j1WrC1Lqyh ,ҋ*~rҬuQZ*-5_6/)2*B0: +z*@G@=D&QUd7ͽayfZ.L:eؼaY,pbDV"XD%)*'\ESc G.Y@RsIpƱVCJXaq54X1"mGdKjΘ׭ XIx4}Mn[D73 b` (d}E'J-Vm\eCԖ)%$Jb8csmOuמG ~17@G?5\5g~nciSn:1j;i ]rb ;^%﹫;xzN)eaqo׍!(*e_ne9bWć/la{9c֡ߑnGcyN\ClN%_j!pmmi\aQcu).ۦg >܈ĕ ]U0 j[]nCU6z 2$>BOݺdL[.R&؇ )e9i&^fa ;b}|mnLmt3ȥ͈ i O∧W;.?[=M½e|f{}еQ{%50++\Eq)'A[k-򣈸w"32kd*GaØVNJØ3*H!#шv ܇BP-WZB-P#޳0i+9= x@y.j$X, b|c*۝YF>cwU7H:j?D㼾^|ߔ:b|KLMMnGQۂe[dU\&줢ME.ρj(c+4T;;#qWBKf3)˚~4#" #  `j5cy23#g23#gZ .)CG#9¼Cd 07 C Y-0ņYa-e/m"_=5ΗpYnK9uR*'w:^ ^/\]ʚ! t*0#W)ʶ0j!ŇL9,Xz9F;%QP~ՀCƶcvR0L Ҭ##PUpk:@Qa]⨗[{VNr:R]N`Rīo]%yOXYч g?$]Lk>LkV^B䭐khƶժtf"8T˱ ؁U 5 P=G]BnʍVllu ;HHY"52Fa v7f+%"VΞw0 D1K-IT9W3y.1=m+ɫ5)(xH$42QTi3W訆9 D˻i_lHɮ\o;VVuΩ@_ϱ fO ڊ-nUEON+lmѶ;{Yԣ#ѯ 8QQB=P3Mj[C}Ck-Ejê갊S\e݊Ϸ9$PBQ%cEQ2%x,lNܙo  %e2hjl,c9D??_;X+[S=yˑ~29c5vjR٩U;@b x`>C+v>sKA{# %B ,굠!v!hF%G6;h j94QELF(S,4(U+AUfdMͨϢ.[g.@]eăO!,*DbLo#}-EW1F`1.;0֊c) Ҽ] u"o~'f-+a?ݥ,kA$͊\J\^zX\q32a.{,aRccDԇYAqP/iK{iKli㜚A;}rGO.ŰǤn ~so ߱SC>NHd&-0RڮfdlEVI[?!hw TS-5&MtUSn^偈ΥNꘚbJ:dnxw?iG{.te;/ΞwK~-F G! IW-ˡ^sI })ĿNn0Yk$ҡ!Y,J5 Qр@ߤ;D%6d#=Kݝj^DMA'D@t5H≈%cz|_MU݀Ħj,gj&7mkF*6pyz6rsB/tNLZAGjaN̈ &:lx-Pvq$$xKgV!(KV͵Df,uE:I Fa׮!' ̡yէ QŎW5QiΫ G2M%>1 \yF K61,K6 3bc_=Ca6+ѠTJN2󚇡(fA3@gLddf*%9b +F[<^r>1\Ư: "Dƪf^l¦/p%Qcf1zLO ɯ읩lB*2.[@xaCGc7"b$fRђ(:0d3 i9K18LWd||&թ0h&:vxk5Ʀd (o:Ќu9`D0&zUhAIJm SO <۱Q7 GqԾ%϶a_aVad3QOKvgu]=jsmbjtdb$U(ЋX )Iکdk e1iS&95m~AALrgqGDqAVqDqGDzȣF#Q!ĈzQ#XE'l=ǑXEl tl6qNjs ;᱄ժvF댯&1\9q`j4oP-:d-^q?yzxF̆ki'tgaqOX0aޞ &}3$Lm~sm~ _D}+17#MD6=1۩2fڮbsW}M, # M &Md;jf8a}JYtRǥ.5Anf|q3EwQBT 3>[3Ejb46/Y ې&f!S.#XWN(&kP.B(lL n0f#nA1̈aIp٠{v xg :pzOI{G1$1LdSf3m\Q\f.]att)Lh°qķ0Q3E1U+A3[8C/=.sSHʿzMGglգf ehi%F^1 #Ǜ蛂+*)*4Cyڄ$Mnf&mcqE0.6'zV._0<ƾDq$օqL8Mqbj.EzNduRz P-{@.$RD/mdWdTlcQcf`E|LD0D0Eah vJ]1dfUjoc* 5@6u\o\ye3J<<8-g-ce*41oʨy:I^nLmVkm\s>2p+ ¢b2<g2zE}2<ьTsG7m7bvf3FtPlOĴqVF)ĴnEC%{~2]ݍ%*v&/_u"TprË0{zOQ9/^WEqLHe bT ot܉$bgHuMiH '<):+y1y$5 i)鎧P*)˜͜ITInᖗ8)&9x؃8]j ֢QGQ3y'gD4RgB񆖋-'u w$=<%c`9RsxA޾a?afaoGfF^kxVЈώs".f= М"jD,$a)b\S}5Smy>Λ͹X Zȩ%Re%,4K+/[&]J!Pѝ,[&VZl2漢bs@ռf)4Y%3-^HTl$]uH MyE([״bcD™dmmnDQEyވO@zʊOA=^̘Od QO⪊)8&bILΥTyaaď U^lUy W'H(YNƉ*6~ET9"ZƬa'_Bz$:\)ݰ,pFЄL3;~0x~UL'lU^Ibƈ`&"Aw޵d VVyN9m, 8Y:3#Yb:Cꛢ:B1Ltܛ#%MÒR>gZ{110,Z'; (ֻ\ч?F@Zo`!f}N͓TiJ+~ ..sFkȌ}(WqL3:#la ǠmM:VlkHgka!W=X!NKX4Sƌ_0 {5P+i\yK]֟RiTuu<jreY~;"DokF\U9&^^*[F~$X 'd*bvN~LC._=ǡcJYjƊ @:Po 镔VqNIJŋ3#@^uG3 ,ʈ iy V -~>Dg8 !< =_ۍv|I ʩ* : @?c!yD 5w1ta‰'ԹO"F&RIĽѯ~XϙjDy5` *4'Tʺ5hZF֎K(n3NkE2A7Hf͒ĞPǔ:LwS%]Y?PmA+;p•O_[iq>Q8Z榃rTJ.*|Lfb B;(\VX%, ߼>6-&#' (Z8zfι!-ɧ:q1,z(WHa$'י;YR J L!L+5sR"PQ= eD5+2~GQGgfO]q'd̆(DKBlCxVqĉ̿>GS VG)%\v7,LX}c/ ؚ^3*֧!pYufudo52{"tܰĎw9cdr()OO*iJar>u!SCz\j/9{T7o SYo*F.耍 . a/2n,[֑evdE(e9pr)ViwHO< .҆v{糶v7|dD7P]L1KqhZb.' 6@RPBc X`=*%]#ezT`a{yss)ɪ+}j%N‘܇Rkiv ݠ޶hpScE GMj9P$%"gl+$#YD/7tnJ"7vTr J Kzf45=WJҰEZ'mYJɰ D>RcW4MH3z$)5/ eBJ$8Z˹ „0d2̈́ParyZ}oW^yx,ju)b:Jb o?SHLF|4X $:X?6O1+0vݢ-QU3Ô9*ye82/TϻoŻ/f9"P,?P4a1 MfQ*'80 qQ&bQ,Í-=ʂn[o{*`̗n4"ˍs!)`("@;HAtT aXᆵG\v$6]Ķ>L1~saG#ǫ8nV4=!kwG q/tssPׯ =GG\-vsP-İCl1?>8Mm#ڶ>N=A3SCqmC~ 69hO-m YHfj3`+פa:m{˛:CPKf:JcXZ3i^F1FNC_ew:ͥWVupVJ6Qƥ*eCLs[kW/ 1Ԭr묭&kzO/ Aę!$n1u@bx;fS/;u}0Q>]S=3VD|YWSGUDWWk1Z˰R+lU,ɋKȥHǹx(P5!jaڤ -t0L =WbXFXUV|)QFaBU}+}ЎwRHj)8-'\FeǞ2Dk9ІoſҼk5!#ˍ\"Sӝ,"Ă&ɣ4E[\)H ɡŁށÊREKC&8#,e͛Ǜ`Ū_uy~VkRVmdtVA` s=1r]זL5uN7c<<6 , XeoY]*!TK'Ƽ^ma(_{?z2 ya]cΆ6VwlBAװKM!wƇ$얌KCgX!"ƀ %z wɢ$|PJ=#n[bƁ斁fdMSBϷKBJ4..̟m E.RCLZغUQ -`*XTG .)w41#3҇J)B PfS&V{&m1s[dOiw{d P `Ak0OW7-eYeuS2#'5 ۢ|x9fS#mY.t(FNj}Eȃ2ڶqce52"2M'pf7`ξM~{0۟!PgdգPeRzV80HE^[[bx̄LCJ bBs*S?zy~5q.[Ie[p$|N+_DBʴdI\ϓ鰋Af;/[zX%l*qښi/vt\ڃ?Z)b # >,DXQcqq  ,2kM ;^Wu4XVa6 WoFuKV-_59qcCGb$SUp73KcU]X#扥k0ufkGdr#E (#I.j܈42NNޏ.%D,穭8hVxQ*YmyJƼ7cA\T5GOD|C`O9IpD\O\>tMyF2`PhU籊U_01S,% 2Z-8bK)qWrQf$+aPwin[H)wScO_'Eg$uZX.g)C* A_ ,:E1qy]'^i`CC+@ A1]lX T2 ,[bS26y=Rma6DHP8I{(>hT%i 2riQ֟C9scd8nUߜρ ͮ޿bUGljM06HCR7gl'  `Airn!K+MγY2؛m(̈l3,/)J(9ʙ!ĸnZ*?g h>|Ds$H֧/mC zb#>k} ξ(ޜ'czaF.gRqCVLY*OԱJem"#S23% *0BVe݌zMG+߁ Ҿ8Emuv{ F͔_J̱ތఌW`} 3>i!ʜvSӫkf×Ϲ>QUace,C]QRgd;omUE@a -zXSuI/Rtq]̩Ɓ[ˆ1V}j5Gu<`U[bL}!9sG"=BNoe?4TKU]X#-]ی3Mb#ԺrJꄏIF=KS*^=kB SK| ʐ2>v4g'SqP d<6s<:* [Tv<;Q Hp,f"><(3CjF.q<0ۗ`PhihN(UU7]T (NR qUTS[QrՑTQU\)mozM 0J% >+T[{L?ϟ>cu\M›@T B4!SUq#ԅ"P2:( HAIAKZlF)ڼ(ޯa_rVFȵ>6Od,][%>:vM zlB(sqS a"vYĨAnT9!2#2Zq{c-2P f[wߧsgn2V07P@Y+)T؄mٕeUQk 2ނ2κ'>JS3ENZ*dԊS%f[֊g!ŭVJROZՋ+Ɣv Իfһ03RlyBce1|}5l(wo:y>+wEY.`HͿˈ~bA=fhXbSͩEܦF} NiW![ƋR=ozͥ:S,sPD2*=5 y$ģ/:B/dMƙ7Q[Igʭజ)3Մن("H`@tHZ LaUeIj6$ytlnu念{  ?^"+ 8d"7O2{h:"j 2f,r+y ³{{[a[݉%ش:0*֕fy~cu&8Wݓc.ʆ IpY|MYYkݫ;dT^:pNGL`Lq?jl][tqb]p?Yhc _b ̲Chs4@ a U̍ñ4qV{ [ JyXU +_&V+ᱯ w˯w%[Xs`NžKNFlZ 2]~0`logisim-2.7.1/doc/search_lookup_pt/DOCS.TAB0000644000175000017500000000735411541757206020271 0ustar vincentvincentee_u__u_uu_uu_uu__uu_u__uuuu_uu__uuuu_u_u__u_}]_u__}u_'__c: ((Ȫ4*+86Jª4J/*͊(pJ.;̊J 꺣Ъ 0**ʪ06***EJѱ# *0ª+43 J0*0ªpJ0 42J+(ºª 8B;*0]PBB`>PGH|LҡB!*e,kbCJe@cQ#B e0L< B*B BbAČP @F(2 ^ (ѐ" r,(xHª *£ 'B|2@4HlH$0d,> EУ * ? 5 p@%`#(³6 ʪ0tJ 0, RLhUJH; `P$ <  * BQ"03  B %`@'2(N ),ѡ!'F/`pA#| B(0Dd(p2(&(0 Ш84'(\%C@|O0.(`N"9x7 JĂ,= C$QX0 #Fƃ`g 8 Bq0 E? # # !/‘Bˆ! ',9 ć0P3 #ƒHb09 tLdPf(£"hHL B#5*8J"dA(+*B" }D*+DŽr(hP\aa#Z `H\tXB`(xH#0*(‡C0`QC3KLdH0 3 E 3(- Ya(tH$E 6,č4H|P5A#FEƅhN0b,Ȫ2dK,(`LQ;2b(3 (p\Ҩ6 K,QB2R9Jq B#0lT`2 Р$*;*9 |LdHҏ.8`KČʌ(B`K[b0 8a &P)Ш(J5hH*!aB1= *7(*04$02GV7"*/Ϫ/ ,س K ȳ *//0 /42/0/0" ̆1?00//K0 /3,ȳ4ȿR//9 3/b/`134/ ŋ3/4`O 1̋00 8 32 <ȳK0 1г,,/03"< 0B/ 0E +/2$,/̋7/̢/n//2/0? ̋0 ̋002/0 /03r̋08N/00 K3/08̋02/ //B͋,ȼ= <Bd,/;FB83ܼK0 07пL// 8 6]vo?*oNRZm=1 (B %X'FM8"4bg*Ƅ}ϒ]UׯWOUmmm&vnq")[{mΫm'_bmmuM9e9ɼٖ0"i7S@'P!m!_eee_v_@ee]׹~ȿvױZ뭺E17Z-Z(@UnW.[[a]a@q0!;$@@eҥyvVpMvEDq{R՝ZP۾tNN֪u{nMuP^\$*vrXNS"IPXeۻш#hY`}_|ĊP;1A@T ĆR bpPJnM뵶muۭ@W0"i`m9 lX ,1!VܴsކP0'ݝ}șڠJ"2-nbY9L/Ѱn2@@@X\m}m%f[[ñ0A` ^PZ)@%@ؓ@es/PyZq$;{ɯm}g2$8aZaZߚک"D4v۟:Fm:GlV*'SuZkSmo[u}um֠`MP@<əmLKꪦgVsȂ@u0O|kb2Dd tI8QHy'QJi+@T0m؝ڲvf^ڰ;[vOMZmmmt[Xք|@ g4@A#T=g'(c_@y@(b2Yi*bV`̒yc#U ۽0J}k[~bS|4_\4*FTP`l l5cJRĥu@nPFa P3H$Tqy&&(тB_\Wv^MgDN@8`z̄@@$oNS~ݙ6zuj,+>/O+51)I`D͓0Jmڵ:ݭbPUa>qɶҜmes"2Qb}eyR[LgM[mU[uKWmPO2Zdg^n{wEm@Xk& +9zb6a<-SI@ñ"pijm:˜Fd0FU2@HS@ =OՉ|Nّ:.nnޘ*}]L&M@اD0*7Y@5^빂lVnŲ*hE i&Uɬ0@q2fe_"֠RqXu Hq{~U@X&dziđ^Ĵ\o孀 0~jIΖءg}SխyFiL:c K6te@P (e7Q@hB'0*ow`Hn))r@٭:XTSpԋĦ-S`naJD >!oIo[s 3PMճ !rQ8`t]2E+  {ۍKӪd*#mcINa9qfVe4}@bҬe.қa\͹@3!ԗˌd%W*.yY;:Z @!@7+v@9#IWF辅.}BM2j @ɚyIɶe@@`66@3T؂@F@ɫm'iWڦԖSFʬힿS6(Q`@0'G_e]ihHv%@@DkͲXj馒6!@&`ǘb\vt@C'kum֠ɓB+&@ٙ"3"0#@@2iܳE9LzSd +q^lf@5"9'ٞ2@@m*)+0!ܩ@ѸQ/{6!!$ıa#ZSjӒ@ueir0kdݙj=9WbJ@ӂqi;`wf6!1$@`7[eVV_eetۻܫ8(ٶor բf& nM0Cmkvۮn0,u*e-":,ͺhhjZ 6v*XĿe2M*@D/`ⴓ̡ PMh=C?&@@ѩ`ɍ@PmG=JX uGG+ӕNk&oKf5i1+-ۧSa]ʻ˜@f2@4҄. ѵ s@ɱDVΘ_:{/ijX"t@ѕ/:i@@ɍ@glP@ jڹ}jizQӔd*WMɉ@B@4X`AvX@.|]#mI@2'4@jN[S@i»+jd4KSym˹1$T߫&j2"z۩@2}ZFigʩ(Ya@rP<&@@2%rbBfr~!@0&8H%3vY0꣢*?iљ@ȉ@0d,&"jrɓ$qJ}*#MD &H@dl\@쪺ɩq\m4q Vtv@p3$#ۭmX@;!@F&AS/VvJJ",2"0#adIPkڳސ@鹖ry`r}sU^{bmnukmmTi1u6̤ᭀ@q'ljjȴy`0#@a&Q˩fQQi0,$ƶ1Z>#y̌@|iE=:P2ZqY6@$AR@i|0Z`K"@}ye1c|rf\`5zŀ`15i@?b@e5Wk}D0"@0"@0"@$((T(((($TTTTTT$HP0"@0"@(((((((((($($$,(0"@$T`}@-0T$0"@(($T`|@(TTTT((T(TTTTTT(TTT((((TTTTT(T(TTTTT()$0"@0(TT((($$'`ۆ((($(Tš!"bzzŶ1Pbs3@ř$kʺ@$ř\Pd@cə4ʗ)4$eΣ1'TZdыE]&@@eɽl0T8|@@ɱe68PʟN@ɍ2eʦ\ɷ+<ɷɵə4ɷɷɷ8rv5~h`@$d2!ѴD﫝ed2&ɖ?3H@44:&3H$Md2ɋ@44,44$244244@dh[$@66eU27 3%tgtNJ3.n!@@C1j3.Mh̢S@δff1fێ@ΞcHؘͅ2(3!kҪoSښS@ff%RS@3`7#]CX@3#qQ"mgk҄HnشэӘP4"B5,FJkd֔՛@5 "֪5#kL i<TW[@k!v@@'݉;u[vWmPٙm$ٯ&,1˜椝GTXښP6(HܒԻJa'Җ@96Jd@٩m٥ 6ڔl43]0Vn1n#P^pTi4$ިPo7@n@X@n9@7(F1v@@ݑ@fDŽd@BvJJp'rqu@#d@DD}(p~sh4vdiᭀ28"Fsf9r@6Y局@at1Tfii#ޔ|c龶(Mb $鵀魀?\@Q8B]^ԝ#@ 8AjۯjN֠+c~B@3PPIgҜ@ŀtJclDwDQ!wVD;c4<y9}@>%@@`dڀB@@Y釖vz>k$=$v S~@ bLۭ@ľ&ۭ-v[jr$'@J|r1>x:SL,}9r>8Ҕ}0O0@5'T<|LpGZY}]@}|]T8$:}V|u@@}V}Vр4}V?&ʤ#@??-TO|VVJdT,.h`)r?"ٙɶa)@1€€@@€€€€€€aA.5@`€IKhR$ aAPaJ^@€€B aـ€`€ !Jmvu[jDvm9eF5i€da€€€€€€a݀a€€a€.:/€aKzvÂ&aJ:€aÂ^Ja"n yR€ j bSĀ @z 1q}A@ ĀĀĀŲJĀiĀ`rbĀ`>%ĀĀE}1'$bDPĀĀĀĀĀĀȉ@Ā1m@bvĀ`~bĀ`Ā51mĀĀ}:Ā#HE61l@Āb*ĀĀĀ`ƀƀƀƀuƀMƀƀƀ2Y͂;S;((!QȀ9ȀȀ>Ȁ2h >ZȀ=ȀȀȀydZ¨ȀȀȀȀȀȀȀȀȀ`ɪJȀȀȀȀȀȀȀ&&Ȁ2iȀVȀȀȀɪ22Rq(ʀʀ!ʀʀM7̀ ̀̀mIU 4`!nOݲfŀ̀̀̀̀̀̀̀`^2r΀9* ΀΀΀1`΀΀΀.R΀΀΀)΀)΀g[΀΀΀΀#T`̉@΀΀!΀΀΀΀΀3JX2e΀g\(΀gT3΀`΀g\*ghb3#$`΀΀#J`Չ.]Fjfgـ΀1!΀΀΀΀΀ pCmۘWmZ΀΀΀p\eYw_v_@΀΀5ł@ЀeЀЀЀЀ..HhOIs@hK ,VN[U~buۭ@ЀhKs@ЀЀ^ ҀҀs\8PҀҀҀҀҀf`i' ҀoiҀ Ҁk ҀҀ Ҁ  Ҁ Ҁ  Ҁ ҀҀ E Ҁb5ҀҀҀbҀҀ AJ~BԀԀԀԀԀԀ]Ԁ ԀԀԀԀԀ ԀԀԀԀ5`Ԁր؀ ؀ll؀6HT؀؀؀؀؀؀؀؀؀؀5؀؀؀؀؀؀؀؀؀؀؀؀؀lP>Plـl ؀يJ)؀؀؀؀le؀j ؀؀؀؀؀؀؀؀؀؀؀؀؀؀؀؀؀؀؀؀؀؀؀؀`؀؀؀؀؀؀؀؀؀؀؀؀E؀؀؀ ؀؀؀؀؀؀ڀڀm#cڀ/UڀڀmVMb2ڀڀmڀڀڀ܀+T܀܀܀"܀܀܀ DH r܀Cd$݂JހހހWO@7T-ހހoI6ZjfjPAoZT2ހoހNހKހހހހEòހހހy :ހpNd Td`up  N:`rr rG5rvj؆Pr\' j(9ҋ`9s[4nJ 729Y 1a7{s-so$9@nJ9_4@9-s[`21tB?c@)[@D>@B+:yuu5: d v ZEÂ@* ۭ뭷kn]mPwE@wWt9mbx\$xW)2j%%|(Qy^4D~I(#JzD˜zCƔ Q-`R{Sd=ՀNJ|#Jj>UJJ]}QT>ـQ~PDBj?@~~E4?р LdC^ 1b  ?ŀ  @@@@@@@@@@@@@@@@`"uC@@@@@@@@@@@@@@@@@@@@@@@@@@`@@@@`#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0c@@@@@@@@0x@‘@@@@@@Œ@“@@@@@@@@ 0@ 0@@Æ@@Æ@í@@@Æ@0h 0ɫo:X@b É@@@@b y @@Ę@@ĥ@ @NIjP@@ נĄ@@Ğ@@ą@ģ@Ń@@œ@@Ũ@1HT@@b@buCŷ@b@ū@@@@@@1H)5@K(e$@1H?@@@@ʼn@Ƃ@Ɓ@1(D@@ư@@@ǁ@@Ƕ@@@@@@@Dž@@@Dž@@Dž@@@@Ȅ@ȁ@Ȃ@ȃ@@@@@@@2I=%Ɉ@@@@@@@e @@2fʒ@ʒ@@@@b"bS@@@˲@@@@@@@@@@@@@@@@@@˥@@@@@@@@@@̇@@@@@@@@@@@@@̌@@@@@@3Hv@@ͯ@@@@͖@@@@ І@@@ Є@@@@΋@@Η@@@ @@΍@΃@Ό@΍@΍@Λ@@΍@΍@3:dΗ@΢@΍@73ܤ@΍@΍@΍@΍@΍@Ή@3@@ Fo` G%+΍@@΍@@ί@Ή@Ή@Ή@΃@Ή@Ή@Ή@Ή@Ή@Ή@Ή@Ή@Ή@Ή@@Ή@Ή@Ή@Ή@Ή@@Ή@@@@@@Ή@Ή@Ή@Ή@Ή@Ή@Ή@Ή@Ή@Ή@&ρ@χ@@@@@@Ϗ@@@@@Н@@Њ@І@@@@@@ъ@@@@@@@@@@@@@@@@@4Ȯ@@@@@@@@@@@@Ӄ@@ӝ@@@@@Ӡ@@@@@ӆ@@ @nP?@!Mr?\>@?Q?Q@@@Ո@@@@@@@@ֆ@ֆ@@։@@@@@@،@@@@@@@@@@@؇@@@@@@@؂@@@ؤ@!u@6Ixd@@@@ٔ@@"+@@@@@@@@@@@@@@@@څ@@څ@ڊ@@@@@@@@@@@܆@܆@܆@܆@܆@܆@܆@ @@@@@@@܆@܆@7 ya܆@܆@@@݂@@@@@@@@ނ@@ޓ@@@ Jg%߁@߄@@@ߔ@@@@@@@@@@@@◂@@@@@@@@@@@@@@@@@@@@@@㕂@㗂@㗂@@ヂ@䁆@@@@@@@@@@@@@@0 u@捃@@@`@@@@@@@@@@@@@@@@愉@@@@@@@@@@@@@@pF@@@@@@@@@@@@@@@@@@@@鈄@@@@@@@@@@@@ꇄ@P [@@ꊃ@@@ɹ@@@@@@@@@@@@@@@@@@@@@@@큁@@h @@@@@@@@@h @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@logisim-2.7.1/doc/search_lookup_es/0000755000175000017500000000000011541757200017156 5ustar vincentvincentlogisim-2.7.1/doc/search_lookup_es/TMAP0000644000175000017500000011400011541757200017636 0ustar vincentvincent .000000 000011 01100 11 10010100 10 1011 101021103 we0 x1 sm1 ,00000 111011 ee x10100 1011 101001 10010  x10110x11012 30145046 i,777,216x16 l976 89 91 {e0 |12.0 .3 5 1.0 3 2.0y3.0 4.0 5.0 6.0 z1 2 7.0 0b001c4R59 2 5%  ,214,903,9176%3.00x30 2`400 `700 u5 8 c90n5R%00 ^91 x7{67 -Segment Display _12 ]4890 1 AND/OR/NAND/NOR Gate%bout This Program the program dder Zpplication Preferences rithmetic Library HBase Library eginner's tutorial it Adder Extender Finder Selector uffer tton Clockombinational analysis Nmand-line options 'verification parator nstant trolled Buffer/Inverter Wunter5reating bundles circuits texpressions dD/T/J-K/S-R Flip-Flop ebugging subcircuits coder  multiplexer ivider EEdit Tool ing subcircuit appearance]the truth table Gate delays  s Libraryenerating a circuitQray Code Counter Incrementer puidelines Hex Digit Displayeditor Input/Output Library %JAR Libraries oystick .Keyboard 6LED Matrix Vabelibraries and Attributes>y Class  Referenceogging isim libraries fMemory Library components nu Reference ZTool  ultiplexer ier NOT Gate egator Opening Combinational Analysis scillation errors ither verification options Pin lexers Library `Poke Tool rd \ing 'ly unt umulaterately hieved Yknowledge Wments5rosst ionts veities s ual9lydam pt ive'sded nds r %'s  ,-master.circ Fquery 8.circ  test.circ singtional -ly  zrbitwidthessedss*tool2s mit kopted vance ds ing"ised3ffect*eding-stergain?st !gregationreedmentlgebraiclorithm Lignment  l-floating one s zero esegationow#edings mostongreadyrsot ~-click drager ing alternatively shough ogetherwaysmongunt inalog ousysiszeingchor b'singQds tgle nouncementonymousther]swer tiquatedWyoneLthingway#here &parti[s parentearCance a's9ingsndlicabletion sed5s@y reciativeKoachpriate ly nximate stlyJrbitrary cade zhitecture veeas@n't ise singthmetic allyhkansasmoundray9s.aslistowheadstifacts scending Tt.iiribedYk ingsembler fign fed lmentociate Cd ume d /ing terisk  ynchronous Mly top ptacheddemptsUntionractiveibute x's sionuthort's ities:s omatedic gally(vailable eragingoid 9ware)yxesb9ack Pground(space +wardslance)r e-bonessed Oline Chbic 1allyds  .getheightwidthxyeautifycause ome :senfore ganinner's ip Asoicesoseingsexnristos Gircle suity's  -buildingsmstance slaimssses ical roomeared Fprops6s0ick'edingsEpboardOock 'ssgneVablennotsupportedexceptionselycs Nr s  0nceivably0ptcs %rnsludes dition confidentguratione d newinstance singrmlict ing orming $using  gruential \junction.nected eing#on s(ssequence tialider eding stent"s picuouslytantlyitute 8ing!raintsvuct ~ed ing or 4s $ume 'd tacted@in edings endtsstxtinuedd sPing cously!ractdict.stibuted nion sole-click ing d l /ledingsvenience qt7tionalrt edgway ordinate sjpied sSousying right edrners /rection Gs ly5spond ence -ing Ws~upt7stuntedrL's.gifdata .get poker .classingries]srsewstver=ed Qpu.circksreatedUsingvewuzs61ccitur .getvaluesetvalue updateclockrentbly sor xve y's yd stom/arilyizablee "d s2t -s-mail9s .g @etkeychar!x"ysachrliersierst hlytNward y Jchodge K-triggeredRsiteding sireyentriesXy  vironment qual -sized^s )ivalence \t Es|rroneous lyrLss/html/guide/about/gpl.html &index.htmlnalyze/expr.htmlugen.html index.html open.html !table.html^ttrlib/attr.html xexplore.html index.html tool.htmlbundles/colors.html reating.html 6index.html:splitting.html [index.htmljar/counter.html Rguide.html qincr.htmldex.html &library.html ?simpctr.html log/file.html index.htmlselection.html table.html mem/hex.html index.html menu.html poke.html +nu/edit.html `file.html index.html project.html simulate.html winhelp.htmlopts/index.html mouse.html simulate.html  "toolbar.html (prefs/cmdline.html Oexp.html  Yindex.html [tl.html  layout.html  template.html  window.html op/delays.html  index.html oscillate.html !shortcome.html Jsubcirc/appear.html  creating.html  debug.html  index.html  library.html  using.html tutorial/index.html tutor-gates.html  orient.html  test.html xt.html  wires.html verify/index.html  (multi.html  Mother.html jsub.html ~libs/arith/adder.html  bitadder.html  finder.html comparator.html  divider.html  index.html multiplier.html  negator.html  shifter.html ubtractor.html base/edit.html  Findex.html  Ilabel.html  Wmenu.html  [poke.html  aselect.html  ctext.html  iwiring.html ngates/basic.html  uffer.html controlled.html  index.html not.html xor.html index.html  o/7seg.html  button.html  dotmat.html  hexdig.html  index.html  joystick.html  keyboard.html /led.html 7tty.html Cmem/counter.html Xflipflops.html  eindex.html gram.html  }ndom.html  egister.html es/html/libs/mem/shiftreg.html plexers/decoder.html mux.html  index.html mux.html  priencod.html  selector.html wiring/clock.html  onst01.html ant.html  extender.html  index.html pin.html  robe.html ull.html  splitter.html transist.html!mis.html +unnel.html1peciallysential ly europe^venYlyts +uallyryone'sthing bxactlymine ing_pleKs ceed srllentbption ally shange lamationudeding sive Alyuse'ecutable e Hd ing Nonrciseist Redingsitpected rience d ment Pal Htslained Zingsnationsicit-lyyorer ingeortledzingressedion sclytend erwingssiontract herentit Lialaly te&singput 's^s qsert Qed ingZonXs idest Htallationnce's .getbounds settextfieldUdatafactorypainter okers tate Pt aneous ly?ead itute3ion ruct ed ions or s ments,tact eger sraltedionity lligent/ndedtionallyracting on ve ly1change;estOedDface s ingKere mittentlynal lytional pret ed Psect ionorroduce d}ing uitive %lyvalid erse ter socationNkedIingslved ing onian  rritating slandsy~'s-classcensedes%sor es fe0ght -grayke ly|lovmitation sed sne s's ar dsgk s ;ux B'ssted #ings t e-ontleveoadedings 3cale  8identifier 9s -tedmion+s kstepg arithmgedingicAal ly(simL's  -filename.jarjng:erok6s psses=t w -orderAer -orderTedSsJst -orderyingmagc .hine-readableintosh esosde gnifying$in}.pngxtain3ed ing sNjor1ke asingznagesifestpulate d s ging on 0sually factured ?r s sy`ppedingss rked s shed 5tertch&ed s5ing erials rix esTterximizeXumy mbecleaneagerpn ingstt suredmentdiumet  Rm-image.txt }ber poriesyntionu 's >key-ds rchantability ege 5d=ingssagethodsiddle 7stght  `llisecondsne nas e giaturemalizeds umanesota uend setMxed od$es ification szedr ks^ywinguleAsHney&st Wmouse 's-mappedevent0ved mentsing rjadaptersulti-bitbittple -bit input x er X's s icand 'tion ed r s s yktable x 'sn"-gatetype ail svemedsnd-only  Bometer-widerrow |er turallyBeBvigateing nearest cessary qityTeded Os gate d ion ve or ither sted ing.twork verOw line yBvalCuext -to-lastgray?ibbles 4ce rxo 7-arguments ise n L-directionalgatestandard Dwires =commercialHeNtheless infringement rmallyth -edge facing Jsplashtable y%tionch;erhingicesMfiesng ;whereullmber eds erico&bjectI'ss ligations 8scure ervablebedtaining :viously ^ccasional ly sionallyurMredings;dd  ff-the-shelf*endingnrXing{icialsetten{kslduer st mits 7ted n-screence)e-bit input Ylinetick slytopen)-sourceedings rand s!teRing%on s 3orBs Oportunity site tion 0allysrangeder &edinginary vganizationzes ientation ced ing~ginalRss cillate sRing on s7thersewise uughtroborus .orgvst .getwidth erJgoingline dputX's  6-master.txt  9query.txtzsside valer4all flowKlap&st Eoverlapsride 1shootwritedingp#-gatetype}ablockagedsges+inter .drawbounds clock label ports rectanglegetattributevalue bounds graphics showstateinstance (r's le,ne!'s per rallelmeter sJentNhesesityt ialcular tlyess6ywinder}ssed stDed7s @ingtentshience ternuseDyment eas Aculiaroplercent rfectormance1ed9ing shapslqmission svetsted sistenceonstinent henomenailip uotographicysical8lySicturedNecesn,'sJk Oneds xels[lacedsing 1inte$sform s0ease ntyxersBusmng oint {'sMshke dingWlygonVline  ntifã­cia orlyp-up fpings cularfprt.inputoutputYabilityioncss uguesesition Ming#sibilityle ;y tatoes wer ful 1ractically estioners e-existing$ambleGcedenceise dominant Sferences@red pare =sencet rveing sed s ingttyv .getbitwidthisfullydefined tointvalueent)iousMlyDiceXmarilyyitivent able~edring or ity3vateobably1e2inglem atics cedure edss @ed8sing orBduceds t[-of-sums\fessor8gram'smer ingAsessesuhibited project's -specificsminentotingptedings nepagate dGing on [s er_tiesyrietaryRtectedinguonvablyeideds ing  ~seudorandomublicshed Xll ed s serposels yshed}ingtython Dq vuadraticlity .ery E_file  wstionable icklyetly kne-mccluskeyktpe otient [r -s acedix ilroadnbowBseGdDsmos bnLdom o-access nessge s reteherwe-enableopen ,achedQs "ing t ions~d !-enable onlyVabilityingsy l r-world istic tyly rrangesonably callHeive;d~sCingnt/ly -placed}ipient esognizedommendrds%tangle K's -with-notch gs 7ularursive lyTd 0irectionstribute d ion orsuce 2ndantferrenceCringslectedsrain use Qgardless*ion g-neutral ]als ^ster 'ss Uular llylateddsionshipUvelykeasedos ing vantiance qevesing oad mkaindering {s?emberedNs+ove ^ds]ing'name dered,order pairHeatedlytitionslaced ort ed ing;sresent able tionLs &ed :ing Tsutationsquest ed_s iredments sXsets istorzes olvesmurces 3pective s ]onsibilities letart Wedrictedbion Us resulting sXt_.value `.extendwidth ]getbitwidthrieveZdWsurnping:suse7vertsiewsedwireight -arrowdclick ing handedmostSs orouspper UsesQingkom omtatedughlyfnded -square;teOd ingPw -columnsy alty-free >u dimentaryle sn-length D_testningTs ssia ?ns )-rafely]int me pletisfyvedsing vwyingsvcaled hedulerienceope ratchesieenipt edFsollling earch ed Ts ingcondstions edNing mQed sPn `s pgment #skhon rlect bitscedingon gsorAs  f-explanatoryl sxmester eitransparentndfs se t parate Vdly %orPquencestialries vesFice ing tssion tattributesicon nstancepoker offsetboundsJportss tings ,leupvvalue  ven-segmentral elyYhape 2d x-xor is,reuding 1ellGingift-click ing qdrag ging ed r ing pped ort comingsut en ,ingjtgw un$s utsidegnalqedificance t ly lentlymilar lyplewcounter graycounterr"stDyjulated]ingon taneouslypncegle-bit +studentite 's uation sxteen hze keletonip lawyider/ghtly owerPmaller Knap msUssoftware ldedidHution sving mebody{onethingimes what )ereingsrtedings GupteE.fireinvalidatedgetattributevalue Ydata instance port value\setdata portd ment sicngstics dsus Ty ing sdattr.default_label_fontlabel _fontwidth oeersp -by-steplsveZickill opping#rageEe ds king sr  aightforward ngelyict;ngutil.tohexstringuctural es zub 2's .s dent *'ss ff ppid ayle fs 7ubGcircuit 's slass +directoryject edalicensemenu itted program routine?section s quentt stantial ituting onsCtlety ract ed ion or s s hendccessful ion`h fficeFggesterslion tilitieswe v2.0>al2idity:ue .createerror Dknownafalsettrueasnriablens \esoty)ous y ingerbatim ification y sa tileionsUtexical *-bar Rly^esiyia ceewedaingolent sible lualfoid 5ltage s"ume \ulnerable wait erLnt Csrrantiesyyys>e'lltreveb8lcomeCl-knownrest -facing sidePward hat'severeneverreas 'verather icheverNle -teoeverlem9se2ide {rthA.getmask widthslling ndow'ss }gs ?mergeUre's d-and orsingGsh@esjthOinouton'tod #rdEsk@eding snld ry Lrap ped Jsite ?-enableingten ongte ww.fatcow.comx 's 1010100 tnorIorSs-x Yxy5ears ieldou'dllresve ngest*rself sz ero es s immermannoom H   t  I    ñ onnected&definedr flowlined yingstanding ws,o.es enforceable venness xpected  intuitive quett vs  versidadeoties _yknownUless ikelyoadings necessarily  predictably  realistic :selected igned 6pecifiedtil  ranslated usuallyp4daterclockdos on(per y-division order most ~salarlsa QbleMelogisim-2.7.1/doc/search_lookup_es/SCHEMA0000644000175000017500000000006611541757200020043 0ustar vincentvincentJavaSearch 1.0 TMAP bs=2048 rt=1 fl=-1 id1=3640 id2=1 logisim-2.7.1/doc/search_lookup_es/POSITIONS0000644000175000017500000017036411541757200020503 0ustar vincentvincentaaa? =5x4n[%VѥL$/ƪ@eԐ2 9I x03Ÿ'fu0W2!AG6rL h\L MvOZFd)aS76_2 9FAG39s3\=l3s@3]XsԔE~Af2f47嘏 f @أ[ fx;LF4;dskQ&ĮzѦqrNJq/\\׊[v:5xϳJ e0B! h3 0ʆ'!{ ǜC_Q2 6]$gVY/a=]ڮp\'ۈd :Y=0Dba9,e$en= HȔƤ4+,UftTB]E\# \j|6ǜ\qz)AN7T !P gah5> j !R*P3D<4DLUH]􏱁pcZ5SM6>]PѵE܀5Y) 5s9 1M1 w?sxs>k)$Rb0s,AbŲD#mDi ߴ&|[ 0&ᵫ!.xlH-L2Brlִ# J.0f$z4CdUmdt[|<RuswjRuWr[]#kǹ+kթ*cYY)U?RyۙJ5]{}P@ 0r 0h51TB|F:+}aHNgcw[n1l٬+{CNf{x$oчPSrAċ':yFuim[Qn&G2) Mrf"e8TB!Pp' AFjGKDFlgCem(Z9QX, (22%% h; 5\#"[w Z퓧:-hOa$8džK)ǤjжD%d.W@|x!Q\"px ] Խ߼zݧPqG@xɔI$ȴaGo,Cde*>1M c->8a?1T\_yF~ s `!,EM;BrUOYGit@uàĤ#a)9UƎzoH;pMƞ+#=UY~~<q4% =DQMݓ?-y,za_Y Ss].70 w`T@LB}֛aCKdEۤg'5",2 9܈&t6 ,J60O ak:FݏU4+JӔB]̆S\\ fx/}rYQfNei vȟ(VҢ:KHdwCaq6%X](nۅpe8+M20bd[eLTz{ a=jh IЍJ=Z[u_4f8nbj)yH0%qؕ-3Ne=j)ʒ+tB\Y^4j7KhzV*#.-3UŕmO9LL '*P5NQydM{@HVԾ,TK~.u 7,F9:v3Gx 7,ҋv*0ҼY@wk/&LwnDa_ba~:.z~b!H*LL}vv_D's'(X6jG`@ eЛM#Όp.fYO$v6DaJ"\LDΙvםy 3$`1HBm/DHLmw[cα\zלޮT灀YA9%GD 4G<)ڡ9VUK/ht8ɀZTKͦ5eTQR"jӼ\]֛O?(kчl*}ηDϮ\ꂃeJ lAfA=XS =㙱BolCII\Ew;$AʱDxԝFw!dpZsD YvcAG+3ɇrSb}}ܚIYq܈0;5JYkS]6O!@ 6:IM9sJ"_BHaN\L8硫KWvge>_HHH t؏m3)F~S^vi\AGqIa^cK~WrC_sv SD׽tݳ b1+<8FX[gr{5$exZ[Po3u-gGeHD;'UG"8|B4\,ș,QmBw\f mP9GRbF*^N9;vtWG);md+Z3g'luj$i-N.ƋsF'.MI ul Lhhd'/h&?|'rтHA&z;]wz<Ѐs]ԾZp$y2N`Lٶֵh'hJĐϚu&UvkAԗ5`.e^65\ZkI7+U٬ su4gZk6Q%'UNL~'œH Y= Z;њeN 'ɇi>;J!Haw"\̳9|0b\Bۿ5%c^`s ծ-ӽ@r*PeDƷ[ӎs^y_JvNxU6P 8Aܣ rhDd>{+iQK ˔cSxczmv9Kb4Rr:dnm V 0Est{=,4JT0*J.S)#ܱ@ҫ%}V h*¤IױM>lIGq =Eji67C0B6;ԁ\[A\XLCBqDC'Ғ 2ӯMmaOa_Ywv6yt4hg= HC 3;Y~ZeJD>ZݹI0:L3F^zH۫,4Kr:Ƒ8eQJh$,P)D@ni';襥oHEZ2zR =Ԑ`BtWDfC5s-D֫.oMHU\oL ކ# 9r 'p ffK;{3b6f<8ZT15޹d fV7ظ'b h\pj"Ƽv'trlQ>ɹ>;ۓH](Ɍb=Z,,2J)0ZC͉s:F$LJ3DtMFgnF lD@$yޭsb>CL0/Jdz,mecZr )  HChtJb5bϜةߜ[Z{ƃQLϮvc?7ފ]{@]L}`*=o*O$H2|tН Z{Ñ8jAuPĤ[:c33jUӂXՑRLr=5X&l>e '~u/eFZ1.0:rNYJ6!Lޚ/d}[ P٩yeؾ|1R&fyb@LqAwh|xU`=X8t@66B'Mڡ`wMc:vS]gWjbF4"*9p`/+yY-iT.LٓSw$44H-o2#2CZ=ҽ޾TсWeF4&!@hX >qsoДӦɡ>ҋ&{ 1*zHlx*ϑa)ĨTmTϳ,=6E/uX@!|k^@$%Xd dkZjn#d~k/ԲbҔ72&A5k16^e4& cfffeC+}u*MӾ8 Ih*d-If:hȫ2AmW"m@ iIz?MTIuSr{Oz9*R@I(zJ*[1r?m@ fKlM>KQlI1+qS9GPM Ok:gcet_#uQ"#`BDhĦVxi)~CjRe[J.*` ]iOl me`:̤6"DDMӨ~b5uqf{ր3b48Ta+Ni -KY:H=PvΞ!uouqbLvW3|k4n*bdX̆HtaPYV|Y$}FYle. HGPݜUVYzLrtQ2H H$0ʝۑAxRO4<*<[jg!b b8L:˓o 14|e&K;%Pef'mq3 C1C5}Y]'UT10yh#3I:SErʲ2h(hЄ.Ƙ9)BineJ߮K3u^-Z ޞaT.AfM^d!zJmiĪijw;Tզ^A>_ɀ+rLI8xu q n I/-tJq eX~*cDȀ>=Dr㇎JknikuVɊ0a z($<05 S;;^Zk!g/WfS33.3"!C,dS :_&!`'BT6KMySvƿK6&V;Syrc[w eFeFaGJ!riu|iW68*qa0?#M9eӶup^i(8WWh&QBW ֋'9iA\+0sNfaڡ? aV|?Roxx_\ XAG.p#RɰNVeMsm8M7h汝}e*5؎$f7<9ď_ W8Ŏ⶚<1cF-}[A evu?? x\(ВB>(k좑|5d8jFTfAG I`]$)樫l_3!ݰiGz3Q5e:kKj' d1bVkFw#+a -qA(?naoFe ob 0=[)pD kC%TA90f'0޵ #&*1=(3=X#("?c:GHcdm@`q1D}rPz}йػ[K܊s\ݲ;-q3լ/ 3)(9&ՌQ"ym2-17qzXf'( lC@j6 ht̸Kяc(\_Q9X樀0dvL8`2iT^H^B|1/0j` djJ-KEKsHdfux">Ju9BHNrU5!fqE, ـS[Nzz[WlF.B BSV$/]R5^J-3Ȉ\bo @)o1*)FRnGڝWO`T@44 )NdKӎLKגwK:cV1}PipN)NlIPt)!(𾱰4ʍQ5y6^M`ΐx@(GcɊ]6 ξeTFNf@'yf3Ƣ^~,5=B Pc^:.x ֜+dhivͤ񶏏㽴Q'Ӯᴋ}r?$Q'jdol6Mb)J O*\&(CLXahSps18gIo 5\PV.Iid}Om hG=6GԉbШ<6YÁPZΖ"#@Gڝ74gh]gaC:AU;że>0ڟϻ>18B$iKA=@aFeFTe6TaOQaM3QE]?Zk9hſ2hLW8XH] (P@ʓ-e:PN& HxTף"AUF_}36zWgZjȆdYcqvJ$ڕ[ oGZ jzb,B?;D1!D" EQbi!լ%ZeN#QyqסWIqTcܯBfQ@77%ekۦWReL7Fup/&ud]tP|A и|hsĜZ)z3}{C }#ɠnFJ^Yp=x4\;m[Eu&bEk `vJ\<[貋 96&6QSI[hE)0ǩ̫OFJyC7%z/Ǒb{z(2b|⥃<ۻ& RTG)@M@zh(SUɋ/Yl&VSx]u`U*]M1DPHĚ[LS7 #5r7?OR0_v|\l:bA+>jJk(QmZ2&&Q3Ilq?5N;b2(nq_8aZϊĆ?Hϒ.zX[H̀s!&[ pԏ̉u~y^BUΚăw|Q`9vJ9Bﴱdr 36`kJ)n8p!Yxсw O4IOz'" Eo1ɋ!m̖QUQVJ%HQ2dˌ&s̬۝CWԸʼ$46):D-T4aP-zڬܺsˋ)bxZ!ʤÚrS-=B||LeqaC @]b}8s/ eA C r1LcюF;cӲc'= T9n}Pa`cj8 alCâtgzQ:pHqkܓyOԘuLy1>GƠe40Aj6ꇷ;LUM]dn_LGW  e0, !'Y&'{B1*cDT5w}pE9ʒE;T&v͋`;x:A`Ȕ1$ȶĜDUUyzu9}YK$Ķ+Ο,EKKd8”Ф$;y=<~Na6+yyJ~odw߯RG,"w~"v D3KMő4WD\YEqm8TUk(saOa_ϟ_Y+?Z*%UC?&i kHH ٩}R?'A-Y٥SFͮsO=$G-b,S,rzK*ɾmܞSpT CjP$Psm P[*yU~8kAaݬ)!m/x]cO鮚 v.៍~߉"{(6dJP2EⱫ*Q72I0L|%vVGd ~d1Gk<=^57듢):L8lgPFՅ#y(,RF8zӃH|{{wsȉgIȷx`lGzxKI(ozѮA+Mdo.3nQǍ2ϑ wB4%T_HE6-CyC 'ĒF*zRIF(HþNjj1I={iB앏̶'ɚ+FvؐP"J ڈ@BE t>eaK3kNf\^t8fa=l>mC,؄l+ѵ-r-Bӂyd]8clAbk3_bB`C!h̅51}̀8rl#+bC:;q+=Ut@)$:ݱ\\v5:v@i\8#d5JV>n{%Y!aQQ%""xb:Yd;Q$ b]Z6&Bc6gr*9݉6ښc2#50 zgoʲa wƉ9fd흭鈾fo^5kaVa6e>al Qfhf5?&ɊJJ `o 6!mP59vС-lg"FwwQ83P_H@ꘜADv#`Wv?mf~SaKcI)5*q/ q" N(`c7B",UP1 /h9Сҝ#J"0{d˷ݙ&i=&,b2̅UfbLg,gkbS$bG4_x d! =Xؿdu9 <@(O逬yQ5ƙGJ“#<1abQ2$!JbrjFPXΰZcr͎&K.j.l('6Fh~)Iˢ7`OLBW8=(>d?R-\w0**Lh)c&~Rj+ AF겯*8EZ5"$4 ţ+;))1!}S YL-h+M)'ܽg ƸSqů.O@eOo+,3 P̙60 fn-Gà0 I&h8 XF a'brH`y(GCPybDHSnƈ2nIL'KQ ɭx #;s a͓ 0 I}ogEب_`P_'jr6*{bta9׮;haTk/ n%ĄߴDNГmYKR"V@ـ #kF*u}OTuHEyV:;+:3Vacjn#*;` OQZ[^fMImd ڥaM,fBȊ,4LcDrLNfTm:W>|#gN`THZTkOr3 XWC[C?wsAHAĀ2짆c&"?g{LNNu○ЃߞaT푞YqJgWB 6 [~ሆM/Dڰ-gA&0Vh7f77tF"{-V#\ PXJ.Z>J.t4i-6FEAvM. &IL_st/ĉ)I1¡UD@>i觖$hFmdh!l^% L&=,A8%L*U ;AYaN7g,%Ӡ*pA̋8@aU145I^*Prڳe3G3/+&bA  /_[kq5}{G<,b@rGw:il%.V<ŭu.؎۝y@x*'&omRbf;4mJmvJxq\9Nڬ/O6cH.^]C#3$.9O~ J}7Z[d$yNIh)/Hm~0?s2@?A *6M消rz<(n.n3cT6͖ٹR 6Pj6" 숀޶TGl`e8nyU *q,j/l*=ژ="e\Y>IPw}_5w1LvAM%tΗ[OKD;]ZVԳC)&9=0+Qh+%%깢HsrU5-+q)FI"C٧TCE{s)#ZL2H+0Qmw WqT D DIKcݔe")y4ٛJmFBZ|:d;\[q4⟥ AE73Uԃ8  b͒운iÞ6̛V |.+]"JBGN\VufΦtz@`i i48J`f3J[sڙ>]،Uc,cu H72݊[Rh8%B,$ h] ]4j%|W~f}͍L"2}@qCޞe4;]K|\t<':8]OWq<)Io=˜DlsAc&_d!&5t* YH(ɢ}Ԭ |ּmHW(^@\a~ "e'JިQE T(R{HQ$MT)!a+ƛPVOLZ+G1ILJM4wV[+ dQ!A#uNƖƱWf|ܬ7?1oI`!Υǵ#‚u$/OrcDX[rXIN L1&U՚a5DE8횁j 1<@9&~s{4HhB~(PwTcP֥(dD4`t*78*"=8ξiTD_3Lݹro$v_$21QIzR ͻy"KKvrz 5TKh` ?NT&'7PpuK~q'G+a1.eB:٫жjKfVjhen*[nċ21RG2qq6Z/Jh%]@U=R]-ў_e`AA -\ hx}>hZh(EmИ( 5E)+tc|yT5A-APyXb_x#QƢV R;2)yy VCc$YF"ȱlS3QW5hvRbg's̜?֏ R^д1)1؞ w98wk}P=i-?HMay!+ϖD]vzɮLh> Ot{(Xop i[>RVQT=C~פ1%M?P^xb1qV>HY}搳"i 2C7%hA| <ۍ_%(R@s4 nƯB`kJ8A)1! #C+!S̲6?v/4bF$p*[n[;Uߴ=#cQHl! &M=EjWHłO7}s@uE^DjSxG9)Te#qmUA.Mơ2oFjs樜UwTT2||dTf u~2YR>-lVgFidV&rdV'5I3$ ʯcw&3ė,&l׌d(3LOJ=10 yٶhmE& eEgoF/a{,*cty͝a햏G`ÕI㌁PiF*w{V&v$&J6"PC=s+n 8@,UECa>v{TZinױr# jeq3hPQN0դ%x$NU A"P 265;" !B-1_)X"HAqƱ9Tםe.TewQk3tTB$9Fxi*n(u2& LjݱӮUfv]8x)`^@Ͽߟ!e咰˭nzHȄA{ZeKJDDhN/!Vp:DhZ,^GvvNzHyy0,V h: ìN[˩fW4!ك֦tn^/'NR&9(2ʴ11W\k'>HܲF#FWj%Q.^;QUe,My]G.g#sd1J )Uq{=[0tEn>OS2K]G(ۥQ3#Apm**ckr:)ti(nc}$dp紖Y0Kb wu}$dqdD%|4v(E,΅+}q!YQ"׽/l@*AekL$qQ.ņB Y1~hŭNBDnNI ZIU'']?םN3E4ЀADBer헳`K֎(G݆ܲB>T=ox>w `= Py2VE]Tt_uG'i*yppiTk֭`uvYY-̈v!cO CJ)he뺛*mJ(q7Ĭ9Qyҁιh JxsI-ae`49AsT9A蠃a?ao}u{o`9^E A&+dhbpjYZ90=Sq|q7Slo"mtӤZ(S, gd,`QLBRS貚cFi%ğ$ 1Ѯ,#vq2]1ja߅9qH8U␪x쒿ޛE)2-̥ދN9qP<~T# X1xj0E3qTJ9I1Z,y3!"aLk2(#4lQu-!ŢHÂ؅23 TF+DF,-:w&Ra&'9̕m?f@u1cEbnC|'yg )KO%\@ @bHM kM4īh>} RQtB%%'D-^R,>Ŧp$k KmH!ɚI#qZ^%k}3iGSe䲴yGt7YD|y¹u #j#\WixPCE +bQO)%_ꞀnZeULh5VD dNsPg:3|${]-(YбP22/bOv\[ec;L)Х[0@p$CˌY*6rsDz*{[`Eqm ]s 9tQZCZ"W,C,-923&@Pِ!X\ ކPdtEYo4C-Ȋ!tWةgi.2Q3Ŧ7%۰m 6_3Cyi@ܔbCBV)2mcHLcro*c™.%doKH= Q]a':_w'ǐPwՅKf}=xO2Ԁ*hLuE4ZufWFWR@~ڱ]Z)W3K3&<:||9-?mWY-9-N-JҢ~\RIMJ~UN6wݨw hP@~L-vf&?Y"L=д`H˦9Y%޴|%cx#I8ƒ G ]Xޔ9+0d|υt-viF#oFq:<3B"m./1!b-PzuY{XaUŵֽ~w8%+'U51p~ܔzo/{X=;S!hFtmVݶ`[5BHʱ.Qu檲Xs(V^kԂn݆ezy9̛k9Ț$ΒO$%>Y4 #d,} u<78,ӷ cMB@yѢRRRێ#L|ݑJTj'Q|j,`Ԣf~E솄&ǐ݁k S7//쮑3ƞF5Pُ+%^6Gz/0C'$ u[G Sàɐ>q&L;Z=ǥNjh|bceS@J=ڶu9!VS{yky!Nnb%D3B8M]{ۉ46Q(ֱ̑2@`aWo" 9i^cz Duik¾/ gm&V9i{X %9eʺ ) !*߳RF@kc}f%b({NW.l <ٝ(^3r7+;0TV W͆t3 ջcOb0β,f7sޞ1$ct7|&?~9ҿ+?n-: yqDf([!(|sU)Τ::V\1u,s]z3Ee 5]cPjvk%bg4RJh!3^)TO&1Ho.º({6D>~3B͵hnng5:HvRbERs-|_xIf#x$G^i`{AYRuf* L<賆pk{ڰAgZ斋@̖$26UUd.絽G thZC(”&ŵ ?=D\o[BvY|;率6\Dsd kcZ( SiiJvgVR!ȷT+>Uayg7xcAxLpFŁX>f)d?R ꀃa_ﯞaelv Ud#| #B!@e-&:VfƭM@B. zܾ xa)!-!y{@%;Qcz uu]AϪ7']H!\FA~4- c5{A%ZϵŬ%.g[&!Va@Ycsr*a&d/:@36pCQݣ.a} gMF^m,(So6G̛6p3xU;ƻlZgE*o/{v63f5;0N"ϭLu%?m7=tlVNPpS=WRrTuR9UdV p滦ǃ) *EZR+ ۥQi/*9$:՞@[}{Qz?Ugu9v@gK ]Ýj8`L]ӷLzk/}? !Htᣄ*B6`JfVuSKg/:w/-C2IO#B*5ц;25P"Ţʀde+'ޯ.rA`c w\Gjz:<2ґX-X{X%{+ 1Z%1O-VC\5wŜ*wW#ʅ=$j0T1m&^6~m?itrPb%#`U"B+y=kEQ96Gݶ4Po -ВF֜)no%[Wp-A {ދ65$ F#6r㈮$;#%"vZ_D2䧝zv$(Mϥ"rI-ʏ)ۛJ401c*6 >5Q֊ #N1X/,ne}jIɖ ƌWHTT $0%uiȴvoII(iO@Gdxf\~MP)0}#o';6YLd]Y+bq=KZ5ol5gS~' ufʞG2QϫW-MG#~>/= ~5(n MiH& eи(偲AcّR@YVÞ5e{Kw4΀6$)FaBPxYEY~LǑR~RA"+(vܠ0(kIf.Kno~e 2L,jq7X<5YG꩘& /.:Yuҋ#M{/s W05w 'DVg¦")9]IL2W42UNn7,3 H3?#v%{Pjx[g0BU $Yu\ =́n/(5 (I]2 I2#af*u&n-Zo+b|ď6V(Sc՝R3@20aS#96T) {?wO4)k܆‡zOP_K(\NU;odᆔ,ԁrP)lo6A^<:ϨVv DaQ@  .KA&"6g)}Tܾ[~Wt'! eTӓ0@̄ÖkW!MQQV6R;QjW>nOw0P.ݟeP*|`yJz< m,U%[D,E,hA Hok/K̕n:sM AmF8|\d6#0I uUsAeL!nI e͟*+tmz }ض2ӛ^kj9̓ќ@0Bdj8Ƴk/;:8]{mKr1H"=BImuCᱵn)"||#i*1J>Я+iO(xk6 LD"~hS!`~:xɖKCpl%Lss,"+leocp3VVmI%BU$ec9@DRS/VEM36f^}]vh8A~ UM4ufm[/ŌW!@3m3:qŸwl9-]8Mf; FEMF _zUGYCfTX5.FdZ4Vp_?QA! ZxJMYAtCq_u: 1b6b Ns M9'1QSY0#@ska=jDŽquVL3 Pe^tI_ԇm|) ?pC36d:*Mv38ܝ/ @V0@hl[׍rˤ{o1@`Rs:iJ=ˮ6ⷞ)bx^#x6u}}}͝EMhz1Lҕ!Ah&ɓh'bmk#rk'qNB8|ݝ{cO)T}N#Qu гiiRIvJXܶP%MGBeV-IئL tU6#7<7ON^}Yj6gicljJ6 uei5 <9 K{AshNSaXr_d) ֛sMvW!6J2!3q3 ԟ w ( g aRvn둛d%P!-u&0[I>"Sr0˕O//0oӼ2!gT$jQfn ypzkr͗.AI |22Rdrf&yà#&B\(Ҋ&[Κ<9;DBm4O)ΉRm>I8D&1o LbBByP$ae 猼^w[ T>9*X{lZ#0$m3Pl?fe[U Hb=^ ya$M˳Fqb0f =gD8ՉR4؅\2 Y SHp$< R%ڽ.yG3]Lb*fVҚ+Я4-ulWY>_y.H m(/# /?~cf8UoE>ÓLKp,ۺj!)&y&k3":c(Ns2<̒×<̒3<|b3yepн7x^iVec+ ESp!ղS:GSP ؕ஡uY H:E4~@&TnpQy,IR?ԣaER|b.NP>K339\a %FPp.0? `L~zjCm|1{mxd0`pNB5Q`~a*x w_Ca+- Zi94b9;R@`SuO9bCRXB^O@f1!=_ރ,֛o/2YZU+gkYt@h님bK4Y"NħDEN ]ώ :煉״?ebV„\l#W gU{H$)t`<#Oj.甄r rW7(/lD#G(ޖ8ZFԮHgfCz3)d4D%lȐЕ4_Dѫi;%}=N &/3'jZƧOȤ~,H}+:]eO~2ja4—X`:7l>DFPsܭ!/ͺ1.G!T:(ЃrRH%3lo=?4OXM=R[MtGSH`8QNj `.)*,5 2'oTPc3ÊtAk, iT߮f֛0J4d *7t6VP=b6Y4A5ׯ,mLz (͡b2sNCbˁRb_k~ʧG/D$rkA72A0`4Xӟ2j7KS= ̲\Xr.P@ȍZN-fIUgڽІ0'5Cɻ*tPTScUzKDk5(cd̀峜wfKcđ:Untt~-vÌ4"Y<ӝ]~KSa^厣jJcxT4E {KX$TLG@ںɵ!1]z5V9?\e%Fk\2_E)1\TGE cVEJT@/KBu;lzge'{:CzRbӓ@TQi(϶aOaoaua__k{Z,KtE,9-[6FyA QՀَr=p~ оdJL8`Fٌz-7YsLQLFtPc[Tk<FL-„p± ImtZ)]6TrC"S- 4$qvsLc4?{܏ 1%7~^h.[1<ٚqIcd3(PXvWmS1bREk5[1M2 K{pKo I^2FoSR~B"oW|cߔrof .2S h2@CsuvwS/YdvXe_>n5_kv?O9Q:'"x H'=Xd8(TeC!1G+Q`A#rVsFl-s 2 %$xrxT j`"¯"6!{n5GVd jIÅ[jm|ޚ:)uyј= 7%L#0enr:'<.j"̑f^0`JnR0&~Z.߭WRfQPLoZgBbx$4AgTCnR2N7qXO>V)v I%SbVUZbMP>XR1D?|Q]lS VYI)4t)#MY@Lh6*( i&kט?H\}??WQ 2$nsHt C펳ቂ0ř5ƵGNféOr}KIGTcä}T" aF[~<\ g)bfDyYmm@W3`lj,FU8`"/hI;9<%Z܅;hY de;Fn3R_i@;!SPlE8:l6й-k2TlMJPh$EL[R[(\^DEl[en/3 i(9U8J JBz:RȵMD}heYW40!-xtH۠$gq=YxI|jy'i!:A۪=9@ P|eiy#hQ;2;fݦW/٨%<;-H6rVi:EF^Sj09iV>z!rW(lʴ9=g1"5#h> GNJH@ӑc7a Ƣ-ܼBEl'WINnߤ4KQ3E {oMag:-T$쑨+fQL Oxr4ݭiTզ'0JEuUar>4\EƔg.kЅHP6CPѴ`<:MIK^sRR -9Mbh [@u-" &n~|կw$&'ǹx ЇSr5j t~bOvX[0:̓K'YCh9e5]/:Q sa J*:N i2avB_|rS9 3Mнj1S4 ~E#Pb9bT;ٛbm:{S*4"S~Y4 [c!=@x&|9K8Z.mne Ǎv:!ShIi:c<< (h4Ѻ/G^H,MsMɒ*k4hg#* 4`VUԙ&\3̙; v&!h2{q~yyEcƶeJ*sଇ6`9W^, a[9d֗@<;y&háuS%[gf*Ùk R#eSɓ )"ٗlOk`io/X Tخ{m˱'Usgț_6Wi'w2 C,PGZDS4^Bؽ%b#7/dPDrL>Evt[V1}Ъ>IYLH3ACv)PF f򜇍)j< Lflz#(3 To0y''X_hEa?{0'q EEeABqʀgم:٣hT0U246;j|'e/]fb&nb2%n2{as} f!LJ*tGh%=gZ=w6bKkQc,z#fFkmdOyth3zO{(VOK#F5~ɭ^iI4HBD(B4L˟Ehoba'V[LgN(Rv'㟻}/(9T4ѾU 0`H❵ۦtP.0"V b>@dCȩ f&ig펴͘ڬ" Е%7)S.2̙GiFd$9ki# ~0DnE$h֬"$(P7uQ"v[0 ڀ,4iA#Uۋ0.c~ KU.T"\u.eH"О'ͱ:Y1BKqFV'rC-46YOTkܡuHnNR)ޕNH$$ewb/Bٍx+JsqL/O>NdIQH-Vzp%28j8kh4%.$s6o$b"#F*e;Eq:0PHz*A@; Xn+rn.sqSI0E I`՘Υɮ[*_;L jZc5q_{T '9Og$`G ]9ZQƉ{R4|ժ<Ӑζ(H:!% lnOޙ%vacҰԂ5Œ2LK[k:1.aXi-L ReZ-B)!~qό[PXtA_СJwž`(F\H]4 U(CX(W/F K֏ۋ2(lۥ[W$vrG\4!\S9@6dtڴEش˦^f!It +!T]*Žt2DƦ=(vMe2aa"aOj^|]0l%K]r:7c4)) A;i/M8b*[#JgaѶ5i)MNrl;nӏV2yE(ͲU6'w ]i->-E2&v}3krWD/ܔ1!5)]m!i֮%Pk(C2W$x`oʯʮլݮuhPàΑAə=!lOI1B2Z%1 i$ v.Z̚=Y>,]&"l{Ͻ $$NK6bUc!")w+&x\ȧ{2y)ri+g鉕k^i'wJ΁Փԛቋ_E)@%L5ɖ߲d]-Xu)Qi&s{Yef^ȺޖWꑄJDgtu ?脝LH7|;!@ֹ3d(ԄxImF^p8F2 +xHĘ *A#+24O3fDYxH}66/:3ly!=G"dHR&=H!hmpz`ÂㅣMEG,K*֜g22G\Is+2^ǥnGfj?O,:Vv?؀HecPs3dRoLJN9[e\K~`(1G rKRȀfKbw\W+)nXŔ*.b*ZTIXYek; lѭ+h;, ;UUe4#4N]d_thĈO4U,N]F}?{6g%g˛չ'٥#k8oar D0_`q9cU0Un4ӸԀ:QLa7T'B E7#NYRvę&xݙ0Z Pb qN;zjS82cHFZgBDƌʥ)IײݐYv!fihpYzBv˙yY@*H `-#!tAPf<ҏ~qzIUI1{Yg(9jߕ׋y )!ĀC@B q@fm&awsf)D83mS TRrs(bt$&)k+z5yQb i;Fjz슎&3hX"oU۪&4ͷ*u$5g+H5uB6U/Q1C9Ni5;34ʛջNU @}|_6IR, vG,CA(ʎ Xj8dhĎTqqH:U(Keb3  lT-+`Ko;Y: Ayg*T0} B Z"^j !o*b[AW 3B$̷Р׎hb*g£;PAUA=@Cɔ̋Emk_ө:ZV~dX#vkGl*G լ-%`0H)!h4RеBSkuP/ 1P'hѮt?[D5GCjp9nvIQ ¹sNfMv)[5P:&KYmed53 ,j^Ӥ]ʤ^TBb 3.T(s.7Y4BO%*Y%*Xv5Z+V*^WUjQi .eOj8u7YU╆1Li -jO3ڔVkE2nW;}֎- J^Rhʄ UjR!^8B{Ve"WE CtEJCrm9JCkKNyc@le4IN4.u L0`|W:Y7'ɎQSq"7pA8*բ65dg{&!wuw (LXf3)sa[\X8Ӕe鐤HRJpq9{aqzճce6r &e[JKN7&R9xxa xD5h׋@";~dryGV.Z{D6hÓ;hlQu˧j(Hc@<Z:i&4۶OM=mPq2cce>o:e>sOq2tId֥_V7:U!$rñ 0pKb)s&=nk\WVPXӘXٺiX q@> &tc]W$ҙ{{ǫIڲ[V}[n] u ;'NuwwWG'p1  4V,@.  {Dqeo1,f8!NZ N6%`!ͭ(^TJ.x 29|3JDokSjk6U(oB2د$|>H$dnL#BkP6[=BJp[tg,f|HO>2>JגA@ TI5\Af;3H^/YiZ/YiZwYi[p̋~)o5@=*9jz:Xz?5٦!ʋjY uULx-Y%c ̢KwaYxe4Lq`ƻ]0}w@q1Q- &&kNI+gۉ UשV lG@'^=t[?‰_MX^ xӤڥu3d+ <33 `wFZXʀDWm[{"TJl&V8r[?߹6ݛo{Zz2jxcv[Rkg: \ f/};1uz5 +-K#U5Z%ZLUa `B0H饺1҈5%[65O:id:aɁ{5ΓqWIԀp'Ex5#k@+ezKYX )#>^@eH^*NV& iy"E !!ha$92:6c2'WpϝPfiĀ֡o-IUWⱛpН-.h*,RY"FxI 'D*}WrG6',T)<~,:a0!lJ–d)Jz\M$\FWl Wllv1 ]N|S10 J+0dFwYgMzAj$)(}:14MG`jh2v^OE[):Uhf+$l+Ii;ZK oܝ C==y'dA28 LA3NetVM=k$^M$䶎߉40\*Jt* =<ʔTB {90TBH>$J>u j텈ڡa^VbE"綤R[FBKNDSWYAT/%d"#JFk6OzUޛ88UϣY0XfHIOJ=UaۋW#g:0XѪZ=&ѓڀ viB0HMX l>;Ta@r 79d9(1xĀb4+!#6tD\jflZ4ad`cHG;lnP1tP$Gļx>;8C'3RbX!앇|Q&K\,!zĞ=.cz+G֓֒kK~@0ˮvcsy6G!jEҼC^Xw4,s܃) "97BR0; v$m] <-& &(r3` '+`Jg,3HFE m[Ng!!`p2c6&Y[ 4;3Gt]VXC}ŔP_-cAt zII٥*5lWik1 a }W*92!ST^7Udu|`B8Z4{ Xc:cc)gKog 9Sj=CgP7iY}jOx| -#Vpv>@6}MUjl>]O &ZYF39>80h("?Lg]dcmZ3Rj\+ķ!c I%bS򧦺-Fu^:z'$1&S-N}>٦ ,{G*o4Dc|WY`/ֺ}T%tY stB :l+P5UfVHd@䄈Ăj0H#EaxtI"BE8kN1N{pN1No;$Ö;_"^c@XC y."+zf(^ܥ|2uCF 7fj`V՟vZG>Q0oIWS);*DR}?7fNTDG!!Z]ComKDK7G)7&*@9إC#8:>w+sZ(2 %¡Z"|a1|B?Q0kOrF%-Cqu3Hc|h/r M/`ğhveֺ !g2l\Xb@( L.$#ڸ2*Y'0YDZp4O)+1YʩgPc$S tJlligxZE=2>驳lN茂vo nnH d8fv 3#9eh?gJ-ht?d! ^ƶi!-hقT-%c{}uuJ~60A r26 (=MR:nT8ޖsScbMd2]ybҴ-v|JNшgSe̠-q1ٓS L8 6WErM#][9g {羘,`Unej\dB'5`{T4{6'QH핪ʗ+eY5S#l4dT?U IS1 Bt"cF)(L NNTRڜ XoS Ѳ2*XJJ#ʕʭmwZ,u'"_ #rms"YqQWŵ_2H-͊CE y;yP>[ysjY)UrX:`G(U D]ы5<ŜtWDE omIE󌦢 !UiYtk[l6sNyH8{-OY"#a]:fW$9wGxuMІge)z++F"d` G,#_m$`VBL7)@W)$lxAEi1eQ)Re֍6b%/'}zqʮ<,n\*$|`aĥ9L3@lc,\@ c+5ڝzeF oյ1ac2J1%jO8cGւog\FR,e8cTy\ſҞOCXK& 1oATcA|WLWU/Pfmcni3[hiO@W#Ȳ6X~<n1D_A5dIKObD (iZr;ԣ1F w#Ng;#ǍW=jZ@Ɉ8p3)j|ϥקIU5߫ei>4!饇wI嫶N%:5'xT2O-3v(tՠW,X/5_8~9t0ߢ-5Z8SهogNp&1 L8t}oR"%-Sc^ SOA zbəA+ RqҌaVeaTs^]eg3 Cָ! i0\]u0DBpLy 퉶6V[ al6[ emɪ k͒':f#67"x] W' ^2M>RGfY$tx2 $L q  J !H! ZG (-^ {XpX%G_l]pCѰ":{@{\RRь5Ǖ·4F4~/ wH2ih%ZM5liʬL VfAz6#Ǿ'o)Qyc] t.ҺWD3t.кJ]pTY˼*ݾf.% ż&MdKݐS2\sdQX-~bZIfo 49$JSYRnX0RC3[US>QTG5HJIsqJ@}:bUJ+ښuxS}ڧ]jFlvi,-ViU'uTT$*XQVoP^Lvja>{dGAhY_0Qv#{X+Eƕa#:T~lN2 .=uu֣6$P<,;K' >=nlBY FV[0La%/ **PCEFx(!!BI=7A.nW8bl7{Lzኁ W.=[H"x<RlvuУ/"Yފ:3%w. %A:HxY;32&Fa 9Y"=Ƴс M8voI*< I@k ~Sa\B@v P Ѯ)$^9EܑlLEGLLT|KskIƗtA@0Y I9%3OOF[lOI[lOIߗn鯛QSKCpo A(8&3{Ӄ鴹@KS6YTHo]SƫbmIb:yt;uyQJՙ@/)9^C.N40F$/ :ʲ-a¼g:_P걉AC jk$ /%1yXbȽEЃxM?8X͝&VIzt>Is9;Ͳֆܒy?-"` @Ӂ  mmPQXJ+ubJc^2&^2f}~("7v0rXla>L~֘;dЁٌɵƁ_6&1'q"p142|+yaQ̨Kav/cdsv`lYTRF !xLfYbC?^c$mI֠nUL5*Rw2?DkvBf ,>V~!Fx}Z SMѲ)iFˆdde'= o wОfPH{-rw )^1_vt*t+FHx;[ @c铟<!N,N`~Kؼ?؊eL7t:S (Z! =Owcm@X)_seFWcŶh^#y;'"X3x#?1^IZhousGRmsċE0"JV:g-sܒ#/tq@a<gbBhUHUlbRkpq݀VSH`Da6X5ѯ\t%ivZŃ$P5pݑm0aVe6e:2廮8#@W]{%eA׌n+7EH;D]DЗ! uNLlnC)Z(Ijomhs󋝇$qV{92$O{kGd 1 ~ "{4!$AD$ADIDIDAD$@= [7!k\ЕgDcJ=Y}C{!vŸK]K!a;0^ 32G_*뾻˒f9Ɩd_zGa!էM숗qFm[*d6;㵩ە&C5%eZ$JlN&KkYĶμ!t"X*ܴ&#he%lhXo&Px\S; ڒ9s `cr L46oQQY7E0^R'Y=X-~(*7:9Ueo ߁!YeVxMȿ糎_,ybٕlDτi0*!~,((:;ax)r"}:ii3ɣE8J06hyMju3^ d@2G~LwH1v(\Z5+?1h^H7`[`V]3K \L!xpbJ]'n"7sH']QIK$+Il^p5ǀʙe@xQ׻$ ˛Re\Z~lL"F5I Bj9AImNoM]sG]teFwb{ A_3U*fҰОыt&3U{D*t tŬݲ$o!F.d"C'$a 7bD{#aʏt:ȻGUՆ%bQo0ï(hUuYUCהHU0":i2@d+ h2%Te$%jPH!_~3gV~&TdL LRщ+;6iavor2nӳl[3m*EG(dd4a#'jbI2^D1x/$c,M$cJF6F&1 jeMF??-c! vבrʱk Y@vS2x bd٩&tgLm6=5yIV"䴌Zл+ή,nM]쳓 d!ڜb0D{͝.]ytfJS"R+VUaTcYb\3⯤kVH ,V>tKreS{ lRx"꾮spI5I,>q,Lt9oftq.h0"wgj^ r@g{/2U6L4.Y̑ a;a 2p= ?(LHr&s^Tr&#rm-eXQtjT܌C#ݜ.Bafbd&X'Iv;ӹ(EӶ'a>{4)3`+=P:|?a?kܻVU}Sa!-ArҦ\"A&-,(EmĪ 8ݚy5 %ape'^֋ `I$I$(c2(L2gпhҶxPcG7J7%(' D Wq4@Ŝ5>qPzlqеxBҗvͲ "ΫZ?C dG )՟堵n*C>BsH^4j$RNˌ۟˖&ID5 B앥8:wx0=*O6UŅL٣teZ*P;`ıF;aK`SEUӏ&ƺ_/\siЂm,zyQ`E 45M:2w׽#fā6sfLHVdC|zKGB:GtuAQ]΂ь agOwazTg aFɃ5V\V9MXG3]mXٷϸ<8M9\96+7*$t4qfz8!ʻAcdg!.~ːvk/0Q-~w@fϋV`4]M+3)>c?]5ꊵst$5e,U>6DhhePD!ku/L/A)q 8Ω&9-c4%&42rR/̏HQTk f;b:䖅3REi[[Ωql&7GF&Jr&@)^H+ShFC1fm;Fb$ΈjDI`rn-}3$"XlqiDIN3DQ 4WWK%*¹p@9#cnʥ aAI'҂goKbAѮxV:e0lUȸ@6.U*vLTʪ8奫D]FXaVVݥ٠5]8AYd,>M"406꫊9MINcVR0 *)#if=82䌖Gg,4{"ElhfLى#ΞR1gIs1D"ŶѬ1Ƒ1Va5]ɚy~weмCZkAт$huYIBnQ0؋T]CJ1D6K,Wj=|p,L `.<03}6ጄxAe7 aX<y^[( JyB=ְ\#NvuB>R#B<5Xwut (>3.J"C:e!Ǖb`N{=]NXV{OSwm76DŶ[OIJ,D/w18g1n#Nŝ"л-j#[^(v8Z;lE@u3!'2䋵ַhƽV ՐF>׈V-I+B[mZ*ާ]ac[52/X繞9M;'*~e6kCSL1B%zKɃdٙ 1VIKd @ʒlE7XvbV"p (*n0Ooפ!C^(oiwyosdnæم\ @wGǸ:vdkq#P]կ w.e` r &y(*]zFJH R敧Zmj0o$Jfn/~/Uטtڋ^|`fcآ%d:Q@d9"pkUjʏR؍Om}k[r5۔v&#NdQ󇭲j} "hb5/k;1%셹@ʣ3eQ gla6qف-eB}B9b5ф& gQ$l@]:]eCb `0MCV"NcӄiݚiWf72(G[uLL㣂)XK*$Ύ<Ӗ$K/*K(LK}(LA(9Idn >#F6oP*RypۓX 2…f8P@>@|H$uR;kld]ل'J&F%8N$Pl`!VTUPAj42~Zz)5S S2RNb8a͹ 4i0<*C`|5qNU siɻ>*QscX˵[y bB/ӗRhZ.R$G*0f\sH͚R-{b$ĥ/P KB q"O{`x/?rN=+[`0,!d'gv 춍kբ`wjcB/6kRkObXjڈoiV cug1nmvifЦmlqq梭@m\m4^Lca8[3q"cr& tTe9)cYL҈l ~[F6IvZ$&b{wK6P:S 8T~ccQTqL,p,DcWeJq0މ<,y,1l10[uwZlGyHL]niIOCIth4_,:YoFGt^]2;Hiñ%Gf&[lg*rߊhS71]F J1wn\, W'e2S ,F-q8ҟ!%<@wDY%aaZGvn3 0Y#l.![of,|=,iMscs"fr:Af"S!DMlbBrR )OIYfߞU*r D%@Dl[9JV7hU |J'¨_ |*P_ |*B*/)[][n>W*3Ak|䢇Z`rǐjxus>YHrX DޭUk5<T&ubĸaQ 7PJQ3]91ӤeX 2C˃ 2,y `FRkI4.UԋKT~Q!*rzUNIws%Y(D(ӏ]Aa;nB{1摔Y*Oje+KoeHjKaXIN_IߩIBF-iJOIԖM)KHՈ^/O.wUЮL52^NWf4ة6|>iiU}HG&YcbF_jĆ fCpd06aa3cegx9S[ )EM&Zr_}f\|֡.LPPڏ%+ܛ0e9"$4FV>jiC @9  VS(ۥ!v9=|dB:&jSc9R}5_63\pp3^YkZ)@"k!~fCJ@*op0&Yj7VŪ 5H`A aOϿVeӣ?F{Y Ř]F)sney-%ٹa 9N8oF!PС=3AviniBvb&rfaa::s aD@ckbk:~ac: vk:W!;P fp\ )eb[F6rE-ЬAmvv)HEE-Y101,Gj{(x˶ԵȂ6RBf(r%6i3"$ȃPAAs)10P[Ƨ PٕA}\0.y4 =~5K^C DpCr)aÓhqCblV {wCӔokyb{zYعK*iKQ&,{a;2aWJ 6ȼJ<Es0^^s$NFn ?+F>;^ ˾#h6cX)¿r/BԚ<٣28FdF(hd/@da0DTCB1~B$,!+9M&,ۭ} : Ó`HQ<Ԉ$Fe|Y7a^WKt'%/.ۚJ&请 /exi?7I!f.K -\gD(m)}lJbA(Jd\Jt[ v.&bTl À wHͶJ1$F 3@ۗF4D\ްLl%GB4ejFKdya0x N3vS4?͍ o@W[I|F0h6"~>s;_JԲU27G6&;H:s<01'} ra"Pv rv!a?[?B:dFpu_7Tids5}fF0q#xu2s1g̖~=2dDƳUE]Wy+,JQ8*|0-EP${{ZbVaz:TX¾u`X N'Ʃ+rD-~m1b]O1=9R! D*wNXPm'BMU5.̘NLvSs +:Z%j݇-%g5>Slm?7qr~b d!Ƀ(Yґ6?Vr\"3* ! U[[way6: Yn$Z&GK3xD"bv&U;gf{3Ue閌6[I"bP^(TxɦR!A1rg$'\J!hX8~[O_(/%Id[QD6!nD:e(J4ﷶ`(D=1@r!llh*3X&>KRqC dB/&=75ruO&ɦpt LyJ]p+-o+-³L f{IYg[ُM[F?v Fx6v;GXn l/G݇&!r9afaNnc6AFղ97a9ZEGNT DgY]ܺ3ft M"3ďUN&#b Ņ}c1AQdQk\͍o^ k5!F`!hnUda bBr[V+""iv-:v6ȱoV㒦jH^.JC. {Ӭ+d%g)c6[D-:'-LX$K)j}%L֌s hf%-{V4=} 0[\! 7AE ; ⸩d84!ڶNf)/N݄NJ_N8 7PN#PNd5T!UdDʱ]@ZBi+$у /6&ZI\˿lc=[.͓ePhQ?IPlP""d;6DʦeG)4BCm.UeQA@jV~X"e%#R/'k1PD+c~U;@D̢'>XBz$u1lbH#*W2WP̭~]D]Ԥ5\!2X1b檪ʳfS%m'9AY>CF62}[[k2bѬfj\gfVYd] sEkZn<9 fk0]b^a.[PBɘY3pFҞg$D^E)-qgHXI.~ğE`;C~8rVܰ^E>~LfrI2aV#?rdɿ̉5tTR`lJo}q *8XqTGk\mG)ƺ{޻ѡSܪb$գW<q}\WQM8&WxTŕ5VB*Jd* baGa)iFBkTOMnBmf$¼~BkHjeK4Ejd&~`< ;MAvR$D7RXYz1"@nO9 Sg5Xb 0#ĝ{-@ֆoXsR B/mPdKo{)4=PVUr?_U;Hfi[O0Y`^zd\.5,,dڸxѽ?N"IssBC ]D Z[̲@T=ꧩ娫=b4YH&iDDf%&27j;jkeĄlh20YPkה{ealzL-jN }Kop'/pJyrߏOQNBT`P$4ik^ƥ֜?G{r aK x\X6\sk~%%\({B2Ԕa)a*a[fh@F)БO b.&CĎ')*̖\CE%C/=[zWr͋ͅʁ]w U ]4+(;p P \/ftDL S U [enVz^ xx^涝qUXWuWy4:L]CR{- .uttjyv*h'@ˁET PbcaCaDeٖ" H:medr&b֊#2 `3"$̨ ZęSi*Ę`y( Tt@niY/EΆuen\5yh(lC"et^-]G->M\) ZHNf`Pv/bf%v`=ez?ȇ-EqL !/O#I%I}25\w0S,5J1m[O#2MGvRH6i"ɽrdzdgfLvn/hsٳx6yݏo=BlL` u@dqٯM..q'dg+i֧s`m @a1H;w65e~bBBbAH*]M[fzإÓ4kpH/pa濐# . Vc¬JG<;񀏲^pܭEďO,7b,ВM;3tEs* adDy^3d'C~|xϠ]LK'10䭓ԏDȄ0Db^蟠ٜ'\ޓZܼf殎VEHQ"@ c: 9֙//2kjPEv╾30yVmG[$+P Ty} sh _誵1%pz_JERFq ;"~&q#N9I Pn鷹o0Qypdj[sF&9|!2IΔMJ Inbrʎ*daJ*kF1OO2t !C #Y"p%o) ,ȝo*e(t q^]x ƙ3znF%m:b;aMgɑGhCWo})x5!PAC7M Q 9Jczk2,P3'Sf@({Zܺqphr\mJǖ2&U |3)^/z0щK*8O_2Kmi>~,L޳fЦbP~8ZI1(ӋkSșxh@m'VbQ!qy >Qq P.è/ik6зRcSgCʲφtܼɱwĄsFD'r!7,Pe}OS*QQ`v2x4ƾ|Xji1Ru݌Y\?巌@.qDMN5['H94d?/eI^θ&2'h/DMtu!Me&*?NLN!.ӗas1BEɝhiqk &Ye#oOTn:|()iĶgk߉Ft0}o*,"dd na6`It\#1-'P6%a5nUܝ_EYM BuA0A5YmxKsD׎`ayWvVa$sDV|!qR: lА;GmgA.Pz VʻkEn\/^xf@lQқ$P@)Ѣ˼3td@"sfQZ"*2]bϕͻ괜!0+ӃOb¹R?"{,{o<&7+q#NhDC="̧چY`AseFԈ{p2H;ī913_KZH3""֒+Wm"5\ = i"."Β."Lh$9;DdR^CL}.kۊb+6N!YjRiT>ΠI쮞9IGEl1 ['x1]i]1"+Q悧E nK[ǖgjG45n 0 ឱT+ b%{x`:sV0E/DiqQK! #dLPR ̎8K6Oh^T\\{eq{ZRJFD`?{/뙆•Yzy V\y&tzdVJסtL${gRъl##[_2UJFH(V-VbLhxBrqXK"3S nK?r0p*QqLQE@7d{3w8aS<#wu~Σby\GGGPu_!V]֝aEnMa8uPmsjhgHdRP5DM}ys<ٌQg$Sш\cw5*'cwN +v5Z*lcl^1L&wlo \[1b!-x@aAʬےqxT*ZUjϵM2 85,9:ͭȭ))",ˬ/G:۫&9K.7MB<^)N,j8TmU [#˳OJL\{{a$؆DIop>Zp%n.) 4HqqʜXcFx71 6;ə!PQv=b ٠5Bm)J 9a|RJgP7ǫɊĜXy'RÙ0xѵimSjR(n!]GA$}&}#~ᆙiA?lФh[$S޺XHRE̸]S9VOHkID) (w0Y&Vasbn6$|1H@诚:96k)Pި[XWgVn]w?nƴFж4+#jyy}@}Cly\`3C[h=r5ɻې]FpY{) 9Hom$5#l4o/CmMU-egh~nĢuяUUHJ"Z.~4LaBd6FsTvcB+,ehR)[ѝx*b+TqO\ԩfxΌ{\AP Ձq+#6'q:Q+VK_ v_\QZogL/|igCҨ4ؼm"ዖB"kݿv{=s ɢ,3 8LGICŸe%[SJvc6nrvtJLRJLhOj!R/Or1?ʷ&_YzIu-5y5hy?^\-bZ))[$t})J'H*0 o@aOavaaTf/ljz\; NM{@}Te14PB\-xkX8Y ݕ̧CQk^F;jNK~η TN#! @if,CfJNF| PA'Z$u!ꂼʱм̡̻ϲi$OzeIәo`4LXuIb%v.kmfkLdg*!R'; aq;sSAh!P4uI`%ˈ9z[18dГ(}k&0j/)ňO#ra Q֥~-=ۣ؅&yMAN2rF@YKG;ՅLWɦI댅ą DwV6`0Lm~<煫7^;q zNcAn0(^ET+06vZgp/Lm\Ƕcnh)/i}}!!0GTL9ވ:&iPA:{tUs9Okd"GahI23)HFcu92 O|,%$چbUGPGnu3 9XtVјaf'0YC! ǴbM(FrA_ }ϗg_L3O? STjb̧PܩHbo2&ў2L`BBifƦӴs{sG%hDgoA( *tcDx&u& ~sNl$56^vS}1 cT#Fu[bT|[?@!FٖS4ïmʩhj"c1 ˺XM@1=Jsu#Nm`"DBD!hC] _@7f{3nV%2hCaw5o 0`3 bug hIJW$rs84gV\}Ӯs53p/ B " A7 B" =%2- 6-aQς0sP]쇬Oezc0a3Cà5Dٰnkib}ֹYV+*bT @sD*s(U΅5O3ZWcW@5) c3RSvilIej&Qdiݻ'wS B3K`a1h4vO# !ZԼNi{]C" )ٻEP'Xlwpk=4 \Gi%'Gey SybJ5a`93,Y[G|i}2tZ> 02%&E^{J]3)vfYحCNDѠ#(ǑoggwYfzqB)v;1F$ͣhRۣ ƌ~D~MKe+BշqkHًJɉG5t52 )z +>LᐛˤݵJ WhU p}-ޫhc3{)ec-m aA5HW*SJJat3g~^0yEh\XFVWH?3ü2ĬtEKZҶ4CBtJf/ ? )vPJ ,ZQ'B}@i4f~yVyv+Br1O=ɕ%NĐNdi!NLGQsUט5{B|ĈO|,$pZ3B`vTOt8D$8DJ|!{9XPz{wQr;%#o~E< p P:8saH+dwY0IQ F-LNBlogisim-2.7.1/doc/search_lookup_es/OFFSETS0000644000175000017500000000065511541757200020220 0ustar vincentvincentt\h!/[AY1komuthFgJ'+,ƋU1k&i}cH5-;&8y;*\*@ )3[v4voCW7@2`KRI!y(rt!18g?nyC'+Rזo(l;FWvCNMF -SE0tE>˂W6ӲRF=0|,1vVW8AUw}` J0'`Xƺm<hN_ >mFCbўз06IUl ~vf:6uidV*=kYvaWɛጟJM{aIRlogisim-2.7.1/doc/search_lookup_es/DOCS.TAB0000644000175000017500000000543311541757200020243 0ustar vincentvincente_u_u_]__u_u____u_uu_u}_4_uuu_u_u___w_u__u_uuI]u_}u}uuuI_u_uW_}uu_lȊ벪jİȓ镆!:<(4##* L3"r_rS,8*5$i,b|֒òfBV TĊ+%dkv`ja*a*'|ĊVK7* HĵFRmc*rRJ$cң",hĒ4̩<}G_9"a6F SIKUI[KKLJnJsi*K궩 Ҫe*3%`؊+ZJJ(Љ+*I ֦!6RfSʪkҪ˺̪̭a*ңgJIZnjj Iw/+2ꪫ*(ď3333333)[ **ԱS+؊]J ꪪKԜ"4p겪2ċ*yJ 7*XؙL+VyF-]|j~MbJ:#ô"sbԧUaL1"h J3"9*)%e65&YJZ[6MĴ̋V]o\8LaL˪a,WT-ͪR߫uGM >Wؕ`6K+ZWn̋)GLi/4$ò3 s|u0",I[z[VNW*qK1s2~ӒFR:pĞS^Q+WmS"oaJf ڭe-̬e,a,rϪ̮F!Jƌ m.a,ںڪiK7$ݻ˼˻M̿eKi=k˻˻˻˻˷U˾뻽bjܻۻ˽˻ak̻i6ܼ˻̻ۻu;˾M,M`ܻSS˻ika|˻.^O7.nn.//:Q.m..Soܔ1.=n2Nm/NXMrsvO.3vH._.N.5//6H1R.66/s.6OVss.2?1//S.W;r37.n2/ -22.o.W;2N>m3223227.N...3/R/3.2 nۅ2Q2n/n...:OnN.73n2..>n.S23o33.n3/.O2/{/23W7/.3:..n3/|ȭnaK˶˼˻a\˻ܻ̽ۻ˻̻˻̻ܼj˻̻۾bVq;ܻ̻̽̾ۻλ̻μ뻻˻뻻뾻˻˻˻̼̻˻˻ۻ˽˼̻logisim-2.7.1/doc/search_lookup_es/DOCS0000644000175000017500000004041111541757200017631 0ustar vincentvincent1P-P0"@1[q:/FB&-ƊɀF@ɀ,Ţ*J'C9:vB@&Ivl' $ںڷimt;te@vFIjmf̙ʭ#q9`_WU9P-nIۮrWm۾unuڀ BP`-]NU:'muuorn۫Uvy~rI@ii}#m4n_bNbvkodֵ{z%',v@dĪӫ@4":H3P,ibm[mʮ]9;VLVDt꩖鞙RY@X(@41Xuddm AnzUwgBq>Ez\Ŏuaae:@b1:vj}M{Vدmjx{i+Q3@DPͪ4#eq_ec _ie¥]ev]%}mL؛eWgN3Ƞ( tRL+=G0]{_Y}e_@ɀ]v,U߮N@V']kkmau\ڀ޹&%[`Uvɀ$fr V;`1@!!_Y}ele6uD@3*&d@ـT:,XtK@>ŀ\"SDvV_ee{(3}8>P!)0!̛3+Fd8nDf%_YsSyF+4@eLr3k@),RqE4i.B完|7|p$ƭF3P+@.GmS`ZP檽j`}Iud p|ڈ@_tQd@toe@ @7@-)W tʬm'սmc$4Ɔ4 #ud4+ d:ɖM`6$2*7*MC肀5s@1)9 mmY]ۭ56muP:#i9ޯ+0@C-t`(MT?'Xʺmږhh`@`@<Lnr4Kbw+~ߘ"Ţߖڜ@3MP6f`dڠiNV@?`3e+bLs4!(n6m2FlP!8b9*D4(֪t6=2D;Z-:l0Bj8`haD40'XT)cC4̓W8xGuZlGErfӹZP@#i1ԑQ!5%@;@۟db!nM@w6hD>qנh@i}c `)]\e¥\•MKm|"Ę@e A0@ˈDe]%[m1~mtf0A8"@99Րm6FmD{@['>i,2LTP%#@D@D$?'eT܀@I Rĵ6mՊ[mnuۭgeirk#a-TxH6(EԮPY$גq&XJP@IF!y@ykjӫu)Dc1!_5)ȀjTiW5[@ñ n?[r-`-@ePՂv!^@`5GDt`M%M[nn]mbvoڀOqߘ'^kyW]nS(XPZ@! !ߕ@9(̈ 'v']6۵jnj`@vO1z۫Vνnn'}^@ kmՎD!NvVbZ֨n֮{ۭmdeS1:tff pkwX‰Fdw@m!F۫}opgosmHuWd$֌P9ḕ^hL$W{J֥áMs$oOkJ#2*]E_6@U u hyM}-4'@'1FV#Xm-rfG4!e0a~uYqO@1`2"0!b@)=؛vljSdi҅@>KKnh uQpȎz8/`1FHܞ0`i]M<&@v 7 @@4e1&ǘ0'xIeV_ee_4@*n @ɗ̺@e3I&j{\Rs4+|;ϗ&Q7@ɔɓB)qi9`@0CJu@~͐7!lߪm,mJm*qL`ƀy6!iӒmٜy}>qSXbt*iޑS'@mO44'}%@@I}@AP*Vi*IPDT.$IFe鹷 HvXRJP8"ZMhuM(ExBbҚf8]ƄN%rsIe_@vT#<3hyACnwkU@0`<"ƄLQ|}_e7%ˡC@Pf`yNi#P; HrT xP<KA|Ţ<<#jTƅ@ayJį>ڷ5aQ5ĩIu*ـcmdbA'DtA0jA|!ϐ`wfRPaI}'g$1b:HU`Û@W0_/[O>0mm:fX@Ʀ\``00e`m׎z\$@äP+GR"Vʢc!éaNfcXɊ@fǍDr)W,dzcbbibƵ[6ls`'@Ǚ%c@*Öa-2#@XƧdAl@a.9#ə=`ɉ@ե72_PE@@ KL!=`q|N44F᠑^i˦m Rӓ Q@$LRGEre`Ges _`I8׌W@iF'i-jÇ@/PՌd1Yc4P2Aq:oP)6Mij鬛6#j%\0՘ӈ)Khk`Լj!ng*T@҃@4HuuV*o3@40a ׸mm%4,٣ټo&ˆ*mZS2/]N`b0!t` $IrH@:@R@fړ@졋6v8"ĵ]`♥aT⦵hiX@`\4_3@$ddjeuB@t1a6@$T饀ׁ@?Z4(#uI:oP+#wB@ul:%@tp9T*D^,lCc4!!=)< рYq4tX<D[@={v{SԚip%6O[nְ@V$zV&j@4*>$m*|o"S1R_sY}eـ|309$|u@} }V}VP4}V?%ʴD??tt g& @~1ͮ`*{4ta-€€€YgD€Da1B€aAaI)eFFI€Iò>taaa*€€€J:^JĀBD@)13}rzbO(h``Ā`Ā`n[Vk:}**ĀĀ A(2DwbLPftuĀ`212$}ĀĀ1ĀĀĀĀƀƀƀƀƀuƀƀc 4ƀƀdF^i/ȀʀeFʀq 8`!m0Fmkwʀˢ*9ʀ2ؗ8ʀm>b. ̀!!2R̀3|8̀fSt&̀̀̀̀̀̀26$3.@̀%̀`̀̀ 3c$fR^PfI\P)3̀̀̀"i΀΀΀hA aЀЀIЀЀЀЀTH8Ѐ`h ЀXq @ЀЀ   Ѐ Ѐ Ѐ   ЀЀЀЀЀЀ`eW"ҀmҀҀҀҀ58 㸵`րրրրրրրրրրր`րրրրրkf4րրBMրրրրi@րրրր2_րրրրրրրրրրրրրրր`րրրրրIրր5րրրր؀؀؀؀I؀؀؀؀1Y1؀nnP؀؀lNZن*؀؀؀؀نj؀؀؀ڀڀڀ/ڀMU"2ڀڀڀڀUڀڀڀڀڀ܀܀܀7EE܀`` %n&n$Dހހ`ހZހ75Q@oI*+ jހoFMa`o݀}Sbހހoހ` ހހ ހ -ހo^Pހ T q\PyDK `9rr_Pf̆sr[r8X9$!`DŽ@2qsTsPu`9`j*"sYrzŢK-9`tB˷DK8`*oZ3 dumuu`;~*u`*%U  yET!=y Class  Referenceogging isim libraries fMemory Library components nu Reference ZTool  ultiplexer ier NOT Gate egator Opening Combinational Analysis scillation errors ither verification options Pin lexers Library `Poke Tool rd \ing 'ly unt umulaterately hieved Yknowledge Wments5rosst ionts veities s ual9lydam pt ive'sded nds r %'s  ,-master.circ Fquery 8.circ  test.circ singtional -ly  zrbitwidthessedss*tool2s mit kopted vance ds ing"ised3ffect*eding-stergain?st !gregationreedmentlgebraiclorithm Lignment  l-floating one s zero esegationow#edings mostongreadyrsot ~-click drager ing alternatively shough ogetherwaysmongunt inalog ousysiszeingchor b'singQds tgle nouncementonymousther]swer tiquatedWyoneLthingway#here &parti[s parentearCance a's9ingsndlicabletion sed5s@y reciativeKoachpriate ly nximate stlyJrbitrary cade zhitecture veeas@n't ise singthmetic allyhkansasmoundray9s.aslistowheadstifacts scending Tt.iiribedYk ingsembler fign fed lmentociate Cd ume d /ing terisk  ynchronous Mly top ptacheddemptsUntionractiveibute x's sionuthort's ities:s omatedic gally(vailable eragingoid 9ware)yxesb9ack Pground(space +wardslance)r e-bonessed Oline Chbic 1allyds  .getheightwidthxyeautifycause ome :senfore ganinner's ip Asoicesoseingsexnristos Gircle suity's  -buildingsmstance slaimssses ical roomeared Fprops6s0ick'edingsEpboardOock 'ssgneVablennotsupportedexceptionselycs Nr s  0nceivably0ptcs %rnsludes dition confidentguratione d newinstance singrmlict ing orming $using  gruential \junction.nected eing#on s(ssequence tialider eding stent"s picuouslytantlyitute 8ing!raintsvuct ~ed ing or 4s $ume 'd tacted@in edings endtsstxtinuedd sPing cously!ractdict.stibuted nion sole-click ing d l /ledingsvenience qt7tionalrt edgway ordinate sjpied sSousying right edrners /rection Gs ly5spond ence -ing Ws~upt7stuntedrL's.gifdata .get poker .classingries]srsewstver=ed Qpu.circksreatedUsingvewuzs61ccitur .getvaluesetvalue updateclockrentbly sor xve y's yd stom/arilyizablee "d s2t -s-mail9s .g @etkeychar!x"ysachrliersierst hlytNward y Jchodge K-triggeredRsiteding sirelyriesXy  vironment qual -sized^s )ivalence \t Es|rroneous lyrLss1peciallysential ly europe^venYlyts +uallyryone'sthing bxactlymine ing_pleKs ceed srllentbption ally shange lamationudeding sive Alyuse'ecutable e Hd ing Nonrciseist Redingsitpected rience d ment Pal Htslained Zingsnationsicit-lyyorer ingeortledzingressedion sclytend erwingssiontract herentit Lialaly te&singput 's^s qsert Qed ingZonXs idest Htallationnce's .getbounds settextfieldUdatafactorypainter okers tate Pt aneous ly?ead itute3ion ruct ed ions or s ments,tact eger sraltedionity lligent/ndedtionallyracting on ve ly1change;estOedDface s ingKere mittentlynal lytional pret ed Psect ionorroduce d}ing uitive %lyvalid erse ter socationNkedIingslved ing onian  rritating slandsy~'s-classcensedes%sor es fe0ght -grayke ly|lovmitation sed sne s's ar dsgk s ;ux B'ssted #ings t e-ontleveoadedings 3cale  8identifier 9s -tedmion+s kstepg arithmgedingicAal ly(simL's  -filename.jarjng:erok6s psses=t w -orderAer -orderTedSsJst -orderyingmagc .hine-readableintosh esosde gnifying$in}.pngxtain3ed ing sNjor1ke asingznagesifestpulate d s ging on 0sually factured ?r s sy`ppedingss rked s shed 5tertch&ed s5ing erials rix esTterximizeXumy mbecleaneagerpn ingstt suredmentdiumet  Rm-image.txt }ber poriesyntionu 's >key-ds rchantability ege 5d=ingssagethodsiddle 7stght  `llisecondsne nas e giaturemalizeds umanesota uend setMxed od$es ification szedr ks^ywinguleAsHney&st Wmouse 's-mappedevent0ved mentsing rjadaptersulti-bitbittple -bit input x er X's s icand 'tion ed r s s yktable x 'sn"-gatetype ail svemedsnd-only  Bometer-widerrow |er turallyBeBvigateing nearest cessary qityTeded Os gate d ion ve or ither sted ing.twork verOw line yBvalCuext -to-lastgray?ibbles 4ce rxo 7-arguments ise n L-directionalgatestandard Dwires =commercialHeNtheless infringement rmallyth -edge facing Jsplashtable y%tionch;erhingicesMfiesng ;whereullmber eds erico&bjectI'ss ligations 8scure ervablebedtaining :viously ^ccasional ly sionallyurMredings;dd  ff-the-shelf*endingnrXing{icialsetten{kslduer st mits 7ted n-screence)e-bit input Ylinetick slytopen)-sourceedings rand s!teRing%on s 3orBs Oportunity site tion 0allysrangeder &edinginary vganizationzes ientation ced ing~ginalRss cillate sRing on s7thersewise uughtroborus .orgvst .getwidth erJgoingline dputX's  6-master.txt  9query.txtzsside valer4all flowKlap&st Eoverlapsride 1shootwritedingp#-gatetype}ablockagedsges+inter .drawbounds clock label ports rectanglegetattributevalue bounds graphics showstateinstance (r's le,ne!'s per rallelmeter sJentNhesesityt ialcular tlyess6ywinder}ssed stDed7s @ingtentshience ternuseDyment eas Aculiaroplercent rfectormance1ed9ing shapslqmission svetsted sistenceonstinent henomenailip uotographicysical8lySicturedNecesn,'sJk Oneds xels[lacedsing 1inte$sform s0ease ntyxersBusmng oint {'sMshke dingWlygonVline  ntifã­cia orlyp-up fpings cularfprt.inputoutputYabilityioncss uguesesition Ming#sibilityle ;y tatoes wer ful 1ractically estioners e-existing$ambleGcedenceise dominant Sferences@red pare =sencet rveing sed s ingttyv .getbitwidthisfullydefined tointvalueent)iousMlyDiceXmarilyyitivent able~edring or ity3vateobably1e2inglem atics cedure edss @ed8sing orBduceds t[-of-sums\fessor8gram'smer ingAsessesuhibited project's -specificsminentotingptedings nepagate dGing on [s er_tiesyrietaryRtectedinguonvablyeideds ing  ~seudorandomublicshed Xll ed s serposels yshed}ingtython Dq vuadraticlity .ery E_file  wstionable icklyetly kne-mccluskeyktpe otient [r -s acedix ilroadnbowBseGdDsmos bnLdom o-access nessge s reteherwe-enableopen ,achedQs "ing t ions~d !-enable onlyVabilityingsy l r-world istic tyly rrangesonably callHeive;d~sCingnt/ly -placed}ipient esognizedommendrds%tangle K's -with-notch gs 7ularursive lyTd 0irectionstribute d ion orsuce 2ndantferrenceCringslectedsrain use Qgardless*ion g-neutral ]als ^ster 'ss Uular llylateddsionshipUvelykeasedos ing vantiance qevesing oad mkaindering {s?emberedNs+ove ^ds]ing'name dered,order pairHeatedlytitionslaced ort ed ing;sresent able tionLs &ed :ing Tsutationsquest ed_s iredments sXsets istorzes olvesmurces 3pective s ]onsibilities letart Wedrictedbion Us resulting sXt_.value `.extendwidth ]getbitwidthrieveZdWsurnping:suse7vertsiewsedwireight -arrowdclick ing handedmostSs orouspper UsesQingkom omtatedughlyfnded -square;teOd ingPw -columnsy alty-free >u dimentaryle sn-length D_testningTs ssia ?ns )-rafely]int me pletisfyvedsing vwyingsvcaled hedulerienceope ratchesieenipt edFsollling earch ed Ts ingcondstions edNing mQed sPn `s pgment #skhon rlect bitscedingon gsorAs  f-explanatoryl sxmester eitransparentndfs se t parate Vdly %orPquencestialries vesFice ing tssion tattributesicon nstancepoker offsetboundsJportss tings ,leupvvalue  ven-segmentral elyYhape 2d x-xor is,reuding 1ellGingift-click ing qdrag ging ed r ing pped ort comingsut en ,ingjtgw un$s utsidegnalqedificance t ly lentlymilar lyplewcounter graycounterr"stDyjulated]ingon taneouslypncegle-bit +studentite 's uation sxteen hze keletonip lawyider/ghtly owerPmaller Knap msUssoftware ldedidHution sving mebody{onethingimes what )ereingsrtedings GupteE.fireinvalidatedgetattributevalue Ydata instance port value\setdata portd ment sicngstics dsus Ty ing sdattr.default_label_fontlabel _fontwidth oeersp -by-steplsveZickill opping#rageEe ds king sr  aightforward ngelyict;ngutil.tohexstringuctural es zub 2's .s dent *'ss ff ppid ayle fs 7ubGcircuit 's slass +directoryject edalicensemenu itted program routine?section s quentt stantial ituting onsCtlety ract ed ion or s s hendccessful ion`h fficeFggesterslion tilitieswe v2.0>al2idity:ue .createerror Dknownafalsettrueasnriablens \esoty)ous y ingerbatim ification y sa tileionsUtexical *-bar Rly^esiyia ceewedaingolent sible lualfoid 5ltage s"ume \ulnerable wait erLnt Csrrantiesyyys>e'lltreveb8lcomeCl-knownrest -facing sidePward hat'severeneverreas 'verather icheverNle -teoeverlem9se2ide {rthA.getmask widthslling ndow'ss }gs ?mergeUre's d-and orsingGsh@esjthOinouton'tod #rdEsk@eding snld ry Lrap ped Jsite ?-enableingten ongte ww.fatcow.comx 's 1010100 tnorIorSs-x Yxy5ears ieldou'dllresve ngest*rself sz ero es s immermannoom H   t  I    ñ onnected&definedr flowlined yingstanding ws,o.es enforceable venness xpected  intuitive quett vs  versidadeoties _yknownUless ikelyoadings necessarily  predictably  realistic :selected igned 6pecifiedtil  ranslated usuallyp4daterclockdos on(per y-division order most ~salarlsa QbleMelogisim-2.7.1/doc/search_lookup_en/SCHEMA0000644000175000017500000000006611541757174020050 0ustar vincentvincentJavaSearch 1.0 TMAP bs=2048 rt=1 fl=-1 id1=3640 id2=1 logisim-2.7.1/doc/search_lookup_en/POSITIONS0000644000175000017500000017036411541757174020510 0ustar vincentvincentaaa? =5x4n[%VѥL$/ƪ@eԐ2 9I x03Ÿ'fu0W2!AG6rL h\L MvOZFd)aS76_2 9FAG39s3\=l3s@3]XsԔE~Af2f47嘏 f @أ[ fx;LF4;dskQ&ĮzѦqrNJq/\\׊[v:5xϳJ e0B! h3 0ʆ'!{ ǜC_Q2 6]$gVY/a=]ڮp\'ۈd :Y=0Dba9,e$en= HȔƤ4+,UftTB]E\# \j|6ǜ\qz)AN7T !P gah5> j !R*P3D<4DLUH]􏱁pcZ5SM6>]PѵE܀5Y) 5s9 1M1 w?sxs>k)$Rb0s,AbŲD#mDi ߴ&|[ 0&ᵫ!.xlH-L2Brlִ# J.0f$z4CdUmdt[|<RuswjRuWr[]#kǹ+kթ*cYY)U?RyۙJ5]{}P@ 0r 0h51TB|F:+}aHNgcw[n1l٬+{CNf{x$oчPSrAċ':yFuim[Qn&G2) Mrf"e8TB!Pp' AFjGKDFlgCem(Z9QX, (22%% h; 5\#"[w Z퓧:-hOa$8džK)ǤjжD%d.W@|x!Q\"px ] Խ߼zݧPqG@xɔI$ȴaGo,Cde*>1M c->8a?1T\_yF~ s `!,EM;BrUOYGit@uàĤ#a)9UƎzoH;pMƞ+#=UY~~<q4% =DQMݓ?-y,za_Y Ss].70 w`T@LB}֛aCKdEۤg'5",2 9܈&t6 ,J60O ak:FݏU4+JӔB]̆S\\ fx/}rYQfNei vȟ(VҢ:KHdwCaq6%X](nۅpe8+M20bd[eLTz{ a=jh IЍJ=Z[u_4f8nbj)yH0%qؕ-3Ne=j)ʒ+tB\Y^4j7KhzV*#.-3UŕmO9LL '*P5NQydM{@HVԾ,TK~.u 7,F9:v3Gx 7,ҋv*0ҼY@wk/&LwnDa_ba~:.z~b!H*LL}vv_D's'(X6jG`@ eЛM#Όp.fYO$v6DaJ"\LDΙvםy 3$`1HBm/DHLmw[cα\zלޮT灀YA9%GD 4G<)ڡ9VUK/ht8ɀZTKͦ5eTQR"jӼ\]֛O?(kчl*}ηDϮ\ꂃeJ lAfA=XS =㙱BolCII\Ew;$AʱDxԝFw!dpZsD YvcAG+3ɇrSb}}ܚIYq܈0;5JYkS]6O!@ 6:IM9sJ"_BHaN\L8硫KWvge>_HHH t؏m3)F~S^vi\AGqIa^cK~WrC_sv SD׽tݳ b1+<8FX[gr{5$exZ[Po3u-gGeHD;'UG"8|B4\,ș,QmBw\f mP9GRbF*^N9;vtWG);md+Z3g'luj$i-N.ƋsF'.MI ul Lhhd'/h&?|'rтHA&z;]wz<Ѐs]ԾZp$y2N`Lٶֵh'hJĐϚu&UvkAԗ5`.e^65\ZkI7+U٬ su4gZk6Q%'UNL~'œH Y= Z;њeN 'ɇi>;J!Haw"\̳9|0b\Bۿ5%c^`s ծ-ӽ@r*PeDƷ[ӎs^y_JvNxU6P 8Aܣ rhDd>{+iQK ˔cSxczmv9Kb4Rr:dnm V 0Est{=,4JT0*J.S)#ܱ@ҫ%}V h*¤IױM>lIGq =Eji67C0B6;ԁ\[A\XLCBqDC'Ғ 2ӯMmaOa_Ywv6yt4hg= HC 3;Y~ZeJD>ZݹI0:L3F^zH۫,4Kr:Ƒ8eQJh$,P)D@ni';襥oHEZ2zR =Ԑ`BtWDfC5s-D֫.oMHU\oL ކ# 9r 'p ffK;{3b6f<8ZT15޹d fV7ظ'b h\pj"Ƽv'trlQ>ɹ>;ۓH](Ɍb=Z,,2J)0ZC͉s:F$LJ3DtMFgnF lD@$yޭsb>CL0/Jdz,mecZr )  HChtJb5bϜةߜ[Z{ƃQLϮvc?7ފ]{@]L}`*=o*O$H2|tН Z{Ñ8jAuPĤ[:c33jUӂXՑRLr=5X&l>e '~u/eFZ1.0:rNYJ6!Lޚ/d}[ P٩yeؾ|1R&fyb@LqAwh|xU`=X8t@66B'Mڡ`wMc:vS]gWjbF4"*9p`/+yY-iT.LٓSw$44H-o2#2CZ=ҽ޾TсWeF4&!@hX >qsoДӦɡ>ҋ&{ 1*zHlx*ϑa)ĨTmTϳ,=6E/uX@!|k^@$%Xd dkZjn#d~k/ԲbҔ72&A5k16^e4& cfffeC+}u*MӾ8 Ih*d-If:hȫ2AmW"m@ iIz?MTIuSr{Oz9*R@I(zJ*[1r?m@ fKlM>KQlI1+qS9GPM Ok:gcet_#uQ"#`BDhĦVxi)~CjRe[J.*` ]iOl me`:̤6"DDMӨ~b5uqf{ր3b48Ta+Ni -KY:H=PvΞ!uouqbLvW3|k4n*bdX̆HtaPYV|Y$}FYle. HGPݜUVYzLrtQ2H H$0ʝۑAxRO4<*<[jg!b b8L:˓o 14|e&K;%Pef'mq3 C1C5}Y]'UT10yh#3I:SErʲ2h(hЄ.Ƙ9)BineJ߮K3u^-Z ޞaT.AfM^d!zJmiĪijw;Tզ^A>_ɀ+rLI8xu q n I/-tJq eX~*cDȀ>=Dr㇎JknikuVɊ0a z($<05 S;;^Zk!g/WfS33.3"!C,dS :_&!`'BT6KMySvƿK6&V;Syrc[w eFeFaGJ!riu|iW68*qa0?#M9eӶup^i(8WWh&QBW ֋'9iA\+0sNfaڡ? aV|?Roxx_\ XAG.p#RɰNVeMsm8M7h汝}e*5؎$f7<9ď_ W8Ŏ⶚<1cF-}[A evu?? x\(ВB>(k좑|5d8jFTfAG I`]$)樫l_3!ݰiGz3Q5e:kKj' d1bVkFw#+a -qA(?naoFe ob 0=[)pD kC%TA90f'0޵ #&*1=(3=X#("?c:GHcdm@`q1D}rPz}йػ[K܊s\ݲ;-q3լ/ 3)(9&ՌQ"ym2-17qzXf'( lC@j6 ht̸Kяc(\_Q9X樀0dvL8`2iT^H^B|1/0j` djJ-KEKsHdfux">Ju9BHNrU5!fqE, ـS[Nzz[WlF.B BSV$/]R5^J-3Ȉ\bo @)o1*)FRnGڝWO`T@44 )NdKӎLKגwK:cV1}PipN)NlIPt)!(𾱰4ʍQ5y6^M`ΐx@(GcɊ]6 ξeTFNf@'yf3Ƣ^~,5=B Pc^:.x ֜+dhivͤ񶏏㽴Q'Ӯᴋ}r?$Q'jdol6Mb)J O*\&(CLXahSps18gIo 5\PV.Iid}Om hG=6GԉbШ<6YÁPZΖ"#@Gڝ74gh]gaC:AU;że>0ڟϻ>18B$iKA=@aFeFTe6TaOQaM3QE]?Zk9hſ2hLW8XH] (P@ʓ-e:PN& HxTף"AUF_}36zWgZjȆdYcqvJ$ڕ[ oGZ jzb,B?;D1!D" EQbi!լ%ZeN#QyqסWIqTcܯBfQ@77%ekۦWReL7Fup/&ud]tP|A и|hsĜZ)z3}{C }#ɠnFJ^Yp=x4\;m[Eu&bEk `vJ\<[貋 96&6QSI[hE)0ǩ̫OFJyC7%z/Ǒb{z(2b|⥃<ۻ& RTG)@M@zh(SUɋ/Yl&VSx]u`U*]M1DPHĚ[LS7 #5r7?OR0_v|\l:bA+>jJk(QmZ2&&Q3Ilq?5N;b2(nq_8aZϊĆ?Hϒ.zX[H̀s!&[ pԏ̉u~y^BUΚăw|Q`9vJ9Bﴱdr 36`kJ)n8p!Yxсw O4IOz'" Eo1ɋ!m̖QUQVJ%HQ2dˌ&s̬۝CWԸʼ$46):D-T4aP-zڬܺsˋ)bxZ!ʤÚrS-=B||LeqaC @]b}8s/ eA C r1LcюF;cӲc'= T9n}Pa`cj8 alCâtgzQ:pHqkܓyOԘuLy1>GƠe40Aj6ꇷ;LUM]dn_LGW  e0, !'Y&'{B1*cDT5w}pE9ʒE;T&v͋`;x:A`Ȕ1$ȶĜDUUyzu9}YK$Ķ+Ο,EKKd8”Ф$;y=<~Na6+yyJ~odw߯RG,"w~"v D3KMő4WD\YEqm8TUk(saOa_ϟ_Y+?Z*%UC?&i kHH ٩}R?'A-Y٥SFͮsO=$G-b,S,rzK*ɾmܞSpT CjP$Psm P[*yU~8kAaݬ)!m/x]cO鮚 v.៍~߉"{(6dJP2EⱫ*Q72I0L|%vVGd ~d1Gk<=^57듢):L8lgPFՅ#y(,RF8zӃH|{{wsȉgIȷx`lGzxKI(ozѮA+Mdo.3nQǍ2ϑ wB4%T_HE6-CyC 'ĒF*zRIF(HþNjj1I={iB앏̶'ɚ+FvؐP"J ڈ@BE t>eaK3kNf\^t8fa=l>mC,؄l+ѵ-r-Bӂyd]8clAbk3_bB`C!h̅51}̀8rl#+bC:;q+=Ut@)$:ݱ\\v5:v@i\8#d5JV>n{%Y!aQQ%""xb:Yd;Q$ b]Z6&Bc6gr*9݉6ښc2#50 zgoʲa wƉ9fd흭鈾fo^5kaVa6e>al Qfhf5?&ɊJJ `o 6!mP59vС-lg"FwwQ83P_H@ꘜADv#`Wv?mf~SaKcI)5*q/ q" N(`c7B",UP1 /h9Сҝ#J"0{d˷ݙ&i=&,b2̅UfbLg,gkbS$bG4_x d! =Xؿdu9 <@(O逬yQ5ƙGJ“#<1abQ2$!JbrjFPXΰZcr͎&K.j.l('6Fh~)Iˢ7`OLBW8=(>d?R-\w0**Lh)c&~Rj+ AF겯*8EZ5"$4 ţ+;))1!}S YL-h+M)'ܽg ƸSqů.O@eOo+,3 P̙60 fn-Gà0 I&h8 XF a'brH`y(GCPybDHSnƈ2nIL'KQ ɭx #;s a͓ 0 I}ogEب_`P_'jr6*{bta9׮;haTk/ n%ĄߴDNГmYKR"V@ـ #kF*u}OTuHEyV:;+:3Vacjn#*;` OQZ[^fMImd ڥaM,fBȊ,4LcDrLNfTm:W>|#gN`THZTkOr3 XWC[C?wsAHAĀ2짆c&"?g{LNNu○ЃߞaT푞YqJgWB 6 [~ሆM/Dڰ-gA&0Vh7f77tF"{-V#\ PXJ.Z>J.t4i-6FEAvM. &IL_st/ĉ)I1¡UD@>i觖$hFmdh!l^% L&=,A8%L*U ;AYaN7g,%Ӡ*pA̋8@aU145I^*Prڳe3G3/+&bA  /_[kq5}{G<,b@rGw:il%.V<ŭu.؎۝y@x*'&omRbf;4mJmvJxq\9Nڬ/O6cH.^]C#3$.9O~ J}7Z[d$yNIh)/Hm~0?s2@?A *6M消rz<(n.n3cT6͖ٹR 6Pj6" 숀޶TGl`e8nyU *q,j/l*=ژ="e\Y>IPw}_5w1LvAM%tΗ[OKD;]ZVԳC)&9=0+Qh+%%깢HsrU5-+q)FI"C٧TCE{s)#ZL2H+0Qmw WqT D DIKcݔe")y4ٛJmFBZ|:d;\[q4⟥ AE73Uԃ8  b͒운iÞ6̛V |.+]"JBGN\VufΦtz@`i i48J`f3J[sڙ>]،Uc,cu H72݊[Rh8%B,$ h] ]4j%|W~f}͍L"2}@qCޞe4;]K|\t<':8]OWq<)Io=˜DlsAc&_d!&5t* YH(ɢ}Ԭ |ּmHW(^@\a~ "e'JިQE T(R{HQ$MT)!a+ƛPVOLZ+G1ILJM4wV[+ dQ!A#uNƖƱWf|ܬ7?1oI`!Υǵ#‚u$/OrcDX[rXIN L1&U՚a5DE8횁j 1<@9&~s{4HhB~(PwTcP֥(dD4`t*78*"=8ξiTD_3Lݹro$v_$21QIzR ͻy"KKvrz 5TKh` ?NT&'7PpuK~q'G+a1.eB:٫жjKfVjhen*[nċ21RG2qq6Z/Jh%]@U=R]-ў_e`AA -\ hx}>hZh(EmИ( 5E)+tc|yT5A-APyXb_x#QƢV R;2)yy VCc$YF"ȱlS3QW5hvRbg's̜?֏ R^д1)1؞ w98wk}P=i-?HMay!+ϖD]vzɮLh> Ot{(Xop i[>RVQT=C~פ1%M?P^xb1qV>HY}搳"i 2C7%hA| <ۍ_%(R@s4 nƯB`kJ8A)1! #C+!S̲6?v/4bF$p*[n[;Uߴ=#cQHl! &M=EjWHłO7}s@uE^DjSxG9)Te#qmUA.Mơ2oFjs樜UwTT2||dTf u~2YR>-lVgFidV&rdV'5I3$ ʯcw&3ė,&l׌d(3LOJ=10 yٶhmE& eEgoF/a{,*cty͝a햏G`ÕI㌁PiF*w{V&v$&J6"PC=s+n 8@,UECa>v{TZinױr# jeq3hPQN0դ%x$NU A"P 265;" !B-1_)X"HAqƱ9Tםe.TewQk3tTB$9Fxi*n(u2& LjݱӮUfv]8x)`^@Ͽߟ!e咰˭nzHȄA{ZeKJDDhN/!Vp:DhZ,^GvvNzHyy0,V h: ìN[˩fW4!ك֦tn^/'NR&9(2ʴ11W\k'>HܲF#FWj%Q.^;QUe,My]G.g#sd1J )Uq{=[0tEn>OS2K]G(ۥQ3#Apm**ckr:)ti(nc}$dp紖Y0Kb wu}$dqdD%|4v(E,΅+}q!YQ"׽/l@*AekL$qQ.ņB Y1~hŭNBDnNI ZIU'']?םN3E4ЀADBer헳`K֎(G݆ܲB>T=ox>w `= Py2VE]Tt_uG'i*yppiTk֭`uvYY-̈v!cO CJ)he뺛*mJ(q7Ĭ9Qyҁιh JxsI-ae`49AsT9A蠃a?ao}u{o`9^E A&+dhbpjYZ90=Sq|q7Slo"mtӤZ(S, gd,`QLBRS貚cFi%ğ$ 1Ѯ,#vq2]1ja߅9qH8U␪x쒿ޛE)2-̥ދN9qP<~T# X1xj0E3qTJ9I1Z,y3!"aLk2(#4lQu-!ŢHÂ؅23 TF+DF,-:w&Ra&'9̕m?f@u1cEbnC|'yg )KO%\@ @bHM kM4īh>} RQtB%%'D-^R,>Ŧp$k KmH!ɚI#qZ^%k}3iGSe䲴yGt7YD|y¹u #j#\WixPCE +bQO)%_ꞀnZeULh5VD dNsPg:3|${]-(YбP22/bOv\[ec;L)Х[0@p$CˌY*6rsDz*{[`Eqm ]s 9tQZCZ"W,C,-923&@Pِ!X\ ކPdtEYo4C-Ȋ!tWةgi.2Q3Ŧ7%۰m 6_3Cyi@ܔbCBV)2mcHLcro*c™.%doKH= Q]a':_w'ǐPwՅKf}=xO2Ԁ*hLuE4ZufWFWR@~ڱ]Z)W3K3&<:||9-?mWY-9-N-JҢ~\RIMJ~UN6wݨw hP@~L-vf&?Y"L=д`H˦9Y%޴|%cx#I8ƒ G ]Xޔ9+0d|υt-viF#oFq:<3B"m./1!b-PzuY{XaUŵֽ~w8%+'U51p~ܔzo/{X=;S!hFtmVݶ`[5BHʱ.Qu檲Xs(V^kԂn݆ezy9̛k9Ț$ΒO$%>Y4 #d,} u<78,ӷ cMB@yѢRRRێ#L|ݑJTj'Q|j,`Ԣf~E솄&ǐ݁k S7//쮑3ƞF5Pُ+%^6Gz/0C'$ u[G Sàɐ>q&L;Z=ǥNjh|bceS@J=ڶu9!VS{yky!Nnb%D3B8M]{ۉ46Q(ֱ̑2@`aWo" 9i^cz Duik¾/ gm&V9i{X %9eʺ ) !*߳RF@kc}f%b({NW.l <ٝ(^3r7+;0TV W͆t3 ջcOb0β,f7sޞ1$ct7|&?~9ҿ+?n-: yqDf([!(|sU)Τ::V\1u,s]z3Ee 5]cPjvk%bg4RJh!3^)TO&1Ho.º({6D>~3B͵hnng5:HvRbERs-|_xIf#x$G^i`{AYRuf* L<賆pk{ڰAgZ斋@̖$26UUd.絽G thZC(”&ŵ ?=D\o[BvY|;率6\Dsd kcZ( SiiJvgVR!ȷT+>Uayg7xcAxLpFŁX>f)d?R ꀃa_ﯞaelv Ud#| #B!@e-&:VfƭM@B. zܾ xa)!-!y{@%;Qcz uu]AϪ7']H!\FA~4- c5{A%ZϵŬ%.g[&!Va@Ycsr*a&d/:@36pCQݣ.a} gMF^m,(So6G̛6p3xU;ƻlZgE*o/{v63f5;0N"ϭLu%?m7=tlVNPpS=WRrTuR9UdV p滦ǃ) *EZR+ ۥQi/*9$:՞@[}{Qz?Ugu9v@gK ]Ýj8`L]ӷLzk/}? !Htᣄ*B6`JfVuSKg/:w/-C2IO#B*5ц;25P"Ţʀde+'ޯ.rA`c w\Gjz:<2ґX-X{X%{+ 1Z%1O-VC\5wŜ*wW#ʅ=$j0T1m&^6~m?itrPb%#`U"B+y=kEQ96Gݶ4Po -ВF֜)no%[Wp-A {ދ65$ F#6r㈮$;#%"vZ_D2䧝zv$(Mϥ"rI-ʏ)ۛJ401c*6 >5Q֊ #N1X/,ne}jIɖ ƌWHTT $0%uiȴvoII(iO@Gdxf\~MP)0}#o';6YLd]Y+bq=KZ5ol5gS~' ufʞG2QϫW-MG#~>/= ~5(n MiH& eи(偲AcّR@YVÞ5e{Kw4΀6$)FaBPxYEY~LǑR~RA"+(vܠ0(kIf.Kno~e 2L,jq7X<5YG꩘& /.:Yuҋ#M{/s W05w 'DVg¦")9]IL2W42UNn7,3 H3?#v%{Pjx[g0BU $Yu\ =́n/(5 (I]2 I2#af*u&n-Zo+b|ď6V(Sc՝R3@20aS#96T) {?wO4)k܆‡zOP_K(\NU;odᆔ,ԁrP)lo6A^<:ϨVv DaQ@  .KA&"6g)}Tܾ[~Wt'! eTӓ0@̄ÖkW!MQQV6R;QjW>nOw0P.ݟeP*|`yJz< m,U%[D,E,hA Hok/K̕n:sM AmF8|\d6#0I uUsAeL!nI e͟*+tmz }ض2ӛ^kj9̓ќ@0Bdj8Ƴk/;:8]{mKr1H"=BImuCᱵn)"||#i*1J>Я+iO(xk6 LD"~hS!`~:xɖKCpl%Lss,"+leocp3VVmI%BU$ec9@DRS/VEM36f^}]vh8A~ UM4ufm[/ŌW!@3m3:qŸwl9-]8Mf; FEMF _zUGYCfTX5.FdZ4Vp_?QA! ZxJMYAtCq_u: 1b6b Ns M9'1QSY0#@ska=jDŽquVL3 Pe^tI_ԇm|) ?pC36d:*Mv38ܝ/ @V0@hl[׍rˤ{o1@`Rs:iJ=ˮ6ⷞ)bx^#x6u}}}͝EMhz1Lҕ!Ah&ɓh'bmk#rk'qNB8|ݝ{cO)T}N#Qu гiiRIvJXܶP%MGBeV-IئL tU6#7<7ON^}Yj6gicljJ6 uei5 <9 K{AshNSaXr_d) ֛sMvW!6J2!3q3 ԟ w ( g aRvn둛d%P!-u&0[I>"Sr0˕O//0oӼ2!gT$jQfn ypzkr͗.AI |22Rdrf&yà#&B\(Ҋ&[Κ<9;DBm4O)ΉRm>I8D&1o LbBByP$ae 猼^w[ T>9*X{lZ#0$m3Pl?fe[U Hb=^ ya$M˳Fqb0f =gD8ՉR4؅\2 Y SHp$< R%ڽ.yG3]Lb*fVҚ+Я4-ulWY>_y.H m(/# /?~cf8UoE>ÓLKp,ۺj!)&y&k3":c(Ns2<̒×<̒3<|b3yepн7x^iVec+ ESp!ղS:GSP ؕ஡uY H:E4~@&TnpQy,IR?ԣaER|b.NP>K339\a %FPp.0? `L~zjCm|1{mxd0`pNB5Q`~a*x w_Ca+- Zi94b9;R@`SuO9bCRXB^O@f1!=_ރ,֛o/2YZU+gkYt@h님bK4Y"NħDEN ]ώ :煉״?ebV„\l#W gU{H$)t`<#Oj.甄r rW7(/lD#G(ޖ8ZFԮHgfCz3)d4D%lȐЕ4_Dѫi;%}=N &/3'jZƧOȤ~,H}+:]eO~2ja4—X`:7l>DFPsܭ!/ͺ1.G!T:(ЃrRH%3lo=?4OXM=R[MtGSH`8QNj `.)*,5 2'oTPc3ÊtAk, iT߮f֛0J4d *7t6VP=b6Y4A5ׯ,mLz (͡b2sNCbˁRb_k~ʧG/D$rkA72A0`4Xӟ2j7KS= ̲\Xr.P@ȍZN-fIUgڽІ0'5Cɻ*tPTScUzKDk5(cd̀峜wfKcđ:Untt~-vÌ4"Y<ӝ]~KSa^厣jJcxT4E {KX$TLG@ںɵ!1]z5V9?\e%Fk\2_E)1\TGE cVEJT@/KBu;lzge'{:CzRbӓ@TQi(϶aOaoaua__k{Z,KtE,9-[6FyA QՀَr=p~ оdJL8`Fٌz-7YsLQLFtPc[Tk<FL-„p± ImtZ)]6TrC"S- 4$qvsLc4?{܏ 1%7~^h.[1<ٚqIcd3(PXvWmS1bREk5[1M2 K{pKo I^2FoSR~B"oW|cߔrof .2S h2@CsuvwS/YdvXe_>n5_kv?O9Q:'"x H'=Xd8(TeC!1G+Q`A#rVsFl-s 2 %$xrxT j`"¯"6!{n5GVd jIÅ[jm|ޚ:)uyј= 7%L#0enr:'<.j"̑f^0`JnR0&~Z.߭WRfQPLoZgBbx$4AgTCnR2N7qXO>V)v I%SbVUZbMP>XR1D?|Q]lS VYI)4t)#MY@Lh6*( i&kט?H\}??WQ 2$nsHt C펳ቂ0ř5ƵGNféOr}KIGTcä}T" aF[~<\ g)bfDyYmm@W3`lj,FU8`"/hI;9<%Z܅;hY de;Fn3R_i@;!SPlE8:l6й-k2TlMJPh$EL[R[(\^DEl[en/3 i(9U8J JBz:RȵMD}heYW40!-xtH۠$gq=YxI|jy'i!:A۪=9@ P|eiy#hQ;2;fݦW/٨%<;-H6rVi:EF^Sj09iV>z!rW(lʴ9=g1"5#h> GNJH@ӑc7a Ƣ-ܼBEl'WINnߤ4KQ3E {oMag:-T$쑨+fQL Oxr4ݭiTզ'0JEuUar>4\EƔg.kЅHP6CPѴ`<:MIK^sRR -9Mbh [@u-" &n~|կw$&'ǹx ЇSr5j t~bOvX[0:̓K'YCh9e5]/:Q sa J*:N i2avB_|rS9 3Mнj1S4 ~E#Pb9bT;ٛbm:{S*4"S~Y4 [c!=@x&|9K8Z.mne Ǎv:!ShIi:c<< (h4Ѻ/G^H,MsMɒ*k4hg#* 4`VUԙ&\3̙; v&!h2{q~yyEcƶeJ*sଇ6`9W^, a[9d֗@<;y&háuS%[gf*Ùk R#eSɓ )"ٗlOk`io/X Tخ{m˱'Usgț_6Wi'w2 C,PGZDS4^Bؽ%b#7/dPDrL>Evt[V1}Ъ>IYLH3ACv)PF f򜇍)j< Lflz#(3 To0y''X_hEa?{0'q EEeABqʀgم:٣hT0U246;j|'e/]fb&nb2%n2{as} f!LJ*tGh%=gZ=w6bKkQc,z#fFkmdOyth3zO{(VOK#F5~ɭ^iI4HBD(B4L˟Ehoba'V[LgN(Rv'㟻}/(9T4ѾU 0`H❵ۦtP.0"V b>@dCȩ f&ig펴͘ڬ" Е%7)S.2̙GiFd$9ki# ~0DnE$h֬"$(P7uQ"v[0 ڀ,4iA#Uۋ0.c~ KU.T"\u.eH"О'ͱ:Y1BKqFV'rC-46YOTkܡuHnNR)ޕNH$$ewb/Bٍx+JsqL/O>NdIQH-Vzp%28j8kh4%.$s6o$b"#F*e;Eq:0PHz*A@; Xn+rn.sqSI0E I`՘Υɮ[*_;L jZc5q_{T '9Og$`G ]9ZQƉ{R4|ժ<Ӑζ(H:!% lnOޙ%vacҰԂ5Œ2LK[k:1.aXi-L ReZ-B)!~qό[PXtA_СJwž`(F\H]4 U(CX(W/F K֏ۋ2(lۥ[W$vrG\4!\S9@6dtڴEش˦^f!It +!T]*Žt2DƦ=(vMe2aa"aOj^|]0l%K]r:7c4)) A;i/M8b*[#JgaѶ5i)MNrl;nӏV2yE(ͲU6'w ]i->-E2&v}3krWD/ܔ1!5)]m!i֮%Pk(C2W$x`oʯʮլݮuhPàΑAə=!lOI1B2Z%1 i$ v.Z̚=Y>,]&"l{Ͻ $$NK6bUc!")w+&x\ȧ{2y)ri+g鉕k^i'wJ΁Փԛቋ_E)@%L5ɖ߲d]-Xu)Qi&s{Yef^ȺޖWꑄJDgtu ?脝LH7|;!@ֹ3d(ԄxImF^p8F2 +xHĘ *A#+24O3fDYxH}66/:3ly!=G"dHR&=H!hmpz`ÂㅣMEG,K*֜g22G\Is+2^ǥnGfj?O,:Vv?؀HecPs3dRoLJN9[e\K~`(1G rKRȀfKbw\W+)nXŔ*.b*ZTIXYek; lѭ+h;, ;UUe4#4N]d_thĈO4U,N]F}?{6g%g˛չ'٥#k8oar D0_`q9cU0Un4ӸԀ:QLa7T'B E7#NYRvę&xݙ0Z Pb qN;zjS82cHFZgBDƌʥ)IײݐYv!fihpYzBv˙yY@*H `-#!tAPf<ҏ~qzIUI1{Yg(9jߕ׋y )!ĀC@B q@fm&awsf)D83mS TRrs(bt$&)k+z5yQb i;Fjz슎&3hX"oU۪&4ͷ*u$5g+H5uB6U/Q1C9Ni5;34ʛջNU @}|_6IR, vG,CA(ʎ Xj8dhĎTqqH:U(Keb3  lT-+`Ko;Y: Ayg*T0} B Z"^j !o*b[AW 3B$̷Р׎hb*g£;PAUA=@Cɔ̋Emk_ө:ZV~dX#vkGl*G լ-%`0H)!h4RеBSkuP/ 1P'hѮt?[D5GCjp9nvIQ ¹sNfMv)[5P:&KYmed53 ,j^Ӥ]ʤ^TBb 3.T(s.7Y4BO%*Y%*Xv5Z+V*^WUjQi .eOj8u7YU╆1Li -jO3ڔVkE2nW;}֎- J^Rhʄ UjR!^8B{Ve"WE CtEJCrm9JCkKNyc@le4IN4.u L0`|W:Y7'ɎQSq"7pA8*բ65dg{&!wuw (LXf3)sa[\X8Ӕe鐤HRJpq9{aqzճce6r &e[JKN7&R9xxa xD5h׋@";~dryGV.Z{D6hÓ;hlQu˧j(Hc@<Z:i&4۶OM=mPq2cce>o:e>sOq2tId֥_V7:U!$rñ 0pKb)s&=nk\WVPXӘXٺiX q@> &tc]W$ҙ{{ǫIڲ[V}[n] u ;'NuwwWG'p1  4V,@.  {Dqeo1,f8!NZ N6%`!ͭ(^TJ.x 29|3JDokSjk6U(oB2د$|>H$dnL#BkP6[=BJp[tg,f|HO>2>JגA@ TI5\Af;3H^/YiZ/YiZwYi[p̋~)o5@=*9jz:Xz?5٦!ʋjY uULx-Y%c ̢KwaYxe4Lq`ƻ]0}w@q1Q- &&kNI+gۉ UשV lG@'^=t[?‰_MX^ xӤڥu3d+ <33 `wFZXʀDWm[{"TJl&V8r[?߹6ݛo{Zz2jxcv[Rkg: \ f/};1uz5 +-K#U5Z%ZLUa `B0H饺1҈5%[65O:id:aɁ{5ΓqWIԀp'Ex5#k@+ezKYX )#>^@eH^*NV& iy"E !!ha$92:6c2'WpϝPfiĀ֡o-IUWⱛpН-.h*,RY"FxI 'D*}WrG6',T)<~,:a0!lJ–d)Jz\M$\FWl Wllv1 ]N|S10 J+0dFwYgMzAj$)(}:14MG`jh2v^OE[):Uhf+$l+Ii;ZK oܝ C==y'dA28 LA3NetVM=k$^M$䶎߉40\*Jt* =<ʔTB {90TBH>$J>u j텈ڡa^VbE"綤R[FBKNDSWYAT/%d"#JFk6OzUޛ88UϣY0XfHIOJ=UaۋW#g:0XѪZ=&ѓڀ viB0HMX l>;Ta@r 79d9(1xĀb4+!#6tD\jflZ4ad`cHG;lnP1tP$Gļx>;8C'3RbX!앇|Q&K\,!zĞ=.cz+G֓֒kK~@0ˮvcsy6G!jEҼC^Xw4,s܃) "97BR0; v$m] <-& &(r3` '+`Jg,3HFE m[Ng!!`p2c6&Y[ 4;3Gt]VXC}ŔP_-cAt zII٥*5lWik1 a }W*92!ST^7Udu|`B8Z4{ Xc:cc)gKog 9Sj=CgP7iY}jOx| -#Vpv>@6}MUjl>]O &ZYF39>80h("?Lg]dcmZ3Rj\+ķ!c I%bS򧦺-Fu^:z'$1&S-N}>٦ ,{G*o4Dc|WY`/ֺ}T%tY stB :l+P5UfVHd@䄈Ăj0H#EaxtI"BE8kN1N{pN1No;$Ö;_"^c@XC y."+zf(^ܥ|2uCF 7fj`V՟vZG>Q0oIWS);*DR}?7fNTDG!!Z]ComKDK7G)7&*@9إC#8:>w+sZ(2 %¡Z"|a1|B?Q0kOrF%-Cqu3Hc|h/r M/`ğhveֺ !g2l\Xb@( L.$#ڸ2*Y'0YDZp4O)+1YʩgPc$S tJlligxZE=2>驳lN茂vo nnH d8fv 3#9eh?gJ-ht?d! ^ƶi!-hقT-%c{}uuJ~60A r26 (=MR:nT8ޖsScbMd2]ybҴ-v|JNшgSe̠-q1ٓS L8 6WErM#][9g {羘,`Unej\dB'5`{T4{6'QH핪ʗ+eY5S#l4dT?U IS1 Bt"cF)(L NNTRڜ XoS Ѳ2*XJJ#ʕʭmwZ,u'"_ #rms"YqQWŵ_2H-͊CE y;yP>[ysjY)UrX:`G(U D]ы5<ŜtWDE omIE󌦢 !UiYtk[l6sNyH8{-OY"#a]:fW$9wGxuMІge)z++F"d` G,#_m$`VBL7)@W)$lxAEi1eQ)Re֍6b%/'}zqʮ<,n\*$|`aĥ9L3@lc,\@ c+5ڝzeF oյ1ac2J1%jO8cGւog\FR,e8cTy\ſҞOCXK& 1oATcA|WLWU/Pfmcni3[hiO@W#Ȳ6X~<n1D_A5dIKObD (iZr;ԣ1F w#Ng;#ǍW=jZ@Ɉ8p3)j|ϥקIU5߫ei>4!饇wI嫶N%:5'xT2O-3v(tՠW,X/5_8~9t0ߢ-5Z8SهogNp&1 L8t}oR"%-Sc^ SOA zbəA+ RqҌaVeaTs^]eg3 Cָ! i0\]u0DBpLy 퉶6V[ al6[ emɪ k͒':f#67"x] W' ^2M>RGfY$tx2 $L q  J !H! ZG (-^ {XpX%G_l]pCѰ":{@{\RRь5Ǖ·4F4~/ wH2ih%ZM5liʬL VfAz6#Ǿ'o)Qyc] t.ҺWD3t.кJ]pTY˼*ݾf.% ż&MdKݐS2\sdQX-~bZIfo 49$JSYRnX0RC3[US>QTG5HJIsqJ@}:bUJ+ښuxS}ڧ]jFlvi,-ViU'uTT$*XQVoP^Lvja>{dGAhY_0Qv#{X+Eƕa#:T~lN2 .=uu֣6$P<,;K' >=nlBY FV[0La%/ **PCEFx(!!BI=7A.nW8bl7{Lzኁ W.=[H"x<RlvuУ/"Yފ:3%w. %A:HxY;32&Fa 9Y"=Ƴс M8voI*< I@k ~Sa\B@v P Ѯ)$^9EܑlLEGLLT|KskIƗtA@0Y I9%3OOF[lOI[lOIߗn鯛QSKCpo A(8&3{Ӄ鴹@KS6YTHo]SƫbmIb:yt;uyQJՙ@/)9^C.N40F$/ :ʲ-a¼g:_P걉AC jk$ /%1yXbȽEЃxM?8X͝&VIzt>Is9;Ͳֆܒy?-"` @Ӂ  mmPQXJ+ubJc^2&^2f}~("7v0rXla>L~֘;dЁٌɵƁ_6&1'q"p142|+yaQ̨Kav/cdsv`lYTRF !xLfYbC?^c$mI֠nUL5*Rw2?DkvBf ,>V~!Fx}Z SMѲ)iFˆdde'= o wОfPH{-rw )^1_vt*t+FHx;[ @c铟<!N,N`~Kؼ?؊eL7t:S (Z! =Owcm@X)_seFWcŶh^#y;'"X3x#?1^IZhousGRmsċE0"JV:g-sܒ#/tq@a<gbBhUHUlbRkpq݀VSH`Da6X5ѯ\t%ivZŃ$P5pݑm0aVe6e:2廮8#@W]{%eA׌n+7EH;D]DЗ! uNLlnC)Z(Ijomhs󋝇$qV{92$O{kGd 1 ~ "{4!$AD$ADIDIDAD$@= [7!k\ЕgDcJ=Y}C{!vŸK]K!a;0^ 32G_*뾻˒f9Ɩd_zGa!էM숗qFm[*d6;㵩ە&C5%eZ$JlN&KkYĶμ!t"X*ܴ&#he%lhXo&Px\S; ڒ9s `cr L46oQQY7E0^R'Y=X-~(*7:9Ueo ߁!YeVxMȿ糎_,ybٕlDτi0*!~,((:;ax)r"}:ii3ɣE8J06hyMju3^ d@2G~LwH1v(\Z5+?1h^H7`[`V]3K \L!xpbJ]'n"7sH']QIK$+Il^p5ǀʙe@xQ׻$ ˛Re\Z~lL"F5I Bj9AImNoM]sG]teFwb{ A_3U*fҰОыt&3U{D*t tŬݲ$o!F.d"C'$a 7bD{#aʏt:ȻGUՆ%bQo0ï(hUuYUCהHU0":i2@d+ h2%Te$%jPH!_~3gV~&TdL LRщ+;6iavor2nӳl[3m*EG(dd4a#'jbI2^D1x/$c,M$cJF6F&1 jeMF??-c! vבrʱk Y@vS2x bd٩&tgLm6=5yIV"䴌Zл+ή,nM]쳓 d!ڜb0D{͝.]ytfJS"R+VUaTcYb\3⯤kVH ,V>tKreS{ lRx"꾮spI5I,>q,Lt9oftq.h0"wgj^ r@g{/2U6L4.Y̑ a;a 2p= ?(LHr&s^Tr&#rm-eXQtjT܌C#ݜ.Bafbd&X'Iv;ӹ(EӶ'a>{4)3`+=P:|?a?kܻVU}Sa!-ArҦ\"A&-,(EmĪ 8ݚy5 %ape'^֋ `I$I$(c2(L2gпhҶxPcG7J7%(' D Wq4@Ŝ5>qPzlqеxBҗvͲ "ΫZ?C dG )՟堵n*C>BsH^4j$RNˌ۟˖&ID5 B앥8:wx0=*O6UŅL٣teZ*P;`ıF;aK`SEUӏ&ƺ_/\siЂm,zyQ`E 45M:2w׽#fā6sfLHVdC|zKGB:GtuAQ]΂ь agOwazTg aFɃ5V\V9MXG3]mXٷϸ<8M9\96+7*$t4qfz8!ʻAcdg!.~ːvk/0Q-~w@fϋV`4]M+3)>c?]5ꊵst$5e,U>6DhhePD!ku/L/A)q 8Ω&9-c4%&42rR/̏HQTk f;b:䖅3REi[[Ωql&7GF&Jr&@)^H+ShFC1fm;Fb$ΈjDI`rn-}3$"XlqiDIN3DQ 4WWK%*¹p@9#cnʥ aAI'҂goKbAѮxV:e0lUȸ@6.U*vLTʪ8奫D]FXaVVݥ٠5]8AYd,>M"406꫊9MINcVR0 *)#if=82䌖Gg,4{"ElhfLى#ΞR1gIs1D"ŶѬ1Ƒ1Va5]ɚy~weмCZkAт$huYIBnQ0؋T]CJ1D6K,Wj=|p,L `.<03}6ጄxAe7 aX<y^[( JyB=ְ\#NvuB>R#B<5Xwut (>3.J"C:e!Ǖb`N{=]NXV{OSwm76DŶ[OIJ,D/w18g1n#Nŝ"л-j#[^(v8Z;lE@u3!'2䋵ַhƽV ՐF>׈V-I+B[mZ*ާ]ac[52/X繞9M;'*~e6kCSL1B%zKɃdٙ 1VIKd @ʒlE7XvbV"p (*n0Ooפ!C^(oiwyosdnæم\ @wGǸ:vdkq#P]կ w.e` r &y(*]zFJH R敧Zmj0o$Jfn/~/Uטtڋ^|`fcآ%d:Q@d9"pkUjʏR؍Om}k[r5۔v&#NdQ󇭲j} "hb5/k;1%셹@ʣ3eQ gla6qف-eB}B9b5ф& gQ$l@]:]eCb `0MCV"NcӄiݚiWf72(G[uLL㣂)XK*$Ύ<Ӗ$K/*K(LK}(LA(9Idn >#F6oP*RypۓX 2…f8P@>@|H$uR;kld]ل'J&F%8N$Pl`!VTUPAj42~Zz)5S S2RNb8a͹ 4i0<*C`|5qNU siɻ>*QscX˵[y bB/ӗRhZ.R$G*0f\sH͚R-{b$ĥ/P KB q"O{`x/?rN=+[`0,!d'gv 춍kբ`wjcB/6kRkObXjڈoiV cug1nmvifЦmlqq梭@m\m4^Lca8[3q"cr& tTe9)cYL҈l ~[F6IvZ$&b{wK6P:S 8T~ccQTqL,p,DcWeJq0މ<,y,1l10[uwZlGyHL]niIOCIth4_,:YoFGt^]2;Hiñ%Gf&[lg*rߊhS71]F J1wn\, W'e2S ,F-q8ҟ!%<@wDY%aaZGvn3 0Y#l.![of,|=,iMscs"fr:Af"S!DMlbBrR )OIYfߞU*r D%@Dl[9JV7hU |J'¨_ |*P_ |*B*/)[][n>W*3Ak|䢇Z`rǐjxus>YHrX DޭUk5<T&ubĸaQ 7PJQ3]91ӤeX 2C˃ 2,y `FRkI4.UԋKT~Q!*rzUNIws%Y(D(ӏ]Aa;nB{1摔Y*Oje+KoeHjKaXIN_IߩIBF-iJOIԖM)KHՈ^/O.wUЮL52^NWf4ة6|>iiU}HG&YcbF_jĆ fCpd06aa3cegx9S[ )EM&Zr_}f\|֡.LPPڏ%+ܛ0e9"$4FV>jiC @9  VS(ۥ!v9=|dB:&jSc9R}5_63\pp3^YkZ)@"k!~fCJ@*op0&Yj7VŪ 5H`A aOϿVeӣ?F{Y Ř]F)sney-%ٹa 9N8oF!PС=3AviniBvb&rfaa::s aD@ckbk:~ac: vk:W!;P fp\ )eb[F6rE-ЬAmvv)HEE-Y101,Gj{(x˶ԵȂ6RBf(r%6i3"$ȃPAAs)10P[Ƨ PٕA}\0.y4 =~5K^C DpCr)aÓhqCblV {wCӔokyb{zYعK*iKQ&,{a;2aWJ 6ȼJ<Es0^^s$NFn ?+F>;^ ˾#h6cX)¿r/BԚ<٣28FdF(hd/@da0DTCB1~B$,!+9M&,ۭ} : Ó`HQ<Ԉ$Fe|Y7a^WKt'%/.ۚJ&请 /exi?7I!f.K -\gD(m)}lJbA(Jd\Jt[ v.&bTl À wHͶJ1$F 3@ۗF4D\ްLl%GB4ejFKdya0x N3vS4?͍ o@W[I|F0h6"~>s;_JԲU27G6&;H:s<01'} ra"Pv rv!a?[?B:dFpu_7Tids5}fF0q#xu2s1g̖~=2dDƳUE]Wy+,JQ8*|0-EP${{ZbVaz:TX¾u`X N'Ʃ+rD-~m1b]O1=9R! D*wNXPm'BMU5.̘NLvSs +:Z%j݇-%g5>Slm?7qr~b d!Ƀ(Yґ6?Vr\"3* ! U[[way6: Yn$Z&GK3xD"bv&U;gf{3Ue閌6[I"bP^(TxɦR!A1rg$'\J!hX8~[O_(/%Id[QD6!nD:e(J4ﷶ`(D=1@r!llh*3X&>KRqC dB/&=75ruO&ɦpt LyJ]p+-o+-³L f{IYg[ُM[F?v Fx6v;GXn l/G݇&!r9afaNnc6AFղ97a9ZEGNT DgY]ܺ3ft M"3ďUN&#b Ņ}c1AQdQk\͍o^ k5!F`!hnUda bBr[V+""iv-:v6ȱoV㒦jH^.JC. {Ӭ+d%g)c6[D-:'-LX$K)j}%L֌s hf%-{V4=} 0[\! 7AE ; ⸩d84!ڶNf)/N݄NJ_N8 7PN#PNd5T!UdDʱ]@ZBi+$у /6&ZI\˿lc=[.͓ePhQ?IPlP""d;6DʦeG)4BCm.UeQA@jV~X"e%#R/'k1PD+c~U;@D̢'>XBz$u1lbH#*W2WP̭~]D]Ԥ5\!2X1b檪ʳfS%m'9AY>CF62}[[k2bѬfj\gfVYd] sEkZn<9 fk0]b^a.[PBɘY3pFҞg$D^E)-qgHXI.~ğE`;C~8rVܰ^E>~LfrI2aV#?rdɿ̉5tTR`lJo}q *8XqTGk\mG)ƺ{޻ѡSܪb$գW<q}\WQM8&WxTŕ5VB*Jd* baGa)iFBkTOMnBmf$¼~BkHjeK4Ejd&~`< ;MAvR$D7RXYz1"@nO9 Sg5Xb 0#ĝ{-@ֆoXsR B/mPdKo{)4=PVUr?_U;Hfi[O0Y`^zd\.5,,dڸxѽ?N"IssBC ]D Z[̲@T=ꧩ娫=b4YH&iDDf%&27j;jkeĄlh20YPkה{ealzL-jN }Kop'/pJyrߏOQNBT`P$4ik^ƥ֜?G{r aK x\X6\sk~%%\({B2Ԕa)a*a[fh@F)БO b.&CĎ')*̖\CE%C/=[zWr͋ͅʁ]w U ]4+(;p P \/ftDL S U [enVz^ xx^涝qUXWuWy4:L]CR{- .uttjyv*h'@ˁET PbcaCaDeٖ" H:medr&b֊#2 `3"$̨ ZęSi*Ę`y( Tt@niY/EΆuen\5yh(lC"et^-]G->M\) ZHNf`Pv/bf%v`=ez?ȇ-EqL !/O#I%I}25\w0S,5J1m[O#2MGvRH6i"ɽrdzdgfLvn/hsٳx6yݏo=BlL` u@dqٯM..q'dg+i֧s`m @a1H;w65e~bBBbAH*]M[fzإÓ4kpH/pa濐# . Vc¬JG<;񀏲^pܭEďO,7b,ВM;3tEs* adDy^3d'C~|xϠ]LK'10䭓ԏDȄ0Db^蟠ٜ'\ޓZܼf殎VEHQ"@ c: 9֙//2kjPEv╾30yVmG[$+P Ty} sh _誵1%pz_JERFq ;"~&q#N9I Pn鷹o0Qypdj[sF&9|!2IΔMJ Inbrʎ*daJ*kF1OO2t !C #Y"p%o) ,ȝo*e(t q^]x ƙ3znF%m:b;aMgɑGhCWo})x5!PAC7M Q 9Jczk2,P3'Sf@({Zܺqphr\mJǖ2&U |3)^/z0щK*8O_2Kmi>~,L޳fЦbP~8ZI1(ӋkSșxh@m'VbQ!qy >Qq P.è/ik6зRcSgCʲφtܼɱwĄsFD'r!7,Pe}OS*QQ`v2x4ƾ|Xji1Ru݌Y\?巌@.qDMN5['H94d?/eI^θ&2'h/DMtu!Me&*?NLN!.ӗas1BEɝhiqk &Ye#oOTn:|()iĶgk߉Ft0}o*,"dd na6`It\#1-'P6%a5nUܝ_EYM BuA0A5YmxKsD׎`ayWvVa$sDV|!qR: lА;GmgA.Pz VʻkEn\/^xf@lQқ$P@)Ѣ˼3td@"sfQZ"*2]bϕͻ괜!0+ӃOb¹R?"{,{o<&7+q#NhDC="̧چY`AseFԈ{p2H;ī913_KZH3""֒+Wm"5\ = i"."Β."Lh$9;DdR^CL}.kۊb+6N!YjRiT>ΠI쮞9IGEl1 ['x1]i]1"+Q悧E nK[ǖgjG45n 0 ឱT+ b%{x`:sV0E/DiqQK! #dLPR ̎8K6Oh^T\\{eq{ZRJFD`?{/뙆•Yzy V\y&tzdVJסtL${gRъl##[_2UJFH(V-VbLhxBrqXK"3S nK?r0p*QqLQE@7d{3w8aS<#wu~Σby\GGGPu_!V]֝aEnMa8uPmsjhgHdRP5DM}ys<ٌQg$Sш\cw5*'cwN +v5Z*lcl^1L&wlo \[1b!-x@aAʬےqxT*ZUjϵM2 85,9:ͭȭ))",ˬ/G:۫&9K.7MB<^)N,j8TmU [#˳OJL\{{a$؆DIop>Zp%n.) 4HqqʜXcFx71 6;ə!PQv=b ٠5Bm)J 9a|RJgP7ǫɊĜXy'RÙ0xѵimSjR(n!]GA$}&}#~ᆙiA?lФh[$S޺XHRE̸]S9VOHkID) (w0Y&Vasbn6$|1H@诚:96k)Pި[XWgVn]w?nƴFж4+#jyy}@}Cly\`3C[h=r5ɻې]FpY{) 9Hom$5#l4o/CmMU-egh~nĢuяUUHJ"Z.~4LaBd6FsTvcB+,ehR)[ѝx*b+TqO\ԩfxΌ{\AP Ձq+#6'q:Q+VK_ v_\QZogL/|igCҨ4ؼm"ዖB"kݿv{=s ɢ,3 8LGICŸe%[SJvc6nrvtJLRJLhOj!R/Or1?ʷ&_YzIu-5y5hy?^\-bZ))[$t})J'H*0 o@aOavaaTf/ljz\; NM{@}Te14PB\-xkX8Y ݕ̧CQk^F;jNK~η TN#! @if,CfJNF| PA'Z$u!ꂼʱм̡̻ϲi$OzeIәo`4LXuIb%v.kmfkLdg*!R'; aq;sSAh!P4uI`%ˈ9z[18dГ(}k&0j/)ňO#ra Q֥~-=ۣ؅&yMAN2rF@YKG;ՅLWɦI댅ą DwV6`0Lm~<煫7^;q zNcAn0(^ET+06vZgp/Lm\Ƕcnh)/i}}!!0GTL9ވ:&iPA:{tUs9Okd"GahI23)HFcu92 O|,%$چbUGPGnu3 9XtVјaf'0YC! ǴbM(FrA_ }ϗg_L3O? STjb̧PܩHbo2&ў2L`BBifƦӴs{sG%hDgoA( *tcDx&u& ~sNl$56^vS}1 cT#Fu[bT|[?@!FٖS4ïmʩhj"c1 ˺XM@1=Jsu#Nm`"DBD!hC] _@7f{3nV%2hCaw5o 0`3 bug hIJW$rs84gV\}Ӯs53p/ B " A7 B" =%2- 6-aQς0sP]쇬Oezc0a3Cà5Dٰnkib}ֹYV+*bT @sD*s(U΅5O3ZWcW@5) c3RSvilIej&Qdiݻ'wS B3K`a1h4vO# !ZԼNi{]C" )ٻEP'Xlwpk=4 \Gi%'Gey SybJ5a`93,Y[G|i}2tZ> 02%&E^{J]3)vfYحCNDѠ#(ǑoggwYfzqB)v;1F$ͣhRۣ ƌ~D~MKe+BշqkHًJɉG5t52 )z +>LᐛˤݵJ WhU p}-ޫhc3{)ec-m aA5HW*SJJat3g~^0yEh\XFVWH?3ü2ĬtEKZҶ4CBtJf/ ? )vPJ ,ZQ'B}@i4f~yVyv+Br1O=ɕ%NĐNdi!NLGQsUט5{B|ĈO|,$pZ3B`vTOt8D$8DJ|!{9XPz{wQr;%#o~E< p P:8saH+dwY0IQ F-LNBlogisim-2.7.1/doc/search_lookup_en/OFFSETS0000644000175000017500000000065511541757174020225 0ustar vincentvincentt\h!/[AY1komuthFgJ'+,ƋU1k&i}cH5-;&8y;*\*@ )3[v4voCW7@2`KRI!y(rt!18g?nyC'+Rזo(l;FWvCNMF -SE0tE>˂W6ӲRF=0|,1vVW8AUw}` J0'`Xƺm<hN_ >mFCbўз06IUl ~vf:6uidV*=kYvaWɛጟJM{aIRlogisim-2.7.1/doc/search_lookup_en/DOCS.TAB0000644000175000017500000000543311541757174020250 0ustar vincentvincente_u_u_]__u_u____u_uu_u}_4_uuu_u_u___w_u__u_uuI]u_}u}uuuI_u_uW_}uu_lȊ벪jİȓ镆!:<(4##* L3"r_rS,8*5$i,b|֒òfBV TĊ+%dkv`ja*a*'|ĊVK7* HĵFRmc*rRJ$cң",hĒ4̩<}G_9"a6F SIKUI[KKLJnJsi*K궩 Ҫe*3%`؊+ZJJ(Љ+*I ֦!6RfSʪkҪ˺̪̭a*ңgJIZnjj Iw/+2ꪫ*(ď3333333)[ **ԱS+؊]J ꪪKԜ"4p겪2ċ*yJ 7*XؙL+VyF-]|j~MbJ:#ô"sbԧUaL1"h J3"9*)%e65&YJZ[6MĴ̋V]o\8LaL˪a,WT-ͪR߫uGM >Wؕ`6K+ZWn̋)GLi/4$ò3 s|u0",I[z[VNW*qK1s2~ӒFR:pĞS^Q+WmS"oaJf ڭe-̬e,a,rϪ̮F!Jƌ m.a,ںڪiK7$ݻ˼˻M̿eKi=k˻˻˻˻˷U˾뻽bjܻۻ˽˻ak̻i6ܼ˻̻ۻu;˾M,M`ܻSS˻ika|˻.^O7.nn.//:Q.m..Soܔ1.=n2Nm/NXMrsvO.3vH._.N.5//6H1R.66/s.6OVss.2?1//S.W;r37.n2/ -22.o.W;2N>m3223227.N...3/R/3.2 nۅ2Q2n/n...:OnN.73n2..>n.S23o33.n3/.O2/{/23W7/.3:..n3/|ȭnaK˶˼˻a\˻ܻ̽ۻ˻̻˻̻ܼj˻̻۾bVq;ܻ̻̽̾ۻλ̻μ뻻˻뻻뾻˻˻˻̼̻˻˻ۻ˽˼̻logisim-2.7.1/doc/search_lookup_en/DOCS0000644000175000017500000004041111541757174017636 0ustar vincentvincent1P-P0"@1[q:/FB&-ƊɀF@ɀ,Ţ*J'C9:vB@&Ivl' $ںڷimt;te@vFIjmf̙ʭ#q9`_WU9P-nIۮrWm۾unuڀ BP`-]NU:'muuorn۫Uvy~rI@ii}#m4n_bNbvkodֵ{z%',v@dĪӫ@4":H3P,ibm[mʮ]9;VLVDt꩖鞙RY@X(@41Xuddm AnzUwgBq>Ez\Ŏuaae:@b1:vj}M{Vدmjx{i+Q3@DPͪ4#eq_ec _ie¥]ev]%}mL؛eWgN3Ƞ( tRL+=G0]{_Y}e_@ɀ]v,U߮N@V']kkmau\ڀ޹&%[`Uvɀ$fr V;`1@!!_Y}ele6uD@3*&d@ـT:,XtK@>ŀ\"SDvV_ee{(3}8>P!)0!̛3+Fd8nDf%_YsSyF+4@eLr3k@),RqE4i.B完|7|p$ƭF3P+@.GmS`ZP檽j`}Iud p|ڈ@_tQd@toe@ @7@-)W tʬm'սmc$4Ɔ4 #ud4+ d:ɖM`6$2*7*MC肀5s@1)9 mmY]ۭ56muP:#i9ޯ+0@C-t`(MT?'Xʺmږhh`@`@<Lnr4Kbw+~ߘ"Ţߖڜ@3MP6f`dڠiNV@?`3e+bLs4!(n6m2FlP!8b9*D4(֪t6=2D;Z-:l0Bj8`haD40'XT)cC4̓W8xGuZlGErfӹZP@#i1ԑQ!5%@;@۟db!nM@w6hD>qנh@i}c `)]\e¥\•MKm|"Ę@e A0@ˈDe]%[m1~mtf0A8"@99Րm6FmD{@['>i,2LTP%#@D@D$?'eT܀@I Rĵ6mՊ[mnuۭgeirk#a-TxH6(EԮPY$גq&XJP@IF!y@ykjӫu)Dc1!_5)ȀjTiW5[@ñ n?[r-`-@ePՂv!^@`5GDt`M%M[nn]mbvoڀOqߘ'^kyW]nS(XPZ@! !ߕ@9(̈ 'v']6۵jnj`@vO1z۫Vνnn'}^@ kmՎD!NvVbZ֨n֮{ۭmdeS1:tff pkwX‰Fdw@m!F۫}opgosmHuWd$֌P9ḕ^hL$W{J֥áMs$oOkJ#2*]E_6@U u hyM}-4'@'1FV#Xm-rfG4!e0a~uYqO@1`2"0!b@)=؛vljSdi҅@>KKnh uQpȎz8/`1FHܞ0`i]M<&@v 7 @@4e1&ǘ0'xIeV_ee_4@*n @ɗ̺@e3I&j{\Rs4+|;ϗ&Q7@ɔɓB)qi9`@0CJu@~͐7!lߪm,mJm*qL`ƀy6!iӒmٜy}>qSXbt*iޑS'@mO44'}%@@I}@AP*Vi*IPDT.$IFe鹷 HvXRJP8"ZMhuM(ExBbҚf8]ƄN%rsIe_@vT#<3hyACnwkU@0`<"ƄLQ|}_e7%ˡC@Pf`yNi#P; HrT xP<KA|Ţ<<#jTƅ@ayJį>ڷ5aQ5ĩIu*ـcmdbA'DtA0jA|!ϐ`wfRPaI}'g$1b:HU`Û@W0_/[O>0mm:fX@Ʀ\``00e`m׎z\$@äP+GR"Vʢc!éaNfcXɊ@fǍDr)W,dzcbbibƵ[6ls`'@Ǚ%c@*Öa-2#@XƧdAl@a.9#ə=`ɉ@ե72_PE@@ KL!=`q|N44F᠑^i˦m Rӓ Q@$LRGEre`Ges _`I8׌W@iF'i-jÇ@/PՌd1Yc4P2Aq:oP)6Mij鬛6#j%\0՘ӈ)Khk`Լj!ng*T@҃@4HuuV*o3@40a ׸mm%4,٣ټo&ˆ*mZS2/]N`b0!t` $IrH@:@R@fړ@졋6v8"ĵ]`♥aT⦵hiX@`\4_3@$ddjeuB@t1a6@$T饀ׁ@?Z4(#uI:oP+#wB@ul:%@tp9T*D^,lCc4!!=)< рYq4tX<D[@={v{SԚip%6O[nְ@V$zV&j@4*>$m*|o"S1R_sY}eـ|309$|u@} }V}VP4}V?%ʴD??tt g& @~1ͮ`*{4ta-€€€YgD€Da1B€aAaI)eFFI€Iò>taaa*€€€J:^JĀBD@)13}rzbO(h``Ā`Ā`n[Vk:}**ĀĀ A(2DwbLPftuĀ`212$}ĀĀ1ĀĀĀĀƀƀƀƀƀuƀƀc 4ƀƀdF^i/ȀʀeFʀq 8`!m0Fmkwʀˢ*9ʀ2ؗ8ʀm>b. ̀!!2R̀3|8̀fSt&̀̀̀̀̀̀26$3.@̀%̀`̀̀ 3c$fR^PfI\P)3̀̀̀"i΀΀΀hA aЀЀIЀЀЀЀTH8Ѐ`h ЀXq @ЀЀ   Ѐ Ѐ Ѐ   ЀЀЀЀЀЀ`eW"ҀmҀҀҀҀ58 㸵`րրրրրրրրրրր`րրրրրkf4րրBMրրրրi@րրրր2_րրրրրրրրրրրրրրր`րրրրրIրր5րրրր؀؀؀؀I؀؀؀؀1Y1؀nnP؀؀lNZن*؀؀؀؀نj؀؀؀ڀڀڀ/ڀMU"2ڀڀڀڀUڀڀڀڀڀ܀܀܀7EE܀`` %n&n$Dހހ`ހZހ75Q@oI*+ jހoFMa`o݀}Sbހހoހ` ހހ ހ -ހo^Pހ T q\PyDK `9rr_Pf̆sr[r8X9$!`DŽ@2qsTsPu`9`j*"sYrzŢK-9`tB˷DK8`*oZ3 dumuu`;~*u`*%U  yET!=y Class  Referenceogging isim libraries fMemory Library components nu Reference ZTool  ultiplexer ier NOT Gate egator Opening Combinational Analysis scillation errors ither verification options Pin lexers Library `Poke Tool rd \ing 'ly unt umulaterately hieved Yknowledge Wments5rosst ionts veities s ual9lydam pt ive'sded nds r %'s  ,-master.circ Fquery 8.circ  test.circ singtional -ly  zrbitwidthessedss*tool2s mit kopted vance ds ing"ised3ffect*eding-stergain?st !gregationreedmentlgebraiclorithm Lignment  l-floating one s zero esegationow#edings mostongreadyrsot ~-click drager ing alternatively shough ogetherwaysmongunt inalog ousysiszeingchor b'singQds tgle nouncementonymousther]swer tiquatedWyoneLthingway#here &parti[s parentearCance a's9ingsndlicabletion sed5s@y reciativeKoachpriate ly nximate stlyJrbitrary cade zhitecture veeas@n't ise singthmetic allyhkansasmoundray9s.aslistowheadstifacts scending Tt.iiribedYk ingsembler fign fed lmentociate Cd ume d /ing terisk  ynchronous Mly top ptacheddemptsUntionractiveibute x's sionuthort's ities:s omatedic gally(vailable eragingoid 9ware)yxesb9ack Pground(space +wardslance)r e-bonessed Oline Chbic 1allyds  .getheightwidthxyeautifycause ome :senfore ganinner's ip Asoicesoseingsexnristos Gircle suity's  -buildingsmstance slaimssses ical roomeared Fprops6s0ick'edingsEpboardOock 'ssgneVablennotsupportedexceptionselycs Nr s  0nceivably0ptcs %rnsludes dition confidentguratione d newinstance singrmlict ing orming $using  gruential \junction.nected eing#on s(ssequence tialider eding stent"s picuouslytantlyitute 8ing!raintsvuct ~ed ing or 4s $ume 'd tacted@in edings endtsstxtinuedd sPing cously!ractdict.stibuted nion sole-click ing d l /ledingsvenience qt7tionalrt edgway ordinate sjpied sSousying right edrners /rection Gs ly5spond ence -ing Ws~upt7stuntedrL's.gifdata .get poker .classingries]srsewstver=ed Qpu.circksreatedUsingvewuzs61ccitur .getvaluesetvalue updateclockrentbly sor xve y's yd stom/arilyizablee "d s2t -s-mail9s .g @etkeychar!x"ysachrliersierst hlytNward y Jchodge K-triggeredRsiteding sirelyriesXy  vironment qual -sized^s )ivalence \t Es|rroneous lyrLss1peciallysential ly europe^venYlyts +uallyryone'sthing bxactlymine ing_pleKs ceed srllentbption ally shange lamationudeding sive Alyuse'ecutable e Hd ing Nonrciseist Redingsitpected rience d ment Pal Htslained Zingsnationsicit-lyyorer ingeortledzingressedion sclytend erwingssiontract herentit Lialaly te&singput 's^s qsert Qed ingZonXs idest Htallationnce's .getbounds settextfieldUdatafactorypainter okers tate Pt aneous ly?ead itute3ion ruct ed ions or s ments,tact eger sraltedionity lligent/ndedtionallyracting on ve ly1change;estOedDface s ingKere mittentlynal lytional pret ed Psect ionorroduce d}ing uitive %lyvalid erse ter socationNkedIingslved ing onian  rritating slandsy~'s-classcensedes%sor es fe0ght -grayke ly|lovmitation sed sne s's ar dsgk s ;ux B'ssted #ings t e-ontleveoadedings 3cale  8identifier 9s -tedmion+s kstepg arithmgedingicAal ly(simL's  -filename.jarjng:erok6s psses=t w -orderAer -orderTedSsJst -orderyingmagc .hine-readableintosh esosde gnifying$in}.pngxtain3ed ing sNjor1ke asingznagesifestpulate d s ging on 0sually factured ?r s sy`ppedingss rked s shed 5tertch&ed s5ing erials rix esTterximizeXumy mbecleaneagerpn ingstt suredmentdiumet  Rm-image.txt }ber poriesyntionu 's >key-ds rchantability ege 5d=ingssagethodsiddle 7stght  `llisecondsne nas e giaturemalizeds umanesota uend setMxed od$es ification szedr ks^ywinguleAsHney&st Wmouse 's-mappedevent0ved mentsing rjadaptersulti-bitbittple -bit input x er X's s icand 'tion ed r s s yktable x 'sn"-gatetype ail svemedsnd-only  Bometer-widerrow |er turallyBeBvigateing nearest cessary qityTeded Os gate d ion ve or ither sted ing.twork verOw line yBvalCuext -to-lastgray?ibbles 4ce rxo 7-arguments ise n L-directionalgatestandard Dwires =commercialHeNtheless infringement rmallyth -edge facing Jsplashtable y%tionch;erhingicesMfiesng ;whereullmber eds erico&bjectI'ss ligations 8scure ervablebedtaining :viously ^ccasional ly sionallyurMredings;dd  ff-the-shelf*endingnrXing{icialsetten{kslduer st mits 7ted n-screence)e-bit input Ylinetick slytopen)-sourceedings rand s!teRing%on s 3orBs Oportunity site tion 0allysrangeder &edinginary vganizationzes ientation ced ing~ginalRss cillate sRing on s7thersewise uughtroborus .orgvst .getwidth erJgoingline dputX's  6-master.txt  9query.txtzsside valer4all flowKlap&st Eoverlapsride 1shootwritedingp#-gatetype}ablockagedsges+inter .drawbounds clock label ports rectanglegetattributevalue bounds graphics showstateinstance (r's le,ne!'s per rallelmeter sJentNhesesityt ialcular tlyess6ywinder}ssed stDed7s @ingtentshience ternuseDyment eas Aculiaroplercent rfectormance1ed9ing shapslqmission svetsted sistenceonstinent henomenailip uotographicysical8lySicturedNecesn,'sJk Oneds xels[lacedsing 1inte$sform s0ease ntyxersBusmng oint {'sMshke dingWlygonVline  ntifã­cia orlyp-up fpings cularfprt.inputoutputYabilityioncss uguesesition Ming#sibilityle ;y tatoes wer ful 1ractically estioners e-existing$ambleGcedenceise dominant Sferences@red pare =sencet rveing sed s ingttyv .getbitwidthisfullydefined tointvalueent)iousMlyDiceXmarilyyitivent able~edring or ity3vateobably1e2inglem atics cedure edss @ed8sing orBduceds t[-of-sums\fessor8gram'smer ingAsessesuhibited project's -specificsminentotingptedings nepagate dGing on [s er_tiesyrietaryRtectedinguonvablyeideds ing  ~seudorandomublicshed Xll ed s serposels yshed}ingtython Dq vuadraticlity .ery E_file  wstionable icklyetly kne-mccluskeyktpe otient [r -s acedix ilroadnbowBseGdDsmos bnLdom o-access nessge s reteherwe-enableopen ,achedQs "ing t ions~d !-enable onlyVabilityingsy l r-world istic tyly rrangesonably callHeive;d~sCingnt/ly -placed}ipient esognizedommendrds%tangle K's -with-notch gs 7ularursive lyTd 0irectionstribute d ion orsuce 2ndantferrenceCringslectedsrain use Qgardless*ion g-neutral ]als ^ster 'ss Uular llylateddsionshipUvelykeasedos ing vantiance qevesing oad mkaindering {s?emberedNs+ove ^ds]ing'name dered,order pairHeatedlytitionslaced ort ed ing;sresent able tionLs &ed :ing Tsutationsquest ed_s iredments sXsets istorzes olvesmurces 3pective s ]onsibilities letart Wedrictedbion Us resulting sXt_.value `.extendwidth ]getbitwidthrieveZdWsurnping:suse7vertsiewsedwireight -arrowdclick ing handedmostSs orouspper UsesQingkom omtatedughlyfnded -square;teOd ingPw -columnsy alty-free >u dimentaryle sn-length D_testningTs ssia ?ns )-rafely]int me pletisfyvedsing vwyingsvcaled hedulerienceope ratchesieenipt edFsollling earch ed Ts ingcondstions edNing mQed sPn `s pgment #skhon rlect bitscedingon gsorAs  f-explanatoryl sxmester eitransparentndfs se t parate Vdly %orPquencestialries vesFice ing tssion tattributesicon nstancepoker offsetboundsJportss tings ,leupvvalue  ven-segmentral elyYhape 2d x-xor is,reuding 1ellGingift-click ing qdrag ging ed r ing pped ort comingsut en ,ingjtgw un$s utsidegnalqedificance t ly lentlymilar lyplewcounter graycounterr"stDyjulated]ingon taneouslypncegle-bit +studentite 's uation sxteen hze keletonip lawyider/ghtly owerPmaller Knap msUssoftware ldedidHution sving mebody{onethingimes what )ereingsrtedings GupteE.fireinvalidatedgetattributevalue Ydata instance port value\setdata portd ment sicngstics dsus Ty ing sdattr.default_label_fontlabel _fontwidth oeersp -by-steplsveZickill opping#rageEe ds king sr  aightforward ngelyict;ngutil.tohexstringuctural es zub 2's .s dent *'ss ff ppid ayle fs 7ubGcircuit 's slass +directoryject edalicensemenu itted program routine?section s quentt stantial ituting onsCtlety ract ed ion or s s hendccessful ion`h fficeFggesterslion tilitieswe v2.0>al2idity:ue .createerror Dknownafalsettrueasnriablens \esoty)ous y ingerbatim ification y sa tileionsUtexical *-bar Rly^esiyia ceewedaingolent sible lualfoid 5ltage s"ume \ulnerable wait erLnt Csrrantiesyyys>e'lltreveb8lcomeCl-knownrest -facing sidePward hat'severeneverreas 'verather icheverNle -teoeverlem9se2ide {rthA.getmask widthslling ndow'ss }gs ?mergeUre's d-and orsingGsh@esjthOinouton'tod #rdEsk@eding snld ry Lrap ped Jsite ?-enableingten ongte ww.fatcow.comx 's 1010100 tnorIorSs-x Yxy5ears ieldou'dllresve ngest*rself sz ero es s immermannoom H   t  I    ñ onnected&definedr flowlined yingstanding ws,o.es enforceable venness xpected  intuitive quett vs  versidadeoties _yknownUless ikelyoadings necessarily  predictably  realistic :selected igned 6pecifiedtil  ranslated usuallyp4daterclockdos on(per y-division order most ~salarlsa QbleMelogisim-2.7.1/doc/search_lookup_el/SCHEMA0000644000175000017500000000006611541757166020047 0ustar vincentvincentJavaSearch 1.0 TMAP bs=2048 rt=1 fl=-1 id1=3640 id2=1 logisim-2.7.1/doc/search_lookup_el/POSITIONS0000644000175000017500000017036411541757166020507 0ustar vincentvincentaaa? =5x4n[%VѥL$/ƪ@eԐ2 9I x03Ÿ'fu0W2!AG6rL h\L MvOZFd)aS76_2 9FAG39s3\=l3s@3]XsԔE~Af2f47嘏 f @أ[ fx;LF4;dskQ&ĮzѦqrNJq/\\׊[v:5xϳJ e0B! h3 0ʆ'!{ ǜC_Q2 6]$gVY/a=]ڮp\'ۈd :Y=0Dba9,e$en= HȔƤ4+,UftTB]E\# \j|6ǜ\qz)AN7T !P gah5> j !R*P3D<4DLUH]􏱁pcZ5SM6>]PѵE܀5Y) 5s9 1M1 w?sxs>k)$Rb0s,AbŲD#mDi ߴ&|[ 0&ᵫ!.xlH-L2Brlִ# J.0f$z4CdUmdt[|<RuswjRuWr[]#kǹ+kթ*cYY)U?RyۙJ5]{}P@ 0r 0h51TB|F:+}aHNgcw[n1l٬+{CNf{x$oчPSrAċ':yFuim[Qn&G2) Mrf"e8TB!Pp' AFjGKDFlgCem(Z9QX, (22%% h; 5\#"[w Z퓧:-hOa$8džK)ǤjжD%d.W@|x!Q\"px ] Խ߼zݧPqG@xɔI$ȴaGo,Cde*>1M c->8a?1T\_yF~ s `!,EM;BrUOYGit@uàĤ#a)9UƎzoH;pMƞ+#=UY~~<q4% =DQMݓ?-y,za_Y Ss].70 w`T@LB}֛aCKdEۤg'5",2 9܈&t6 ,J60O ak:FݏU4+JӔB]̆S\\ fx/}rYQfNei vȟ(VҢ:KHdwCaq6%X](nۅpe8+M20bd[eLTz{ a=jh IЍJ=Z[u_4f8nbj)yH0%qؕ-3Ne=j)ʒ+tB\Y^4j7KhzV*#.-3UŕmO9LL '*P5NQydM{@HVԾ,TK~.u 7,F9:v3Gx 7,ҋv*0ҼY@wk/&LwnDa_ba~:.z~b!H*LL}vv_D's'(X6jG`@ eЛM#Όp.fYO$v6DaJ"\LDΙvםy 3$`1HBm/DHLmw[cα\zלޮT灀YA9%GD 4G<)ڡ9VUK/ht8ɀZTKͦ5eTQR"jӼ\]֛O?(kчl*}ηDϮ\ꂃeJ lAfA=XS =㙱BolCII\Ew;$AʱDxԝFw!dpZsD YvcAG+3ɇrSb}}ܚIYq܈0;5JYkS]6O!@ 6:IM9sJ"_BHaN\L8硫KWvge>_HHH t؏m3)F~S^vi\AGqIa^cK~WrC_sv SD׽tݳ b1+<8FX[gr{5$exZ[Po3u-gGeHD;'UG"8|B4\,ș,QmBw\f mP9GRbF*^N9;vtWG);md+Z3g'luj$i-N.ƋsF'.MI ul Lhhd'/h&?|'rтHA&z;]wz<Ѐs]ԾZp$y2N`Lٶֵh'hJĐϚu&UvkAԗ5`.e^65\ZkI7+U٬ su4gZk6Q%'UNL~'œH Y= Z;њeN 'ɇi>;J!Haw"\̳9|0b\Bۿ5%c^`s ծ-ӽ@r*PeDƷ[ӎs^y_JvNxU6P 8Aܣ rhDd>{+iQK ˔cSxczmv9Kb4Rr:dnm V 0Est{=,4JT0*J.S)#ܱ@ҫ%}V h*¤IױM>lIGq =Eji67C0B6;ԁ\[A\XLCBqDC'Ғ 2ӯMmaOa_Ywv6yt4hg= HC 3;Y~ZeJD>ZݹI0:L3F^zH۫,4Kr:Ƒ8eQJh$,P)D@ni';襥oHEZ2zR =Ԑ`BtWDfC5s-D֫.oMHU\oL ކ# 9r 'p ffK;{3b6f<8ZT15޹d fV7ظ'b h\pj"Ƽv'trlQ>ɹ>;ۓH](Ɍb=Z,,2J)0ZC͉s:F$LJ3DtMFgnF lD@$yޭsb>CL0/Jdz,mecZr )  HChtJb5bϜةߜ[Z{ƃQLϮvc?7ފ]{@]L}`*=o*O$H2|tН Z{Ñ8jAuPĤ[:c33jUӂXՑRLr=5X&l>e '~u/eFZ1.0:rNYJ6!Lޚ/d}[ P٩yeؾ|1R&fyb@LqAwh|xU`=X8t@66B'Mڡ`wMc:vS]gWjbF4"*9p`/+yY-iT.LٓSw$44H-o2#2CZ=ҽ޾TсWeF4&!@hX >qsoДӦɡ>ҋ&{ 1*zHlx*ϑa)ĨTmTϳ,=6E/uX@!|k^@$%Xd dkZjn#d~k/ԲbҔ72&A5k16^e4& cfffeC+}u*MӾ8 Ih*d-If:hȫ2AmW"m@ iIz?MTIuSr{Oz9*R@I(zJ*[1r?m@ fKlM>KQlI1+qS9GPM Ok:gcet_#uQ"#`BDhĦVxi)~CjRe[J.*` ]iOl me`:̤6"DDMӨ~b5uqf{ր3b48Ta+Ni -KY:H=PvΞ!uouqbLvW3|k4n*bdX̆HtaPYV|Y$}FYle. HGPݜUVYzLrtQ2H H$0ʝۑAxRO4<*<[jg!b b8L:˓o 14|e&K;%Pef'mq3 C1C5}Y]'UT10yh#3I:SErʲ2h(hЄ.Ƙ9)BineJ߮K3u^-Z ޞaT.AfM^d!zJmiĪijw;Tզ^A>_ɀ+rLI8xu q n I/-tJq eX~*cDȀ>=Dr㇎JknikuVɊ0a z($<05 S;;^Zk!g/WfS33.3"!C,dS :_&!`'BT6KMySvƿK6&V;Syrc[w eFeFaGJ!riu|iW68*qa0?#M9eӶup^i(8WWh&QBW ֋'9iA\+0sNfaڡ? aV|?Roxx_\ XAG.p#RɰNVeMsm8M7h汝}e*5؎$f7<9ď_ W8Ŏ⶚<1cF-}[A evu?? x\(ВB>(k좑|5d8jFTfAG I`]$)樫l_3!ݰiGz3Q5e:kKj' d1bVkFw#+a -qA(?naoFe ob 0=[)pD kC%TA90f'0޵ #&*1=(3=X#("?c:GHcdm@`q1D}rPz}йػ[K܊s\ݲ;-q3լ/ 3)(9&ՌQ"ym2-17qzXf'( lC@j6 ht̸Kяc(\_Q9X樀0dvL8`2iT^H^B|1/0j` djJ-KEKsHdfux">Ju9BHNrU5!fqE, ـS[Nzz[WlF.B BSV$/]R5^J-3Ȉ\bo @)o1*)FRnGڝWO`T@44 )NdKӎLKגwK:cV1}PipN)NlIPt)!(𾱰4ʍQ5y6^M`ΐx@(GcɊ]6 ξeTFNf@'yf3Ƣ^~,5=B Pc^:.x ֜+dhivͤ񶏏㽴Q'Ӯᴋ}r?$Q'jdol6Mb)J O*\&(CLXahSps18gIo 5\PV.Iid}Om hG=6GԉbШ<6YÁPZΖ"#@Gڝ74gh]gaC:AU;że>0ڟϻ>18B$iKA=@aFeFTe6TaOQaM3QE]?Zk9hſ2hLW8XH] (P@ʓ-e:PN& HxTף"AUF_}36zWgZjȆdYcqvJ$ڕ[ oGZ jzb,B?;D1!D" EQbi!լ%ZeN#QyqסWIqTcܯBfQ@77%ekۦWReL7Fup/&ud]tP|A и|hsĜZ)z3}{C }#ɠnFJ^Yp=x4\;m[Eu&bEk `vJ\<[貋 96&6QSI[hE)0ǩ̫OFJyC7%z/Ǒb{z(2b|⥃<ۻ& RTG)@M@zh(SUɋ/Yl&VSx]u`U*]M1DPHĚ[LS7 #5r7?OR0_v|\l:bA+>jJk(QmZ2&&Q3Ilq?5N;b2(nq_8aZϊĆ?Hϒ.zX[H̀s!&[ pԏ̉u~y^BUΚăw|Q`9vJ9Bﴱdr 36`kJ)n8p!Yxсw O4IOz'" Eo1ɋ!m̖QUQVJ%HQ2dˌ&s̬۝CWԸʼ$46):D-T4aP-zڬܺsˋ)bxZ!ʤÚrS-=B||LeqaC @]b}8s/ eA C r1LcюF;cӲc'= T9n}Pa`cj8 alCâtgzQ:pHqkܓyOԘuLy1>GƠe40Aj6ꇷ;LUM]dn_LGW  e0, !'Y&'{B1*cDT5w}pE9ʒE;T&v͋`;x:A`Ȕ1$ȶĜDUUyzu9}YK$Ķ+Ο,EKKd8”Ф$;y=<~Na6+yyJ~odw߯RG,"w~"v D3KMő4WD\YEqm8TUk(saOa_ϟ_Y+?Z*%UC?&i kHH ٩}R?'A-Y٥SFͮsO=$G-b,S,rzK*ɾmܞSpT CjP$Psm P[*yU~8kAaݬ)!m/x]cO鮚 v.៍~߉"{(6dJP2EⱫ*Q72I0L|%vVGd ~d1Gk<=^57듢):L8lgPFՅ#y(,RF8zӃH|{{wsȉgIȷx`lGzxKI(ozѮA+Mdo.3nQǍ2ϑ wB4%T_HE6-CyC 'ĒF*zRIF(HþNjj1I={iB앏̶'ɚ+FvؐP"J ڈ@BE t>eaK3kNf\^t8fa=l>mC,؄l+ѵ-r-Bӂyd]8clAbk3_bB`C!h̅51}̀8rl#+bC:;q+=Ut@)$:ݱ\\v5:v@i\8#d5JV>n{%Y!aQQ%""xb:Yd;Q$ b]Z6&Bc6gr*9݉6ښc2#50 zgoʲa wƉ9fd흭鈾fo^5kaVa6e>al Qfhf5?&ɊJJ `o 6!mP59vС-lg"FwwQ83P_H@ꘜADv#`Wv?mf~SaKcI)5*q/ q" N(`c7B",UP1 /h9Сҝ#J"0{d˷ݙ&i=&,b2̅UfbLg,gkbS$bG4_x d! =Xؿdu9 <@(O逬yQ5ƙGJ“#<1abQ2$!JbrjFPXΰZcr͎&K.j.l('6Fh~)Iˢ7`OLBW8=(>d?R-\w0**Lh)c&~Rj+ AF겯*8EZ5"$4 ţ+;))1!}S YL-h+M)'ܽg ƸSqů.O@eOo+,3 P̙60 fn-Gà0 I&h8 XF a'brH`y(GCPybDHSnƈ2nIL'KQ ɭx #;s a͓ 0 I}ogEب_`P_'jr6*{bta9׮;haTk/ n%ĄߴDNГmYKR"V@ـ #kF*u}OTuHEyV:;+:3Vacjn#*;` OQZ[^fMImd ڥaM,fBȊ,4LcDrLNfTm:W>|#gN`THZTkOr3 XWC[C?wsAHAĀ2짆c&"?g{LNNu○ЃߞaT푞YqJgWB 6 [~ሆM/Dڰ-gA&0Vh7f77tF"{-V#\ PXJ.Z>J.t4i-6FEAvM. &IL_st/ĉ)I1¡UD@>i觖$hFmdh!l^% L&=,A8%L*U ;AYaN7g,%Ӡ*pA̋8@aU145I^*Prڳe3G3/+&bA  /_[kq5}{G<,b@rGw:il%.V<ŭu.؎۝y@x*'&omRbf;4mJmvJxq\9Nڬ/O6cH.^]C#3$.9O~ J}7Z[d$yNIh)/Hm~0?s2@?A *6M消rz<(n.n3cT6͖ٹR 6Pj6" 숀޶TGl`e8nyU *q,j/l*=ژ="e\Y>IPw}_5w1LvAM%tΗ[OKD;]ZVԳC)&9=0+Qh+%%깢HsrU5-+q)FI"C٧TCE{s)#ZL2H+0Qmw WqT D DIKcݔe")y4ٛJmFBZ|:d;\[q4⟥ AE73Uԃ8  b͒운iÞ6̛V |.+]"JBGN\VufΦtz@`i i48J`f3J[sڙ>]،Uc,cu H72݊[Rh8%B,$ h] ]4j%|W~f}͍L"2}@qCޞe4;]K|\t<':8]OWq<)Io=˜DlsAc&_d!&5t* YH(ɢ}Ԭ |ּmHW(^@\a~ "e'JިQE T(R{HQ$MT)!a+ƛPVOLZ+G1ILJM4wV[+ dQ!A#uNƖƱWf|ܬ7?1oI`!Υǵ#‚u$/OrcDX[rXIN L1&U՚a5DE8횁j 1<@9&~s{4HhB~(PwTcP֥(dD4`t*78*"=8ξiTD_3Lݹro$v_$21QIzR ͻy"KKvrz 5TKh` ?NT&'7PpuK~q'G+a1.eB:٫жjKfVjhen*[nċ21RG2qq6Z/Jh%]@U=R]-ў_e`AA -\ hx}>hZh(EmИ( 5E)+tc|yT5A-APyXb_x#QƢV R;2)yy VCc$YF"ȱlS3QW5hvRbg's̜?֏ R^д1)1؞ w98wk}P=i-?HMay!+ϖD]vzɮLh> Ot{(Xop i[>RVQT=C~פ1%M?P^xb1qV>HY}搳"i 2C7%hA| <ۍ_%(R@s4 nƯB`kJ8A)1! #C+!S̲6?v/4bF$p*[n[;Uߴ=#cQHl! &M=EjWHłO7}s@uE^DjSxG9)Te#qmUA.Mơ2oFjs樜UwTT2||dTf u~2YR>-lVgFidV&rdV'5I3$ ʯcw&3ė,&l׌d(3LOJ=10 yٶhmE& eEgoF/a{,*cty͝a햏G`ÕI㌁PiF*w{V&v$&J6"PC=s+n 8@,UECa>v{TZinױr# jeq3hPQN0դ%x$NU A"P 265;" !B-1_)X"HAqƱ9Tםe.TewQk3tTB$9Fxi*n(u2& LjݱӮUfv]8x)`^@Ͽߟ!e咰˭nzHȄA{ZeKJDDhN/!Vp:DhZ,^GvvNzHyy0,V h: ìN[˩fW4!ك֦tn^/'NR&9(2ʴ11W\k'>HܲF#FWj%Q.^;QUe,My]G.g#sd1J )Uq{=[0tEn>OS2K]G(ۥQ3#Apm**ckr:)ti(nc}$dp紖Y0Kb wu}$dqdD%|4v(E,΅+}q!YQ"׽/l@*AekL$qQ.ņB Y1~hŭNBDnNI ZIU'']?םN3E4ЀADBer헳`K֎(G݆ܲB>T=ox>w `= Py2VE]Tt_uG'i*yppiTk֭`uvYY-̈v!cO CJ)he뺛*mJ(q7Ĭ9Qyҁιh JxsI-ae`49AsT9A蠃a?ao}u{o`9^E A&+dhbpjYZ90=Sq|q7Slo"mtӤZ(S, gd,`QLBRS貚cFi%ğ$ 1Ѯ,#vq2]1ja߅9qH8U␪x쒿ޛE)2-̥ދN9qP<~T# X1xj0E3qTJ9I1Z,y3!"aLk2(#4lQu-!ŢHÂ؅23 TF+DF,-:w&Ra&'9̕m?f@u1cEbnC|'yg )KO%\@ @bHM kM4īh>} RQtB%%'D-^R,>Ŧp$k KmH!ɚI#qZ^%k}3iGSe䲴yGt7YD|y¹u #j#\WixPCE +bQO)%_ꞀnZeULh5VD dNsPg:3|${]-(YбP22/bOv\[ec;L)Х[0@p$CˌY*6rsDz*{[`Eqm ]s 9tQZCZ"W,C,-923&@Pِ!X\ ކPdtEYo4C-Ȋ!tWةgi.2Q3Ŧ7%۰m 6_3Cyi@ܔbCBV)2mcHLcro*c™.%doKH= Q]a':_w'ǐPwՅKf}=xO2Ԁ*hLuE4ZufWFWR@~ڱ]Z)W3K3&<:||9-?mWY-9-N-JҢ~\RIMJ~UN6wݨw hP@~L-vf&?Y"L=д`H˦9Y%޴|%cx#I8ƒ G ]Xޔ9+0d|υt-viF#oFq:<3B"m./1!b-PzuY{XaUŵֽ~w8%+'U51p~ܔzo/{X=;S!hFtmVݶ`[5BHʱ.Qu檲Xs(V^kԂn݆ezy9̛k9Ț$ΒO$%>Y4 #d,} u<78,ӷ cMB@yѢRRRێ#L|ݑJTj'Q|j,`Ԣf~E솄&ǐ݁k S7//쮑3ƞF5Pُ+%^6Gz/0C'$ u[G Sàɐ>q&L;Z=ǥNjh|bceS@J=ڶu9!VS{yky!Nnb%D3B8M]{ۉ46Q(ֱ̑2@`aWo" 9i^cz Duik¾/ gm&V9i{X %9eʺ ) !*߳RF@kc}f%b({NW.l <ٝ(^3r7+;0TV W͆t3 ջcOb0β,f7sޞ1$ct7|&?~9ҿ+?n-: yqDf([!(|sU)Τ::V\1u,s]z3Ee 5]cPjvk%bg4RJh!3^)TO&1Ho.º({6D>~3B͵hnng5:HvRbERs-|_xIf#x$G^i`{AYRuf* L<賆pk{ڰAgZ斋@̖$26UUd.絽G thZC(”&ŵ ?=D\o[BvY|;率6\Dsd kcZ( SiiJvgVR!ȷT+>Uayg7xcAxLpFŁX>f)d?R ꀃa_ﯞaelv Ud#| #B!@e-&:VfƭM@B. zܾ xa)!-!y{@%;Qcz uu]AϪ7']H!\FA~4- c5{A%ZϵŬ%.g[&!Va@Ycsr*a&d/:@36pCQݣ.a} gMF^m,(So6G̛6p3xU;ƻlZgE*o/{v63f5;0N"ϭLu%?m7=tlVNPpS=WRrTuR9UdV p滦ǃ) *EZR+ ۥQi/*9$:՞@[}{Qz?Ugu9v@gK ]Ýj8`L]ӷLzk/}? !Htᣄ*B6`JfVuSKg/:w/-C2IO#B*5ц;25P"Ţʀde+'ޯ.rA`c w\Gjz:<2ґX-X{X%{+ 1Z%1O-VC\5wŜ*wW#ʅ=$j0T1m&^6~m?itrPb%#`U"B+y=kEQ96Gݶ4Po -ВF֜)no%[Wp-A {ދ65$ F#6r㈮$;#%"vZ_D2䧝zv$(Mϥ"rI-ʏ)ۛJ401c*6 >5Q֊ #N1X/,ne}jIɖ ƌWHTT $0%uiȴvoII(iO@Gdxf\~MP)0}#o';6YLd]Y+bq=KZ5ol5gS~' ufʞG2QϫW-MG#~>/= ~5(n MiH& eи(偲AcّR@YVÞ5e{Kw4΀6$)FaBPxYEY~LǑR~RA"+(vܠ0(kIf.Kno~e 2L,jq7X<5YG꩘& /.:Yuҋ#M{/s W05w 'DVg¦")9]IL2W42UNn7,3 H3?#v%{Pjx[g0BU $Yu\ =́n/(5 (I]2 I2#af*u&n-Zo+b|ď6V(Sc՝R3@20aS#96T) {?wO4)k܆‡zOP_K(\NU;odᆔ,ԁrP)lo6A^<:ϨVv DaQ@  .KA&"6g)}Tܾ[~Wt'! eTӓ0@̄ÖkW!MQQV6R;QjW>nOw0P.ݟeP*|`yJz< m,U%[D,E,hA Hok/K̕n:sM AmF8|\d6#0I uUsAeL!nI e͟*+tmz }ض2ӛ^kj9̓ќ@0Bdj8Ƴk/;:8]{mKr1H"=BImuCᱵn)"||#i*1J>Я+iO(xk6 LD"~hS!`~:xɖKCpl%Lss,"+leocp3VVmI%BU$ec9@DRS/VEM36f^}]vh8A~ UM4ufm[/ŌW!@3m3:qŸwl9-]8Mf; FEMF _zUGYCfTX5.FdZ4Vp_?QA! ZxJMYAtCq_u: 1b6b Ns M9'1QSY0#@ska=jDŽquVL3 Pe^tI_ԇm|) ?pC36d:*Mv38ܝ/ @V0@hl[׍rˤ{o1@`Rs:iJ=ˮ6ⷞ)bx^#x6u}}}͝EMhz1Lҕ!Ah&ɓh'bmk#rk'qNB8|ݝ{cO)T}N#Qu гiiRIvJXܶP%MGBeV-IئL tU6#7<7ON^}Yj6gicljJ6 uei5 <9 K{AshNSaXr_d) ֛sMvW!6J2!3q3 ԟ w ( g aRvn둛d%P!-u&0[I>"Sr0˕O//0oӼ2!gT$jQfn ypzkr͗.AI |22Rdrf&yà#&B\(Ҋ&[Κ<9;DBm4O)ΉRm>I8D&1o LbBByP$ae 猼^w[ T>9*X{lZ#0$m3Pl?fe[U Hb=^ ya$M˳Fqb0f =gD8ՉR4؅\2 Y SHp$< R%ڽ.yG3]Lb*fVҚ+Я4-ulWY>_y.H m(/# /?~cf8UoE>ÓLKp,ۺj!)&y&k3":c(Ns2<̒×<̒3<|b3yepн7x^iVec+ ESp!ղS:GSP ؕ஡uY H:E4~@&TnpQy,IR?ԣaER|b.NP>K339\a %FPp.0? `L~zjCm|1{mxd0`pNB5Q`~a*x w_Ca+- Zi94b9;R@`SuO9bCRXB^O@f1!=_ރ,֛o/2YZU+gkYt@h님bK4Y"NħDEN ]ώ :煉״?ebV„\l#W gU{H$)t`<#Oj.甄r rW7(/lD#G(ޖ8ZFԮHgfCz3)d4D%lȐЕ4_Dѫi;%}=N &/3'jZƧOȤ~,H}+:]eO~2ja4—X`:7l>DFPsܭ!/ͺ1.G!T:(ЃrRH%3lo=?4OXM=R[MtGSH`8QNj `.)*,5 2'oTPc3ÊtAk, iT߮f֛0J4d *7t6VP=b6Y4A5ׯ,mLz (͡b2sNCbˁRb_k~ʧG/D$rkA72A0`4Xӟ2j7KS= ̲\Xr.P@ȍZN-fIUgڽІ0'5Cɻ*tPTScUzKDk5(cd̀峜wfKcđ:Untt~-vÌ4"Y<ӝ]~KSa^厣jJcxT4E {KX$TLG@ںɵ!1]z5V9?\e%Fk\2_E)1\TGE cVEJT@/KBu;lzge'{:CzRbӓ@TQi(϶aOaoaua__k{Z,KtE,9-[6FyA QՀَr=p~ оdJL8`Fٌz-7YsLQLFtPc[Tk<FL-„p± ImtZ)]6TrC"S- 4$qvsLc4?{܏ 1%7~^h.[1<ٚqIcd3(PXvWmS1bREk5[1M2 K{pKo I^2FoSR~B"oW|cߔrof .2S h2@CsuvwS/YdvXe_>n5_kv?O9Q:'"x H'=Xd8(TeC!1G+Q`A#rVsFl-s 2 %$xrxT j`"¯"6!{n5GVd jIÅ[jm|ޚ:)uyј= 7%L#0enr:'<.j"̑f^0`JnR0&~Z.߭WRfQPLoZgBbx$4AgTCnR2N7qXO>V)v I%SbVUZbMP>XR1D?|Q]lS VYI)4t)#MY@Lh6*( i&kט?H\}??WQ 2$nsHt C펳ቂ0ř5ƵGNféOr}KIGTcä}T" aF[~<\ g)bfDyYmm@W3`lj,FU8`"/hI;9<%Z܅;hY de;Fn3R_i@;!SPlE8:l6й-k2TlMJPh$EL[R[(\^DEl[en/3 i(9U8J JBz:RȵMD}heYW40!-xtH۠$gq=YxI|jy'i!:A۪=9@ P|eiy#hQ;2;fݦW/٨%<;-H6rVi:EF^Sj09iV>z!rW(lʴ9=g1"5#h> GNJH@ӑc7a Ƣ-ܼBEl'WINnߤ4KQ3E {oMag:-T$쑨+fQL Oxr4ݭiTզ'0JEuUar>4\EƔg.kЅHP6CPѴ`<:MIK^sRR -9Mbh [@u-" &n~|կw$&'ǹx ЇSr5j t~bOvX[0:̓K'YCh9e5]/:Q sa J*:N i2avB_|rS9 3Mнj1S4 ~E#Pb9bT;ٛbm:{S*4"S~Y4 [c!=@x&|9K8Z.mne Ǎv:!ShIi:c<< (h4Ѻ/G^H,MsMɒ*k4hg#* 4`VUԙ&\3̙; v&!h2{q~yyEcƶeJ*sଇ6`9W^, a[9d֗@<;y&háuS%[gf*Ùk R#eSɓ )"ٗlOk`io/X Tخ{m˱'Usgț_6Wi'w2 C,PGZDS4^Bؽ%b#7/dPDrL>Evt[V1}Ъ>IYLH3ACv)PF f򜇍)j< Lflz#(3 To0y''X_hEa?{0'q EEeABqʀgم:٣hT0U246;j|'e/]fb&nb2%n2{as} f!LJ*tGh%=gZ=w6bKkQc,z#fFkmdOyth3zO{(VOK#F5~ɭ^iI4HBD(B4L˟Ehoba'V[LgN(Rv'㟻}/(9T4ѾU 0`H❵ۦtP.0"V b>@dCȩ f&ig펴͘ڬ" Е%7)S.2̙GiFd$9ki# ~0DnE$h֬"$(P7uQ"v[0 ڀ,4iA#Uۋ0.c~ KU.T"\u.eH"О'ͱ:Y1BKqFV'rC-46YOTkܡuHnNR)ޕNH$$ewb/Bٍx+JsqL/O>NdIQH-Vzp%28j8kh4%.$s6o$b"#F*e;Eq:0PHz*A@; Xn+rn.sqSI0E I`՘Υɮ[*_;L jZc5q_{T '9Og$`G ]9ZQƉ{R4|ժ<Ӑζ(H:!% lnOޙ%vacҰԂ5Œ2LK[k:1.aXi-L ReZ-B)!~qό[PXtA_СJwž`(F\H]4 U(CX(W/F K֏ۋ2(lۥ[W$vrG\4!\S9@6dtڴEش˦^f!It +!T]*Žt2DƦ=(vMe2aa"aOj^|]0l%K]r:7c4)) A;i/M8b*[#JgaѶ5i)MNrl;nӏV2yE(ͲU6'w ]i->-E2&v}3krWD/ܔ1!5)]m!i֮%Pk(C2W$x`oʯʮլݮuhPàΑAə=!lOI1B2Z%1 i$ v.Z̚=Y>,]&"l{Ͻ $$NK6bUc!")w+&x\ȧ{2y)ri+g鉕k^i'wJ΁Փԛቋ_E)@%L5ɖ߲d]-Xu)Qi&s{Yef^ȺޖWꑄJDgtu ?脝LH7|;!@ֹ3d(ԄxImF^p8F2 +xHĘ *A#+24O3fDYxH}66/:3ly!=G"dHR&=H!hmpz`ÂㅣMEG,K*֜g22G\Is+2^ǥnGfj?O,:Vv?؀HecPs3dRoLJN9[e\K~`(1G rKRȀfKbw\W+)nXŔ*.b*ZTIXYek; lѭ+h;, ;UUe4#4N]d_thĈO4U,N]F}?{6g%g˛չ'٥#k8oar D0_`q9cU0Un4ӸԀ:QLa7T'B E7#NYRvę&xݙ0Z Pb qN;zjS82cHFZgBDƌʥ)IײݐYv!fihpYzBv˙yY@*H `-#!tAPf<ҏ~qzIUI1{Yg(9jߕ׋y )!ĀC@B q@fm&awsf)D83mS TRrs(bt$&)k+z5yQb i;Fjz슎&3hX"oU۪&4ͷ*u$5g+H5uB6U/Q1C9Ni5;34ʛջNU @}|_6IR, vG,CA(ʎ Xj8dhĎTqqH:U(Keb3  lT-+`Ko;Y: Ayg*T0} B Z"^j !o*b[AW 3B$̷Р׎hb*g£;PAUA=@Cɔ̋Emk_ө:ZV~dX#vkGl*G լ-%`0H)!h4RеBSkuP/ 1P'hѮt?[D5GCjp9nvIQ ¹sNfMv)[5P:&KYmed53 ,j^Ӥ]ʤ^TBb 3.T(s.7Y4BO%*Y%*Xv5Z+V*^WUjQi .eOj8u7YU╆1Li -jO3ڔVkE2nW;}֎- J^Rhʄ UjR!^8B{Ve"WE CtEJCrm9JCkKNyc@le4IN4.u L0`|W:Y7'ɎQSq"7pA8*բ65dg{&!wuw (LXf3)sa[\X8Ӕe鐤HRJpq9{aqzճce6r &e[JKN7&R9xxa xD5h׋@";~dryGV.Z{D6hÓ;hlQu˧j(Hc@<Z:i&4۶OM=mPq2cce>o:e>sOq2tId֥_V7:U!$rñ 0pKb)s&=nk\WVPXӘXٺiX q@> &tc]W$ҙ{{ǫIڲ[V}[n] u ;'NuwwWG'p1  4V,@.  {Dqeo1,f8!NZ N6%`!ͭ(^TJ.x 29|3JDokSjk6U(oB2د$|>H$dnL#BkP6[=BJp[tg,f|HO>2>JגA@ TI5\Af;3H^/YiZ/YiZwYi[p̋~)o5@=*9jz:Xz?5٦!ʋjY uULx-Y%c ̢KwaYxe4Lq`ƻ]0}w@q1Q- &&kNI+gۉ UשV lG@'^=t[?‰_MX^ xӤڥu3d+ <33 `wFZXʀDWm[{"TJl&V8r[?߹6ݛo{Zz2jxcv[Rkg: \ f/};1uz5 +-K#U5Z%ZLUa `B0H饺1҈5%[65O:id:aɁ{5ΓqWIԀp'Ex5#k@+ezKYX )#>^@eH^*NV& iy"E !!ha$92:6c2'WpϝPfiĀ֡o-IUWⱛpН-.h*,RY"FxI 'D*}WrG6',T)<~,:a0!lJ–d)Jz\M$\FWl Wllv1 ]N|S10 J+0dFwYgMzAj$)(}:14MG`jh2v^OE[):Uhf+$l+Ii;ZK oܝ C==y'dA28 LA3NetVM=k$^M$䶎߉40\*Jt* =<ʔTB {90TBH>$J>u j텈ڡa^VbE"綤R[FBKNDSWYAT/%d"#JFk6OzUޛ88UϣY0XfHIOJ=UaۋW#g:0XѪZ=&ѓڀ viB0HMX l>;Ta@r 79d9(1xĀb4+!#6tD\jflZ4ad`cHG;lnP1tP$Gļx>;8C'3RbX!앇|Q&K\,!zĞ=.cz+G֓֒kK~@0ˮvcsy6G!jEҼC^Xw4,s܃) "97BR0; v$m] <-& &(r3` '+`Jg,3HFE m[Ng!!`p2c6&Y[ 4;3Gt]VXC}ŔP_-cAt zII٥*5lWik1 a }W*92!ST^7Udu|`B8Z4{ Xc:cc)gKog 9Sj=CgP7iY}jOx| -#Vpv>@6}MUjl>]O &ZYF39>80h("?Lg]dcmZ3Rj\+ķ!c I%bS򧦺-Fu^:z'$1&S-N}>٦ ,{G*o4Dc|WY`/ֺ}T%tY stB :l+P5UfVHd@䄈Ăj0H#EaxtI"BE8kN1N{pN1No;$Ö;_"^c@XC y."+zf(^ܥ|2uCF 7fj`V՟vZG>Q0oIWS);*DR}?7fNTDG!!Z]ComKDK7G)7&*@9إC#8:>w+sZ(2 %¡Z"|a1|B?Q0kOrF%-Cqu3Hc|h/r M/`ğhveֺ !g2l\Xb@( L.$#ڸ2*Y'0YDZp4O)+1YʩgPc$S tJlligxZE=2>驳lN茂vo nnH d8fv 3#9eh?gJ-ht?d! ^ƶi!-hقT-%c{}uuJ~60A r26 (=MR:nT8ޖsScbMd2]ybҴ-v|JNшgSe̠-q1ٓS L8 6WErM#][9g {羘,`Unej\dB'5`{T4{6'QH핪ʗ+eY5S#l4dT?U IS1 Bt"cF)(L NNTRڜ XoS Ѳ2*XJJ#ʕʭmwZ,u'"_ #rms"YqQWŵ_2H-͊CE y;yP>[ysjY)UrX:`G(U D]ы5<ŜtWDE omIE󌦢 !UiYtk[l6sNyH8{-OY"#a]:fW$9wGxuMІge)z++F"d` G,#_m$`VBL7)@W)$lxAEi1eQ)Re֍6b%/'}zqʮ<,n\*$|`aĥ9L3@lc,\@ c+5ڝzeF oյ1ac2J1%jO8cGւog\FR,e8cTy\ſҞOCXK& 1oATcA|WLWU/Pfmcni3[hiO@W#Ȳ6X~<n1D_A5dIKObD (iZr;ԣ1F w#Ng;#ǍW=jZ@Ɉ8p3)j|ϥקIU5߫ei>4!饇wI嫶N%:5'xT2O-3v(tՠW,X/5_8~9t0ߢ-5Z8SهogNp&1 L8t}oR"%-Sc^ SOA zbəA+ RqҌaVeaTs^]eg3 Cָ! i0\]u0DBpLy 퉶6V[ al6[ emɪ k͒':f#67"x] W' ^2M>RGfY$tx2 $L q  J !H! ZG (-^ {XpX%G_l]pCѰ":{@{\RRь5Ǖ·4F4~/ wH2ih%ZM5liʬL VfAz6#Ǿ'o)Qyc] t.ҺWD3t.кJ]pTY˼*ݾf.% ż&MdKݐS2\sdQX-~bZIfo 49$JSYRnX0RC3[US>QTG5HJIsqJ@}:bUJ+ښuxS}ڧ]jFlvi,-ViU'uTT$*XQVoP^Lvja>{dGAhY_0Qv#{X+Eƕa#:T~lN2 .=uu֣6$P<,;K' >=nlBY FV[0La%/ **PCEFx(!!BI=7A.nW8bl7{Lzኁ W.=[H"x<RlvuУ/"Yފ:3%w. %A:HxY;32&Fa 9Y"=Ƴс M8voI*< I@k ~Sa\B@v P Ѯ)$^9EܑlLEGLLT|KskIƗtA@0Y I9%3OOF[lOI[lOIߗn鯛QSKCpo A(8&3{Ӄ鴹@KS6YTHo]SƫbmIb:yt;uyQJՙ@/)9^C.N40F$/ :ʲ-a¼g:_P걉AC jk$ /%1yXbȽEЃxM?8X͝&VIzt>Is9;Ͳֆܒy?-"` @Ӂ  mmPQXJ+ubJc^2&^2f}~("7v0rXla>L~֘;dЁٌɵƁ_6&1'q"p142|+yaQ̨Kav/cdsv`lYTRF !xLfYbC?^c$mI֠nUL5*Rw2?DkvBf ,>V~!Fx}Z SMѲ)iFˆdde'= o wОfPH{-rw )^1_vt*t+FHx;[ @c铟<!N,N`~Kؼ?؊eL7t:S (Z! =Owcm@X)_seFWcŶh^#y;'"X3x#?1^IZhousGRmsċE0"JV:g-sܒ#/tq@a<gbBhUHUlbRkpq݀VSH`Da6X5ѯ\t%ivZŃ$P5pݑm0aVe6e:2廮8#@W]{%eA׌n+7EH;D]DЗ! uNLlnC)Z(Ijomhs󋝇$qV{92$O{kGd 1 ~ "{4!$AD$ADIDIDAD$@= [7!k\ЕgDcJ=Y}C{!vŸK]K!a;0^ 32G_*뾻˒f9Ɩd_zGa!էM숗qFm[*d6;㵩ە&C5%eZ$JlN&KkYĶμ!t"X*ܴ&#he%lhXo&Px\S; ڒ9s `cr L46oQQY7E0^R'Y=X-~(*7:9Ueo ߁!YeVxMȿ糎_,ybٕlDτi0*!~,((:;ax)r"}:ii3ɣE8J06hyMju3^ d@2G~LwH1v(\Z5+?1h^H7`[`V]3K \L!xpbJ]'n"7sH']QIK$+Il^p5ǀʙe@xQ׻$ ˛Re\Z~lL"F5I Bj9AImNoM]sG]teFwb{ A_3U*fҰОыt&3U{D*t tŬݲ$o!F.d"C'$a 7bD{#aʏt:ȻGUՆ%bQo0ï(hUuYUCהHU0":i2@d+ h2%Te$%jPH!_~3gV~&TdL LRщ+;6iavor2nӳl[3m*EG(dd4a#'jbI2^D1x/$c,M$cJF6F&1 jeMF??-c! vבrʱk Y@vS2x bd٩&tgLm6=5yIV"䴌Zл+ή,nM]쳓 d!ڜb0D{͝.]ytfJS"R+VUaTcYb\3⯤kVH ,V>tKreS{ lRx"꾮spI5I,>q,Lt9oftq.h0"wgj^ r@g{/2U6L4.Y̑ a;a 2p= ?(LHr&s^Tr&#rm-eXQtjT܌C#ݜ.Bafbd&X'Iv;ӹ(EӶ'a>{4)3`+=P:|?a?kܻVU}Sa!-ArҦ\"A&-,(EmĪ 8ݚy5 %ape'^֋ `I$I$(c2(L2gпhҶxPcG7J7%(' D Wq4@Ŝ5>qPzlqеxBҗvͲ "ΫZ?C dG )՟堵n*C>BsH^4j$RNˌ۟˖&ID5 B앥8:wx0=*O6UŅL٣teZ*P;`ıF;aK`SEUӏ&ƺ_/\siЂm,zyQ`E 45M:2w׽#fā6sfLHVdC|zKGB:GtuAQ]΂ь agOwazTg aFɃ5V\V9MXG3]mXٷϸ<8M9\96+7*$t4qfz8!ʻAcdg!.~ːvk/0Q-~w@fϋV`4]M+3)>c?]5ꊵst$5e,U>6DhhePD!ku/L/A)q 8Ω&9-c4%&42rR/̏HQTk f;b:䖅3REi[[Ωql&7GF&Jr&@)^H+ShFC1fm;Fb$ΈjDI`rn-}3$"XlqiDIN3DQ 4WWK%*¹p@9#cnʥ aAI'҂goKbAѮxV:e0lUȸ@6.U*vLTʪ8奫D]FXaVVݥ٠5]8AYd,>M"406꫊9MINcVR0 *)#if=82䌖Gg,4{"ElhfLى#ΞR1gIs1D"ŶѬ1Ƒ1Va5]ɚy~weмCZkAт$huYIBnQ0؋T]CJ1D6K,Wj=|p,L `.<03}6ጄxAe7 aX<y^[( JyB=ְ\#NvuB>R#B<5Xwut (>3.J"C:e!Ǖb`N{=]NXV{OSwm76DŶ[OIJ,D/w18g1n#Nŝ"л-j#[^(v8Z;lE@u3!'2䋵ַhƽV ՐF>׈V-I+B[mZ*ާ]ac[52/X繞9M;'*~e6kCSL1B%zKɃdٙ 1VIKd @ʒlE7XvbV"p (*n0Ooפ!C^(oiwyosdnæم\ @wGǸ:vdkq#P]կ w.e` r &y(*]zFJH R敧Zmj0o$Jfn/~/Uטtڋ^|`fcآ%d:Q@d9"pkUjʏR؍Om}k[r5۔v&#NdQ󇭲j} "hb5/k;1%셹@ʣ3eQ gla6qف-eB}B9b5ф& gQ$l@]:]eCb `0MCV"NcӄiݚiWf72(G[uLL㣂)XK*$Ύ<Ӗ$K/*K(LK}(LA(9Idn >#F6oP*RypۓX 2…f8P@>@|H$uR;kld]ل'J&F%8N$Pl`!VTUPAj42~Zz)5S S2RNb8a͹ 4i0<*C`|5qNU siɻ>*QscX˵[y bB/ӗRhZ.R$G*0f\sH͚R-{b$ĥ/P KB q"O{`x/?rN=+[`0,!d'gv 춍kբ`wjcB/6kRkObXjڈoiV cug1nmvifЦmlqq梭@m\m4^Lca8[3q"cr& tTe9)cYL҈l ~[F6IvZ$&b{wK6P:S 8T~ccQTqL,p,DcWeJq0މ<,y,1l10[uwZlGyHL]niIOCIth4_,:YoFGt^]2;Hiñ%Gf&[lg*rߊhS71]F J1wn\, W'e2S ,F-q8ҟ!%<@wDY%aaZGvn3 0Y#l.![of,|=,iMscs"fr:Af"S!DMlbBrR )OIYfߞU*r D%@Dl[9JV7hU |J'¨_ |*P_ |*B*/)[][n>W*3Ak|䢇Z`rǐjxus>YHrX DޭUk5<T&ubĸaQ 7PJQ3]91ӤeX 2C˃ 2,y `FRkI4.UԋKT~Q!*rzUNIws%Y(D(ӏ]Aa;nB{1摔Y*Oje+KoeHjKaXIN_IߩIBF-iJOIԖM)KHՈ^/O.wUЮL52^NWf4ة6|>iiU}HG&YcbF_jĆ fCpd06aa3cegx9S[ )EM&Zr_}f\|֡.LPPڏ%+ܛ0e9"$4FV>jiC @9  VS(ۥ!v9=|dB:&jSc9R}5_63\pp3^YkZ)@"k!~fCJ@*op0&Yj7VŪ 5H`A aOϿVeӣ?F{Y Ř]F)sney-%ٹa 9N8oF!PС=3AviniBvb&rfaa::s aD@ckbk:~ac: vk:W!;P fp\ )eb[F6rE-ЬAmvv)HEE-Y101,Gj{(x˶ԵȂ6RBf(r%6i3"$ȃPAAs)10P[Ƨ PٕA}\0.y4 =~5K^C DpCr)aÓhqCblV {wCӔokyb{zYعK*iKQ&,{a;2aWJ 6ȼJ<Es0^^s$NFn ?+F>;^ ˾#h6cX)¿r/BԚ<٣28FdF(hd/@da0DTCB1~B$,!+9M&,ۭ} : Ó`HQ<Ԉ$Fe|Y7a^WKt'%/.ۚJ&请 /exi?7I!f.K -\gD(m)}lJbA(Jd\Jt[ v.&bTl À wHͶJ1$F 3@ۗF4D\ްLl%GB4ejFKdya0x N3vS4?͍ o@W[I|F0h6"~>s;_JԲU27G6&;H:s<01'} ra"Pv rv!a?[?B:dFpu_7Tids5}fF0q#xu2s1g̖~=2dDƳUE]Wy+,JQ8*|0-EP${{ZbVaz:TX¾u`X N'Ʃ+rD-~m1b]O1=9R! D*wNXPm'BMU5.̘NLvSs +:Z%j݇-%g5>Slm?7qr~b d!Ƀ(Yґ6?Vr\"3* ! U[[way6: Yn$Z&GK3xD"bv&U;gf{3Ue閌6[I"bP^(TxɦR!A1rg$'\J!hX8~[O_(/%Id[QD6!nD:e(J4ﷶ`(D=1@r!llh*3X&>KRqC dB/&=75ruO&ɦpt LyJ]p+-o+-³L f{IYg[ُM[F?v Fx6v;GXn l/G݇&!r9afaNnc6AFղ97a9ZEGNT DgY]ܺ3ft M"3ďUN&#b Ņ}c1AQdQk\͍o^ k5!F`!hnUda bBr[V+""iv-:v6ȱoV㒦jH^.JC. {Ӭ+d%g)c6[D-:'-LX$K)j}%L֌s hf%-{V4=} 0[\! 7AE ; ⸩d84!ڶNf)/N݄NJ_N8 7PN#PNd5T!UdDʱ]@ZBi+$у /6&ZI\˿lc=[.͓ePhQ?IPlP""d;6DʦeG)4BCm.UeQA@jV~X"e%#R/'k1PD+c~U;@D̢'>XBz$u1lbH#*W2WP̭~]D]Ԥ5\!2X1b檪ʳfS%m'9AY>CF62}[[k2bѬfj\gfVYd] sEkZn<9 fk0]b^a.[PBɘY3pFҞg$D^E)-qgHXI.~ğE`;C~8rVܰ^E>~LfrI2aV#?rdɿ̉5tTR`lJo}q *8XqTGk\mG)ƺ{޻ѡSܪb$գW<q}\WQM8&WxTŕ5VB*Jd* baGa)iFBkTOMnBmf$¼~BkHjeK4Ejd&~`< ;MAvR$D7RXYz1"@nO9 Sg5Xb 0#ĝ{-@ֆoXsR B/mPdKo{)4=PVUr?_U;Hfi[O0Y`^zd\.5,,dڸxѽ?N"IssBC ]D Z[̲@T=ꧩ娫=b4YH&iDDf%&27j;jkeĄlh20YPkה{ealzL-jN }Kop'/pJyrߏOQNBT`P$4ik^ƥ֜?G{r aK x\X6\sk~%%\({B2Ԕa)a*a[fh@F)БO b.&CĎ')*̖\CE%C/=[zWr͋ͅʁ]w U ]4+(;p P \/ftDL S U [enVz^ xx^涝qUXWuWy4:L]CR{- .uttjyv*h'@ˁET PbcaCaDeٖ" H:medr&b֊#2 `3"$̨ ZęSi*Ę`y( Tt@niY/EΆuen\5yh(lC"et^-]G->M\) ZHNf`Pv/bf%v`=ez?ȇ-EqL !/O#I%I}25\w0S,5J1m[O#2MGvRH6i"ɽrdzdgfLvn/hsٳx6yݏo=BlL` u@dqٯM..q'dg+i֧s`m @a1H;w65e~bBBbAH*]M[fzإÓ4kpH/pa濐# . Vc¬JG<;񀏲^pܭEďO,7b,ВM;3tEs* adDy^3d'C~|xϠ]LK'10䭓ԏDȄ0Db^蟠ٜ'\ޓZܼf殎VEHQ"@ c: 9֙//2kjPEv╾30yVmG[$+P Ty} sh _誵1%pz_JERFq ;"~&q#N9I Pn鷹o0Qypdj[sF&9|!2IΔMJ Inbrʎ*daJ*kF1OO2t !C #Y"p%o) ,ȝo*e(t q^]x ƙ3znF%m:b;aMgɑGhCWo})x5!PAC7M Q 9Jczk2,P3'Sf@({Zܺqphr\mJǖ2&U |3)^/z0щK*8O_2Kmi>~,L޳fЦbP~8ZI1(ӋkSșxh@m'VbQ!qy >Qq P.è/ik6зRcSgCʲφtܼɱwĄsFD'r!7,Pe}OS*QQ`v2x4ƾ|Xji1Ru݌Y\?巌@.qDMN5['H94d?/eI^θ&2'h/DMtu!Me&*?NLN!.ӗas1BEɝhiqk &Ye#oOTn:|()iĶgk߉Ft0}o*,"dd na6`It\#1-'P6%a5nUܝ_EYM BuA0A5YmxKsD׎`ayWvVa$sDV|!qR: lА;GmgA.Pz VʻkEn\/^xf@lQқ$P@)Ѣ˼3td@"sfQZ"*2]bϕͻ괜!0+ӃOb¹R?"{,{o<&7+q#NhDC="̧چY`AseFԈ{p2H;ī913_KZH3""֒+Wm"5\ = i"."Β."Lh$9;DdR^CL}.kۊb+6N!YjRiT>ΠI쮞9IGEl1 ['x1]i]1"+Q悧E nK[ǖgjG45n 0 ឱT+ b%{x`:sV0E/DiqQK! #dLPR ̎8K6Oh^T\\{eq{ZRJFD`?{/뙆•Yzy V\y&tzdVJסtL${gRъl##[_2UJFH(V-VbLhxBrqXK"3S nK?r0p*QqLQE@7d{3w8aS<#wu~Σby\GGGPu_!V]֝aEnMa8uPmsjhgHdRP5DM}ys<ٌQg$Sш\cw5*'cwN +v5Z*lcl^1L&wlo \[1b!-x@aAʬےqxT*ZUjϵM2 85,9:ͭȭ))",ˬ/G:۫&9K.7MB<^)N,j8TmU [#˳OJL\{{a$؆DIop>Zp%n.) 4HqqʜXcFx71 6;ə!PQv=b ٠5Bm)J 9a|RJgP7ǫɊĜXy'RÙ0xѵimSjR(n!]GA$}&}#~ᆙiA?lФh[$S޺XHRE̸]S9VOHkID) (w0Y&Vasbn6$|1H@诚:96k)Pި[XWgVn]w?nƴFж4+#jyy}@}Cly\`3C[h=r5ɻې]FpY{) 9Hom$5#l4o/CmMU-egh~nĢuяUUHJ"Z.~4LaBd6FsTvcB+,ehR)[ѝx*b+TqO\ԩfxΌ{\AP Ձq+#6'q:Q+VK_ v_\QZogL/|igCҨ4ؼm"ዖB"kݿv{=s ɢ,3 8LGICŸe%[SJvc6nrvtJLRJLhOj!R/Or1?ʷ&_YzIu-5y5hy?^\-bZ))[$t})J'H*0 o@aOavaaTf/ljz\; NM{@}Te14PB\-xkX8Y ݕ̧CQk^F;jNK~η TN#! @if,CfJNF| PA'Z$u!ꂼʱм̡̻ϲi$OzeIәo`4LXuIb%v.kmfkLdg*!R'; aq;sSAh!P4uI`%ˈ9z[18dГ(}k&0j/)ňO#ra Q֥~-=ۣ؅&yMAN2rF@YKG;ՅLWɦI댅ą DwV6`0Lm~<煫7^;q zNcAn0(^ET+06vZgp/Lm\Ƕcnh)/i}}!!0GTL9ވ:&iPA:{tUs9Okd"GahI23)HFcu92 O|,%$چbUGPGnu3 9XtVјaf'0YC! ǴbM(FrA_ }ϗg_L3O? STjb̧PܩHbo2&ў2L`BBifƦӴs{sG%hDgoA( *tcDx&u& ~sNl$56^vS}1 cT#Fu[bT|[?@!FٖS4ïmʩhj"c1 ˺XM@1=Jsu#Nm`"DBD!hC] _@7f{3nV%2hCaw5o 0`3 bug hIJW$rs84gV\}Ӯs53p/ B " A7 B" =%2- 6-aQς0sP]쇬Oezc0a3Cà5Dٰnkib}ֹYV+*bT @sD*s(U΅5O3ZWcW@5) c3RSvilIej&Qdiݻ'wS B3K`a1h4vO# !ZԼNi{]C" )ٻEP'Xlwpk=4 \Gi%'Gey SybJ5a`93,Y[G|i}2tZ> 02%&E^{J]3)vfYحCNDѠ#(ǑoggwYfzqB)v;1F$ͣhRۣ ƌ~D~MKe+BշqkHًJɉG5t52 )z +>LᐛˤݵJ WhU p}-ޫhc3{)ec-m aA5HW*SJJat3g~^0yEh\XFVWH?3ü2ĬtEKZҶ4CBtJf/ ? )vPJ ,ZQ'B}@i4f~yVyv+Br1O=ɕ%NĐNdi!NLGQsUט5{B|ĈO|,$pZ3B`vTOt8D$8DJ|!{9XPz{wQr;%#o~E< p P:8saH+dwY0IQ F-LNBlogisim-2.7.1/doc/search_lookup_el/OFFSETS0000644000175000017500000000065511541757166020224 0ustar vincentvincentt\h!/[AY1komuthFgJ'+,ƋU1k&i}cH5-;&8y;*\*@ )3[v4voCW7@2`KRI!y(rt!18g?nyC'+Rזo(l;FWvCNMF -SE0tE>˂W6ӲRF=0|,1vVW8AUw}` J0'`Xƺm<hN_ >mFCbўз06IUl ~vf:6uidV*=kYvaWɛጟJM{aIRlogisim-2.7.1/doc/search_lookup_el/DOCS.TAB0000644000175000017500000000543311541757166020247 0ustar vincentvincente_u_u_]__u_u____u_uu_u}_4_uuu_u_u___w_u__u_uuI]u_}u}uuuI_u_uW_}uu_lȊ벪jİȓ镆!:<(4##* L3"r_rS,8*5$i,b|֒òfBV TĊ+%dkv`ja*a*'|ĊVK7* HĵFRmc*rRJ$cң",hĒ4̩<}G_9"a6F SIKUI[KKLJnJsi*K궩 Ҫe*3%`؊+ZJJ(Љ+*I ֦!6RfSʪkҪ˺̪̭a*ңgJIZnjj Iw/+2ꪫ*(ď3333333)[ **ԱS+؊]J ꪪKԜ"4p겪2ċ*yJ 7*XؙL+VyF-]|j~MbJ:#ô"sbԧUaL1"h J3"9*)%e65&YJZ[6MĴ̋V]o\8LaL˪a,WT-ͪR߫uGM >Wؕ`6K+ZWn̋)GLi/4$ò3 s|u0",I[z[VNW*qK1s2~ӒFR:pĞS^Q+WmS"oaJf ڭe-̬e,a,rϪ̮F!Jƌ m.a,ںڪiK7$ݻ˼˻M̿eKi=k˻˻˻˻˷U˾뻽bjܻۻ˽˻ak̻i6ܼ˻̻ۻu;˾M,M`ܻSS˻ika|˻.^O7.nn.//:Q.m..Soܔ1.=n2Nm/NXMrsvO.3vH._.N.5//6H1R.66/s.6OVss.2?1//S.W;r37.n2/ -22.o.W;2N>m3223227.N...3/R/3.2 nۅ2Q2n/n...:OnN.73n2..>n.S23o33.n3/.O2/{/23W7/.3:..n3/|ȭnaK˶˼˻a\˻ܻ̽ۻ˻̻˻̻ܼj˻̻۾bVq;ܻ̻̽̾ۻλ̻μ뻻˻뻻뾻˻˻˻̼̻˻˻ۻ˽˼̻logisim-2.7.1/doc/search_lookup_el/DOCS0000644000175000017500000004041111541757166017635 0ustar vincentvincent1P-P0"@1[q:/FB&-ƊɀF@ɀ,Ţ*J'C9:vB@&Ivl' $ںڷimt;te@vFIjmf̙ʭ#q9`_WU9P-nIۮrWm۾unuڀ BP`-]NU:'muuorn۫Uvy~rI@ii}#m4n_bNbvkodֵ{z%',v@dĪӫ@4":H3P,ibm[mʮ]9;VLVDt꩖鞙RY@X(@41Xuddm AnzUwgBq>Ez\Ŏuaae:@b1:vj}M{Vدmjx{i+Q3@DPͪ4#eq_ec _ie¥]ev]%}mL؛eWgN3Ƞ( tRL+=G0]{_Y}e_@ɀ]v,U߮N@V']kkmau\ڀ޹&%[`Uvɀ$fr V;`1@!!_Y}ele6uD@3*&d@ـT:,XtK@>ŀ\"SDvV_ee{(3}8>P!)0!̛3+Fd8nDf%_YsSyF+4@eLr3k@),RqE4i.B完|7|p$ƭF3P+@.GmS`ZP檽j`}Iud p|ڈ@_tQd@toe@ @7@-)W tʬm'սmc$4Ɔ4 #ud4+ d:ɖM`6$2*7*MC肀5s@1)9 mmY]ۭ56muP:#i9ޯ+0@C-t`(MT?'Xʺmږhh`@`@<Lnr4Kbw+~ߘ"Ţߖڜ@3MP6f`dڠiNV@?`3e+bLs4!(n6m2FlP!8b9*D4(֪t6=2D;Z-:l0Bj8`haD40'XT)cC4̓W8xGuZlGErfӹZP@#i1ԑQ!5%@;@۟db!nM@w6hD>qנh@i}c `)]\e¥\•MKm|"Ę@e A0@ˈDe]%[m1~mtf0A8"@99Րm6FmD{@['>i,2LTP%#@D@D$?'eT܀@I Rĵ6mՊ[mnuۭgeirk#a-TxH6(EԮPY$גq&XJP@IF!y@ykjӫu)Dc1!_5)ȀjTiW5[@ñ n?[r-`-@ePՂv!^@`5GDt`M%M[nn]mbvoڀOqߘ'^kyW]nS(XPZ@! !ߕ@9(̈ 'v']6۵jnj`@vO1z۫Vνnn'}^@ kmՎD!NvVbZ֨n֮{ۭmdeS1:tff pkwX‰Fdw@m!F۫}opgosmHuWd$֌P9ḕ^hL$W{J֥áMs$oOkJ#2*]E_6@U u hyM}-4'@'1FV#Xm-rfG4!e0a~uYqO@1`2"0!b@)=؛vljSdi҅@>KKnh uQpȎz8/`1FHܞ0`i]M<&@v 7 @@4e1&ǘ0'xIeV_ee_4@*n @ɗ̺@e3I&j{\Rs4+|;ϗ&Q7@ɔɓB)qi9`@0CJu@~͐7!lߪm,mJm*qL`ƀy6!iӒmٜy}>qSXbt*iޑS'@mO44'}%@@I}@AP*Vi*IPDT.$IFe鹷 HvXRJP8"ZMhuM(ExBbҚf8]ƄN%rsIe_@vT#<3hyACnwkU@0`<"ƄLQ|}_e7%ˡC@Pf`yNi#P; HrT xP<KA|Ţ<<#jTƅ@ayJį>ڷ5aQ5ĩIu*ـcmdbA'DtA0jA|!ϐ`wfRPaI}'g$1b:HU`Û@W0_/[O>0mm:fX@Ʀ\``00e`m׎z\$@äP+GR"Vʢc!éaNfcXɊ@fǍDr)W,dzcbbibƵ[6ls`'@Ǚ%c@*Öa-2#@XƧdAl@a.9#ə=`ɉ@ե72_PE@@ KL!=`q|N44F᠑^i˦m Rӓ Q@$LRGEre`Ges _`I8׌W@iF'i-jÇ@/PՌd1Yc4P2Aq:oP)6Mij鬛6#j%\0՘ӈ)Khk`Լj!ng*T@҃@4HuuV*o3@40a ׸mm%4,٣ټo&ˆ*mZS2/]N`b0!t` $IrH@:@R@fړ@졋6v8"ĵ]`♥aT⦵hiX@`\4_3@$ddjeuB@t1a6@$T饀ׁ@?Z4(#uI:oP+#wB@ul:%@tp9T*D^,lCc4!!=)< рYq4tX<D[@={v{SԚip%6O[nְ@V$zV&j@4*>$m*|o"S1R_sY}eـ|309$|u@} }V}VP4}V?%ʴD??tt g& @~1ͮ`*{4ta-€€€YgD€Da1B€aAaI)eFFI€Iò>taaa*€€€J:^JĀBD@)13}rzbO(h``Ā`Ā`n[Vk:}**ĀĀ A(2DwbLPftuĀ`212$}ĀĀ1ĀĀĀĀƀƀƀƀƀuƀƀc 4ƀƀdF^i/ȀʀeFʀq 8`!m0Fmkwʀˢ*9ʀ2ؗ8ʀm>b. ̀!!2R̀3|8̀fSt&̀̀̀̀̀̀26$3.@̀%̀`̀̀ 3c$fR^PfI\P)3̀̀̀"i΀΀΀hA aЀЀIЀЀЀЀTH8Ѐ`h ЀXq @ЀЀ   Ѐ Ѐ Ѐ   ЀЀЀЀЀЀ`eW"ҀmҀҀҀҀ58 㸵`րրրրրրրրրրր`րրրրրkf4րրBMրրրրi@րրրր2_րրրրրրրրրրրրրրր`րրրրրIրր5րրրր؀؀؀؀I؀؀؀؀1Y1؀nnP؀؀lNZن*؀؀؀؀نj؀؀؀ڀڀڀ/ڀMU"2ڀڀڀڀUڀڀڀڀڀ܀܀܀7EE܀`` %n&n$Dހހ`ހZހ75Q@oI*+ jހoFMa`o݀}Sbހހoހ` ހހ ހ -ހo^Pހ T q\PyDK `9rr_Pf̆sr[r8X9$!`DŽ@2qsTsPu`9`j*"sYrzŢK-9`tB˷DK8`*oZ3 dumuu`;~*u`*%U  yET!=6e012.0 .351.032.0 3.04.05.06.01 00014o5 _92\5% ,214,903,917 S6%3 0 x30<12`4 j00p70058f90n5 % 00a91x7{6757-Segmentanzeigeb12`489 O01xAND/OR/NAND/NOR-Gatter =blaufverfolgungddierermndere Prüfungseinstellungenhpplication Preferencesrithmetic Library&ussehen von Teilschaltungen bearbeiten !wahlwerkzeug Base Libraryearbeiten der Wahrheitstabelle ungswerkzeugnutzung der Kommandozeileibliotheken austauschen qund Attribute Ivon Logisim sklasse referenz t-Addierer ErweiterungFinderWähler7schieberPCommand-line optionsD/T/J-K/S-R Flip-Flop as Bearbeitungsmenü  UDateimenü  Projektmenü,SimulationsmenüjÜbersichtsfensterekoder multiplexer! sr Leitfaden für Logisim-Anwenderie Attribut-Tabelle@Fenster- und Hilfe-MenüsRegisterkarte "Arbeitsfläche" buswahl" !Datei"bExperimentell"Fenster"Internationalisierung" Layouteditor"Maus" Simulation" nTabelle"Vorlage" Werkzeug"leiste" Einfacher Gray-Kode-Zählerrührung für Anfänger : Finden Sie sich zurecht Gatter hinzufügen Leitungen hinzufügen Testen der SchaltungEinführung: Text hinzufügenactivenzeigeuswahlwerkzeug bestreiten clonenotsupportedexception ur de/html/libs/arith/bitadder.htmliesemeingangs-werkzeug  rweiterung fragt 0gif-dateiformat hochschulenjinternationalisierung konstruktormethode Tlädtmüßten orientation prev.tointvaluerefrain schrittenowohlätze unabhängige verknüpft]welches7zusammenhängt Erstellen einer Schaltung von AusdrückenLeitungsbündeln SchaltungenFarben der Leitungendehler durch Oszillationen!suche in Teilschaltungen Gates Library .terlaufzeiten &ray-Kode-Inkrementierer RZähler Hex-Editoradezimale AnzeigeInput/Output Libraryverter rJAR-Bibliothekenoystick Kombinatorikparatornstante textmenüs und DateienFLED-Matrixabel kegacy Library  itungsbündelqogisim 1.0 8-Bit Register fD/J-K Flip-FlopMemory Library  onu Reference üwerkzeug ultiplexeriziererNegatorPinlexers Libraryrioritätsenkoder oject Optionsuffer ll ResistorRAMOMegister  |ichtlinienSchaltwerkzeug ieberegister wachstellen peicherbauelemente inhalte bearbeitentarten der Kombinatorik Lubtrahierer^Takt=staturereiler 8schaltungenTrminalFsten mehrerer Dateienpunkt Axtwerkzeugristate-Puffer/InverterSunnel\Verbindungswerkzeug 9teilerbwendung von Teilschaltungenrdking ly3untumulate hsen9t -bit -wertquiresrosstuionts activitiessual lydamptivededndsr's "-master.circ?query 1.circ test.circsiererZngtion.al gabeeben$otCenfangengeben e halten obenklickt en Mreuzt Dlegtnommen 7schlossen eniprochenwandtYzeigt me nibtle heben ängen kerpunkt elicken t ommendenratzen/legeniegt nehmen ouncement&onymther Lpassenregungen schließenußpunkt{eüsse nehen onstenpruch wsvollen Zsüche tattJtiquatedwenden>rnung nsbereichfältenWyoneLthingwherezahlanzeigen  rechtecks ugeben haltenklickenknehmen schließenJehenzeigenyparti `sGparent ear ance 's ing slicabletion5es@y roachpriate lyvedximate srbeit(entgebernsbereich flächeitrarycadehiviereneaF'sn't gumenteisingjthmetic +ally 6k bibliothek 7schekansasYound  rays.aslistZowt (enscentDii]-formYking sembleriignrechnentungich Aen'ts  uzustellenTichtekeley Sücksichtigtkhrt sagtchneidenreiben t  ungJieben enftung Men sfeld4änkt ung^werde Fäftigt lehenidestzen#t>onderes rgenmser Pe-tandteil eXehendetimmente nSungenk bestätigtta -versionen 1gt rachten teffen Fiebssystemsoffene weencätigen/vor `wegteisen ußtyond zahlung eichnen xr Wtung eniehentr ogenegugvüglich ibliothek en #sklasse Breferenzetentld datei ;en enr *format schirmkopieMnaryCds ]ärDersherigent -addierer erweiterungfinder gray-kode-zählerwähler Vzählers _width .getwidthbreite n4e-sizeds .getmaskchieberyte~nweise idth .createGse lacknkueeibenick{ow ue ättertodyhorisknus oleansche 8n 4rrdersBrow?-inAout@edstonthtomunding s .createIxL's esJrauchbar en?t3eakingitenrs ndon iefly$ngening8stubbles|chstabeffer0's|sgs ildKing t-in fnteqrch,sttons ytezw ündel c-kode alifornialedmbridge encelnotBvas;pacityrefully +tplriedotsy-inout[ingscadedes tchegoriesuse burch4eilingntered\rtain-hangeds"ingEracter ;.digit CsEgeHeckbox edipsoiceoseingristos@irc leOs quit 's wsmstance slaims ssicalroomear edHprops sickedingspboardockQ'ss ne ableSungenkcloselyr5mpJodeIsle-lectionvegevilleYor 1.black )reded?ingpickerumn s m  |.cburch.gray logisim.data  .attribute bitwidth ounds  direction value instance -paket  .instance$ data$ factory$ painter% oker$ state port stdattr tools ~.addtool library util.graphicsutil  stringutilbination hal s&e1dMsoes)fortableing mand-linesXsercially;itment;on unicating3pareds:ingsonWtibility_elledGilationPerlement ing,tebdly~nessingxmianceVonent b's factory Os1sedressingutation ed'r  Zarchitektur#s ystem s unceivably*ptkrns|denseBition s_fidentDguratione 'd newinstance sdingjlictingvusing gruential^junctionOnectedingEon nssequence tialider ed ingstents picuouslytantlyituteXruct1ume5dtactinedingsendtsstinuesouslyradict.stibuted ionsol-click  ingklick#lledsvenientrtedwayordinate  s piesying right n-hinweis inhaberPs vermerk edrners&rection slyspond #ence -ing hs7st unt ed r~'s .gif data -objekt .get poker -objekt .classingries]srset=veredNpu.circreatedsing s61c-klasseci t cur.getvalue setvalue  updateclock srent ely&sorve'smdstom/arilyVize d strs ycle d x.hda beiPdurchfürgegenhermagesit1utiningn|achgerkbar(ensagungenn^rianQufhinGfPgestellt e ninLkEenedvstelltung |en}um[nter )überhinausDshesselbetabitsei dialogen format menü namen8n austausch bits-attribut feld  elementen5verlusteumvonyszulßselection.html  ctable.html  omem/hex.html  index.html  menu.html  poke.html  nu/edit.html  file.html  Vindex.html  pproject.html  simulate.html -winhelp.htmlAopts/canvas.html index.html mouse.html simulate.html toolbar.htmlprefs/cmdline.htmlQexp.html cindex.htmlitl.html layout.html template.html ools.html window.htmlop/delays.html /index.html=oscillate.htmleshortcome.htmlsubcirc/appear.html creating.html debug.html "index.html 9library.html Jusing.htmlctutorial/index.htmlstutor-gates.html orient.html test.htmlxt.html wires.htmlverify/index.html multi.html Gother.htmlnsub.htmllibs/arith/adder.htmlt !de/html/libs/arith/bitfinder.htmlcomparator.html divider.html index.htmlmultiplier.html negator.html shifter.html8ubtractor.html Mbase/clock.html _edit.html xtender.html index.html label.html menu.htmlpin.htmloke.html  robe.htmlull.html select.html "plitter.html 6text.html Bunnel.html Twiring.html ]gates/basic.html yuffer.html constant.html trolled.html index.htmlnot.htmlxor.html index.html o/7seg.html button.html dotmat.html hexdig.html index.html joystick.html keyboard.html>led.htmlGtty.html Ulegacy/flipflops.html gindex.html lregister.html rmem/counter.htmlflipflops.html index.htmlram.html ndom.html egister.htmlom.html shiftreg.html plexers/decoder.htmlmux.html index.htmlmux.html priencod.html selector.html aktivert ieren tlingsbuggingcideingmalsionoderreasezment ing ws[eply fault ectiveined ierent e n7ngitelyEion5koderlaysete/d's`ingve d:m onstrations schaltwerkzeug elbenultiplex ern)enJn_och\selbenXypendings)rVartigeenivative sedjenigen selbenczeit(scendingt ribed^ing ption s _e Zignate Zd'edsyred%pite}selbenn Elibrary-class-attributweiterentails ectedSsDrmine d sutlich'schevices ^zimal formatniagonal ramsmedlogfenstermeterctatedUe0jenige nnts?elbent diesenYrs~mal6ffer;encet ly4icult iesgit|aleen >rsmensionsonrection .east qslyktefnsable mdsinggreeppear sclaimeronnected ion yriminatingeussjedsh}kplay's ed ing st3ance inctionSguish ed ingribute d xing on 6orenvidedndrsssionororced!ocument7ationedesn'tWing kumentation cenCiert Kern'tEeorppelt he #zuklicken rthintRs uble-click ing wnward{raftingggeding wEingnMs Kehen ti eckViftYtteneropz-downpedings Tuck Nbild en r 9ansicht Aseite @tähte ˼cken[sun.java2d.d3dHumb nkelgrün eplicate  sing zierenSration1ch blättern3führen t3geführt e schickt laufen äuftsetzbar ungMtestenzusetzen ingürfenIte Pig e.g  en_mpleTsceedsbption ^ally shangelamationudedingsiveuse'ecutableeJdingJonrciseisted ieren de nPt vngms pectedXrienceTmental Rell ierents lain |ed\ing YsicitFlyzite orer ing 'ort ieren )tressed ionsclytender ssiont ]rnerreme zellentemf abrikcesilitate (s ingng^tyorulty ilureWrlylllen6ing s sche&miliar3nUrbauswahldialogenpalettester"st0vorednfiguration en sdialog (ieren tlikt akurrierenden Lsequentes zistente tante Fruieren Dt ktorggen kontextmenü srolle pfzeile nien[ren tvorgangRzugriffcrrekt#ur umpieren(stenlos rewaltreisuzung xursiven ziönnen Ete Dnmmern \nftige cn rzlichclabel'sedRs!oratory3chmann@den8ge!nguageBsrgerssen[t clocktcherter Aufenden längenkodierungnch4jwyers yout's-editingeditor sdveadingsl3stben;d -bauelement Jematrix!iglicher le tastezeichenft$-arrowhandedQrightto-rightmostVgacypllyenNsthrer ichtstenungen sfähigeskeittfaden sungnen *aufsbündeln %n\gth Trnen Xsbarkeit [ensgtterszteFn renutevel-trigger{siable {braries>y 'scensedes%sorefern t gent$sfeght-gray6kelylovmitationedZsne'sards ie nzug qk ens4ux;'s stedingste-onutle ve 9zensierenz bedingungenen{geber ühren\ieren Ct unghnehmerurkunde xoad edLing ys3cale :identifier;s#tedionhs kstep  2g-fenster (modul5arithm gen&ingic al$lyscheqnCim's  ;-anwender QbibliothekDen  filename.jar $menü"projekte zessjngerJokFpsses'tTw-orderer-orderst-order läge ngsIuftßteschen t tgung ckemachen .ine-readablehtintosh3osdegnifying in =.pngYtainingNjor1kedsinglnchmal CifestApulate ing onually ellWfactured r syp pedings+rkedierent enstreife&schinenlesbarenheds.ter utchesQingerialrixesZterus Jbewegung klick s positiontastezeiger1ximizeumyrbecleanqeaningstsuredmentdienumethr  bit-eingang leitungen wert Ue nere&n r fach mals vinungsten @sldetung Om-image.txtberoriesky ngeschenhand WuV'skey-d [s übefehleleiste kreferenzwerkzeug rchantability eged bkmalen tHssage.thod e n aufrufiddlestght Lkroprozessoren clliseconds nendestensiaturemalen s.ize/sumnesotaIuend:sschen gungAt o-lizenzageteilt te ilungls=xedod ification szedrsuzieren "t ung^ywing Qul9eAs!;schnittstellen-definitionsdateien  ementaufnahme&st use's-mapped event ve dment soing rjadapter sulti-bitbitple-bit inputx Cer 's s icand tioned  r  s  sTkationzierer y  tterschaltungxM'sEßten|öchtenglichenkeit enssenrn5a194chdem einander träglichil{ve_me/dn\s^nd-gatter n ometer-widerrowservturallyürlich erweisevigierencihtearestben 1wirkungen cessaryityTedKsgatedUionveorhmenithernnen$sted\ingHtworkzwerkeuen rve.s ktenWverOw"line>y ?val Aue nxt gray ibblesCceMht-angeschlossenen -kommerziellebigAs  destoweniger  overletzungedergeschriebenxrigste mmtxochxmalsisen o-directional)standardwires =commercial entheless_r-gatterdseitemal wenrweisely th-edgePfacingnmostLsplashtably cherhingices)ngwendig !enwhere ull enmberedsericmerierttr tzenungächste=n Or $her rdlich Btigytzlich eo{b*en ren rflächeWhalb 6ste higen&jectcode Os kt e n s ligations~scure ervableYedtainviously %ccasional lysionallyurcsddQer ff-the-shelfenbarDemnrXingicialPzielle set tenehne :k=tober lderstPmits}tedJn-screen ce)e-bitinput[line$tickslytopen fed srands!teRing onen s,orrenpositetion-ally en sr-gatter s Rverknüpfung~werkzeugangederedinginarynung ganizationnrorienteding~ginalb-gnu-gpl{versions  #-systemen(cillate  sing on sltenseite >zillationenierte7thersewiseughtroborus .orgvst  .getwidtherline6dput's /-master.txt 2query.txtms runsideXvalaer allflowlapVsshoot Gpablo {ckagege #int er  .drawbounds clock label port s rectangle getattributevalue bounds graphics showstate instancenr ket ae _nVle nehpierLragraph enllel meter feldes s ent itytialcular glyess6ywinder}ssed Bnd{sieren 4ttedingtent8efragenrechts verletzungternßteasculiaropleXrzfectormanceed9ingshaps l-skript0manentqission ststedsistence bon%entinent8ter :.gerwinski fad eiltasten5henomena ilipysical8ly *kalischenNieces En's -werkzeug sned:sxelXs[laceds ing1innnedtforms az{ieren t eseaseixersBus +ng /-dateienoint's s kedinglygonorp-uppingtular p rt -objekt .input outpution s s1itionening#sibility#leKytatoes enzialfreiensracticesxis$eamblecisedominantfer jences@redisparesencetrrveingsed`sting v  .getbitwidth isfullydefinedprevent&iouslyDicemarilyy!itive ärennt ableGer ziporityuät senkoders vate o beierenlematic&ens/cedure ssQedRingorductktsummenausdrucktermefessor8gram's/mhautor Ien obezogene "ne n ysfensterns ]unktionen ?ierer *ten ung (ng sAs+essesuhibited _ject 's  l-specific kskt qbezogeneFe n fenster)menü 3sminentotingptne pagate d ing "onertyrietary<ärRtect edinguon okoll &ieren t 7ungveideds ing  Jzentzeichen äsentiertHfungseinstellungen seudorandomublicshedrzfferlleds*senkte nsrposesshed ython fädagogischesZquadraticlityätEellkodetext es%ry>_file jstionableick_lyne-mccluskey-algorithmus_teotientr'-s9acedix hmenilroad;m  P-bauelementosendom-accessnessgesre%teher~io ute wUe-enable:achedssingtionsd--enableonlysle-worldistictylyarrangesonablyHceive;d~singhte "cke snRlichens _kräftigenr}ipient esommend Xed ,tangle 's -with-notch s8ular ursive lyPd'irectionstribute ion orsAundantzierenfer Xence \z hmaterialCringslectedinedkrefusegardlesselwn kungen>iony-neutrallalxs:stero'sIkarte GnularlyHihenfolge n-kombinatorisch clateId iv 4ely8easedingAvantiancecevesingHoadmkaindersember_ed oved s ing@nameing]deredordering pair"ratur)etitionslacedXorted`ingsYresent able ed uing s äsentieren tutationsquestediredmentss set}sistor4zesolutionlvesxpect9ive s ]onsibilities lesourcentaarted {lichenrictedUionsult t .value .extendwidth getbitwidth urnuse vert siewedsed hombusiichtigen Qlinien ugnenng enesigeght%-arrowclick  inghandedmostSsorous-pper[sesiko4ngk-oll balkense/d n Lm  s-bauelementesatatee n !sierenunded-squareted inengw-columnsy alty-free>u'fn=_testningTs terssia?nmückgeführteniängig  schritttaste so-r-.u.s.eaint mepletisfy z5ve*ingwyings chafftltbildendfläche nCung en qsaufbau  details liagramme statistikwerkzeugs#eduleiebenregister 7lerlechtaießen,lich{t 'üssel nittstelle n onreibenOweiseiftart enattribut dialoglich #en tt-für-schritt-einführung eschulenMungs fwachstellenrze ierig+äden+igentzenope?reen*iptedFsLollingearchedRsing chzehnondtionsedingm\edQsnsgmentanzeigets~henlr_inemnrt dem>e n0effekte Hnummerkhon undenl berst erklärendectbitsed ingon =sslsnden tset parateWdflynorquenceMstielle fnz Iriejs2vesFice ing|ssion  tattributes icon  nstancepoker  offsetbounds Hport s stingsqle value vzen t ven-segmentdralmhape2d-xors,reding(elluift-click ingdrag ging!edingpped+ort;comings~eningLtgw~n sTutsKichrerqgehenstellen  ]zustellende[e he tgnal feqed ificance t ly?lentlymilarly ple counter  graycountersty `ulateding =on 1smenü Mierent taneouslypncewdgle|-bit"studentSnetuation s Zxth5ze 8kalieren 6ungnizze=riptelawightlyow!ermall#ernaps obaldeben]fernorttware2-patentelizenzenpaketen garflangeche nrsdelenten!utionsmebody{one0thingimeswhat}ereitEon phisticated ionrgenefältigtierenIurcethmostweitZie e!spacein2ltenüberschriftenn=ishpßBeakingJcialist(lyfic dallyedsyinged icher  r-bauelemente abbild er Rdresse  lbauelemente Kibliothek tinhalt e qn9n s tellent ~zellenlling zielle n /r fische hniegeltlenrit>lashxitftersotbracheWäterRenquares:rGctaatenAblegesmmentzndard R-dialogns$rtedn ting =klasse tpunkt sIup te C.fireinvalidated getattributevalue data instance port value setdata portdmentBs icng sche ticsgstdessenusyings dattr .default_label_font label _font widtheers hent igendeTllent plsuernve:illmmt*opping#rageeDdYsingrangelydengg-dVich ng util.tohexstringongly;ukturellen 0npub'ssdent'sen%s Wienjahrwpidrylewsören Id `ck0ub circuit 's sjectedalicensemenuitted)program,routine?section squentt$stitute ing Eonen=tractKedDion>or indern .ältnis /mäßig ificationy fkaufenettet Cleinert nüpfen verknüpfung enürzenlangenufen Kegentzennoren9usteängernOmerke Citteln +utlichnünftigerweise jpflichtet ungensa gen chieben dedene nobenönernehenionensnummer1tanden ehenEändnis`uch]entteiler -werkzeug (n 8t@eungxmical8-barlyeskal @e nrauen ct iebsmediumursacht %e vielfältigenIung waltenteigern sen ndbarkeiten de3t ber7arbeitet e seinstimmungFhaupt klasse lappen den ungnehmen immt prüfen gt  schneidet reiben t iebenjetzer ct (ung 4en  ?ichtlichen sfenster pringe n  [tragbarkeit enlichenCrweisestenrigenssking s1ryt en{rap.pedysiteP-enableingtenKongteunschhrdenählen trendresrternschen=rdenx's -plattform1010100norwor -schaltungtermeverknüpfungen xx y5earsield%ou're vengest*rselfzB.b zahlen reicheveichen satz ne n t gentle nmlichtlichenpunkt weise ntriertroes iehenlenGmlich}ffer nmmermann2oomingGu erstfallsgenerator älligen gehörige ncordnet  schrieben(icherttandenen reifen GiffXs pänglichkommen  ,ünftigen letzt.ässigMmkindest=nächstrdecht,verfügungstellungück greifen :kommen liefertgnehmen schalten 6etzensammen {arbeiten eführen  /geführten +s stellt qhang ängennlogisim-2.7.1/doc/search_lookup_de/SCHEMA0000644000175000017500000000006611541757162020033 0ustar vincentvincentJavaSearch 1.0 TMAP bs=2048 rt=1 fl=-1 id1=5658 id2=1 logisim-2.7.1/doc/search_lookup_de/POSITIONS0000644000175000017500000022140111541757162020460 0ustar vincentvincentaaa? =5x4n[%VѥL$/ƪ@eԠ2 9I x03Ÿ'fu0W2!AG6rL h\L MvOZFd)aS76_2 9FAG39s3\=l3s@3]XsԔE~Af2f47嘏 f @أ[ fx;LF4;dskQ&ĮzѦqrNJq/\\׊[v:5xϳJ e0B! h3 0ʆ'!{ ǜC_Q2 6]$gVY/a=]ڮp\'ۈd :Y=0Dba9,e$en= PȔƤ4+,UftTB]E\# \j|6ǜ\qz)AN7T !P gah5> l !R*P3D<4DLUH]􏱁pcZ5SM6>]PѵE܀5Y) 5s9 1M1 w?sxs>k)$Rb0s,AbŲD#mDi ߴ&|[ 0&ᵫ!.xlH-L2Brlִ# J00f$z4CdUmdt[|<RuswjRuWr[]#kǹ+kթ*cYY)U?RyۙJ5]{}P 0r 0h51TB|F:+}aHNgcw[n1l٬+{CNf{x$oчPSrAċ':yFuim[Qn&G2) Mrf"e8TB!Pp' AFjGKDFlgCem(Z9QX,@ (22%% h; 5\#"[w Z퓧:-hOa$8džK )ǤjжD%d.W@|x!Q\"px ] Խ߼zݧPqGHxɔI$ȴaGo-Cde*>1M c->8a?1T\_yF~ s `!,EM;BrUOYGit@uàĤ#a)9UƎzoH;πpMƞ+#=UY~~<q4% =DQMݓ?-y,za6aeaaaQaaeC'X{;J>(oYqa&]-؈&B#`FT!`m+[ğqWJ8M5K5omM*Sf~gj"9і<FϽe:Ÿ]|ŖIٽ`ĔƤ4+4-Ft7llF,UPѷE^AYO<9 qaffOVyLyZ%9GeA08aБ Bt˓ TA}|O!Z'bCQ+0TUU6Pa!UJOcwF,pˆ2 B(w #% p&JzU (舆N  *0% hc"HYT9?B~Sm`N?Q/1`ژ,gIqhTK } δs{/G?g^mr51~4kgU64mhZ;ctՌTdM#u0n+G_@ \2b! h";1 ?!{G^]ndIݐn6!f)RF .Q-WoMEܞB4'g^ػ ў6"5ػKѲ0Tj6 ;xF@C(7CaBLY(: 0ŽM!hky&#WDʄ1tI3R,L&( L.]4KsD|\M4L g sGNQɉ 0" h3I* HAկ|0EX)C0=τyl By w+&5YXBQH Kc9pRѐF؄|Β ( 6<"*1e2-Np OI|Ǫ,A,1oe80%1'J5UVǖ*I~C1DЄȇ؏u[x`Mt1& RB Q1I/8;LPl!O9$ͪ?ij& >c:(62­e ߉?5E IA(!vB! M² *#(5<*9S TM&:) mpprtJ~iүMg3MZWU#jԳT֠Di*A=*#UWTjJu̫>/A~jN˅@h{1G@H3JJ끳ع5uƮ7}Ies` P1‰,гL Pe!gQP%h嵓1E7לbD܎H  iHBG-G$ELJ\vI_Exz մ.YDᇆ=+ 0$6yac$ĐZC͊ƨ\lȃH *s`m`Fc0R D:W,S|,ж 9ER`OvOx$R?X[>1DWXɛ_=?v2&1KMg.l7@)BD?TU-uߚ^3080tʸZ݆$jăaFaVٹ`3H )[ذŇ 70[@B@}d. NZ. 䱄-!o<@2 9I ;AAG>Ww3[7^򔳱̏sŵuco.~n[xk[TWvohj~\mhl6NoA-]*]I*4y[+jKS=z::yTUCL=6$IjetG"LI·N-5u VjUwݶ;'\YRFtϤ%h^ckg]Z*rNR?="DD\I j)6;F0ɼS+ISlȗ3.TkgD1XāaM8R(RRU{(䡀W3vdZmbI2Rh;-wyH}A Ȳ%ey.LF[ЌhWJ@M;;NM>X`',VȖ. Jd.m}l) K`$@Lx$6G2fGM0Yeݿ]V#y )zjf`d Dކ S& &N|luQ9t$֙Q'@qlU(F&29ew rxNc[f/n^-f[*v.J' VJsF-A6%џ}5/Hwalon;1d!k~EHl"C~Ug{d׾`9.w DhڙSU|q>iV롌FOj.ET Țq5\yx p䌹[Sʼn\\;q"F*RujO9O{q~h"F+LO{]H 2g @V J׻$'E+[(f{]2ɔ5=GJٺ)7gH0Xظq}ݕ]{?Qf2;_". SY6kz@["V_3UU?Qw\ &&+5;WWXSڪ;5әw&}o \ 2+JN*L` e/ ]ٙv@CiThξa6aVQulAz o }D#E!B (P@wjI ߌ)JJsqQ?d4'YRzFj(ӝ3 9n㊡ Ԉ@g @1Bpk٫|q KQuڕiW\+^*6rfM.a$rYrS cOݔ̙Gu+s d D8 &mbqbN?֐U*qX 0͌ЭPv|f䖚 3q 0 RY݈ ;ڪϊc$'h7Io`s-\cA*+ eumBrL[ TF*ț%9gIb>hoy'}%]2[8dXLõ x("ZV잣,gԹ!iSS[\)ST:bc-v hd')B.,(^#s}/LXxZzb ski <IH(Arz;}@.!RWiEjV@Y1),JqfxuoAs:oЫǵR tZs΋3.ܬ]I(m(X7()C%>RW &*QY9(5w ypjEfwLzFӦqJ@ N7JIJI=;RuJ#/οޓ_"% M'}?n0Ǽ{$L ` $)5f5ZsgjRtxL.CLD?,L 7 YIe͌uI;'m޵L/3 GS"\OÌ&` qEJbCQTHN DյdVQ(Su;F/*ss.+cnP#8Ĺ]Seto@@(߮D7IR `4!A@@y꩕z'fᓴV D;'w$Y״.$.D-Yb>Wz{iVN4,²V,"N6B3I|w)@'Ck2\pv kt]H6M(T0s$"mQ ߃)X.b17 `kA$کJMVAoE* H_Dz ]gW;l 紾#$wR bPD$aC71SA ~;sq8%΀ϐZjSqJSHU*+#9"'P#BD&T3( 404QIȯ5'~@tCxi"6L`Z'*첫Խ )TfLqhU4C^yq{tzuAP) ޞedXqq5N4 @@9)E(}Q9KIҽB#T"mwãGʷ>%r%f;~/ R<-M_O-M9cÒ360 گG{y&"7Y(O9f(R9MZT1'2>_*?h0ZRh!E',h<AD(%LhSIb%= I/lMk//z zjL,[z2a6aVicu8MW[CZ)) (PAbߪS4!OLS?gƶ*ŗҡglQI(\uywtXьDc ewnOX@n+DB3EBh{'\bbWba]2QPGڱ^Z52*ke4n\S w_aPYo /6,~W`q@(SBR;G @ѣ\a3am -)! ߡ7 B6/Pz $AH <Ϻ츦9Pp2y/qqRPzRQbU'L;HVp[4ϐ̢ 7\O6:o$lc,t9K'L q Gcvܽkν5sPAEU'͞m%RXzr)992ȆF{Agl2:Ͼ,vߍfgf9XZר,[(/|w'#NzC:)I`~ $:,HSnbxkn[ޡl5UNbkɬPضj8x)7OgVS=Edی7"=5i49`\_3dIS AD5q|1=Kq}- 2 g} tkS&* TtP5nH! eGGGeREhe2߃ sSON6(ZJ[4ml ֖m]<PD.N3 YM1j ̊xeL`3ICM6.Nv1x9èβƤ.:G ʐ#䥜ĵ+Љ6[?[TPd[3ԊYV`8hA$R5{҃FpI^jaXÚeR9ZL*VB!@h+q '#ܯ/ڢTƗ+?ԋZŚoS"vqFX˯P, +ae5_#U#ȹfbuJr^D,}҆00⼜<=d' +"{9(MS|fHŊ! aBۇb.Nqb)1H(sʳ7MIąfDRO-NKNfxOO<7Zb;/HSP lKOѭ#nc-&mXiF-KFsG^2YƝěڑcZI,hG[nE࠼7X ̃+< 41L ć*2T&G)YrJ x+=5FQWTsOCgU:BfF:2˙L%]evS1:rI%LY/Ih1ME}(*s.n0Ԩc-IzS5vne DXSGZ7D*z$7#$ Ә$JC#$L5MO|QX0 8aɤ4d5tG̒@09AJIؗ4}bwH.cj@ Kq7?poI1U\z#ҳZ+؊^,N}@7ZÔ㢃ϞeTr͹+eI;(  Lj*&{ȍ;eVҬfF[UXinI$iآ WWfP a2!r!_D(9%a{U%֙2.,_ ep5VL,0I9pu\q6t2#,S4ЄQ:*$"+4E#moj~YzrwI1ӯEԿƤ{|T}p#kʣ-42 ԃƒW My4̪ҳON ]V6]T-Ċaqε$;N+qNR_;' Ck24ՒȗfX8՟^0_Aנ5%h϶aVaaD0,yBJ7eR1֦=|8B!@ ܢ;%#%߁ti̫4Ow$\lLvO%~bz0h[l'`~]9l( _DՍu Wl#B_m/pE}ž9FR)*KГ9]^-I;HǴM#Ǖ'EtbMdKǼ9 t5@pk1lۙ;!`hNL{iD> yd'LĔ 8.?= b!q7ciw&21i(iOM[YUΫL4%㵌+=DQ%VBLTfM.: (&iFl˪qm,/otVl4[+1(ݧ*K{"WO(L) ߖTXͯihsGMTeц4Wo 5o&fGR/QaNLd^-IV̝BZȄMLZHvH!kAz N Y3ҙ4Em(ZXҾR(쳘Lk^/IX[RkRČ60gT} hqH\5Uj7S$b fI5<2hvkN~uw&\a>h!A0^E)ȳeYweHwgb񊰁z r@$@(Дɤ3GM-F]RngQ}"tCpC)L c$5E]KlIY~r3HvցZš(A&ɤPq,rsiex4)4IG\/b",:U1k 9$ e}Cq+ J5eskUIB5}.]caO!Tumf["23 眰B @CܼT>?_@k՟oz!Yf:۳O[iQ4B}G~kcqO5-Dz~;]IfؠjsJ`yo #Lss./++xrJ(/])Tww ޔRk6WrR*hL@\[ β(;n#Cc 5&>qxѷ7q2͌ HIzZ OAYsɦ!VєgvI.S2,~ ،#LOA7QIN) M_\txmg"++n)h8m|b%F(L EĦpiB*r!Qt_Ļ+)]W]@pJdRZx'>F o"YL۞ d%QLcTQC$x"W4G fQ[yvsy,$ (t1u]%qL}-Ŗm&9;e a(hH1 Jk} 2v(hcʜ:&[5x_v8xє^TYݸ}E\dwjuP1f'ꀃΞauug{ekM\Ffa,  Ljv:dT&&z'] c2[ /#"'$rm64D4c x yYNS'ZE+Ad2uPzf';s[,e@|6Dv(sIG{Tr@ 4ˬngv'>&-Ɲoyg/ͭѠ0mhQi+-D8fL Hd nB\:&LK Hu'xw2i#aO[A=VHgvCyVfg>"!(ݢx#3BLsaXZv=PI쒎YabvyfE+!ZdTusđwSeU4bf߄l(uCژPBꮒ!2KaL§nê]u6BL&`ҀuS)._PfG4$_/}\h¢qAGFֻė\"<ə{Ι y ;[7EMFƾ0iH4u5Dw 2|LܹW>Fr b@ǖ\bH,PK {e,GKu]2 5 9׬n "h0eIѢ3QN#>,VmiN)FtAXҹ {ب !@XOJ8b $o/~šh8]F{a((У qs}abY4!D$AqͲFaT$JkԄHV x[lgDx!L"+!a48`39X# ;c#Џ;B=k#P?i=@\-G\#XG,fJ I?X1jlM5|b&0gMBl@F Fi,JM}tN9}ٔ~a&h`Gbm0F͕se{[W,лu}yXTFI}1OJFP*C4A>!c LÌ1&;` "-'I/-VKLw DfԼL`WO@*ugڃ$N]Pd0C(!ĎV dc}A}tdpqGqFf@}a2הѦy&^ug:zgĦ~oE>.&sWTk+ -5p3ҒذvTT8A3'$S.^DKSJvμdF IǬDNZfJVm|lT۫vFD6i@.;JIK5'Wկvugư(!!f19uqYqSCs@+ruf҃$"V;~{r D'/;L/E3Msd5͓46L\;^>W@E C(DG9 hYPήa6aOa?aD[W4Z0FM!5Z}]f=FTk%B!@f1JKnqN{نG<^f|TږM!Ub*CcH_DEPWxi ոAf]Iڵ XݦQ#W1K%g9k:דXKKLq!t$1Z{ I-LX+?BC={ [U%7D^HOD߃?3,T^ΐn}! %t)j*2փe; bnUzfØZjWܐQ.vjf}]7o SΖg9JNRV.:"JքD rʙmŢ"„a#T^5Q& xbR%a&0K%`o. @̶0)^S5P͈T 餇 }gS8ti$_zp+G]f$ș=$6)˕)X/>;2HW4.^43!`;#RՋ{,0/RQ1Yts qoȼ[8ys۰3H'uD LT$J6Z(CB(= 8Xգd"=q:N3MJvr~:P`GH%  qaBI,`Du}O܎LlO0F%,haFVaOTa^aG]xp5&aJiQ|0`l+mc!;I@ >guT ttl v`l9{[63xD AzHn.8)98[|{kHtΑ<'da36Dc _*T$a,7iVMCYNY0[(]%$l&˚H"]%;d.6 KVU+6TmF9ia|Zݦ17s͉"|a#=b@#cէ^L#@$jt'˪e2 Hh5pʎ!RpC;τ_WÊ.}@26$g M}d m(G@e~#Y $و{2b7H#@&c|XD*5ΈJR" *8b0rZ *# `lbGɴ|k D7bNJy/4&v@YjicNyE|v$R;ҸhGA1|Smb38cCQ}i Uѳ&n,54vxeYÕr9$柜'm#B9vrSZFT"!%"@ddcAkFUVj@6hlx4=:j?Ud+;_ee~Z d)A 2%3ҙ3w=]=q.MGڇH ,لD9` Q! 8C@9y:@n9 e$H!r Q'"hfDfރxb-ـ p:b40\EPk3!EG@0"+)\$nV-,%~򂭋@g$Bη[і4GTeFӔDxb .A4ƿs΋,SdC-` (  1CCKQ=L]Wai7u0p+ <~-CWTjb #2V*{t.K̕gw1Wr6[KkkضAA@@.yʵ-f'r"JybJ0[No Ö^"kV=E{RnH 5O)ceOҪY.D`6D\v*<:$cY{cдh[2$1:3;Ok5fhOPF[lFS?)jcMqpYAq\6Jly} o^UX+s " *V+eL;s[#/lN5po:d+\rd_JGyԋe,C%(CӦ 1w#$Ikzw M `>%ݜ_A9pirMH胮UFcřc۰"   Lj]!CN))ks,yQ~$4.f:$WnWЏ%6Qgʩb[Kfwz֬a<n{oɋqk"c<%ssHR&ORo+9_iGcj÷zO*|;-<"MQQ9zcSzr`'2[|Fh x-ta2ܞ^'a:\玦T@s1%SW4jۘ+u\"?EںӖE{gihBI1iI /":'[5d1c0,ˢÐz*-P|N`'$1ǗC!ɛ7s'lIkЇZڈZYC&uV,6_W d@v8AP&lN[yKEYYj`xa+rbD@>$ fDラW*[#Z2=ә:- VJTKӺTK+%g/L5K.YTה `3{>32v)ʮ  ІjjUۣٳ(µ}ѧ0X9rs iYߣMhSFzEǿ2:)r>Hӡ,٤hֹ&j^7 =:S@9&Bգs0"[g%Lh9+Ywjav-`z\خ`+dweHzA )sҪiB:N:jٓ+}Xt` .|&]/\keT. @A>)Ⱦ+`.dIn̫SDBzG+NCCHh'-Dۦ9ߒ2K.2J>k-j0ă^LI$ 3Y|/Go !VxG.YE( 5HZmu '`FInd&W`4#tG0A`|0 ܈9:'ù XG9v<6PIalHeXݣ%NeYY3!@ "9JIO-(k%wQ!'ߴ3BiT]q懀@@&i Д$\-/;?Z)5ɹ;R|Ie@rJ>xpUwH0  \%gTVJ)zdHˢ5-%opڎ&؜a?FJ,T2>E\ˡ7k@A`!c2%Jmп(f[y.K%*&OGZ)_XB@ABVc9ʫ;_%P&ՙ*:WpX%Z程0V-#.1=\VR)(MW @깚ƇD~fzKw޺ŋ*vU""_ m@m)*ʀ`|Dsqf 8 H+@"#}+< XJ |]@ϫ#%2e"ЪIgjkԪMf4 [<(IbɜBքa!m`ATYCV,x>W"Jc><}(F >"e4u.JiWUwq$|#K+WZnrv&Aebb[ zmW ʹ3l)$: 6;Wx>,VndHDԐE;.xѴJtOuBa(@?CX 6PEzfUi(7k|м?-l^E5 I Y{r>IN5Jܮ`_I5 v^ KcfonT}^@@@FnۣE*+&=1b&Dugщ>M`r*o,0!۽*pbr*cTtW<%9]Q @](KӠzS1BuTUkNd;Ey,hj3MX[( Lt䇈ِ=2Q<:_~oBػ?59A]2z|J5|=m =8 nhte2E 1Nα(0A#=; B46*]6FL{3HSf+7r%y4*aVa_aO LJqǗoUXH[ Jl gl 8IͰO#Ap2uJbP(L:`ҸsAGeLu)6MT+'8a3'BKM8:id`a6/~BEkN֒t0%.C S}Bz+#C 2!by+# Ps`1YMhL|R(s90&D(4aQBګU2mOlhIm\E Zbֲ|0}4咇IbL XkI9O V;#nlxoXd/X!oXe6+6-Ƞ _)0 _ښaS23"yZP\I1&K3!h@ΣWW-7UsqbifRa,hFʒ9<PR%,^<`-S^dy1͔ݷS^dyQ͖QS^5%S_e|BS_ew%UvyqFݰ)v=i?Ř$| n) `浬'- NPs9@=v%x롕ZQȃFB]Qlj!c!J:-ƕ):h4.P"l_׷{__w Vqn]mDM:s)w.%z욢Yؑ S4ʂ_:Vfs%Fm}i$MXkHEͿRMB5 %1nR|JsW,4>bUCC<=!%IxkI2 ޤJ AVe!RkI֭xIwZۦFgd,Bj@Ěnug}Dh_bv4&z-LKDLZXoAypSƌ+F<ݼ4we \P1-B3v84P]U5v~"Tڨ"]=#1&jbC/4[d]s^o`4?X7'+cF3A$jzD?,. cdT#ӍW*2 ^_~q*-0# ykg8'G6wSz6Nu׹\+¯T)Y[]c2E5rtoHRb뼛[L%E60{^#2*n~TLUudpDA<\E:s5M}kuNLMTCK;-άRkvQFC 5KK뭧>h y} w_x`G `@O+!=1JWwoQ[AY PqeJ`JqvEeccR>Ó5hc)G ʼn;LJ7v2m+0(bWFisQ\F9!B JC+>Z;1*AFJfe.C&DS̵dQ&+5fɞ" eTiطH_d$ [5XglpojMWnk.U˜ѫ 2DyޛE)2-Xde-wW:El$X63\TbO0߮*5ž8Z`deXk*2htT B@άҿ[1%U{Tk/ֱB^;sJ]-"!/#0cޠ:>j2\ѹ[.ͽ~ŦEyJI:u'vM4@EY@C, ˔̎:D(u&F-8sUm ;6Uեi=Bx"Q hYRw%KNlopmGMkvz9 [bk:++K[eW]˩TqCg5aJc6հ9@"(h1aHUMvT"a5N:wъuZF1`:W}9qW@1YJQ=(u}6-GN~I1`CȘfK-~<۩a.Sh}n2|X9nǎ`4fccQ<Վsˉs[g]&ޑP]c@`b~p8 LG/ [jMVd$$6_3Cyi@ܔbCBV)2mcHLcro*c™.%do{H= Q]a':_w'ǐPwՅKe}=xO2Ԁ~C @`ĉ 1*ȹ];..԰X3 ,,b"Wf[VTJm{$%4P̻4$y+ڭT{(yp7El%a cIwC=,Q]@90d3`8յܕvfYeM$]̀":q XV5H s\m]]x׬qu]Pc\r:&Tx 7G ޖBq]~:nqY#gg1NYy1*-Q3FKnOvg]L̒R'wOVܿWqM>CT%A h CkQdEGtZ=@% 25K9#Aca{r&ήe743HPAfS PQGŴӰ#RdT<[?8~&iy/a/nRZ'/gY[@'L;b|ץS>}''HЩYejqچ6^a+f+hYu?MDk`/L&Az;m)¶&Uԟ,:2ZJٓxtn%$ Yvx*ѺyBS\2 RS_?lz3YMK)=(޲ʩ,쾋1B/@ǀc:VݟqTގ~Yz102d=(nJc:cXi9 E&U~o@0@ (k9rDƔa~FgŎq!oWS}{:"Ն|XaUW-?ZN_ B AP-' rpH+ 0(Jd,ƲߞaT剐\kKh:pA9eʺ ) !*߳RF@kc}f%b({NW.l <ٝ(^5LoQ*N)oՃ$MLqcd"f4LWG8 yfu\rWr*6.[jRx޹^S5]=IW"!e;Y0=yb'hMW:l_dBW.e5UHT QtIeZΆIfLl"%X{.:H<3vHIyLe9fC3N9Y(`Н  BI,!4FL BFlC%#D, CVF% ϞaDxŞ/;(A Xқא$^|\E3)QLݔE˶FYK]ڏ*aPyz,nF;%+{_Uiu}9HDǿD d>1:8 Z7OڨHϧg=mUiS k=rd1' 6@MNۣJBE^FbDբ!TɦU^jҸ0%n:W\MȂ]s+'Rņ(a=i=}=! HًʀK8#h݀ HRelUWCIRnO 'F>nƊ )cܶTщrפ >*5ƝXi)bٿѬNv,^n@.89IKgQYK|i1b,@`,EjioR!LsVޞqucb-?xۼĎٱІTL! +MN5{BR]2ek:,x@@2i(eIihCdu7IOUَRn??lȘ+*@ksIyBW:ffK %3Y;cZ*U#oV([H %LPY Ru)z[ Dd Q4ЦξaDpEW\@nL! b8;̍ zj!LY&_=_{d :hq`#L {tXjf#v0h$༺h?VWػzR$:8sr1if+X>j[ҙ˙ؤxfNw!al֊)Fj86P&32]E/ZPxI.x}]4 p's n$R#/DC~XCa,9QR!$ &"=14Mm۔lYޚRu~Z Ol)"=_]{,뮮0Z oD"`|Ri/*8JqTcty͔eễuDRTҵB7nJFBIRIi'Ah,tL׃~P`cޝDUvl)(>(Rw*NJTQ@OF 2sBiO)RЃ͞qDvMꁺdğL5 IV"ěI.Pi ] E6ItUOfǧw7|A+-ۮ԰#б~ShFD^*%kTΐ?G@#$ T~HYIG:EVGx~"dB!@e- =B ͶՐ0J^E]|)‘S\Bd/l%;Qcz uu]AϪ7']H\FA~Z`ȰD0\P@rcWI:*'NJrr~=@1AiYccAޠ?%t梢MF1)1[eDr/Do\E@p-A 1hc[Kb3kK 8rA2Xީ%TlPaIDS"GQ "O{g"wjND=Kf6!fe&aKuH~&p= VTt@#A;m<KK $,*Q߼sCPfFRnXϞeDnoG>j@Gdxfb".Β?HޠXaryD|NuYmܿ@I1=eJ'{N u8A a ͞q46ﴐ̄ÖkJB@HU$CƩ%vjv2 g0R7 `I=1n `g+Шn+dm{pjjRM?TЀA0@ߞeDqWא2qk1D mF8|\d6#0I uUsAeL!nI eX0A &ǿ0,@(Rs'9du_ꍩQ2_!6 b>Z($ ,*Nb`Oѧ~Y67 ky_g#k [HE5TTiި\`CLvʚF>+*R$,%Gf 8̺w0cMLDR ɂe 5TGp6!Ly1&YT/Wc0(#EY+I7MLNiNJM?I&tda{UM4sezaZ/D!3m3:rwl9-]8Mf; FEMF _zUGYCfL+RޤXQ`) >m2]w-H}|(DpP0 h(DjF3435%Knc_ٽi Cp4֔[5ӀUvd"1q.)4ZWy~tQ kG1Ac)9|OylܣG:# ֥P6"Cē9d8Bp7-jEV/o3D 4C\*ʻx )웭;NUפ afa?aFtͻJzf9cV<ڨ bBYˣD$$$$h&ɓh'mV#rkAm~=B8|ݝ{cO)T}N#Qu гiiRIvJXܶ%qM*: (:jN2fFNv+ڬ=yzr}Y(*AǛK"|%Yosl_YҘubg!2Fnr&[SlRQ I z֚ I502"R!H0rڧ?d ӹO#2G h+Oa/tE]RU0`,f2gП^ΰ1![&CΚU=[ΆKp&~dln _9>5{N_-?v cG-I:IIOr?8Alc=C5ʀ*lQc&"] Luqm)l*vjbhBk<sT7 oLK#q @əʖ%ٗPc>(~/Oӯzú R%+EHyYde&!F'&0qK lGq*e:'֌seY-GahM. ġ;-j&:u43c=C6343Y9ֈlQpEHX\/aq&nh+:,nǕd(yӉ9&ŖQe |?LI\L|FdWſOP(+1;VԭoVt"Y  j`ѴDGzEͭF\~_m'}yxaY0 ۫Ch1 ƩkF?DldVnP^j 1&Yiލh̆ +ӤV#@`CԴs3.\|:eVg7Ic&@, aЌl)< /h-U]׳gZ ׶>tyAZD-ZJ;"pƒa\jMs'xiĹ/MV& ,CXzj%QN5%0 d&L4DUXρhJY#& l%}ؔJO(~%.oHڏvvI;:ϾVZ_6;-O-ouSiٖ敝kޥf$(H/c$c1anJ&Hd CgiKEi$J`"1,@zytRIQ"mGUe:'r.oDvqqڄYf0<9B6ƒC!5jTH}oF/w<>J$&=%L1t6p"0u ,0"ײV(D1P= gjO5dcrcCLC)3䟱Rsa{ch|oKG,"$)3GTF:&}UokK#]Hm:\Ѡiй5QC'DŘ⤕S?_3x((?(`FCFV%eo ݝqT{E2J4d *7lv귺@F&z(&ɺI@9H,F6pl,9Z88a 6E[k:%CyP],$A΅hk ;ͭ;U9)Ӷu^c'b,Dv KfٷIYYR"g'5Cɻc2o_EE;5\HDM溟cR:6H0Ylȇ峜wfKcđ]740Al8B%=8(V\ Noavo@h)!HD$DOvƙ7Ey[E K| evӕxohNMp$"}eh~3/$H6)%܊XˑDyr<%#meSwM/`2mk*nC,0`7V+rdv0Mo_}eT2ŝY(+'d϶!|aOaTcn8﫵h!P5icP9-[6FyYEKX ( ~1G GXᏰ] DÆhǢ1J4ȌQLƨtPc[Tk<FL-„p± ImtZ)]6TrC"S- 4$qvt,c4?{܏ 1%7~^h.[1<ٚa&Ea M - .1Dlf*h~koĨ9cgk@@r'*nrND%S"wZ?"v<ڝYeC(81ȼ*_d fؘjv`U躈gA8T"FS5um1_[ OyPkJ9)8,AEdARK97B3d!MߌNa>RylljL<`6,"")KnݑpL"I'1Q,3Nf0FӉjXB_3BJ!4M54ՋD5ٿ(%sv]窆/UY?[nEY^<#& YP bA;$Jl)b]SI]:&U/fef;XOyY5"F`;i)@깩ʐw9tʲk=甙Q[Td2 *;g \DI*'v'6ey2,JETZ3IP6,Vj=$Z/$)B%[db2,jrWNUкtNzuӨ-h2lX Mu#S l”rǎ!DtVizC4WNOm=$x 7bd5Ef,8 IM_K/jG)ڢ -6\ x@Ȣ9j\k(+oE~j/S9χ"Ek a2jVf^u?` X0 $sfToV*,Mә+0؎LgY"1 jO$\Y\xKVRB[b2[bHǗ$JJ/GxBX.*W (D kDD5E] t2,CSuyTB@,4ɈrXړkN,,tĀ&!3đG|gtXSX-v `'h6H;i/M8b+qciL:6ۆ%#1{^I)M'mq &@yE(ͲU6@'w ]i->-E2&v}3krWD/ܔ1!5)]m1!i֮%Pk(C2W$x`oʯʮլݮuhPàA-LBN=Fh[%#Xj_vU,bA)AP8Q!-XE`;ȑB2[hQjuX 4\gu1Ns P#γB*H5bL0vEENOh }XgESd*nK05 Nɠhtl6]2[ZgIyz܅WƗ ͔ l{\ 7|ߓǾ~w#˺e2@qjsヤaGGZkS+3 GaT|zQALkZvȩSis$ hFtg@?2g&ۮa7P2wz&u^4PhG9˳޲y9r* "QR;YY&#h5pTlAԳdb]sjW>3@1Ind9)Yr2n/߶Af4Ūcѯ0aie{is!F3LINQY;h=o˝ $jrYi&(@Ǐ \6h041HnRR&r~oJao×'ӵҪ6r ĞV)„gT1đ_8sV= :UkaIbv GgcGdGgGGGCgcCdCgDgcDdD0n g M/Κ`FB$AmV7do7fJAN)f}XGKt6bD@999nfF'`~_{ h+T[E&){\_DT8:uDRNVz耩 v'vtYDd3W^oa)2RlL{ Elsu ,YΌ:&ە6Tl51(FY Yv9Yv=[RE%Hj0 ´yZZ(v:(1G rKRȀanfO4ː%PAŔ9eSQ 7BH}{)Ui4J٣W8WhN0ʫBGM6, +/zUޖE{HG3#Tn!s,),K;MLܭSz(U$XkLwkcL+>lhܱI:ejNʌx%ӨƔ%ӨД%XҔ%ӨzN^4 ݤ2Щ3W6BG : > HھMWyhL#oޖy.b V֕>+q(z3*(ڣj1[h=1c(OLKJgKuۥ%b b%b:<&L$9 FҬ(`:nQ5r=Ñjѯ@@…LnKgf4H鞉1H$fM X≽*.3î% L{sD\$!%bY}i+J{dG++TX$Tta@b&YmbA 552+l}E gY4F.D 6mVp;q$̓"nV5Vvn C0TJL [qaBFcA#AW~aU8wi]ĭDSs k(t"KĪ{/d [ ;..ѢAA>2m}ȉ?x2"~i`:YzaX<ɩmݪtaV8fH> UVƖh \vF@>B1*U4M HzQNs]J@tTku"K2VϢx9  4QШnk[}nNev)>1 ckҤxPmmN쫺b0 VX_]#ĠܹXX-m$xJF3}RwJ(,¬Bg焰VKdD{+] \m $ժtږ* ^ӦYdCv55#L aS aer HL6%*6*G4c"c4hAH*%Xi>|9CPCc$)u$3Ȉ܍$}侴WnCYhjkHKTԒR#_\s,P]\M>$ CJx$L#vtN"B-,33+Si(r!}bqR_qץἴ\3:ghb+i&wLpj&͠ 'n%[ {d@q@Dv3!ٙ Te}yK׿a{W%6 h)$ .$s \157$HCl [<™a8Z $AH5(MEUJ(/7Wnjc^lYo m0IZgHfV5+p4G7oS-YR" B Ădzb쀃ޯT`Mo9L.Y''$$oDZ>%JmFth,)֭Ec,YD\'.պԛ]]T_(HÃ0BT;jXWΙA&f䕦 V"+L9b)/e*Or=FdL}8^$;",?6$Cy舙4Y4R;P(:e:e4Ntf)!,e~t<,RF!ͦJ @aSnRS%3vH:;$Ҷdj#2}QI'IE1 T<7X8s[j)nQyXy(i1૛]ތތ 蟵ɍ @am @PXq}UO]{%K8,o}m/ Rʲ RL^D!R%aVeєعC㾪#~{t]i^@d\o''Ro4ֳjlY% dހU$XkLjcȰ ps\X^P#wtWU.W^(3'7p|2Z{?>$7Yu>@hysl)`-p{6;N:X$cy<*EQgf16]0Wւ[-s "֤f[-IQ=y%Ig{uیBLttdⴒbs#K'eKTMRݏ\+=U=ҧ"S<]"Ш]_Ĭ)fAҚdǦ$Z 6<^ 3"ِ7w,|jޜrPRh OyP?MdޭH E(t2꠰ c)>F{ mTqƞD@ʓ7Zfʓƿn&뵚7YWXݲjLS:/g)%9AvqJF*Ta$n0Irey][^\u \\GOC ?9Oz\b43uU)Op*iHC:Z2/"V##HC*7 N,I8~qN64@SXjC4B!HlLCotlCkyֱfXQ-Rz>~;B RuJ5a'P\\dy,WMՌI=bScmOZb xjPx:iI' %WBan_~!xzSi$`Ĝ@gL(boB;8"– z+r]KQ!. ]Nĺ3,(;]鳏㆐JX0TfDIJ=xQa׋\QXS9&rשC0PQު I.2#?m&,?U2D坩&1PQTzBTpz"SBT-TDJ HƄn(L^H : =bM էftkiq ( c ˳нgucX? ,m[ZҌcDCHrI)6"꩹UvITOXѼF^#mI--8Wl ˟tEE4)9;d֌S|?O(m !2 jY jT-˴ W)?9}kVHY΂Mxh9ZY{4wl FL'b+zbXⷞ+6x=œ|х+Jɀ)k74w]xWMT3 Cws!D{gٰCjbEV-,26G}iu%WUEݞ1Πup HƕMѓ]JE8T.S@2$Ɩ̛^^h+cK1sjN!nq%Spxu nUNVeI\'i23} _7 1\Hcd4ޕGben-ݚs{ h~+_e+ѽpsQ ?u~ڈ&R3Kyp0!oti9HUy@8.pTA %*_PlT2vPXOYGPXLkd` 'dv5pN\yO}nA BАC| 9@4+" 2 ;"p2O=ԛONr= {ݽ1I]E]GU?Wp9떉o+ɡ)LsµC֣W}_ _ mlʪ޲UM2F^KR{"`5kGT? 7IPmaL )<3&UJd?& yxP3PuEG吁K5s摞Z%]R&3uݩ}yщ|]}̯#k=!ۼڢ7رt35M lS"/> x]q11+j3%" 8 0"ϻvFlT%1!k 37 J+$s$V?#X N-"Ï5sRA%UEbQnLj= iRKQqH8$u"3S-EWf96< lysO ڃ+82مІN|,ϐpD[ \=2f4Ԑa Db%9u j4RBDEHK("YiLFs[ɴHۚD KAcU,9ƯZKh[O< ɔ`(Z G-M'9ʷ7ļgv~ӨKB ,a'l"b,RHDۻ+Rچ%-JJAr !{rLKY,nME&Dw{8HVI ϑN صQ3xh >;]Ϗ:6JOM/]S#p-V3ܾ,ie*2Yߥ4A'$ktYI/To>T%V rybiiU{'e ڤL/Uq"B}vTIz LnKF&ꌖ4DN Rnd,d cyeKڵζ^rΜnsD)Qy%&HLU Sl9dZ:ZN+SCp'YQ̥F#醓9hΘi#HDg`K ~ 0*pn^B5C i јȘK\ PL0, 0xRX@I#;ŜļpŜ܆VXlaWP6p@) alDjg0aq $Df *ߊ#  Hݙ*+2s 9[dxhj`#\s\[M,),b lĨ:{h+ 5YhZotߏRkw=̝fv%;%x ~YEiU!cI@'VLJtJyR{=w{#~.碞76p(dAlonFE_}{ULVnL" d`7BòLz KGJa v~2;$A_J嫤a5 &H~&\f,B9x$5EIDi1'q6V79 #DLPR󚈑| L`C6՟zl3VHLT~vV)/ At[_)fWzq ;a%[p8U!eVMeadc9~,r,"+pVҭQL!@m~V*"XҔ"*j 0,^M5 /3N:X3 .sQ d >ڤ~UEdnDO-g0s)]`] cMc"LC\l!F3cGP i\KK6 F,(mc`]we5)g\ь9ur-HY\M t_si֟">öNLa$` ب"3M!\nӑ=lW`#JG9b|9~ru0by&։)ྫ2(J~ B`iU«* 3ry/eךD=a'zQ`YIM$ ζŤkV*cL)2Ǔ`F>3TJsd&#r3%vqo>.oěQ$$-X%:`35m&R֥$rz"@Tqb J nA鞘 Z7giB| ZvC+6:T"Ҡ \ ="~RV0 >",HZgC!:OF8t@X8IfGx|`,blE q<b5H- c4aǨA4(B+ZC%Hv .12lj$1bҐ-6U W吨ZI.j+S?$XfZ|\9&(B=͔77 Cq6dF$hϬhK€-(G4K$,Oaw{.IUE^7vap.P6&$4P:+N jiXRʇޣHVgFn[vD^Ŵ8d T`Px )C/PC+UUlTavdV,0Fh4Dou LRW#aLjebn,z"sI%~R:j*BڧeYBv{ G'iޑd\9?G gGnttvZ̖UJҭЭjüR2PiR&}Ҿ3R+'MG \G)?A Ό4f \Iaa `o39D:L+Z.LM,5Ӛ_:FQwJb50J&ߪf-Y $h`7;bD[sn@jXZOX&?c Uf}syҒ4E¨c¼+l%VZ5\fiUxP/{ENj+ۣܪqf2$s (&tҿ-ê7mIhbղىjl xLʀraoaauwioma`ځ&t!nĽ1 {T4f$F˴&rdJUFrMT[(F|?nEyRJB4#X2x`)#e}#>)KL~piEX N輌>^p?~T(믘jn0~@ Kؑ=>NJ6QɓIl%[/a BTMT[`yP[ZC!On(1QbmlCHhv~DQ1YHuAfwN3Sq0,Џa=#.d;HoOlYՅAYJ|pIP Var%2UhVP"29*aي*[ud냶ku=4-odz"eoG) xR@:$e0c*SS>(Dqn`$l S*S0WhJ¾(TٴtIzтUEZ"`8:mbUťxkxquzM#N2#c*~7jZ?7ꌷ3$kj2[#dMj4[ڨHm0U+W%g ˈBg"rejpcF)ъ3_ԂyMNzFfh|c9GC9+pbRSS=`9TH:K\3/LZl(gmΞR5گ8ʀ9M-S!.22FaPh6$>k c>F}bf(4S%Bv8@`vΖ?#?'{N1+3+U/ȻgIS(,]Zr=nN蹛# A!,J8tQU⪇]iy1Ekȱ,vDErx0{[ E $L*3H^ ;(TtFh;a`ĒrXT3Țw*C@F1/ kD.ڨ,(^2RJ-/8ɢ)1͒)Fz)Dh#%:;Y5;:!((7o!u4/j$~7w/]ZefT\F}sFfE$ 8ҳ Yڀ 'TXvU HmntEg6AɊ}R5G%olvo26i4M=4 Xr˖+DtTd~\vo'DAc GKMϝdATdNSȇ<;CLD8)d*4Y$H:K@QƂVXXHP:VijF`EӀjxjd&<Ҍyـ a#m[Vh(b$O:i*dxdgn:LNS[RZIuu=cV'ܐ яRя1 8(u}h{2A SÙvA xbr@+'z^x+ޖ# :@[o:čvl[يK EɮḌUCC`0[%dY*{%Vd*JZUU*JRWUlK)RdM~GӬMCG5<,Fb҃6pM&8z#6CFA:p/Cd2]i0QP?<*ބ,R^BgezQf୶ SVd}fմ3Xú'&#WppZAA,=a+WNZGKj& i8U ů:*_Z9Ai?ة"1v$a;p)(xʋʯڿȚ:s!8Iu.8Ta]+J*SzYBR |MiعN)l|҂Rd Q@b8&yV(~Waio"{-(Jҿ$- nH9#4x{1x$ߢEq((f +D-89@!S!AԮ6!/'4dg#%t*M"̀Ԇ!!w 1bXc<'4BR3FQ+%DWJLs%8 "PBgJ*AITӶ@+6nm8F0-}A:9]ofMXZU041:4]yk3dhLh0PG熋$f6&29r5rl˰#.UBZ:LܛFDmiuM"7 {%Ƃ#X*<ʋ1zJ|Fq%!"P2(lʹi;*j6kV!J hV1%W~jb ?`H1'xdX41f~Y7<^C2^ɻWi^jZiٙ p@pxNƪI1dbJ?M~җN29]N'Rp j!Fje`XTK GIN|SHHڀ)/8ڢ(Q8cz]|p gp`uj|pVk=BID1bw-B6Eq=(3Cv;H͠qK??+@0ҔT;jXZOXB$b[loB.6 jAG]0E:b쵔WQZxjV?kScȷ*>RE:ϥ qЖC0 2H5KYE(k!5D2(ߖ)d$h&xxfy2h6lB,=g=F^|ONFا,q1=NI5 8nkf tޮ%%}ң;4]adbʱ1Ddz_-6Tq;--k̔~ gYbt}F{]Ia'7f _k;U앫CQJQ(RH<5^e'EsB5hҨۖك譎ve-2:c'XQ\2KF@!"hcu˪6f3q1Ĵ1M%C-!|#cL* 6R`Q[$^E}SE&* &PM.R2eBtaț diA5V=F͏KGƣ?l!q' sa3S4p[:4h|k Ahb0oPaٙ33K?؆pg7|SM=lM+{ _Гz h6a 6p ̙S$-fLmzEqf8 &vA!37  c@F1btΉ#"y*ioV UJ-Pε2%vg=,BO`@ m^Yl]s@pi<۲20tg$p4"5i4٤4@'G :V) [IL(@nUShnW ^Vq--Z;N,J7 0&eΉxMWAh6aa_eVaTt*_mxg_sXmZ"r06RH@;DlЗ&mkK1D. F&ll&l&ll&\.vn~mv<^1^l9AI\Q7Di!˟ qƝ]~4mYc,L4+Im ɠ !!!!!(6 sF2_oX#EV Qހo0.s<1"uKQ1b#/!r*{1!gbp%ذ^9/G@-{g[9ڗO6Y#(jPPЎd"ؼs8 ys4N`pU9HDsфb/5n=c={}7KXq Ca9iu#9%.-m9F `Z2u!:u(u9u$x[3f8tV&h?n(QDSs>s7!2P|F\b's(ҹ:LJ!6T"=",TdD"⩹3#y}fU:r`6p>귆.>˻b{毓Ȗ98. W/yMmJ^dc(ؑrrs~-m]EvĄv#jwd[ejJdq{$F2ĕ5^qy~7YuZ9y5[ڷrTϚtf]mِ.2DYa۪Q\^Ao@={ا d%!ܐf.g4uH8T̤$ROO_r%Ă7a:l(MSOc?]:Z"]+5(OF9ԧs~)-S7 '֒TkXg@ @(ASKKn11Em\uB_N.C f5lřo .ed?9amdCA`m)=cMH\+MCm4;ɩ6;{hmVkm,g1 ,Q|Cä% m"Dĭ*gYSۦOKD!1c֑ƲYЄC9I1GH(mV@xO2$FTH+aT0{)Dz5A2X63>gFd3A(^hF0x# 3 ʯ'&٭$;4`rGA 6xܫ㥌[`h;ݪ، 6*qGQ?DH6WB40`O{'8#˖#rIb=; ċXn#+ՙ#ieCOˑ>>:;Cws;9FlR 4CsbvRbRAeH!\4jEבvM8.<\R^ 7 T1zgnG;~7q緊L%/ZhܻijIck"x_3dTqn?Gْ !E_,kَ˔M&Ioz)FbO)m\v=HBcڀRcxS:=^iBo|LGf pD,KP7sh8"H"Ak|IݚcBN{ި{ ?.!f2do+zpBEkȷ%M~<ΓDtE(5+J hI&բM$ B0", v}VW#bFdUq ߴЬ_,mX<6 "`D-2a٭+#ؔM%PF1pȯ!*ȅha}a_)d˃-pµ^e4Co-g6EOS*ʇHɲ,<|;mnV%Re`5y>IeJ*ʛAUTMm0}\Is$P֫cUR0!0"6hf`À$1EץϑS7\Vy xi$4]Y2ݜ{8hela*ۙ^C&Eba)6a*ZuNr!͈Hp!.O!)WAp_ů|cc8·}'h:'7)G{Jz ҝmlxJ6Mۆϴ06i\JOK[52}+jC܌_ Z)͓^A9ע4c/t<6a%RJ@j0𹚻fI1 Fp(6vBL 'Uz|/XU A_ 2̔ M%_j+毟bpΘ̠Ȟ Cs\r-RbD hQɨ;%EH၂/K-c2Q&$OL7Pf2Ğ#{os3,]jpaoee-z@lr`+xi*:ŹiW)֘K5C(uY loEC1ywcY"cj(-F4!C6Y=/=bT @褸X0v8!`6n`n3Fo8:QQwOHtc0Y*zK mG&FZB D0$"G.^9BQ 6lBy QJX65Gi;dwEJ.sc9woI]cdbX)~潠Ǹs@b8$֣MΫx]M;9s85;cQdhS]Ӆi2$M0D0J 0CTDԢ*Qu_g̔2*nd2b}(N#) X5aKUٴi$muM7>por;wpZ,p5&HաdTgbN(\]9P tG5[Ta6_ETJZl|&1 (CثfaKA1.|Y!,x39z#?'(qR;Xfj\^+\NfU+->'ɮ%0,a#,2H,UgK{n Ba5Xk J}&o-G|>C锁5myutwHxivp>Bv^#uU 4Q*BM 4&qHV1tAYڌzFmtf-+G qioWI2B )}[lEޜrEHJ"&(=ߦe >쳪`m)=LF+|Tc-3i݈檯bw_H'rmP$̙"8D{eV cO,36)D;aḴ#{[\LgJb_j{=ڃ;).wR:,PTkn'B ~kK2eB*`VɵBJ|_r[3hjOF d0D|ԲRyZs% [Xe4^^EVWtȀ\ 4'R"eJu:3Yw7o#>Que`byEhPа4fM#WuĕsjR5 q n꒍̊ amX[W9VK:` $Ӡ;$c*xFpty~f'A?X=I0! ]g}p G!XkI(N*/ǘL`E6'-5vzRl~u}_zp^q7gV޿L-sn2"ˤ=!ދ)$+KYOL1Sqg%2}l_~yÃؔt =:4Acz53Eu]/cr @t1 N=^sEvoHaaQAms_f1fҦIn"<Âmx/XbuG$d3.P{<(`K%j5*%E{hŅDlI6%eES6(|CCAuAF:z\谜mWbD90DETDMitGK(DL5\DtYlC/K >0ܣwXBBsT3z  ݹ1OJi1BȁGE)CGE2-1d\aR#PNȴ[JHM̚*/,l%20V;pf\4\h`~b'ޒrZ0Q[hjDIR%'y7 aԣ"4涆։Kib5̢ Пr+Jȭ=r̦_ɱ"HY&S-XRSAI1=z.æZ>0Z=x4#T۳ԑ\;GdKi_S?1KuFc;Eb:9c~R|<Hլ~$>s_>q>rCoKF$ԕ=f~MfjLL]}S)\CZ(vޗE#X쯥]\8a \% ߞ}϶ ?= rk')n@atEh~r>~zdqfTϖT@8!OFTo!uSO#4lbmN‚X,%#A Ng"p>@~H;K#Dk4pj (KTI5Gδ/ )15fJhr:^S/sZQw H hR[{w;kD\UE؅nQ) 75œI EQq2ܵ'O7р 8AaVF2~Pb3)R0@DlєE6.ǔ#{[ܿ[ aLm2S aL-0[aL-0˜R2`n]sncm{/nL"0X\I*謬QH7q>1LiuEjq LM%ѯ 4*q1{9S u@kP 1Se +قOـ[);=갍[) OwqI0}rhzRFa!s){f tĵ<֜a4̶ݒGfA:Ƕ_n;j{Vہ.vű.`JqQa.zELBN:.ׯ3^V|%b5Yܗ-?h8'xhaZ[ !Ӈ8M 1Gryͫg7#1S'kh2B : ƚmq*h}:E}h'xGf'z6|ϙww;GvOT_%Ka-s C9Չ%{bxNj{bE $P{3,$H+tG{9 T>T3rPLIN"dzbElS*O5ŃXR f0a'P'TT$woX]j@=]e1(a;#Qz-ź}:IUI}҉ Uad,1a+X>ֿs?R?,Q55` BACBC"rd5.J+%Ք1Xd/x1 $gPZEV*xEp.:lA4;%,q. Ll 3njX7UL(!Z@کIor2N F%ΎXa/U0:AR4a?afed՝KI*ȑ%iOL'38ϋ%BXV*-mD*ET̜1t!3*Lބw^-3>eq0;VF|LEӰ+vRX!̓t< T@ВS$cFMamUhRЦlnRY IP^<'CmVG >21P똛L*~2s4KJlѠ܊8{Oe 8vjY$\y|02C^wMYc'-[hm 4 Q45Qϱ.QGj6u¼SjE߈0ʆd]B[M~%ud sMQasYm͵;IEi\uPn.rlڤv5AX[L)btew*'F^xpbnj0? a*'V^u+|zS\Ԅu/X6Ȥ'kyTN'JVźҪ'YE.PВ Jvb١8[Mz";A@Hax>tC򜌲K'$jZ =qa3|v~d$f4)H}ƈ&<6~X {}H71bHs" 0$ȔdmE%@iq ~ɂ$*Yr-G\Uzc58ytF.$:>GX˾zdE9R Z M^qm|˺,Gg@2a^iD6Qt0|-SuWoϨ?'>XZS;!8Ó(?4J`JAV DUSNGu7*6;HN K̰2S^)·BrT' <٣3B =TѢ^`j膄bKߔ#HD~Ȍ4jt,`3L."P+jXJN؈ߖR?vK#?0c.v}%)B^VD4B[K%meIeV~[ 8@WC &^kh6FMC^,kݥBz%ѸuE)_@VB(5 h9KͽQz]atO9 Zm`6|=GQ9 慒لM)V 򋮁dZ7 U]o,|J4h*U j{s-)!~a4ŷ])S5}霭CxB`BD7$JUNQUǤ9Z}7&30&BUF@tBSzI=< ol'J!,Fj^/hIH\KtL'ʋHޔ8$CC\=IڑWs8U8T{\76t>Ndˤ3 e˄1 YZL2cIi%p`ĕJ'2{7Δ< W$s'&Wje 0:Ҹ0E#D4YvHPN@98+By晠dA.1TxY^gZ'VgT]U=a}~w|yKZB3l($(Xam]T~W0&7MOlIKmDLtMjGvs#J 3*u}e*~q3*2goc~<18]zSi6BJ>V52,jiz]EP|g0#n%b!k wrTX¾kd|jx7uNTz {5ɳfYo\k@CbѩҒy,0JdVx2Ԟ dDh-:IrFtA3d$h^Lmc zBM PJ.vBLq&8h)MW˶$hfՐBZ%hݺBB2"ECoVD]SwGL&HuY})-s+k 5!\"f%?G8m+qċ;Ϧlc`d@\ĒdYe qG?.k^v2ob*ZD9#܍/FPF  SpgZ̈7FrGY~@fk tśg%F\̯]$>d6hK ɏna҆fHzLjdtr|-5XwӋ؋PuQu\S?yˤdTtae:ˆ&"3T-M:}?9V:Ԙz BreeuC1[Ց&zrn;)2v[nW(R/̅'6a#ɟ2 U#5jJZaOߪ|d!ؼj&2!2^&2*BcZ4mDwNL:e;}k:*JUZ&d;N<[W$\uCp(1X$ sd>5܈EPLPOTỎ̬tWt|_^Кzy;$Dkh, 4!TKYαHJvF)jF@EjHW# zEɕfY)֛YG"lvDid3ā]wM$+IqgQ;Y q!Pʲo <#1S>SO1hpI @G. sOowo"<`mkKnSl >MTsτ=sXϘt3;&6˨ΨuP]7?C)Ģb!U +~e*N:.c"u:Uv:2*.Fm¿FiH2]&MVў JP|2 5YE[.ި救 h7.ӅTwtġ%8Ab9җ4,Ȇud& 0邁BM lUa"ԞD5 +Zaexj$PqSv@uB)pKzX1Ŏʘ}yIF_");Z)[etBZ JhDmBCR`uPGx̘&XGj(fwRI4ˋĻrR (>bM1ƤlMRۗE^X:hcebUtˏCbZi):vm$pہ1O)ݢ$SmpNQ#qFu2€n.6Ub^xfFPےc NbKUؤЂ:Y*RiD7o%K .^8`dٔ%R  XJp:ĉX44CUsV@{klkR41/udk3=$!=+-)O!2#?rh_n)]o(IhbqKgM!1h'r ^:y.LZ/gLYajG0i~gdFC1O( JB2EUet˪cCࠊ%f܉4FF!1 F@Er|im'KwX&;nd14'k6)CۜޟS]*=y5&r1| 6; C4yኘv4V) OBXX&:S 윥;6n5= $ր @y`Ym2QEe:F7WMefGZt5"Qב h"J٘Pd;q73ֱ0"`huM .CT%C+1$J46ŽVDU\TLT~34R3B =! ?FN:nxY6x8u>ʐd{Qq#2S&-2h:Mmd6œ8ѹ{Ne܊5uaܝ1^¹ z rZ6B^!HIa8 29*KPSDkQح4ԩX0m.SZc^ LM2 L|Tp,q':fe;6Vk&Zⵃ&i56\h`B[ln>tN۝(4|َLG!$>Gd>GW$(1fP#d$ʐҀ |pkFجۭ_O뙦%l!bbzkњ]mb䤚*#+L0`ENtLue\ku#3Pd (logisim-2.7.1/doc/search_lookup_de/OFFSETS0000644000175000017500000000071511541757162020205 0ustar vincentvincent1NrOh?K3HvtN|JS 3\eLaJhT}0ɣ03S6TicI)fڸ). ƅM&j0 t0ÑxZFP¹Fd7H׫{!-e}gV KӀ&Rj?]ʲ9z[=S`8TSEǵy"^p'NmiNr['N͵eooo9VP]hf3%&X/¤!21Qyq*wb=h K(:1# &`^a e^->Ěbֆ-ٓ'|r7pdh73* 4al0zw;/̛}+ ӹGff5LzUw#J^!logisim-2.7.1/doc/search_lookup_de/DOCS.TAB0000644000175000017500000001014611541757162020230 0ustar vincentvincente__uu__uuu_uuuuu_____u_u_uu_u__u_u____uu_u_uueu_w__}uu_uuw_u__u%u_u|012*= 8l] <2`&* p"P|B a RhJ/ (ƒ Tt= C "0#* BD0; r8PlT|J0hP7 J5D*(ȠT((*(`J8ĆJ<У3xH#d*`P4i0`TѡbBGČqBсr20lPlYX5҆9!!!#FErG(dTdH*#***0hHң (8 D(* BX14(tJ2(hP"9 0(5 ʪ02(J*ȣX<A"3 $(0E_" B!/$Ġ"*"8hJ*E (*lY * R0J5˪,R$P(/DҎ(A#0pY"Ex͊xO<,(tHё(d\0$*0** t.bҨ`L®BJj*<*G6*£J0# *4 *0 4"0,0B`Y!*rJܪ* .<0J9 28*4hHҪ`J  (Ȫ¾dJ0h0_*@҆J*0JD 4* A!B0a..(9`N4¨4g,Ҹ7t 8*4(ت0£86*3(Ȫ0**09 0hP (; ʋ" 0J(*ª*̪,⫮8ª4†?0//28ȼʋ\ZJH͋ 6/  8pD/̨ 8/0΋0 rt/0dO0,4K0x4 ؿ2,/*/ , //K^@g"46$0ITu*qHe`@ 뮹ʷ#nU뵶`Cܜa&e[DAa_HEgݦȇn[̘Of) щ@ĝRJ`Ɔ@$Z5&:{}&,m@4@ H@bǹ#P`؆@SPQi>ړ%uHd40NSD_v_Ő@D@`=-*PX"",g<(?hȍ2ˤъ+@D-q 5@i@@66Hڙ@D:v 4+`@ae_e~`A՟@8ZP`~"@̽`Ph ɀ`F"l`on!~IڕI!i$n@9P[եzFC`n@$e0 i|=@}ѡ4d`Ϙ&4lf@j`v@i4zʚ$S1 $@ɀ4ej]eB(eVe]1@ޭeq'@E_\X!3re_!wlD€@qP٦5˹j4@iD@ez@@+LkX[r`9`XT_ n`XejX=4Yu_nЉA|34v]XAZP%AE("o@fae`똛n"=0XiXv_{aԀ̀xdPX0Vfdݯk3d/)}|@4[[` $n_^P!e@Tnb֦(шA6!ˮp8 yʪ\2@ʚad8uy)h€@/@,5Zd`t$`4@=IvO@9}Ihɀ>@PmuDA!aІejqu|>`4yD@4XP4i1B@hںr@s:@4qD*@ Pe9qƒ=csLjajC@@@51`2*`$ɀv40@1Wkn4?`0@3@4;!@ui=`QOT T'+1:{}ڀ;`a@0!387:"dm`mmpo`G+4qJٔ4449m~`@@eW_e_elDw]4@`La91qd0M@ ,,$p7 P@}le@aޡʟ@PaV&nM{@POOτDkXΊ3*}l؍Fei@$!ߠة@} Xy>`@ftUֹ6+љ@j3h@$۶M"1-`@dta  38H4a*maN@u ZX۵:Gm@b@q4E@m6Jݭ@!L`@i$А`pֱ(@f@JP3)`ixmP om``nd(PєYP@@D!+}.@B;@@(9>$@% CP@']$dJ6)Ѡڶ e鱤Ai9@b ހ@ə$Dʖ*@ɞqsϭ@̚,ʝ֘ʗQ@ʚi``@Q 0Xȶf`ʩm*$Xhd&0a ʖѴ@eٞ``ϜS@@ٽf@@טX4 p`reV_eet_ @b@@(ZXٞ@af`U0X!PgX@uN@@t6#@u@x#*3'@ Ђ@T89[ZY}]e@t@闑>tFxPM4籀Pd斺8`@)@Xp@rCd@q,@@j;0ff@,@@(,&$`@7@@@Ԝ>`q(@ɬ٪p# )Dk@C,IPIi@)P@e@@ɪ>#B@<`X)_c#S 2,!eY}]eHeVV_eeta9D?"@&(a2HP(ab@DL"O 1@80LiI&ONMdPa>:>!6!рNd݀)a9ٯF0M2ۯq:a@F(lDmDbXX&bef̴i@|m_e]v̐e)DfX#@gXfv d<P%b@fo7g9 &-m뽷߷EPc( 1 V J1u1 `11}LŪyoǖJV1)M`ƀ1ƀ a^m HmcBhd@cH+QƀcQmcSXO:cS\mb6Q̴1DcDi@ƀ a ZSe2_vhVƀ1[ 1e-ƀ JcNcB]z.@~rƀ aONUrcNP}ƀ0DpB_%1ObMfǶ: @&sѫaV19cNFTʮ1ƀIfƀ:ƀƀƀƀƀƀȀȀȀȀ}Ȁ8PPdJ>$Ȁ d4ȀȀȀȀ̡C@2e6Gn PAc`ـ ms2LG$ʀ'D-DJ6$@%%%2q%'(%2}VEG8E%%%&BeIؘD5!a-D`&nf&j&&j'LT%D>6@ $C{"ۯݮ &N[S@&jeI-@'j"t&n%PI $P VEtmڵ:ݳ $4Q6b~m@'eI@D2'~@D)”jg%%2da$@29>`eB4Dk*Nل[R%ʀPCʀʀ}ʀʀ*ʀʀ3ʀ&2'X28'RDZfj%D:DC2q#rDJIg)23GSD3d9H.30:牠JDk̀ 56Gu[vئv3})W$9m0@gM΀ N=I{΀yg΀΀u <`!n_md)D΀&Hfrv'U5"ʼeJ@`GԦmϪJ3t=3΀  ΀>w(hIgSIs@΀3ܑ,Fqb΀g\4$.FqqhnP2 hLJeЀ1Ѐ%h&%ЀhK5hMtЀ: ЀЀЀѦJѦj**tЀЀЀ-ЀЀ47 >4+m~7Ѐ",mHhZP xCmڽlUڱ?=zЀЀЀ*Ѐ`ЀЀσ@4$4$4΄lJPhHj@ 8l!mknjl4yEhJ-h̀+JJ]}ºVe`h_HЀЀЀЀ)Ѐ1hJ5Ѐ_(܉Ѐć@hLЀmiD;ҀҀDvӻiqҀҀjXjAha@ԀԀԀ5wE5ɝX+DnPԀbjXPԀԀԀ5zn5w4adhPԀ`AD@$Ԁ5ֱ̄@jMdtԀԀԀ Ԁ Ԁ   @ @ @  ԀԀԀԀԀԀ`iրj`րk̀րր:րրրրk7T BրlO,e؀9 ڀ6x #ڀ'LڀmɀmɀmڀڀڀڀڀڀڀڀmWzڀڀڀڀڀڀڀڀ`ڀڀڀ6*Wsˠڀ*'ڀ6 m .$m ڀڀڀڀڀڀڀmOڀڀڀڀڀڀ`ڀڀڀڀڀڀڀڀڀڀڀڀ]ڀ6aڀڀmUv@ڀڀ:܀ !܀  nBnB,ϧgi    D܀܀ 4V ܀7!b$e$:yXѱ߲ހހހ3ހY7%ހހހހYހހހހހqZHqqqW[P!mpgH:a*D:ח鹔DâTq!%nEW]}v@!#mdv[ݐ!#mdv][lDrRdrrV$BJSkkۧ@r&lP26ZjfjP9^%֣8A@ PuZrNu*L'$`uRvhB]^IJvE:"2`ynJhH]uO;}I6!@;u̠v[42}inJnb;IO@_vCvvDp@vvvYv[ɐnnJv[zP;.G1hv[KB+nJnJvvC MO.LNxLtuuxLtn]^5v۶@xYY@@@ `!֤@@@@@ג@׏@ pnPU@>@׏@?Q@@@@؄@@@؈@@@@@@@3@ r@ن@@@ٓ@@څ@ی@@@ۂ@ۄ@@@@@ۇ@@@@@ۛ@@@@@@@@@*r@@@@@@ݜ@@@@@@@@@@@@@@@@@@ދ@"H۵@@@߄@߄@߆@߆@߆@߆@߆@߆@߆@@@@@߅@ 6!߆@߆@߆@߆@߆@߆@߆@߆@߆@@@@@@@@@@@@@#[@⁃@@@@8I@@@╈@@@@@@め@䌄@@@@@@嗂@@@@@@@@@@@@@@@@@@@@@@斁@旂@旃@揅@揂@恄@惂@慄@灆@@@@@@@@@@@@@H u鍃@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@끊@@@@@@@@@@@@@@@@@@@@@@@@킋@Ђ̴@@@@@@@@@Ї@@@Ђh [@@@@@@@h ܀@ЂɹЅ@@@@@@@@@@@@@@@@@@@@@@@@@@@*@  @@@@ @@@@@@@@@@@ @@@@@@@@@@@0@@ }@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@        logisim-2.7.1/doc/ru/0000755000175000017500000000000011541757152014265 5ustar vincentvincentlogisim-2.7.1/doc/ru/jhindexer.cfg0000644000175000017500000001155311541757146016736 0ustar vincentvincentStopWords а, е, и, ж, м, о, на, не, ни, об, но, он, мне, мои, мож, она, они, оно, мной, много, многочисленное, многочисленная, многочисленные, многочисленный, мною, мой, мог, могут, можно, может, можхо, мор, моя, моё, мочь, над, нее, оба, нам, нем, нами, ними, мимо, немного, одной, одного, менее, однажды, однако, меня, нему, меньше, ней, наверху, него, ниже, мало, надо, один, одиннадцать, одиннадцатый, назад, наиболее, недавно, миллионов, недалеко, между, низко, меля, нельзя, нибудь, непрерывно, наконец, никогда, никуда, нас, наш, нет, нею, неё, них, мира, наша, наше, наши, ничего, начала, нередко, несколько, обычно, опять, около, мы, ну, нх, от, отовсюду, особенно, нужно, очень, отсюда, в, во, вон, вниз, внизу, вокруг, вот, восемнадцать, восемнадцатый, восемь, восьмой, вверх, вам, вами, важное, важная, важные, важный, вдали, везде, ведь, вас, ваш, ваша, ваше, ваши, впрочем, весь, вдруг, вы, все, второй, всем, всеми, времени, время, всему, всего, всегда, всех, всею, всю, вся, всё, всюду, г, год, говорил, говорит, года, году, где, да, ее, за, из, ли, же, им, до, по, ими, под, иногда, довольно, именно, долго, позже, более, должно, пожалуйста, значит, иметь, больше, пока, ему, имя, пор, пора, потом, потому, после, почему, почти, посреди, ей, два, две, двенадцать, двенадцатый, двадцать, двадцатый, двух, его, дел, или, без, день, занят, занята, занято, заняты, действительно, давно, девятнадцать, девятнадцатый, девять, девятый, даже, алло, жизнь, далеко, близко, здесь, дальше, для, лет, зато, даром, первый, перед, затем, зачем, лишь, десять, десятый, ею, её, их, бы, еще, при, был, про, процентов, против, просто, бывает, бывь, если, люди, была, были, было, будем, будет, будете, будешь, прекрасно, буду, будь, будто, будут, ещё, пятнадцать, пятнадцатый, друго, другое, другой, другие, другая, других, есть, пять, быть, лучше, пятый, к, ком, конечно, кому, кого, когда, которой, которого, которая, которые, который, которых, кем, каждое, каждая, каждые, каждый, кажется, как, какой, какая, кто, кроме, куда, кругом, с, т, у, я, та, те, уж, со, то, том, снова, тому, совсем, того, тогда, тоже, собой, тобой, собою, тобою, сначала, только, уметь, тот, тою, хорошо, хотеть, хочешь, хоть, хотя, свое, свои, твой, своей, своего, своих, свою, твоя, твоё, раз, уже, сам, там, тем, чем, сама, сами, теми, само, рано, самом, самому, самой, самого, семнадцать, семнадцатый, самим, самими, самих, саму, семь, чему, раньше, сейчас, чего, сегодня, себе, тебе, сеаой, человек, разве, теперь, себя, тебя, седьмой, спасибо, слишком, так, такое, такой, такие, также, такая, сих, тех, чаще, четвертый, через, часто, шестой, шестнадцать, шестнадцатый, шесть, четыре, четырнадцать, четырнадцатый, сколько, сказал, сказала, сказать, ту, ты, три, эта, эти, что, это, чтоб, этом, этому, этой, этого, чтобы, этот, стал, туда, этим, этими, рядом, тринадцать, тринадцатый, этих, третий, тут, эту, суть, чуть, тысяч logisim-2.7.1/doc/ru/jhindexer-stops.txt0000644000175000017500000001153711541757146020166 0ustar vincentvincentа е и ж м о на не ни об но он мне мои мож она они оно мной много многочисленное многочисленная многочисленные многочисленный мною мой мог могут можно может можхо мор моя моё мочь над нее оба нам нем нами ними мимо немного одной одного менее однажды однако меня нему меньше ней наверху него ниже мало надо один одиннадцать одиннадцатый назад наиболее недавно миллионов недалеко между низко меля нельзя нибудь непрерывно наконец никогда никуда нас наш нет нею неё них мира наша наше наши ничего начала нередко несколько обычно опять около мы ну нх от отовсюду особенно нужно очень отсюда в во вон вниз внизу вокруг вот восемнадцать восемнадцатый восемь восьмой вверх вам вами важное важная важные важный вдали везде ведь вас ваш ваша ваше ваши впрочем весь вдруг вы все второй всем всеми времени время всему всего всегда всех всею всю вся всё всюду г год говорил говорит года году где да ее за из ли же им до по ими под иногда довольно именно долго позже более должно пожалуйста значит иметь больше пока ему имя пор пора потом потому после почему почти посреди ей два две двенадцать двенадцатый двадцать двадцатый двух его дел или без день занят занята занято заняты действительно давно девятнадцать девятнадцатый девять девятый даже алло жизнь далеко близко здесь дальше для лет зато даром первый перед затем зачем лишь десять десятый ею её их бы еще при был про процентов против просто бывает бывь если люди была были было будем будет будете будешь прекрасно буду будь будто будут ещё пятнадцать пятнадцатый друго другое другой другие другая других есть пять быть лучше пятый к ком конечно кому кого когда которой которого которая которые который которых кем каждое каждая каждые каждый кажется как какой какая кто кроме куда кругом с т у я та те уж со то том снова тому совсем того тогда тоже собой тобой собою тобою сначала только уметь тот тою хорошо хотеть хочешь хоть хотя свое свои твой своей своего своих свою твоя твоё раз уже сам там тем чем сама сами теми само рано самом самому самой самого семнадцать семнадцатый самим самими самих саму семь чему раньше сейчас чего сегодня себе тебе сеаой человек разве теперь себя тебя седьмой спасибо слишком так такое такой такие также такая сих тех чаще четвертый через часто шестой шестнадцать шестнадцатый шесть четыре четырнадцать четырнадцатый сколько сказал сказала сказать ту ты три эта эти что это чтоб этом этому этой этого чтобы этот стал туда этим этими рядом тринадцать тринадцатый этих третий тут эту суть чуть тысячlogisim-2.7.1/doc/ru/img-guide/0000755000175000017500000000000011541757152016134 5ustar vincentvincentlogisim-2.7.1/doc/ru/img-guide/tutorial-shot-wires.png0000644000175000017500000001366611541757152022623 0ustar vincentvincentPNG  IHDR++@^sRGB`PLTEqprl8z1%$6AIRee\,Z\Z/nDCtwu`ˇ/{s秦€ޙζ pHYs  tIME 0IDATx c0 l(Cq7-7HɝHڦiȋHH^W %`lMÎ018|k0۴s;IQh]}ps!L4oGtE;ly~L 6&sM+#s7G`_L r1n_)'qѬHJWqVu8< r&r1( m\ȣ`_g ]ɢJ7׃l|7L>9şn_yDviu  AN[08bSe m:v G_1;DXŽ(0PvR)!''P}5~QvߩژI6bjӋ53NWՂ`YX9DY = Wk6 1. >:YA# M "E(|& `VoX`+cg\saVαkM/~)uHV2Zp RP ZvyxvA wzVU>f]`Lfu)hzT-h91؞fM- ~~f#M*P" F4n Fq@TXD(Vfl`_Jج y 7vv.YUǏآR^m(gdyyZvɺ^fffs*kס$KFm<7^߫aoYaXٹ V@Z/9~448v6X`eBC}aJju53nszxhkا̮ #l*vq,9wU4`lׁA6lǞqIL1Ts aWi;״ߨW9 s1?ζ]F谽IB1lW``/KS7>_`G[mQfrX)hKt~puJ0ZH1fh-3sJX$ɉ O)tpʌa4=iD~=iFb݆Lً~vqʚv[ mI(=1l+16?R͌SӞYpw4h)4= #f Nget/N5uql{NTn8!:Dxkw@xB=#9m 1z`OzyZ?B=@%$T᰿-?n e?A*=_M8ӭGUGN[ҍI\TPY&a痜ր/ ˹Uǖ󌩠=8RfknվE>G4 윳D4 y>Qن\~l؋cE cR0b9ޏ{*( ^D&5:a=j6W˺@F÷"! >Sk5[r w8[ LCvz5F4>Pl5Hjy0B Y6x' Ưx+x tfXȁ}+[PTd4C fXvӰ*%Akj{\MɒP_ ?6 X1hOʃP/Md8;@`?/^M^0^M1mv6s{Q ޳a43؋eok68Oc[.ݚ #A4 wϲCDk]v(彟[x lK"lg,9¿`Y~4:, vr}Rs-ؠsy독Q~2JO f͸gacD;`l K]Of(HW5ۧ^vg_ڨ!^rT&' N>"dp'Db5:֫%Fu%WM w[` >kGu`&pTGfeT7HהZ8ب 7֫EGu5a듥n4Ȍ[qmc~^ICf< 3n'-+\^zО7! PfwfQ|b%\6v5~m[1^ǩbo͂d׾5w.N=ރVͬ?!Y^~sq>ۃWf//V|&=uvy$+7z*hZ mTbm~x.+hhs"sz˪.2' [Ϭ?xB*,[;-_`=f¶;Аga߃mNغglHQWi ;a+7WapcmtGi`:eÍz*T*F>*ɦkB򣉰})G] ]u^w- lOva;ÍŔX[+c+{p7.* IyfSN2)4•Z\`PfSwB~J89ͰۋڸQf?o/`'Bqa'پ֨3n8_A3lc R 6[x.ѫzx.ׂAhvlu+lVJ`_xsZbK@g_`[6K {H6S ؎žO˼ {a4l_ 6 `ly&x[B{3ul=7wxnJr2/+xМYg䀫e 鯴@4K5h]6E\~J@4V*!4%jE6469hϦmQNa|Ϟ.yxN?@ 6ĠffM͆?l A6SRcΔ`l] p%رe;E+ϚfH'gT:&Fh|diSh|QeKMf2[H͆thJX'iR&Yjjv2[eQz?Q!Qt՜g,f*TeJ7OV8͆ evRq3癨PJhgc̾4 %LMLi0/01~عnVl.AA+S-#pM/$ eΘY~"zlN{{Nޚw)l;B6޻6^/hghg׀yXl7~7^xp^z@6/ 6+~5!ke#!^IENDB`logisim-2.7.1/doc/ru/img-guide/tutorial-shot-wire1.png0000644000175000017500000001402111541757152022503 0ustar vincentvincentPNG  IHDR++@^sRGB`PLTEEqmpEir1%AIRe+UEZ\ZDCtwt`ˇ/{r槦ݙη9 pHYs  tIMExP7IDATx ]+s̲]<|$6se(f~D `AB6Y48y\2ٗSfjا4J$Z9;9Z*BHdc$p',;j*|r'-`6|ѰK  `l¾m+ܯ¾}l(kyִ)D<^^z+ͼgy5{]{:벯$%#^Y&7 +Q'i>qd*;fo2;;oqVUfO .\ ;%̏l3"۫*7f)"?_W^]99lKQd&v~Po,<{#'9lw0>/`~q gavw%nȢxdvF~ͪigWEdzH (g8#sC22l{cv|qa%[vyۮUFi"c _/\wKeʌe|h/yWwRnzoeA!OcƷb#?-^5e,@\u3[Xu-+hGqYAx[u@/[>dFU B$;3{F&.\ rW䵵qՎWե&(t=iF2akY#`l A‡x`S6$I>l0`W!JǰlܰMP$c<Mr5`Uң )\QB>ۢP;,6Vbv;5"Sg,!'p?ۤmȨl}!rqFyjǧt6 6hPf)RQϹ 76lEڠ~ =-lִ-C?Jlv͔m8fFaWh;`cEq3lݤTle̫vS5`\f3L`clTov.+h~m-A6P`6R#hzͩ酚aƮڸ(]tN*=`jVힽ^ܥܥO8Uau9c^ l@dְ!`!I<0a5с$QXrm% c۰0`;`DņɢiH4`X`T䰋tac|bv.b13͚2F ݇/6f y&Mp("{Uf_ٍ(;@3N_ K^]7l=#' e7Yy]`auY7*lc:lͺf. ̞^ ҵHvؚU/elg}*M֖fs{g;a1T+Pm6l{̓fo9c&-5P`o7Nh+PW͸ɺf]RW!^o6moduP틆Akv!4`]{1|P!6ݭy6 ٻ%fٹTI, lgH+uN`i7_ hw͸Vi4puHs;;C^MkZ}nͰ4Y=Ճf#i׌+K>}L8D~ ĚRؽMOwupl=nm^i 6}7jga;-xRkB 7"i/#`)vۇ44Zӆ4ll(}ܟ)"5=`'xFBGfH~$k,; tF?_ vM}.SU4&?~/kDG.Be[F_zV5wJ(ؑ*|Y{3saLXCyFS6(3DQpA{Zb$ls=iFӆJ?q25f*(~*hU^kb PAVf?7d$ڎܿ 3~wKӋVaD أ {^ {.M}a^SG;Ia!zSngw*5'ژdbNW-@Z j]xx'sa?Vl66#@Y|_6ϑn[4B8 Вn͞ N=cmvq*w8Lzp!;@ \x/삳.~=Bف>Q,{]^ ۋ߲__&`oО1`3?֐?L͞vźHpNNh-{qq/Ж 1B/ck ᕚmٯe;*->:fvC;*mAB6].Gӷd;[ͩbZK| B;xc vo\VXfwP|/w׫M J<]=ן2<v>A=瘑* FE2mm]%B;O/i7G`]ݕ[t)]19Q7uFJl _,Q}'lme0[uS͟V8A5ke] /X}{L>z_זϲ hG7|Z =f;7hɨGbll ߧ 6^"Y./ܥaz֜C%~ #UB9Jla47js-e-N=6VM*,W;y_`=؃v!w5}9xFCm mcnMQiovqb+ߺ7F7Hi"]J +?{{Xͮ–΁Ri2ɂMUwogQ}_ydW!v> 1hsVf7.wk"ɂ7l&ۛ-L=ͦP]%lDSj`Se~HqJ`{.=7_.w4djvY*ߐ3ܬ֟cpq؞l ۻ.OldjQ]VӋl,8 9۶k,57"L?"I Nж?EW"* xZ4 [>\w 񠝒Y ىUu+h`} s:bKvO\`;6{c="%bFl5:`-KHAm\JMz#(5ۚ K-ӋؚmLi|z-= l=ŕXFy@5ld5|z-=l1ӕNYgX)>58=? t4WD">Ax,tQfYAS ڡo |^*ϴż9U*Eö#~Ω6OY?hh\ 6 `l aw+]a{uأ/yz!Xqm4ZmA4[sIو; =ΝωkiOk9hV[T|$U`ZX1_@a -3l{f|{ZՑ쀚^ a^C4[98U4v`lA h 1h`l>a`;!`;BƜŊ/zF=_=Y`H&2=]19;] ۞|dbx52"M.bӞʄ-b|Æ,lg&a4vnMf5a'a AJBMTiv `Cy9a@TiUns`?ӂ0=c`A@a'Xm`1~ܬrSǃVL*l݅qv v:dmtIK2KeTwHFvevA 71ءٶK|XKzkm.>΄. ̶iL,ҢTnIݙ7 }`j-Gbwa1g8*G``a[fO.NE/@<YAc$lfQJͮ 7xqfo4,ƌ75R'A99U@;kܥPfw/εzA;C;`왇%َb}1|׫GEy;y}$B.1UIENDB`logisim-2.7.1/doc/ru/img-guide/tutorial-shot-text.png0000644000175000017500000001474411541757152022454 0ustar vincentvincentPNG  IHDR++@^sRGB`PLTEpprk5|1%&8AIReZ\Zia).oDCtwu`ʇ/{t秦ݙζΧS pHYs  tIME*#T IDATx i֭k[PPDM-S9  "3k 6ȢagI1/$_L!:SN>ɢ$Z۔X,u.$1&uvNHx`' u_,l̤0`cB;<;5wZ ϔ {Mʼn}&\}@"I'͊ǙU=\~eB7Ӟɠ' }"O?}_%Mt5ٙɖx&\dכ䡝J?.gz{+ I%Yfڄuf;N3DRξ4$fPBwzD|i)_8Bs+"B1f*VOc3{/kK ~'Ռ`YRI"vDF~IWk6 fl,&? _P/ljm+֯ *؞W h~_}[Ջ_:! q RiP ;+Wa4sGXk?+ vĬfYב:+WlN_R;q[zRQ%lG0uqqө3(xwT,7E?BPBPn2vGNDhW/N\ݾAV!=~ غBv/%d6 do koo&:kZ[˻B^ȕGO4V tu"Kސ:%4:`VW Q;2 vN퓴nolpdzL.6g~DZ$.ą0!.Q`K\U/v&j=q`wr-ɍvEP$p\}? Odp{mo SKw na_Ξl3xm? \ܪi&WE$o}=d;4 6 9khXB~U-h|6G46^™_m.o [%UlH va_6.n~Y^p7el4;> h4[oT O3.FYP+-؈Ͱŧ#[ .\F݌K [MqY@3xG4~79OaWm@vFEHmD6&يCLr6bvGIuEH r vжfJM??mlv$ATݰKV ̘`#ٌ4ll W ;3/lGU[y-eXjlVq ;ל^ i:X`Tmtac|bvjdgׄ%kgUem a26ao[`_ (6U)E4<i F؝I_3N?>S6Z rS eSgYw^0;*(Wa[ Y[sd+'7Swad;r^AvɺӞgf=f7ÎEU?o`UI`xnV~&ϳ-daVb@:^d֘E{*luQilYiY xd6UFn ]+ zaybmlPco%l(f{¶`]Kw3nō|a޵"fWju53nsZozhk>yvw]ioOy._3[&NBr柒m4/[0i7?AϘk/l;]f{Ys?B2C+-66`B5^G#lV@Jhy kv[X;u-Y(jmjB{ɰzUj>jzV G/&#ߕa[x̿r lkH+(r7N:xֲ."a{7rz"*m6-=fet)lƵJۦلd#UZ`{ʿak7Ti@FU*7.[QMkZ1}n4YuGnHAΟ)x@eUfY`g˭ґՌ+K>}Q&lmQͮ^'V@+>~+)zqXi'ώFa#li^h4>v.0ey]3p֎dT"gOv?/~`GK4 a .F.X’&ݬۓ;מ=1& gBUXCvoZX4lA+į=fc34" Sčj=|Klk7 a׻dxFB{} v zj:9Ol.$B="l_ 2q8 ';6®b ;WoU>#iܰ8`zS%Sʹb>b|~;M)`7ԳƟ"X` Tp5~pćA~P$I2;cIĠ5w9:4#Gnk~ElCA]#)r5v^@ˍF ;5C-AN oRKio_53{fͥe `QYpP~^p,ofwP I;jpۅ>0( R9O6}*psze`t~2mCCi6SAMwI)gSFˏRķ[pڝK$yv{\ |EYp^B윳 j@m􋵑}ٹٰGo0-䰵(jiL B`Պej%k,GHUDYyvTKȲ *{1ϻ-AT\4?CkL~4-`z~=h%qRL^fz١ d< cƵK׳.gc{TgK/@Nn6,Pǃ |HݾqyÊl剺Zڔp#~[`A$X D8vho?m[AF|; 1h1hf||"/Ri~ѥhRddHz|AGɳcI=x%l9G(az#^vD g^f]x $˿|a9 qV\c|)l܋sPVP]MS6%ˆ-jy0HúL<nqJ3> tfv`Ǿ `zFTl\F5l6o=hMvYճaw- HlK G,XqК:2KKP=:HfoGSj<)rKγG uע`6H=Î{T#>n43أokh:z#/?5J n;BUl~[ (=)q$+lQ5n=5.?vkS6.vzvv#kfEw{^j?}[_ރǯ9g{׎ ۺh#|? =d=W,܈Tjk(cM uk65 gtA &!u=lffL-&To\a7M8h`/VPSO` `l 6q>\WxN٬fw Wج4 >plcZbKvGDl Hkzw,}8vW7l1Dueef 4{޶vpF ;e+5Dwj,ֿkq(9:ENNwI]QZNMB|d]4WlȳA6`3 ɥ)N`7 }Z6_ugE;7S]ؼ2G=.l-tm>hZC(3٪6ڜbPm 4 \eQəIZ4m-h|(G#>#h-W-Lyw\Wfؙ(oGoHW3ZŌpŒWW9.da?6~2Ll,LP@4 :!X! a`={`c29LY庀۹/g=Ua.̌kuagR_Qf H *HYAׁz/H`zSf.bs*24[MFJHWG?06|so<l:F|1طM3_U%# Hۿ4`cr*)`疿`af]_Y=3%O_y^@cE$yfWE [F֫^2k4!fh̸{i/ϩ pBgϿ!JޥzA=ۣ _ÒLGibա d`W@^: %1,<IENDB`logisim-2.7.1/doc/ru/img-guide/tutorial-shot-test.png0000644000175000017500000001434611541757152022445 0ustar vincentvincentPNG  IHDR++@^sRGB`PLTEqprk6{1%"8AIRef\-Z\Z0nDCtwu`ˆ.{u秦ݙζҕd pHYs  tIME ;q IDATx흉b @֍YS455 +&Q30B /"qwy @^B644u2m[EOS^$4Hb㭲ιZڱd&`芋$ vT 6.i,M)}@` TdlJ_T]0;RU"rG?s˭a_\5ǒvXC'ad#KI&29ṕfy L/g vFΎ>GdѮA? !`&ӃߥbvteOQ=aMYo/&hȃ{ݢi`gW̮+{3 ;*#$T!]; negwL?e迡_ia_U%u[]=o3;[2jmaG`OAy[ \7.չjA4#;+-ʌsENNgGOo [fdˉ(K̳TNe4|-Mت{Ҍ q{ޢ+hI)nT G3.2FXb}TlxvUXBhqr:a n3.*h{ozbWhwk"}'RG '+h̸ܺlGr,RnQ6h$Z˚L}`o`l A6 =Y3l>`J} am [}~"3lNt^mHdحSU`wUm<;)#Jq !haKv!W`,m3lCFIBwah+_`c(י*6жi6jsl 2bMd7a`imij*o{ ZuGm\6-achz˛jTm^XJ*)8Uznpj[ewN;r`wvtd0lS[6"l aC(1ۃ "y*ywgaTba˴nvAZ%ikzu`_GG Ic{,6ekQKф]`;utM|f=`v%*L(XMlk0 Ќu@u Wp+}`⚼||(4ج;pع`]a?,y0gRؕ؛wD$Mo*&Ȕ&uQ72{yn ɺA}oٹhwU똇v+Zm<כ^lYgK<Hŋt s6>>JAUEmYIa&c:V {~+`]Wlį lZf3n4{ہ=Ӑh=&luo<{&͸rݟA]f.5z-~Vnޥ̮!k"OՌ {#]6 UyEٻ*h 0@هSm  ޱ6.Ij|l\L!aʦw j)C[m/P%I +9Kda-^+Um 6`\}5;(l _Mdف޼f7*huZ"2l,^5 z˩O;;wakqف70h`|hQ&[3>Gy]ۭy)\kgڻ%^.fR-1k }#VdCkvv!-,95Þ4#D|!mZy̪ :Uӛ9,r6ivy1Α*ߞud Gn~g5;CD&5hMuh{NgXZN{F-We(Cb )e;m]}AI}͸WZe͖nܭzG{a͞vҟ[Mw]1L{8ev& Y`!kJ[@5fT WuŬ#ͅ8 .l_=m[mqRkB %,)D;7ן ZLֺ̓#~ b@AWUf{UsKɏHh£ڢϏig`0PX9IȚ>>=$;UdvHj>%\>U`'[mQ8fr.YG~F?#oNd ؞*;r|23N8^JtCfq v4,`y=hT3r6Q-8؄5fk j,YGRf-4TІ16P.`{"F"lO#(6=ʽnk4oPګ}zmρ 'kC}00CC\a/B'v *h]ȜW0n=yZBm|"1;հ?3w0 Y7lrWF GA-=mmh,F"6;o hT ǖmǧ`H=PU;gBT>QFф윯~07Iy~K?̈́Q`FITC~!1-DHhK ; Eai X4f{˗AѮ{\ؼ~&s f4sC[(ck4fe0Sɶ*F=hC+UK5e5 4{+K;7Zfv5l4WZ/^~*˷^*Ղm\4<-!ƻ`}:FU'6?zu)B+'0} {Ç٣ȸkqb١vMemq5׵8GAPAGKa*irE K6z?5 k;9  |QN34:6Nѣ;Cx %,EL0IÚ`{TkUߘf^.eMTʯ HCvz5l`g;]NĶ`` Y6xjV3Uf|GoǺfgۙk^gK `l}fklZX;ő99-̞^f8|F4[.zu vHH?Wz-*hJ ͫFa`?V. 7+hlr"}y˺N'άn4Ll46Fr۲UX Ovcu@¬AkE7JPo/h;Bs `_W.ԃfże]kjIlNhvu+tUZ 8FN 4Ė6a>!j`l W ;ؾǟ)3j]-Gg0`Ӆǜ>-5̻a?٬ beHYb%–s37H$Њva+3>>6aX0[KlLw8bɇ\vr >KHAm\JMG"Qh6A\)5[9-Z{dE{}+=Ѱ, g`kfk`*3]UU vkevSB_2 Od^5'E٤V,yv[A$N!mɜ*a`sl #A~^Kp!2`l 6 lxgSNG/ `{WEg-);$S-DEWoזь%oJY8w>U\Lj\B .%,I4b^ [d vtQx{T[Ց쀚^uӮZ{h Lkp4v谽l 6x  4{|͆40aj6 y0`Ð] A,!–-;0~'챏j pUs Ȫ25qصaށ#uXԎ.%o^y԰a:ˡlδ Д*vmz0Q@|ff %ϔq4=vmPA|>3#lV*Ů4|fM3^Spa%v`iAI L떖zik=`c25,Y媀XyVսaň+uaWҖX sUV *csH®MN$H!{ vRoblݥvl R%^Ɔf$]/ug1ߦ~YjF bƏ}`wj-C+vl?ؘ3]yB`熿`akfFwZplk 6V+hTA6hvsjv_EnB"4p,3nkz9a/^9U@5{R(w@mܹ6^/hg;k^yXn7~7^<zzzl^$lWjc(^Gb@tWIENDB`logisim-2.7.1/doc/ru/img-guide/tutorial-shot-labeled.png0000644000175000017500000001706111541757152023053 0ustar vincentvincentPNG  IHDR++@^sRGB`PLTEYrvL!5$ AJR-)R7?UEv𲇣}#ˏr]*URVV-W\} 9F`f4]CoJz/7s ҨB.IYdm{w` OR.ږџWyi^KSUJS+TGm2эE8m9o7۳UGm)-g?o0TV}U uˍ}vm2rV=68|6Y`T;cJAnwv륿N5jbflqba-۰kh+Y|`dkLmVo2겎n6fB97Gj~9 sre{"|W7@9sPeApǁ;+e'C^J{J*8U.o0錍˽6-F]E.;`dgî%9aSy `˩}XT&SYQLi@"fk;>؊5R ~nc}gp+rqyudb/kyUΫOB%7:ҼIdKϔe㉳aԏۍo/vxu|_DsVYyTI* ][y瘃*˄+}L.']G}d6_)SؙÞ`o^~yvvHA b*f3׽s^L0="VuXʒAZ?`+j 5cJ*\/e))Kd4k" o}s3xf;ᆴ>EW2]l6ﵯh* T߸7}]=xSkj J+Zmc"j˰%Xۮ=ql-\ZH3q{)?샹3ae۫m뷪Ӣb`sd-蘯5VlepE}sQA *e3v_.G׍uov'MSt/7 ^+~Lخ6& `MaآB|pidk M;PYZ/.^,8 ;aӯ9^E_6n߲ (|Vد%e l l4jx؎v{[>>Bukp_n]>qߴ"zsC>Ttc"ђGr^X-vμ ;=>6.,a{Q-mg˪-}s+˰ff6r hגZP^6dM`|m64iz,;ς-83p=rL@ ݳRX{sKx"8"#hG?MkɫՒG2]a>MԹ':h"idARk/Zͭ oyd^@n[dLe"giC:u|ulENz`'v~aTUs 2(VYUCbHgn#HKW*;x VFMcj_09{>K}'ė@gK;^< MYK0qFQ{wU\,gl|o?}É⌋%M4MiAJҔ`SK)lJM`O9R.z.}rC -vԂ݆'c]AdA3g"NkNSOvT`Jg6ρvV".iN΃& %]#Zv zt ʰ.B<Ќ~ ,{H2Riڃn^zxfO v.^>>|lti>թjM=e]a} 66G|8uhwa{uۍ}2neٳ3ysW=7.[)3fqm!Ȳ5lV{zg:hv v:l5FЦdfuǹc㓃=auȺKf4dK='.]@ `/,(̕g; T6&`l=N}RT$W= %EB){%ؓSh+,lڦgN_eO6oH q16{#hHZKݸAeY67ϵS=xFz}|a K{F{Pil&B6&F4FMM{ֱ|^/)^c:"iFf+&~K4vo5-P,@w U`qH|sozȲGfٿeYeC"M^`-^/E> /g6MO {Z!WOͫ0;fS,6 `6ޜ+hU7Ngpm6ymL;^!l+ aB,_B^]SOW?,t3;-1f]>VOmx0'ƽV(+c䚻c.L,1*I3{fg9c'a < û(V膺Ekjp.So|Cg{ bqf?vet֋,eIϦ6{l!؉ͦVc]އH2i^lj& &ma_о~`ZHfNp~ ~:L~:3|7xj-,슓˶ Ԍі26[Rp!E[Mg{) Q) ZMW.ZT ޼yz>淴tA&`Z%u9/ M]p} r&sP'),-n3;¦`6`?s ̔&~Fڪ$R;8o}13gjMAc㽰J##UJr^;a-`ڵ!X;R S;:sԬĥ6j*0z3&Yv/m[ܶ!JkUrͷQ(Un?C`?ݢL_ -d.>&U%`|.nq/,1Mbyen} fYi{Tz- `+a;}oo 2> {uxBfu/ƓB`ޒ&OѰm83[ڽ}|, {){XHglXX9ME "rdwt\b--:zٌsVnB2,[W&/l dz`\26n.q1(0~oBwALo [F|lE]p}|P`\耞x> {԰]JxE[_&ζV>zc4v[ؖieb,Vl}\?ZM#d7ku^ ʀ 8XU 13I;}v3nB۠92L4XT,{԰] aalB5WiAU=^ؕ^rfz+[ mËi"C`߶AAA(/*z\` .lqˉAN'ڳAk]gn@=zpLs8fpЍ7Hq{-{悍ffh|hɺ^4',{a*s, y'B̻s.^*ɒf<-Xp(W K2MiD;DmrR%4 IENDB`logisim-2.7.1/doc/ru/img-guide/tutorial-shot-gates.png0000644000175000017500000001363211541757152022566 0ustar vincentvincentPNG  IHDR++@^sRGB`PLTEDqmpEir1%BJR8+V+p[\ZW1DCtwtaˇ.{q榦~ݙηi pHYs  tIME IDATx흉b0@-"}@'E 7L&!Ho"w>Bz6UN(Z%cc3v( hcUZY"EV^z< Wq_-lReƄv2;7 oB }E.̿cLVU'0U1?إ·Er8ӣ⼸ܑ| )%dQL m:hy);,g~)Lߍd'g&ktqwS%2:WJl3lE NAk$q%ڂuoXo8>&򑰓cǂ\%bZ'F 9ޛD\{| MϩڄlCS3oh:I1>^T{ɑؗEp+aG>5~;`DJӣJ0oԸہҩ3(WO]|{*ww"B}ѿtZ-b0bwb^+S{VUf;oԱ^ !;Ovi `lH!-}_\yf밥UM7I^Ȃ\i>..X%ձLvOvMR;\sg7D%.g2v^铴qUd]|9ܧͫ" aC\y|K_1%ʫ'5NݥƁ.1brO`W$WzG_fL}ݽ dݑ^mM3uߞ]Ԧ= 'xm?(i ?k R(6b;2tgcRBGK8+maN[nAFlƚ"u뜫+Rh h{`gJa[*نi[+Uo{)]/84ÿ́.?䁭h>نQK5 l6S6>ɦR-`+e^}f6fY!g7;aろ0y'5X 6 ;`#;ג^5vY㢰v9Uptݰ9p-[FsRpT7!_1v /l !-6l>ؐRCb))M]U2Tz(K;Ɛxmu`w`D ՒE6aI:~.-$avka m` ņ} kY(5a_.Lm؇}ˀMQ(UEvM̾C(;@5Ni%oSK, 7l ' tm`l؁.%-:lG9`M|k֬?evi RֻuN[ӶҮzFhuM֖dszviæ}:-w ,9vJ6jluw[Zոj {vu5nnqʆsv@3/6'(CBk\S;Ys-z`v熽4틤ZZvlf <CXy`(WfE`wmL{zzͩK={vw;@@C7i`[QfMVVi,]l4;luKs3YjFKk`y̗+= Ii͸i$pđ*3(:lZ^hDYn%i/KSF{~drXr=o6-s^dQ<a#Uܢw۪W,8\oτ5rQ9KPIE 4z<\+1(Qb4c&|5NYsiѥO٦MbK Ato]n1/koD7O^@˴=@.2#AuU^o 55>Y^`ae[sb[=ݲݱ@TnU;Qv[hzЬx+h3Z؍/`w"iq<~evy:æ0%Nj v)!odMٜmvy*˷ٱh7.K/4#瞜쒳.o6QȾY\ev)&EHPD~}sؿm  @vo%ٳ~L{ V [ٷqq^dhK>c/H; @2{ɳh~_ڣ-D麗Ɖv^dzv4NpQff]-Nl.ZشC? F=oNBGy#zB(GЈg=d=焑*\(lg۹8A{Ḵ ɮ. ]> 8 7>L'd&ߢ\F/^3h?'րe]x g aXXǾ!ފ:$%[r bR>a2Ƨh'mQ΃Q[WkܫƋV\p"aRK36wS=&g/ fviaWT`Gzy찇VtWk/`p4q&ٸd.`_fړ2e2`O[} vyaEzv W`۴ 4C_=ݩɶ\a{f@3/(PYָĭ;((g^&C 9 mw̓V']oMT*zL[R]mפyU rA;H6E*at3#m'].5a7`:;0agحlj:VHN=GL.rkUJž>;Z'Jaֹ[-aSI2FTM2ˀf)¨ܹpaya4}A(W"/\"K wAn\?j mɯ*`;K6^#lh{OLAsyNvJvbGo-.Yukh`{`F>[2;]8lG8`EŽSѵa{Fl呆RK.X Օ9n%QR>jv`#[ӃZ]Vfc,Ql05NWdj n.QqN ]G2SJ5@i'Kq`[dWvcZe7 anCmIagZHW:X:APvO5!t4h"x K:SfS4Ԉy@^07SeNh{հyvW9U6{Ax@G\̆6`%4D[4| `:d:Ĥ'M3AD5 G1hQŒ02ad 6sm~.όbvhu,9%yr-m3`)" {K {_HKŒ5ո -R-ۻ^UNzS``aT`lA H 1h%}`CǾw ]v6a{0ش1рeFLaRFFy4{h,= ]y܉ )`4޺{'QQ#z059Zɶ/MK6cUE73E[[`ƭ@m#T\5Yv( 5 b(L ?6ۈuqOd\2m) _E!0>♴*0Dqk4VLM6:l^\Lв1♥ƙ. fn1Д6k05GmxfƢl1 Zs|4^ ;5-3Tcn5! ᡉ  | t]`[.` rsoU}iOzVS68ج*ƀ `WēX*P$`#?–CWYSxd]l ;&;$vVSĆdǙK--g)-!ŝj 3 a xi#~h 'e5(:-q6$h3!O;v vi $6)F!恶~ئ$Ɏh ɮ  mVxqf4$]^`= lNm* .2z߮ `3, |.x΀ChrzAZ}R!C; ʲIbf(}DIENDB`logisim-2.7.1/doc/ru/img-guide/tutorial-shot-comps.png0000644000175000017500000001374511541757152022611 0ustar vincentvincentPNG  IHDR++@^sRGB`PLTEqmpEir1%&JBJR6g[\ZX3DCtwt`ˇ/{r槦ݙηA pHYs  tIME,, IDATx흍 r̲]-AІ-C1sa!Ho"w>@z6EN(%clv(4"yګG4J$Y{9Z*RKIػ:*Ny~,UlLh$ )MX -"EÂ}Qtͦ7a*?19Z."xH]-VJR'Qb,-XaCB\* ;9$q,Q"^"MK(!'HTW";BMXjf; 845NSXRQoW>EāXȱRvL*\%:쟟]څQT;po_DDQ`hku+ K J4$:"*&T@3a7aW8+*]A`+f5/hz*-(?Lm|+R[;RcHzzVi& SW;Pz:UBuꩋoC~ND6}QA^x q@80[ D7\iXl]Bz6,?հ+H O`Cؐ6$ ik& 5mʭ\+V<{`>|D+ސI`G?\\5vVr3 'i]?Qpd"2{o'Y׏yUDY1|WdL"P[v!tv'6 EhmgdFz[* wktW4]phn/5.tb.o* ,߇]|te~gצ^/Sj\(]5n~[@MkTզeA~( y5(~xt<~qgxo}[hG=V@3[!tGzsy [X> j[ "&W(qU} 4QDI- ЃIݵ<ɩ#6$ `Cؐ6aw=ؐ ך66R}ؐ€݄(acF{n7F&CL cۤݸɉj]Q씶( 6h#dcv[u"Sg!Gp?[mȨz CEt[!|@V?>]n [m"@U6cMڈ}]+Ʒ#M)mdvMX܅R]2͊]gha3/ꀭh>فQO ڎ.G*Ml hwI6j[)&ldeflF.[$uV%``c&Li ָBmZH5M۬qQYj9Up ݲ9ZzysRp>Tx`c?{1-B `lH `/6$X*cH))uCUtx*=I7Z[ɲ`RwMM`;`H ֓E1t=6c]QK.ֆ& {GH`6khQ(tj>dw.6UGTU4:4 FqP-eu %!Z gXf5}5|l^u-?;pإd]5aQބmv3vڼ f]5n٥Yg!adSXlwu$B; 욶af':B7>M:kC9콵]阎^h6Xu6A Lwn{lu o< ;q+4věj\gR6w+~w;:A_n'͒3u04`lю`Jf),plw~7 ݱ׶ۮ:q{I-Hj%mq-]-b*vkVgD`?a4\`A{ᰱjz9-! KA;r&mpt:sh2J5ҡ` [ݒdjdߥz G{jn߄39l/^NlƵI&ل+YOһ"o¦55hz$aH{fXze=e Z_ ˃W}tRJaMJ6Nzɞ bڽԸ MUg56jg1a[-!yPŴ+z ӃkM_4ll=ğ)Ie`y%:0e:v#:MHB1YlvH4p얘{]GDM`;^ lۈB_]2ʥb1.6oVddQ cG/k=GSΥ&agyNMhj<(ᰃ=A瓰4&%Jtf" KS֜vؒP@)lm{0J.Dik@sc2m5~osMy{"E 6;F=K*eؓ={s4oShz=ڑ7Bt j|vv_<_̭rF{8pfhzz`߽uux[kd I%q8`+wo܃!qV5=kæsvP`rQP]+;wO9iEэ&t$6 <+d9:v):dB=/T<#O>=˘.qC߲__:gaО`s\?P:cZ\J{$V '[PUh{-[dqq^dnhK60#J v6duW`eK;vmTt5N̴H %>dvvٮd ؖo<Ʊ 6a^Vf|-T1*xFzаZ8C?~ <^1|nR%{]^wpį=h ]${8njT6*g[Cw-Qb bQvs'U_E"_ѥɼ01ZܸA+a)~G=6 p {[@aZl6uL}9[WTx%ٿl%`c ;}ʱTg7`Z6\<pz<`kSZosf`o2g̗Xmg1d` `z 6~fNO6^{8i#uŰoxn8B=zI-{tF-Q`C{cDŽHS+[AfK-:Zbw`;¦˜c2ZVWf=ADIe M-8hm7UoYoZjLbX"62[db18iD=h)0FBTO~$3dd0MN`<>~l9ŕiYFyh8uZ[EZLWu&d#W:UgU,8=:h 4'jO%:ӨhjiQt'q0빎liK9HV[T|=$E`XXXׁ9{,C9m{# M4 -k/~7Vi;|[ *` ۑ ` C HȒ 1hƃl>a`;!ضߑa_/=y;|fH:z m~ }n:v?ls; Al>3K39Ms+]6Lgdst>3 [E c4]6LT z>3MygF:U6 l0Оl16DkLքc ^j>ͩ~U^c7{-386  vy 췁]d͆.xz{ЪyW6N64dҰNzm lL_Z d؀ l`C2VاM;~MeaIUųOďU<?YN<G}ٗ+5z lzP?7=őwqAqk>M@VGxgvQbgß>yS&ԉpN>aeDˆ[(o[몖q6DMfTR=3!"28}VhO0OX@ ޶1rU{Q:f'[zؕ~ŝQ=kqUjm{Qٯ>f:M9Fޞ̽ Qe  sUf\(:Ri%Nou/lQfZ)L|XeaW+Wqy Z,=cEqޢ;htl*喋RMsM#_23!Fe[-5r&wN\]ƥSvvE6AsU,]\a+Cg47*.IBw2Me1-` m/^֋仯ml`C v9!`C WISg v;]/佰9"=[wQlv&'k٩}%p!ۡaٰKc^nRZ l{#6vP Xу}|j 4l h[kB#*yWܖH{T M`;&مvN2k HwhaA~;{= mDZ0v6ca.S 6 }ͫ]ua}n6`& hv7{a0Ài;lwД߀^- 7Q{av``zJ|޸*}5$hTvaz٪`˚K)KnT<\1( 2j%ll`YxfR۰5#7Ibngmưc63]]`?=`vAdQf$؆u]v]%l [6ߘ>\kN?=؂BX\>f5>{496 i}A)`A|-D)UfH` -lQ\b9e]_6.rʻ= Z.aکg3^oevhv}ֻUh'vڭz}l[Ϯ]N`.%}-hQvX_6أ06 3k.z#]=,^lɼ[ ؀ ؀ ؀ c: R2I%`ݻyyIwYha_ջ,=Z؂kO9Ѱl*bۥ]Z 42{-hfXr8h#fÌ{̸ϴ̞7~Q 4m ͥQo*؀ ؀7Aـ=5ؓ3RԳLBnYÞ ؀m?ڼW^qF ;lٵ\QXb`6XrԚ1` 3NkKfYβ GSJO0L$9'ۆ/J?q<,FlӐ$f3pjɍڴ>-3>Ǹ}gՋu* Ã. ӫ({Ұ.NlKF;6/'_^a4ˆTmc]$5klӰ}v22>صd]o ҇#ۊٵ-o:J_e*a a Ii p`uNэ2)ت>>s(lhS Y2-h7Jeqgqemc fkTQYhC0&(͞1:h(`Ӄ SmhA6m꾤nk6"U4yZ?da;ojߟk}?\b[J3(`$8_^Wx7yEL2%ROk?CjR?ւq5R,;)>e®V2ȶ`?xfZf<wJT À8g(i0ص-}W 5<`?6>hA@oـ=ogTa9`OV4fn j9 (4r/?p{"[3R:…v7`TMvlBm=2ۘqDyX.ϮfWvтv'MkGs,ٲED騅O 68Z{x`6`6`1zcfBZ\7B:^[]*ZUoyIoCʏ{v׋3mOW^Af7[І;! Fmテ  gaϹ-2{xRm܁]窝^zְ3ll~#`v&Z=}اef|3bͥKBsJU)j;qPfp7Ы{`HCoRşLXf>WƁVdoV~X̺%i)nQ߫#WxKB'-ٿ٤zchZvl`&"E=m"W^l`w铘;S ;f-د:py;5wѯrkm.bҨ 4rL6]WFT>İZ)jƋg֌/4L#D۝,{ɷYjT6ڻ4 vfW/4Y; Ui.&/4> f\PjDz`s}/gΰIv׀73Bif@Eَe\qg{`g2oKۚqaXF#e94f/4pEؓ#؀ ؀ c=4h|4{lll)^;9`v%;=T`Ov%"r 8:l1E*K=ucST8&z+dhA4,&fZc3#J445L'U\ZdEY!f kԛ%lQb؆1f4[Z mW 3 13hڌ06z̶dH[ DkCV:d ׂA ؀Ѩ؀ 」4h\41h0lw<2l؇'CcNg[D,;4`_&2bX6hWf ^M\Ev8h8h)$T^_[w]1QfY NBuVkʅVf*l T; J$UC~L] grgҨW53Yh=f\Woxp}݌c)-+h&7v46WWu1LǰS=̮}ְ`v=7ƕy5|vVݢ f{XP# j1[BJ^;C}mw:ɏZJAŽJ(>ӊM6̸P~}Ug݂QA_5E 3>uM($`C;U/RU5zQ' ͥ32g{faIZ v3:lA{nC<e|$ ;&&XIENDB`logisim-2.7.1/doc/ru/img-guide/tutorial-shot-ands.png0000644000175000017500000001255411541757152022412 0ustar vincentvincentPNG  IHDR++@^sRGB`PLTEDqnpFjr1%BJR>+V*p[\ZW1tvtDCaˇ/{q楥~ݙͷZ pHYs  tIME@IDATx흉b:Sm/*Z,57;  眢c&dBLBaaҰ(qɔ?}j0Up㬭GmI+~|h "'nmeِ=-$ѕ?YTҁMBYev& Lυ^}. Sv{U˨׉oD3>-KE xBT8Wdm'^ؿa>xp,'/GNvI+rqMdii7UJ؁srw\Dl9mx[ƋhgmCTRgQ-JxQ+`=WLتNKPWeYS㿿 +h'&WBژd*LY·+l v]\2r_ra*h~[mZK^1/-\2[b7`P _Q-5ޮb]A`Kf7t^u6+_~ )ƭ OdT=?& 3WwtT 3(Dk.w<6MRf#s.'>d+}<}\L aҰނ,`:0ٙ~` 0Vؗus(˗6%ٍaɛrG߈9Ҭ,E#oG.rͲ_)rݕv8.nK\&([OӺ|mDqIt";fW]翬#y"su6sK/Xl +D'}UC-*Gls}IҸ"麬2L~ydG[\XՎT|ybyu 6swz[]M,&郏ع~œͨ^vt"_}Juz[+߆Yum2\A"*K\}6Q_j\(~ yyZ\޺+lQfZf)ylXe;8ذ m4wk3Q\Wո{;Q4~n^-œZC,|{WlTVkU&ԅhq~n4}SոjG+%d'/t}茦ԅV]`[.q~p_AvKv.4HC('uЋTZVOjr{lF8`6`#6`#6B a̰ -3`#Qæ^M{l&.K ZEQǀ8lv!'kUoo@)|IBT!&6,65FRkEfXF${mvdTކ}eM"H=ݷ ^/7@? ۢ" e| `͑}]+-M{n͟)dvE@D\kB=EHzQ.H~B#- mDZHu]mhMiejAMT+Faj6`\f "#٤]@+h߀=l-!`}6nP`61#4"PS_m\־R}* :UݨKh9[wy':Ua=5`SJ1=!`6`#6Lx^!)l葫$1]36c1Y]u`ߗCq2f$؆u&!I (s6{Pw3ǣ {H[&Ԉ} xl6`f*+"wSf%٭(#X-p+آo [E/`۰.7-U3'(sAk mf/ ̆dD ]jב2d+Nmp^(GfHmg.l>Çl [$?a݀ݵo=Y7Ը7ꅁ?ۯ8'">$l/ [>왅A{cK:[{A%Wivx{ ¦=#=v:Fe81<8Q``ۣ[lQ0[~JZ W0r Ov7؂kOѰݟ"[A>ܐBxXMb`݃&H}7%!Od\fAvݽ6ެ6>Yhg =h.tzP7Bx/췷)]{&=huE6hlH6.'sBC1k pv@u;{ ؀m`OvafϿQÎ[Hv!(*4_˒,o8.aԒG;`f+΅%cMӌyxEQ"aMIl~Y u\Xo#Kvߦ ΗLi[QA&g{*816˚Қ(m؃b:UBMyc`~a֠~ Ov8CM`]wmg ~;`\{A Ip,`+62ouy7lLP|1.`d3:4b_w&o/H,HB WB.~I%߄d)cC}B0n~C%_ 29f  TK1p9;O:St%lUd#A9 do`!K]fy-Ύl%ڤj{jUvHjgseMeq(͒M~rҩB8v6ֱ.l;$=*. 6d+h-aӃ&X "`evhK>1r~J`kqz%ۙ{?1aMNLlg}VgfژC[ &܀SxbDFGR0aľ$mFqH))5>p]|]f)Ҙ!أpH1VoURLqʘ! cIymgw( !]a?8;]ˡ6;8;T`T$"ـ`Fv{>(Z*5xω@nlkXz8~W9EA#IY-j@Ĵ{] ^[vp+,W%q8Z?뒝!žZG˂?rv~6$Z;[6xL\iO 6hl6{QfFF`OkVzͅRfu81R} g@+ *؏zY]5 :[`%*i`l:ء &yz5F65l{`a7MWRA QQٯA wAN;| a^AZig`y-uevxa?,xsΨW;K'A,3 !95`=YyS[u}Y.Ns"^#18v-I|+͇0L;I-,岊SQ"ɛ7v9 dzvԣT Je),ء-U5HmR:%)Odzv³/ay-ήev rei2QlaԾj,^&ͣ6`_N$;ds$' ~e%\g@U,*ώͭƝG:Q+MFJ5b%ϪCEU3. {׏ZmJ}~i[YCw)`4`c ;tYY:oN\#n~3o<ǶtSllQŽ[!VyʆmfgCUz.*fehAvd"6>Yd}k֯myTa>İZE/D6d|iy,̓+fmW,- uJM#%qevZUtl$nW|E{ŕYF۰ݓ4`K[;촒l骊,PEv,WO YB'+h*R:j:RE١8f Z ;uSeo{Ұu{H ؀ }{${>=ؐllllaw~l5o=z\:`_l*M5$imʚaRa-mnZKuFE6l<\7Bd!j͓\[K3#橷l;ؕ-$c7S3)u[bG-*ӰE+U5>%kqcZ^3Sst}5T3Ty !t6`* ؀ AAd?&ٰAd~{ʰ1/n|p↛>1 A` ?CAs]c_ ߮݉x1Z\*+DxYJQ9V՞lm*ɖ?UGƹMrR'SƁ'\j&Y5w2;7ȍuZ973l!Rk %7 %%XM=]fQmݔXٗQe|F{<ӵd lhrcq6q9VS6q[tmyɶߑ#F+(^Ո1L6Ը;#'d7R*ٳAkMH:PUa,ʳJ"|DF~NDڠM`t;#6fm&_^ H{% __'UgV߮XATݕ#ſ*hnVvYlM/uB>i-HBH04vV$aiNʱlxi9 rnۑn4bsfڜlEpܰ*38VgTrT0ے'L .3vx:Ubu5OݚP|+ꅧY) s0||#W_MXlƂt !;/;ț  `l¾m?W_o eݣC㰢ME'srbLrzIfB. 8W\~um1Pe8~P䍧^Z\ihݢ̸Q4 'ۚeo [%V=U16?X$}:k(-^{ʌ2 ֚qo4۴[OTmf\&77-؈ūO 2..liea f3.+hE7Z_aڇLj\JO[u3D"wMɌvȕOM$QEAhz2a6A6 `lyîJ A ;l;2$U-l㦍Q62g® )@nL[љ~sUۓ 䮄(T.n+qa*3ޓ!Gpwm.nfro}#rqF yj+ݭ 7n ۢ]`@ 6cM}]f+vG]S Y~r&mubvV O}M2V49|6SjB myT/'l 6IrWUMZ.s 9`l=2fRcf#\ ;3l쮠*o{ ZuCm\vf-al`'S U&7j㢰K*8U`;o^K;pvpTþ=4ur7G3@`l `l=)H:P3<2uOޟyN1H&찦S;FG*vmH6~y{Xf<%a(a >b137z<8ʰ/&fsly8b\zI1l 6rFQ[rmd͚]xQ9*af֑-#،$i`ECۻy`;-Sx&vGu7p:\NaIh7vr.Sݑ C&!*^-2ԡ{2;*cba"`W?A.#h ~ n@Sϟ`yJzHQ-*EK7㤚 .-#:ߴnAfh{q*hC}{Thg@֝ǢMhA#zƧo1vo d O,Q}?oXZ`OqO-F8C«e] |#|[Vr9n\kS㚭z?ܽlzΪVeƧ 5:m a3 l%jf( Ӎ"3&>46`l e66>!v4c %2+͎tWٺ/&AS!VW1Kl >q? :֏ dR~ 6,W; 2m=i6$}e3A &Ǡ:6\ؿ+7{ ۗLݷ4`?V_SSO` `l A6|$XG1`Κ^Q[U׊@Λv"Gl).B؎q A6Kc c8v/_#7l11wS9Fg4Ѷnnq1c+/l5;TJ@I~ˬӃ݋HeUHكVvz>:|Rz0]*hhk֫PIex/WQ `;f6`O]ffje ܸի{ڸc֫Pf4Z KнzM7e;͚m`5ls A6a?hhvl A6 x+9#p]maޮUMy'= =K,eY½{Zٞjk4i/[ʣTbȉ/ExFUyk1L筗#$h8JFѨSĺUѧ#i|[]/ج庼xagruz8`֯YՌ2agjuSf|%u+Z M`f˰3u3*cfyj6E+"[h6E&~`T)ީ4 ݍ`Ġh6Ġ\a}l ;hJZ؞}{Bؽ̂6lsj, #l>ƃ.:bN"#@IS \08>Y՜j 8Lg9f;ШJ*[겑zz2&6 CXP6O6TІ)M3.0Wqf8\4KQ kY83=Ap ` ^})k8aA`GXc`'@+l ?vق-GRO$J6 IJ]ލB@nA6j$1 D뙤$t09rS-#7:jU6ѓ )NOD! =s{+2MKƧȖkP;ۓ2OTT&#ZbQѱJq=;DG-$??2;Vc8^mTT£I` ᵡK$eGZqᙞwhjxKJ|Ljg!irw?3:"Xݬ(6MH)=\OL՛ !$$0 !0ys&? z-*s!۠ jҢR>]nل0΋}`i7gyLA'\?PH.ΰθ`;OSm"dG"mҟ݃9iN WRҫ'Jl;ݓ?z)>i/sO"6&4c)RidAﶻo.H?ё$5=;-z[ՕĊ+aIb>~BfrcN&j*zK|~ _ɂ5KS&L8Tz 2Q*zRIҐj>Hvgń")6]$Җ 9mar|LH9ѤݬTbuUK=P:mc>#ƸAQa*]ʡI9Tc[1 Ci&!$1L³DI]LBLz"Yc@+.&mu\qmaz钘5Τ`bm_`☉4ߨ&қf$5LwCfkI?0$13t1!;U&{lL*uc#rQݕ7|cX*~I/& S iۓo#ѕb-z0+匍8H$0qkVxգ}K˄{u!L޳"(&Der70ͯ:ۥIa-)MCm $?u z{rWɫ+MӔJawn &&Li v]m __lO4BfBE318`&ExW D?LГKf7] D+$WƅsI ']?=gaMvIv&{3I0i (˞4:ҍƅ_=I`R-hR`bFK2V$DA{1ە!ǔb}ZlP^02V _4kj\$&#*2ShUSL}L&я$=a"Q&{k&>0H<'Y P[` ԏ"?SIo>0Y 9p(6&yU  (EM<S!pFVLxUؿ! [h~h10)&u.A[8{]LZR(Aə2ǃ494UI7ϑA,E~ zʤj0A-f.iLqY@em퉛v\_{"1aI) @' !dF*F1̤$o%2|ѓ@ Îx{ AÖUr,%&4.#LdK\&ix<Z!d< '0Q{/UȭYdɰ2ǛcBk>6ޢġqи,K/1yD+m(4Ggwɵ+i o#3aM\b gd`9n?p=Q<-{ud(5oL<_ϤxG&L: ԼGu0›x4;imLLg-N~&E {&V=G􄾫F9m"73_ry3?wP(]Y$K) &HA9BzR`D?r~4/ L|>|'B8jHb-19~LnK뮮~rIz/L'8WL 4Η"טφda$d- L }`'JZ2>l9Vd&h\X.L|YJ|~)䏧$QLft٬q۶sOP3ޕu3.ROz21s|}]Lֹ Lp;ΏzĸΝL^sdҲΝLLih%eĈ]Ȉ\!G&>W=E2~M(RcΙ?^ݏ7ؓ#Cy,hI41cQ'e0Ow5 ,R|;f֕Lxjzb1R\ {;2A U1cä q?9s$y" KUwus睞CDXx煍g i^=)dk'꒷Γ0NޠJzSk °׭'nglWnO^1.`Һ7d`5.xzZ&>k??؞.tVOddQLdAO׫_MG&b^2?}KǷ'`qWǻt9żF5Ֆ'l r:2?c)C< hsXey'.H2쏿1W`1@`?uGx6wDD`=z8?uį>Lz=9-`=1ɚ'0q &^1I`vW`ɚ,ߗɯV1hlL/d?}O^dQx.rK؍N?ĵ?^~LCnx.IMmቩWRVS]uO?^KY953NF7}?F=Ay7`h߱ixgf)?^n^z˜g$P"3HKUӓE0(L -`cqL2e;":׹30v)3<C׹&o LF1j*оΝ[Z-0gĸ[D=Š u&W0Zrgsힳ0@ S{LM&4DŽLfcd g+zѬ'g=Hœ ZjH{{F]/Ξhr\$W{P$0&OVUեn:ٞQ6Cˤog7tW v=5L(|4<0wMї_tgID%;9Q;ׯQ;f<0#ՑQO~J!DO,ƻǻlzxbO038#!å dRm(ݥ] a`M`(Θ1ȶu,W#p&ֹcҚD~z2=DoIkw垇}ͳ߾_8_x"#%]$N<]EyEɠ$SO bDSPLws*Y0" (L:w:8=_(ϓ2#1dL'm 3z(z:$Gw2w$n L'bRAdWɈh!W8N&<ű7tB:W &i^IDm&$x/L[g&b5#7?e"e'\AL:$?mgD)8'&M%`ɞ'N 3gf㹥VA6\O ]db>cD-~/[c:d$0 Ld)L O+OcR&I`,ɛ8L7e.~nh=+dRkb`!oML~nC&ej3Ny]> we" LnZIp_y`? ?0LO6#GLAO\1' WdJK<Et'&:O+_<-.T]kMLw;҇ RV[J((?.ILyZ3It}A\=zRe`mL"2[$?h]gn$]v٘lLdO/aѓdu'32apܼ.S[{Zҋ *~z7'A_k)? LbWi!"`Rw)O|FbMϣ$_gG!0IW!Tޅ8UD!طIENDB`logisim-2.7.1/doc/ru/img-guide/subcirc-custom-layout.png0000644000175000017500000001451211541757152023122 0ustar vincentvincentPNG  IHDR4\dsRGB`PLTEp/lpz vJ$DdBIPj[5`caHlDCb͉2{j礧~ݙνφ# pHYs  tIMEPpIDATx흉b=o5IZ-/&(*npNM83`@ZaQ?*1{ G3Y{^f,DsmtqE_x߄2 ~E+UB.NC)2Buيȗ*ϮBj:+?/LYd00ʵEa(D _mCu`+Ʌg(r z!0m+D(?hש]oL]yq=0`ycBé.0֚j0f"Cf_ *Qe&c~3Xǣ\XIpBZ'7G"͋냁81=*/E}{]eWO. ^笔*d^ 6qUƤlaЯȾl79O&|K2Q:!.M`& Ft܍Qu+Wgv;3(ђeNmPT'Jx!ٜ%jI"0qAlRa{QM]tUXYrΤ!}RR%*|^M.2}Gb  rEC @n3TIu0o>f~Pc#UIiqW+jˋ nf i'p? ndpcc%cȍGւveYi!A\[ Gz1T:]+*/x3{YH.l/S^d,@.OlkRu<8];@t yot:v,/*/x(y1-.( matWX$9,Χ?WIՋ sT?w/*EthԆ`aDnEy<2;>I/ 0<#Hе  0H`?2 יf00l-^!Ԏ! 0$__Cbrh*VU`r.?O CW˷>_YL Tl1!IŨc@2F7;5w[1ލӷ C!]yAq0jJYa=o֧dP0atjy0t`=AA gX+a$Bgh`it pBtt?1$&0#Ru*0ijaivD cXgŰaiOaR? it[th5J ~qNb{Rp=d`(+2kՇ !.w 1`  al96O: 1`spi&0 lb0?e|Ʌav_ 5A`8cR0(91 aP%k]c 8MamaoX#QraR ub& 5%aš]SBڷi7'@8zVl=fgƁfw6{X;ѷV0,a@78yb1}īcp\߿__AgZf'0 C-Ml푟Pjc\~C18J,˕&9qFUrT?Y Q\fהBccPvm("" ma1lBtԉw[+vQ†*=aGtŢpB!ܩ'i:8jJݷ2 Qf1bhGT[>+m`8N1M?!Vꢉm-1D JUXJ\6}DW-6 p Ct1,80e փ04d nP-^7q$A0f}5X$Val6;Dkc10u)5o=ݥ]tg`u5lCMԎa<N]7JFvvWL x x:H xٴ`wrG`hPN0nbAp}!!3lFC% 1> C TeϟZPRӿUb*~컏L~N KkCZml#6}7Q+2Cm5% C>F{vn>ІmXV: Gj 'Ś 0fGW>6L!n7dՆ91M Y0$m7[\6L[Co! Ơ6ukJ0$A^{X7nCY [lEYzOK# Ů8=7Ƣ?YJ$!c pr"òCnm}!D7qqx@UcW<.Į fOd&ql>FEvoW0Mpb$1A6c@ ~Hxztڠk1b]#ⵖ1NTu jbQDwv`:Q=RS(<3qG&î(T<#^﫰^j=]ZE!W}|qD_ Z^ htFKY#YZІZ$stao`O6cdn CDbaZ0i1 kE<=-kC9Y<1a9 !{6 }J^1aƚT=Ϡ 3C>0ut<2m š/ 0SbH'FQEaH,zd H^h}cѣg%Z{ҧąV1_h3`}'3' CzEo lF1y@ Yl8{,kv' DiMyixhڰ׋n)~st7:z %QcUuE{g%n3lnNȘ J1{FIk7E-QF=y9:u}kCŬ Y5aob@ ;1gCL*CqϞE;ax#Ş;ـ!rJ`ap]0`zECF/}?Xn疒d&d1jmj*|T@3-p +DŽ8֭CIFo3Q+.Y7iXe`}yj` KC3cRj>*P :貮]~ )΄jNLc, eJyܨO5ǷCoT`hrs88-1d}o>|&BXrCydF}w n ͹Jw)qC-< Q e&oo1y1kMicd⨈*fk kM1mpӭ, Ϗah]D-ɈI0n 1S;:cא`0“':ŠD#_;0s3cp'6P6=`Xy9 4ĠƩht0Àхc<.z\wA1 ]8FEBmT'm{] =^V4R{  60hh4`Ļ\whͼ9Cs֔ Fp]zohtQ,էv 7߬ٔ0IDX"{l!cH4 a>c`x2 V a;87hCm.,Cb+Y\ 3%!/P9s^X ChKs>%'==)0T^ivj|}Jéþ1Tӗ:os[63 ڀ{0V Hqس>`ajŢ' 5vэׇAFF,艴%4MW&{CK,z*ߠ@9(51Ģ'Ԇ>%bZi+ZL6rmh /**ȿTDLv:[7t`h*p+0^^B}JOV:@*|`m|.h Sr=E00äe]g0Vd C@??N*`b0E\Jc@|(M,ZD"W20~kCJ$~=noϋǝM `v\ \:*`p67VdpipѾ`4 +2\-]ttр!U5 0 UtA zX׉aSA@` @7aȌwZk?ۘoFMI c߬1$aH7׳1TAb7vWvx6fw;0hO9ً0`He& m+,ֆI"P6-ׯ0( ZzŒ CLvVEW1l,=t}u ±&_8]$+U|C 0E3ӲLzz}ƒ7^bFIPK{:0⹓B KKj=1dI1\7IPN 9>mj^6)zUЉ'!lv \C8 TuW)Czr2TlF`~ f'kU`_ZێPDP;P`%b f4JyFCŠh SbphCeѵ7;]) [2譊m|V&҅>xm;ͷֆtfoXMkהV4uA.c u<=x҂Ibl AZ:e^Cʒ޵#IENDB`logisim-2.7.1/doc/ru/img-guide/subcirc-custom-appear.png0000644000175000017500000001175311541757152023061 0ustar vincentvincentPNG  IHDR4\dsRGB`PLTElloEnqCIPEx^\ E[[]ZsvuDC{ȎG[䧩ăϼD pHYs  tIME5#VIDATx c:qW-P,Xj|@ndL.0 bwvV0@ha8B$JEy0㴭egOUp+T-MjWClR2nd\\PqyvXp:E%l|Y5FTc-M,RNbWO-Y#haP7di] DCm`@U~XR4{npaUK*UXr6D-e`gt30Xrijlh-U}y ,Tx& UgJq[{CP1L!oh\=Qz1\-UHFL҄mڄ\[(51T ^dSXNJHlހiֵz9cUlpO`eif`0L!d8C"Sexe"X&nTDb9R1κDgXN F&7`V(mVb &zam0*o6XQJ(V(nBU- g˚40[r:IryZln1r^fkQh`S*b1kCOc\dX#ˊUNΜb+. 9Q|nR%"[VϱaR5AeR@NA/V8'`򆋮6]t 4XYjaqq.#|C\9Y]t[qBwx7i&vL(7%c03)o ϻ#f3Z׳:JlZH67S*)qq2#ŎClk=ރirfVv vZKd&\eViskd#vE3]WJBꬊ=(ٻj#o#{)f[B Rv;ꛞ2ed1IʢSqT&ER \;h)5!K)D(Q>D0D WBXchBp! C]AX'ԵjAP4 ` kbI[?SEtt Ns$VnS1:Eʬ _u@fG>hta(vw,R]/TP͓ aEH\{L n?`M@6.]1({ZfG4 _It ZC CE*Mcp#v/A0ԣpm  ˺SSv?)D7š)0`wv"i.M!d 91]Kf@9 T Cja"'Q?0 kCҨxbdÀQ=Jxng'zb~- (aE&iA2 V!1%R~ ?ݷ;]#:}j;Gc@7a a @0X< J=r=TFiidCKOTyxҷǐ F4 s Bd% !=e:2Ub/e 30P V#" өyb֎ !|i8@Q)cQ7cbYRR0"3 U7|+[7ЇHEQ"Md4p .]lTd9\DZ~d lm61:0h &`jQ:@bDkU5X?Ơ8-`0oLɠ`he7L  1Z o`AF`0^`Pha;au -d̰\ 0@}o WF `ضo 0:0|},$I;sVT!vT#2/[C[䖸0 0$dP0 '2˦D`H40K0N5J.u164J6 [Jm - oXKh )` 00^ݖu67As6.ޛ, )RC~:(X _fa^C>%(`}FXDL!/?x*pKNjqEUe57e`T!Rj`(׆V"ߠ%aoa ]h7N!f. 0GX}jV+6iپm0fz$$0o *jC}þ!20<+Ho$,oRҺo0H{A]-:PbUս {1}`0IŠޔ1%!sѦoILiq -ȳ N3t?E}{`\ D8ABNhE6f.89UEշџQd3s;2S_mb(ڠ?ȢڽݷA{Fq5 #e7yZ A=kf/|Q N(.zRbwݯKbU51c%Y]K2}^IxQ|c; oL@3 +344tq BX16aQBM`6!g fpBu >4!vl>26'R!!cP?ӈ] ǠC q ba\5̥p2l|->碗xYĤϗ(b< J/Zo.# $e2*8QOEL~X&A ^v櫃'm(.ÆkE{ǠR|qSP1hʠdRk5=: EE+k[G1tQ)\wt;` Xm}nC8 a![CT#ZmLErl^Fw;R!eB@ahM804+ ÜmQDk20  1!b؛){^ :9쵔 Au{VOY\% @x S?^^+6 bh} Vapx!7ټ9`{K14  aaػm1L[oaW6<xC ( `]0E^d z3 A0 A0 A0 A0@[}kE3]61dC@ CSAC C 6aV`,)$`pS  V 1Μe Ԁa5 Ra5 e0, VàS` sJl c~_XJ܉A뾱8 `1⤸Rl0NQ0`X  0!` 0` 0` 1,tKW  o/` !8 YLBPrSڐq ٚ]>նRD&J6pU\PmͷE[D+ՌRnfj[100k77P^XS crb熿\zݯ(Hԍ|w:vZϷsg t 1<D^\Pw㊣|نFK\*enXǫ7ozX L ޯ!,ǿ_?:U-b``bqA,!-! nHNĂF)=`pש60|2<|bhC~oI bvaX>FL f@ZE94]pqgm\شohho-FXo bctcJ , k{>Na 1@X7p0`Cq?-mssIENDB`logisim-2.7.1/doc/ru/img-guide/subcirc-4-tip.png0000644000175000017500000001424111541757152021231 0ustar vincentvincentPNG  IHDRwsRGB`PLTEp1on{ $DO@qdAIPa[-9ldgeDC`̈1{k棦~ݙνDb pHYs  tIMEGIDATx흉b-G*-VXoy/VL)bd d2 m&/p@H80 R8QF\"yRL0ZOsݑ2lVqL5E ]Y:։E)b$ p-7sE3 C㘤s[ 4S81K3l? $N#?)[TTqq ` ΟQUDB=]G,Ď" VO p1I)&< ͸b E5+  +yf$;ʤ љ/6RDzjߦ袈MGJ#?pUIDl#<٭yGD <ϤZIFgMϿGX,BC>Ee, '3COLݭr~yIHj8BVNCWB8hQ3v]2QU#TQYV j~%Rm$@mJZ'Jd$MU:-+z=-a |y|EYFj tqY)gNxe?CtB%||2{Rk)TqiB^njINRU6JǠDla"Jh,*x1ETҙ6EG2 N#=,Y;%<"qiuTfv#HEQ+2%V>R;ŷgZWmŪwQ)ghX75h"#Tg Vˠa!ok+g*"47e =Be]AN-*Dhj(9r;&Qeϖ*Lw" Okӝ 8_HQ 4NB8KHOpB'$ 8q k86 J:si"\NJ̾˄8s)t~ƿz,{p$7 }zky9HͲ"SIX=_U4Jqd$3{.?2;;dC^DuQpq9D-WǛ,`ArGUXxszI~9zGwox ~(.q/ݘ@A\}JI_a*g.oVVW}p;[1o/kwuvW؂vN) ' 9]6wZP$[isk8Uxe+4 =I p?T;np8ę Q?93e6ԪR,FʶraU4)DN[1r.{*[#ZLFXe{&ؽXJ$,@\\F]ٲ"u┦Ne+M![):*~x n;v` {}Î@pܦ,[UQ>E*zWh|gc{{&:ǻpNH8!NHpB u8!3cg i:UL'Ƹ'Dȍ-gN1wFk 88!0pB'$C*&v"6SaHWxHF$qa޺q&U\]8m8߃3SEE]4oio㕴NFYQI:850$6aI@pFaԊIF q2qN'\;p.-jIQ82_aHgc'hܦlB|gdej_%!F 81RwlחɛТi]/bqfYyj) *Nǃ {+رGo80VYVn; \t8ŧA{ 8 Kі$85O˲-umzT8${|MK:9/gq8mQӵ'řZ#*ӢiW?ڥ4'Cnpsnί>5<4gl郳GeS&͚u9\#*t; pV$N ~, C +>ه$ɗpkI=:qi Sd[q84iñ)mJ-pԾ;/VsځsI{Pܯ"0FΓgcsCAN;gUIg 'qv":NL!۲ŪңF!rdkg'~š}gk?2lr,ļ mòx*].Fq%vUzFKKڣ+~ضsyF+ʂٖV"^NҳԀ-87#]M5 pؑe;;aDP#}hAQ?)r0x#[ՙBNWMtsaܱ`/~.SOe4OȚWh^=iSυ} 25M X^1>rԣv:c)Wmd%:*ia]ܲWh<ξ3vpG&v+TځgO_Ξ5W_>~|A:w8_i;YtnpvLWsmp^s^!863NZrHͶB}֮8{ϣyЃ&dє Q٥t|d1_+Vhx ΂,\Xx]HJ1 'h'q>-6ڟ38I'~}'=(QLf|AmK:/$&DO3B3_eyG:1`{>beԢXF3awVCUddf9^󮠯OgEE/ pF є;ie8oerB~~,ԊydpH4zIr Y UeC:--%B~FU&B_[8 $G gl=[fʲ{0m~ vldq~`٢6ha5XS^8gp6|]ǫ[# Y"h!2xg+Nf1ap'qj^!B]8sn) Μ=',np';g".>\FVpTtZ)`Cg=8#˱2`N7c YWƠpx=Sb GaK|Tb0:݌0$trBD )o7WqR{W0$-; 7wʎ 12~V ҡFGZ8} M ΁8| YKY-pw\ޞx4v̍K'BW{~lhG?T: K2c8(aç{}Z[|l۩,y yPh;1ܐe[w5~;*z/Lh#Wx?8v&qi䷏Qڐta 83D)ghBݬsi7.-m){H'wG#ꡰյRr1q{}0zLe{;qv 8rd-S_f\g<)x(NK*(gAտpP)Ą"pb[QVK%SdOmSGE Ov!q؃ݺv*uܪ ~GTv[͙M_Zw J=> iIᄴ83-ΖR3sr9sIENDB`logisim-2.7.1/doc/ru/img-guide/subcirc-4-done.png0000644000175000017500000001405111541757152021361 0ustar vincentvincentPNG  IHDRwsRGB`PLTE-lm~{ /2/dAIQZ]Zj]4IlsvtDC`̈1{m礦ݙμyf pHYs  tIMEH%rOIDATx흉bGƤ[^EAѸ9Q0@ 1=BXK 8/!$g8%績%Ȕ z8g BVɷEsbSABs,XFq;,l4qg6LyX9'* 2OnY٨'$pBijqJۙ臍Bla*ѵC;YT$E[@ KwD eqË\!+扜ge2^KqpO(5N'UT~*uU蔍Q&)Eۉk~^:J ŗ$i}ftZHnXeGTHE'3m:-DϤfR\@ h8KN1R먌lFe;*-)qVH=]uQd>_Nj ɛIq%v~}"a"kF{|R,"86KhBlȿ!KbzFb;Sr<H3ِI2fWxىa&x\|zO$~-c A,CX|8΀3-Cy-s;[ w|}g/O(ѓ 3'N't#L2'~h)՛yJdK͍܅U89%O7|̗Gne~ h'`g_eQ0=xEsV+_W)2H<'YoT@Y?L9ГŊ&sF]<Яi{=Awɛ-Iġ=h9XIYGb ^ZrqqpT<ZķaM捦@c=*.c@ ~EaeA3ܓ ]q4Qt;ae Nz0Kތ3=T^-`qvkE0YdseoJcXV.ܭP1h JZ:Vt &So ݧ̪[[e+zBjWX!hPɝ=]c{ 8 >333 ! a>vgPNgsp2dY(3pڶ ' 8 'h @6-&u'gFm-`6FaJ2mJ끳`*} E-Pc x<v|@JxgN+C$4143ϸ Z*~'|vq)*:N O@ϬUaף5FV*8 `uD0FIB>8TvpBx8Bv[iN, 'rM8'8`h<YN’Nh&P<8,Be;9oNKדI iU lY0M8IT Q8Qlu8bFȂAYl)Rx-^`k4#qqp$&{pl&g8MJNp!3p̀3?qpd8hl]zWY&̊kS>Lj nQiǹMYq{sGx%'YhAu@,Ulju? gb`D#??:#b@LI#N')x!ҩ<@OD9p8d 8p" ٤,X9Lk;JNA9<ΌxdM-^^h־' LH3F1Ri8iZp^Wc}CgiU/ NVq^\ )tNl6YV+vz۹L,/*0fJ2N):Ȫ΂R NSl r]di(?gJӖtzjj4 dfčogNS b;O󮍨uM8ܬBKcwK1?rv/Wqi3ظଥ_T~JVٚ|ei 8+ӐEe`dRlMV$]v鰷- Ū1E+- _X9NxΊO* N5-4Cs Uv^x* ]a4G gbsmiN! ']e[Y]ҤqvsB+Nf EG΂!U"N+NcUhl+=84s i;)Kֲ*<8:lp#'W0 'YYy?D.~8O8 *Ot"{/RosVZqv_Uk?S3mIxzFs _66 )K+HXZي _:9HiBv)Wٚp>M󱞶s}85[su8T[-9ZUeڊ|+^8&W&s @YPU }'\#8 w|wK:7eR }NNtbx H hv_tU],p_Q$Nd2V+TX8zXUP>m?ZSolM_lu/ ysUhSҩ])Zl#[U8=9NMql eVI}mgcGe 8dڈJ)*~Y#Ɍ0.Ѐ#NV1ypXt53v4|F ^͋d_s<98w#@v@}.]:MbhaPFxEgp~8ѼWyyr2pgv KY7q:N.h#&#k_Ew{:BxwXp}~RB9?{KDy΍S_gw׌tii; 3tR"xͳM|4VYFmJ;S,|^qm8= Yd_myeQ3Bh8 f\$+_?6q3fBy5+¹T)pS4.b6nmጞ༯2$5uhEnMьs=[am8+_[SZǩ,-y*BP)>EUYg4Lngq첑OoヰlV|li8 ,EU|q6M18BH6vxfV!Sc0G) c x$I}G)߽ l~NVM~RyC^ѿMOBuLHؿ̌!ΏaRB$DMj #zG{Y)^KWCj#ҙ/Gr";O㐙"ejN5M(8 2p+E y2Z*S׫ YJ'HҐBʍ8rvUH&bgXu"TIa$bYnj++#:*RO1*f S4# si1#|z0p8amb(p~SkUiư -W9•Z@NQ™Bpn ݼ Kǩe΅7 8s|\[8u3_'w%H4;kap΄S~57`LsEBw9N\=ldoCfΤ+%RRNtl`->~t 8)0gIENDB`logisim-2.7.1/doc/ru/img-guide/subcirc-4-delve.png0000644000175000017500000001517111541757152021537 0ustar vincentvincentPNG  IHDRwsRGB`PLTEp6kptHz $DdBIPgZ0_efFlDCä1{oޤݙ˺}N pHYs  tIME,ϴUIDATx흉b*@kZXcQ\.[5*g`DZ0 G ͆a8}VIB5쒻HT#.}R3y3nBZ\o'l)*a@y{<.Rn"͜Oq^NU޻M_^k\$A@OaIdpPh8}J̓3-P"T{'\,t.}fm02p޼%XD}O).\'\%ҫހK~p&!)<1Ͱb B5+}{1R%\ ?YijP`I xU1{"K7HJvA~SY!S u<qgY"lnpBY>A~MݥĹ㼅S;)b?)iY~>gӾ_IT( %-%9L*U) Bo@ N,Y%q+}Uġ ȓĠEfŐtfִEE%L#/bBئ3 '1.ό3L!g%w1/KFdNHy%O̞6BE)]Q rdK (;qzD8+FS^ K^6y*xE'3e:-D&R@qs6 zĸlXhLpF-?8=sPӼ,NZEK2c N?=ղFMHq'ށ0W_ɠg3B>,}lJ-Чiؐ!ݥ=A.o3~0Dxz@CMq_#n#z ZmJ ;onͶ8_ke nGgaiq`q`q`qZ8A[7^]\29:$/,e8Q&ęJ՗`ǣ(EpKC_AQPo 8,I2HML9"O(A퓜"_Bӝ=Uʣo|̣I$h` g߃%QM0=!T|* DSO'Nz2"_gOHUX\~=?~b,1{Oڭ'!P<~$!8udM3cͫ>8{$I̚K.^Eo@=$aG,FcN!iyn,l&48EDɍ#x8,z;-UqfjӄǨEa%-{(Qo<0&0Pڸ(lyD- #te dK G/l!86, iRRQtʢUZW6ޫ3=~F6`q`q`qZ6X6i8α8-Nit8a Z|;fN;O fن8^.sil Qx*Cn6F*N$)a#F(⊅W?%g:g3OsDŽ2pqPE Y< Pg#OHNBcC"ax2q΋VS(:`{h8"TO_QShh3wig'LX?8+<M8a8>'ש)8Q3γ4I'H&IT c2\$,Ih‰L T*8%my^e6lz2C 粦4[ 'Tيʶ**N3NmFrL{Ja %8R0%tNY*Y9q8qiYb 8K0z#_@BoomBM:p>]n-9e'<UGmo4y Nu>[l {\Q8+=u:|:p5Kpv#m!G;-N b;`ˍFvhQ:}4„en)w%Bp3'sNct00HEl?cy_v5›ٷVxHJ4jTpFxP|~74׹degQ?"?1asTe g*83nnK > lUɔ-V`V/M"7ސM=Ъ83ҦBEB_ƯB'=PSHn})S5q-,` ݴ8I}`v0xU|+#.Uw,._q8 tO$Y9+1냸:d+4 'Pz`v 5~ԝ _ڠvGfK8?.C_g4ѣ.24B)G@N0T0ep6q}u3S=)D~B_);k4ʯ{SFPgw.i|SUTӴò!SWA+:Nb?QtIt ~eT8`8\:,~14Ê~ٟA.xbDwpy8+ 5 K: "JjҙwI; u}AvS"{3gfO+ԁ3^l+8J+=*8ۖ‹NUْFqqz{ŹV9~ISK+c[QyNSJcŐL'׃K'.99Ŀ =wZ@-.'9xtv=\B}8>%,H}doJd3\Qp_Q %=hmzt*%Hp@WʤKQ9"X>_ܖ9"f|)# )_L,N(Zz&uIZ8kN3YO)TRʉt%ۓJJ=+&%ezg8pMb"uӏ+Tpi3OPIeMqn3Ɲnq]:A7Bz`NlӆXt/g C *~i&&7{35x*NrQq>0vYSYK:#>UKgy9lnCeiO|+}W N4FLuoӽr+s ͘=`7P,{Kf?0,^铺f:8_YQ?1')\xT &v82~Vp"88ǗN 8XU{h Ma! e'F|[xэz"5dZÉǙsI4tySZj 3gȂRf.;:W,["xMYX T%X3PMKbzs[p>Um7EsL 6g}歗W)ν Qdٶ༳]+"dq·SiM\$+3_[q8}!8ֻjڝt Bþ*+Z\N"1i~e25sѲ܀s)TVp gefѦ.Nfo{UBN1釵 ToKd|yB6:o&[?7Ny<ζ!{Emq΂ӗ8mXrp7Qhst/l#o-N$%9~ɠr" HFVq9Qh8QH|0r,aq, Ed7ߑAyG z:tf*+ձ-m #Y8Vt燘QŃe65#Y8bqbj UmLܭ[@dq6+qnTJeq4(BPP&Lg0|8wߌP9N}B:%N+iqZ8w,N+;ǩ׳-}Գ-Νԟ< άe[6*ԅ3?J羥3#}18w:}zhw-ÐS@',upGH8f@pp3ÐYP\8+q=Hu8? Ŭ.dql8XҍQNIDbsuST .wW.x0ĕ-p78׫w c\rcl0$]nqnUh9gݓܭBs8OgkqZiqsBgؾBvl\bqZS*3A6@4E?9t*|e̹q^LOlcg{زSX#>9L!Pv"@m+W 筨}09Fbq^*8Ll3Lƒ%|ʼn 88=c8qٚ"hfin*>~ zl$P#t[I]E|S7 yy{#+9xxp(pۺgYЀS~,7--[ !O pRo1P->H_e{SqNS5pA:}ϛX:{7TTծClʶ"-;8iN*m;ky&ZQ9]< C:͜ɶll;C~GA<Nφ[)xy;IENDB`logisim-2.7.1/doc/ru/img-guide/subcirc-4-add.png0000644000175000017500000001252611541757152021171 0ustar vincentvincentPNG  IHDR=[isRGB`PLTEqlpEgq BIPeD7R]^[\ZuvsDC`ʇ0{n➞~ݙ̼>z pHYs  tIME`|IDATx흋s:IkYT˓MB2sί!33HxBؿ evN(s r@(!!dW{}*q\6՛'bo3C@҈#l8Uvs [fU keEF\ʺK0P)Nئ8^ZA8]<d%'A .5gud P_e*.šb fć>~YYTT?;oJB"tR KS-'RV)S]@jL`hm2O*K,2yeo$#qH#&`Ffh0!I+y@2m3/W[!9("䏴GjIm80ueNlj3Nz;@379\.WJmmwJȥh8'K~?^굲^ȸˆ箤;OWT`G,`}2gͤ˾0DRlihóq=aQ+fCV SN/ұM!@%¸ԩ'1XxOK+qCFjĘD8]DQa4$ihUbDe]i5ash;4|E #*],SgI̤>qc .vչ ʭUn<O YɨLsGqs Q\_X$Jb@úUV&F&q/JǨ ǍPU ԅnC r3,J]<+#蓆qlM*!1su;/Au!˔(s+,߀r옜Uj| r@(a~sA}Mi=J{(LJP{ӑ%/;6W.Ck{uʽR_( ރmtpwx`g*m^?nh充G"7N~2uWRieVeˌG6MοŌ :/WȚH]z80r_ԉdAx#e DJ5Y^yDZyequT߂Jtruw(6\=,oqG_1w>vJ} 2eKE%e=dqΑHoy⚃Ȉa9Z08ܡ.$Me✹$IlA'Svr?2Ȣ:VdUf}zحry:/[ Q8 wHT"qg0Ȓ8/dʢ31DZU_ʅ]-%m4H˭9K?T"ɍtq4S`_^eVqZ/邨ȭ8-0\#ק*>rP ӿ*9`;r@A9 PrIޛׁ9q~NA޵/X)^ ]Zum'7 HRWB/B[)>N=*-.NvjS CR$ 9]<;ϕCyn$ɡ)[8жKbsW1-,0rN#8tx{9ji{f1)K^s "ȡSCɡ#BKUv@r藆sqqBBIpôq:)8+i˭#[n~Az\N$Y8 Sh(kts(0C;_Z8D9L9 &BBjrhO7 5Hv^ ߜCPCCSϷ8wŏa]n.+?lm:*Ł4 #> 9p5`mh mq}conȝ4ANe5th@jmZow|v|X=u5hTJKuG8 ˭k$0e÷@mF8D M@ms+1G@`ahqھBp_21]޺vΛpwvMᮽM9Dwȿzwr 9>Od;rx{(a]C>a2Q"90QPpqZ0Nd\%rhs` r8]Ua "KX"D-} r8\$ȡšR7a8&=0bMf_q9pb>]{Ӆ0"(o֧9!% =A GoSf7MVK.@d+k]2(G,/)X^ܾDr+[4^O[D3Lc}EI8[]k\-ؾ4 N/^?]z5L ~۵Va krX?WX7.]#NjN?/ [w})xzk\RhVM>mOU$V%1Z' /i/}|%UNvr瑙G}BOrj 8op6P/Crf!G/PsC1cp>Ο~)X;nq?2C8]sHvV_b>JF 'A1_l!!$V2]q=89ׂP">~r{Xl)N#rڗH_hnM̡2-9pmzX_4٤>0+#{a}Q{xM+Ӥ#T|ȦpPkByIA /7!MAz7*?~d M)7a-t)4z;E@'a ׏^|m#Z|dÝ{g?~Eӫa<ק_` lh ƇeqB8PC:D-%}LbwQQLaa@=L4_ELa_ק0aVѾ43>,h>ӃMHX$W),(ΪQغ=CBA'~6]4ÞO/CgP05!K(iCV 90DO`r2Z$a V,IFKSt ~2B}sp ͟{js`:SnM)hsէ'p|d qX|dէE;޺^{ZvS -pxrXO#ɡ0Aw;4Ӌibj ӅyC=."g}j2Ӳߌ?z hWqxz:,T*QX5s]1twȞK8'YkpgG̉vȡhp0&EsP: LPO~ep02S=F[eAg\Iia룔[o> 70mk~Ksl}/-`~ara 6!1if7,[W 9 Ä݅=*9B7՗_ed9"_ 9ٿ{~ \6d׏^*ArW50;=JMA*HfK49x`oq`WObJ!hM3g3$k[`n`4ZX=;f&-_ϋ=vi(4_(\dP{Њ/.!68q"'ZK;eR_*F*[vћh\rr?>=\HaXkFr&=-pJr`|p,1.][G|KVijT\xnय़wZx ?l>mK+|خ1COfkXs}N/n@{vY8o(T@ A V!ѸgsVђ98^B9lÝ{Curj+O|#p]C; =뵇9!@;.9Fm|@z'?V#{ok=9]|Z|7[;w߹;~ F°Ot0@ê1V͑o V*P;EZ> ]8mكQѵòƪǰwH]J-29tpk7 P^~Uj4zx)rK]&A_m|]M+>!RRbL,ۘ; 52ZXu5D:i"x_ x"\Ӛ%1&qsz\_}1=r=z o_jsv>râ9 ÛqXq=r۲q9@ {rr=z ժYw=Ӧ_MON1Tبϲ˞g'ި=eRۃeǮiCimr=ʵMguOy)=9v9r ؽ̪39{~I([qeV֢wYQ6_yzo-mz_8r73a /m`|{ć49]ً$b5=Lkla~iCXYKׁ FrX"–UCL<8T9 9@{X3_-5LAZߌ`S ޶ ?1dV{\p7?&1RjwhCoǞ 98 K3inp؄=a G1(~܊im>9l+7|O$9Es@YÂ8"x%cIENDB`logisim-2.7.1/doc/ru/img-guide/subcirc-2-done.png0000644000175000017500000001307011541757152021357 0ustar vincentvincentPNG  IHDR=[isRGB`PLTEpl mz DBIPeh[1Z\ZIlDCtwu`͉4{j䣦ݙͽdd pHYs  tIMEx^IDATx흉b驷lZ˾((nQ$cfD)&q8BZ:!xc^~Vr\ҫX${-9$%ӉnVoWWqNwtŮUz5 [C)Rlˎnjv;tUr-Ul"cD<Ewrks|F/0ReqD!w!{)R_Zsi 2)H.W,9pc|"$Jy_j"O2K,"qR#%#b 8# I!e3C3 ERlw:e+=z4J+~jqؓi5 ~Ic8<_[vж^O.)i0;N)~<,b!=I"S,VY"9S"WOz=gjRˉTba2l SKUUKn&%n6%_e/b㣏CSp咧&_{z[v)1 ^Mt&ޮxB|*tu*O_V~ryUFA)ClցmRs"%Rəםhz[D:KLf&~W?qXuYz*:"1%5]~m[g5Fj_"ƚ쏼7VX9Iv?_C-Jb? /˳Oq N=-tm/2 WYyҘ_$Y9Z#_-` ;qOU_Z}چi磦({ZYsjcrѤ9T%RU - %HcT 8lm_^A`p~@J 5HcQ̝g۽CS2hurs}Y9Pʜw̆Jdr@ I2,RoY!y,_}<#ULֱ""El=뉫UfO`AL0XzsI\Q02OWyd7U!E9%Ubw˜:TydP xg% A;p^Hcdq'y  8#>%8d8lok?!pEnBs9%E9H]mp誄Kׁ(6j8pUrmv +Mu*nr[7Ab?w"tvGlVF59xAUŁav osne C9(H[9Tvqi35y1DSE!'$a;ǁj >1*mqArp@tAaA`9q R8_O!*%Im(8>B%M֡V@ש78^Knx܀C/%1 P ?́cHDp9( UATNqБ&ev(m0>sxe}(emIc0a՗Jz?8L Uqo>P`sOQ, ~9aכæY'}ij;qX5]214쒫]:];ngڽr`8Hq`bx*TgB^r+IV<-͒ NXs<*CqV b3+u[UOgc`ov"g~xތٮ*1WI8duǵ@04@48dA:>1L_ێxoEoY|^rطs` Fc׿5(^2ѹkiZsׇQ&҇in-?l.8 |KìpMfd\-jzCl]Ad\-_ˠlسl٘}W"A.1*)Is͡E޺O0DM[s>FIFqVuy7VR!uqPBx:+ugaHj6}uCPG\n|Sj%C X$QͰ։ȼIefS;Aũ9K!|BiCC0h@yɭ0LK0M@Jxڧ>:8<>sh_ìids8L%9JN}xD_w#lEBs(r0$q,ږ-(6iDn}%@c5uhH qrf=A\jr@VMOrXTc0hCfy>rXP&ӆ6tq(>sCQ4n}~iqM"9fTK P|#E?!Ȭ/=]a~fOK|#Ӈ B9zsY[@-AzJ^-b1۶s䎧ՏE%~V'CN.15ۗ.V{~ jo]3W ;C@efX]6~:hs:xYgv {<1=~Fwp=]n,Ӂm /M^=CN$ПInCcS(O3Ͻ9lOPs86 2IdWgİpNKNPC9,Pma'd-D%SZsqX2܂*[o#?:6H>0Qn}P]}S [Ecap\xQg)Ra>aAq3&LDq:} tVak0~oousqXKOK-ajAaఔ>{qX ?7l_?8C8/yo4z~)V?8+}Ǡ%fPo[o]ixk@r4#BrZȭ#ӌSlwdxQ?]ފ{T(98{6 ,m?0GD5@FW6O#1WY>BG W?g znp02s(8HzAdlKa>L,pvu,/O _#\9`q[ASUP4탠ap7i`r9L8A8aPeS곓M8uiTǚw2-9.QNTu;8Zp b9gu"p\ᛉ(ahb)/~b"p/yv): $sK8?-c-11p Mߺ\<|ѧx'+OѮO# b OͨKsY8!/͑/uWǵppQ +IA 0l*18XZշ~.J7skzT}ɮ@ c^pWBs]o}x1p 8 J8tqh M9 J8p J8t%VOwK\Sfو@W} 8,5~٥Ur}8qxz8q(§xzxmzL>̭lO,`?5M8LAr,Ų8;Z? fKMa?mT@r8><)~VsnLSK4pxR(8`=?rԻѢCB>x7.*3'~CGps>p?Kn}д0Ow/I5Hѕ9 K iY9>4|U:.yOC4kCo!]se~48@Z2)NaEbH'0ΫH1?Dc-7IENDB`logisim-2.7.1/doc/ru/img-guide/subcirc-2-delve.png0000644000175000017500000001307111541757152021532 0ustar vincentvincentPNG  IHDR#M=sRGB`PLTEql pEgqBIPd>UJ!Z\ZDCtwt`͉3{Y夦~ݙνD2 pHYs  tIMEqx_IDATx *皹=̵<0s _83À BO ;C=1Hs' 98dID?:g%9iVB%"ygá%ymV%e;kJT;\ƍ WEK\YM6M)1vÎI *pAl xhD$1xJ 7$_iSEhqhN0RmpD4p[%Jݾ^?K@WCS$&KrTedV DtY(~E2D؁eQD!RߪġؑT&U en$;?[Rqoݭܩܯgvz7~TYƼ$8< i95L*b,7otݐ.`7r|O<,C~ȳL KrXRY"V&&CN~5*A%SuF!})mr,lep(́ڥRu- +]eroͽp5zdp jꖉ#7jbD`2OX2 N$CFv-tyGUdgզ.rZo Q%3hCr.% Q$Nhp(2N䈭nfwWPrEI/:ڎpJo05KfՙG뭵Qo} !'5[A-7YeU?nqY9_&&/V*Yz ޴+)JAj9Յ*:؎O1bq\P1'wJoJ;C-4#,B.ֈF=y].Y[2 ڑb2+/Qp6.Y)919kj8ԐK8@px״:(ix=iդwGI wl~% .AM:%{m'@)sރ73ՅȆް'&=+ҼfNk$ݦٿ:=qZg~eL^>澢Eb-e*^dAɴ:7://H^]:8rnv;̞=>'b{r'}řEÛWJ\oiuF?R,8;[+cg,w~eI=-D|u7xA4JA0B>$Tw,Svta}ӛg{z9_g/ܖU}xZH}y]` k̓ F;P^F$wWFF3ڥ:?-6W0\ {?~i/ 8%H  8Hs?r px yrLu8D~~P\]u )N5}0_~1rrF-#CuX%j@TG&]$B8A$u?#I.(+Ci6dkB0 "> K|s4lQ|+ r_1m9Q%{ψKhh*ŴxmL< m `V8`$2ŭq~ N.ѡvs\*K98xBQ)z8C84 Re[CAP[{:}"8<{X<=>lFsx)sfq008|m_ac öK:]rk[qm6\;D?9Hai@s8pM7a!ɈY'O @,9^ ia!ȋqx?,p"^VVό_тSsh2vgL20z?i;S9såȡ-sG DnpA0HqtmāZ4GCڣ#O猧}K4-9ׇ8D҇86?]reGdחھ{pmdZTz@ٺ*RA~#OkijpS|̓b` }W"A.*+I}ɡC>O8H}6u8h\[w2gMi!Wra.?]sDPWzr//iZ "t m5t4YؑTT9r94rB}s16|@>vCiCK0(Ѽ[c> ,v/C[A=; mDY8<=us@qb*ISse`Kk X%QR4$m(&nD.>v"h0`j|aOe{+99C!O$OQtơ 怌5OByAph~M(!g> 0>8DӚ6q(r:ӝ/Дn[]"6֌,O+]Z4ח1?K\#~q4Ϻj?)yxZEo0Fg;V_fS+r/K4:Fppr ǠپTZskQ|1HC@A!Tq0ڽ\1l9BMTdُӰF[r\6O1qDİitqOs@})>{4}8wܓxGnW8<Zڽm4<*vJ=0Ã:ɡ**60Y50Cq<ԇ N{G[kfC%Bs/ҚÜi4Vْf>%4҇ց(>SVZ7E 댍G!?{3{)a?=~zP̥(n>ӇaE}Wou8 []T=ҼROK)pa@8̥{t\e:s3%(8C'㠾Cx{?O?a^8ڗU?=7޺ӄxkDH}2>1rHxqݎ^kXjCT(98{/6pAV#"x>խ~.|/O#1WU,}2}罁H}hƳk*=aI4fΡi#3a08ۭOơY)&nA<^ˇeo"[AX@j> 㸨p`s8<>,iO/aa㧁C4}Af8Pv?i2^ 9?MgrqaF$O(5y|4pV_r?m+}p^L6?Iy6hC8n{:!Yx<!r 8лq aسSypqo[A"A y]v#&-j }6as*Q~9#N}I s{8eMb5+G}iXÛ"~`:^f=VDAIK5er'8aDipX*@m8H8BD̎8QKEQBOk"=%R&-h/)oO/CwF%^R%.l#9M;F?ӏp;wiټ[kO;FAo\U7Jsӟ=ҔK6evd 8z NyW? opإ6i0SmgZ?y_ˑ]ӠO;ڗ{q0.ơsd vii9qYЮ1>q%:n8<>nX?_8=po렖қM}Zwս5U-Ю?-{Xg5^DW#6.KR]JS>@?m:}vPdf؞ yY̅^kUP?E3q~z>pKP'5pX%b 'ԛs񍩽2rh_7י@؞z<3kYe_9(nd>`d}dupi~|gH]i{aNbZ:4S@VE\WFKz+pX@'pX@pXF;pt Cq~N@٧8@3)fNaAH'0΋H \[f IENDB`logisim-2.7.1/doc/ru/img-guide/subcirc-2-add.png0000644000175000017500000001215711541757152021167 0ustar vincentvincentPNG  IHDR4J=sRGB`PLTEpmmFakstBIPi;]];Y[\ZvvtDCȇF{h壥~ݙ̽z pHYs  tIME:P,(IDATx흋bص Rڼ[I0A&*`1ar!^" :"@*BX U #ĽVp\EȔD!g,$,0]<]sN !MmjI[ty"Wu%uBWT-~B됪exDBu8%it&TaϣLζH`h29 jGX6nPXᡱPʪqF]؇́t%Zn4&1'yخ/ q :BubBu hla (y ,Td&GX UPZ 2ʊ:f}pI|̈DwX%I앤azRpbs̓yP?Fq5qf: g2A33ٽZzb5zX (MR[\(+NT3䘒-@uLDQrvT╕PUh:::K] Y:R{2;5B ]T ‹D4@NUw-yH*K !LAUT@T@T@6Kܤg&Q]dsόXOg٫v]ߔHEއꜧqyJ Fnq͛8{??Qʐ޲1P)"8/1O<J(N9{E~Tտq{ [M/|FVU*f;ią#PeTpPPP!̍YTcQy*P@Tw 4OEyF t]T}O.^Vh TJ_|9v$5FT}Em":JvuMx{HXcPY}T_4|P!EeS--V֟Ee6=T!9w,CN3XkNTlPiev*UڋSa?F3PՁo`u [UÁ:>TaPD Tď7rI(A*`8*+Zx"7a!M@T5ନr*ϫ4;5+אr[ !^Oar[YX_Xh8ŊSr[yN+n<5K;{ڲӨ64-P"*PsP!̋ Ƈ:A!ejG_J7*!2$}}T@uUɂzeqH QqR'6ZTu]^)Z5=Q(UPqRFb/EťFu8MPeD]{UW}!Uކ^UIFTxeU@ *Eū)0 B%'P-JjTrtv~j#U[UZ*H*RU+T_1eeYmZI qKlT,P-"eU0ojTTC}@4I(@cY @EPm0[Vle ʁr!|Că7XL"uY ,TY%P= %uUEXՓPqR]V.f%T~T:^g5+)x+ IGց0+VI* zHP8)ꄺjB uWmcյ*xc)ֵ ܵ@T@[i|iTO(PṴq i΀ʉŒݼ?`T?};#nj[Ͼ\ZU wg_ lT?螷#U5gT+R{@a0@B>H{Ap-wFTȪvR PQRK0-T9c.9:PrL&J0L*x+\ Aڒ2y)V뿯Td;f!SPUNjT̊-@SIH: [;ITTuPM7ֹYA[YQ̬ȧ*x+jT 4e TFe5@'Yo[q,Jէtf6*=&~)Tj'P˚Dbj"OCރsQuU-g tZ}/tCV*ݦhB]@v"V $jS`U>U̺ ފ {qqTo*W5Tkx^5PT*HPm4*x+ݷ@ߊYP1 WKJ~ UjX>P#nCP{fEN)I૽z\Bu]fF%{*ן]c1nBz;S=C gQ2u輿_ F!UT#*c\pTj*BUގ7Q+@Z@J.B(hYEońmߊQ6mT$ #uHUK8jfhxljRu ^쬀j1TR2`VlU T* ފފb]{QTgTu\hu UcQY\9hVm2W9Th&57_t,  T H5*=JQz{焪j7'Z bRf*9Ge[^ IEa܏<߫ʠUbRe|&y+4< Ux+ƏYرbV٨{_0N]Au`***~T9-߈V_-]Wt}Y<[FA|'Ɲ[VtK++Q]Nrl$d恅A!Uc*W ^]GEYv;vpP"w0P BqU%='U?!ohTQ蠢QT_{]Z4!T~0x=c(R%ѕ8*&1̊RŞB d%^T, &jH9-KE%%F7)t+}6!ThUg^Fʃֆ0D]WmfV8{wlYL sOI74J\/T* Foo RTSQ @Fn.;6dݝ|IievW*/왨 Eo[PMs3in1 R#UPM?sY!|R!5һع3H`Ce#|kPz7sì+Ur *gL@5zn|oB[^?7>PM@%]Znl%PM*@1߄mV8k.Z6in,^; EV<۱b>@@T@>TPyT˚`TգߔOV{+*>u)H3n~+uT#&w - j-TmIL{J͠r4 QzPޢ-!U*f~^uoGT(hdmx+tF]P[1[1QWmB*U_j }+PWTU***[1q2- UkHDTr Tk2/M}⫚ PY#1y+T[0hAHdD$MʨK=.UU;m7&*4JŽd cGŬ#+Gyg_ @5U;GTFv0^;jQ!̊v2 cZ,]my+N2+ڬȽfPM}f1P.*x+6ڷR2>`h :X V@ U@TODɻ_G0%tTw)@CVN||(}䓪xޝ0+&-BtHdLzPX;TPu[~ǧ6W2ޠڢXķޙFdzUiKZOP1DALA#,C}T9QzTYtPyR&ʫ]VVd M j TMk P @Ggnu:ϙu`āRT6D9EŢRj,{- !Ts*H|k}roRފ[4_t .T?l&H4\-aXPWPSQm>""n0u * a^ U 0?!%IENDB`logisim-2.7.1/doc/ru/img-guide/screen-shot.png0000644000175000017500000002756211541757152021110 0ustar vincentvincentPNG  IHDRE(sRGB`PLTEq!Srqx'%EdAIRZ\Zg`&9oDCuwuaɇ-{d襧ǃζ[u pHYs  tIME9&9< IDATx흉bv]\'^HDH bٍ?ьFC9wdq@6!!U\[(uOw|Y=xU!8ӵEtNQ~֞dRּs<~Ony̶!+&Β'I?unN<-i{.^ms߿Ler,.]LSZ,zmQ߮T`7Ire/wW5}buՖSwx;rMZ*~;r8>+MBw x:TX bvvWVÿOǶ(oXSmc}b/]M/Z܅yuMg,;f.x/tK}[FN|-+4|垘S4Ӷ0.nGoy+NAyNRXWڤgR 3m5Бf?1fGq؋(?]/b BZQU~ tD ̓kg&Ҹf)~9pSxX0Ii]K3@,ϧ;r1pq5 C;!myz c_]ޛ{|gz|h?SM2u7 WMx+_y'eZ9_٫/*rQ3 w9ߙf Nb@1)',x*p7yKw\:9 ?,7)ux^^ ?_7<[Y@1o/DAg)w{C*#ɧ5J>pd'w@и8Ƶ<7CAjgwDf?]@W>#qv Wwr0&ר/P,L.d*qԳ?Q l\mkøWeS|؁ /&wodܵ!h6!ޝS-.:b'^h*7ClO~R<Ж7ӭ9!q~xp3]LeE8{;wwp׆IwYw-[A@́@o!nܹbg/x+"qn,N@rjwC|ڝiv;7i\gt2c۝Ň;uEV?DØ .=w86>nS5#Ѱpq)q?p#23 kX9;}0S05ό@ީ޽2F'3:@:yw_ ?2݀鍻Y;C k%x܁;d}C }!K΅gS1p2=S ,fՂ܏p 9͸a !q1$&l1Oi3nss qR+pWl;d܋=b}zq#wLp?A-agHm=͋;\g! ^(2e)كZx37aiSǾ3ϰB {1GU*^֍TKȦ`M՛9Ökl.L$ȶY}׃tTqw 7 pƽY5fn=mwhwBpϕq4 K-Ln;"ߧc:7phVvkwf۸qmg0-7Gݢݴ㢪3:ݢ>3/˜1i3Nw}g0oW܇]w!5dWEUUKN.πcnc? խ>nk9Y67fmw۝v[]eFlc_:ޛ ׊=fGEZ ^^㽆+H/wN{wv/H'-b7pgve-]~yGU{%}}o[cF3h:cq&6F~M|;vIqfqw7f\8'p|=w{bό>sP{vwD C{4Ը3ޫ-UDU$t viNw.n3^;E%N;p_ i-eShۦpiUݤvY9TAY Γ ,!F%|Nr*|wK,ā{;ܳ|'Ge᮴yw]p_PeRYv `ф;} ^{Gcn:mw/܇gG~q/oc:]aIkUvw]~icVGCkss5)sƲYLbZ./֖Z4uy7%nߝe鲰IcnN/W^Nݍkܗg/7pu\1SbiaMàIpEN:ר}bNU{m?8<+qA|܁q ܁;bBBWvhO=pc5Uv=^?ћ*z3;p_.{WnκLDrpef߃dmwJ;^{i`Q>uY .3'4fFLOiflܓ[Ah[;w>s(qp}|$O;p_oip}C ܁Fqw!2ϚpuYRCW ԡ&J྽\Qwŷ<nG*C}SׅJyC=6j`=VJ0PMwjN5t cfmV4pwqi[˃F\5qWÝhw0gN{o9s^yV]Gx](WS5xĝqwfaFq1]ksv'F^j.eb`]<31įwF5U-MUeWFZ~f#cdžWNWQgRVn֢. 5NSCZqw;")lMbVRv4UmoI+x,L&F[YC@qqV-p?qcDfkwUl.aۣƲ 0HݬE=E{ 4pƔ;Qeܝ~w0lfSYI^,sஶjmg~۝cn%MZ1 cX`qѸݚz4.];5ҒT¦Q/p[}Ovݹq=G{GMi+z|&} =SjAGx;>vm{O{}^="~paqAĸ7߱p!r`6BF}qo 5fQUZ"F=PƼ)۶qokN./wC&pDvGcc%bOj[Cq/vJ@if.㦎w]^FkV po 'dv>[NLEZ3wvk;q'u3%f7 ޵k;悈GtxfL=skwߝRy3Jho{hpc]ni3b2Tʹ$:\UO6ØK?#qJ71LWjpD*wQ䈴.ш}QuUoϱp$s4ӷ-vpl^{4d@x;sU=v%*i F?1ۆt|2dH&,"J~ܝ}צ@otmtjFKF4.l; [mw޵HGծwjawÝm0 IcͤO%DPI:̔wnԹ*3aVGtw ~2RȘnW+4LZw29sˣaB"a&e݁VV[>1v=qs9Y׏{TttUYόUπsU8\Ue|3jI{[Cv7qCsQavϨ ,UQݸ${jndkSj;N61"NkqGɘ}f%;%&}$NC#k1:\R=>z]j1L\w ;툻JcvR䨸F3n;m7iE,Rl,d޸zqY/nֈ-;ܸ{s*^|cn^܁SGt9$]aq/]'qD$9uoeU5pςU30owǞ+*6/e37ł7D9v몎Z{NE؄v_T꨸1{Stx vhI8euMյުv7:KY:"W7:w 0/ G#HTcp?RVɍ ̴:i8:8peX%п4ݓʒMyG^#7(^6e}ٔpO{Ct8jw7h^m}ʤj&KqMqo7^-#7rkj?oSVNRxNim=*:ݳ}fƽfxNYmK^Z+q)VS l=.:  2-MSpϢp7F%IK•DcvTWqmXϿ TV EGgz<[QU"̕R,Sl:ev Nd Epw1iww)~ȉl$Qվ)AܽwJ NE=F_"A0ײ{NqKn{@vۊ> 鈻IMONMi6XoᚪqkЪ[Bk,ۘ.wץhw+㮕{mwv_/wDTڽј)Uz$}W?:#ܝ1D̩k} {2c&cKf#Lј3rDUo֎l+W>N,t{X{lk>nF,{}`T$=il˞>ob&5 $V3=lZNyoM1%# sU{t w3o&pYޣ Ƈ "^_8T;"G{j3_2{j=PyoghvVo[򚫺(DcJcn^wfUeEQM|/Wz9隫X)pw{Uoȧj_JIgvgb3=ڔ^}Aq{211S}coT2UqsU{dT5[i7Uş,JRG;p"Q6Sb*=!%lەݕqKsn|<(Bp8ȐwY[nNadwXp'}eg&@GI2ou=3O{&{paǘ0vU~wE` ;l2-{ٷĦjI{LMU,{s ڽIR}wiwܳs1zX g<;.EX/a-Zp8v}ѮpKTu>gqoj]9>nT59/ǯh@Vti@?wBt'BuLj3MS4k\4[^Zkhy{5q4}< 5M^R%W$ y_M-*ƜqOqu;mq}ܞǂKAh~Tp/ns-K98tG 3v>1&-^?vLs_qٸ->s؍flP;qv> 0)Abon̰> rE5w8N9sZ S)/'m'Ի[ c*siwz}/R 9hkܵʮ_/.(\p}6vsi%ɘySc4ʅ=3mcFV3AWr~ՏGU{;$3xSDWvvo/wNso-X(p-q?#wۀΆ ָ}cN/ Q8jƵ{ݡ݁;pO;®׈!܍;p_9_~}w>7ХW/c3] rTE8p#.8wW qD홚cKʹq k <CuM1Se@=s{gq70 ݍ~6ց py7=n%zk9m[,eIDATH%_n?$=p_R KØZ|+ڟzLOSB}֘y !_?f&]=1s!P)gr+g*h7F9爴ZjM`w7]L2h,#63fu$=}*mpT-q7Uc2m'Fi>`JO{|pkݲūHׄ{IWR݁2pv_vk,wVȸ# cpoVC+gwwDU\NL,ϊwwƽ; }LMdYPw#;kd^;!.:ɑZXSvf{u} cK[;ܧ]f[\d _"?,Ui|bJv#3ï,Vfp\d*c=ɇH~}D˥Z]], PkS$h}ܦvO*KU^ 1b7Wռ6r䍡3b/}qoUq׸Al="#Y{QվQUY][b'QWhhm, ζ{mp 9?ܹFv.zZ }bjwwi=f pp/Z:"pJjSFZްm[gv_v {鋑 ߁0jcƒp7;Qc41gok*;[{tw9p9EcǨY#jwCTBC7B>k/T]l4Wdd5SОFݹ, }Us-q:"a$}MsQ xOWLcTx[n~]a3Kojj͵VP/[EB7\rI˿QF6vsUT;6cqB)w'./Z]Sm>URL*{"-$uU; 5zͪnbibMuzUM-1[5vQ^N4M.O}VF`DU FU* L{"}j}jcXZɘN^ qI6:Dփ3ysUYO9 wֽ:6DW pz&E'ĝ {,ǝq Ӯ&]qzWw~w:2SYV'⩄SRB]iw="iwwƁpwKn1әd.]d>Bcn&\(: ~>uUSnRZ1ӄ'cdlkzqd36/}O]$C p*rK4Umc'͸8M:WWw*[:ejSѵ\>=Px몆#np|vo5w ܁ p'ow ܁;pQp_m]qܡݗ݁;p_-* p[g&ZmSW;" 1p}8C? C^׃wF;݁xˊ*UUQ3Jj-6=3UIԖܥ= \\p7zFa2kj*pWR oH#&LC  -5={iqWO-܍l<%zYag_'RqW꺪މ=pR cƘɒKEuUԪהV=?dSuG"hS21SV<5ʙܘQU*JMUІPjܻ䖦cv 8!ZJ[FUs<.̔Lhweؖ hٔFpOi{j{аxpsSnD0 SW\18 h M]W瀻ǘ*6z#N}66Wu0GC/W ܁"qkVYͼwAtzSGSƵm1 =)SY25'dz+GL׸uY3 2<]pg}˼e yI^Sayof>Gv;wL&G9g-TaV{* \)R_C~VAQqw0k f_G>9*CdT0/:jf*ʳu+yJ+٥nkwƲO-+q|xyly[pn x@pwZ^zsw}ý0eUXͼL`2Ux;usʘ٧ҘT[[-lWiy'\hŘ[w'}'z,%H]6UmUXlVFX6<c慼 < w&=p_vwp\m܇Ιf{ћg#\ui6@{O`;p!}n˖eݛ8|0}i ;pF3݁T]͸[OP}r*F[CDp܁{'܇LciT3m\ؙ=)o궘  MBGk^YTJw)#q] {8p}`܃E{!^匱Lpw /n~wHܻg{v`p-{;2v$sKUr_1s<̒TEApϏyEq:oJÝ bM6{1헧-kV}$G2 ;]qBn>3Pd8'ܔ|=?!Yv q'i.ۅ{lni7XK{zE1Y YYv]! w Ѹ/㸳Os=`̜a,{Cs΃]'A,{gSV"bqw˘asw܀1V{~kwʕ qwhv^k1H];":+X3>GYҾr7{.x3A}`6һ3s;;p5%%n3FJ>3NFH7C ;~@! ۑ??2lAIENDB`logisim-2.7.1/doc/ru/img-guide/prop-oscillate-error.png0000644000175000017500000001251611541757152022733 0ustar vincentvincentPNG  IHDRwsRGB`PLTEp zh oCBIQ@lg\3Z\Z6nDCtwuŃE{y妦ƒݙη ] pHYs  tIME8 /tIDATx *kmZ[[@P49C`D"5KL +F ^@d%Qdz(߃3L[JIb4ZTsBb#DtI‡C2AIv-ZڭLV- ˜ .xV'fq_Q SLJR+ƘD9[o3w$k"+kQdx/eJKFfZODr݉ &OVK+&wB|Joqol#4=g<&1G"!I,ڱta^\4 MR_uɐQPL$ `$|'g2W%Ea3#ȎQc]o+]e ŧQVqJTL(lR+NdznFc"G 3{HaGA4%l!TQ"ث}adԎhԋs<ϻW=4^F07D#@VJ0 .+p F@a 29cZhe-}oݶ܅7RY^K:˝n /ݏBGe#!nbKDɒHߋYhvlgÓlYy!Xc4c")}BoYe}/рUiQ-aZ"=UFIϒS{ٽ$۟)Aqo@Ay Lۭ NJOy{=/ы-._a3A?Yo JhdWB:a^`\F,l lV:pK= ^%:VZfT,>LX,g,@\FJ 6lijҲeZ鮗E4μL쉪8$3FzKvhi{={a@w#%fUG[Z"R^h.>'M@404A0 @AAؓFA3oNҼC >܄fQ%d vN>jbƗ•1B{;&NB:aE;Qy9=q=INcߜq~qNBE8i7vpT3[c ܍q\&m`х9fN%Ə<aŭ XE _.?}Α18k{1:(%hJ8%"a'$a@b-GM&H0~c.&=%I\#N䨈a)hyasݍ `'$SaOX4X㶴PmiIX]6Z4R'LSi,Vq<^\{Qb+s^n}?@ۓ >C0H?®6To@dلACFa%3"Il S[s/- I[j'<^J8Az1hOi]pG paP}pQG09IX !L&K9f}y1ꄿ.MgL0aTc7 z4st'/lKL*k|r"̪`Ҙyu\_%k f =l%ք0{){+*F%A9,X%zOr T/2 k袨v*a $—z of:,_>SB- M:CE<pӲ _ —V j@嫫.IL:45d:yF8Z0tz2l%^q/1:P8-[3"{ -M[Áfz#xB 1 /dvK1[-/ qN-O_;}"lLq^Ȍ6'J0ҧK/|㗉& 16cR 豑9Rl~6$nwlK 'q&#~xڈKFMCP-yF$ +(c&b>UKW,X+ &fD:\0\&ʼ3TDI QrOBɟF Chͨձ?,S2[/3 V++f՘Սn1I+4H--?|Z}Z 'i1M("TgK=e1a<$ O:|O@o0kqZknK\=SKw*Sp㳥>k+%LOݬb0^G*QyxxC]>&ӖciF'm*pQ͉q,e>kf.tbOJz<`AfXϨx‡fOn9F@ $l 5=ꪏ=_y'ef<ƕق? 3v<$|23>@;JWc- rZËYK0mY^kKN=^efV:'yU\Lwzpk txDU=UM---#]x-VĬu;6FSE櫀F쿖RY@OcͩS#6bƞ]Q㪞D|9V4>6Sw$ ۥe 2C<@ԃp]Fqw0܋Wt8 ˧ c &~B sħ`$~@^\= ޖka .v{l>~,V0 ' > 0pl#"k%Ll^1al-F,7|"x/Qtb F۫?I.0aﻇ֫àë~0^| ¡Eăp0|IcM >͟cF< g=0| '@3wfnb!OK}s"Wp/b&pAO}K-PL|9-xHXR Da*}| JӬ)EZ}e^RguZZO갚 kߪ/gӮχ+%EWȫ=)*Ȅ>ZRTAlχK &KA V:TҶ7χo#+MV:)i5--Ȭp(a[ZpJ;j~i_=}z0>6 W@a NuAA0^a_k0Xi/aU|Gᡇg  JX>k O!cεQtV+x9{݇͟=E/1rI}Q亷UPL(~3mGe~GБ:&"|;$,s A;Ǹn;!s;NѼ:3mՉV[$3.lwܢ9a"DK+--Uva9r5L(kWqn&^Y:w}F}T^ AVt램rFP`(mJZڎ,ՙ%Z,[-EЮq5qD5ޔ&c-ıVi/B`V,ڛi-`kVժEn.K%?l]Z'e+簽6`zΰfdkjgݯ 6u쫻:;#mO,G (%W6ccQk쎅v3Lsޒ>nOOʚ0_謇Fr Aj[ytCWoy=*Ny-+ ,H}t^Rb !ƙ?aKc nb擶_?i5VԼ>=K\~ @HK jq ‘w l|+iO8!%M\: blu|q'x t4'7؊9Y+as['Wat|:\@x^V߬2+zK וEto"gSX6+-HxaZ9H kaFxx W$ >)4 Ed߂p bjGYSIENDB`logisim-2.7.1/doc/ru/img-guide/prop-oscillate-before.png0000644000175000017500000001164411541757152023045 0ustar vincentvincentPNG  IHDR8sRGB`PLTEpoqk7{/2/1%"7BIQeg\37nfigDC_Ɇ.{y䧧ƒݙηSS pHYs  tIME7,Gj#IDATx *lr%&|삂b.-ât>9l*>B|5W g pS@>Jê' 4#'n$G-@ Q4A [m m! h(A(h"5@> K6Kt~%)yH&)3t.o>jltV/զHcRE15"VE3AaS% GEGQ 'E_e}E^ҹd Դ;=EN}le< jG&q 0B :U k,;:-LOrP+iY#id'RZ:+iDN54D$11og%/}Y5'R/PZ"+ZO6q?'NR{`iPD*\dʚ-=:ɨ?^!"3 M $ᆮڢڒyg5Bʕ$ID~l7ƪ|rǥ}Sz[leїY]*Әi2}*^gPbǁJyW3lzѯRCEN:,P% j?TT .1GW܁ OY3M虚CaQ%b7m-1jY5*Tsxa11 QA=V(bC_x",I9jzI:SQtEeJ{~>h9;l~bԪ|A̙2 AY0C(KA1K(<`U |{/?U՟ш6ה"GUK&m 'c^uh P0% =R\H2&DNR)]|&LxQ,1Y}2^~;)=ITzZGgՒ+IsմÝW}W[K^|f"Nefjr9Upo/x<-=#\)n8-j]aF]1Uy:sAX0y;!Z}3g $1J#ZkTjH cĠ .уrЃQ nG4Ҋ 2Jj<:No5/l*]-ROe#nK`22waqI#l 7V4;6 EY=YWĀd^V[}ja7pE +e+Bz"|rHELzcEɪYnp!gzq;ح#|z{H|A"6]-Sإ am2@t"#Za%)X,)N]51{[<&vˡhE6ãڬ(⎢|G\ytM1 R{ ќj)S"wPk "}> LϠAF 1TG D$'4dp=PGX A+h  )Vkej臤ƥ2π1ɂcf Ɖ3 faG|re~~$* [( ~͠:㏁h3N3NӄmTʺ-:P  19!1 (Bh\q|mv*S} L^* UMS@8z"Bd h0/z/־ matsyuy6w)52XNc`!A`EjL'N y=$\?UDy186:=Q 4c05;??ʬ Y֌A݈((Ad` ,\I5jŹ3EKO3@,ASޚ|F31 aA tz?-.U&C$`_3:t rN"lƵ*oSU-܈L S3x0p&0䭳O }D\~"23{|0v gf68Y,1gМKh/V3oK30XϜ{8X￞ g]O,֓;Cr$9ޖجrKcd51#5.6;(3(poG{'` I B;]nCc WK{<DZhk59P*5VCap1'1x(k׿?W 5푥;oPev/\J0ilZ|Ek t /8RCF" Wp@HQX:E/p 5meb]w|`.+yCW*[tI`~|쾓{^{l>}42'+TXzܱ $v? :W&/ZdC0B8[uBHK̀j&'m0|{6Xgsڲ#(ˉw G1M7|r o43H;m1WeE{ScKe < |QdHzC 8o\Y8gxf^|^8=9M^fe /n]ԢŞ78d AB^gy}>sp"`v4;K \0n;ܛ Ɛsx.ঝ<+D%M t$3'ļSk@3p7=[ap!z@8&`0WX 2`~je8G0w=?Nh=XU3 k[g-?3(~U&>iEsu0@S[` ޺b<7^2w/͓G1 hyXs/Ϡr7MɭpɝǥHv(~(+(p`@g0 FJVzG+s4 B ^'86=i le~v$|!6 Z H.^\*=HvjڝER;>E[%) 9'_}rcS=;h|8yFS@\gxg) x=: f`Pɵ_`= n!z%e`&`8tY|N;҇Lzg`ibwbntuZ Љ ][]!-KZa E*-q`{~-5/,|w*Ջ7&2e$-  iK3a|>Yy[=@h/O'[v9 0^umt?q2|5 dQ{Gz0KޞztJξkSmޞzsb17)$9l_T.}c }h 4^uVǠ\Xa`^.1.,}DRF&}DSӏ.Cd@R8}䠇Pc?id8A<[oa3P['K}}]-x$ @E86[dywϠ>k>=zP75Z`7@?7.kL}S5т> تVhփUldnU͛nt|` kK:|Q:vH`k7mI |+><0}5x<{mBIENDB`logisim-2.7.1/doc/ru/img-guide/prefs-window.png0000644000175000017500000000737411541757152021301 0ustar vincentvincentPNG  IHDR(usRGB`PLTEjc^jol "6AIRK\]$jkrwvvxÁ-{Y$)ÞoϢĂ߼鯽^qQ pHYs  tIME7h_"IDATx흉z:GP.&7d=3W$3 If"o +2}AP[ɋP"q<2i~'VOK;,E0P_A$*=[E<=N=.n40 s*M*>Ӹz#r55>n*nQq;ٳ@x;>Q;hWҹ|aW35P`L\C^ *_C{iһ'*#t'ML8-|^ĉ6щn®gKMڀnhI] ?DbZP匟 \t{ ~:(4MbTZA[3{3^kc`#u5l(+ L&z0)&(qqb`(9*}!8iݙL|oO&|?wzNE-T ƌ\]Pd# Tt4a=yT 3t7vbjVf]9*3ǫWN(DQsgFu&Zنyޗ݉C ' "};=|EZ@s?gNZv@1巾QM'ݿGY#2k= <ꞶxPj/2YQPJA:JMOfլWkiެ^SSe,{(Pd]dTևkFvPR[\hz`п6Xl~ih EJ(%F6pmX?f6M$+ U̓R%0"fS7U*T3OLuq5eMT-'5*u9 ;{ (pzdZ}ބI2ͪѕ 8*jؚdjSqIpʁfkx9qg(spPM8B} d"|{3( $ͣԮl}߃A79j-(Ɓc]kP/th (3\X_w)ơ;R?*Nфd:HhC_TD*-Pom?ZI]Ckxd`ZD%vDp}LpfŁ#ԍ[CpcsuZ;lZ͖d03;`~dl(<5 |zͶd: GjS fjF F (^T}0ЬZs7?ú>[sm3j2aU\Ʉ[gqC<ggsܷu`uN58pϥFNhԖd7P[OH7t4;ceEPJV!*7j_u~ԿK'|G>}W^@wbwu˯VJ..W5XP뫍tAU C@ (%POb6OT5?"GA>LR TFUīLt@ԖGOU@}P͢GL@U6$:U \T6iP> |m>>)MTVIPVQm<"n٧,8qT~*G{3'i*ki:sLEIW5Rer = Jh.r֔i\dT5-1F$H΋Ǽidצ<);u}^P迠Ȍ͓qZW[Ė9P- g͕#պ]/v–00i mP4 "el{0 ܍#-f[nd2ALϺ>[>_AۣCۮ LM{M\܁*cQe坻QeX:U}VeDYw)eZ}ss~2k;l+(nTfuAuzݴ|8SUv/v4:z?>uM;hMale|qnM7A:[d۸ }XIX ]PXPŞ෺k,gɄ,MSLUd¦ }KL7"36O.rsG28meZ7|Oe({zR>'1 nx/O'$;KX9 (QV~PJ@ jwWF.\.&W5X .ZRIRwWϷAi%2AJ@(%P"JD@ (%"PJD@_jwNn\dr$N[p"/Ew~߂歍P'PAn?9w8n^9ꖍ-(7d7^O- 6ot2@Wm/ oGi}Kx6e VwLcP;A_G5?5m:G:h+:5;npIu[ׇGSPܩjx2Ɠ ܉ TL >Ά-.*SPP[ȭDP"E3Ͻ jPc@WO@MPoJ (% D?j.G۞4P)<'(~Dk杕?e (*Ç䛹 }d*q9蹮b*cGZI񽀕In}kÕmq3yI[dfp#= 9z aQˆV q &TƓUp$6|Ĥ]F.3kryM(- ?JAcTkEh31~}7TJf J:?Y#J6AEk1TZTut1ʐNQ/E ׵u،Į0 WQ(xk([DտV)t}ܱDΓ}>v&V>Jĭ$ >O6l<=T&]_V5j1EEn Q0G72ݢ$ Ļ=cEE.ڴJh6\k쀩:'nzjn21ox;-ܞΒ)%?!K5EPJ@(%QwEŏY"r(%"P"J@(%DP"JgP{l]"oWtE@ (%DP"JD@ v3/5P1& A=z PJ@ (% ':]Wfjz&߂s_ߐSz(\Nھҁ ?{%ݖ&P@=G%6ڇW6oR@= Q}x=|bGxPv ǀ:|PU<{ܔ{e&bİ J/C%Nԣl R-+[YrWR\L` (%DP"J P"Jd" T,2}e )IENDB`logisim-2.7.1/doc/ru/img-guide/prefs-template.png0000644000175000017500000001056511541757152021601 0ustar vincentvincentPNG  IHDRRrrsRGB`PLTElc^kogv51zBIR Ub`kqttuxzƅ2{\ؘqÁ갾@ pHYs  tIME  xSXIDATx흋8 [nPghiӒ e2 6(|0|~jޓd^H5- ((J@j׼{OR8O,y%-6I A٨{?iuR,y%l*5,S蠨BΦ~Jw{hKe"㏭>ģWDlɰʿJ>幠$GuҜuQ*Ձhv%SJ6ynn4y?:6K3:?HPѪu+,)ϣh6QB5*t3XZTejYzP::s^#T4DZEN2:FH3U1V2DFgF=evxPclFY6xot[T,sa Wu/ʃ2Lh\(4*S86 )6L޴8sV5PK5Jm3[@ҧ˦߻t7eu:zkP\\0g|@QkU /+eTB^VNP(ȟu^ U.ɶ[W˟u>tLl;x@e|(~h__Qcw˟o<>Z7! =s05o2yY{ǎA.GPz;geNcD Vp,kuHm}e 2Q> Gۦ4RsBbDLL$>Pj5&|zL*UVwB;; B} xOlRŋ3]X,wD R 4 LDR4Q\::|XXj-׋".+yd5 I2>PrܹAJwxz*v#[#&^@" ulUafZB P_K&6uPUۊGmxoQ-XPx3w)~W݆ݠ/u-+Η5͹DeQwWn+wJVg[cWfLP9:cMg)#QW: -cvb'Vx7dCKALcX2=p=KhUft>x`m oXI||xL6F'{En;^qʘ >)We@^:lm B*ڦ3EGۧIw& %# 6ׁީO57Z'BZJ nJik[awm}}[H?xA;(kZ YnB 9aߛTrDV*rLPǒcJr<Ǣle]Y{, jY{,<@=G3OV,*Ku0(4rOA>ްr(3LBkL*fc> ;~jauYNo5z9[o2KlC8y;d3c3m02N]U[asc[*q=ux>Όo3SlӵRƖS2<&\[4gRUEtT9A:Q} 9g@-_%|6\9Ϯ~((-CdhAEY{, J &C_(LEQP((@ P@A P(Hcִ0$)EIܴ_6X,I*fa$ m˯4Zi᮷APhd(g_A%J&QM&*/m\M"*ya_f^Lg~A-;O`:Q[vhҝ-0 ½ P(@A '[LT-L T<$@5Ln1ȣ&3=eVLR}5]ߏv6Nlѩ̈fP?( .-[2q72(˨\諄!oW"3Y),tUYE&\[dbɲ(;@aL-vxnO]XfL;ņt`+`"3LY* P/,qɧrYϭz])OˢxP2ƕs[喔]_@ḌJ=-.~ɫt2&8nn_8W{_jVu0¹B_ ( Bs,&?OwV  p OB1sj0'uTzkT_0] 0 P(@ ?yiq .@!/CJ6P pIENDB`logisim-2.7.1/doc/ru/img-guide/prefs-layout.png0000644000175000017500000001467011541757152021304 0ustar vincentvincentPNG  IHDR)3cLsRGB`PLTEnfYm rmw2.wBJR[s`orstwvŃ.R{n“ɇź:H pHYs  tIME @IDATx흋8 u+2^%mS(?GJS(i$ ˒E1|A @@ %e/dI f5"EH)z"wFYT}-l'EN<#ǫ|Rv.ʶ1)Be)DHQM17w_.%7Fy٨>ڒ$&oFoqTmR %KNl;br,]I٨+̲.goTLˑ#ɼgjqCY Ul^˙ҹfV8BIIYdY6(TE>bZ~ugBNqN:k3GjU2;[6R( C3^ZG֌bSZrK#3+1)Ϙ/5HE e6w@#E/쓞M8Ľ"o:1T3 2IѣNs G=̿3mOHÌ1%DRNXeV[%ݞ.YTfbhFOSv#EO$&+DщgTH5 Y*+h7 cH%]#fdvۈ>^'3u~1ScXy2ԝv&>Oq5>O1F;5#-.">S4(:o݊7ڻ_T]Vꙁ)lS6_ Ş_S1tk{56>-ՌU6h]6*3ZI؃sWI!M.7N[5V0馽Jjm{qG]ig< 3Rb[zlC R J77vylaKN,%I](UR! ȋXz{7W}v{GxGY,~ڷw)WHERWRޒl HyR`S@lAڗS_IY ß.۔D#aiTh.lHRV[Mx0H,)T rNqٶ$e)JyKQP,':CSgkP擽ڔTTRΑr4GeNye0yR>>*ۘTo߶jb|:Hm6lbR[VnѽωB&Lp i9OoQѧ b]uwjI-LH]d%WMHYM/j?~xjP[mYE^)[:Ԉ9T8UP􆟅^KwJ3H RVرT.ʙgSJuj,s_GY޸khnϑ9N;+UbƜ: KH^C׉`W"b;)9GgT/-]fJ͋ WӴznJ>L>#J}ת6E0\#*e%5}F*V e]>b:h֙et+Coi97x6}q`+VWFڲy2=VFAʡ3Z=eTF{4&tS URLNϐ2p/7C476axwޜRSF} 7Ȅ-^ BoUޝQ /H惙~ڷRf/CȻd 8p'!tvL AR"A @@ @@ @@ r{$fRl5 rH1Av^Ki!a)H ү>Rʹ_}I$ lnac 4& Ƒb?۠_4'[1 0M&7rUIqr)'RزɊ^9qGx%2ƽ&'GB&awgZJٮ>ST0-)үyƭ'moټu0tK)bs))}""a?CޖR r/)HHHH)H7H;Rq iK'sHI"ɄN)uRD6Hv 6=LJ!NO=Tݶ!]"%jޑ{c$}HVvIؼ?6roJHHYdR.u4>LGlJZ=p7*؜-dl=XfREApoW\.BJII ]}f,G:2VR_ S{dV=ͦ|VxFKئDn87Ѯy\?BDIR r/)HHHH)H7H;Rq iK ڦAY}w5jSqfnIŶ>V;+vF fWhq-n==y@^R )))R ב'ovҖǵ-¯ ǵ֘79r8_gfy{XOm=晭&O<^]o/|}Dy_ʽL\qGh}s];E:1Nm>hܱɉV{S'}wܭڹh:Q͛EGknWo;x<Wcc%"9&AM[u{b'fS[$ۋAJkk7x8F\۫;6ϊZsnmӚUWH }|ȇxX_ RZ{\->"wr$ښ>65N7uyZGn| ؕQm}]qv۵7HiqÌ63Zr?7ݚ]ŭlmg/|}DoS1{=Ȼb/k4WO!%/d9QZO/גN8RQV.TظǃJ)@uQYn 4y+Imݳ;fAEҒZjq>m؋>RߑR>!jku 쯏ϩ 8BQsdU8 (%1M4*NtmIb ۩=/T&Stl78Aa>Z9S-r;eg0Pe?c9.}M{\#2jt 7En?nS)GhFvh' ps؇EPFg)O>Q@J>|#6HQ) +N#s1)}YcO09}dy~Z`vi6zX>pa.&$]xh#Un AO"Ŵg/u4<);sdTyub,U4fRRe7p٦ZIa̧5'o}wv_6wW[j3ZG(P.}}IIyR#E҆Rn!<u%A8@ H(>Ѷ#3Z҆<) IRz@=0_wx߆}Lhͧ a٥Yx4˷>ACr!~Kej3%] $8gH ^ܑt} [\"lcvKZzдK'bܮz"K\RҦ0haMMVC4PG}%WD:<ȇ5U\6sgb1nWz&&EsfSX\OHEuzrCOɵQHX%IkVqq AX ¦zT)':)E+<"qNgК0RX',R Vqg<7j*Bc;$I0`}6{#_H2 q?-f!'ȡ*.|a<,I)jC=3ZXiGTf6 /4t&6<|R(H)5RH)mH RxV(DqwɈ5)т6-H) nz2hDV"2Lu]^\c7ucH>,V#h_'nx݁i3oWw2܄}rO*Ǯ} Pw&#^=LEJ.|R>gIyxZ" Gskbg\JqC0E?=L+}h)>V/\^)n趻d3#J}F>bVqk$g!ǯBKE>~i׉zГX`]KxR@JIIyR#E҆Rn!>i%@j))W e'!쪤l1Շ$e[!i)))HddPOsxY[AJO䉞/R@J;P@ H) R@R̂>r)f HI1jmn &8!7&ϓcr|)і))$Ş][VPnٓz2Ii =K7)=)SrNDjr2Rϥۏy^P[RXnq-pxۃbSN-k&-~i ŏ>v{>op 3'hѾ瓷R@ I.ɤDPYp. ըDs=ՅƠLM mi_ע={H%,AHfF(+y2)4l: X@!5O`0|-]dbHXlbbʦć2F:Rb-BR q!)m֌ʐlԢ}6,D7D;MʘX!V:l(1IMK8ynaoiQ4 ['隠JdΕ,lߢ(MrXYs'7rLYjc"?VeǷ]M,UHSS’%*:֪Ŝ n ̜F)'u+C |Lj3lLA06ˆp{Y  +ciE-܊p@"/. !/ J66jRyp#n$7  HM#g&e)石z=ntwr ]vJoS*GYdN[Sx5exx{qQ T PT%& {R(; ;6u(B ጡ\Ͷ D)婛 U( WX>lN gA~cR.hE 8BRd颪h1]xPi*/#5۵×poUmÑdqޜ,@}X1?f4X#4#WJ Smsl²e"iycՆ%.&= CHmPynf+Bϓg˨o|C @[m.~`V4j0j*'kg26iG Ir=,S'3- KiQϔ-J_ҳhN&m$q+#/Ɏ}9J?|1kM%R:8~<6E- (LcZGfRUR-TF^q+SF? +#0h{S7&{oHjI=TCJRBJ%%}^oSېZdžI^5G+jx[q~.<_ !%RBJH )!%BjzYBYhs ɶcH-?~ wV&F{ ( >~>uOL5[)ZSX&*%ōIaX~lYR=IoHQy\NjfM6m(L[M[8+Ny@E } -Ϥg"Mj 7jDh`Gj%=%k#Zs7M]0aIQe+`xI&:~;҃V18/h(&I{*)h&+#KMO>J ZM(rR(G!([7NO2__&C᚟4"(R rIV_Sq: w^\JW0O Ta.ѓչE:f,5ڕ8)}RA7~KE"= ԖJ3Lwww9)))YjQaX)p/#(W #:KR9aBnHp'ҠEaRRN%ĝ LPV'h+@+u$oNf{.uk:oN(;ViQc4(k(dA- $TilwiR"EPOzHm"7!eXmQXR `H AG[*z tÅigKsS&]^濼RVޥ )!%RJH*K[^Ӌvaյ~VBtI2NRBJRBJH=isǥ 6sdsT&DCz_RRBJHoFjR_|fw&pI3q\<.K&~dҰr7$wZQ`D/'ֵ \@"=2t*1^?I>MSmaLs6f qVdk&%',,L SDGlzHJ(ø f?v"~O(ٟƆayR_?cJܙ fzJBPm :`<Kq6uʓYI^[`ɍ!` L?k ECjQsM n}ğl~x{E8Ti8޻(Ly9|G;dn#ks( ؇- cH|tuɷ(o%KJOMR=%=' kI=;8ɼx ERRBTX%oVC 7R7 Ut#Bo꨼q1.)𷛎(KxVn&En ".5t$d/g{P)\_E*ݲEQkJ:egц鸻PI/$uh@]e@ª6FIƻ@inMLZ R})i(t AAvڤy#rL}2a%*eH=R8Roי5þ^dӧ(7=!loJȸΛ9 t'VB*hAuZAEt*bIʝ7w:\L\ < ̚ŀ1aF7]ʋdJHis_H݌HZi(h;ޥ m >#&e!uIBJ )!%RBYYD/Ր|=Оuhx?1{j@ony♷|MH(AwKާxêd\T1g0% ^ )VsQ)3?'zSu`T/Gw'{E [(iiQIS{?~軨*~bԓT"E~Y=DŽ֏m򬟝{jXT#Մ&Ua\U4x}xsXT~Gq$;.87ԫ佟RBJH )!%ԯH5=jh)C)x KLwGNfw.}P=pO N:yѡSƳun'zRnUwu&)vB1 Fz~)M*wHTSC\?)s>TS}=t)iߛ}ROH )!%R"EzsMH؁Nswr~ Ϻ͑ yPw@2c{|U/S"F=/*ZSd@eSKʍ o;{Ϗ5ot8RU8+$ij[zGR/+tV&Xˎk~Cx/eΪ3O'JKTF{ڢ@%O%v<*U UOTn Ǝ=b!rp gUWfQJ+~5*"<%|a :5n:TttTSSש|%A_]ozo!r^Ҟ^N=OrMWXhJ6Ӈ_`%:LJEA8l >N+ѩ'JԶ.Qzp%:D"7ϛ&O+Y->ZN=SEa- SWSϭyEkߪ"])y':uw7R j$)!%AHIʅ1xzR&UIrg;!gRV{B&OQInz9–+P>RvO,'K³| H/WE\hpEpSa(kH tFy(VM9VtP@,&KlX7~%˼]6LjGw3qaT t31$?E$\,C~"M=ۤ s71&1ةڬ)},]R{9nye[)JG'(hJ0Z&iU1K%ٳ,f?u nnVh_nT֮k_3:AlbBi{o䆨3mke)H -!e~ fVanudO r=Mcߟyԙ=!%AH ) BJu+a%ZHgXuHIqRBJR!%$) BJH%FHTs7 z!R6ZH݌T+ޝT#RBJH݈T ޓ!cmucTB^H7_lKn[G} 5KO)RH݇."}ԑ2NAE .݊{%O?H> {"/M9U5:ueM/Dj?K6ARjUZ eVZ0`WԊ̵(N[?עҢxΓtVR6IH l!uSRw-nV݂x1*E&=3!%$) BJHIR@JB%%AHX ^$ģx9eIENDB`logisim-2.7.1/doc/ru/img-guide/prefs-exp.png0000644000175000017500000001061311541757152020554 0ustar vincentvincentPNG  IHDR\fsRGB`PLTEkde]n s/+x30BMY[GVUQ^]vzvÁ,{YۙkpʔީIF pHYs  tIME  ͏IDATx c:. UfxT[μBH&q>f%/LT@RR EA)(X86sJڗ 3F,qZʠVJzK\ڢ(mX)-=A%<:֠l(m\lL-jl6|Яl÷+:6/k2tE<ca$$ o-ǂZͭ,CPl-yA5KSA ${>_-3ziCW#|~PM t.j {S j=TZ,v]ƃ~bܴ{H=,Ѓ-A^'tA5BӑVCX]ʃAaAٸgطrqoPH`\ {QF*Pr aԋ4&3qd2(-GX6Cb;gZ4jJl*U`8R{s)+) 5DobKߦGfv9gA NJQP'k먹tG{(IJqļߤeBf`澂eX_90v-%xQjZ)t)r{޻K΂;vqIJ8>?pI$8N/xk>rG-DZVAd*1GߪVԶWlRQP JAuYST'RLӺwx]?.]nښy@%"H|R?-nV^Z'!bf M&1KKQc4( ^xfq)Qa.rX& W`T'`>6GLEȘfe&lbƉrUS6ŔaLܳ{cj:: WD"Jqg"ٱN3a2OlYpqT1I< KQ&4ag=zi[4+&eh`bQaN! Ripa-'@Q~s9 &+.L0N"> gœc ,.p;\ߡ<?6ūU79Xr*m B߰2 wq@/3|W}pãmV &8x0!9[:GRk:^ĭ@= a9o[f4=G JA)(DO|~}/M/Lgne0F1 JA((RP* JEA)(RQP JEAl3/S02ȧWPOWP JASDA v@)[Lw 4(TcAuj?ڿx,؋7sە&MЮNS)MSy_T K-D@x(Y& 6U$2\sb}TM+FL.oQ9roGN%{Ҿ~]=+a){N)\-:e'i*=ִSls-~Rd}-f,8V:ϗhmu Hm@۪kΦ."MmWE `7Ajiޔ"PPjQ jVK0XJS>QdAըp{QTWVp}сM6@QPI8{+ê?&\iBT֯M |7ͷ7eC_^ơ/0u;.QmL9Y 9!EU|բAu;啦B}n8,\fP;Qw2 PM6RbQަ`MS5Q?A):4 C>sm*Jؔf~6>_x?eACBԳ:4@ATTA-6gM[tN * (E/}Ac[d WpO Y G֏^rI V2>Rљk+={i҇/~F.٩p[溠±DԙK(j*O29%֓Tzx?`_Qh`3UJ%㪃?,ҷ%J]΂~gd%_vS?@eΐx1ރ*T#P_K2sw_?h\~DTRP JEA)(RQP JEA((TRQP JA)(TRP* JEA)(ǂvjTlT+ JA((TRQP* JA=XV[x\A]iuJA]MnWc(@ݎz PRP JA)(u P酻I+j?`[RP }oWKbo=gLyklnGhWj{wEܶ?f^Aʣϼ%;gx;huxuoMYx:(ʽ &c)'r(:4֣j7Bk_tx@J.^A=ţ^A=D'\N JEA)(R(Q2vQP*UhI'7oqIIENDB`logisim-2.7.1/doc/ru/img-guide/opts-toolbar.png0000644000175000017500000001772111541757152021277 0ustar vincentvincentPNG  IHDRNtsRGB`PLTEqiVqrs $9AIQ;\ G]`^oxɃ'{ fhܙ̉Ѷ޺ pHYs  tIME6IDATx흍 mӶ,2WuK s,DEF ҿ ÒG`a@D@ aIqX`SF֮}Z yx Eh%tqfs"eMXlߧEtfhVe8CdS!դ.kx]jr9wB?L[jJ4e)Φد"@\<* %ˀJ83}, /U e ePCZ*E319)9/yf,4: !h Y9򟧈Y ?'R+KvpIsKQ"sNnޔr9@&?Ֆ-H#/(LGht w4!ݷ)vf@Nqu܁bDŮK+Y];!s@"e|CFGPN m"+V!CQ 9>DRq}IZSC>QlsQ/"d!`#a#@`@""u6~ ዪrڞv@M29#T<%DrVz A. =t_P*KU#:X>` }(@lf Yј>a$ r+n!jQzD@4J|B'ޖ@8&JE9!`(ʻ}*,88ikZ Q4 aiDR$%e)K^<2ȕjn\Q!J ml$RsBݸ y*XosfE%KF65h)uٱpG&*6=4`Nh̥JfV,m9kRR8km֤J)pZH)@䩜W!MNG@k54[}Ύ _5;u\F4qA L_gݼEf-Bn̊T)tV#{.ճu$xdNOԐwAչ%r&,);-cW!elu="H)ehHiv쉇BK#Ji $8Aժpx1&i=#XYZWA8@ 8@ " " կ.a™F>E^7bF "^g97RL5g?V(NoUy*Iczz6`/E!p􎀺x*E8?I4($B!U;խZ՚ ?3qf> #@=?T)vt5#S i د`;w*le_6..]$pVf%w|gMq<}^%g['(NuАZr X߄MHw.2_@'y-V=d@ `F7_";G}(@^'-87ְәBoFDhi̥;Ԣ#XJ:/3 P>c"įqX@MmF,JE64,[9W8NrZ:; mr\g>ta!B;YVnҟ\ (Ȇe" Şc{L*6vh#p! \"h>8$]m|p>ؿHp!@[$qkX&mLɜ!ĺ|FsnmOl1ϺK 0 3Rs$n 6:nLKꤠ8Jqf$wn Tgݩ A"@oM԰\wbZap%OK2~:͹#hv `V]Y YDvو i kuNk#YjYw>(z#F7DJqX#A nuc|{  t?P){ {or &?kiT"lT:b<4R`c] _._TC t.{؈|9R`Ӆ@<וU~*4;xOdYS) {I0W)Fߴ#0!@` w쟯U' 0Ҳx 6 =)`3ZG24hg n%)R2R˔2r\&b`n`uVd٤]V2ZgiSZSqADh~*5*k##@^(<,0`usYV]nwe #hyͧ01n0`5kT ysw#T{R`ܰ &_Q @i֘#ud%O!/OJ{.L2x.`H7-ޥb׍E?e ; DDŽt A!Uc> ͥ(LڎO`+Xu:-ܒT7律o (< ru O]R0+}GsG:~xRfs{czFֶꡰ:(#!WZ:ۧh-#_Eps^fj) qs)}pBD`| g W)I֑])Kk/ ~G0;5˔F|^xLs :YT Y5[ꠊ+qgDz(޳GE`hTY#޻"" F4[t_Hh@:0Dž`4N~XL'CE֗ <,n[ Tş?fblnk;-WvcĘ%mD3D`ȷ@@8zE?+5'A@q5oѽ )kw?Dv5 uA 5{<h[Ӽ#|k> s1K 7@RO>rJձqwCÃL\D`k_ղa7N@޹,epȧĹX;SD`> \+ś2 sJW "C9w.xPzr7"0p.ribfP͹)84ogA<8x7BiaxYm񙄁F,M&XY,fCD#n6n7"ٴ΂lqgЙ 7?$Mf+kqg+ʌYw}>:7 z(l z߭f@[\н/.v9͇!Tr|;/조=@ =4k/5Yo DD@DFw k"H`&RUX0:N#+; b>l{#}:3^m~8] [h*8)_|O#&JŴ2xV!#nuUp˹YF< ,"O7:Ҩ5 b>t1}bK@r^eܱYʟ y мQ x[WJ]0ǙMBgZ(0.D 'J âĦ&͔0>6iϖ]#h;wm3BLO-MtOLNCV5::CvCt)2 l8kZ3M ȬڶbH(ЦÌa fࡡ& t @9WgR`lm'AL?l60uͷ&Eo9C=T@X VMbvG &'dYO=iu$ΨoP3.>ܜ包rrB1'oƼ1qyl 6‡KqDk[owf>)B.9T FIݢQcv5͎@owg*Y M'Ӡ9 bŎRU$5TM|_| ZbA \E4 eg@',s1QC"0[ б(~ dfSg>;G,8C)ѼGQR|*9v作CG8G.e6D!J=+ED`DG,Rpy$Gkt Qca.o|Jх@9`(" @ =NS`S̫'(Ş[):h(#h]ű~F`RYοA2FA'm`FA&}J@Hfp @2o{A y(TD@Ӝ)KqbRBa)7(!՜#)ݥ؅3*?7lGO|EQ @]u|"'qD;i5dxX8-` o ]FRcXT42 òB@" " " " "c2xBJf)UF`y*V "X )#ZuG|+81wj'GS3>օjgK4g" /ui$"F3ҍs ŻVJ**WF 7O-p^[ lkyyxj `QCZ*1 N5V>jKu9@:00WgK ytGt&W#; "^*n B.8;_uV u ^bM"ZB֠X꠼P*+,2q?  la#~CC|C8&3ɘ"p@&G,BE/4 &b(NB|t -4"G0  D"`x)D!bXrp! ܕcIENDB`logisim-2.7.1/doc/ru/img-guide/opts-simulate.png0000644000175000017500000001243011541757152021450 0ustar vincentvincentPNG  IHDRX6sRGB`PLTEpeZnrw2.wo')BIQ \n_rVNQbkswtvvƂ+{Wږo˕ɇȼ, pHYs  tIME  Ъd>IDATx흋b*EУjcԤ&Jyf!}m> $ <<@PAP"G@*M=mCuQ\5m6[V}wAv$l\.9LQјnnA҃\e㩨j7}k*,oIEa7;<%jݎ^sr6{1(z&ɪ1$E2;P4}wqfnCT,7Pl f17hқeVP05jqݾ,g2\65ҦX>+r>$S"~~ugc$[5T,Kj.tyifޭoEEӾ,mge^D*^˗9_fM 'X]-aߩ 6 Yc*Zq6ʦnYȻ(p5ZR*g١6=*oFm7iOOp Ӝ(Q[T,-ծlmWu3(4DEW,ZNjrToFu| 7ۋw)7%-Q'AyrQƮ& NXiA`D+%PoGM[u'=M ؞F\W|עSCMӤ:Ttz˒w4kzu9G示TqM҂b,}UVuo{aP1нn,m׎f(v+&RSA3'u97/ ݕe+eh؆Wenteyw>ے^/ӛ]!t+›euBGe8'YBY-;/c.?=z8tq}˭/c9T յ >37F+T4((Ra*"EEe T T@թ8ש8>d鴎Qt>i^ Z^Җ4vt73.: Q+**T$81*ǃ wt 箺2w2Fg_\1<}=Vxl7w g_6)7ztlnoy=6dK ˂1t@8R*[r7uu0$Stc*q'xj{ {b/.xy6 :׫7-s+[ 6u4.fc\xPLeGLB;H Bxi9zwTf߸*e*ҏT9ohM1M] 9Tp8FQStD#Nq0T7dIeŁP4kUZG~_ 9 @:RȩD*-HzpmR!1K͙-7CvGKZ94lZ܂؃(ȹQ=CTV6A߂fڂ\zi8>]oަ7|Uḱ66?M%u!,_ֶjpc6ն 6[iO~͔R&W|{t5oZpỌА:8{mZݸCT &~mA*Du,П@tC*7ۘj㊼c%TlJ68?jܕ{bO\Z yQ_*߂WWWWWZ_qv[>+@E4仨鿼)g |m8.MA(`*GOSLo} .}*}vZӘ&˛lBfin+ZFQsCq8p@ؘ ͵8>˝P1ﭗ-r:f*dTQB μy3Ds.{7 8D >m;XvTėln*Pa~;yIoCTh*ʩrd4Y $0+(,= uTumTT/9e.fL /~-H=ɹWi)d4YaP bzA_ ~7xQX?Eq8Wڝg*o%*򪺐ƍrP0 ۔AQ x:a_a1RWni䦞~4]l#H}&ԡϳ+ձWh*T:Mөd_.^`<&4ڂJكsm~1 \Sw<7UnoBHN:O6=Ə],Pa6W\cT_AryJTI/3V4+ Հ T@@* P T@@*@* P T@@* P T@_3F@oƴkpہFEi* TGT Pq:pII %BVVvaeed@Bpkm_O/hAlQkfPV+:qK:r//~w H/N9lk遗䳇(*Uі& b_!*JҖ,7dsJUb捷6(^Adrnњyj<R zHj3L>3CTT2-^\6 }E[Ԗԓ)d`g9* T\LŖRFp|zS__`%q6Yn]u!婵T?Ղ4M5OBA^uȔK1 #Ѥ-HZC R7ƒ5g*TH%g&|dX |@*oT %*~=kv{P˄'/P T@@* P/o .h|PhAO*@<**@T|-<.5,S \L+u9tNob}r|K?i*d#|Dxn2:PL53 # !Xb5G]ګ1,S8;Qadj=c~g]@g1<9ocR)M(I>SSjITkc:Y?:',I'ߙtd 2LW A~|K6.3;On2d5fQ4@FMHsMch:HȂa_ϋ#Tn\7=Wf8Pa牑JIl]) QMCF$ǨMpfQTȅ γ8w~0TZkj2i4yh:KFS*ܜr5ԅ̨Wy*$P4`PvO`*%A I}*zBNa^E' ];?}LJj_&Vw&a*و:PJa*v|EwIkPnr$WXR[.pI5,iUW"&Y>Pѝt~¶T[ffn[8GM~hzxQ8*fEN g P,V>jUh8Bۆ<$ǩ䛩7ӡf{antv$FnZަF,j=MۧG3Pf;cMH{ 6ZIɕKTJuʤ9t@F5[*ٴf hXN!sNrEټ{0[tHT|?A@WAߦbfPtT“И@* P T@~.9 =[pyTğPI{Q$@^(EaË{1[u3*F[1Yr2 8~( TтPd9qM6iÚr.h*gaK iI~nqKe4LԤYri*B.~, g uKφ;g|: VOE*3ƧYh\Q(1$~rx*Թ G}wo->Qa&f4JJPc+Tナ Xzʱ7q*%l !*H**1# [#tTo5>ڂHϖ>^&]8wkisㄻIog4w|܎)x 2],]#m+r[N|3U ;ޠT*̝GU2ꤛS +e*v_IFBu<*;@* P T@* +PAJbAЌB=tj/;q^IENDB`logisim-2.7.1/doc/ru/img-guide/opts-mouse.png0000644000175000017500000001727411541757152020770 0ustar vincentvincentPNG  IHDR\&sRGB`PLTEofZorr "9AIQF\I#niljwǁ({fc!Æؤӷd%\ pHYs  tIME6N#IDATx흇0@.6VL:UnEBefH1rv+CfB $jH;ϪX:4+z.]ZU~CtS nSs~x"Pn:cE@М:?XB zD~Ip&y[j40Hx?\E4evV0!C]X7}.=˒Ur>rwvv%1Q~Z *o{po?r}1?>uLxaYXD2!sU~ɵ/] _n>rِA g[~- a8W{Ts!!D54W@dgrbAebQr6"TgGW@/$+p |ZJ=3}&x]{SA(T !+JNc8oj @-ȾM!@ӧ iBn.B B mӕnج}5yZ72r>Lc^Ұ(=#c[eFft=CaO{pPo^na:ŕLh!M:}11?,aXu#} f'E]DHumK]*^rj-D6WQG ("]Wbj~80C@&p0"(EcH<ϳzy"`~S5QtoQ_Ē5܈R)RoHEFt>`-_XѨ&( 4!S<_M>7ݢnrPH@"`2s.+*1WsىJL?A=Qn>U{dB2 m"P("؂%?G r !\Ƌ?Ak>NSo6,7.@` !C4RA/O4T\&"0AB['C8%&x |d0~kyd9!x:KUPTkoh [>P'cZcj@AU"YZ@HN ,0Olk%"c& FEBT"RQ-H|JRXG7yS-ۏj骡ET T/!Fp3槂[))6(1y/6R#@ڌlW +.%6rxu@1яMy>Հ JhEsS?J !mB)EшA5:[T\ o2y+nì`kU2YG2 YXU p"32ZB["QuȲ@9Hu =}r쉮!]SDsF7-P1!@!@!@!ںn?F:ܸt=ܞJ4;ځB+ SpשH=/J'? پX;!02xwHx[ $X" ,G(B}!Xoq󸘐׹/c+}CQAˇb^71[.ba'J0@g $lou+QG-6?PٗmGq]b}Y+p{B}sВ)څ 7yL_R/98'GѦZy~ E@$B@\Cy.gjB @>G:3B1B`qqB HL^q}!Al3v֣`/S@`t2OEOv&II }!5K3x`NexDOq˒nIS홺ub ? tjKư+R"&tZgLBi0xMIOzhEժ6*oŀUqnv q:? }cK]̯arlmtSW uR -Tјa d4.X"gcͯ ?8|V cҧZ s(!P_.9,UJ>A@fX@汧&ȹ#71P3ZխtpAXtrvE)R4҂u3S" hE)p4ׄX{/$j=Ҫ W$ Z%a)C 1w`V7!0a"/0AB1A5c}p 4@+3>6A/0L@ 0AX3I C>!:sFy0-YQb?㉬ά H˭KW9DW楪`&͊SgRLf)+W1HE/ `11wd f%P`$ ;(޴ SAV iㅱR̝ ,<(:XŨoTB0FI:ERaմD'8 7,EV!Ts*k0͊∕)?U댧@yuɶ! Zs| 3}6ˇ5ֻ$?B ߳G /3᳑U#F 탐zdP"ƚs=}W/ @;)$xpjAЊ ۄSHK 'zpDv)$hH^(#!H!!0{&5D;|F H!? `W_HL 8jKI7%ϻ}H$F)[NT! &%nU$P`1!0[@+z A; ,)UB`O`(/!x'!0~P_%w"S[SXJfM@7L/xy ]f, M*WF Aw4^AoZ@w[WU3pdMT),ՃN$KBqV0\GۑhsPU _ 8 5"\Gۑj 1;Qj֐c .A'h@{u^SڎW)VNhr([ K/T|kBzQۑj 5;ɥ58~fOF\1k(/;WS54´xyvP<#54f|qvPdbv4f њŚB545A̚ }#B9RhKkQ?)At"bg̋J 1YC e٫AXMI Lr$ci/W G)`<ABޛ5|͸f Mwf -Z22YCEYC-M#!^CDYC-I5#|.ixyP[GǴPwIO|q-lI hP>Wt5!2kLӬ!w*T6&zIA:$u h3)` +WXjBc5d6 UT"9f,jua9$!0B]ZgPVunJ! ŹkIA)BHB`b#J=ӗBҬ@ɐ-"4a"#pw1əU:󷕒P#NbEj-\bY,æl& '_R;Fk%bFczRB`WDa8+w^IXn E 0/N(-0GHAԌ|(k AfB)!0%5D%\BLs/& _Gc`#B }wC^~S$a)!! '< l}(_ȳ">3YhI'(E0 i>2 f c+2.53 +!.3կ@re6ͮW!MoCJC7oonBY°Z-vz&օ]d2 17wH)zᰑBz%KMoF2rZ !w1!# B ~B!@Y!0{!0{:e u"!-_HVVJ! mSĨIM<@@@t# )@7w爩_hcl6_hw TH w"72{=-1Bwڞ;HL.~!q!@!P 5!0j7'f!@!#!0oɯw+p{B# X>'')kqZ8#rB|A!kLmiA9SĤFnߙ?!ZG9ھpf jB2;Em4[h6@+hqAK Md nCHt(־UzpisI쫉nxDw&)@!"=2;i~Bm)d؍;9ʹ?!7Ep^U8!@"o@cF@@ F W@_;0!W`Mö@;2@i!@R ['B{ ѝg@rwֿtc$Ha<"ɃܬGR3 #B B B B HDB ܡNմXgx8 ,l8o՝|t*#B`@t@J!@@J `C ~#M*y' j@ e `=p+ž6}FR8)!0Ɣee04XŌZE/t*" ׭TFe j ><yCT "oB7־2n)jdTDV9 DxSbITIFQ|iA~ ¢z%KC"Vey@ Y%֍ӍniaR'W!]];ӗNSD̨+=^dX@>"xīUTB+)V@ Xh!,*2Bඃ,86"ULJW[~ܙ5zk" H6;(S s1UFXTd s!۞w:6Œ^* A7NtFP1!@t@:4w쪀@ :h$dx$0> }&#B B B @LF|!@+rsv V?bIENDB`logisim-2.7.1/doc/ru/img-guide/mem-hex.png0000644000175000017500000000671311541757152020211 0ustar vincentvincentPNG  IHDR! sRGB`PLTEqpf6noo uDEC@KW<Z\Y@]cep[Qgpyr{֋/a俖t㨸 bKGDH pHYs  tIME )9c IDATx] {< 1䶊띖aߒX4m62B@;}@"ڜDYjz$mqĢMB0&M>haB߄Ds;T4cfjZ >CxzCTSuڪ4) p`9 w!U. pJ=0;!=E]]|Z 3`OϙֳeoUlJOԘe@L "QQ* rr;fNSΚ٫q.r;Gpt%~_ NlRi8nVK֣ͮj>-n]'ֳe Rt}o{9@p$S֪ -͓Q͙Z |ȺV%8LeUc %~դHfbRMصDE ˼͠!@XRv"Q9[;u0{OyC~%^ G..y=hvWMV3vv_#2pvlTSݴ8 a[zw,s`"8.Yh@Аy(NtE (?sh%Ⱥ!;x[FSWl{UiDh`gYE*i$&XʓݔG$DC=,jT%71Rv5YNI%v] XDO E?vD J cB^|Z  >T$ MkzX:u3- _z0C[׸[Ʋ$g T{KDyZ: v<9"n+L_U|Z Z1م:@)znݐK_)M7c|iV@m܆γYnz֟{ƼY#3C& ~|DUsvk*7/J$=`wk;a+X*^Rkb#s3b(0UE?Ժb#-g[/Q`W@в7ztf2ܖZ pa mF@@<"|möe=0RmROp^rz,*rjGQMh.tks^[t'+@gM>/pPpؔ͸\+U||%I^I'hTorQ4'E}'KBӷXQ;M]cKq&! SPea]z$cZsa (tLAj8M1"cX 5&ENj,\/TE]Y7nlgSθeKo4W=#($?06w^ۜ^0BNp``>{!91!S`1$1Bh1 4`8dW6D8 D?Vӹ)"kxc/Qj;iey+ryX{sO?/ Du1M gAB@խ꙳~yq x Ad,9=N*?D778{sBۯr@>xDC#LE Rz s707C5 dBS4N4 wi KWBtYPR|WghnS_uՖ@mggkM%xƥ6UVLGqw$JcX[15vnǿ%*r@}j{Hgi] 5tkjeEWMm}o{>LNгݾNoDTZik>2Yg' # OлuFCeqbڭ5{y̕^ JDdY,$8F&[Nu#N,4_ftJh*Ӓ/ U4Z¤b$/+=zD9#iԝzmS$E4@I!9 ƕ(@=³dY1 ._=DxdY=< W/@gkMr:@GlK#vx^#}Z`A}5Wd-#:YDB\O1@l'# d=:[Wxr/: <  !Q햯39JC{[#Hֽ<-_  (28@bAu?xY@ E*@LQ)X#&x+I?IM<d=GڽjM@{dU_?=@@@@_Lre@%n &hyu@ N~`VOW6~ RAedYw+ z?Cr_ ME #-aPDIOqJqR;TDR&kD16U >Js}h>01F ]r jP[ߦWղ*}=D h֑ϩ̸zpC휓3 1Ot,_Q*zǰNB:oФOzm-tJ5Vi U@Zi]sZϬС!,]{+k*4{ MBSk}mu,_d}Pz!kfg#K֠vw˚n&Ȝ9w8@l"_;ZzWjex=\Ci4@{y   6hS@mMĞ8mOA''~fERQIENDB`logisim-2.7.1/doc/ru/img-guide/log-table.png0000644000175000017500000001012411541757152020506 0ustar vincentvincentPNG  IHDR sRGB`PLTEnjl>jl+tlwDED@KV@2ZZ\YnYPdeiln\o{Ӌ0U㘚qУѓbKGDH pHYs  tIME ̰mIDATx흉v0mVh%57!(( !h9G8Y2LV$ d^g3c+8=(m?IdكfXǡ )B(=?KJ׭dz_/*7RHiEa0?ɋ>;r^$f9YUnJ*4(.(i'9%P$#eXU&U-I :x[)MHP#UY,ttaGv.i*Jg3bW h$4br23ӧeII6"OJқFGq͙:<.bTA'qd~xK,jr]j-垅uY[UhX?)3VyVbb~ŵ& &Q<)οs|{iLAamc2g0d.? V%`,73*;Trşp_8ɿ,4>i_.k۬ Tg%2e٨W<7VZ,RϠ[lz6a$oaTpS6O\i/f'tn}[kHFքt6,hQ(..ZWd3\zookO&UKN5߸c&$8vWΊwe?yi&-i?䟈AE]]W݈oJEne- =7ѣ`$Kf?񫊳 TThwVE\yw$FH؈ʩJL],l^)תrڤN':3Y\d>$n’-(}U:x?b?d|5'|U/&|U7OuX>6g]r_='}}G?]f͈2/9l,by[R?呱WW/Ka\'] }9tuXL1)_Ǒc H/T.gfOM6Էܴ7vfN9Q"jUNůtR~[ikas{udN[` !W 9'})hrYO@yޞh???(🋿\'o ݳ[B*{\>4磉 ~ ^+q-=hTnJR+/H&UV]BoJ{*R皿"e/{bsE?QjAJR :ʫ(:q eﲨ3. HǶ߶m/._A"uyNի>U/g!E棃?$l){ b{$y_x1?[#IGZzG\~T~+7WIr5WM&˶Ok_?!ߴ1:???x{÷sҧJ O& vD`m-[E߽n[;$z!?G7_JNz*˯ǚn{av^ejN?/֫R_׍µ ܶ#2zPkyQd見:uL~Gw~ 4S'C^U`?$[ $4XhW 4`I6࿸m_wy6????H`{ǿvGDEiEo) 🎿:🼁)VON  <_,~-?Kc ]Sh]SXqg/@!c32t~#Oœ, =O>@^2xUNNi!^ ؿK/_ ϲp/ŭ//}?Sq_q_󯿸0<^`a~wnXru{_|/Cgtp|`Rx_ϟ?C?it'_m24F_ yB?L-o0Y?_cXqbq/n_X?C!OY-;`Xqo/{g/{?veD68>^c>̰^۞/F?F@qzr?ST)}_K S,,];o ^Yxv/ ࿴/ߋ?_/go>1B ?C5Y fu<ߎ3-CYU[%Q ?`࿌L:E/ ~g;W?>cX1@o{@?@!mL= lV*lk{?>9c)cߨV/?5YYD ;'Xɿ</ljgBf?%9>?a"|ʳ8-B2_ sJq2???C!)?"%&HZ#9YOIy??_V?]Gz?(7,@~‚З2D5?Gvɶo)I* @j[j]֚P^?IǤg4_˖xDXl _\5?`܅$AK NowТ ;m$ =[LK=O ?ߙ?ąhG ࿁88a {xeIENDB`logisim-2.7.1/doc/ru/img-guide/log-selection.png0000644000175000017500000001270611541757152021414 0ustar vincentvincentPNG  IHDRA^usRGB`PLTEpqopp N"4h+&AIQQ^0L\_^-nsrrχ){iœrՏًć&TbKGDH pHYs  tIME 8S{IDATx흋z0 ca4M/@-?IKiՊc1 '~ y!D=k;?A&}{/{)Wu]y]k]{ۣsxi%}' UdՐĽexZd5̳Cʓ$8\܈@+fdUE]PCoNfR,8.|3]8!|Ĭ^UEd:xtb'F;iգK$gTv*>ea䵄DqLp*f0X@lX'vrnOsWbNJc[`y{'F*{f;(=#ȓ)L>$ELW2Nzq0Ç{svSB$uqSXD|ot63$Ϊ(bu譪635EAZFP]dxC]Xĭte("`뾂 JCf3 xEQ/pL %=ī?4: F Y4PC[^_:Pm ^{̺.,> LƭrO̰[-CƟlpPAM0oa*E~yͪHoOe]m*e O{OG%ܕ i8xq'a,[y}b; q+FxQWrN=.?<^v#w.6k?'ȃX ˰!hfCvHdrłu(N"lD$gIuDI\4=P_ FqL66_ <˰a_鋒uQTh$≼yq!nG7FJjGWe跈3N/Ke#yMk#b pl ѠV],GyL6<'q#wA跉'_I3,#`e\˼vl7};hdj&k2"MÝXxDŧ De\[uȢ_UM^V]l~otV#3MCDZY"#To#wr+f>čl."S{M/Dzd}nOYͯHĉ8q"Nĉ8 'Y&qncY<=-)i"e՝ETs&~SdNfG<}FND?-"NBI8 'D_IIR〡&K!&;Ӫs.ݗD|L77|^,h4qvX IǴ ׮vM71pUɪO|T-ZsmS0M\$0H@\M>~!ںɀ\RK0qyL$0HWsœIM^OM<5~qv$c㱶r/_dq]|7Nayb$x$MYvP2r.M2 7ZnⰈ$ Og*ƀAê|g̹tRY7ύ~u"Nĉ8'Dq?B2MYEd7GoOgSh銸_;)P[Sh3#n2fO<%1Q>qK(҅G5m3?SOS4 ǣr,o~u}+O} NW}g񉵢OCxċ ֟NT+J:|Eq0=пnk׊ +dSr+EFSA/$V:>IꨟW9a .i~-ǵ"ծ{L>JR7_rO+ L".h?*6xQūjE0J=tUGg8@棫^ _ VJL7vS$l M12B{x 5 /FS7a%*]9 ,~io3nsD83뺥K#N3 KܹqnnoR&f #^O;|KGYm% 'T#iXRSR_ocY˨."{z-\V( N}㶫)z&FD¥J;UtZu垪Znj, u`D?l9ǽnٴj,ɪOOz-7Ӫ#̿rjLE/zhmskt-?=,ajf#%̃L{`Z xLse b#oߤ_~)nr|; T1`SY9@mx@_}KO9w.+A{b*0́|T]PHN' iVwxlDWTZơA<= V7ذ}D||Z|Z+MF|K`t~D]#nPT0"&޴lʪd]m;e.of-=:n rK%]**.|p,wM! -}`wWc>G!/e%n_q"NĉF=psdc)qi?}l/_q`!} p#p qW\nm?RI,Mºp4ӑEL2G&YAmC`vAe>10kgE(IuFݵN*Eju3qܧtWFX0(/W+OW{V, vjKXųċJ0Κ8,oz3q4X+6)˛^oIlձ&5e\D|Q-7\UZkZw-r\ޔ{`z6ͨFĉ|BڼRchYz"̈[ O.[:B=qW-%#wfR">q|'>FP}w?'y'g~F.ٷ܈Չ8'K"~կN_ЯN tvVG(H,Y NmI2hp NBĉ8 '!$Dq"NBI} JLv5.Ϋc`1e/wl|zPLhed^ǝD}iv/_?Ję[gf!DxmNܛYmmUuO4qlj_v8òffM畺ĵUODOV}.Og0ivqer6'ga%D;Nz`8_&N0m" 99/ltRh'!$Dq"NBI8 'qEm%q䍄7o@B"yG5IENDB`logisim-2.7.1/doc/ru/img-guide/log-file.png0000644000175000017500000001036311541757152020343 0ustar vincentvincentPNG  IHDRQsRGB`PLTEnmovg3"7DFD@KWjZQdfDmfq{rш-{Q唘™rЅҨC[pbKGDH pHYs  tIME - IDATx c: un;&v/oӤE9g5-%Oc4,MrV_\OiS]^æ Rru\?NV+l.*_VW* l .j5m(snXMV Ї/f&oKvT{"QN+>%+Jg?]AU"!"M)45OMٞzW}nn:AOcrI\ `Cm&8̺ x65{qGjk^A0% =ӍPjfeDJ΀@rC[?.\թ9ƪC^i7]PV/l VEjL 0U%w;JSDFmCiz@{rj=MAe5!ȕ6鼰vH*gl]M]ŵ"m}Q ީv5߇3ƹʲ uk:M 9)H\s3OڴSFVDsۺEt1#{|2*gT_Q]_j½kOZIˆكU㤆*CD*yT@ <- Mnw|krR}-[Fi궼IѷD I9'{&@uoKElm,c+@mui:[g?䙌\V2')Oi9:RS}7+5zKjfC H=̓w]kt\1G>f{uC0U}ךJj?9ۺhL 2f8Y_Zgw \_dv= >!#9/ 4 N*\-/qIAP-:ݑAVp-8aJ'ˌ'zBVNk*>.v50ݑ\AlNw-Nf':(lWLiweerbOwPꇆɒݑ+5z#Q\`Q[EFi`dz$ j<!63u5fWw9b^ʜnv/W/ F[oY}֮P+OK@8eRdLBf}tgf)oZu ubw{s)^'KlS+ێ=YJ=Z3A,ѯ A]ρ`LjK;?DE4ӈ AiwD;#3(qO}bBH"rlqb.VtO蹟ü~=\Y% ҳ͘00|mJC,46΢ @ @ @Bc?/ 㮇pڔmDN[=Xн'Q6i=-R`zGA-ȯ,AREpnOޡaAߧ! Q…==  O Ư m/0DpeEs{~7#vN10>A; '8!ް]o~  tGG{"t n #0v<~I=nQ_[# MBjR j0Z OA  3@AP"d9Cp /vh[fXVv ˚0;ka_Bڮ0pO D_W'03<Q hs^i Oae8.cu+m1е;CXaPCB,@PLC0@ @ @ mq]b wr|BvhB0]0l8 \Z7JqO֛uhPFgsOQ CZ6-h:Űq-ypIv?}z3!b y&P1!eF)X8sݟi+z"W\ bF${.R11>C&7 Gke)Y'zBG(C0^dMO;ʥlxeIY՝+#$kt.R\;gUEo)t9n<5Nnm߈8l@mLm{d37fêK9Ҥ H;gSL8Z^^e@Ϙ'DF)"A0Z Bh T1&DkDd}|`(A /܋N̟q";F;"*_IAJ xwܑ{Ǟ h^DA?APnQ6J bW=bϢYNЬc3yUrR~rL`y`nYDU80bw\MiD-V(MEboh!w¿绣Eŷ u!Tɠ7k!w!/{ @ @ @  Bީ`@;csvxd!FANLQ+m ;H\`?N2r3)*GA?'GwĠ`N_3&'AQ[ dK;5q68lQمZ;^![B8k zP&ꂕSuS|FIKϳ@XM^r@(y>bpj*Lje\t<ÚVwE @ @ @ f* TMm@τЪ .NؑN'C%,ZVC^n%(^՚|IU&Vav:R9Y0)4c)[Y9Nf+LF-b5B= {gj;7I*Kձ셯BJCs8}l^/`Aa:)TlBȔ'3QEް(g&EQ˗0=v9uܾ釽Ium-44ˆV[V%k̈& 7;cf)'lSߟT(s&rGJ| dtx>1OQř3_y C*w?Ŝ23l33LJUo~fHSjVLKȵ̝ݮvjkOOD߬Ň/}Ͼ̄>8{b:?sb^\qR4N+mr{$W{~4^wXZ16/qi*֛Gt :p&7 Y{0SCΆa:e䏗,BjJ=@n2 WRC2030,3 bF$Y}*XooN/]uJ4|1ΛF_CV$fFDQ9~ ~@ۿ-_EnU\wV&46w O\~ kdUΊ_M\^DfF_qI׫O|Cl&"6ۿfL]bװaOT_Jm۳^K4fR73G!+ {s}u^U\8dF& c$AF24S1y6I˾Y|ۆM]fbur`?IQ؀ܼL18q5`Kߵ6/ePi7DSW`k^Ua۴gܼL.eb(&vܞ2|`&۶%L[[Re\3#D뙗.|T-JGvh?jf[ @ dj@j !xҵZ+`@b)`tL:0fYPB B v_V/3U8/p{bkcƆp y/ S4f GM<&3Djy{X^jA1GxL qV4衙1d@O02\`:gPchGѐ t 5X~N̏j?[?O NMd)@)3m21fÌƼQW k2Sƨ1| 3h:3-"3_ߟaK KXE fŌ9~IsP}eu`\83e>eEB,]p<и eȀ0_fL欘9?=O fal|6M<0Sئ >\ |JRn3mLgIg8qxƛ0F1J0f ((g 3`+f2dgK`3KXl`4"`̀~[Ӻ fL޿Tf陌Ò)drfN+߿RE$i)7^6+#ۦCBn"v}l4+VIvf2W$f3YBҍfk=2:n{W^>..&#?iZF2#mhm/Ek=+/(|!=!_΂Þ/^1#*F[{Ǽ_^'ZQIȄnA3_7Ẁ0f`&L@>0L3#-3.[&6H3]$Bf"N3!g2tL&~\|ArcQbHE}I\8uBnk%k _i6Iw8i1fc0A=hm& CπWLbaJπZ̘2+;flzgҠ?33z,33`?c›'q< Z3W {wl3JrmCI t݆i"b+:CMNB"Jv1G^}`G֫|Zg <"-G%fo7y^oy.=\'fD ָm]zMUnvćQ_`LrC 6OoWĜ+cBL>sd]L>U~E" 6dr`̀0f('7L-OYì0f 3eƓ{g7KafxB#pk[ 3^ŧ~I vyXeMKU#JFgh JVr9X]dEU\g zo=SdFݍE~t*bU7;qܤ5bCҊޯalp3]b!CY̤YMj{jC3U3CWŌFBY]լr2n76Y6*gCQ32$kyõ4Lz&M'$1lSU6zt6z'`fF1C#ggXL`:́g1h'g33 ۤ0J'9c(g&qTD~&YIA3MgcZ?i?~`0f o3`L> 81f4!qL0Fg#cg/WS&z-fNWGffm%Ϙ0Ӭ|`mԌ(e|E8 LO{-k2M-`4e=p^e>=03PfFLmF F[Ѐ2TzV3# ln x )[}9WWe&~elL\6mQed2R;3']}AZ2苅u{|3O}:6s !3 ) .pVٝ>hadf?7DL̼۴ozɟE^qfl ff",I]sflnCff?DuÌw@A3#aFj v~`312\N,!5i-!lkLDg^[(3 ƵdQf |~Y`<0y_`\p--fN cz&o[ZdvC|r8&d`ktbW/3mi2 fi9R0P&C ̼ Y$3G0S%&0$^V%)2S\/Ђw0f1d&0̨G`壯^nݥ~ȡgl}wZG^j9.o3K؍Ed)\0O6 UWݎ tz'x{^j~ 438ne)3qWd1Œ+!+wjd#fSV!32>3A[m*( 3dFEikGl僶Üy&_[[utebFFOnLm=3QԴf?Ӵ̀ MǛ3!Ǹc\g0 R[ %fB@CJ4#9c1IENDB`logisim-2.7.1/doc/ru/img-guide/bundles-probe.png0000644000175000017500000001054311541757152021406 0ustar vincentvincentPNG  IHDRsRGB`PLTEojmEaj/2/ozBIPC&Z$l[OdfeDC_ɇ1{{䣦XT맥ζZ pHYs  tIME4:ŅIDATx흉b8 @I:,!:! k6674B}p!6x6$ ;&lA@iaAnʾ>uEOSA4YulE%bϪ2Z. z+4 `WJ)"ҋM`qV\uJՒ֫d]ҊmW)g` ;l5o^ |^-EIL緮 b" (b#vY}Ogq> +E!>=XU}FaU%BU~#R?E y $Kc'dG O`nDȊ{&XD7r4t߃/7Rj@^_(xA/r VYL߲ʂ"TfX(eG 6^RF^.Jl%^pKU|Vi!NmOaHW2qP᣾nbZ+RQqwܗ\EI=w|^OZ\ y&q:S]fqx6-KJ1x\dP uuE>F)k⭌RȀLZ\T¢_i$Rk BaS*5\>ꙹX|ҏVxA?L)7ƍ.g0_׳7gRJHZHE,6W F)g+|uzIi< ]FNU@YEK͢DYW@AYE:,?/m!ui IUᐒӲHB/]x |&g[9$.˲ z#="Q=nS,vTkX(sټu/'**Ps{Z&>;,U]>?4@YɆ\q(~v[B\22SZ B/ ˺&mUC\nk[Yeo~kNVzvqC" =.z%~]&[*OmWux$Q얳f$Y[j~fE1!7}|Ixg-B YU8 \Q,' ~Ͳnş" U%q{f>dc¼Zg+Ggmϧ;=| *e}}T!WuK1.)GB';X~uzcr[E[Qݦ%Tnl;vJ6Rtn^\}6ZWx/|R,PplY d,ʪ,ܓPO7pAaǨgdq ux}bfgg,4=:0Vm,gt}qVыx?-,`XuTGJujTn E2 1,0E]Xx~U|}oɪ2Fk0(ph!ۚU9h(; zfNY-RcX|žnNL㔆ADa{NTdAMsˆZoeU}/U,vf`T6 d1>^PT\,*[كB}06.A {;J=9j4ii=7 rVÀX|+}}=E5iW<#YY,563HT%XP d1O΄jSX||(X7X|!i,r4Y\?,xsdјzEi/r=^]ch?BX0vTi0^d6(iv@ ȢLt 5^0hsP4X|Bs(EG@l86cb0YQ~w ߽K`h`rY ,thȢ/cv0ߛ) Je Zlni =YBizo&\.a>gY(@ƢwKZ/kPLg!xlU fkQ `16$,Ċ+ܿSc]w x- -XDX mwSL>(CB45bؽ(>ʦwZ?^hmZ֦XƜf<@;jp_cWm /c1;YYXd9bﰎn&`g9r#[-0țv`1x*OCc,yh=v/v" z}QvQIg,B+,=z /r˧k~YEEKի?.r !(j@Nwj&HN?9$px>I% iKP",0(jU*t@AvM`5 bU;=E5 $Lȷ^ ||E379,b (}TKB ΂{`tbu d^M+~icw[;i]'h_1HY`2jӮcJ`@ڿ۴J>^ i mYXt<*xȪ҇.o ҆iTeTZE48ؗتHjrvRs.l%0:j05ҵG~7Q7lӊ&lEa,>'z z]Tyr{^1Ŵ O5v=乤z]ǣϢ=Ng q,?,wL"hw|w;نrgd]xe'כBx>˷DZcrn3H+>: Ĝ ,"k 4bw QAy:LQ,&QN '-G*xVbzj󚏅aBMJ\KxHc9[lͤ DisOex(ݣ/@!!te^ɍ+jŋg`Hed]ԿQRQV`:㼷yc |ǣ%Y ,=A*'A-{:׸]E"ywn2 ,MD;d,Es6-<~XY懶ԅXvlyYlSI{^s/,UX`sJf;Y{e,$/`omϲ$ >v(/cv4_XpSE=Xow/a 䋥/`iSƢ,HNe,Ty'fEd]1Gݘ|ԭ 5M ul&Wl6Y`{ @Ypm@ŋYG؍,,"hBi6%lnB}gs8_/dPcS:B,B[iG}pT۴f~)%,"k#8w)VYEb#,|, Ya2ױ'-XCYh> R/46"< jg9~4Yaa'مoInE6-{}g'Q656%^`XxG.:rxӱCv=N{=cyǣQwyOaH(d1&f$c.uIENDB`logisim-2.7.1/doc/ru/img-guide/bundles-error.png0000644000175000017500000001337011541757152021431 0ustar vincentvincentPNG  IHDR zsRGB`PLTEploE_jst1%BIQ+S!oK[\ZtwtGC{͆,ĆW{u奥ݙ'T pHYs  tIME29W3IDATx흉b:Pm-o S,$$ @|` O`@n#x%$CvT7T`$qӉ~#*w>r1esQ\ ; R'/P#ZƏiq`Ԃ:v(|Mt039z^Q]}BhT][ոᇜs}Yjr.,M4uxKQ|'wQ)Q28.1L>FI✰ U,IHFh̆}ȟ]nHhғ"BչfIHehTrS=`u$uUQ'SLCʪHh4IOT~ĖpéDD6v؜ySl~EDtJj"`\<0xg#; fJݩ;l" Gl*sLpaNc/LxNQ| cdV?^"'/Ob&tIqH0))cb'U_,vtRC"MxW0+TkJRa 醺29xrS%#屧hL|`~|4WEYsjNlUZtK 0}0DU@hrSkebjBxr*L5զi!JL"|`]kqæ`|ܰZ>sYSat?KL*W< 0Z::vpMK.Qf{eDvnL9d$Lɮ 3)wR~o'K.ŀQC Z`@`@dz`6 `ԧw}_Ag͚[Z=ފ4=$x'G+$8=.zCnO+ˬTn ՑxKyhU=$2:R ]mJ,|6@\^{YD"elrU67jqu-z>RZ殀AqojQfvɾqN4*^2p^u%E{}-YtoѴ.`m/jɻ-G/qܧ d42MDutQTxo,0nES0%ROR MW0tFiُKC$/QW` 2`Ѫlxٔȋrk)qOMddVy*M(n0 cJ6i/!?FƏXu)a;ЏO۶(0Hac` ^O0Q4 T\>-`ƉF5g͞{M0 oJ>>>>F jVzapZ%\80l.! c.]2,0.lC٭cq`8\4`,Δ\4LIK NSbvKG ) p0g'#1(SK#lg )LS1C]//vM7ӞONϾD[5Ҕ}\&LIПNsUa`,[%Mt6\;cぱ2K`D %v/Y 2B͛i!ڝh9j 3#0w&M 6lGa5Fo\63w48i`,ergK90j` a/Yk*$ͭ׵vO# fB&0F%i.$oMV7`$Iaͅ RUL08y=0Xo:||v3/1(q],970=_8 ka`O-;m0h゚{%]5Ftf]?y< 34K|۽#~|ϟ)1ʧz<# Vy3~b~>Tk5G3s>#Qh [cJ yހ>`CC8Q>)ڷ>5G'kJ'1{z3~si#9ﮦ8cSF+#; e%z3~x!ѳ+zl@0B35z;Wy?9Xވ`jF$OMc`OwH.TQ&L:oՈg\x:NSo鮉> ==W0huQ 4\x/'7VjhZ:1 *3l.N#i X}@gg!TCWV*LY;R9瓛LV)Q} V?$WG [cT坡֡]cR!s 0&c(0ð9|z{`A4WYe<=`L6C* t|n@A<eQo%ns1%Ko`LuDg JXA`Kx?氞"w/ 0Hco7 cP0v c0` ` 3h`Cώ0f[]`>qG0(j#)-VSR3Y{a0lZh'@Ahq}ˬ);]pOh4XSTf\-pZuE1( )1kvc-~.nH0gA!LȜ0ōH 0pfG6v>Qt4p>e 7%le mS pg=_J.  I< vp|0a=KF)11lQ%5%%0c}04`0Sk+VV:Xc`wy!dԕLc FVr8ߐ`ܮx1bJ@ >Z{9SƸrz->z41Sh6_Z?r͖`'a׀єq+A6/!wC1/CmS2xH&?c1#eJX-dj5;bn~ 0c<;'1M#F{ Q5j` 0F/0;Q0ƨ1|6X`1F= 9_ϮPuycEL~jS.:|:`ȱS=)$f8w`TƌX)1uZC zXQ(0(q1_g 1ӛCK1|MS~zSy>ݱRgtp ߇.0^ \` 0 @&|Bc@c~``Y c>Fg0,)``YMLy>}5Ha9500bL dΌdNtW oIb*FK\OS.r_Z]r7ϧ_[oWA[-Μ `5锭p^#}J\W$|z6'i_~Wu찜zb>54q|)"5ogs;ƃIu@D\["LgNuDj2;^C}d~^y@bJ*PRڈIڗzAc#? vZ>kws}t-8qMI { go~Wdυq*50N`ř-S"snY9g\15|BuےY_m`d>s-ijx *e]L!~"gu|^v>[FzaUgóZ+u3ع]O53|j5"lsgȹ}Sy>Aj)qenm`h>)!LJ5^k9^nxbMTf `42UҠ3h8nLMg{]0Qt޻\ [y4|8mȼ) wb*W5ba S2oSBGh4'WsU1 M7ln5Sxc. | 0 ڗG^4@,`@ H;1 )$$q?;4iIENDB`logisim-2.7.1/doc/ru/img-guide/bundles-create.png0000644000175000017500000001246211541757152021544 0ustar vincentvincentPNG  IHDR asRGB`PLTE qmoE]ist1GAIQ3k M%Z\Z,osvtDC`ˇ/{r梥맥ݙηJ pHYs  tIME2ʆXIDATx흋8 @ѹ# c/oR(b; 0|wLΘ\I yaW&}@UW৑NV[w޳߱Oe|D{))pl^ u jy0x ,y` j=_ί"B@4 ;M rO,'ׯurJQ|_0CJPwf>f6.hKŅksVLtMK7dHQߘNK|(? 4+\0~I-zhET yS}ᑍӲs^SC˟QׇչRQP>ETlwv^r0U `JVf7lޅ0"e/ unmPA]4p|nF:~#x^pB^&䅼0-W#!:?kB^E y|!yy ɳL`uἼ=WʒU剚fgm%8`U?H/Þ_ŷx l}XA\/Ek}_ ,ЎoL˛W}>2dþ23%/Xe//y:T|Phީ4U'`ony9M_h#e#WHVc7̣iB^yf`Z䅼𪺋<iҲ_[&N\=G[-W۪+sPU򢂶pqKtA{lw4 ,Of {|x˔/ohUx!رI 科g ǥF'dF}:/Н~mѻ戧 oWYUbܫո1/+yb^%nn{qfb^=~6!ue ^E^S|  5VQ,^WjE*Wz)J~ݐ*/E0}s`:Oe2j*ײ؃{{a͎z//}ǯ^Łj2xe,=|A /ߟCQtitrUj"j{ذgG4xɽ|9_̘)^iKO,(_YbU1qF!/sR<u^.* t7Vl{yvRC+e<)ʬWb)uh݃\k?39˞B^k2ߋļҏK ?,ͳoްW:٬xG+Z//!B^ y}:`EC3s̼_ȫ//Ml{Uݩ{ dGBNv"z܀Pa7"/*x-~ɃۄG325[hѸa=y0V+X*LՇp|~ȗ~g2hXBu]8楟OtVd#{2FF&^$NW'^q)_BLf%ue-vQ "/ ! e$P3KxF<)/WU"2Xp>jQ!"/5 /7V\|9!_y?>˙KHBB^8~z텰}yesoVfXHv}c\31,V9UBw]t*y}_Ws1"K )"s Aa(^b+37&V(_CWQBE_.&K^3  +^moyV}HPF]jŊߐ5\<86o /?Cȫ|So8忁QB^k4^y>e Ƕy0km{D^}8W\=VK></q-Jy7NH{ 9jrex:Q2 쁼KlDL$uP :J JmG:xi瞭~ޜ 3v(rʴ8uA5z$@ʡQ4JF ȠeFP%(_6A {F5҆2ۄ@@CԇF R!JW/1Zd ҆0jxZ !CڡyEHЏCF0 K z\b=t81ψ{ !/{$B^8 y!/&^迱d /ԇkB^O)^/B^%KK#xey^A3kʀC!;tr#.nF3D(kmO<)C˥~CAJG #?(k*G[~ol;mOC_RJ_'`}RN5C8OdTu'J8ͼ揿W<^RՇ٦YaՇ <^_wPZy_8^~sxZWxE>,9΋ /xS^bBuJP"/55{8>WZ^_ /x/yyRc6q;Ӌ3&_X˜Hg:݄25o% )7)5'=x.|o8L>fWQ^Q1&󼳳>\ /–^^0^o"^s^>d֩C/jMKt5JxY+Uo:^ʩn x30a}dG@^/JW?^/-_9.ۇ;?r=X|\H&GrəSȜe*IENDB`logisim-2.7.1/doc/ru/img-guide/attrlib-pin-attrib.png0000644000175000017500000001571411541757152022362 0ustar vincentvincentPNG  IHDR-1b=sRGB`PLTEqqrk5z!51%eAJRe]*Z\Z-nDCtwvaˇ/{s覦}ݙηT pHYs  tIME16R}IDATx c0 'Tĭ_^ߴP $w*+L4@@$$;0Z>A@\hZ@&%p#ׄ}G ,%-QxKxHTVe={%eI2In86B?҂-8K>3^-Zh?3S T0eɪtd^1ߑMcWv{qq&ߞ"YZ7- !X}eGxt!;-')|3?3&OWJfgM,olD}3[^ 8B~NgΤ9IS-"QPhrb^%TǺ'D|_Dc3VFŤ(u1<=Q~&mv7(OE>;,U>#WI&S`mh Sn(ǹ[NrJ!|A55ѧq]a-הE{?X?Ubhod$7$^_7~)5^DSӎVIn嚴E2-95p^9həekAzu9'g𡚚4|a%뉞:ZĞho}u|&3XWOd9zVv{,x?_>-#~M-k UƆrܝߘ<;j64ODAAFO-NC(ܯ~VZ U Z A\Y4Z26@%Z@d%<|a@ǫ ]/RK_f!:%gzzhI31ʌW=8,P&9^9ry! Ǿf//6$䅎.8]461v N\\y q -넫<+^Ajl*J ZtX iy[2znidZ,#4Tv ͗FR9Es:]7-h{1tThyw'ZkO&'.:Q~j;22-K'ymsUu:ihwr[Jm^eȸD %%(]6nڬ\ق-,tiLTA DCi0Eb8&M4vrJӌQ`3*)!#-귩h[j`jɯMf};(. $;",%h ,?Ջc4Z-B-E[NGG\Rrq ,ņFZ}h N V#{ׅŋ'ۘΗNݕPo,Ѹ^բRabUxMi__`NX4nR%R}|P:uK{B-.E<B4ck)kZųNdPFө(b-U;Bבm JȜ/$,ڪL Yqg.wI˽Ed,zN#ҩ9+l\BZb/pKwTgnZ꺗tvbQ@-\nD&t tkmnj ldzm-ӢabiA5Dw.[A>!p1jz&dFTѿ'2^űr ۄ/w[i^8z-^~l#œ"UZio)E-K]Ɨc1n [|e7"YKt%;z{d=̕De7Y@̇m4CMe "ӝ_CZ*frZ2fVʑr -YmS떌a)X+h7}@ftKFK3vS_Ֆ'df9 ,rŗ3aJBDq1k_m$iJ`&Wb Ra/q~~HOTu"hi %=~Gaw?eLW'Z?'+eR2ʥrhfٱpﴌrkHeeso(얖Mݼe-P/%WZ:F;ZC\mBƥ;-LO_nZ\V˺ixX^9*$2h8,Yd&!Xe.A=5SSNûrB94L*=\ilGh T-e\G씟6nQS8%;{S~/#GCycEby pZ m"pj葖埳E6b9|TGe-Eu;?~9N sE ![s5e;D@[/cZ>mNؔ4k_.;PZ;_zr"iiE(b۪ie:Tk6y59)=k@x[ʴH~.y/U,2h!m\^%p|CǻTQ/gqf.6h,)c-5i:SB|3]dkӃV`IYQ@׺a#iQmzY~U-T]H| &҃K^}{x`46h=AK^,SEnyJGHYR[\'1Z>\I 1Bny>^Œ[h+4F2FДZr;yZ|[T{"QIkA(*hZViL=ѧ C hݗkZZ-y/9qK.-9 1?ݒE;j\53-7-wGZaٳ?.g^x6Urȴˊdg$5AtG#'NsZ gRɀiQm-X킖@>B4"AKs\--婉kϕLБ'z"+/7{ZDOz"5yacѽ|x[vK ™ ˂卩ચe?nI0EtY؞!Rdm+4zxnJwn>b9=BK=.)N;%7-ƳDjUi_M!-sܒU Zg ȃ[חه/ww\ӗ-B->hi/hV.¨O6Ͽ>d+->)̠%ًӢ? 3ʭmIhe"b'B|&-vW.ʾi1RnUZtm+~-RK;*Rt{LD N ƻ%eUĒ4w&R*.Jˀ,hI3c-8 wm-V3.W m*נE=I'VEP$!h읫6O޹|1%8ђGa=rҒEcr]i+t -^%,Diɢ%&3ɀδ#Yn ҕ[=܀`hi%% h ;Z0ZGZB ZhE]+>DžƐ̚.{2Z"rEgW閪cNP [ n1nLw -; pdo(|ǔ8Ғ-E">&ZЂi$E4-ɼd$ʹ=- ~(gE&_>ƒiѭ\Z6GEDa8n)\A[2~G)FЉefZ,iḀwN@t-;n"`-hqeǑ0OuhQ0uM- t%qA%Dv!)IENDB`logisim-2.7.1/doc/ru/img-guide/attrlib-nand-select.png0000644000175000017500000001706411541757152022506 0ustar vincentvincentPNG  IHDR-t^sRGB`PLTE pprj6x1%"7AIRee](Z\Z+oDCuwuȃ)a{v៞~ݙηv pHYs  tIME1<]#ZIDATx흉b0@ꊥEjA&fv(R+ $'A%%hZ@dǴbxa?R/6HW:o,vf?w"؁8qq1)'̷NyVU`KOPZ0ۃWg-䗹|yAQHތåE╕|+AK7; .ڏG3-… GXMzqZ4ו)N\Ա˕dTsX+('b,H ׺skZhY4- hZ@hZh2-A3-b}-ZƄ_3Ap(ieŤ|>h-- 嗿i2=h - ~rA^t$ia"T-{\տA w_-?@iQEZ_Qӫ%Y",6Ld#No&V>Z Kb[%:~Kb--,NA)G$Eqm[ZC6Zk@:B}upZb[-n8*-ibi1`)OZ\["k#WZ#c-ђ갔,-o^w"YER2@G@ d,𚔠WYuirg f76Q4- cHVK1b1r7 uF%EݛFA5N6rsݱA i?g)@+`Q1^9ZrK2nnYzZ4a-ݼ\S,F\KިeZ bt!BK&޲']*L=Pg/#v+bJu[L2Z&iGKEAMt Dr}(WV&߉z-֎FZ:YU8[ʴɰK (ub]# <! N /;57ZE\lJXshqZҢQWE T$@EYV[i> u &i5蛄J%hMK?"J\eەh ,:rW[KѺZEn-Ԡ[%^XLJKVֻDލBF:moY0-&6ZTA M{nMdݒ$z:=ihDA"c-4cr?ctgGnC ˩F)*--DHCW([[x<:ˎ҃gܹG)43-khea\Tʐ}y6CKX cN4^ber -=JWᷴ6Ǵ\C-cnقn0w@Zho9N?\-يxmK%݆2lE\esFObQ=z[L=rgeslE;tacn>>潋*쁖lEcm>GQ%ha@Kx皷bI)3Z"1g},;v,:&g+^..O<.oJFZ@Ԃc9\F X9'ZѲGhZhZexRIZj=/wΥs(zz$ r&t qRL叶,l--KUޒi%^:Lά[Ђz>Yd2-L-s7ZˬkeZ$LRz~̴,ԙqZpϙC%Z~Ka["h0D\`9VQvA`QΑܖ9SsВby. Qдg`aׂn35C LS5_Oױ*MGC򯛖F犴-\`=!~C^],w%BX̾4nnY^EwZyoY,@"{lMfҲܙ€;-\`+ֶ-ނF hXI=썥Ңh ˿lv1&q-tKZ}sʗX-Ji鑗`'^6rnK` /nAhsZ66FT9Rr?f hY%Y?Y.L- Иr!E=k崠UJ%stSr}bm=KBͬSr{?oA s/W䂗GZfkAߞ scnݲTZhZhZhZeY@,de@,w\&@nq:-=˽LK A/ӒLQrT @q Z6HMzc.Z9Z-Qr' Z4d/x%Z$1@K xO5Z/@K D:6t\"YHe[zGeC@leZ0xo--@˾ 2 - Zvc`#NUKd󝏱SRWKϼ\mxtge )=rQFZfj!]th)OwnZlߴi+OwVZ!?Zvc^$+Ow>Zx%BAgZc^S2Z"3'iFąahN LZCL^"֧n,HR=+Z"J#BKi 7[kDҒp_WY(}# 2 M<6in.n(Z0mJK$}K(;$p1TL(e+1-QI<ca Z]a^h-D'-a撄0~ˬ( @X-MfTp䱡0RF/r]oDKo Z[ԭ-2--Ѳsw+2R,P,c#-ti <*e#W@2--/[ª,-;qfO-ox&mm`o6?-;hZj%. i ~JD]5-nS,wK@ -[i1MyF/:bx)@l&TDbfjy-C[p)pi@ AK8-oJZBepZo$ZP Hy⿉i,@@XFelL %XP\- වm"hA-@ D['9胮.g-miv,@ -ږYPey|{dYzDm,X }y)+ޞGvZFJ>݆%?WZyx_\~EoǷ'S wVOq .\mZq$߄5Q8We>Z.O G^T##(ET:_f)DQ1yUBna.o+Xho!Pqo@T-MUKhUhe$N?sicHY cZ@Z`\hZFZWZg Zv3e:ZXH>^Y^B =5-fZ$-m{@6ƶFhYn VJ¾GjV--r㄁wi:S+,*WmWXTLbro^ -x ?҉+3LS><->Vߢ[600ӕO_Z-} Mhq%-9q^WIENDB`logisim-2.7.1/doc/ru/img-guide/attrlib-and-replace.png0000644000175000017500000001473111541757152022462 0ustar vincentvincentPNG  IHDR-&PsRGB`PLTErlqFjr1%'JeAJRK)Z\ZDCtwuä0{s襥~ޙζʹ pHYs  tIME00*IDATx c: =á ŭ_޾i.%*D ėj-i6Q=;`Q=+U7q-qazq4$1w<u^DW+T=hR{&-QټJKr.$h)e8ą1^\t3% 9u𥺚t|e%pYE8VyTET,=[l1ϑ@tmOj 'BPn2vG@|?Py"j&nZ`Zaݠ@!H - @ lǡiy|p$(miOG仾Hܜ^茜i:zВ`LcxU@&2dAKcΧ!9ghGp+=˗lf)-"88qq{SOSc<+{j<fJ~&;[h!%l(i~ى~P?>ea^iʋuݎ&jמhWu-fC8O s+\QD&ZIt^"Ց^=x=jԂ!?+M5~6->Z"f5=>Mא@ Y4o%d˨,M=|feE4Z";~DrSKݘ=H6:L +XEfZij4'..n)skEz-rMK#Z:A¯NpdC%Vvr܇ueGx}lr幵Y"5g&J}Q]wkZh5- hZ@hZiq >Chy_-@˰1|@ H:`iA@hA/dԩfCi:h1qRdk}Q05D+-.N Vb\>WG,.Wxy+-:.fOE;-?D~lnnG®\/ECTm0X(6$6&EVCp)ê=5򭤺MgR}%-9rD "!J(\ CcIKm&-M 2n!gIGWiAZ\e~ ._L 9nAы,Jh9IZl`+a -zXIVh `4rB b\ :7- ,\:A_t@oZFY+tiC~ l(d^l2<- @<JL$uuZZY(R3$hX3T 0 1HUhÌ}ThFKUrbm^{,P-ia!aiY<hY --dgBϏIˑB8ZBK0XˋP[LZ# p@Jh h!wWA`O0gzв8ZJdB Og4IZ-@Vܫ7sYA w_-@i%,EAUizuqLl#D;Fj"lmQ{RRT-x-,[42;A kCWtK.' cL#E-4iyVHh 2Q4OdbNoMZ 7KzFKU q HWGC\4d Z XtrE̠H!YCXbR;OZ\["+/h1~.[} cU=/;bсnG:[D]2P:ԛ}Y+W+:JK̆ȶ_%qtK:u?o`ԋLHyTҐ"-E?(2DeѢ<00t exε)> !cМA1gPuge P:wrZM a.o:?VcȭmYH.!-BKHK3{.Ò箖He{2ni ܮ[, ET[t-/Ѳ`2)-ML4mE_GKūF:oy;-oA6ZLdLfZr-ç-뤥!hZF] w5s uK0,hKH9YFȝG^ ˌk((YN7 NRPfRVcsjnG_fX.~(ߞ)`/??X""M`C3'vGW,i\DO),91-/yMܤrhg!4-1~ R~ '=pZP)`zZz%etW/@{Ȱ8¹/2-KSZ^e4:c @B:60-"ԛ޾(ٯrRZts h;.fq_4nAO*#ww˴pk3}req+0-9%/l@ӤPMq/lV̕2"hIS\Μ>4M*'ri04ZHX5*qM)~e<ݗggERQ."ܖg`&wEvThortђ,Qj;ڒm?CrˀwE !n{Ō,yh,y喰 gIӢBd[c"<-gWK4ȯs[2ltf ֥r~/wDR 9O4E-c⚃hȴ:-W[,UZ%AdsѲ*aov\e5 -g@ˊiX6-Z/Avs5?B'$WLȴTqiyQ|wD-];/n9#Z Dt3eJ5!]G6,=J%AnZbmg8^Kٞ: 3R]X#}p_!-/ͻ5^ yfcҢ)kwr4mr4,*Ág5-K[%1n ^ߧ4 Xg+\E0*-/T;Gf*V^S-ET\DuaeZ JkD||Na-PNZ&ZF+ԺE[ؘ(㚌}LD ea ޴ oPZgZF C-2~ 2-%A힭ve3suɁwl-x-vi ;6Gp{鐱M,oS 淰<)ce3-pn--(ZD[lT•oMvlGy3qvEv7|`kΪ@Kn)^nrX[E'eQ܄u8f7-﫺;'ZSƂ---^=?_o7.wzWڮ[VuwF"ޖڄ)i(Kn7Vє'WF|i-3*Ӆl'Z-|b%~uKo7VTgZiuK~6z^.~W]w,*J}RNr)*'Z-*6PA[:̛3YIhA߬ze^eNh-oEY{҂g'@7-F~K<,t,K?7uQtЬ;Sxb9.-H^4[֣[Dj[I5ZMKdr4hy~s\Zݗ-Bn-\݀ߒL Fݽ\jG},}ђD1]ZAw\Lu[2ʔ-[t5)r-2\>-4ဥ>{;%\YL Dڭ• otP/=F& mGZT-/EpQƉ[+YN. D4ЂW#{)۝m a .~31-%Ӣʩ.n1VeҜKM-EMjHfXݪ\iQTj2hy!/wK#=@7F-Ѣ2m;R"+ucZR0d(74,~3v|thL[n%%݊t][ZjkII*ؠRWaa"rZڬiSiZL{Wq+:RrcܠV7Ѣ T%)tkѹN앙 \h--@ - h\e t"Xn-[thZhuZhc-c"rA-@ -@˒i3/7@ X"-@% f~0跄u%7+9ͯۑ0hJ˵X_J@˫`D牶LK|ALa:7V@ i"(œZz"jl6Z=\kh-}‹X0ݢ}*܈y>~1 ̩9tc q+ū0LqgZ_AYJ.C?&Z^Ӓo BiǦ%IENDB`logisim-2.7.1/doc/ru/img-guide/attrlib-and-narrow.png0000644000175000017500000001660111541757152022355 0ustar vincentvincentPNG  IHDR-&PsRGB`PLTE poqd.y 51%AIRef^+aca-mDCʆ/a{s~ݙζO{ pHYs  tIME/3HyIDATx흍b: ċc9g}&LPD!IL /ᴜA@|hZ@f%I!_)vZђqM$bWK.DxD9)dCei!\JBq[{Rr)):!tSS)猈*%K^"]6-yJ%0H).Ɣ*|n|b+$.X1|J.?zSUT+{H +DZ>vMSg4(.{cIBmNڔIEKrNa8/ahr깝ʇY%֟U\D3D^/Rg3`6nrfuZ%ڞ–bX#D>;;VExOQ&9j.q # @]P3T,q^.U)_,VtS'q"_Zh.|S.s 6Eۣ͙!Jk^nz+1`\"km*L/צ%i)Î*P~ol[vQVzs9 :/XMMi,QUN<VrS>mY"w$3:ٰ#Ü+E~4Mķf/zzWVKhWvLkɻ?yyDLZ:`ZzIAI RRb)Kn1hp5@:- @ Zn.fqBYn"5:;!D_fW-8^uW=:ЪChaL :Uټrn崻҆W3ތ'~Zoo|Y1B>kOQY].=+/8Euyk؟!OKRZL\~wC 2(+p~ qQooth{e;s_ k9RI*zבh\O7-vEٿ+piWvu}]Qd.ZxIRG5U&jGS mym Z]Z"fw(;Ң+JQvb?CQ8M0i'*_l:73kK$@%?x%ZNYPpmQzZ"UQ\u֘. XݴWe_i)sEyK["ږh%@Y|?ڣõ©څ KrȬC#6v{,˳re[F]gNTp_Zu- @ zh#-9 s薭{@-@ 2NZLK-@ p> r/%'Ң=[-Н)-6-G hyZ8颅Â< 5iŦx<L< -I \i]剔e'X~˯X5=h-i$GR4M.R~ *^.',h-@˳Ӣa)?[h]:-W7uަ\mU~GLoMJ. Z,؊hKt<~l--ݴN\vT[U}X&SZ*\>{ߛ[hxӲVٴЈ9*A}t'`to6-i×zEK] nɭ{йMZ>bϢ[h=k-2i1bX4hO  DVG Gơ[mLXw݃]EXǣ~GMځ%G d,xТ@ u-Waa.^}-(- egH5fK=b10 }F5% E65-2K:^co29’!2mE:zY ^ tY"0E*eit-h8ey\AXN,в$.@/-Dk]Z!UzZbCF`1\hbBY*-6h %#| QFOZ{ ,+EBKKx}ړUPoo2 HK GWet!TσTʉFg$-:..BA$,޹s=x 胣]Ad/r BygQ0O Ysg.7 M❗ی֎Xʠu̲Ej YVۧZNZ*,9icm/S-:GuCz!e--epظGYGKTK"eoY1-&.ZB L>Ihͺyr R ˄cDSzOoY/- J#b碥-swDw^ZYw-=e=εeb3rAnZ-k@PZ^f4-ۉ`q@˰}Zc<'-UxHdBhY!- E3;-X[Y= -zz\n݂9&Xe\/BwݣC4E`9GN?N_f^K@fr21i,Q5c2/Ŭ%_R|}=%2_nTD-xbg1h/~˴'5̰DdLCj,/{S9U^.в- DGKGG [Oh-2Ԇ$_--^lZi4&7?в8-}!_X\BвF2!;kt}AhinE =*\ӥB-Cef0xr1bZؠ}5Z1_{p_T;u]-(VC:Zcaܻ[fenyP5#y Xp5KBىwyGbȩ&5hM#`4>cYvLX%k%`kqرzM)rSSt_U\?EK} Hh2q hypQXOcAh9mQLz՝m?qc6g+KTuMKD}3-ve7gqo%n/WZ"#ZqZ'D^ODHY^y,htnx ` ߲Y\?>?+-\'ey/q9*v' :wne}m2-A8=-”?%-F "?t[!GKR #>hZx_X֨[Ջ_? y֨>ZGˀ6}5|i;LNT,!hE^F-˞[Syt%Ј#"chYi9\Y#xiA9h?-p_Ba.7#[tFb7I Uרv> }xZ;M ~& -Eˉ׵jIDQl$]Y5" K凨zǪi!SƝ 1J!Vevh)#e3TXs>\wf­|ehP+WH/s鷴1$O@K#k-"FJ5xh7/wMe:--U~[.;P(Mg{Dd]~KOA^Pu̯ueӮ(ۀ%c~ڦ%ҏRwe^ܓy'?/w^{::5rA~ H8Zf΁nZ6@ -@ RnZ| A(-/ LxfBhi>ZCW'[A@hR=O̓< -:RӂMZFВϣiy6{Oe~Z~\vT[ iIdA띭BZ(# BRk{? Qǭ mqcQfEɗiuK"aZ-Y)-}ٝ6uYaR56ۋSm-/q ZJښ5oo&-N-FX"cD-VLen\-zsmo"ȫi\䨊noj12Fq -Be66<{뗪nir1^naZ桥 Bv/J^BmǶDlGm]jK!|(3iEO\ç,}om/[ou[FHjZ2c=Dj$\tΦ-}"hZ:i =hhqR-@9e*-KȢ %ҙceô}9X.x(}eúhZђhY'-rpcisk~gQ˵ZEe=X0R h\Ƙblj9V'Ʋ$ƸڲD>6DW|'Rw HqK ,A }LbD99zn}s,9U5Rqsr'-YYTY?05֙y=bD;>V#6zPWt7(wU.v~|R$?.@KHEB!|9zĦEKLqsh99.89ŝk{qm"Gϕ _貫["V"DͤOH_ǏK @\\؃p]蹒hMKrLf؄[SK|-/Ewo\ ܽqZBr\M""q{S/E(\@,;ymnyG?<@s2y91 Jqƴ;kZ<)IcoZ`\/RQ#!9S.7-0r-^-FC uWr <1f-GK1$GD"cږhsW`:\cy“jy+g ;|⦗;}9IK3Iq=hnWk䨨)+3鬽=F- %2=׼/ΫTUR.\&fZټѹDhMT/̫n&*]-8MWeK$t%-Ρvlɑgy{[y“Wren=!tg6RsWC vRws:?}"eݖHwHKѢ;, x022s+6,QHZҒ Of[92 ZZ"FK Jyh,"3\Ä=hI15rVG b2]e)d<;rnEZJk6Zd4lQcVZbe'[έQؙ,rqbAj,%b0V[ŶSx1#[.:w/.bht ;rOP.-=rV/8CviJ|sU/jB/̢u&þhc`lտ{IڰWZd^JE]_~s[ Vҋi9/N͐/rӓڝ}*t))RI"Tޞ}&)5'þmSgR^sJUiC qA~-/l2-JY+,'yU69ȾB7."x=tooч)V ڜj{ɿI(YY&*-:fVRIdoqOK7ExSU+p/UUWoV-92lڬgN^ <[$n3b6weHP[em{Wa'C1{AKQYK;ǤCZ^Noz?bjl8wANDZwE9*_Ҥ띱V2kW\˫/ViNf-eN&IDmN^()A/"JӺװZ4n]cvUW \ o6 iiڢNEUǞDn$ /H{i߭n!Իr\O[{l~ߑb:lz\UUrs^!wexK`/dHZ2{=G7 3FeWg7M;r- ,O~'u3) Jly+"94Ɏ~&/ ؓ>bg5YsD=|fz-2y%tk*S?tӋ}c›RJqIJHF\MJZ3?ͦ[{|~oӹMf`pr'߆AVY"C'_Ε,R AҶR*.P-)˔4ͩɎrΦQ:gcw(2z=ٝ N`m󏅮.k neq[r+3x {m2/1:wuQkw*K[/>c=zDN`XOnDs\WjvV&ϱWhWS40KʘvO7CXqcmsN`p5&F'{;θ"o~b&XpH"&|YZU e)!/k]fo2ڳ/3[C[+?VmK5 zUfLvB;ntz:Gv|}Obi{F9>&r+0<jR\.Rg(6ٲ\X+>Ʈ;߭W+o7rw#7'Ħ;ZvKN SwH]Ro3>gmɆзYf;`ffRIꂪc?݈f>{c[jk:Ų׳O7L'1hv{7dE?̬t&}>̽=i%.&_"&|Za9"{8,tsj{=1ͤi./YSzaonZCfSJcSm4ĝdnnZ6V?>k<'9u=`{W?y6}썑tZ!goPM=ZW|tjK|ԉ=&^ڼy_s{cIzXϱM-I{{[#}=$Ftjr6odo9۽-kAjvEf6]ok^@ }ٻ/2O i>;d96/%"bFkk[@2f_9/aJJ<>>l4l3}>TZD[Xfx}.ΡÉ}|{ p*`n_?=``{hUiXx"k^a'}^|xvfcbv'kGaź kI{{H؏~1[8lS#{``{ؗ{} }r+}ZzW<s﹮Ga_2}bR/5#K.{b[ sgyvyIwW<ZWkc~>~,{Q} ޾`19ƾl̿r7=!{̾l}:1;`o{:{~7H`o.c7/קA%B& p}7ˁ%61ؓm ߏ =igWs{?֚[==?;q)쳧y!b~,yQ(!|$4YKesD^<ܨk1/ gR5CC^=!?5)<<䗶Ǟva_jR ZV6ɷ%v_ {&yC,8`|k7f,v_tX7ٽЧ DaUW9}ex=tܧL2)[7eӣ80"Onތ4)^45[r'_|N#v욱Cek92Vױf.,؃_|Kyȯ=?!cn楁=؃=؃=؃3"V}0{ ````?:M `_'[-؏YɆiFɆWW|rûLNfseo}DulmJQIQ*! e4=r Ԧ%bY)YU)e˰\I?XLu71emEU3Nޤy e_BR /{Yko"g94u9 [_1[7q87w *Qvc?<.cȣ88k}콪çVFCv򰾗^{+]^ S]ք9`xV9"#````{؃=O>~ ~'1>N{{fXRSG9>g$"`!اu ɿ)w.0b})Z0“#xhC{=C!`c?-HD)%wϳ}+E ]Yw w9Gf3y{~؏ƞ:[^@,LYg_h.޿m[OyN۴cgy%-BħъwOWeɆQgnE^޿yOצ9tci'Nyn}2S3Pi0y^fe ;7ك>>gkC\Y$6`X듣Z焱6#3䐏nuKb*  wy9˲؃=`ggZ<{#AF8d?ĥ`k[IENDB`logisim-2.7.1/doc/ru/img-guide/analyze-min.png0000644000175000017500000001152411541757152021071 0ustar vincentvincentPNG  IHDRdsRGB`PLTEsje\nqU6:QBMYLXYVpsxvrwv{VޜϘNuuƊ١޻ *(W pHYs  tIME *X zIDATx ,r|m-_DӲ:j5 ^@2T4-dJ0x VJF(/?JY m mlm-8%O ySYKYAqRjavpe"~bBeӰ6J|/IZXl X%grt୔y6%wԶz\Yz:$TIbDgM )Y=CSL[1־BhcWaUmNܲ\V&VRs$aBH TqNZ$n+]c6sq7  ``yj163t!j 1g0;7}5Wu ņ>U܁ sFWUh%:c@mm:8nU}QXk'jt]mZyaFm܇bL.ZQbe( r7lUW2 ?y|$UqaV[xi[R2>4wnw{bS(O»ҺvڗؤBRvN_EO^qnhl9SBR>VuE:v@~[rIU-@O$ȪFQOY/m"vi>٤v!||ْ]vRGE^ǪUQ?]ܥrwGϐ[ 1=Z?RCJ  PA #2U *Eg`dwq׏A**O}\\vrP`W*UzK``````pA{EfwRK!zZ=z4Ŏ74uY2{E_fNe $<@EQU$#n3)<> ^HnWiZJߦ~Oї|z@[X1GD:6~)<4w2XkU*g{Y% { UhK1t"NsHǨ,er6u82c7P]$`D@J `@FJV|dMy J_kdʐULOը\"S%VU&` GpqpppX?拴BSyxv׵uə1X'9:m+T-G=5c -wUĀNcg@}X]S8|~³ X.ME;6 U*hYgCtzځ}ʟ+ ȋ19h͈2o0W6ȤU;r;,6lxVYsSUk*Tm /ڲâ1('bѶOԴ ӷ #ΎA8uDž#\z6*p d0˹X%d\au!É&[Zs1d 9p{0YL`b*iĴP\9zU2S;qy-og4T001s_0Mb.S0jgw0Q$f *uu^PwphԾ^ ,#=M)hFTȽQœڤߩ1~ɓ$B  0{U͸ޫ30E䢮@@1/^˼b-{1x}1>On`f/Ze_M/2 Q d7]jlU wsgȕs.f9Lʀ\U9H0Y&`06OfpWDY33xo0@ `0 U1 4jNÛ޻S ^q1e944Bf|Yp,R4ԾscD0|0Gh;Zڡ^.87^ͼ3s*fڂF ܍45V)Ciu̯qvfJD<7L8(?x7۽[ طH (S~ƊnN ;^D̂ xA e~\Ukv`e`OcrNÈǽ3fsة̄ep;Z觃!kfnd[~jziO"b]hOVmv/ ) 5iREЩkJM}XVk}Fiq sDia}-h7\-N8F{ʄ0w ` e ix9М<3} `0Jԗ!̂AOC ̞;   }Ap[OEg |m`<A4hυ`4Ap`}'YFyQ wv4 Eܫ@ `0]-qm,q=n'=kyV]s1Nx;evWl{c;T0000xs{pnk 8tAp{``` [+3[ LoC`t0xɅ8q%>f0qJr!N\nOݟ=NJɅ8q%z;1&禗pn:5GkiUŽ 000^'@L̠ߋ`"0AL_YVO# z0|Q8[(1XA.m; ^AK f:80ڟ;̃?0xAX*:h__d:t\߻bs `0@ `0 `0' 3O- (Rh4Cla`Pi)9^Ô*E0aڻE+A{ǔ]RD<(i(c+U?Šؽɠ *"0)B q ^00xsbJ-L) D'Y6AJlt \J:2>tET:UEqBJi.s[){EY$mSpFkcRTهڄ'/N}]{:?PCVSjwgjZ+yU׵lu^:@#蝁k99^qZ[+1Go^D=BAXNWòj:pqbSԖ.,M/U~a\q #1\|ў2ogokc&mo6Ur8ڻEi0Q&tz\"9:ub r8px'F9 ꋛ$W1xGΓwe T I2.bw|nB0bF0*H1> &!`" 'tosG WMt.R4@&0 `0Z6g@g8dp0a 0г &dИ 2C:W=+2̼>-zGdtЅ<#|oɠy4[-NEh^~7?c2ɶJѷJLoDs0xAt!YOE]/Rއ|$Q=} ]k}r5/7 F{)&I7U̟% F, ex c[ `0` ScP`& VIyrY/O)IENDB`logisim-2.7.1/doc/ru/img-guide/analyze-expr.png0000644000175000017500000001130411541757152021260 0ustar vincentvincentPNG  IHDR׭sRGB`PLTEmhk=dgqr%h*=@JV?WXVnb;Hlkqur<{Ћ/a—pdžӬCbKGDH pHYs  tIME 82}uIDATx {VWvhy2 *H!;3@V"uqB0 `t,|Erh9vQp~)/\6ɢ;iIE*e9#=<\ s`*9T*`-r!eA+-Eڴ2S.fW.Rk rR^PIM^ K'$}Q"hI`U3ѱY2դMB'E.F5/[W;8ay% M LuY ˆ|> IC莦XUdyqXbTQěPјD1J ҅EaЅ T]뾞(4)҃MuU%V2A.ˆ(Å!bTC?<_F<1IT,mItД"Gh-dΗny%.DQf`*E4Ʃg%\WEetX֙F*`;]_zF;מ)*U8YӁS &p&fw?T,-eF^zA_/cza)5aBja B)U(8E`0)ahbΡm/-4RYȘjD7t1}۬䡎.WuCHmC:'2[TyB'x-)" /ڝM; haÊͻPMڏ.QNxkSDž§y |` Ta=,0 a4!~a'h>]Ǜ*jExWB,˻.Ya$fߍU⎪Y2Խݶb5^:}Ax+L+@>eFh>emt]u Z4?)z23;{NI ^&VP(>T)O%rwԽʏ7Ty+ rݣ)UCCUt ),,eʙY [.9oMʳJBTeXTLھ%۳z˜% rRíǷe9:t!cVf&iMev ][l?#T%u+(8CŽ<1 gÔvKX(N*UxT/iLaHOb8SúLWY[Ϩ~Mb0{|rd8ՠ*w0e*ѾJ΂*J^\ $•fB)")'81) >:^\ SfwM6l)gѴy}76vUy(U䊋QhC`deF\S8 SS>Tս63n7gݶnj2+4gʥ,r T@nav S 0w;`̑vl2qצ >;dEw0Jgdžvi5>ڪ7%yTSa$\"Bq17m=mMa6Š 몪H ;jKpT.Zm5KooaO4-*#!kK^qGq(6Vh F *qc'ڱ_q/H+ۥp|.Pפȑ\5"o)'V+YH y[>Mm{4+A4[.ﴊ͖G2Utu;uE\NRa*- ɬMNa*6wBݞgN#bI^*s C3(C87u0EH6S+wpfKҤhk]ox4H8tuMo0Gi]ء6:g(*L 1)E$2+J 3-Sm)ͤN#< E}AE_E`hWV50vj{C͝3hb”z"*QC` C}UCGqw%Y]mcaJsO.Ԉ+0];nP_F<q"=6{۬䁋nm+U9`$Q>T~')jTHJ2#0֠ii|QG cTloN݁rQxkP }]D͛S`D0䅤}UFRkk`{SN Uo[1@7ݑY޻xdqPXQ{\썗`D#`qg /+ȬWg={K/zrQK=A&:},gZӳP}ӮLZWfeKMub{0"0&gaaz+UHn«:mӴ^h|SH|d. z|>9iM6N'J7P6 Z4qi}NW”.k\濞Vך8[>h*2ئ;=K SZ4q։C[$qj^U'}juʮM O0 ``````0 Ǎϫ X``@c0|tXqEr cGA0`kSy'!< 000ykM/%wU}RR*ga+L-]c:ؽ,ђv& k00?^.I"!LӴr{l/]8$-otS@icɇ}W QZo V5ahpb3Zd}XSRBDzoCVSP0b+2ۤ٭ar -SF`U |v1L -TD)猙eJo V0~2lyj9r5V?B~Q)F Sy+[kN`ȴgDs>LHq5} 2B~IK^nsh3𥳐sD?LabRV"2`)&9cX[5ZLDJ4-7]\ STDL5)[Y Sr-7e2&'p[=cѓ>&oc hiO>3$>EJ}W_3! iCصrMbwS0!Z>nH'UȰ  `@0  `@0  ````@0  `0000  `0As0 `< \$ `3""g$L~0UT&p`*3WMQyuʹj[ȫ$290oӁ"j\ `@0 ??,erW7?XJ2r= 0``;h<Ѯky X "r%E>4Y(ud>mrG_Ho[-r?j#N8li%{6MDRm#$p&ۋ;-r1tO;;ekA:Hl2EaE@(wSТTSz4OFp X>L caj0%g/eYMv&p SN8jX 2)3p90c`>. 7$\ܪ  `@0 À<], 0ÇC#x#&ucIENDB`logisim-2.7.1/doc/ru/img-guide/analyze-build.png0000644000175000017500000000700711541757152021406 0ustar vincentvincentPNG  IHDRrsRGB`PLTEmlns)7 y:6AJS^ZAA!#$i.6I"X\?UmbȆd[ݫ1;@k^iul/t8rmieHg2Q{/+~z].$-ͥG+5!vY")).LeI22FԴnmbOGmav+moT'{ŧJ_!8yCHˌ2fdY?.!M0ͨyJJ^OѮM| H1jzq1U)yk8e.Þx7r>(+rRk1+BnEof| @DB7z~q|ßY5Zq枻iITCjZ]z u"ya$?B(?Fܻ*sOmd|}kHC|3rs9l iH@bǾ@Nq8DDM4K!ʘI+CB =$^HkEswH}'We^,WwIHwEځc>Kh;L.Ԏy1[j1Wf6ȍn۹(Tü:mۃz.%H]W}H w)޴˽4>Q4=mO+SU[Ri6uyL;h6c_D})jj=$XHScI%iГ%}ꆴqAC:iU"̿zfU]}JrYCzWӺRۅn L/Aڑ6XSP|i[inujwiYjled.&]] JGiHϛX-ҭm:I /W{t/n[7so> ,ZE\kVHڽV;#[AFf eUyW7O ^e%hD]!LnnIv>]ֵ+=yg}rqwYzh/] W<~ i<#t B]z5{tZ}פ垷Hka6 tY颷귑ҹA o~nHB!fHrjvxn..@􁋗<8w~ 6F*# Qp~sFҝe".I@ʓbA맡EZ>fn1{Z }Zo~bH҃ L'}ӣ_FCOQ{vtdZz,:F5&¢В$#&Y&)a4:5TA-jkRv x0Ӛ-<<<}V )ɰLV)NG:K4ئB^D͢E ,˺>ͬ DVj5$UNd!ݗV }S\ iH@04 a i4 a {Xg}HwaN茠t`Q֠g@;8-QĺEHwaN@ m33²npȁ.Hw52H44HwKGMK-we,闓>ZΊg<. jҌ8+H3E:_Oz-W & .һH˹/yLxt /'͗gv$㽘MHsWNAʥ4L35#-"4iL9sȑy iDMmi^ҥSMAgܜ(*GX{$|L49kɫ^{U t8/5i}ӊЮ D>I/}PEJ MiǶ|$eQ\!ϡ{mn>B5nK%2 IH`f?5O}*-bGZ_G U@=G\2C 4!Zis@x>3Vz}I2}Z{#4[vz\7C~FaQ #o$@Hw22HwEFp8~ ݉ubW^WU-I//'/`4H@04դa㶆4lғ"&`&bDc-eBIENDB`logisim-2.7.1/doc/ru/html/0000755000175000017500000000000011541757146015234 5ustar vincentvincentlogisim-2.7.1/doc/ru/html/libs/0000755000175000017500000000000011541757150016160 5ustar vincentvincentlogisim-2.7.1/doc/ru/html/libs/wiring/0000755000175000017500000000000011541757152017461 5ustar vincentvincentlogisim-2.7.1/doc/ru/html/libs/wiring/tunnel.html0000644000175000017500000001077111541757152021662 0ustar vincentvincent Тоннель

Тоннель

Библиотека: Проводка
Введён в: 2.5.0 (в библиотеке Базовые, перемещён в библиотеку Проводка в 2.7.0)
Внешний вид:

Поведение

Тоннель действует как провод в том смысле, что он соединяет точки вместе, но в отличие от провода соединение не отрисовывается явно. Это полезно, когда нужно подключить точки, расположенные далеко друг от друга в схеме, а сеть проводов сделала бы схему более уродливой. Иллюстрация ниже показывает, как это работает.

Здесь все три тоннеля имеют одинаковую метку a, поэтому три точки, к которым подключены тоннели, соединены между собой. (Если бы один из тоннелей был помечен как-то иначе, например b, то он был бы частью другой совокупности тоннелей.) Управляемый буфер наверху выдаёт плавающее значение, поскольку на его нижнем входе 0. Обычно это заставляет провод, выходящий из управляемого буфера, быть синим; но здесь он тёмно-зелёный, потому что плавающее значение на выходе совмещается через тоннель с 0 от контакта внизу. Если значение на управляющем входе буфера изменится на 1, то управляемый буфер выдаст 1 в тоннель, которая совместится с 0 от контакта внизу, и это в результате даст значение ошибки; тогда мы увидим красные провода, идущие от всех тоннелей.

Контакты

Тоннель имеет только один контакт, разрядность которого соответствует атрибуту Биты данных тоннеля. Этот контакт не является ни входом ни выходом - соответствующие тоннели просто прозрачно соединены.

Атрибуты

Когда компонент выбран, или уже добавлен, комбинации от Alt-0 до Alt-9 меняют его атрибут Биты данных, а клавиши со стрелками меняют его атрибут Направление.

Направление
Направление, на которое указывает тоннель.
Биты данных
Количество битов тоннеля.
Метка
Текст внутри метки, привязанной к тоннелю. Этот тоннель соединён со всеми остальными тоннелями с точно такой же меткой.
Шрифт метки
Шрифт, которым отрисовывается метка.

Поведение Инструмента Нажатие

Нет.

Поведение Инструмента Текст

Позволяет редактировать привязанную к тоннелю метку.

logisim-2.7.1/doc/ru/html/libs/wiring/transmis.html0000644000175000017500000001663711541757152022224 0ustar vincentvincent Передаточный вентиль

Передаточный вентиль

Библиотека: Проводка
Введён в: 2.7.0
Внешний вид:

Поведение

У передаточного вентиля три входа, называемые исток, n-затвор, и p-затвор; и один выход, называемый сток. На схемах вход исток и выход сток изображаются соединёнными двумя пластинами; Logisim отрисовывает стрелку, указывающую направление потока от входа к выходу. Два входа затвор изображены как линии, соединённые с пластинами, параллельными каждой из пластин, соединяющих исток со стоком. У линии входа p-затвор есть кружок, а у линии входа n-затвор его нет.

p-затвор
исток сток
n-затвор

Передаточный вентиль - это просто комбинация двух комплементарных транзисторов. Фактически, то же поведение может быть достигнуто в Logisim с помощью всего одного транзистора. Однако конструкторы иногда предпочитают использовать сочетающиеся пары транзисторов из-за относящихся к электротехнике вопросов, связанных с напряжением утечки, что является более сложным явлением, чем те, что Logisim пытается моделировать.

Ожидается, что значения на n-затворе и p-затворе противоположны друг другу. Если на p-затворе 0, а на n-затворе 1, то значение с истока передаётся на сток. Если на p-затворе 1, а на n-затворе 0, то соединение разрывается, и значение на стоке остаётся плавающим. Во всех остальных случаях на стоке значение ошибки — если только на истоке не плавающее значение, в таком случае - на стоке тоже плавающее значение. Это поведение обобщено следующей таблицей.

p-затворn-затворсток
00X*
01исток
10Z
11X*
X/ZлюбоеX*
любоеX/ZX*

* Если на истоке Z, то на стоке Z; в противном случае на стоке X.

Если значение атрибута Биты данных больше единицы, то каждый вход затвор остаётся однобитным, но значения с затворов применяются одновременно к каждому биту входа исток.

Контакты (предполагается, что компонент направлен на восток, положение затвора - сверху/справа)

Западный край (вход, разрядность соответствует атрибуту Биты данных)
Вход исток компонента, значение с которого будет передано на выход, если это инициировано входами p-затвор и n-затвор.
Северный край (вход, разрядность равна 1)
Вход p-затвор компонента.
Южный край (вход, разрядность равна 1)
Вход n-затвор компонента.
Восточный край (выход, разрядность соответствует атрибуту Биты данных)
Выход компонента, значение на котором будет совпадать со значением на входе исток, если на p-затворе 0 и на n-затворе 1, или будет плавающим, если на p-затворе 1 и на n-затворе 0. При всех других значениях на p-затворе и n-затворе, на выходе будет значение ошибки.

Атрибуты

Когда компонент выбран, или уже добавлен, комбинации от Alt-0 до Alt-9 меняют его атрибут Биты данных, а клавиши со стрелками меняют его атрибут Направление.

Направление
Направление компонента (его выхода относительно его входа).
Положение затвора
Положение входа затвор.
Биты данных
Разрядность входов и выходов компонента.

Поведение Инструмента Нажатие

Нет.

Поведение Инструмента Текст

Нет.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/wiring/transist.html0000644000175000017500000002263111541757150022220 0ustar vincentvincent Транзистор

Транзистор

Библиотека: Проводка
Введён в: 2.7.0
Внешний вид:

Поведение

Транзистор имеет два входа, называемые затвор и исток, и выход, называемый сток. На схемах вход исток и выход сток изображаются соединёнными пластиной; Logisim отрисовывает стрелку, указывающую направление потока от входа к выходу. Вход затвор изображён соединённым с пластиной, параллельной пластине, соединяющей исток со стоком. Logisim поддерживает два типа транзисторов с немного различными поведениями, описанными ниже; транзистор p-типа обозначен кружком, соединяющим вход затвор с его пластиной, а транзистор n-типа не имеет такого кружка.

В зависимости от значения, поступающего на затвор, значение с истока может быть передано на сток; или соединения с истоком может не быть, тогда значение на стоке остаётся плавающим. Решение о передаче или разъединении зависит от типа транзистора: транзистор p-типа (обозначенный кружком на линии затвора) передаёт значение, когда на затворе 0, а транзистор n-типа (без кружка) передаёт значение, когда на затворе 1. Это поведение обобщено следующими таблицами.

p-тип
затвор
01X/Z
0 0ZX
исток1 1ZX
Z ZZZ
X XZX
   
n-тип
затвор
01X/Z
0 Z0X
исток1 Z1X
Z ZZZ
X ZXX

Или в краткой форме:

p-тип
затворсток
0исток
1Z
X/ZX*
   
n-тип
затворсток
0Z
1исток
X/ZX*

* Если на истоке Z, то на стоке Z; в противном случае на стоке X.

Если значение атрибута Биты данных больше единицы, то вход затвор остаётся однобитным, но значение на нём применяется одновременно к каждому биту входа исток.

Транзистор n-типа ведёт себя очень похоже на Управляемый буфер. Основная разница в том, что транзистор предназначен для проектирования более элементарных схем.

Контакты (предполагается, что компонент направлен на восток, положение затвора - сверху/справа)

Западный край (вход, разрядность соответствует атрибуту Биты данных)
Вход исток компонента, значение с которого будет передано на выход, если это инициировано входом затвор.
Северный край (вход, разрядность равна 1)
Вход затвор компонента. Для транзисторов p-типа транзистор будет передавать значение, если значение на затворе - 0; для транзисторов n-типа это будет происходить, если на затворе 1.
Восточный край (выход, разрядность соответствует атрибуту Биты данных)
Выход компонента, значение на котором будет совпадать со значением на входе исток, если это определено входом затвор, или будет плавающим, если на входе затвор соответствующее значение. Если на затворе плавающее значение, или значение ошибки, то на выходе будет значение ошибки.

Атрибуты

Когда компонент выбран, или уже добавлен, комбинации от Alt-0 до Alt-9 меняют его атрибут Биты данных, а клавиши со стрелками меняют его атрибут Направление.

Тип
Определяет тип транзистора: p-тип или n-тип.
Направление
Направление компонента (его выхода относительно его входа).
Положение затвора
Положение входа затвор.
Биты данных
Разрядность входов и выходов компонента.

Поведение Инструмента Нажатие

Нет.

Поведение Инструмента Текст

Нет.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/wiring/splitter.html0000644000175000017500000002125511541757150022220 0ustar vincentvincent Разветвитель

Разветвитель

Библиотека: Проводка
Введён в: 2.0 Beta 1 (в библиотеке Базовые, перемещён в библиотеку Проводка в 2.7.0)
Внешний вид:

Поведение

Разветвитель задаёт соответствие между многобитным значением и несколькими отдельными подмножествами из этих битов. Несмотря на свое название, он может или разделить многобитное значение на составные части, или объединить отдельные части в многобитное значение - или даже может сделать и то и другое сразу. Более полное описание разветвителя можно найти в разделе "Разветвители" Руководства пользователя.

Logisim рассматривает разветвители особым образом при передаче значений по схеме: в то время как для всех остальных компонентов вычисляется задержка в целях моделирования их поведения, через разветвитель (а также провода) значения передаются мгновенно.

Примечание: Термин разветвитель не является стандартным термином; он является уникальным для Logisim, насколько я знаю. Мне неизвестен какой-либо стандартный термин для такого понятия; единственное словосочетание, которое я слышал, это делитель шины, но этот термин является излишне резким на мой взгляд.

Контакты

Чтобы отличать разные точки подключения разветвителя, мы будем называть одиночную точку подключения с одной из его сторон объединённым концом, а множественные точки подключения на другой стороне - разделёнными концами.

Объединённый конец (вход/выход, разрядность соответствует атрибуту Разрядность входа)
Содержит значения всех битов, проходящих через разветвитель.
Разделённые концы (вход/выход, разрядность вычисляется на основе атрибутов Бит x)
Число разделённых концов указано в атрибуте Веерный выход, и каждый разделённый конец имеет номер от нуля до значения атрибута Веерный выход не включительно. Для каждого разделённого конца атрибуты Бит x содержат номера битов, проходящих через данный разделённый конец; порядок этих битов тот же, что и в объединённом конце.

Атрибуты

Когда компонент выбран, или уже добавлен, клавиши от 0 до 9 меняют его атрибут Веерный выход, комбинации от Alt-0 до Alt-9 меняют оба атрибута - Веерный выход и Разрядность входа, а клавиши со стрелками меняют его атрибут Направление.

Направление

Расположение разделённых концов относительно объединённого конца.

Веерный выход

Количество разделённых концов.

Разрядность входа

Разрядность объединённого конца.

Внешний вид

Позволяет изображать разветвитель на схеме разными способами. Вариант Леворукий (по умолчанию) отрисовывает стержень, уходящий налево от объединённого конца, с маркированными линиями, идущими от стержня к каждому разъединённому концу. Вариант Праворукий - то же самое, за исключением того, что стержень уходит направо (если вы смотрите в направлении, соответствующем атрибуту Направление). Вариант По центру центрирует стержень так, что он примерно одинаково уходит направо и налево. Вариант Устаревший отрисовывает диагональные линии к каждому разъединённому концу, без меток; этот вариант в основном для совместимости с версиями, более старыми, чем 2.7.0, когда это был единственный вариант внешнего вида разветвителя.

Бит x

Номер разделённого конца, которому соответствует бит x объединённого конца. Разделённые концы нумерованы начиная с 0 наверху (для разветвителя, направленного на восток или запад) или с 0 слева/на западе (для разветвителя, направленного на север или юг). Бит может быть задан не соответствующим ни одному из разделённых концов. Нет способа задать для бита соответствие нескольким разделённым концам.

Иногда вы можете избежать настройки каждого отдельного атрибута "Бит x", вызвав для разветвителя всплывающее меню (обычно с помощью щелчка правой кнопки мыши или щелчка левой кнопкой с зажатой клавишей Control). Всплывающее меню включает в себя варианты "Расставить по возрастанию" и "Расставить по убыванию". Вариант "Расставить по возрастанию" расставляет биты так, что каждый разъединённый конец принимает одинаковое количество битов, начиная с конца 0. (Если количество разъединённых концов не делит количество битов нацело, то биты распределяются как можно более равномерно). "Расставить по убыванию" делает то же самое, но начинает с конца с наибольшим номером.

Поведение Инструмента Нажатие

Нет.

Поведение Инструмента Текст

Нет.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/wiring/pull.html0000644000175000017500000000624011541757150021323 0ustar vincentvincent Согласующий резистор

Согласующий резистор

Библиотека: Проводка
Введён в: 2.5.0 (в библиотеке Базовые, перемещён в библиотеку Проводка в 2.7.0)
Внешний вид:
Фигурные:
Прямоугольные:

Поведение

Когда подключен к точке, этот компонент имеет воздействие только когда значение в этой точке - плавающее (Z). В этом случае резистор меняет значение на проводе, к которому он подключен, на значение, указанное в его атрибуте Направление согласования.

Если он подключен к многобитному значению, то каждый плавающий бит в этом значении будет изменён в указанном направлении, а не плавающие биты будут оставлены без изменений.

Контакты

Резистор имеет всего один контакт, являющийся выходом, и имеющий разрядность, определяемую компонентом, к которому он подключен.

Атрибуты

Когда компонент выбран, или уже добавлен, клавиши со стрелками меняют его атрибут Направление.

Направление
Направление, в котором расположен контакт относительно центра компонента.
Направление согласования
Определяет значение, на которое будет изменяться плавающее значение. Оно может быть 0, 1, или значением ошибки.

Поведение Инструмента Нажатие

Нет.

Поведение Инструмента Текст

Нет.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/wiring/probe.html0000644000175000017500000000731711541757150021464 0ustar vincentvincent Датчик

Датчик

Библиотека: Проводка
Введён в: 2.0.3 (в библиотеке Базовые, перемещён в библиотеку Проводка в 2.7.0)
Внешний вид:

Поведение

Датчик - элемент, который просто отображает значение в данной точке схемы. Он сам по себе не взаимодействуют с другими компонентами.

Во многих отношениях датчик дублирует функциональность, присущую компоненту Контакт, настроенному как выход. Основная разница в том, что если схема используется в качестве подсхемы, то выходной контакт будет частью этого интерфейса, тогда как датчик не будет. Кроме того, они отличаются тем, что датчик не имеет атрибута Биты данных: разрядность определяется из значения, поступающего на вход компонента. Графически они похожи, но немного отличаются границами: контакт имеет толстую, чёрную границу, в то время как датчик - тонкую, серую границу.

Контакты

Компонент датчик имеет только один контакт, который является входом для датчика. Разрядность этого контакта адаптивна: датчик приспособится ко входу любой разрядности.

Атрибуты

Когда компонент выбран, или уже добавлен, клавиши со стрелками меняют его атрибут Направление.

Направление
Сторона компонента, где должен быть его входной контакт.
Метка
Текст внутри метки, привязанной к компоненту.
Направление метки
Расположение метки относительно компонента.
Шрифт метки
Шрифт, которым отрисовывается метка.
Основание
Основание (например, двоичное, десятичное или шестнадцатеричное), по которому отображается значение.

Поведение Инструмента Нажатие

Нет.

Поведение Инструмента Текст

Позволяет редактировать привязанную к компоненту метку.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/wiring/pin.html0000644000175000017500000002042211541757150021133 0ustar vincentvincent Контакт

Контакт

Библиотека: Проводка
Введён в: 2.0 Beta 1 (в библиотеке Базовые, перемещён в библиотеку Проводка в 2.7.0)
Внешний вид:

Поведение

Контакт - это выход или вход схемы, в зависимости от значения атрибута Выход? . При отрисовке контакта Logisim представляет выходные контакты как кружки или скруглённые прямоугольники, а входные контакты как квадраты или прямоугольники. В обоих случаях отдельные биты значения, которое оправляется или принимается, отображаются внутри данного компонента (кроме Вида для печати, когда компонент говорит только какова разрядность контакта).

Контакт - удобный компонент для взаимодействия со схемой, и начинающим пользователям Logisim не нужно использовать их каким-либо другим образом. Но пользователь, строящий схему с использованием нескольких подсхем (как описано в разделе "Подсхемы" Руководства пользователя ) будет использовать контакты также чтобы определить интерфейс между схемой и подсхемой. В частности, компоненты Контакт чертежа схемы определяют контакты, которые отображаются на компоненте Подсхема, когда чертёж используется внутри другой схемы. В такой схеме значения, переданные и принятые в этих точках компонента Подсхема, связаны с контактами внутри чертежа подсхемы.

Контакты

Компонент Контакт имеет только один контакт, который будет входом для компонента, если компонент является выходным контактом, и будет выходом для компонента, если компонент является входным контактом. В обоих случаях его разрядность соответствует атрибуту Биты данных, а его положение определено атрибутом Направление.

Атрибуты

Когда компонент выбран, или уже добавлен, комбинации от Alt-0 до Alt-9 меняют его атрибут Биты данных, клавиши со стрелками меняют его атрибут Направление, а клавиши со стрелками при зажатой Alt меняют его атрибут Направление метки.

Направление
Сторона компонента, где должен быть его входной/выходной контакт.
Выход?
Определяет, будет компонент выходным контактом или входным. (Заметьте, что если компонент Контакт - входной контакт, то контакт, который выступает в качестве интерфейса в схеме, будет выходом, и наоборот.)
Биты данных
Количество битов значения, с которым имеет дело контакт.
Три состояния?
Для входного контакта этот атрибут определяет, может ли пользователь заставить контакт подать на выход неопределённые (например плавающие) значения. Этот атрибут имеет дело только с интерфейсом пользователя; он никак не влияет на поведение контакта, когда чертёж схемы использован как подсхема. Для выходного контакта атрибут не влияет ни на что.
Обращение с плавающими
Для входного контакта атрибут определяет, каким образом следует рассматривать плавающие значения, когда они приняты на входе, возможно с использованием чертежа как подсхемы. При значении "Не менять" плавающие значения передаются в чертёж как плавающие значения; при значении "Повышать" они преобразуются в 1 до того, как передаются в чертёж схемы; и при значении "Понижать" они преобразуются в 0 до того, как передаются в чертёж схемы.
Метка
Текст внутри метки, привязанной к компоненту.
Направление метки
Расположение метки относительно компонента.
Шрифт метки
Шрифт, которым отрисовывается метка.

Поведение Инструмента Нажатие

Нажатие на выходной контакт не даёт эффекта, только атрибуты контакта будут отображены.

Нажатие на входной контакт будет переключать бит, на который нажали. Если это контакт с тремя состояниями, то соответствующий бит будет переключаться между тремя состояниями.

Однако, если пользователь просматривает состояние подсхемы, как описано в разделе "Отладка подсхемы Руководства пользователя, то значение на контакте жёстко привязано к значению, которое подсхема принимает из содержащей её схемы. Пользователь не может изменить значение, не нарушая эту связь между состоянием подсхемы и состоянием содержащей её схемы, и Logisim будет предлагать пользователю подтвердить, что он действительно хочет нарушить эту связь.

Поведение Инструмента Текст

Позволяет редактировать привязанную к компоненту метку.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/wiring/index.html0000644000175000017500000000627611541757150021467 0ustar vincentvincent Библиотека Проводка

Библиотека Проводка

Библиотека проводка включает в себя компоненты, которые относятся в основном к проводам и базовым понятиям электроники.

Разветвитель
Контакт
Датчик
Тоннель
Согласующий резистор
Тактовый генератор
Константа
Питание/Земля
Транзистор
Передаточный вентиль
Расширитель битов

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/wiring/extender.html0000644000175000017500000001057211541757150022170 0ustar vincentvincent Расширитель битов

Расширитель битов

Библиотека: Проводка
Введён в: 2.5.0 (в библиотеке Базовые, перемещён в библиотеку Проводка в 2.7.0)
Внешний вид:

Поведение

Расширитель битов преобразует значение в значение с другой разрядностью. Если оно преобразуется в меньшую разрядность, то оно просто обрезается так, чтобы оставались младшие биты. Если оно преобразуется в большую разрядность, то младшие биты остаются теми же, и вы можете выбрать, какими будут дополнительные старшие биты: они могут быть все 0, все 1, все соответствовать биту знака значения на входе (его самому старшему биту), или компонент может иметь дополнительный однобитный вход, который определяет, какими будут эти биты.

Контакты

Западный край (вход, разрядность соответствует атрибуту Разрядность входа)

Многобитный вход, значение на котором будет преобразовано.

Восточный край (выход, разрядность соответствует атрибуту Разрядность выхода)

Вычисленное выходное значение.

Северный край (вход, разрядность равна 1)

Определяет, какими должны быть дополнительные биты на выходе. Этот контакт доступен только когда атрибут Тип расширения - Вход.

Атрибуты

Когда компонент выбран, или уже добавлен, клавиши от 0 до 9 меняют атрибут Разрядность входа, а комбинации от Alt-0 до Alt-9 меняют атрибут Разрядность выхода.

Разрядность входа
Разрядность входного значения.
Разрядность выхода
Разрядность выходного значения.
Тип расширения
Предполагая, что разрядность выхода превышает разрядность входа, этот атрибут определяет, какими должны быть дополнительные биты выходного значения. Если Ноль или Единица, то дополнительные биты будут 0 или 1 соответственно. Если Знак, то дополнительные биты соответствуют самому старшему биту на входе. И если Вход, то компонент имеет второй вход на северной стороне, однобитное значение на котором используется для дополнительных битов.

Поведение Инструмента Нажатие

Нет.

Поведение Инструмента Текст

Нет.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/wiring/constant.html0000644000175000017500000000547311541757150022207 0ustar vincentvincent Константа

Константа

Библиотека: Проводка
Введён в: 2.0 Beta 1 (в библиотеке Элементы, перемещён в библиотеку Проводка в 2.7.0)
Внешний вид:

Поведение

Выдаёт значение, указанное в его атрибуте Значение.

Контакты

Всего один контакт, выход, разрядность которого соответствует атрибуту Биты данных. Расположение этого контакта определяется атрибутом Направление. Компонент постоянно имеет на выходном контакте значение, указанное в атрибуте Значение.

Атрибуты

Когда компонент выбран, или уже добавлен, клавиши с шестнадцатеричными цифрами от 0 до 9 и от a до f меняют его атрибут Значение, комбинации от Alt-0 до Alt-9 меняют его атрибут Биты данных, а клавиши со стрелками меняют его атрибут Направление.

Направление
Направление, в котором расположен контакт относительно отрисованного значения.
Биты данных
Разрядность значения, выдаваемого на провод.
Значение
Значение, выдаваемое компонентом, записанное в шестнадцатеричном виде. Количество битов, используемых для указания значения, не может превышать разрядность компонента.

Поведение Инструмента Нажатие

Нет.

Поведение Инструмента Текст

Нет.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/wiring/const01.html0000644000175000017500000000706711541757150021646 0ustar vincentvincent Питание/Земля

Питание/Земля

Библиотека: Проводка
Введён в: 2.7.0
Внешний вид:

Поведение

Выдаёт на провод одиночное значение. Для элемента Питание, обозначаемого треугольником, это значение будет единицей (или если значение атрибута Биты данных больше единицы, то значение, состоящее из всех единиц). Для элемента Земля, обозначаемого стрелкой, состоящей из трёх укорачивающихся параллельных линий, это значение будет нулём (или если значение атрибута Биты данных больше единицы, то значение, состоящее из всех нулей).

Такая же функциональность может быть достигнута с помощью более гибкого компонента Константа. Единственная причина предпочитать компоненты Земля и Питание в том, что они являются стандартными символами в электронике.

Контакты

Всего один контакт, выход, разрядность которого соответствует атрибуту Биты данных. Компонент постоянно выдаёт одно и тоже значение на свой контакт: для компонента Земля на выходе будет значение, состоящее из всех нулей, а для компонента Питание на выходе будет значение, состоящее из всех единиц.

Атрибуты

Когда компонент выбран, или уже добавлен, комбинации от Alt-0 до Alt-9 меняют его атрибут Биты данных, а клавиши со стрелками меняют его атрибут Направление.

Направление
Направление, в котором указывает стрелка, выходящая из контакта компонента.
Биты данных
Разрядность значения, выдаваемого на провод.

Поведение Инструмента Нажатие

Нет.

Поведение Инструмента Текст

Нет.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/wiring/clock.html0000644000175000017500000001106311541757150021441 0ustar vincentvincent Тактовый генератор

Тактовый генератор

Библиотека: Проводка
Введён в: 2.0 Beta 13 (в библиотеке Базовые, перемещён в библиотеку Проводка в 2.7.0)
Внешний вид:

Поведение

Тактовый генератор меняет значение на выходе по определённому расписанию, пока такты включены через меню Моделировать (по умолчанию такты отключены). "Такт" - это единица времени в Logisim; скорость, с которой сменяются такты, можно выбрать из подменю Тактовая частота меню Моделировать.

Цикл тактового генератора можно настроить через атрибуты Продолжительность единицы и Продолжительность нуля.

Отмечу, что моделирование тактового генератора в Logisim немного не реалистично: в реальных схемах несколько тактовых генераторов будут смещаться друг относительно друга, и никогда не будут идти нога в ногу. Но в Logisim все тактовые генераторы срабатывают с одинаковой частотой.

Контакты

Тактовый генератор имеет всего один контакт - выход с разрядностью 1, значение на котором представляет текущее значение тактового генератора. Расположение этого контакта определяется атрибутом Направление. Значение тактового генератора будет переключаться по своему расписанию, пока такты включены, или однократно, когда на него щёлкнули Инструментом Нажатие.

Атрибуты

Когда компонент выбран, или уже добавлен, клавиши со стрелками меняют его атрибут Направление.

Направление
Сторона компонента, где должен быть его выходной контакт.
Продолжительность единицы
Отрезок времени внутри каждого цикла, в течение которого на выходе должна быть 1.
Продолжительность нуля
Отрезок времени внутри каждого цикла, в течение которого на выходе должен быть 0.
Метка
Текст внутри метки, привязанной к компоненту Тактовый генератор.
Направление метки
Расположение метки относительно компонента.
Шрифт метки
Шрифт, которым отрисовывается метка.

Поведение Инструмента Нажатие

Нажатие на компонент Тактовый генератор будет немедленно переключать его текущее выходное значение.

Поведение Инструмента Текст

Позволяет редактировать привязанную к компоненту метку.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/plexers/0000755000175000017500000000000011541757150017642 5ustar vincentvincentlogisim-2.7.1/doc/ru/html/libs/plexers/selector.html0000644000175000017500000000767211541757150022364 0ustar vincentvincent Селектор битов

Селектор битов

Библиотека: Плексоры
Введён в: 2.0.5
Внешний вид:

Поведение

Принимая на входе несколько битов, этот компонент будет разделять их на несколько одинаковых по размеру групп (начиная с бита с самым низким порядком) и пускать на выход группу, определённую выбирающим входом.

Например, если у нас есть 8-битный вход 01010101, и мы должны иметь 3-битный выход, то группа 0 будет тремя битами 101 с самым низким порядком, группа 1 - следующие три бита, 010, и группа 2 - следующие три бита 001. (Все биты за пределами верхней границы заполняются нулями.) Выбирающий вход будет 2-разрядным номером, который выбирает, какая из этих трех групп посылается на выход; если на выбирающем входе 3, то на выходе будет 000.

Контакты (предполагается, что компонент направлен на восток)

Западный край (вход, разрядность соответствует атрибуту Биты данных)
Входные данные, из которых должны выбираться биты для вывода.
Восточный край (выход, разрядность соответствует атрибуту Выходные биты)
Группа битов из входных данных, определённая выбирающим входом.
Южный край (вход, разрядность равна отношению атрибутов Биты данных и Выходные биты, округлённому вверх)
Выбирающий вход: определяет, какая из групп битов должна быть направлена на выход.

Атрибуты

Когда компонент выбран, или уже добавлен, клавиши от 0 до 9 меняют его атрибут Выходные биты, комбинации от Alt-0 до Alt-9 меняют его атрибут Биты данных, а клавиши со стрелками меняют его атрибут Направление.

Направление
Направление компонента (его выхода относительно его входа).
Биты данных
Разрядность входа данных компонента.
Выходные биты
Разрядность выхода компонента.

Поведение Инструмента Нажатие

Нет.

Поведение Инструмента Текст

Нет.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/plexers/priencod.html0000644000175000017500000001536111541757150022341 0ustar vincentvincent Шифратор приоритетов

Шифратор приоритетов

Библиотека: Плексоры
Введён в: 2.3.0
Внешний вид:

Поведение

Компонент имеет несколько входов на его западном крае, с первым, отмеченным 0 и другими, отсчитываемыми оттуда. Компонент определяет номера входов, значения на которых 1, и пускает на выход наибольший номер. Например, если входы 0, 2, 5 и 6 содержат 1, то шифратор приоритетов пускает на выход значение 110. Если на входах нет 1, или если компонент выключен, то выход шифратора приоритетов плавающий.

Шифратор приоритетов разработан таким образом, что ряд шифраторов можно расположить гирляндой для обеспечения дополнительных входов. В частности, компонент включает в себя разрешающий вход и разрешающий выход. Когда на разрешающем входе 0, компонент отключен, и на выходе все биты будут плавающими. На разрешающем выходе 1, когда компонент включен и ни на одном из нумерованных входов нет 1. Таким образом, можно взять два шифратора приоритетов и подключить разрешающий выход первого к разрешающему входу второго: если какой-либо из нумерованных входов первого содержит 1, то второй будет отключен, и поэтому его выход будет плавающим. Но если ни один из нумерованных входов первого не содержит 1, то его выход будет плавающим, а второй шифратор приоритетов будет включен, и в нём будет определён старший вход с 1.

Дополнительный выход шифратора приоритетов содержит 1 всякий раз, когда шифратор приоритетов включен и находит 1 на одном из нумерованных входов. Когда шифраторы приоритетов соединены вместе, этот выход может быть использован чтобы определить, какой из шифраторов сработал.

Контакты (предполагается, что компонент направлен на восток)

Западный край, переменное количество (входы, разрядность равна 1)
Входные значения, нумерованные с 0 на верхнем/западном конце края.
Восточный край, верхний контакт (выход, разрядность соответствует атрибуту Выбирающие биты)
Выход: наибольший номер среди тех входов, чьи значения равны 1; или все плавающие биты, если ни один вход не содержит 1 или если компонент отключен с помощью разрешающего входа.
Восточный край, нижний контакт (выход, разрядность равна 1)
Сигнал для группировки: 1, если компонент включен и хотя бы один нумерованный вход содержит 1; иначе на этом выходе 0.
Южный край (вход, разрядность равна 1)
Разрешающий вход: Если 0, то компонент отключен, в противном случае компонент включен.
Северный край (выход, разрядность равна 1)
Разрешающий выход: 1, если этот компонент включен и ни один из нумерованных входов не содержит 1, в противном случае на выходе 0.

Атрибуты

Когда компонент выбран, или уже добавлен, клавиши от 1 до 4 меняют его атрибут Выбирающие биты, а клавиши со стрелками меняют его атрибут Направление.

Направление
Направление компонента (его выхода относительно его входа).
Выбирающие биты
Разрядность основного выхода компонента. Количество нумерованных входов шифратора приоритетов будет равно 2Выбирающие_биты.
На отключенном выходе
Определяет, каким должен быть каждый бит выхода, когда компонент выключен (то есть когда на контакте Разрешить - 0). Существуют варианты "ноль" и "плавающее"; в последнем случае выход фактически отключен от всех других контактов.

Поведение Инструмента Нажатие

Нет.

Поведение Инструмента Текст

Нет.

Назад к Справке по библиотеке

-logisim-2.7.1/doc/ru/html/libs/plexers/mux.html0000644000175000017500000001374511541757150021353 0ustar vincentvincent Мультиплексор

Мультиплексор

Библиотека: Плексоры
Введён в: 2.0 Beta 11
Внешний вид:

Поведение

Копирует значение со входа на западном крае на выход на восточном крае; какое из входных значений должно быть копировано, определяется текущим значением, принятым на входе на южном крае. Я считаю полезным думать о мультиплексоре как об аналоге железнодорожной стрелки, управляемой выбирающим входом.

(Кстати, на английском некоторые специалисты пишут multiplexor, но multiplexer является преобладающим написанием.)

Контакты (предполагается, что компонент направлен на восток, положение выбирающего входа - снизу/слева)

Западный край, переменное количество (входы, разрядность соответствует атрибуту Биты данных)
Значения данных, одно из которых должно быть направлен на выход. Каждое значение входных данных нумеруется, начиная с 0 на севере.
Восточный край (выход, разрядность соответствует атрибуту Биты данных)
Выходное значение будет соответствовать входному значению на западном крае, номер которого равен значению, принятому в данный момент на выбирающем входе на юге. Если выбирающий вход содержит неопределённые (например, плавающие) биты, то выход будет полностью плавающим.
Южный край, левая сторона, отмечен серым кружком (вход, разрядность соответствует атрибуту Выбирающие биты)
Выбирающий вход: значение этого входа определяет, какой вход на западном крае будет перенаправлен на выход на восточном крае.
Южный край, правая сторона (вход, разрядность равна 1)
Разрешить: когда 0, на всех битах выхода мультиплексора плавающие значения, независимо от входа данных и выбирающего входа.

Атрибуты

Когда компонент выбран, или уже добавлен, клавиши от 0 до 9 меняют его атрибут Выбирающие биты, комбинации от Alt-0 до Alt-9 меняют его атрибут Биты данных, а клавиши со стрелками меняют его атрибут Направление.

Направление
Направление компонента (его выхода относительно его входа).
Положение выбирающего входа
Положение выбирающего и разрешающего входов относительно компонента.
Выбирающие биты
Разрядность выбирающего входа компонента на его южном крае. Количество входов для мультиплексора будет равно 2Выбирающие_биты.
Биты данных
Разрядность данных, проходящих через мультиплексор.
На отключенном выходе
Определяет, каким должен быть каждый бит выхода, когда компонент выключен (то есть когда на контакте Разрешить - 0). Существуют варианты "ноль" и "плавающее"; в последнем случае выход фактически отключен от всех других контактов.
Разрешающий вход?
Компонент имеет разрешающий вход, когда значение этого атрибута да. Этот атрибут нужен в основном для поддержки схем, построенных с использованием более старых версий Logisim, которые не предусматривали разрешающий вход.

Поведение Инструмента Нажатие

Нет.

Поведение Инструмента Текст

Нет.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/plexers/index.html0000644000175000017500000000333011541757150021636 0ustar vincentvincent Библиотека Плексоры

Библиотека Плексоры

Библиотека Плексоры содержит управляющие компоненты. Как и компоненты библиотеки Элементы, все компоненты - комбинационные, но их назначение - в основном перенаправление значений.

Мультиплексор
Демультиплексор
Декодер
Шифратор приоритетов
Селектор битов

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/plexers/demux.html0000644000175000017500000001456711541757150021667 0ustar vincentvincent Демультиплексор

Демультиплексор

Библиотека: Плексоры
Введён в: 2.0 Beta 11
Внешний вид:

Поведение

Копирует значение со входа на западном крае строго на один из выходов на восточном крае; на какой из выходов производится копирование, определяется текущим значением, принятым на входе на южном крае. Я считаю полезным думать о демультиплексоре как об аналоге железнодорожной стрелки, управляемой выбирающим входом.

(Кстати, на английском некоторые специалисты пишут demultiplexor, но demultiplexer является преобладающим написанием.)

Контакты (предполагается, что компонент направлен на восток, положение выбирающего входа - снизу/слева)

Западный край (вход, разрядность соответствует атрибуту Биты данных)
Значение, которое будет перенаправлено на один из выходов на восточном крае.
Восточный край, переменное количество (выходы, разрядность соответствует атрибуту Биты данных)
Выходы, пронумерованные с 0 начиная с севера. Значение на выходе будет равно значению на западном входе, если его номер совпадает со значением, принятым в данный момент на выбирающем входе на юге, в противном случае значения на его выходах будут либо нулевые, либо плавающие, в зависимости от значения атрибута Три состояния? . Если выбирающий вход содержит неопределённые биты, то значения на всех выходах будут плавающими.
Южный край, левая сторона (вход, разрядность равна 1)
Разрешить: когда 0, на всех выходах плавающие биты, независимо от данных и выбирающих входов.
Южный край, правая сторона, отмечен серым кружком (вход, разрядность соответствует атрибуту Выбирающие биты)
Выбирающий вход: значение этого входа определяет, на какой выход на восточном крае будет перенаправлен вход на западном крае.

Атрибуты

Когда компонент выбран, или уже добавлен, клавиши от 0 до 9 меняют его атрибут Выбирающие биты, комбинации от Alt-0 до Alt-9 меняют его атрибут Биты данных, а клавиши со стрелками меняют его атрибут Направление.

Направление
Направление компонента (определяющее, на какой стороне выходы).
Положение выбирающего входа
Положение выбирающего и разрешающего входов относительно компонента.
Выбирающие биты
Разрядность выбирающего входа компонента на его южном крае. Количество выходов для демультиплексора будет равно 2Выбирающие_биты.
Биты данных
Разрядность данных, проходящих через демультиплексор.
Три состояния?
Определяет, должны значения на невыбранных выходах быть плавающими (Да) или нулями (Нет).
На отключенном выходе
Определяет, каким должен быть каждый бит выходов, когда компонент выключен (то есть когда на контакте Разрешить - 0). Существуют варианты "ноль" и "плавающее"; в последнем случае выходы фактически отключены от всех других контактов.
Разрешающий вход?
Компонент имеет разрешающий вход, когда значение этого атрибута да. Этот атрибут нужен в основном для поддержки схем, построенных с использованием более старых версий Logisim, которые не предусматривали разрешающий вход.

Поведение Инструмента Нажатие

Нет.

Поведение Инструмента Текст

Нет.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/plexers/decoder.html0000644000175000017500000001205611541757150022141 0ustar vincentvincent Декодер

Декодер

Библиотека: Плексоры
Введён в: 2.0 Beta 11
Внешний вид:

Поведение

Выдаёт 1 строго на одном из выходов; на каком из выходов будет 1, зависит от значения, принятого в данный момент на входе на южном крае.

Контакты (предполагается, что компонент направлен на восток, положение выбирающего входа - снизу/слева)

Восточный край, переменное количество (выходы, разрядность равна 1)
Выходы, пронумерованные с 0 начиная с севера. Каждый из выходов может нести 1, если его номер совпадает со значением, принятым в данный момент на выбирающем входе на юге, в противном случае значение на его выходе будет либо нулевое, либо плавающее, в зависимости от значения атрибута Три состояния? . Если выбирающий вход содержит неопределённые биты, то значения на всех выходах будут плавающими.
Южный край, левая сторона (вход, разрядность равна 1)
Разрешить: когда 0, на всех выходах плавающие биты (или нули), независимо от значения на выбирающем входе.
Южный край, правая сторона, отмечен серым кружком (вход, разрядность соответствует атрибуту Выбирающие биты)
Выбирающий вход: значение на данном входе определяет, на каком из выходов будет 1.

Атрибуты

Когда компонент выбран, или уже добавлен, клавиши от 1 до 4 меняют его атрибут Выбирающие биты, а клавиши со стрелками меняют его атрибут Направление.

Направление
Направление компонента (определяющее, на какой стороне выходы).
Положение выбирающего входа
Положение выбирающего и разрешающего входов относительно компонента.
Выбирающие биты
Разрядность выбирающего входа компонента на его южном крае. Количество выходов для декодера будет равно 2Выбирающие_биты .
Три состояния?
Определяет, должны значения на невыбранных выходах быть плавающими (Да) или нулями (Нет).
На отключенном выходе
Определяет, каким должен быть каждый бит выходов, когда компонент выключен (то есть когда на контакте Разрешить - 0). Существуют варианты "ноль" и "плавающее"; в последнем случае выходы фактически отключены от всех других контактов.
Разрешающий вход?
Компонент имеет разрешающий вход, когда значение этого атрибута да. Этот атрибут нужен в основном для поддержки схем, построенных с использованием более старых версий Logisim, которые не предусматривали разрешающий вход.

Поведение Инструмента Нажатие

Нет.

Поведение Инструмента Текст

Нет.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/mem/0000755000175000017500000000000011541757150016736 5ustar vincentvincentlogisim-2.7.1/doc/ru/html/libs/mem/shiftreg.html0000644000175000017500000001724511541757150021450 0ustar vincentvincent Сдвиговый регистр

Сдвиговый регистр

Библиотека: Память
Введён в: 2.3.0
Внешний вид:

Поведение

Этот регистр состоит из нескольких ступеней; каждое срабатывание тактового входа может привести к тому, что каждая ступень получит значение предыдущей ступени, а новое значение загрузится в первую ступень. Компонент также опционально поддерживает параллельное чтение и запись значений всех ступеней.

Вход Очистка асинхронно сбрасывает все ступени на 0 (все нули); кроме того, пока на входе Очистка 1, все значения фиксированы на 0, вне зависимости от тактового входа.

Контакты

* Звёздочкой отмечены контакты, существующие только когда атрибут Параллельная загрузка включен.

Западный край, верхний контакт (вход, разрядность равна 1)
Сдвиг: когда на нём 1 или он не подключен, все ступени сдвигаются при срабатывании тактового входа; но если на нём 0, никакого сдвига не происходит. Этот вход игнорируется, если на входе Загрузка 1.
Западный край, средний контакт (вход, разрядность соответствует атрибуту Биты данных)
Данные: при продвижении ступеней значение с этого входа загружается в первую ступень.
Западный край, нижний контакт, отмечен треугольником (вход, разрядность равна 1)
Тактовый вход: в момент срабатывания этого входа, как указано в атрибуте Срабатывание, компонент может сдвинуть ступени или загрузить новые значения.
*Северный край, левый контакт (вход, разрядность равна 1)
Загрузка: когда на этом входе 1, значения с остальных контактов на северном крае загружаются во все ступени при следующем срабатывании тактового входа. Когда на нём 0 или он не подключен, никакой загрузки не происходит.
*Северный край, остальные контакты (вход, разрядность соответствует атрибуту Биты данных)
Данные: эти значения загружаются во все ступени при срабатывании тактового входа, пока на входе Загрузка 1. Крайний левый вход соответствует младшей ступени.
Южный край, левый контакт (вход, разрядность равна 1)
Очистка: когда значение равно 1, все ступени асинхронно сбрасываются на 0, и все другие входы игнорируются.
*Южный край, остальные контакты (выход, разрядность соответствует атрибуту Биты данных)
Выход: выдаёт значение, хранящееся в каждой ступени; младшая ступень отражена в крайнем левом контакте (рядом со входом Очистка).
Восточный край (выход, разрядность соответствует атрибуту Биты данных)
Выход: выдаёт значение, хранящееся в последней (старшей) ступени.

Атрибуты

Когда компонент выбран, или уже добавлен, клавиши от 0 до 9 меняют его атрибут Количество ступеней, а комбинации от Alt-0 до Alt-9 меняют его атрибут Биты данных.

Биты данных
Разрядность значений, хранящихся в каждой ступени.
Количество ступеней
Количество ступеней, включенных в компонент.
Параллельная загрузка
Если Да, то компонент содержит входы и выходы для параллельного доступа к значениям всех ступеней.
Срабатывание
Определяет, как обрабатывается тактовый вход. Значение Передний фронт означает, что регистр должен обновляться в момент, когда значение на тактовом входе меняется с 0 на 1. Значение Задний фронт означает, что он должен обновляться, когда значение на тактовом входе меняется с 1 на 0.
Метка
Текст внутри метки, привязанной к компоненту.
Шрифт метки
Шрифт, которым отрисовывается метка.

Поведение Инструмента Нажатие

Если значение атрибута Параллельная загрузка - Нет, или если атрибут Биты данных больше 4, то нажатие на компонент не даёт никакого эффекта. В противном случае нажатие на компонент передаст фокус клавиатуры нажатой ступени (обозначается красным прямоугольником), и ввод шестнадцатеричных цифр будет изменять значение, хранящееся в этой ступени.

Поведение Инструмента Текст

Позволяет редактировать привязанную к компоненту метку.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/mem/rom.html0000644000175000017500000001265611541757150020433 0ustar vincentvincent ПЗУ

ПЗУ

Библиотека: Память
Введён в: 2.1.0
Внешний вид:

Поведение

Компонент ПЗУ хранит до 16777216 значений (это задаётся в атрибуте Разрядность адреса), каждое из которых может включать до 32 битов (задаётся в атрибуте Разрядность данных). Схема может получать доступ к текущим значениям в ПЗУ, но не может менять их. Пользователь может интерактивно изменять отдельные значения с помощью Инструмента Нажатие, или менять всё содержимое через Инструмент Меню.

В отличие от компонента ОЗУ, текущее содержимое компонента ПЗУ хранится в виде атрибута компонента. Таким образом, если схема, содержащая компонент ПЗУ, используется два раза, то оба компонента будут хранить одинаковые значения. Также, из-за такого поведения, текущее содержимое ПЗУ хранится в файлах, созданных Logisim.

Текущие значения отображаются в компоненте. Их адреса перечислены серым слева от области отображения. Значения внутри представлены в шестнадцатеричном виде. Значение выбранного в данный момент адреса будет отображаться негативным текстом (белым по чёрному).

Контакты

A на западном крае (вход, разрядность соответствует атрибуту Разрядность адреса)
Выбирает, к какому значению схема в данный момент получает доступ.
D на восточном крае (вход/выход, разрядность соответствует атрибуту Разрядность данных)
Выдаёт значение по выбранному в данный момент адресу на контакт D, если на входе sel 1 или плавающее значение. Если на входе sel 0, то значение на выходе D будет плавающим.
sel на южном крае (вход, разрядность равна 1)
Если у вас только один модуль ПЗУ, игнорируйте этот вход. Если у вас несколько модулей ПЗУ параллельно, то вы можете использовать этот вход, чтобы включить или отключить весь модуль ПЗУ, в зависимости от того, какое значение на этом входе: 1 или 0. Иными словами, если на этом входе 0, то никакого значения не выдаётся на выход D.

Атрибуты

Когда компонент выбран, или уже добавлен, клавиши от 0 до 9 меняют его атрибут Разрядность адреса, а комбинации от Alt-0 до Alt-9 меняют его атрибут Разрядность данных.

Разрядность адреса
Число адресных битов. Количество значений, хранящихся в ПЗУ равно 2Разрядность_адреса.
Разрядность данных
Разрядность каждого отдельного значения в памяти.
Содержимое
Хранит содержимое памяти.

Поведение Инструмента Нажатие

См. Нажатие на память в Руководстве пользователя.

Поведение Инструмента Текст

Нет.

Поведение Инструмента Меню

См. Всплывающие меню и файлы в Руководстве пользователя.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/mem/register.html0000644000175000017500000001425511541757150021457 0ustar vincentvincent Регистр

Регистр

Библиотека: Память
Введён в: 2.0 Beta 1
Внешний вид:

Поведение

Регистр хранит одно многобитное значение, которое отображается в шестнадцатеричном виде внутри его прямоугольника, и выдаётся на его выход Q. Когда указывает тактовый вход (отмеченный треугольником на южном крае), значение, хранящееся в регистре, меняется в этот момент на значение на входе D. Когда конкретно тактовый вход указывает этому случиться, настраивается атрибутом Срабатывание.

Вход Сброс асинхронно сбрасывает значение регистра на 0 (все нули), кроме того, пока на входе Сброс 1, значение фиксировано на 0, вне зависимости от тактового входа.

Контакты

Восточный край, отмечен Q (выход, разрядность соответствует атрибуту Биты данных)
Выдаёт значение, хранящееся в данный момент в регистре.
Западный край, отмечен D (вход, разрядность соответствует атрибуту Биты данных)
Вход данных: в момент, когда значение на тактовом входе изменяется с 0 на 1, значение регистра меняется на значение входа D.
Западный край, отмечен en (вход, разрядность равна 1)
Включение: когда на этом входе 0, срабатывания тактового входа игнорируются. Текущее значение по-прежнему поступает на выход. Срабатывания тактового входа включаются, когда значение этого входа 1 или не определено.
Южный край, отмечен треугольником (вход, разрядность равна 1)
Тактовый вход: в момент, когда значение на этом входе изменяется с 0 на 1 (передний фронт), значение регистра обновляется на значение входа D.
Южный край, отмечен 0 (вход, разрядность равна 1)
Асинхронный сброс: если на этом входе 0 или неопределённое значение, то он не имеет эффекта. Пока на нём 1, значение регистра фиксируется на 0. Это происходит асинхронно - то есть вне зависимости от текущего значения на тактовом входе. Пока на нём 1, другие входы не имеют эффекта.

Атрибуты

Когда компонент выбран, или уже добавлен, комбинации от Alt-0 до Alt-9 меняют его атрибут Биты данных.

Биты данных
Разрядность значения, хранящегося в регистре.
Срабатывание
Определяет, как обрабатывается тактовый вход. Значение Передний фронт означает, что регистр должен обновляться в момент, когда значение на тактовом входе меняется с 0 на 1. Значение Задний фронт означает, что он должен обновляться, когда значение на тактовом входе меняется с 1 на 0. Значение Высокий уровень означает, что регистр должен обновляться непрерывно, пока на тактовом входе 1. И значение Низкий уровень означает, что он должен обновляться непрерывно, пока на тактовом входе 0.
Метка
Текст внутри метки, привязанной к регистру.
Шрифт метки
Шрифт, которым отрисовывается метка.

Поведение Инструмента Нажатие

Нажатие на регистре переводит фокус ввода клавиатуры на регистр (это отображается красным прямоугольником), и ввод шестнадцатеричных цифр будет менять значение, хранящееся в регистре.

Поведение Инструмента Текст

Позволяет редактировать привязанную к компоненту метку.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/mem/random.html0000644000175000017500000001517611541757150021116 0ustar vincentvincent Генератор случайных чисел

Генератор случайных чисел

Библиотека: Память
Введён в: 2.3.0
Внешний вид:

Поведение

Этот компонент перебирает псевдослучайную последовательность чисел, переходя к следующему числу в последовательности каждый раз, когда срабатывает тактовый вход, если компонент включен. С технической точки зрения, алгоритм, используемый для вычисления псевдослучайных последовательностей - это линейный конгруэнтный генератор: начиная с семени r0, следующий номер r1 - это число

r1 = (25,214,903,917 r0 + 11) mod 248

Следующее значение r2 вычисляется из r1, используя те же вычисления, и так далее. Эта последовательность состоит из 48-битных чисел; значение на выходе компонента - это младшие биты, количество которых выбрано в атрибуте Биты данных, но после отбрасывания младших 12 битов текущего семени.

Кроме тактового входа, компонент имеет вход включение, который заставляет компонент игнорировать тактовый вход, если на входе включение 0; и вход сброс, который асинхронно сбрасывает значение компонента на начальное семя r0.

Начальное семя может быть настроено пользователем. Если выбран 0 (по умолчанию), то семя выбирается на основе текущего времени; когда значение сбрасывается с помощью входа сброс, компонент вычисляет новое семя на основе нового текущего времени.

Контакты

Восточный край, отмечен Q (выход, разрядность соответствует атрибуту Биты данных)
Выдаёт значение, хранящееся в данный момент в компоненте.
Западный край, верхний контакт, отмечен треугольником (вход, разрядность равна 1)
Тактовый вход: в момент срабатывания этого входа (как указано в атрибуте Срабатывание) компонент переходит к следующему числу в последовательности.
Западный край, нижний контакт (вход, разрядность равна 1)
Включение: компонент включен, когда этот вход не подключен, или на нём 1; но когда на нём 0, тактовый вход игнорируется.
Южный край (вход, разрядность равна 1)
Сброс: когда на этом входе 1, псевдослучайная последовательность асинхронно сбрасывается на начальное семя. (Если семя - 0, то новое семя будет отличаться от начального семени, использованного перед этим.)

Атрибуты

Когда компонент выбран, или уже добавлен, комбинации от Alt-0 до Alt-9 меняют его атрибут Биты данных.

Биты данных
Разрядность значения, выдаваемого компонентом.
Семя
Начальное значение, используемое для псевдослучайной последовательности. Когда равно 0 (по умолчанию), стартовое значение основано на времени запуска псевдослучайной последовательности.
Срабатывание
Определяет, как обрабатывается тактовый вход. Значение Передний фронт означает, что компонент должен обновляться в момент, когда значение на тактовом входе меняется с 0 на 1. Значение Задний фронт означает, что он должен обновляться, когда значение на тактовом входе меняется с 1 на 0.
Метка
Текст внутри метки, привязанной к компоненту.
Шрифт метки
Шрифт, которым отрисовывается метка.

Поведение Инструмента Нажатие

Нет.

Поведение Инструмента Текст

Позволяет редактировать привязанную к компоненту метку.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/mem/ram.html0000644000175000017500000002544611541757150020416 0ustar vincentvincent ОЗУ

ОЗУ

Библиотека: Память
Введён в: 2.0 Beta 1
Внешний вид:

Поведение

Компонент ОЗУ, бесспорно самый сложный компонент встроенной библиотеки Logisim, хранит до 16777216 значений (это задаётся в атрибуте Разрядность адреса), каждое из которых может включать до 32 битов (задаётся в атрибуте Разрядность данных). Схема может считывать и записывать значения в ОЗУ. Кроме того, пользователь может интерактивно изменять отдельные значения с помощью Инструмента Нажатие, или менять всё содержимое через Инструмент Меню.

Текущие значения отображаются в компоненте. Их адреса перечислены серым слева от области отображения. Значения внутри представлены в шестнадцатеричном виде. Значение выбранного в данный момент адреса будет отображаться негативным текстом (белым по чёрному).

Компонент ОЗУ поддерживает три интерфейса, в зависимости от значения атрибута Интерфейс данных.

Один синхронный порт чтения/записи (по умолчанию)

Компонент имеет один порт на восточном крае, который служит для чтения и записи данных. Что он осуществляет, зависит от значения на входе, отмеченном ld: 1 (или плавающее значение) означает чтение данных по адресу, поданному на западный край компонента, а 0 означает запись данных, поступивших на порт. Для передачи данных в компонент и из него, вам нужно использовать компонент Управляемый буфер, как показано ниже.

Один асинхронный порт чтения/записи

Это тоже самое, что и выше, но в данном варианте нет тактового входа. Значение, поступившее на шину данных, записывается в память, когда значение на входе ld - 0. Если адрес или данные меняются, пока значение на входе ld 0, то происходит дополнительная операция записи. Этот вариант более приближен к интерфейсу многих доступных типов памяти с произвольным доступом.

Раздельные порты чтения и записи

Предоставляются два порта данных - один на западном крае для записи данных, и другой на восточном крае для чтения данных. Этот вариант устраняет необходимость Управляемого буфера, так что он проще в использовании.

Контакты

A на западном крае (вход, разрядность соответствует атрибуту Разрядность адреса)
Выбирает, к какому значению в памяти схема в данный момент получает доступ.
D на западном крае (вход, разрядность соответствует атрибуту Разрядность данных)
Этот вход представлен, только если "Раздельные порты чтения и записи" выбрано для атрибута Интерфейс данных. Когда запрошена запись (через изменение значения на тактовом входе с 0 на 1, пока на входах sel и str 1 или плавающее значение), значение, поданное на этот порт, записывается в память по выбранному в данный момент адресу.
D на восточном крае (вход/выход или выход, разрядность соответствует атрибуту Разрядность данных)
Если на входах sel и ld 1 или плавающее значение, то компонент ОЗУ выдаёт на этот порт значение по выбранному в данный момент адресу. Если представлен один порт чтения/записи, то когда запрошена запись, значение, считанное по этому порту, записывается в память.
str на южном крае (вход, разрядность равна 1)
Запись: этот вход представлен, только если "Раздельные порты чтения и записи" выбрано для атрибута Интерфейс данных. Когда на нём 1 или плавающее значение, тактовый импульс приведёт к записи в память данных, полученных на западном крае (при условии, что на входе sel тоже 1 или плавающее значение).
sel на южном крае (вход, разрядность равна 1)
Выбор кристалла: этот вход включает или выключает весь модуль ОЗУ, в зависимости от того, 1/плавающее значение на нём, или 0. Это вход предназначен в первую очередь для ситуаций, когда у вас есть несколько модулей памяти, только один из которых может быть включен в какой-то момент.
треугольник на южном крае (вход, разрядность равна 1)
Тактовый вход: отсутствует, если значение атрибута Интерфейс данных - "Один асинхронный порт чтения/записи". В других случаях, когда на входе ld 0, и значение на нём меняется с 0 на 1 (и ещё на входе sel 1/неопределённость и на входе clr 0), значение по выбранному в данный момент адресу меняется на значение на контакте D. Но пока на тактовом входе сохраняется 0 или 1, значение входа D не будет записано в память.
ld на южном крае (вход, разрядность равна 1)
Чтение: выбирает, должно ли ОЗУ выдавать (на выход D) значение по текущему адресу. Такое поведение выхода разрешено, если на входе out 1 или неопределённость; если же на входе out 0, тогда никакого значения не будет передано на D, а если порт - совмещённый для чтения/записи, то будет разрешена запись.
clr на южном крае (вход, разрядность равна 1)
Очистка: когда на этом входе 1, все значения в памяти будут фиксированы на 0, вне зависимости от значений на других входах.

Атрибуты

Когда компонент выбран, или уже добавлен, клавиши от 0 до 9 меняют его атрибут Разрядность адреса, а комбинации от Alt-0 до Alt-9 меняют его атрибут Разрядность данных.

Разрядность адреса
Число адресных битов. Количество значений, хранящихся в ОЗУ равно 2Разрядность_адреса.
Разрядность данных
Разрядность каждого отдельного значения в памяти.
Интерфейс данных
Определяет, какой из трёх интерфейсов использовать для передачи данных в и из компонента.

Поведение Инструмента Нажатие

См. Нажатие на память в Руководстве пользователя.

Поведение Инструмента Текст

Нет.

Поведение Инструмента Меню

См. Всплывающие меню и файлы в Руководстве пользователя.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/mem/index.html0000644000175000017500000000420311541757150020732 0ustar vincentvincent Библиотека Память

Библиотека Память

Библиотека Память включает компоненты, которые запоминают информацию.

D/T/J-K/S-R триггеры
Регистр
Счётчик
Сдвиговый регистр
Генератор случайных чисел
ОЗУ
ПЗУ

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/mem/flipflops.html0000644000175000017500000002763011541757150021632 0ustar vincentvincent D/T/J-K/S-R триггеры

D/T/J-K/S-R триггеры

Библиотека: Память
Введён в: 2.0 Beta 1
Внешний вид:

Поведение

Каждый триггер хранит один бит данных, который выдаётся на выход Q на восточном крае. В нормальном состоянии значением можно управлять через входы на западном крае. В частности, значение меняется, когда значение на тактовом входе, отмеченном треугольником на каждом триггере, меняется с 0 на 1 (или наоборот, если так настроено); в момент этого перехода значение меняется в соответствии с таблицей ниже.

D триггер T триггер J-K триггер S-R триггер
DQ
00
11
TQ
0Q
1Q'
JKQ
00 Q
01 0
10 1
11 Q'
SRQ
00 Q
01 0
10 1
11 ??

Другой способ описания поведения различных триггеров - обычный текст.

  • D триггер: когда тактовый вход срабатывает, значение, хранящееся в триггере, мгновенно становится значением входа D (Данные).

  • T триггер: когда тактовый вход срабатывает, значение, хранящееся в триггере, меняется или остаётся прежним в зависимости от того, какое значение на входе T (Переключение): 1 или 0.

  • J-K триггер: когда тактовый вход срабатывает, значение, хранящееся в триггере, меняется, если на входах J и K единица; остаётся прежним, если на них 0; если значения на них различны, то значение становится единицей, если на входе J (Прыжок) - 1; или нулём, если на входе K (Забой) - 1.

  • S-R триггер: когда тактовый вход срабатывает, значение, хранящееся в триггере, остаётся неизменным, если на входах R и S - 0; становится 0, если на входе R (Сброс) - 1, и становится 1, если на входе S (Установка) - 1. Поведение не определено, если на обоих входах 1. (В Logisim значение триггера остается неизменным.)

По умолчанию тактовый вход срабатывает при переднем фронте - то есть когда значение на тактовом входе меняется с 0 на 1. Впрочем, атрибут Срабатывание позволяет сменить это на задний фронт (когда значение на тактовом входе меняется с 1 на 0), на Высокий уровень (срабатывать непрерывно на протяжении времени, когда на тактовом входе 1), или на Низкий уровень (срабатывать непрерывно на протяжении времени 0). Варианты "... уровень" недоступны для T и J-K триггеров, так как триггер ведет себя непредсказуемо, если заставить его переключаться непрерывно на протяжении отрезка времени.

Контакты

Западный край, отмечен треугольником (вход, разрядность равна 1)
Тактовый вход: в момент, когда значение на этом входе меняется с 0 на 1 (передний фронт), значение триггера будет обновлено в соответствии с другими входами на западном крае. Пока значение на этом входе остаётся 0 или 1, другие входы на западном крае не имеют эффекта.
Западный край, другой отмеченный контакт(ы) (вход(ы), разрядность равна 1)
Эти входы управляют тем, как значение триггера меняется в момент срабатывания тактового входа. Их точное поведение зависит от триггера; приведенная выше таблица описывает его.
Восточный край, отмечен Q, северный контакт (выход, разрядность равна 1)
Выдаёт значение, хранящееся в данный момент в триггере.
Восточный край, южный контакт (выход, разрядность равна 1)
Выдаёт дополнение для значения, хранящегося в данный момент в триггере.
Южный край, восточный контакт (вход, разрядность равна 1)
Асинхронный сброс: если на этом входе 0 или неопределённое значение, то он не имеет эффекта. Пока на нём 1, значение триггера фиксировано на 0. Это происходит асинхронно - то есть вне зависимости от текущего значения на тактовом входе. Пока на нём 1, другие входы не имеют эффекта.
Южный край, центральный контакт (вход, разрядность равна 1)
Включение: когда на этом входе 0, срабатывания тактового входа игнорируются. Текущий бит по-прежнему поступает на выход. Срабатывания тактового входа включаются, когда значение этого входа 1 или не определено.
Южный край, западный контакт (вход, разрядность равна 1)
Асинхронная установка: если на этом входе 0 или неопределённое значение, то он не имеет эффекта. Пока на нём 1, значение триггера фиксировано на 1. Это происходит асинхронно - то есть вне зависимости от текущего значения на тактовом входе. Пока на этом входе 1, другие входы не имеют эффекта, за исключением входа Асинхронный сброс - он имеет приоритет.

Атрибуты

Срабатывание
Определяет, как обрабатывается тактовый вход. Значение Передний фронт означает, что триггер должен обновляться в момент, когда значение на тактовом входе меняется с 0 на 1. Значение Задний фронт означает, что он должен обновляться, когда значение на тактовом входе меняется с 1 на 0. Значение Высокий уровень означает, что триггер должен обновляться непрерывно, пока на тактовом входе 1. И значение Низкий уровень означает, что он должен обновляться непрерывно, пока на тактовом входе 0. Обратите внимание, что два последних варианта недоступны для T и J-K триггеров.
Метка
Текст внутри метки, привязанной к триггеру.
Шрифт метки
Шрифт, которым отрисовывается метка.

Поведение Инструмента Нажатие

Щелчок на триггере с помощью Инструмента Нажатие переключают бит, хранящийся в триггере, если входы Асинхронный сброс/установка не фиксируют значение в данный момент.

Поведение Инструмента Текст

Позволяет редактировать привязанную к компоненту метку.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/mem/counter.html0000644000175000017500000002464611541757150021317 0ustar vincentvincent Счётчик

Счётчик

Библиотека: Память
Введён в: 2.3.0
Внешний вид:

Поведение

Счётчик хранит одно значение, которое выдаётся на выход Q. Каждый раз, когда тактовый вход (отмеченный треугольником на южном крае компонента) срабатывает в соответствии с его атрибутом Срабатывание, значение в счётчике может обновиться на основании значений двух входов на западном крае компонента: верхнего входа, названного загрузка, и нижнего, названного счёт, и они интерпретируются следующим образом.

загрузкасчётвызываемое действие
0 или z0 Значение счётчика остаётся неизменным
0 или z1 или z Значение счётчика увеличивается на единицу.
10 Счётчик загружает значение со входа D.
11 или z Значение счётчика уменьшается на единицу.

Диапазон счёта можно настроить с помощью атрибута Максимальное значение. Когда счётчик достигает этого значения, следующее увеличение возвращает значение счётчика обратно к 0; а если значение счётчика 0, то уменьшение возвратит счётчик к его максимальному значению.

В дополнение к выходу Q компонент также имеет однобитный выход перенос. На этом выходе 1, когда счётчик имеет своё максимальное значение и входы загрузка и счёт показывают, что значение компонента должно увеличиться на следующем шаге; или когда значение счётчика - 0, и входы загрузка и счёт показывают, что значение компонента должно уменьшиться на следующем шаге.

Вход Очистка асинхронно сбрасывает значение счётчика на 0 (все нули); кроме того, пока на входе Очистка 1, значение фиксировано на 0 вне зависимости от тактового входа.

Контакты

Восточный край, отмечен Q (выход, разрядность соответствует атрибуту Биты данных)
Выдаёт значение, хранящееся в данный момент в счётчике.
Восточный край, нижний контакт (выход, разрядность равна 1)
Перенос: когда входы загрузка и счёт указывают счётчику увеличиться, значение на этом выходе 1, если регистр имеет максимальное значение. Когда входы загрузка и счёт указывают счётчику уменьшиться, значение на этом выходе 1, если регистр имеет значение 0. Во всех других случаях на этом выходе 0.
Западный край, верхний контакт (вход, разрядность равна 1)
Загрузка: когда на этом входе 1, пока на входе счёт 0, счётчик загрузит значение со входа данные при следующем срабатывании тактового входа; или, если на входе счёт 1, значение счётчика уменьшится.
Западный край, средний контакт, отмечен D (вход, разрядность соответствует атрибуту Биты данных)
Данные: когда срабатывает тактовый вход при 1 на входе загрузка и 0 на входе счёт, значение счётчика сменится на значение, поступившее на этот вход.
Западный край, нижний контакт, отмечен ct (вход, разрядность равна 1)
Счёт: когда на этом входе 1, или он не подключен, значение счётчика увеличивается, когда срабатывает тактовый вход, или уменьшается, если на входе load тоже была 1.
Южный край, отмечен треугольником (вход, разрядность равна 1)
Тактовый вход: в момент срабатывания этого входа (как указано в атрибуте Срабатывание) значение счётчика обновляется, как указано входами загрузка и счёт.
Южный край, отмечен 0 (вход, разрядность равна 1)
Очистка: если на этом входе 0 или неопределённое значение, то он не имеет эффекта. Пока на нём 1, значение счётчика асинхронно фиксируется на 0. Это происходит асинхронно - то есть вне зависимости от текущего значения на тактовом входе. Пока на нём 1, другие входы не имеют эффекта.

Атрибуты

Когда компонент выбран, или уже добавлен, комбинации от Alt-0 до Alt-9 меняют его атрибут Биты данных.

Биты данных
Разрядность значения, выдаваемого компонентом.
Максимальное значение
Максимальное значение, при котором счётчик установит в 1 значение выхода Перенос.
Действие при переполнении
Поведение, когда счётчик пытается увеличится при максимальном значении, или уменьшиться при 0. Четыре возможных действия поддерживаются:
Закольцовывать
При увеличении - следующее значение 0; при уменьшении - максимальное значение
Оставаться на значении
Значение счётчика остаётся на максимуме (или на 0 при уменьшении)
Продолжать счёт
Счётчик продолжает увеличение/уменьшение, сохраняя количество битов, указанное в атрибуте Биты данных
Загрузить следующее значение
Следующее значение загружается со входа D.
Срабатывание
Определяет, как обрабатывается тактовый вход. Значение Передний фронт означает, что счётчик должен обновляться в момент, когда значение на тактовом входе меняется с 0 на 1. Значение Задний фронт означает, что он должен обновляться, когда значение на тактовом входе меняется с 1 на 0.
Метка
Текст внутри метки, привязанной к компоненту.
Шрифт метки
Шрифт, которым отрисовывается метка.

Поведение Инструмента Нажатие

Нажатие на счётчике переводит фокус ввода клавиатуры на компонент (это отображается красным прямоугольником), и ввод шестнадцатеричных цифр будет менять значение, хранящееся в счётчике.

Поведение Инструмента Текст

Позволяет редактировать привязанную к компоненту метку.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/io/0000755000175000017500000000000011541757150016567 5ustar vincentvincentlogisim-2.7.1/doc/ru/html/libs/io/tty.html0000644000175000017500000001144511541757150020302 0ustar vincentvincent Терминал

Терминал

Библиотека: Ввод/вывод
Введён в: 2.2.0
Внешний вид:

Поведение

Этот компонент реализует очень простой терминал. Он принимает последовательность ASCII кодов и отображает каждый печатаемый символ. Если текущая строка становится полной, то курсор перемещается на следующую строку, возможно прокручивая все текущие строки вверх, если курсор уже находился в нижнем ряду. Поддерживаемые управляющие последовательности: Backspace (ASCII 8), которая удаляет последний символ в последней строке, если она не пуста; переход на следующую строку (ASCII 10), которая перемещает курсор в начало следующей строки, прокручивая строки, если необходимо; и подача страницы (ASCII 12, печатается как Control-L), которая очищает экран.

Контакты

Западный край, верхний контакт (вход, разрядность равна 7)
Данные - ASCII значение следующего символа, вводимого в терминал.
Западный край, нижний контакт, отмечен треугольником (вход, разрядность равна 1)
Тактовый вход - когда срабатывает при ненулевом значении на контакте Разрешение записи, текущее ASCII значение на входе Данные обрабатывается терминалом.
Южный край, левый контакт (вход, разрядность равна 1)
Разрешение записи - когда значение равно 1 (или плавающее, или ошибка), срабатывание тактового входа будет приводить к обработке нового символа с входа Данные. Тактовый вход и вход Данные игнорируются, когда значение на входе Разрешение записи - 0.
Южный край, второй контакт слева (вход, разрядность равна 1)
Очистка - когда значение равно 1, терминал очищается от всех данных, и все другие входы игнорируются.

Атрибуты

Строки
Количество строк, отображаемых в терминале.
Столбцы
Максимальное количество символов, отображаемых в каждой строке терминала.
Срабатывание
Если значение - Передний фронт, то когда значение тактового входа изменяется с 0 на 1, то значение с входа Данные обрабатывается (если разрешено входами Разрешение записи и Очистка). Если же значение - Задний фронт, то это происходит, когда значение тактового входа меняется с 1 на 0.
Цвет
Цвет, которым отрисовывается текст внутри терминала.
Фон
Цвет, которым отрисовывается фон терминала.

Поведение Инструмента Нажатие

Нет.

Поведение Инструмента Текст

Нет.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/io/led.html0000644000175000017500000000650711541757150020231 0ustar vincentvincent Светодиод

Светодиод

Библиотека: Ввод/вывод
Введён в: 2.1.3
Внешний вид:

Поведение

Отображает значение своего входа, подсвечивая светодиод (цветом, заданным атрибутом Цвет) или не подсвечивая, в зависимости от того, какое значение на входе - 1 или 0.

(Компонент Светодиод в основном повторяет поведение выходного контакта, за исключением несколько другого внешнего вида. Некоторые пользователи, однако, подумали, что было бы неплохо включить этот компонент в библиотеку.)

Контакты

Светодиод имеет только один контакт, 1-битный вход, который используется для определения того, следует подсвечивать светодиод (когда на входе 1) или тушить (если на входе что-то другое).

Атрибуты

Когда компонент выбран, или уже добавлен, клавиши со стрелками меняют его атрибут Направление.

Направление
Расположение входного контакта относительно компонента.
Цвет
Цвет, отображаемый, когда на входе 1.
Активен при единице?
Если да , то светодиод подсвечен, когда значение на входе 1. Если нет , то он подсвечен, когда на входе 0.
Метка
Текст внутри метки, привязанной к компоненту.
Направление метки
Расположение метки относительно компонента.
Шрифт метки
Шрифт, которым отрисовывается метка.
Цвет метки
Цвет, которым отрисовывается метка.

Поведение Инструмента Нажатие

Нет.

Поведение Инструмента Текст

Позволяет редактировать привязанную к компоненту метку.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/io/keyboard.html0000644000175000017500000001413311541757150021257 0ustar vincentvincent Клавиатура

Клавиатура

Библиотека: Ввод/вывод
Введён в: 2.2.0
Внешний вид:

Поведение

Этот компонент позволяет схеме считывать символы с клавиатуры, если только они представимы в 7-разрядном ASCII коде. После нажатия на компонент с помощью Инструмента Нажатие, пользователь может печатать символы, которые накапливаются в буфере. ASCII значение крайнего левого символа буфера постоянно поступает на крайний правый выход. Когда срабатывает тактовый вход, крайний левый символ исчезает из буфера и новый левый символ поступает на крайний правый выход.

Поддерживаемые для буфера символы включают все печатаемые ASCII символы, а также пробел, символ перехода на новую строку, Backspace и Control-L. В дополнение, клавиши стрелка влево и стрелка вправо перемещают курсор внутри буфера и клавиша Delete удаляет символ справа от курсора (если он есть).

Компонент асинхронен в том смысле, что когда буфер пуст, и пользователь печатает символ, то символ посылается на выход немедленно, не дожидаясь импульса на тактовом входе.

Контакты

Западный край, отмечен треугольником (вход, разрядность равна 1)
Тактовый вход - когда срабатывает при ненулевом значении контакта разрешения чтения, крайний левый символ буфера удаляется, и выходы обновляются чтобы отразить новое состоянию буфера.
Южный край, левый контакт (вход, разрядность равна 1)
Разрешение чтения - когда значение равно 1 (или плавающее, или ошибка), срабатывание тактового входа считает левый символ из буфера. Тактовый вход игнорируется, когда значение входа Разрешение чтения - 0.
Южный край, второй контакт слева (вход, разрядность равна 1)
Очистка - когда значение равно 1, буфер очищается и больше не принимает символов.
Южный край, второй контакт справа (выход, разрядность равна 1)
Наличие - значение равно 1, когда буфер содержит хотя бы один символ, и 0, когда буфер пуст.
Южный край, правый контакт (выход, разрядность равна 7)
Данные - 7-битный ASCII код для левого символа в буфере, или 0, если буфер пуст.

Атрибуты

Длина буфера
Количество символов, которые буфер может одновременно хранить.
Срабатывание
Если значение - Передний фронт, то когда значение тактового входа изменяется с 0 на 1, то левый символ считывается (если разрешено входом Разрешение чтения). Если же значение - Задний фронт, то это происходит, когда значение тактового входа меняется с 1 на 0.

Поведение Инструмента Нажатие

Нажатие кнопки мыши на компоненте даёт ему фокус ввода клавиатуры, и отображается вертикальный курсор.

Каждый введённый символ будет помещаться в буфер, пока буфер не достиг предела вместимости, и если символ - один из поддерживаемых компонентом: печатаемые символы ASCII кода, а также пробел, символ перехода на новую строку, Backspace и Control-L. В дополнение, пользователь может нажимать клавиши стрелка влево и стрелка вправо чтобы переместить курсор внутри буфера и клавишу Delete для удаления символ справа от курсора (если он есть).

Поведение Инструмента Текст

Нет.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/io/joystick.html0000644000175000017500000001007711541757150021321 0ustar vincentvincent Джойстик

Джойстик

Библиотека: Ввод/вывод
Введён в: 2.2.0
Внешний вид:

Поведение

Пользователь может перетаскивать красную рукоятку в пределах области, ограниченной скруглённым квадратом, и значения на выходах изменятся в соответствии с текущими х и у координатами рукоятки. Этот компонент задуман для эмуляции джойстика, известного со времён классических аркадных игр.

Контакты

Западный край, северный контакт (выход, разрядность соответствует атрибуту Разрядность)
Указывает x координату рукоятки, значение на нём следует интерпретировать как беззнаковое целое, которое никогда не может быть 0. Таким образом, значение 1 соответствует крайнему левому положению, а максимальное для разрядности значение - крайнему правому положению. Когда рукоять отпущена (находится в центре), значение имеет шаблон битов 10...00.
Западный край, южный контакт (выход, разрядность соответствует атрибуту Разрядность)
Указывает y координату рукоятки; значение находится в тех же пределах, что и для контакта x координаты. Когда рукоять поднята вверх, значение этого выхода 1, а когда рукоять опущена вниз, значение выхода равно максимальному значению для выбранной разрядности.

Атрибуты

Когда компонент выбран, или уже добавлен, комбинации от Alt-2 до Alt-5 меняют его атрибут Разрядность.

Разрядность
Число битов, используемых для отображения каждой координаты рукоятки.
Цвет
Цвет рукоятки, которым она отрисовывается на экране.

Поведение Инструмента Нажатие

Нажатие кнопки мыши в пределах области джойстика перемещает рукоятку к этому месту и обновляет выходы. Перетаскивание мыши продолжает двигать рукоятку и обновляет выходы; рукоятка остаётся в пределах области джойстика. Отпускание кнопки мыши возвращает рукоятку обратно в положение покоя.

Поведение Инструмента Текст

Нет.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/io/index.html0000644000175000017500000000434011541757150020565 0ustar vincentvincent Библиотека Ввод/вывод

Библиотека Ввод/вывод

Библиотека Ввод/вывод включает в себя компоненты, созданные как соответствия типичным электронным компонентам для взаимодействия с пользователем.

Кнопка
Джойстик
Клавиатура
Светодиод
7-сегментный индикатор
Шестнадцатеричный индикатор
Светодиодная матрица
Терминал

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/io/hexdig.html0000644000175000017500000000605311541757150020731 0ustar vincentvincent Шестнадцатеричный индикатор

Шестнадцатеричный индикатор

Библиотека: Ввод/вывод
Введён в: 2.2.0
Внешний вид:

Поведение

Используя семисегментный индикатор, показывает шестнадцатеричную цифру, соответствующую четырёхбитному входу. Если значения на каких-либо входах - не 0/1 (плавающее значение или значение ошибки), то индикатор показывает тире ('-'). Отдельный однобитный вход управляет отображением десятичной точки.

Контакты

Южный край, первый слева (вход, разрядность равна 4)
Этот вход интерпретируется как беззнаковое четырёхбитное число, и соответствующая шестнадцатеричная цифра отображается на индикаторе. Если какой-либо бит имеет плавающее значение или значение ошибки, то отображается тире ('-').
Южный край, второй слева (вход, разрядность равна 1)
Управляет десятичной точкой. Если этот вход не подключен, то десятичная точка остаётся выключенной.

Атрибуты

Цвет включенных
Цвет, используемый для отображения сегментов и десятичной точки, когда они включены.
Цвет выключенных
Цвет, используемый для отображения сегментов и десятичной точки, когда они выключены.
Фон
Цвет, которым отрисовывается фон индикатора (по умолчанию прозрачный).

Поведение Инструмента Нажатие

Нет.

Поведение Инструмента Текст

Нет.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/io/dotmat.html0000644000175000017500000001562611541757150020757 0ustar vincentvincent Светодиодная матрица

Светодиодная матрица

Библиотека: Ввод/вывод
Введён в: 2.2.0
Внешний вид:

Поведение

Отображает небольшую сетку пикселей, значения которых определяются текущими значениями на входах. Сетка может иметь до 32 строк и 32 столбцов.

Контакты

Интерфейс доступа к компоненту варьируется в зависимости от значения атрибута Формат входа. Он имеет три возможных значения.

Столбцы
Входы расположены вдоль южного края компонента; один многобитный вход для каждого столбца матрицы. Каждый вход имеет столько битов, сколько строк в матрице; младший бит соответствует южному пикселю столбца. 1 указывает подсветить соответствующий пиксель, а 0 - оставить его не подсвеченным. Если какие-либо биты в столбце имеют плавающее значение, или значение ошибки, то все пиксели в столбце горят.
Строки
Входы расположены вдоль западного края компонента; один многобитный вход для каждой строки матрицы. Каждый вход имеет столько битов, сколько столбцов в матрице; младший бит соответствует правому пикселю строки. Как и при формате Столбцы, 1 указывает подсветить соответствующий пиксель, а 0 - оставить его не подсвеченным. Если какие-либо биты в строке имеют плавающее значение, или значение ошибки, то все пиксели в строке горят.
Выбор Строки/Столбцы
Два входа на западном крае компонента. Верхний многобитный вход имеет столько битов, сколько столбцов в матрице; младший бит соответствует правому столбцу. Нижний многобитный вход имеет столько битов, сколько строк в матрице; младший бит соответствует нижней строке. Если какие-либо биты любого входа имеют плавающее значение, или значение ошибки, то все пиксели матрицы горят. В нормальной ситуации пиксель на пересечении определённых строки и столбца горит, если значение бита соответствующего столбца на верхнем входе равно 1, и значение бита соответствующей строки на нижнем входе равно 1. Например, для матрицы 5x7, если на первом входе 01010, а на втором 0111010, то второй и четвертый столбец горит для второй, третьей, четвертой и шестой строки; результат будет выглядеть как пара восклицательных знаков. (Такой формат входа может показаться неинтуитивным, но выпускаемые промышленно светодиодные матрицы имеют в точности такой интерфейс. Например, Lite-On продаёт такие компоненты.)

Атрибуты

Формат входа (только для чтения после создания компонента)
Определяет, как контакты соответствуют пикселям (как описано выше).
Столбцы матрицы
Определяет, сколько столбцов в матрице, может быть в диапазоне от 1 до 32.
Строки матрицы
Определяет, сколько строк в матрице, может быть в диапазоне от 1 до 32.
Цвет включенных
Определяет цвет горящих пикселей.
Цвет выключенных
Определяет цвет потушенных пикселей.
Продолжительность свечения
Когда это значение отлично от нуля, горящий пиксель продолжает светиться заданное число тактов после того, как входы компонента начинают указывать, что пиксель должен стать потушенным.
Форма точки
Вариант Квадратная означает, что каждый пиксель отрисовывается как квадрат 10x10, заполняя компонент без пробелов между пикселями. Вариант Круглая означает, что каждый пиксель отрисовывается как круг с диаметром 8, с пробелами между кругами. Вариант Круглая более сложен для распознавания, но он более приближен к имеющимся в продаже светодиодным матрицам.

Поведение Инструмента Нажатие

Нет.

Поведение Инструмента Текст

Нет.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/io/button.html0000644000175000017500000000537711541757150021004 0ustar vincentvincent Кнопка

Кнопка

Библиотека: Ввод/вывод
Введён в: 2.1.3
Внешний вид:

Поведение

В нормальном состоянии на выходе 0, но когда пользователь нажимает кнопку Инструментом Нажатие, на выходе 1.

Контакты

Кнопка имеет только один контакт, 1-битный выход, значение которого 0 за исключением случая, когда пользователь нажимает кнопку Инструментом Нажатие - тогда на выходе 1.

Атрибуты

Когда компонент выбран, или уже добавлен, клавиши со стрелками меняют его атрибут Направление.

Направление
Расположение выходного контакта относительно компонента.
Цвет
Цвет, которым отрисовывается кнопка.
Метка
Текст внутри метки, привязанной к компоненту.
Направление метки
Расположение метки относительно компонента.
Шрифт метки
Шрифт, которым отрисовывается метка.
Цвет метки
Цвет, которым отрисовывается метка.

Поведение Инструмента Нажатие

Когда кнопка мыши нажата, значение на выходе компонента будет 1. По отпусканию кнопки мыши значение на выходе снова становится 0.

Поведение Инструмента Текст

Позволяет редактировать привязанную к компоненту метку.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/io/7seg.html0000644000175000017500000001030611541757150020322 0ustar vincentvincent 7-сегментный индикатор

7-сегментный индикатор

Библиотека: Ввод/вывод
Введён в: 2.1.3
Внешний вид:

Поведение

Отображает значения восьми своих однобитных входов. Сегменты либо подсвечены цветом, либо светло-серого цвета в зависимости от входных данных. Соответствие следующее.

(Производители по-разному подводят входы к сегментам; соответствие, использованное здесь, основано на индикаторе TIL321 от Texas Instruments.)

Контакты

Северный край, первый слева (вход, разрядность равна 1)
Управляет средним горизонтальным сегментом.
Северный край, второй слева (вход, разрядность равна 1)
Управляет верхним вертикальным сегментом на левой стороне.
Северный край, третий слева (вход, разрядность равна 1)
Управляет верхним горизонтальным сегментом.
Северный край, четвёртый слева (вход, разрядность равна 1)
Управляет верхним вертикальным сегментом на правой стороне.
Южный край, первый слева (вход, разрядность равна 1)
Управляет нижним вертикальным сегментом на левой стороне.
Южный край, второй слева (вход, разрядность равна 1)
Управляет нижним горизонтальным сегментом.
Южный край, третий слева (вход, разрядность равна 1)
Управляет нижним вертикальным сегментом на правой стороне.
Южный край, четвёртый слева (вход, разрядность равна 1)
Управляет десятичной точкой.

Атрибуты

Цвет включенных
Цвет, используемый для отображения сегментов и десятичной точки, когда они включены.
Цвет выключенных
Цвет, используемый для отображения сегментов и десятичной точки, когда они выключены.
Фон
Цвет, которым отрисовывается фон индикатора (по умолчанию прозрачный).
Активен при единице?
Если да , то сегменты горят, когда значение на соответствующем входе 1. Если нет, то они горят, когда значение на соответствующем входе 0.

Поведение Инструмента Нажатие

Нет.

Поведение Инструмента Текст

Нет.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/index.html0000644000175000017500000003602211541757150020160 0ustar vincentvincent Справка по библиотеке

Справка по библиотеке

Библиотека Logisim содержит набор инструментов для взаимодействия со схемой с помощью щелчков и перетаскиваний мышью в области холста. Чаще всего инструмент предназначен для добавления компонентов того или иного вида в схему, но некоторые из наиболее важных инструментов, такие как Инструмент Нажатие и Инструмент Выбор, позволяют пользователям взаимодействовать с компонентами и другими способами.

Все инструменты, включенные во встроенную библиотеку Logisim, представлены в этом справочном материале.

Библиотека Проводка
Разветвитель
Контакт
Датчик
Тоннель
Согласующий резистор
Тактовый генератор
Константа
Питание/Земля
Транзистор
Передаточный вентиль
Расширитель битов

Библиотека Элементы

Элемент НЕ
Буфер

Элементы И/ИЛИ/И-НЕ/ИЛИ-НЕ

Элементы Исключающее ИЛИ/Исключающее ИЛИ-НЕ/Нечётность/Чётность
Управляемый буфер/инвертор

Библиотека Плексоры
Мультиплексор
Демультиплексор
Декодер
Шифратор приоритетов
Селектор битов

Библиотека Арифметика
Сумматор
Вычитатель
Множитель
Делитель
Отрицатель
Компаратор
Сдвигатель
Сумматор битов
Искатель битов

Библиотека Память
D/T/J-K/S-R триггеры
Регистр
Счётчик
Сдвиговый регистр
Генератор случайных чисел
ОЗУ
ПЗУ

Библиотека Ввод/вывод
Кнопка
Джойстик
Клавиатура
Светодиод
7-сегментный индикатор
Шестнадцатеричный индикатор
Светодиодная матрица
Терминал

Библиотека Базовые
Инструмент Нажатие
Инструмент Правка
Инструмент Выбор
Инструмент Проводка
Инструмент Текст
Инструмент Меню
Метка
logisim-2.7.1/doc/ru/html/libs/gates/0000755000175000017500000000000011541757150017263 5ustar vincentvincentlogisim-2.7.1/doc/ru/html/libs/gates/xor.html0000644000175000017500000003236311541757150020770 0ustar vincentvincent Элементы Исключающее ИЛИ/Исключающее ИЛИ-НЕ/Нечётность/Чётность

Элементы Исключающее ИЛИ/Исключающее ИЛИ-НЕ/Нечётность/Чётность

Библиотека: Элементы
Введён в: 2.0 Beta 1 для Исключающее ИЛИ/Нечётность/Чётность; 2.0 Beta 6 для Исключающее ИЛИ-НЕ
Внешний вид:
Исключающее ИЛИ Исключающее ИЛИ-НЕ Нечётность Чётность
Фигурные:
Прямоугольные:

Поведение

Элементы Исключающее ИЛИ, Исключающее ИЛИ-НЕ, Нечётность и Чётность вычисляют соответствующую функцию от значений на входах и выдают результат на выход.

По умолчанию, неподключенные входы игнорируются - то есть, если входы действительно не имеют ничего подключенного к ним - даже провода. Таким образом, вы можете добавить 5-входовый элемент, но подключить только два входа, и он будет работать как 2-входовый элемент; это избавляет вас от необходимости беспокоиться о настройке количества входов каждый раз при создании элемента. (Если все входы не подключены, то на выходе значение ошибки X.) Некоторые пользователи, однако, предпочитают, чтобы Logisim настаивал, чтобы все входы были подключены, поскольку это соответствует реальным элементам. Вы можете включить это поведение, выбрав меню Проект > Параметры…, перейдя на вкладку Моделирование, и выбрав вариант Ошибка для неопределённых входов для Выход элемента при неопределённости.

Двухвходовая таблица истинности для элементов следующая.

xyИсключающее ИЛИ Исключающее ИЛИ-НЕНечётностьЧётность
00 01 01
01 10 10
10 10 10
11 01 01

Как вы можете видеть, элементы Нечётность и Исключающее ИЛИ ведут себя одинаково в случае двух входов; аналогично, элементы Чётность и Исключающее ИЛИ-НЕ ведут себя одинаково. Но если входов с определённым значением больше двух, то элемент Исключающее ИЛИ будет давать на выходе 1, когда единица строго на одном входе, тогда как элемент Нечётность даст на выходе 1, когда единица на нечётном количестве входов. Элемент Исключающее ИЛИ-НЕ будет давать на выходе 1, когда входов с единицей строго не один, тогда как элемент Чётность даст 1, когда входов с единицей чётное количество. Элементы Исключающее ИЛИ и Исключающее ИЛИ-НЕ имеют атрибут, названный Многовходовое поведение, который позволяет настроить их на использование поведения элементов Нечётность и Чётность.

Если на каких-либо входах значение ошибки (например, если противоречивые значения поступают на один и тот же провод) или плавающее значение, то на выходе будет значение ошибки.

Многобитные версии каждого элемента будут выполнять свои однобитные преобразования над входами поразрядно.

Примечание: многие специалисты утверждают, что поведение фигурного элемента Исключающее ИЛИ должно соответствовать поведению элемента Нечётность, но по этому вопросу нет согласия. Поведение Logisim по умолчанию для элемента Исключающее ИЛИ основано на стандарте IEEE 91. Это также согласуется с интуитивным пониманием термина Исключающее ИЛИ: официант, спрашивающий, хотите вы гарнир из картофельного пюре, моркови, зеленого горошка, или шинкованной капусты, примет только один выбор, а не три, независимо от того, что вам могут сказать некоторые специалисты. (Должен признать, однако, что я не подвергал это заявление серьезным испытаниям.) Вы можете настроить элементы Исключающее ИЛИ и Исключающее ИЛИ-НЕ на использование одного из вариантов, меняя его атрибут Многовходовое поведение.

Контакты (предполагается, что компонент направлен на восток)

Западный край (входы, разрядность соответствует атрибуту Биты данных)

Входы компонента. Их будет столько, сколько указано в атрибуте Количество входов.

Заметьте, что если вы используете фигурные элементы, то западный край элементов Исключающее ИЛИ и Исключающее ИЛИ-НЕ будет искривлён. Тем не менее, входные контакты расположены вряд. Logisim отрисовывает короткие отрезки чтобы показать это; если вы перекроете отрезок, программа будет без предупреждений предполагать, что вы не хотели перекрыть его. При использовании "Вида для печати", эти отрезки не будут отрисованы, если не подключены к проводам.

Восточный край (выход, разрядность соответствует атрибуту Биты данных)

Выход элемента, значение на котором вычисляется на основании текущих значений на входах, как описано выше.

Атрибуты

Когда компонент выбран, или уже добавлен, клавиши от 0 до 9 меняют его атрибут Количество входов, комбинации от Alt-0 до Alt-9 меняют его атрибут Биты данных, а клавиши со стрелками меняют его атрибут Направление.

Направление
Направление компонента (его выхода относительно его входов).
Биты данных
Разрядность входов и выходов компонента.
Размер элемента
Определяет, следует отрисовывать широкую или узкую версию компонента. Это не влияет на количество входов, которое определяется атрибутом Количество входов; правда, если количество входов превышает 3 (для узкого компонента) или 5 (для широкого), то элемент будет отрисовываться с "крыльями", чтобы вместить запрошенное количество входов.
Количество входов
Определяет, сколько контактов на западном крае будет иметь компонент.
Выходное значение
Указывает, как результаты "ложь" и "истина" будут переведены в выходные значения. По умолчанию "ложь" обозначается напряжением низкого уровня (0), а "истина" - напряжением высокого уровня (1), но одно из них может быть заменено высокоимпедансным (плавающим) значением. Это позволяет создавать соединения "монтажное ИЛИ" и "монтажное И", как показано в статье документации Элементы И/ИЛИ/И-НЕ/ИЛИ-НЕ.
Метка
Текст внутри метки, привязанной к элементу.
Шрифт метки
Шрифт, которым отрисовывается метка.
Многовходовое поведение (только для Исключающее ИЛИ и Исключающее ИЛИ-НЕ)
Когда входов три или более, то значение на выходе элементов Исключающее ИЛИ и Исключающее ИЛИ-НЕ будет основано или на том, что 1 строго на одном входе (по умолчанию), или на нечётном количестве входов.

Поведение Инструмента Нажатие

Нет.

Поведение Инструмента Текст

Позволяет редактировать привязанную к элементу метку.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/gates/not.html0000644000175000017500000001154011541757150020752 0ustar vincentvincent Элемент НЕ

Элемент НЕ

Библиотека: Элементы
Введён в: 2.0 Beta 1
Внешний вид:
Фигурные:
Прямоугольные:

Поведение

Элемент НЕ выдаёт на выход дополнение для того, что поступает на его вход. Таблица истинности для элемента НЕ следующая.

xвыход
01
10

Если значение на входе не определено (например плавающее), то значение на выходе тоже будет не определено, если только параметр "Выход элемента при неопределённости" не имеет значения "Ошибка для неопределённых входов" - в таком случае на выходе будет ошибка. Если на входе значение ошибки, то на выходе будет тоже оно.

Многобитный элемент НЕ будет выполнять указанные выше преобразования над значением на входе поразрядно.

Контакты (предполагается, что компонент направлен на восток)

Западный край (вход, разрядность соответствует атрибуту Биты данных)
Вход компонента.
Восточный край (выход, разрядность соответствует атрибуту Биты данных)
Выход, значение на котором будет дополнением для значения на входе.

Атрибуты

Когда компонент выбран, или уже добавлен, комбинации от Alt-0 до Alt-9 меняют его атрибут Биты данных, а клавиши со стрелками меняют его атрибут Направление.

Направление
Направление компонента (его выхода относительно его входа).
Биты данных
Разрядность входа и выхода компонента.
Размер элемента
Определяет следует отрисовывать большую или меньшую версию компонента.
Выходное значение
Указывает, как результаты "ложь" и "истина" будут переведены в выходные значения. По умолчанию "ложь" обозначается напряжением низкого уровня (0), а "истина" - напряжением высокого уровня (1), но одно из них может быть заменено высокоимпедансным (плавающим) значением. Это позволяет создавать соединения "монтажное ИЛИ" и "монтажное И", как показано в статье документации Элементы И/ИЛИ/И-НЕ/ИЛИ-НЕ.
Метка
Текст внутри метки, привязанной к элементу.
Шрифт метки
Шрифт, которым отрисовывается метка.

Поведение Инструмента Нажатие

Нет.

Поведение Инструмента Текст

Позволяет редактировать привязанную к элементу метку.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/gates/index.html0000644000175000017500000000634411541757150021267 0ustar vincentvincent Библиотека Элементы

Библиотека Элементы

Библиотека Элементы включает в себя множество простых компонентов, которые имеют один выход, значение на котором полностью определяется значениями на входах.


Элемент НЕ
Буфер

Элементы И/ИЛИ/И-НЕ/ИЛИ-НЕ

Элементы Исключающее ИЛИ/Исключающее ИЛИ-НЕ/Нечётность/Чётность
Управляемый буфер/инвертор

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/gates/controlled.html0000644000175000017500000001350511541757150022322 0ustar vincentvincent Управляемый буфер/инвертор

Управляемый буфер/инвертор

Библиотека: Элементы
Введён в: 2.0 Beta 1
Внешний вид:

Поведение

Управляемые буфер и инвертор, часто называемые буфер/инвертор с тремя состояниями, имеют однобитный входной контакт на южном крае. Значение на этот управляющем контакте определяет поведение компонента:

  • Когда значение на этом контакте 1, компонент ведёт себя просто как соответствующий компонент (буфер или инвертор (элемент НЕ)).
  • Если же значение равно 0 или неизвестно (например, плавающее), то значение на выходе компонента тоже плавающее.
  • Когда значение - значение ошибки (такое может случится, когда два противоречивых значения поступают на вход), то на выходе - тоже значение ошибки.

Управляемые буферы могут быть полезны, когда у вас есть провод (часто называемый шина), значение на котором должно соответствовать выходу одного из нескольких компонентов. Размещая управляемый буфер между выходом каждого компонента и шиной, вы можете управлять тем, подаётся выход этого компонента на шину, или нет.

Контакты (предполагается, что компонент направлен на восток, управляющий вход - по правую руку)

Западный край (вход, разрядность соответствует атрибуту Биты данных)
Вход компонента, который будет использован для вычисления значения на выходе, если на управляющем входе 1.
Южный край (вход, разрядность равна 1)
Управляющий вход компонента.
Восточный край (выход, разрядность соответствует атрибуту Биты данных)
Выход компонента, значение на котором будет плавающим, если на управляющем входе 0 или плавающее значение; значение ошибки, если на управляющем входе значение ошибки; или будет вычислено на основе значения западного входа, если на управляющем входе 1.

Атрибуты

Когда компонент выбран, или уже добавлен, комбинации от Alt-0 до Alt-9 меняют его атрибут Биты данных, а клавиши со стрелками меняют его атрибут Направление.

Направление
Направление компонента (его выхода относительно его входа).
Биты данных
Разрядность входов и выходов компонента.
Размер элемента
(Только для управляемого инвертора) Определяет следует отрисовывать большую или меньшую версию компонента.
Расположение управляющего входа
Расположение управляющего входа, если представить, что мы смотрим со стороны входа на выход: если компонент направлен на восток и значение атрибута - По правую руку, то управляющий вход на юге; а если По левую руку, то на севере.
Метка
Текст внутри метки, привязанной к элементу.
Шрифт метки
Шрифт, которым отрисовывается метка.

Поведение Инструмента Нажатие

Нет.

Поведение Инструмента Текст

Позволяет редактировать привязанную к элементу метку.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/gates/buffer.html0000644000175000017500000001174311541757150021430 0ustar vincentvincent Буфер

Буфер

Библиотека: Элементы
Введён в: 2.0 Beta 1
Внешний вид:

Поведение

Буфер просто пропускает на свой правый выход значение, полученное на входе с левой стороны. Таблица истинности для однобитного буфера следующая.

xвыход
00
11

Если значение на входе не определено (например плавающее), то значение на выходе тоже будет не определено, если только параметр "Выход элемента при неопределённости" не имеет значения "Ошибка для неопределённых входов" - в таком случае на выходе будет ошибка. Если на входе значение ошибки, то на выходе будет тоже оно.

Буферы - самый бесполезный из элементов, предусмотренных в Logisim; его присутствие в библиотеке Элементы скорее вопрос полноты (компонент для каждой возможной одновходовой таблицы истинности), чем вопрос предоставления полезной функциональности. Тем не менее, он может быть иногда полезен для уверенности в том, что значение передаётся по проводу только в одном направлении.

Контакты (предполагается, что компонент направлен на восток)

Западный край (вход, разрядность соответствует атрибуту Биты данных)
Вход компонента.
Восточный край (выход, разрядность соответствует атрибуту Биты данных)
Выход, значение на котором всегда совпадает со значением на входе с левой стороны.

Атрибуты

Когда компонент выбран, или уже добавлен, комбинации от Alt-0 до Alt-9 меняют его атрибут Биты данных, а клавиши со стрелками меняют его атрибут Направление.

Направление
Направление компонента (его выхода относительно его входа).
Биты данных
Разрядность входов и выходов компонента.
Выходное значение
Указывает, как результаты "ложь" и "истина" будут переведены в выходные значения. По умолчанию "ложь" обозначается напряжением низкого уровня (0), а "истина" - напряжением высокого уровня (1), но одно из них может быть заменено высокоимпедансным (плавающим) значением. Это позволяет создавать соединения "монтажное ИЛИ" и "монтажное И", как показано в статье документации Элементы И/ИЛИ/И-НЕ/ИЛИ-НЕ.
Метка
Текст внутри метки, привязанной к элементу.
Шрифт метки
Шрифт, которым отрисовывается метка.

Поведение Инструмента Нажатие

Нет.

Поведение Инструмента Текст

Позволяет редактировать привязанную к элементу метку.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/gates/basic.html0000644000175000017500000003076211541757150021242 0ustar vincentvincent Элементы И/ИЛИ/И-НЕ/ИЛИ-НЕ

Элементы И/ИЛИ/И-НЕ/ИЛИ-НЕ

Библиотека: Элементы
Введён в: 2.0 Beta 1
Внешний вид:
И ИЛИ И-НЕ ИЛИ-НЕ
Фигурные:
Прямоугольные:
DIN 40700:

Поведение

Элементы И, ИЛИ, И-НЕ, ИЛИ-НЕ вычисляют соответствующую функцию от значений на входах и выдают результат на выход.

По умолчанию, неподключенные входы игнорируются - то есть, если входы действительно не имеют ничего подключенного к ним - даже провода. Таким образом, вы можете добавить 5-входовый элемент, но подключить только два входа, и он будет работать как 2-входовый элемент; это избавляет вас от необходимости беспокоиться о настройке количества входов каждый раз при создании элемента. (Если все входы не подключены, то на выходе значение ошибки X.) Некоторые пользователи, однако, предпочитают, чтобы Logisim настаивал, чтобы все входы были подключены, поскольку это соответствует реальным элементам. Вы можете включить это поведение, выбрав меню Проект > Параметры…, перейдя на вкладку Моделирование, и выбрав вариант Ошибка для неопределённых входов для Выход элемента при неопределённости.

Двухвходовая таблица истинности для элементов следующая. (Буква X обозначает значение ошибки, а буква Z обозначает плавающее значение.)

И
01X/Z
0000
101X
X/Z0XX
   
ИЛИ
01X/Z
001X
1111
X/ZX1X
И-НЕ
01X/Z
0111
110X
X/Z1XX
   
ИЛИ-НЕ
01X/Z
010X
1000
X/ZX0X

Короче говоря, эти компоненты работают как ожидается, пока на всех входах 0 или 1. Если на входе не 0 и не 1 (он плавающий или на нём значение ошибки), то компонент относится к этому значению как к 0 и 1 одновременно: если значение на выходе будет одинаковым в обоих случаях (например, если на одном из входов элемента И определённо 0, а значение на втором входе под вопросом), то выходное значение будет присутствовать; но если выход изменяется в зависимости от того, что на входе - 0 или 1, то на выходе будет значение ошибки.

Многобитные версии каждого элемента будут выполнять свои однобитные преобразования над входами поразрядно.

Контакты (предполагается, что компонент направлен на восток)

Западный край (входы, разрядность соответствует атрибуту Биты данных)

Входы компонента. Их будет столько, сколько указано в атрибуте Количество входов.

Заметьте, что если вы используете фигурные элементы, то западный край элементов ИЛИ и ИЛИ-НЕ будет искривлён. Тем не менее, входные контакты расположены вряд. Logisim отрисовывает короткие отрезки чтобы показать это; если вы перекроете отрезок, программа будет без предупреждений предполагать, что вы не хотели перекрыть его. При использовании "Вида для печати", эти отрезки не будут отрисованы, если не подключены к проводам.

Восточный край (выход, разрядность соответствует атрибуту Биты данных)

Выход элемента, значение на котором вычисляется на основании текущих значений на входах, как описано выше.

Атрибуты

Когда компонент выбран, или уже добавлен, клавиши от 0 до 9 меняют его атрибут Количество входов, комбинации от Alt-0 до Alt-9 меняют его атрибут Биты данных, а клавиши со стрелками меняют его атрибут Направление.

Направление
Направление компонента (его выхода относительно его входов).
Биты данных
Разрядность входов и выходов компонента.
Размер элемента
Определяет, следует отрисовывать широкую или узкую версию компонента. Это не влияет на количество входов, которое задаётся атрибутом Количество входов. Однако, если выбраны фигурные элементы, то элемент будет отрисован с крыльями, чтобы вместить дополнительные входы помимо тех, которые фигура может вместить естественным образом.
Количество входов
Определяет, сколько контактов на западном крае будет иметь компонент.
Выходное значение
Указывает, как результаты "ложь" и "истина" будут переведены в выходные значения. По умолчанию "ложь" обозначается напряжением низкого уровня (0), а "истина" - напряжением высокого уровня (1), но одно из них может быть заменено высокоимпедансным (плавающим) значением. Это позволяет создавать соединения "монтажное ИЛИ" и "монтажное И", как показано ниже: слева у буферов значение атрибута Выходное значение - "плавающее/1", а направление согласования резистора - ноль, в итоге схема ведёт себя как монтажное ИЛИ; справа у буферов значение атрибута Выходное значение - "0/плавающее", а направление согласования резистора - единица, в итоге схема ведёт себя как монтажное И.
Метка
Текст внутри метки, привязанной к элементу.
Шрифт метки
Шрифт, которым отрисовывается метка.
Инвертировать x
Если Да, то значение на входе инвертируется до подачи на элемент. Входы считаются сверху вниз, если компонент направлен на восток или запад, и считаются слева направо, если он направлен на север или юг.

Поведение Инструмента Нажатие

Нет.

Поведение Инструмента Текст

Позволяет редактировать привязанную к элементу метку.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/base/0000755000175000017500000000000011541757150017072 5ustar vincentvincentlogisim-2.7.1/doc/ru/html/libs/base/wiring.html0000644000175000017500000001403311541757150021260 0ustar vincentvincent Инструмент Проводка

Инструмент Проводка

Библиотека: Базовые
Введён в: 2.0 Beta 1

Поведение

Инструмент Проводка - это инструмент для для создания сегментов проводов, которые передают значения из одного конца в другой. Разрядность этих значений может быть любой; какой конкретно - определяется компонентами, к которым провод присоединён. Если он не присоединён к какому-либо компоненту, то провод будет отрисован серым, чтобы показать, что его разрядность неизвестна; если разрядность компонентов, которые провод соединяет, не согласована, то провод будет отрисован оранжевым, чтобы указать на конфликт, и провод не будет передавать какие-либо значения совсем, пока пользователь не разрешит конфликт.

Однократное перетаскивание мыши может создать несколько сегментов провода. Точное описание процесса немного запутывает, но это работает достаточно интуитивно на практике: если вы запрашиваете определённый сегмент провода используя Инструмент Проводка, то этот сегмент будет разделён во всех точках, где он касается контакта существующего компонента, или точках, где он касается концов существующего сегмента провода. Кроме того, если конечная точка любого из новых сегментов провода касается где-то посередине существующего провода, то тот провод будет разделён на несколько сегментов.

Для некоторых компонентов, которые рисуют короткие отрезки, к которым могут быть подключены провода (таких как Элемент ИЛИ и Управляемый буфер), Logisim будет без напоминаний поправлять попытки создания проводов, слегка перекрывающих отрезки.

Вы также можете укоротить существующий сегмент провода с помощью Инструмента Проводка, используя перетаскивание, начинающееся в одном из концов сегмента и частично перекрывающее данный сегмент.

Все провода в Logisim либо горизонтальные, либо вертикальные.

Провода также не направленные; то есть они передают значения из обеих своих конечных точек в другую. Действительно, провод может передавать значения в обоих направлениях одновременно; центральный провод в примере ниже делает это.

Атрибуты

Инструмент Проводка сам по себе не имеет атрибутов, но провода, которые он создаёт - имеют.

Направление
Указывает, является провод горизонтальным или вертикальным. Значение этого атрибута не может быть изменено.
Длина
Показывает длину этого провода в пикселях. Значение этого атрибута не может быть изменено.

Поведение Инструмента Нажатие

Когда вы щёлкаете на существующем сегменте провода, используя Инструмент Нажатие, Logisim показывает текущее значение, передаваемое через этот провод. На практике такое поведение полезно для многобитных проводов, чёрный цвет которых не предоставляет никакой информации о том, какое значение передаёт провод.

Для многобитных значений вы можете настроить, как отображается значение (в двоичном, десятичном или шестнадцатеричном виде, например), используя вкладку Чертёж диалогового окна Настройки Logisim.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/base/text.html0000644000175000017500000000734011541757150020750 0ustar vincentvincent Инструмент Текст

Инструмент Текст

Библиотека: Базовые
Введён в: 2.0 Beta 1

Поведение

Инструмент Текст позволяет создавать и редактировать метки, привязанные к компонентам. Какие компоненты поддерживают метки, указано в разделе "Поведение Инструмента Текст" их документации. По состоянию на текущий релиз, следующие компоненты во встроенных библиотеках поддерживают метки.

Библиотека Базовые Контакт
Тактовый генератор
Метка
Датчик
Библиотека Память D/T/JK/SR триггер
Регистр
Счётчик
Сдвиговый регистр
Генератор случайных чисел
Библиотека Ввод/вывод Кнопка
Индикатор

Для компонентов, которые могут иметь метку, но не имеют её в данный момент, вы можете щёлкнуть внутри компонента чтобы добавить метку. Если же метка уже есть, то вам нужно щёлкнуть внутри метки. Если вы щёлкните в точке, где в данный момент нет метки для редактирования, то Logisim инициирует добавление нового компонента Метка.

В текущей версии Logisim функции редактирования текста всё ещё довольно примитивны. Выделения области текста внутри метки невозможны. Нет способа вставить знак перехода на следующую строку в метку.

Атрибуты

Атрибуты для инструмента такие же, как для компонента Метка. Эти атрибуты не действуют в режиме редактирования метки существующего компонента, но они действуют для любых меток, созданных с использованием Инструмента Текст.

При нажатии на компонент, поддерживающий Инструмент Текст, будут отображены атрибуты компонента.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/base/select.html0000644000175000017500000001673011541757150021246 0ustar vincentvincent Инструмент Выбор

Инструмент Выбор

Библиотека: Базовые
Введён в: 2.0 Beta 1

Поведение

Позволяет помещать отдельные компоненты в текущее выделение. Есть ряд действий, возможных с помощью этого инструмента.

  • Нажатие кнопки мыши, пока она внутри выбранного в данный момент компонента, начинает перетаскивание всех компонентов выделения.

    По умолчанию Logisim будет вычислять способ добавить новые провода так, чтобы никакие существующие соединения не рвались при перемещении. (Иногда он будет удалять или укорачивать существующие провода.) Если вы выполняете перемещение, для которого вы не хотите выполнения этих изменений, вы можете нажать клавишу Shift при перемещении. Если вы хотите полностью выключить это поведение, выберите Проект > Параметры..., перейдите на вкладку Холст, и снимите флажок Сохранять соединения при перемещении; в этом случае соединения вычисляются, только когда клавиша Shift нажата.

    Перемещение выделения может привести к неожиданному поведению проводов: если вы перетащите выделение, содержащее провода, поверх других проводов, то все провода будут соединены и помещены в выделение. В результате, если вы перетащите выделение второй раз, то провода, бывшие в этом месте до этого, не будут оставаться на месте. Такое поведение необходимо, чтобы сохранить поведение проводов в Logisim предсказуемым. И это обычно не представляют собой серьезную проблему: Logisim будет полностью переносить выделение туда, куда вы его перетащили, и вам не следует отпускать его, пока вы не уверены, что оно находится в правильном месте.

  • В противном случае, при нажатии мыши в пределах компонента сбрасываются все компоненты из текущего выделения и вместо них выбирается компонент(ы), содержащий точку нажатия.

  • Нажатие мыши с зажатой клавишей Shift внутри компонента переключает присутствие/отсутствие компонента в выделении. Если несколько компонентов содержат эту точку, то присутствие/отсутствие всех этих компонентов будет переключено. Ничего из этого не произойдёт, впрочем, если нажатие мыши с зажатой клавишей Shift привязано к другому инструменту (через вкладку Мышь окна параметров проекта).

  • Перетаскивание мыши, начинающееся с точки, не находящейся внутри какого-либо компонента, обнуляет текущее выделение и инициирует прямоугольное выделение. Все компоненты, находящиеся в прямоугольнике, будут помещены в выделение.

  • Перетаскивание мыши с зажатой клавишей Shift, начинающееся с точки, не находящейся внутри какого-либо компонента, инициирует прямоугольное выделение. Присутствие/отсутствие в выделении всех компонентов, находящихся в прямоугольнике, будет переключено. Ничего из этого не произойдёт, впрочем, если нажатие мыши с зажатой клавишей Shift привязано к другому инструменту.

После выделения необходимых объектов, можно, конечно, вырезать/копировать/вставить/удалить все объекты, через меню Правка.

Поведение Logisim при вставке из буфера обмена в схему несколько своеобразно: он не сразу поместит компоненты в схему; вместо этого выделение будет состоять из набора "призраков", которые будут добавлены в схему, как только они либо будут перетащены в другое место, либо удалены из выделения. (Это своеобразное поведение необходимо, поскольку в противном случае вставка объединит провода выделения и текущей схемы, а провода, находившиеся там раньше, будут перетаскиваться со вставленным буфером, если пользователь захочет переместить вставленные компоненты куда-то ещё.)

Атрибуты

Нет. Выбор компонента, впрочем, покажет его атрибуты. Если несколько компонентов выбраны, то атрибуты, общие для всех, будут показаны: пустыми, если они имеют разные значения, в противном случае - с общими для них значениями. (Провода игнорируются, если в выделении есть что-то кроме проводов.) Изменения значения атрибута влияют на все выбранные компоненты.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/base/poke.html0000644000175000017500000000546411541757150020727 0ustar vincentvincent Инструмент Нажатие

Инструмент Нажатие

Библиотека: Базовые
Введён в: 2.0 Beta 1

Поведение

Инструмент Нажатие служит для работы с текущими значениями, связанными с компонентами. Точное поведение Инструмента Нажатие варьируется в зависимости от того, на каком компоненте он применён; это поведение описано в разделе "Поведение Инструмента Нажатие" каждого отдельного компонента. Все следующие компоненты имеют поддержку Инструмента Нажатие.

Библиотека Базовые Контакт
Тактовый генератор
Библиотека Память D/T/J-K/S-R триггеры
Регистр
Счётчик
Сдвиговый регистр
ОЗУ
ПЗУ
Библиотека Ввод/вывод Кнопка
Джойстик
Клавиатура

Кроме того, нажатие на сегменте провода с помощью Инструмента Нажатие отображает значение, передаваемое проводом в данный момент, как описано на странице Инструмент Проводка .

Атрибуты

Нет. При нажатии на компоненте, поддерживающем Инструмент Нажатие, однако, будут отображены атрибуты компонента.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/base/menu.html0000644000175000017500000000636111541757150020732 0ustar vincentvincent Инструмент Меню

Инструмент Меню

Библиотека: Базовые
Введён в: 2.0 Beta 1

Поведение

Инструмент Меню позволяет пользователю вызвать всплывающее меню для уже существующих компонентов. По умолчанию щелчок правой кнопкой мыши или щелчок с зажатой клавишей Control на компоненте будет вызывать это всплывающее меню; впрочем, вкладка Мышь в параметрах проекта позволяет пользователю настроить кнопки мыши чтобы они работали по-другому.

Всплывающее меню для большинства компонентов состоит из двух элементов.

  • Удалить: удалить компонент из схемы.
  • Показать атрибуты: поместить атрибуты компонента в таблицу атрибутов окна, так что значения атрибутов могут быть просмотрены и изменены.

Для некоторых компонентов, впрочем, меню имеет дополнительные элементы. Подсхемы (то есть случаи использования одной схемы как "чёрного ящика" внутри другой) - один из таких примеров: в дополнение к двум вышеуказанным элементам всплывающее меню включает ещё один пункт.

  • Рассмотреть XXX: сменить просматриваемый и редактируемый чертёж схемы на чертёж определённой подсхемы. Значения, наблюдаемые на чертеже, будут частью той же иерархии, что у вышестоящей схемы. (См. раздел "Отладка подсхем" Руководства пользователя.)

Другие компоненты тоже могут расширять всплывающее меню. Во встроенных библиотеках текущей версии Logisim это только компоненты ОЗУ и ПЗУ.

Атрибуты

Нет.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/base/label.html0000644000175000017500000001101411541757150021034 0ustar vincentvincent Метка

Метка

Библиотека: Базовые
Введён в: 2.0 Beta 1
Внешний вид:

Поведение

Это простая текстовая надпись, которая может быть размещена в любом месте схемы. Она никаким образом не взаимодействует со значениями, проходящими через схему, за исключением того, что она будет видна, когда схема отрисована.

В отличие от всех других компонентов встроенных библиотек на данный момент, метки можно размещать в любом месте на холсте, они не привязываются к сетке.

Контакты

Нет.

Атрибуты

Текст
Текст, размещаемый на метке. Это значение можно изменять в таблице атрибутов, или, используя Инструмент Текст, на холсте.
Шрифт
Шрифт, используемый при отрисовке метки.
Горизонтальное выравнивание
Метод горизонтального выравнивания для текста по отношению к официальному расположению метки (тому месту, где произошло нажатие мыши при создании метки). "Левое" означает, что текст должен быть отрисован так, чтобы его левый край находился в этом месте; "правое" означает, что текст должен быть отрисован так, чтобы его правый край находился в этом месте; и "по центру" означает, что текст должен быть отрисован так, чтобы его центр (горизонтальный) находился в этом месте.
Вертикальное выравнивание

Метод вертикального выравнивания для текста по отношению к официальному расположению метки (тому месту, где произошло нажатие мыши при создании метки). "По базовой" означает, что базовая линия должна пересекать это место; "По верху" означает, что верх текста должен пересекать это место; "По низу" означает, что низ текста должен пересекать это место; "По центру" означает, что текст должен быть центрирован (вертикально) по этому месту.

Верх и низ текста вычисляется на основе стандартных значений высоты верхней планки высоких и нижней планки низких букв шрифта, поэтому, даже если сам текст не содержит высоких букв (таких как б ) или низких букв (таких как у ), в целях вертикального позиционирования предполагается, что такие буквы содержатся.

Поведение Инструмента Нажатие

Нет.

Поведение Инструмента Текст

Позволяет редактировать текст, содержащийся в метке.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/base/index.html0000644000175000017500000000355511541757150021077 0ustar vincentvincent Библиотека Базовые

Библиотека Базовые

Библиотека Базовые содержит инструменты общего назначения.

Инструмент Нажатие
Инструмент Правка
Инструмент Выбор
Инструмент Проводка
Инструмент Текст
Инструмент Меню
Метка

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/base/edit.html0000644000175000017500000003243511541757150020714 0ustar vincentvincent Инструмент Правка

Инструмент Правка

Библиотека: Базовые
Введён в: 2.3.0

Поведение

Инструмент Правка позволяет изменять существующие компоненты и добавлять провода. Что в точности делает инструмент, зависит от того, где на холсте пользователь нажимает мышью.

  • Если мышь находится над точкой подключения провода существующего компонента, или над проводом, то Инструмент Правка отобразит маленький зеленый кружок вокруг места расположения курсора. Нажатие кнопки в этом месте инициирует добавление нового провода. Но если пользователь не перетащит мышь достаточно далеко, чтобы создать провод, перед тем, как отпустит кнопку, то нажатие рассматривается как простое нажатие мыши, так что провод просто добавится к текущему выделению.

    Разрядность добавленного провода определяется компонентами, к которым он подключен. Если он не присоединён к какому-либо компоненту, то провод будет отрисован серым, чтобы показать, что его разрядность неизвестна; если разрядность компонентов, которые провод соединяет, не согласована, то провод будет отрисован оранжевым, чтобы указать на конфликт, и провод не будет передавать какие-либо значения совсем, пока пользователь не разрешит конфликт.

    Все провода в Logisim либо горизонтальные, либо вертикальные; диагональных не бывает.

    Провода не направленные, то есть они передают значения из обеих своих конечных точек в другую. Действительно, провод может передавать значения в обоих направлениях одновременно: в приведенном ниже примере бит проходит из верхнего входа слева через центральный провод, затем он проходит обратно через центральный провод, и снова в прямом направлении через центральный провод, пока не достигнет выхода справа вверху.

    Однократное перетаскивание мыши может создать несколько сегментов провода. Точное описание процесса немного запутывает, но это работает достаточно интуитивно на практике: если вы запрашиваете определённый сегмент провода используя Инструмент Проводка, то этот сегмент будет разделён во всех точках, где он касается контакта существующего компонента, или точках, где он касается концов существующего сегмента провода. Кроме того, если конечная точка любого из новых сегментов провода касается где-то посередине существующего провода, то тот провод будет разделён на несколько сегментов.

    Вы также можете укоротить или удалить существующий сегмент провода, начав перетаскивать конец этого сегмента назад вдоль сегмента. Пока вы перетаскиваете, укорачивание отображается с помощью отрисовки белой линии поверх той части провода, которая будет удалена.

    Некоторые компоненты рисуют короткие отрезки, к которым могут быть подключены провода - такие как Элемент ИЛИ и Управляемый буфер. Logisim будет без напоминаний поправлять попытки создания проводов, слегка перекрывающих отрезки.

  • Если пользователь нажимает клавишу Alt при прохождении мыши над проводом, то зелёный кружочек исчезает. Нажатие мыши выделяет провод, а перетаскивание мыши двигает его.

  • Нажатие кнопки мыши, пока мышь находится над выделенным в данный момент компонентом, начинает перетаскивание всех элементов выделения.

    По умолчанию Logisim будет вычислять способ добавить новые провода так, чтобы никакие существующие соединения не рвались при перемещении. (Иногда он будет удалять или укорачивать существующие провода.) Если вы выполняете перемещение, для которого вы не хотите выполнения этих изменений, вы можете нажать клавишу Shift при перемещении. Если вы хотите полностью выключить это поведение, выберите Проект > Параметры..., перейдите на вкладку Холст, и снимите флажок Сохранять соединения при перемещении; в этом случае соединения вычисляются, только когда клавиша Shift нажата.

    Перемещение выделения может привести к неожиданному поведению проводов: если вы перетащите выделение, содержащее провода, поверх других проводов, то все провода будут соединены и помещены в выделение. В результате, если вы перетащите выделение второй раз, то провода, бывшие в этом месте до этого, не будут оставаться на месте. Такое поведение необходимо, чтобы сохранить интуитивное поведение проводов в Logisim там, где провода никогда не перекрываются. И это обычно не представляют собой серьезную проблему: Logisim будет полностью переносить выделение туда, куда вы его перетащили, и вам не следует отпускать его, пока вы не уверены, что оно находится в правильном месте.

  • Нажатии мыши внутри невыделенного компонента (но не на одном из мест контакта компонента) удаляет все элементы из текущего выделения и выделяет компонент(ы), содержащий точку нажатия.

  • Нажатие мыши с зажатой клавишей Shift внутри компонента переключает присутствие/отсутствие компонента в выделении. Если несколько компонентов содержат эту точку, то присутствие/отсутствие всех этих компонентов будет переключено.

  • Перетаскивание мыши, начинающееся с точки, не находящейся внутри какого-либо компонента, обнуляет текущее выделение и инициирует прямоугольное выделение. Все компоненты, находящиеся в прямоугольнике, будут помещены в выделение.

  • Перетаскивание мыши с зажатой клавишей Shift, начинающееся с точки, не находящейся внутри какого-либо компонента, инициирует прямоугольное выделение. Присутствие/отсутствие в выделении всех компонентов, находящихся в прямоугольнике, будет переключено.

  • Кроме того, если клавиша Alt нажата в точке, не содержащейся внутри каких-либо компонентов, это инициирует добавление нового провода. При этом отображается небольшой зелёный кружок чтобы сообщить об этом.

После выделения необходимых объектов, можно, конечно, вырезать/копировать/вставить/удалить/дублировать все объекты, через меню Правка.

Некоторые клавиши имеют эффект с Инструментом Правка.

  • Клавиши со стрелками меняют атрибут Направление для всех компонентов в выделении, которые имеют этот атрибут.

  • Клавиши Delete и Backspace удаляют со схемы всё выделение.

  • Клавиши Insert и MenuKey-D создают дубликат выделенных в данный момент компонентов.

Поведение Logisim при дублировании выделения или вставке из буфера обмена в схему несколько своеобразно: он не сразу поместит компоненты в схему; вместо этого выделение будет состоять из набора "призраков", которые будут добавлены в схему, как только они либо будут перетащены в другое место, либо удалены из выделения. (Это своеобразное поведение необходимо, поскольку в противном случае вставка объединит провода выделения и текущей схемы, а провода, находившиеся там раньше, будут перетаскиваться со вставленным буфером, если пользователь захочет переместить вставленные компоненты куда-то ещё.)

Атрибуты

Нет. Выбор компонента, впрочем, покажет его атрибуты. Если несколько компонентов выбраны, то атрибуты, общие для всех, будут показаны: пустыми, если они имеют разные значения, в противном случае - с общими для них значениями. (Провода игнорируются, если в выделении есть что-то кроме проводов.) Изменения значения атрибута влияют на все выбранные компоненты.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/arith/0000755000175000017500000000000011541757150017267 5ustar vincentvincentlogisim-2.7.1/doc/ru/html/libs/arith/subtractor.html0000644000175000017500000001223711541757150022352 0ustar vincentvincent Вычитатель

Вычитатель

Библиотека: Арифметика
Введён в: 2.0 Beta 11
Внешний вид:

Поведение

Этот компонент вычитает значения, поступающие на западные входы (верхнее минус нижнее) и выдаёт разность на восточный выход. Компонент разработан таким образом, что его можно включать каскадно с другими вычитателями чтобы обеспечить вычитание с большим количеством битов, чем возможно с одним вычитателем: вход займа предоставляет однобитное значение, которое должно быть занято из разности (если вход займа определён), а выход займа определяет, что компонент должен занять старший бит чтобы завершить вычитание без потери значимости (подразумевается беззнаковое вычитание).

Внутренне вычитатель просто выполняет побитовое НЕ над вычитаемым и прибавляет результат к уменьшаемому вместе с дополнением значения с входа займа. (Уменьшаемое - это первый операнд (верхний вход) вычитания, а вычитаемое - второй (нижний вход). Мне нравятся устаревшие термины.)

Если какой-либо операнд содержит несколько плавающих битов или несколько битов с ошибкой, то компонент выполнит частичное вычитание. То есть он будет вычислять столько младших битов, сколько возможно. Но выше плавающего бита или бита с ошибкой результат будет иметь плавающие биты или биты с ошибкой.

Контакты

Западный край, северный конец (вход, разрядность соответствует атрибуту Биты данных)
Уменьшаемое вычитания, то есть число, из которого вычитать.
Западный край, южный конец (вход, разрядность соответствует атрибуту Биты данных)
Вычитаемое вычитания, то есть число, которое нужно вычесть из уменьшаемого.
Северный край, отмечен b in (вход, разрядность равна 1)
Если на этом входе 1, то 1 заимствуется из разности. Если значение неизвестно (например, плавающее), то предполагается, что оно равно 0.
Восточный край (выход, разрядность соответствует атрибуту Биты данных)
Младшие битыДанных битов разности двух значений, поступающих на западный край минус бит bin.
Южный край, отмечен b out (выход, разрядность равна 1)
Бит займа, вычисленный для разности. Если значения вычитаются как беззнаковые и дают отрицательное значение, то этот бит будет 1; в противном случае - 0.

Атрибуты

Когда компонент выбран, или уже добавлен, комбинации от Alt-0 до Alt-9 меняют его атрибут Биты данных.

Биты данных
Разрядность значений для вычитания и результата.

Поведение Инструмента Нажатие

Нет.

Поведение Инструмента Текст

Нет.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/arith/shifter.html0000644000175000017500000001437611541757150021634 0ustar vincentvincent Сдвигатель

Сдвигатель

Библиотека: Арифметика
Введён в: 2.3.0
Внешний вид:

Поведение

Этот компонент включает два входа: данные и дистанция, и имеет один выход, значение на котором - результат сдвига данные на дистанция позиций. И данные, и выход имеют одинаковое количество битов. Компонент поддерживает следующие типы сдвига:

  • Логический левый: все биты в данные сдвигаются вверх на дистанция позиций, а нижние дистанция позиций заполняются нулями. Например, 11001011 логически сдвинутое влево на два - это 00101100. (Две верхние единицы потеряны.)
  • Логический правый: все биты в данные сдвигаются вниз на дистанция позиций, а верхние дистанция позиций заполняются нулями. Например, 11001011 логически сдвинутое вправо на два - это 00110010. (Две нижние единицы потеряны.)
  • Арифметический правый: все биты в данные сдвигаются вниз на дистанция позиций, а верхние дистанция позиций заполняются повторениями самого верхнего бита в данные. Например, 11001011 арифметически сдвинутое вправо на два - это 11110010.
  • Циклический левый: все биты в данные сдвигаются вверх на дистанция позиций, а верхние дистанция позиций прокручиваются вниз. Например, 11001011 циклически сдвинутое влево на два - это 00101111.
  • Циклический правый: все биты в данные сдвигаются вниз на дистанция позиций, а нижние дистанция позиций прокручиваются вверх. Например, 11001011 циклически сдвинутое вправо на два - это 11110010.

Обратите внимание, что если дистанция содержит плавающие значения или значения ошибки, то выход полностью состоит из значений ошибки, поскольку нет способа догадаться, на сколько сдвигать входное значение.

Контакты

Западный край, северный конец (вход, разрядность соответствует атрибуту Биты данных)
Значение, которое будет сдвинуто.
Западный край, южный конец (вход, разрядность вычисляется как указано ниже)
Количество битов значения, на которое нужно сдвигать значение на входе данные. Этот вход должен иметь столько битов, каково минимальное число для указания любой дистанции сдвига от 0 до значения, на единицу меньшего, чем значение атрибута Биты данных; то есть число битов, равное логарифму по основанию 2 от значения атрибута Биты данных, округлённому вверх до ближайшего целого. Например, если значение Биты данных равно 8, то этот вход должен иметь 3 бита; но если оно равно 9, то потребуются 4 бита.
Восточный край (выход, разрядность соответствует атрибуту Биты данных)
Результат сдвига входного значения на количество позиций, заданное другим входом.

Атрибуты

Когда компонент выбран, или уже добавлен, комбинации от Alt-0 до Alt-9 меняют его атрибут Биты данных.

Биты данных
Разрядность входа данные и выхода компонента.
Тип сдвига
Один из пяти возможных типов сдвига, как описано выше (Логический левый, Логический правый, Арифметический правый, Циклический левый, Циклический правый).

Поведение Инструмента Нажатие

Нет.

Поведение Инструмента Текст

Нет.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/arith/negator.html0000644000175000017500000000543411541757150021622 0ustar vincentvincent Отрицатель

Отрицатель

Библиотека: Арифметика
Введён в: 2.0 Beta 22
Внешний вид:

Поведение

Вычисляет отрицание для входного значения в дополнительном коде. Это отрицание осуществляется перебором всех младших битов до самой младшей 1 и отрицанием всех битов старше этого.

Если значение для отрицания оказалось наименьшим отрицательным значением, то его отрицание (которое не может быть представлено в дополнительном коде) остаётся наименьшим отрицательным значением.

Контакты

Западный край (вход, разрядность соответствует атрибуту Биты данных)
Значение для отрицания.
Восточный край, отмечен -x (выход, разрядность соответствует атрибуту Биты данных)
Отрицание для входного значения. Если значение на входе оказалось наименьшим по модулю отрицательным значением, представляемым битыДанных битами, то выходное значение будет совпадать со входным.

Атрибуты

Когда компонент выбран, или уже добавлен, комбинации от Alt-0 до Alt-9 меняют его атрибут Биты данных.

Биты данных
Разрядность входа и выхода компонента.

Поведение Инструмента Нажатие

Нет.

Поведение Инструмента Текст

Нет.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/arith/multiplier.html0000644000175000017500000001131311541757150022342 0ustar vincentvincent Множитель

Множитель

Библиотека: Арифметика
Введён в: 2.0 Beta 20
Внешний вид:

Поведение

Этот компонент перемножает два значения, поступающие на западные входы и выдаёт произведение на восточный выход. Компонент разработан таким образом, что его можно включать каскадно с другими множителями чтобы обеспечить умножение с большим количеством битов, чем возможно с одним множителем: вход переноса предоставляет многобитное значение, которое должно быть добавлено к произведению (если оно задано), а выход переноса предоставляет старшую половину произведения, которая может быть подана на другой множитель.

Если множимое, множитель, или вход переноса содержат несколько плавающих битов или несколько битов с ошибкой, то компонент выполнит частичное умножение. То есть он будет вычислять столько младших битов, сколько возможно. Но выше плавающего бита или бита с ошибкой результат будет иметь плавающие биты или биты с ошибкой. Обратите внимание, что если значение на входе переноса полностью плавающее, то будет подразумеваться, что оно полностью состоит из нулей.

Контакты

Западный край, северный конец (вход, разрядность соответствует атрибуту Биты данных)
Множимое (то есть первое из двух чисел для перемножения).
Западный край, южный конец (вход, разрядность соответствует атрибуту Биты данных)
Множитель (то есть второе число для перемножения).
Северный край, отмечен c in (вход, разрядность соответствует атрибуту Биты данных)
Значение переноса для добавления к произведению. Если все биты значения неизвестны (например, плавающие), то предполагается, что они равны 0.
Восточный край (выход, разрядность соответствует атрибуту Биты данных)
Младшие битыДанных битов произведения двух значений, поступающих на западный край плюс значение cin.
Южный край, отмечен c out (выход, разрядность соответствует атрибуту Биты данных)
Старшие битыДанных битов произведения.

Атрибуты

Когда компонент выбран, или уже добавлен, комбинации от Alt-0 до Alt-9 меняют его атрибут Биты данных.

Биты данных
Разрядность значений для умножения и результата.

Поведение Инструмента Нажатие

Нет.

Поведение Инструмента Текст

Нет.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/arith/index.html0000644000175000017500000000473311541757150021273 0ustar vincentvincent Библиотека Арифметика

Библиотека Арифметика

Библиотека Арифметика включает комбинационные компоненты, которые выполняют арифметические действия над значениями в виде беззнаковых чисел и в дополнительном коде.

Сумматор
Вычитатель
Множитель
Делитель
Отрицатель
Компаратор
Сдвигатель
Сумматор битов
Искатель битов

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/arith/divider.html0000644000175000017500000001152511541757150021607 0ustar vincentvincent Делитель

Делитель

Библиотека: Арифметика
Введён в: 2.0 Beta 22
Внешний вид:

Поведение

Этот компонент делит два значения, поступающие на западные входы и выдаёт частное на восточный выход. Компонент разработан таким образом, что его можно включать каскадно с другими делителями чтобы обеспечить деление с большим количеством битов, чем возможно с одним делителем: вход upper предоставляет старшие битыДанных битов делимого (если оно вообще задано), а биты rem предоставляют остаток, который может быть подан на вход upper другого делителя.

Если делитель равен 0, то деление не выполняется (т.е. предполагается, что делитель равен 1).

Делитель по существу выполняет беззнаковое деление. Таким образом, остаток всегда будет между 0 и делитель-1. Частное всегда будет целым, таким, что

частное * делитель + остаток = делимое .
Если, однако, частное не умещается в битыДанных битов, то только младшие битыДанных битов будут переданы. Компонент не предоставляет никаких способов доступа к старшим битыДанных битам.

Если какой-либо операнд содержит несколько плавающих битов или несколько битов с ошибкой, то на выходах компонента все биты будут плавающими или с ошибкой.

Контакты

Западный край, северный конец (вход, разрядность соответствует атрибуту Биты данных)
Младшие битыДанных битов делимого (то есть первый операнд деления).
Западный край, южный конец (вход, разрядность соответствует атрибуту Биты данных)
Делитель (то есть второй операнд деления)
Северный край, отмечен upper (вход, разрядность соответствует атрибуту Биты данных)
Старшие битыДанных битов делимого (то есть первый операнд деления).
Восточный край (выход, разрядность соответствует атрибуту Биты данных)
Младшие битыДанных битов частного, как указано выше.
Южный край, отмечен rem (выход, разрядность соответствует атрибуту Биты данных)
Остаток от деления. Это значение всегда будет между 0 и делитель-1.

Атрибуты

Когда компонент выбран, или уже добавлен, комбинации от Alt-0 до Alt-9 меняют его атрибут Биты данных.

Биты данных
Разрядность значений для деления и результата.

Поведение Инструмента Нажатие

Нет.

Поведение Инструмента Текст

Нет.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/arith/comparator.html0000644000175000017500000000671011541757150022330 0ustar vincentvincent Компаратор

Компаратор

Библиотека: Арифметика
Введён в: 2.0 Beta 22
Внешний вид:

Поведение

Сравнивает два значения как беззнаковые или как дополнения до 2, в зависимости от атрибута Формат числа. Как правило, на одном из выходов будет 1, а на двух других - 0.

Сравнение производится начиная с наиболее значимых битов в каждом числе, спускаясь вниз до места, где найдены два различающихся значения. Однако, если в ходе этого спуска встретится значение ошибки или плавающее, то на всех выходах будет значение ошибки или плавающее.

Контакты

Западный край, северный конец (вход, разрядность соответствует атрибуту Биты данных)
Одно из двух значений для сравнения.
Западный край, южный конец (вход, разрядность соответствует атрибуту Биты данных)
Второе значение для сравнения.
Восточный край, отмечен > (выход, разрядность равна 1)
На этом выходе 1, если значение на первом входе больше, чем на втором, и 0, если меньше или равно.
Восточный край, отмечен = (выход, разрядность равна 1)
На этом выходе 1, если значение на первом входе равно значению на втором, и 0, если они не равны.
Восточный край, отмечен < (выход, разрядность равна 1)
На этом выходе 1, если значение на первом входе меньше, чем на втором, и 0, если больше или равно.

Атрибуты

Когда компонент выбран, или уже добавлен, комбинации от Alt-0 до Alt-9 меняют его атрибут Биты данных.

Биты данных
Разрядность входа компонента.

Поведение Инструмента Нажатие

Нет.

Поведение Инструмента Текст

Нет.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/arith/bitfinder.html0000644000175000017500000001304411541757150022125 0ustar vincentvincent Искатель битов

Искатель битов

Библиотека: Арифметика
Введён в: 2.6.1
Внешний вид:

Поведение

Компонент принимает многобитное значение на входе и определяет номер бита, причём номер бита отсчитывается от 0-го как от младшего бита. Какой в точности номер вычисляется, зависит от атрибута Тип, как показано на примерах в таблице ниже для 8-битного входного значения 11010100.

ТипВыходное значение для 11010100
Младший 12
Старший 17
Младший 00
Старший 05

Для младшего 1 на выходе 2, потому что если вы нумеруете биты начиная с 0-го как с младшего бита, то первая 1, которую вы найдёте, будет под номером 2. (Биты с номерами 0 и 1 оба равны 0.) Для старшего 1 на выходе 7, потому что самый верхний бит 1 - под номером 7 (опять же, считая самый младший бит нулевым).

Выход компонента на южном крае показывает, был ли желаемый бит вообще найден. В примерах выше для входного значение 11010100 на южном выходе 1 во всех случаях. Но если на входе было бы 00000000 и компонент искал бы младшую 1, то на южном выходе был бы 0 - и на выходе на восточном крае был бы тоже 0.

Если во время поиска желаемого значения найдено значение, не являющееся ни 0, ни 1 (бит плавающий или содержит значение ошибки), то оба выходных значения будут полностью состоять из битов со значением ошибки. Заметьте, что это случается только если проблемный бит встречается до нахождения желаемого бита: для входного значения x1010100 на выходе всё ещё будет 2, если нужен младший 1; но там будут значения ошибки, если тип компонента указывает искать старший 1 или старший 0, поскольку старший бит содержит значение ошибки, а не 0 или 1.

Контакты

Западный край (вход, разрядность соответствует атрибуту Биты данных)
Многобитный вход, в значении которого ищется нужный бит.
Восточный край (выход, разрядность вычисляется как описано ниже)
Номер желаемого бита, считая младший бит нулевым. Разрядность - минимальное количество бит для хранения максимально возможного номера, который на единицу меньше, чем значение атрибута Биты данных.
Южный край (выход, разрядность равна 1)
Значение равно 1, если желаемый бит найден, 0, если все входные биты противоположны желаемому биту, и значение ошибки, если значение не равное 0 или 1 найдено до желаемого бита.

Атрибуты

Когда компонент выбран, или уже добавлен, комбинации от Alt-0 до Alt-9 меняют его атрибут Биты данных.

Биты данных
Разрядность входа.
Тип
Указывает, какой бит искать - младший 0, старший 0, младший 1, или старший 1.

Поведение Инструмента Нажатие

Нет.

Поведение Инструмента Текст

Нет.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/arith/bitadder.html0000644000175000017500000001016211541757150021733 0ustar vincentvincent Сумматор битов

Сумматор битов

Библиотека: Арифметика
Введён в: 2.6.0
Внешний вид:

Поведение

Компонент определяет, сколько битов 1 присутствует на его входе (входах) и выдаёт общее количество битов 1 на свой выход. Например, при 8-битном значении на входе 10011101, на выходе будет 5, поскольку здесь пять битов 1 на входе (первый, последний, и строка из трех битов в середине).

Если любой из входных битов плавающий или имеет значение ошибки, то выходное значение будет содержать биты с ошибкой, соответствующие диапазону возможных выходных значений, зависящих от того, как считать плавающие значения / значения ошибки: как нули или как единицы. Например, если на 14-битном входе 111x10110x1101, то на выходе должно быть не менее 9 (если x-ы интерпретируются как нули) и не более 11 (если они интерпретируются как единицы). Таким образом, на выходе будет 10EE: старшие два бита будут 1 и 0, так как все целые числа между 9 и 11 имеют 1 и 0 в качестве верхних двух битов, а два младших бита - EE, поскольку целые числа от 9 до 11 имеют разные комбинации этих битов.

Контакты

Западный край (входы, разрядность соответствует атрибуту Биты данных)
Входы, биты 1 на которых будут подсчитаны. Количество входов зависит от атрибута Количество входов.
Восточный край (выход, разрядность вычисляется как описано ниже)
Количество входных битов, значение на которых равно 1. Разрядность выхода - это минимальное число битов для хранения максимально возможного значения (которое будет произведением атрибутов Биты данных и Количество входов).

Атрибуты

Когда компонент выбран, или уже добавлен, клавиши от 0 до 9 меняют его атрибут Количество входов, а комбинации от Alt-0 до Alt-9 меняют его атрибут Биты данных.

Биты данных
Разрядность входа (входов).
Количество входов
Количество входных значений.

Поведение Инструмента Нажатие

Нет.

Поведение Инструмента Текст

Нет.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/libs/arith/adder.html0000644000175000017500000001063211541757150021236 0ustar vincentvincent Сумматор

Сумматор

Библиотека: Арифметика
Введён в: 2.0 Beta 11
Внешний вид:

Поведение

Этот компонент складывает два значения, поступающие на западные входы и выдаёт сумму на восточный выход. Компонент разработан таким образом, что его можно включать каскадно с другими сумматорами чтобы обеспечить сложение с большим количеством битов, чем возможно с одним сумматором: вход переноса предоставляет однобитное значение, которое тоже должно быть прибавлено к сумме (если оно задано), а выход переноса предоставляет однобитное значение переполнения, которое может быть подано на другой сумматор.

Если какое-либо слагаемое содержит несколько плавающих битов или несколько битов с ошибкой, то компонент выполнит частичное сложение. То есть он будет вычислять столько младших битов, сколько возможно. Но выше плавающего бита или бита с ошибкой результат будет иметь плавающие биты или биты с ошибкой.

Контакты

Западный край, северный конец (вход, разрядность соответствует атрибуту Биты данных)
Одно из двух значений для сложения.
Западный край, южный конец (вход, разрядность соответствует атрибуту Биты данных)
Второе значение для сложения.
Северный край, отмечен c in (вход, разрядность равна 1)
Значение переноса для прибавления к сумме. Если значение неизвестно (например, плавающее), то предполагается, что оно равно 0.
Восточный край (выход, разрядность соответствует атрибуту Биты данных)
Младшие битыДанных битов суммы двух значений, поступающих на западный край плюс бит cin.
Южный край, отмечен c out (выход, разрядность равна 1)
Бит переноса, вычисленный для суммы. Если значения, складываемые как беззнаковые, дают результат, умещающийся в битыДанных битов, то на этом выходе будет 0, в противном случае - 1.

Атрибуты

Когда компонент выбран, или уже добавлен, комбинации от Alt-0 до Alt-9 меняют его атрибут Биты данных.

Биты данных
Разрядность значений для сложения и результата.

Поведение Инструмента Нажатие

Нет.

Поведение Инструмента Текст

Нет.

Назад к Справке по библиотеке

logisim-2.7.1/doc/ru/html/index.html0000644000175000017500000000110311541757146017224 0ustar vincentvincent Добро пожаловать в Logisim!

Добро пожаловать в Logisim!

Секции в справочной системе Logisim включают:

Руководство "Как стать пользователем Logisim"
Справка по библиотеке

logisim-2.7.1/doc/ru/html/guide/0000755000175000017500000000000011541757146016331 5ustar vincentvincentlogisim-2.7.1/doc/ru/html/guide/verify/0000755000175000017500000000000011541757146017635 5ustar vincentvincentlogisim-2.7.1/doc/ru/html/guide/verify/sub.html0000644000175000017500000001123611541757146021317 0ustar vincentvincent Подстановка библиотек

Подстановка библиотек

Теперь предположим, что у нас есть две схемы Logisim, которые должны делать одно и то же. Как у преподавателя, у вас могут быть работы, выполненные учащимися: у вас есть один файл с вашим решением и несколько файлов учащихся, содержащих их работы. Например, задание было построить двухбитный сумматор.

Я представлю, что у нас есть два файла с именами adder-master.circ и adder-query.circ. Каждый файл содержит схему с названием 2-bit adder (важно, чтобы схема для проверки имела точно такое же название), эти схемы выглядят следующим образом.

adder-master.circ adder-query.circ

Как вы видите, эталонная схема использует встроенный в Logisim сумматор, а проверяемая схема использует две подсхемы, представляющие собой полусумматор и полный сумматор (которые в свою очередь построены из простых логических элементов). Для целей нашего примера проверяемая схема имеет глупую ошибку: бит переноса из полусумматора не соединён с полным сумматором.

Мы сохраняем нашу проверяющую схему в отдельный файл. Затем мы загружаем adder-master.circ как библиотеку Logisim (Проект > Загрузить библиотеку > Библиотека Logisim…), и добавляем двухбитный сумматор оттуда как подсхему. Мы могли бы выполнить эту схему непосредственно, чтобы получить желаемый результат для идеального решения.

java -jar logisim-filename.jar adder-test.circ -tty table

Но мы хотим выполнить схему, используя как загруженную библиотеку adder-query.circ вместо adder-master.circ. Наивным подходом будет открыть Logisim и загрузить эту библиотеку; или вы можете просто удалить файл adder-master.circ и переименовать adder-query.circ в adder-master.circ вместо него. Но Logisim включает удобный параметр -sub, который временно заменяет один файл другим в ходе этой сессии - без каких-либо изменений на диске.

java -jar logisim-filename.jar adder-test.circ -tty table -sub adder-master.circ adder-query.circ

Вывод, который вы увидите, показан ниже; он конечно отличается от того, что мы видели в предыдущем разделе, поскольку сейчас выполняется неправильный adder-query.circ.

00      00      0E0
01      00      0E1
10      00      EE0
11      00      EE1
00      01      0E1
01      01      0E0
10      01      EE1
11      01      EE0
00      10      EE0
01      10      EE1
10      10      1E0
11      10      1E1
00      11      EE1
01      11      EE0
10      11      1E1
11      11      1E0

Далее: Другие параметры проверки.

logisim-2.7.1/doc/ru/html/guide/verify/other.html0000644000175000017500000001543411541757146021653 0ustar vincentvincent Другие параметры проверки

Другие параметры проверки

Есть несколько дополнительных параметров, связанных с выполнением из командной строки.

Параметр командной строки -load

Более сложная схема может включать компонент ОЗУ, который должен быть загружен с программой для того, чтобы схеме было что делать. Вы можете задать файл образа памяти в командной строке, который будет загружен в компонент ОЗУ в схеме до начала моделирования. (Это не будет работать, когда загружен графический интерфейс - это только для выполнения в командной строке.)

java -jar logisim-filename.jar cpu.circ -tty table -load mem-image.txt

Порядок параметров не имеет значения (за исключением того, что аргумент table должен идти сразу после -tty, и имя файла образа памяти должно идти сразу после -load). Файл образа памяти должен быть в формате образа памяти Logisim.

Logisim ищет ОЗУ рекурсивно, так что это будет работать, даже если ОЗУ вложено в подсхему. Однако, не существует способа различать разные компоненты ОЗУ: Logisim попытается загрузить тот же файл в каждое ОЗУ, которое он найдёт.

Аргументы для параметра -tty

До сих пор в наших примерах мы всегда использовали -tty table чтобы указать, что должна быть отображена таблица выходных значений. Вы можете настроить поведение по-другому, перечислив один или более аргументов, разделённых запятыми. Например, вы можете написать -tty table,halt,speed, и программа осуществит все три поведения, описанных ниже. (Порядок, в котором они перечислены, не имеет значения.)

halt

После окончания моделирования выводится сообщение из одной строки, объясняющее, почему кончилось моделирование. Ситуации ошибки - такие как обнаруженное возбуждение - отображаются в любом случае.

speed

Если вы используете speed в сочетании с -tty, то после завершения моделирования Logisim покажет информацию о том, как быстро была моделирована схема, например:

714 Гц (509 тактов за 712 миллисекунд)

Обратите внимание, что отображение информации в ходе моделирования сильно его замедляет. В одном из сравнений одна и та же схема и образ выполнились при 714 Гц только с опцией speed, но при 490 Гц с опцией table.

stats

Показывает таблицу с символами табуляции в качестве разделителей, содержащую статистику компонентов, используемых главной в проекте схемой верхнего уровня. Таблица включает четыре столбца:

  • Уникальных: сколько раз компонент встречается в иерархии схемы, при условии, что каждая подсхема в иерархии считается только один раз.
  • Рекурсивно: сколько раз компонент встречается в иерархии схемы, при условии, что каждая подсхема считается столько раз, сколько она встречается в иерархии.
  • Компонент: название компонента.
  • Библиотека: название библиотеки, из которой взят компонент.

Различие между Уникальных и Рекурсивно объясняется в разделе Меню Проект. Если файл использует схемы из загруженной библиотеки Logisim, то эти компоненты считаются чёрными ящиками: содержимое схем библиотеки не включается в количество уникальных и подсчитанных рекурсивно.

(Эта возможность может быть полезна для преподавателей, дающих студентам задания строить проекты, используя подмножество библиотек Logisim.)

table

(уже обсуждался)

tty

Компоненты Терминал посылают свой вывод на дисплей (стандартный вывод), и любая информация, набранная с клавиатуры, посылается всем компонентам Клавиатура в схеме. Эти компоненты учитываются, даже если они вложены глубоко в иерархию подсхем.

Далее: Проверка нескольких файлов.

logisim-2.7.1/doc/ru/html/guide/verify/multi.html0000644000175000017500000001046011541757146021656 0ustar vincentvincent Проверка нескольких файлов

Проверка нескольких файлов

В случае проведения занятий в классе у вас будет много файлов, которые вам нужно проверить на эквивалентность, и вам не захочется читать вывод для решения каждого учащегося.

Встраивание сравнения в схему

Один из подходов заключается в создании проверяющей схемы, которая непосредственно выполняет сравнение. В таком случае мы создаём дополнительную схему в проверяющем файле, содержащем схему с решением. Во всю нашу проверяющую схему мы включаем и подсхему из adder-master.circ, и подсхему из схемы с решением. Мы соединяем их так, что получается только один выход, на котором 1, пока две подсхемы дают на выходе согласованные значения.

Теперь мы можем просто запускать Logisim, подставляя каждый проверяемый файл. Для каждого правильного решения вывод будет состоять только из 1.

Использование перенаправления и сценариев оболочки

Если вы ладите с командной строкой, вы можете создать свой собственный скрипт для решения этой задачи. Здесь мы будем использовать перенаправление (оператор >), чтобы сохранять вывод каждой схемы в файл. Например, мы могли бы ввести следующие две команды чтобы получить вывод эталонной схемы и проверяемой схемы.

java -jar logisim-filename.jar adder-test.circ -tty table > output-master.txt
java -jar logisim-filename.jar adder-test.circ -tty table -sub adder-master.circ adder-query.circ > output-query.txt

Теперь мы создали два разных файла. Мы можем сравнить два файла с помощью программы, написанной для таких целей. Под Linux или MacOS X вы можете использовать утилиты командной строки cmp или diff. Под Windows вы можете использовать WinMerge.

Для обработки нескольких проверяемых файлов вы можете написать простую программу типа сценария оболочки для поочерёдного прохода по файлам и их сравнения. Вот как бы я сделал это под Linux в bash:

RUN_TEST="java -jar logisim-filename.jar adder-test.circ -tty table"
${RUN_TEST} > output-master.txt
for QUERY_FILE in adder-query*.circ
do
  if ${RUN_TEST} -sub adder-master.circ ${QUERY_FILE} | cmp -s output-master.txt
  then
    echo "${QUERY_FILE} OK"
  else
    echo "${QUERY_FILE} different"
  fi
done

Далее: Руководство пользователя.

logisim-2.7.1/doc/ru/html/guide/verify/index.html0000644000175000017500000001013411541757146021631 0ustar vincentvincent Проверка из командной строки

Проверка из командной строки

Подразделы:
Подстановка библиотек
Другие параметры проверки
Проверка нескольких файлов

Logisim включает базовую поддержку выполнения схем из командной строки. Это сделано для проверки схем с помощью скриптов и чтобы помочь преподавателям выполнять автоматическую проверку работ учащихся.

Начнем с того, как выполнить схему из командной строки. Для примера мы предположим, что сохранили схему, показанную ниже, в файл с именем adder-test.circ. Она использует двухбитный сумматор как подсхему и пробегает все 16 возможных комбинаций на входах, используя счётчик.

После постройки этой схемы мы запустим Logisim из командной строки, передавая имя файла проекта и параметр -tty с аргументом table.

java -jar logisim-filename.jar adder-test.circ -tty table

Без вывода каких-либо окон Logisim загрузит схему и начнёт выполнять её, производя срабатывания тактовых генераторов так быстро, как только может, выполняя просчёт между каждым срабатыванием. После завершения каждого просчёта Logisim снимает значения с выходных контактов; если любое из них изменилось после предыдущего просчёта, то выводятся все значения, разделённые символами табуляции. Если есть выходной контакт, помеченный специальным словом halt, то значение на нём не выводится, но как только оно становится 1 после завершения просчёта, Logisim завершает моделирование.

В нашем примере Logisim выводит таблицу, представленную ниже. Поскольку у нас есть два выходных контакта, соответствующих входам a и b двухбитного сумматора, эти выходы включены как первые два столбца. И есть другой выходной контакт, соответствующий выходу двухбитного сумматора, так что он в третьем столбце. Столбцы идут слева направо в порядке, соответствующем порядку сверху вниз в схеме.

00      00      000
01      00      001
10      00      010
11      00      011
00      01      001
01      01      010
10      01      011
11      01      100
00      10      010
01      10      011
10      10      100
11      10      101
00      11      011
01      11      100
10      11      101
11      11      110

Далее: Подстановка библиотек.

logisim-2.7.1/doc/ru/html/guide/tutorial/0000755000175000017500000000000011541757146020174 5ustar vincentvincentlogisim-2.7.1/doc/ru/html/guide/tutorial/tutor-wires.html0000644000175000017500000000764111541757146023376 0ustar vincentvincent Пособие: Добавление проводов

Далее: Шаг 3: Добавление текста

Шаг 2: Добавление проводов

После того, как все компоненты закреплены на холсте, вы готовы начать добавление проводов. Выберите Инструмент Правка (). Когда курсор над точкой, несущей провод, маленький зелёный кружок будет нарисован вокруг неё. Нажмите здесь кнопку мыши и перетащите туда, где вы хотите, чтобы был провод.

Logisim достаточно умён при добавлении проводов: каждый раз, когда провод кончается на другом проводе, Logisim автоматически соединяет их. Вы также можете "удлинить" или "укоротить" провод, перетаскивая один из его концов, используя Инструмент Правка.

Провода в Logisim должны быть горизонтальными или вертикальными. Чтобы соединить верхний вход с элементом НЕ, а затем с элементом И, я добавил три разных провода.

Logisim автоматически подключает провода к элементам и друг к другу. Сюда относится и автоматическое рисование кружка на Т-образном соединении выше, указывающего, что провода соединены.

Когда вы рисуете провода, вы можете увидеть несколько синих или серых проводов. В Logisim синий показывает, что значение в этой точке "неизвестно", а серый показывает, что провод не подключен ни к чему. В этом нет ничего особенного, пока вы в процессе построения схемы. Но когда вы закончите, ни один из ваших проводов не должен быть синего или серого цвета. (Неприсоединённые ножки элемента ИЛИ останутся синими: это нормально.)

Если у вас есть синий или серый провод когда вы думаете, что всё уже соединено, значит что-то пошло не так. Важно, чтобы вы подключили провода к правильным местам. Logisim отрисовывает маленькие точки на компоненте, чтобы показать, куда подключать провода. Когда вы сделаете это, вы увидите, что точки стали из синих светло- или тёмно-зелёными.

После того как вы подключили все провода, все добавленные вами провода будут светло- или тёмно-зелёными.

Далее: Шаг 3: Добавление текста

logisim-2.7.1/doc/ru/html/guide/tutorial/tutor-text.html0000644000175000017500000000340711541757146023225 0ustar vincentvincent Пособие: Добавление текста

Далее: Шаг 4: Проверка вашей схемы

Шаг 3: Добавление текста

Добавления текста в схему не требуется, чтобы она работала, но если вы хотите показать вашу схему кому-то (например, преподавателю), то несколько меток помогут сообщить назначение разных частей вашей схемы.

Выберите Инструмент Текст (). Вы можете нажать на входном контакте и начать ввод, чтобы назначить ему метку. (Лучше щёлкнуть непосредственно на входном контакте, чем там, где вы хотите, чтобы был текст, потому что тогда метка будет двигаться вместе с контактом.) Вы можете сделать то же самое для выходного контакта. Или вы можете просто щёлкнуть в любом другом месте и начать ввод, чтобы поставить метку где-нибудь ещё.

Далее: Шаг 4: Проверка вашей схемы

logisim-2.7.1/doc/ru/html/guide/tutorial/tutor-test.html0000644000175000017500000000777011541757146023227 0ustar vincentvincent Пособие: Проверка вашей схемы

Далее: Руководство пользователя

Шаг 4: Проверка вашей схемы

Наш последний шаг - проверить нашу схему, чтобы удостовериться, что она действительно делает то, что мы хотели. Logisim уже моделирует схему. Давайте снова посмотрим туда, где мы находимся.

Обратите внимание, что на обоих входных контактах нули; и на выходном контакте тоже. Это уже говорит нам о том, что схема уже вычисляет 0, когда на обоих входах 0.

Теперь попробуем другую комбинацию входов. Выберите Инструмент Нажатие () и начните менять значения на входах, щёлкая на них. Каждый раз, когда вы нажимаете на вход, его значение будет переключаться. Например, мы можем нажать сначала на нижний вход.

Когда вы меняете входное значение, Logisim покажет вам, что значения путешествуют по проводам, отрисовывая их светло-зелёным, чтобы обозначить значение 1, или тёмно-зелёным (почти чёрным) чтобы обозначить значение 0. Вы также можете увидеть, что выходное значение сменилось на 1.

До сих пор мы проверяли первые две строки нашей таблицы истинности и значения на выходах (0 и 1) соответствовали желаемым результатам.

Переключая Инструментом Нажатие разные комбинации, мы можем проверить оставшиеся две строки. Если все они совпадают, то мы закончили: схема работает!



Чтобы сохранить вашу выполненную работу, вы можете сохранить или распечатать схему. Меню Файл позволяет сделать это, и, конечно, оно также позволяет выйти из Logisim. Но зачем выходить сейчас?

Теперь, когда вы закончили пособие, вы можете экспериментировать с Logisim, строя свои собственные схемы. Если вы хотите строить схемы с более сложными возможностями, то вам стоит походить по остальным разделам системы помощи, чтобы увидеть, что ещё вы можете делать. Logisim - это мощная программа, позволяющая вам создавать и проверять огромные схемы; это пособие только прошлось по поверхности.

Далее: Руководство пользователя

logisim-2.7.1/doc/ru/html/guide/tutorial/tutor-orient.html0000644000175000017500000000401611541757146023536 0ustar vincentvincent Пособие: Осваиваемся

Далее: Шаг 1: Добавление логических элементов

Шаг 0: Осваиваемся

Когда вы запустите Logisim, вы увидите окно, подобное следующему. Некоторые детали могут незначительно отличаться, поскольку вы возможно используете систему, отличную от моей.

Весь Logisim разделён на три части, называемые панель проводника, таблица атрибутов, и холст. Выше этих частей - строка меню и панель инструментов.

Мы можем быстро разделаться с панелью проводника и таблицей атрибутов: мы не будем рассматривать их в этом пособии, и вы можете просто игнорировать их. Строка меню тоже не требует объяснений.

Остаётся панель инструментов и холст. Холст - это место, где вы будете рисовать вашу схему; а панель инструментов содержит инструменты, которые вы будете использовать для достижения этой цели.

Далее: Шаг 1: Добавление логических элементов

logisim-2.7.1/doc/ru/html/guide/tutorial/tutor-gates.html0000644000175000017500000001321411541757146023341 0ustar vincentvincent Пособие: Добавление логических элементов

Далее: Шаг 2: Добавление проводов

Шаг 1: Добавление логических элементов

Вспомним, что мы пытаемся построить следующую схему в Logisim.

Я предлагаю строить схему, добавляя сначала элементы, как своего рода каркас, а потом соединять их проводами. Первое, что мы сделаем, это добавим два элемента И. Нажмите на инструмент Элемент И на панели инструментов (, предпоследний инструмент в списке). Затем щёлкните в области редактирования там, где вы хотите поместить первый элемент И. Не забудьте оставить достаточно места для вещей слева. Затем нажмите на инструмент Элемент И снова и поместите второй элемент И под первым.

Обратите внимание на пять точек на левой стороне элемента И. Это места, где могут быть прикреплены провода. Так получилось, что мы используем только два из них для нашей схемы Исключающее ИЛИ; но для других схем вы можете обнаружить, что более чем два провода, идущие к элементу И, могут быть полезны.

Теперь добавьте другие элементы. Сначала щёлкните на инструменте Элемент ИЛИ (); затем щёлкните там, где вы хотите его поместить. И расположите два элемента НЕ на холсте, используя инструмент Элемент НЕ ().

Я оставил немного пространства между элементами НЕ и элементами И; если хотите, однако, вы можете расположить их сразу друг за другом и сэкономить свои усилия на соединении их проводами позже.

Теперь мы хотим добавить в чертёж два входа х и у. Выберите инструмент Добавить входной контакт () и разместите контакты. Вам также нужно разместить выходной контакт рядом с выходом элемента ИЛИ, используя инструмент Добавить выходной контакт (). (Опять же, я оставляю немного пространства между элементом ИЛИ и выходным контактом, но вы можете разместить их сразу друг за другом.)

Если вы решили, что вам не нравится, где вы разместили что-то, то вы можете выбрать это с помощью Инструмента Правка () и перетащить в нужное место. Или же вы можете удалить его полностью, выбрав Удалить из меню Правка или нажав клавишу Delete.

Когда вы размещаете каждый компонент, вы заметите, что как только компонент размещён, Logisim возвращается к Инструменту Правка, так что вы можете двигать размещённый компонент, или (как мы скоро увидим) соединить компонент с другими, создавая провода. Если вы хотите добавить копию недавно размещённого компонента, то быстрый вызов для этого - нажать Control-D для дублирования выделения. (Некоторые компьютеры используют другие клавиши для меню, такие как клавиша Command на Макинтошах. Вам нужно нажать эту клавишу с клавишей D.)

Далее: Шаг 2: Добавление проводов

logisim-2.7.1/doc/ru/html/guide/tutorial/index.html0000644000175000017500000000500111541757146022165 0ustar vincentvincent Пособие начинающего

Пособие начинающего

Далее: Шаг 0: Осваиваемся

Добро пожаловать в Logisim!

Logisim позволяет вам проектировать и моделировать цифровые схемы. Он задуман как образовательный инструмент, чтобы помочь вам узнать, как работают схемы.

Чтобы попрактиковаться в использовании Logisim, давайте построим схему Исключающее ИЛИ - то есть схему, которая имеет два входа (которые мы будем называть х и у ) и выдаёт на выходе 0, если значения на входах одинаковые, и 1, если они разные. Это иллюстрирует следующая таблица истинности.

Мы могли бы разработать такую схему на бумаге.
Но то, что она на бумаге, ещё не означает, что она правильная. Чтобы проверить нашу работу, мы нарисуем её в Logisim и проверим её. В качестве дополнительного бонуса мы получим схему, которая выглядит лучше, чем то, что вы, вероятно, могли бы нарисовать от руки.

Шаг 0: Осваиваемся
Шаг 1: Добавление логических элементов
Шаг 2: Добавление проводов
Шаг 3: Добавление текста
Шаг 4: Проверка вашей схемы

Приятной постройки схем!

Далее: Шаг 0: Осваиваемся

logisim-2.7.1/doc/ru/html/guide/subcirc/0000755000175000017500000000000011541757146017763 5ustar vincentvincentlogisim-2.7.1/doc/ru/html/guide/subcirc/using.html0000644000175000017500000001444611541757146022007 0ustar vincentvincent Использование подсхем

Использование подсхем

Теперь предположим, что мы хотим построить мультиплексор 4-в-1, используя экземпляры нашего мультиплексора 2-в-1. Конечно, сначала мы создадим новую схему, которую мы назовём "4:1 MUX". Чтобы добавить мультиплексоры 2-в-1 в нашу схему, мы нажмём один раз на схему 2:1 MUX в панели проводника, чтобы выбрать её в качестве инструмента, и затем мы можем добавлять её копии, представляемые в виде коробок, щёлкая на холсте.

Если вы щёлкнули два раза на схеме 2:1 MUX в панели проводника, то вместо этого окно переключится на редактирование схемы 2:1 MUX.

После создания схемы мы получим следующее.

Наша схема для мультиплексора 4-в-1 использует три копии мультиплексора 2-в-1, каждая из которых отрисована в виде коробки с контактами вдоль краёв. Контакты на этой коробке соответствую входным и выходным контактам в схеме 2:1 MUX. Два контакта на западном крае коробки соответствуют двум контактам, направленным на восток в схеме 2:1 MUX; контакт на восточной стороне коробки соответствует контакту схемы 2:1 MUX, направленному на запад (который является выходным контактом); а контакт на южной стороне коробки соответствует контакту схемы 2:1 MUX, направленному на север. Порядок контактов на западной стороне коробки соответствует их порядку сверху вниз на чертеже подсхемы. (Если бы было несколько контактов на северной или южной стороне коробки, то их порядок соответствовал бы порядку слева направо в подсхеме.)

Если контакты на чертеже подсхемы имеют метки, связанные с ними, то Logisim будет показывать эти метки в подсказке (то есть во временном текстовом поле), когда пользователь наведёт мышь на соответствующее место компонента подсхемы. (Если вы находите эти подсказки раздражающими, вы можете отключить их через вкладку Чертёж окна Настройки.)

Некоторые другие компоненты тоже будут показывать эти подсказки: для некоторых контактов встроенных триггеров, например, проведение мышью над ними объясняет, что делает этот контакт.

Кстати, каждый контакт схемы должен быть либо входом, либо выходом. Многие промышленные чипы имеют контакты, которые в некоторых ситуациях ведут себя как входы, а в других - как выходы; вы не можете создавать такие чипы в Logisim (по крайней мере, в текущей версии).

Logisim будет поддерживать информацию о разных состояниях для всех подсхем, входящих в схему. Например, если схема содержит триггер, и эта схема используется как подсхема несколько раз, то триггер каждой подсхемы будет иметь собственное значение при моделировании большей схемы.

Теперь у нас есть объявленный мультиплексор 4-в-1, и мы можем использовать его в других схемах. Logisim не имеет ограничения на то, насколько глубоко вложенными могут быть схемы - хотя он будет возражать против вложения схем внутрь себя.

Примечание: нет ничего плохого в редактировании схемы, используемой как подсхема; вообще-то, это довольно обычное дело. Помните, однако, что любые изменения контактов схемы (их добавление, удаление или перемещение) переставят их и в содержащей схеме тоже. Таким образом, при изменении контактов в схеме, вам также придётся изменять схемы, использующие её в качестве подсхемы.

Далее: Изменение внешнего вида подсхемы.

logisim-2.7.1/doc/ru/html/guide/subcirc/library.html0000644000175000017500000000540611541757146022322 0ustar vincentvincent Библиотеки Logisim

Библиотеки Logisim

Каждый проект Logisim - это автоматически библиотека, которая может быть загружена в другие проекты Logisim: просто сохраните его в файл, а затем загрузите как библиотеку в другом проекте. Все схемы, объявленные в первом проекте, будут затем доступны как подсхемы для другого. Эта возможность позволяет вам повторно использовать общие между проектами компоненты и делиться любимыми компонентами со своими друзьями (или учащимися).

Каждый проект имеет назначенную "главную схему", которой можно сделать текущую схему через пункт Сделать главной схемой из меню Проект. Единственное значение этого - это то, что главная схема отображается, когда вы первый раз открываете проект. Название схемы по умолчанию в заново созданном файле ("main") вообще не имеет никакого значения, и вы можете смело удалить или переименовать эту схему.

Для загруженной библиотеке Logisim вам разрешено рассматривать схемы и управлять их состояниями, но Logisim не позволит вам менять чертёж схемы и другие данные, хранящиеся в файле.

Если вы хотите изменить схему в загруженной библиотеке Logisim, то вам придётся открыть её в Logisim отдельно. Как только вы её сохраните, другой проект сразу автоматически загрузит изменённую версию; но если этого не произошло, вы можете нажать правой кнопкой мыши на библиотеке в панели проводника и выбрать Перезагрузить библиотеку.

Далее: Руководство пользователя.

logisim-2.7.1/doc/ru/html/guide/subcirc/index.html0000644000175000017500000000356211541757146021766 0ustar vincentvincent Подсхемы

Подсхемы

По мере того, как вы строите всё более и более сложные схемы, вы захотите строить меньшие схемы, которые вы могли бы использовать многократно как модули, вложенные в большие схемы. В Logisim такие меньшие схемы, использующиеся в больших схемах, называются подсхемами.

Если вы знакомы с программированием, то вам известна концепция подпрограммы, которая может назваться процедурой, функцией, или методом в вашем любимом языке. Концепция подсхемы - аналог этого, и она используется для тех же целей: чтобы разбить большую задачу на меньшие части, чтобы сэкономить усилия на многократном определении одних и тех же понятий, и чтобы облегчить отладку.

Создание схем
Использование подсхем
Изменение внешнего вида подсхемы
Отладка подсхем
Библиотеки Logisim

Далее: Создание схем.

logisim-2.7.1/doc/ru/html/guide/subcirc/debug.html0000644000175000017500000001101611541757146021736 0ustar vincentvincent Отладка подсхем

Отладка подсхем

Когда вы проверяете большие схемы, вы скорее всего находите ошибки. Найти, что идёт не так, может помочь просмотр происходящего в подсхеме во время работы всей схемы. Для входа в состояние подсхемы вы можете использовать любой из трёх различных методов. Проще всего, вероятно, просматривать иерархию моделирования, щёлкнув второй значок в верхней панели инструментов панели проводника (), или выбрав пункт "Показать дерево моделирования" из меню Проект. Это переключает панель проводника таким образом, что она отображает иерархию моделируемой схемы.

Двойной щелчок на элементе в этой иерархии покажет, что происходит внутри этой подсхемы.

Второй способ проникнуть внутрь состояния подсхемы - вызвать всплывающее меню для подсхемы, щёлкнув правой кнопкой мыши или левой кнопкой с зажатой Control на подсхеме, и выбрав пункт "Рассмотреть".

И третий способ - убедиться, что выбран Инструмент Нажатие, и затем щёлкнуть на схеме, в которую вы хотите проникнуть; над её центром появится увеличительное стекло; двойной щелчок на увеличительном стекле позволит вам проникнуть в состояние подсхемы.

В любом случае, проникнув в состояние подсхемы, вы увидите, что значения на контактах подсхемы соответствуют значениям, посылаемым в неё содержащей её схемой.

Когда вы находитесь внутри состояния подсхемы, вы можете изменять схему. Если изменения затрагивают любые выходы подсхемы, они распространяются в содержащую её схему. Одно исключение: значения на входах подсхемы определяются исходя из значений, поступающих в схему из надсхемы, поэтому не имеет смысла менять эти значения. При попытке изменения значения на входе подсхемы появится диалоговое окно с вопросом Значение на контакте привязано к состоянию надсхемы. Создать новое состояние схемы? Ответ Нет отменит запрос изменения, а ответ Да создаст копию просматриваемого состояния, оторванную от внешней схемы, с изменённым значением на входном контакте.

После завершения просмотра и/или редактирования, вы можете вернуться к родительской схеме либо двойным щелчком мыши на ней в панели проводника, либо через подменю Состояние уровнем выше из меню Моделировать.

Далее: Библиотеки Logisim.

logisim-2.7.1/doc/ru/html/guide/subcirc/creating.html0000644000175000017500000000360611541757146022452 0ustar vincentvincent Создание схем

Создание схем

Каждый проект Logisim - фактически библиотека схем. В своей простейшей форме каждый проект имеет только одну схему (по умолчанию называемую "main"), но легко можно добавить больше: выберите Добавить схему... из меню Проект, а затем введите любое название для новой схемы, которую вы хотите создать.

Допустим, мы хотим построить мультиплексор 2-в-1 с названием "2:1 MUX". После добавления схемы Logisim будет выглядеть следующим образом.

В панели проводника вы можете видеть, что проект теперь содержит две схемы, "main" и "2:1 MUX". Logisim отрисовывает увеличительное стекло поверх значка схемы, рассматриваемой в данный момент; ещё, название этой схемы появляется в заголовке окна.

Отредактировав схему так, чтобы она выглядела как мультиплексор 2:1, мы получим следующую схему.

Далее: Использование подсхем.

logisim-2.7.1/doc/ru/html/guide/subcirc/appear.html0000644000175000017500000003005211541757146022121 0ustar vincentvincent Изменение внешнего вида подсхемы

Изменение внешнего вида подсхемы

Внешний вид по умолчанию

Когда подсхема размещена внутри большей схемы, по умолчанию она отрисована в виде прямоугольника с выемкой, обозначающей северный конец чертежа подсхемы. Контакты будут размещены на границе прямоугольника в зависимости от их направления: контакты, направленные на восток на чертеже (и обычно расположенные на западной стороне чертежа) будут размещены на западной стороне прямоугольника в соответствии с их расположением сверху вниз на чертеже. Контакты, направленные на юг на чертеже (и обычно расположенные на северной стороне чертежа) будут размещены на северной стороне прямоугольника в соответствии с их расположением слева направо на чертеже.

Отрисовываемый по умолчанию прямоугольник опционально будет включать несколько букв, которые появятся в середине прямоугольника. Чтобы задать это, выберите Инструмент Выбор () и щёлкните на заднем плане чертежа схемы. Это отобразит атрибуты схемы в таблице атрибутов, включая атрибуты Общая метка, Направление общей метки и Шрифт общей метки. Значение атрибута Общая метка будет отображено в центре прямоугольника; атрибут Направление общей метки определяет, в каком направлении отрисовывается текст, и конечно, атрибут Шрифт общей метки определяет используемый шрифт.

Модифицированный внешний вид

Внешний вид по умолчанию очень удобен, и фактически, Logisim существовал много лет без каких-либо других вариантов. Однако, если вы предпочитаете, чтобы подсхема была отрисована по-другому, вы можете выбрать Редактировать внешний вид схемы из меню Проект, и Logisim переключится с привычного интерфейса редактирования чертежа на интерфейс для рисования внешнего вида схемы. (Вы также можете щёлкнуть крайний справа значок () в верхней панели инструментов панели проводника.) Ниже мы редактируем внешний вид мультиплексора 2:1 так, чтобы он отрисовывался в виде обычной трапеции вместо прямоугольника.

При показанном выше внешнем виде мультиплексора 2:1, чертёж мультиплексора 4:1 будет выглядеть следующим образом.

Редактор внешнего вида похож на традиционную программу для рисования, но есть несколько специальных символов для обозначения того, как рисунок работает при размещении его в чертеже схемы. Эти специальные символы не могут быть удалены.

  • Зеленый круг с линией, выходящей из него, который мы будем называть якорем. Существует ровно один якорь во внешнем виде каждой подсхемы. Каждый компонент в схеме имеет одну точку, определяющую его положение; пользователь видит это при создании нового компонента: щелчок мыши задаёт только одну точку, и компонент размещается относительно неё (обычно с главным выходом в этой точке). Якорь задаёт эту точку относительно всего рисунка при создании подсхемы.

    Якорь также задаёт направление внешнего вида; оно указывается направлением линии анха, в котором она выходит из круга. При размещении подсхемы на чертеже, пользователь может изменить направление подсхемы; направление якоря указывает, в каком направлении ориентирован внешний вид. В нашем примере якорь направлен на восток, и каждый экземпляр подсхемы в мультиплексоре 4:1 тоже направлен на восток, поэтому они все отрисованы в том же направлении, что и внешний вид мультиплексора 2:1.

  • Синие круги и квадраты с точками в них - это порты подсхемы. Портов в точности столько, сколько входных и выходных контактов в схеме. Порты, соответствующие входам, отрисованы в виде прямоугольников, а соответствующие выходам - в виде кругов. Каждый порт указывает, как провод, соединяющийся со схемой, будет соответствовать входному или выходному контакту на чертеже.

    Когда вы выбираете порт, Logisim указывает соответствующий контакт с помощью небольшой всплывающей в нижнем правом углу окна диаграммы, на которой соответствующий контакт(ы) показан синим. Этого не происходит, если выбраны все порты.

Панель инструментов содержит инструменты для добавления дополнительных фигур, перечисленные ниже с описаниями того, как клавиши Shift и Alt меняют их поведение. Кроме того, щелчок или перетаскивание мыши с зажатой Control "приклеивает" положение мыши к ближайшему узлу сетки.

Выделять, перемещать, копировать и вставлять фигуры.
Добавлять и редактировать текст.
Создать отрезок линии. Перетаскивание мыши с зажатой Shift держит линию под углом, кратным 45°.
Создать квадратичную кривую Безье. При первом перетаскивании, когда вы задаёте конечные точки кривой, перетаскивание мыши с зажатой Shift держит конечные точки под углом, кратным 45°. Затем вы щёлкаете, чтобы указать положение управляющей точки; щелчок с Shift обеспечивает симметрию кривой, а щелчок с Alt рисует кривую через управляющую точку.
Создать последовательность соединённых линий, вершины которых указываются последовательностью щелчков. Щелчок с Shift обеспечивает то, что угол между предыдущей и текущей вершинами кратен 45°. Дважды щёлкните или нажмите клавишу Enter для завершения фигуры.
Создать прямоугольник путём перетаскивания от одного угла до противоположного. Перетащите с Shift, чтобы создать квадрат, или с Alt, чтобы создать прямоугольник, начиная с его центра.
Создать прямоугольник со скруглёнными углами путём перетаскивания от одного угла до противоположного. Перетащите с Shift, чтобы создать квадрат, или с Alt, чтобы создать прямоугольник, начиная с его центра.
Создать овал путём перетаскивания от одного угла ограничивающей его рамки до противоположного. Перетащите с Shift, чтобы создать круг, или с Alt, чтобы создать овал, начиная с его центра.
Создать произвольный многоугольник, вершины которого указываются последовательностью щелчков. Щелчок с Shift обеспечивает, что вершина находится под углом, кратным 45° относительно предыдущей. Дважды щёлкните, нажмите клавишу Enter, или щёлкните на начальной вершине для завершения фигуры.

Далее: Отладка подсхем.

logisim-2.7.1/doc/ru/html/guide/prop/0000755000175000017500000000000011541757146017311 5ustar vincentvincentlogisim-2.7.1/doc/ru/html/guide/prop/shortcome.html0000644000175000017500000000720211541757146022203 0ustar vincentvincent Недостатки

Недостатки

Алгоритм просчёта Logisim более чем достаточно сложен почти для всех образовательных целей; но он не достаточно сложен для промышленной разработки схем. В порядке от более тяжёлых к менее тяжёлым, недостатки метода просчёта Logisim следующие:

  • За исключением вопроса задержки логических элементов, Logisim не особенно заботится о вопросах синхронизации. Он очень идеализирован, так что пара элементов ИЛИ-НЕ в схеме S-R триггера будет переключаться "нога в ногу" бесконечно, вместо того, чтобы схема со временем пришла к стабильному состоянию.

  • Logisim не может моделировать подсхемы, чьи контакты иногда ведут себя как входы, а иногда - как выходы. Правда, компоненты, построенные с использованием Java могут иметь такие контакты: компонент ОЗУ встроенной библиотеки Память содержит контакт D, который может выступать и в качестве входа, и в качестве выхода.

  • Logisim выключает моделирование после определённого количества итераций, предполагая, что произошло возбуждение. Предположительно, большие схемы, которые не возбуждаются, могут привести к проблеме.

  • Logisim не делает ничего в отношении различий между уровнями напряжения: бит может быть только включенным, выключенным, неопределённым, или ошибкой.

  • Существуют и другие недостатки, которые я опустил, потому что они настолько глубокие, что если бы вы были осведомлены о них, то было бы очевидно, что Logisim даже близко не подходит к этому уровню. Как крайний случай, у меня есть друг, который работает на крупного производителя чипов, и его работа - следить за "пузырьками" в проводах нанометрового масштаба, растущими и проводящими к случайным разрывам.

  • Даже не говоря об этом, я не специалист по разработке схем, так что вполне могут быть ошибки в методе просчёта значений, о которых я не знаю. Я приветствую корректировки со стороны экспертов.

Далее: Руководство пользователя.

logisim-2.7.1/doc/ru/html/guide/prop/oscillate.html0000644000175000017500000000720211541757146022157 0ustar vincentvincent Ошибки при возбуждении

Ошибки при возбуждении

Алгоритм просчёта значений, который обычно работает тихо, без проблем, станет очень заметным, когда вы создадите схему, которая возбуждается.

В данный момент эта схема в стабильном состоянии. Но если вы измените значение на входе на 1, то схема фактически войдёт в бесконечный цикл. Через некоторое время Logisim просто сдастся и покажет сообщение "Обнаружено возбуждение", говорящее вам, что он считает, что схема возбуждается.

Он будет показывать значения, которые были, когда он сдался. Эти значения будут выглядеть неправильными - на этом снимке экрана элемент И выдаёт 1, хотя на одном из его входов 0; или может быть, что у элемента НЕ на входе и на выходе 1.

Logisim услужливо обводит красным каждое место, которое похоже участвует в возбуждении. Если участвующая точка лежит внутри подсхемы, то Logisim отрисует контур подсхемы красным.

Когда Logisim обнаруживает возбуждение, он останавливает дальнейшее моделирование. Вы можете снова включить моделирование, используя пункт Моделирование включено из меню Моделировать.

Logisim обнаруживает возбуждение с помощью довольно простого метода: если похоже, что при моделировании схемы слишком много итераций, то он просто сдаётся и сообщает о возбуждении. (Точки, которые он определяет как участвовавшие - это те, которые были затронуты как минимум в 25% итераций.) Таким образом, он мог бы ошибочно сообщить о возбуждении, например, если вы работаете с исключительно большой схемой; но она должна быть больше, чем любая построенная мной в Logisim. В любом случае, если вы уверены, что сообщение - ошибка, то вы можете настроить количество итераций, завершённых до появления возбуждения через вкладку Моделирование окна Параметры проекта.

Далее: Недостатки.

logisim-2.7.1/doc/ru/html/guide/prop/index.html0000644000175000017500000000241411541757146021307 0ustar vincentvincent Просчёт значений

Просчёт значений

Алгоритм Logisim для моделирования прохождения значений через схемы - это не то, о чём вам обычно приходится беспокоиться. Достаточно сказать, что алгоритм является достаточно сложным, чтобы учитывать задержки элементов, но не достаточно реалистичным, чтобы учитывать сложные явления, такие как колебание напряжения или состояние гонки.

Вы все ещё хотите знать больше?

Задержки логических элементов
Ошибки при возбуждении
Недостатки

Далее: Задержки логических элементов.

logisim-2.7.1/doc/ru/html/guide/prop/delays.html0000644000175000017500000000766411541757146021475 0ustar vincentvincent Задержки логических элементов

Задержки логических элементов

В качестве примера уровня проработанности алгоритма Logisim рассмотрим следующую схему.

Она "очевидно" всегда даёт 0 на выходе. Но элементы НЕ не реагируют мгновенно на сигналы на входах в реальности, и в Logisim - тоже. В результате, когда значение на входе этой цепи изменяется с 0 на 1, элемент И будет короткое время видеть 1 на обоих входах, и выдаст на выходе 1 на короткое время. Вы не увидите этого на экране. Но этот эффект можно наблюдать, если мы подадим выход элемента И на тактовый вход D триггера.

Если вы нажмёте на вход чтобы изменить значение с 0 на 1, то на D триггер мгновенно придёт 1, и его значение будет переключаться каждый раз, когда значение на входе схемы меняется с 0 на 1.

Каждый компонент имеет задержку, связанную с ним. Более сложные компоненты, встроенные в Logisim, как правило имеют большие задержки, но эти задержки несколько произвольны и могут не отражать реальность.

С технической точки зрения относительно легко обойтись таким уровнем проработанности в одной схеме. Удачное манипулирование с задержками элементов в подсхемах, однако, является немного более сложным; Logisim пытается справиться с этим, располагая просчитываемые для примитивных компонентов значения в одну очередь, независимо от подсхемы, в которой находится компонент.

(Через вкладку Моделирование окна Параметры проекта вы можете настроить Logisim на добавление случайной задержки к просчёту компонента. Это сделано для того, чтобы имитировать неравномерность реальных схем. Например, R-S триггер, построенный с использованием двух элементов ИЛИ-НЕ, будет возбуждаться без этой случайности, так как оба элемента будут обрабатывать свои входы "нога в ногу". Эта случайность отключена по умолчанию.)

Не могу позволить себе сказать, что Logisim всегда правильно обращается с задержками элементов. Но он по крайней мере пытается.

Далее: Ошибки при возбуждении.

logisim-2.7.1/doc/ru/html/guide/prefs/0000755000175000017500000000000011541757146017450 5ustar vincentvincentlogisim-2.7.1/doc/ru/html/guide/prefs/window.html0000644000175000017500000000464311541757146021654 0ustar vincentvincent Вкладка Окно

Вкладка Окно

На этой вкладке находятся настройки, влияющие на внешний вид главного окна Logisim.

  • Показать скорость тактов: если выбрано, то когда такты включены, Logisim отображает скорость, с которой он выполняет такты. Скорость тактов измеряется как средняя за предыдущую 1000 тактов. (Выключение тактов или изменение максимальной тактовой частоты очистит эту историю.)

    Эта фактическая скорость тактов может быть намного меньше, чем вы бранная тактовая частота, потому что Logisim не может моделировать большие схем с очень большой скоростью. Например, максимальная скорость Logisim для достаточно большой схемы может быть 16 Гц; вы можете выбрать более высокую тактовую частоту, но фактическая скорость не будет превышать 16 Гц.

  • Расположение панели инструментов: это выпадающее меню настраивает расположение панели инструментов в пределах окна. Панель инструментов может быть расположена вдоль любой из границ окна, обозначенных как север, юг, восток и запад. Она также может быть скрыта или расположена "посередине вниз" - то есть слева от холста, но справа от панели проводника и таблицы атрибутов.

Далее: Вкладка Чертёж.

logisim-2.7.1/doc/ru/html/guide/prefs/template.html0000644000175000017500000000501111541757146022146 0ustar vincentvincent Вкладка Шаблон

Вкладка Шаблон

Шаблон - это файл Logisim, который используется как отправная точка каждый раз, когда Logisim создаёт новый проект. Кроме того, если у вас есть файл Logisim со странно настроенной средой, вы можете "сбросить" среду, используя кнопку Сбросить все к шаблону в окне Параметры Проекта.

Хотя шаблоны полезны и в других ситуациях, они особенно хорошо подходят для использования в классе, где преподавателю может потребоваться распространить учащимся шаблон, с которого нужно начинать. Это особенно вероятно, если курс интенсивно использует Logisim и многие его продвинутые возможности; в таком случае настройки по умолчанию могут оказаться слишком простыми. Шаблоны также могут быть полезны как общие для класса настройки, когда преподаватель открывает файл, представленный учащимся, который значительно настроил среду.

По умолчанию будет выбран вариант "Обычный шаблон", использующий поставляемый с Logisim шаблон по умолчанию. Если вы хотите скелетную конфигурацию, вы можете выбрать "Пустой шаблон". Но если вы хотите назначить другой файл для использования в качестве шаблона, выберите шаблон через кнопку Выбрать..., а затем укажите вариант "Специальный шаблон".

Далее: Вкладка Интернациональные.

logisim-2.7.1/doc/ru/html/guide/prefs/layout.html0000644000175000017500000001365311541757146021663 0ustar vincentvincent Вкладка Чертёж

Вкладка Чертёж

На этой вкладке находятся настройки, влияющие на поведение редактора чертежа схемы.

  • Вид для печати: определяет, показывать ли схемы на экране так же, как они выводятся через принтер. Как правило этот пункт отключен, и Logisim показывает схемы на экране с отображением текущего состояния схемы и выводит некоторые подсказки связанные с интерфейсом компонентов (самое заметное - он отрисовывает ножки элементов ИЛИ чтобы показать, где они должны присоединяться). А вид для печати не показывает состояние и эти подсказки по интерфейсу.

  • Показывать ореол: определяет, нужно ли рисовать голубой овал вокруг компонента или инструмента, атрибуты которого в данный момент отображаются в таблице атрибутов.

  • Показывать подсказки для компонентов: указывает, следует ли отображать "подсказки", которые будут появляться на время при наведении указателя мыши на компоненты, поддерживающие их. Например, если вы подержите указатель над контактом компонента подсхемы, то отобразится метка соответствующего контакта внутри подсхемы. Наведение курсора на один из концов разветвителя скажет вам, каким битам соответствует этот конец. Кроме того, все компоненты библиотек Плексоры, Арифметика и Память предоставляют информацию о своих входах и выходах через подсказки.

  • Сохранять соединения при перемещении: указывает, должен ли Logisim добавлять новые провода, когда компоненты перемещены, чтобы сохранять их соединения. По умолчанию он включен - хотя он может быть временно отключен нажатием клавиши Shift при перемещении компонентов. Если этот флажок отключен, то по умолчанию при перемещении провода не будут добавляться - но вы можете включить это временно нажатием клавиши Shift при перемещении.

  • Показывать призраки во время добавления: когда включено, и когда выбран инструмент для добавления нового компонента, при движении мыши по холсту отрисовывается светло-серый контур компонента. Например, если вы выбираете инструмент Элемент И, и двигаете мышь по окну (без нажатия кнопки мыши), то серый контур элемента И отрисовывается там, где элемент И появится после нажатия мыши.

  • После добавления компонента: по умолчанию, после добавления каждого компонента, Logisim переключается на Инструмент Правка, позволяющий перемещать компоненты и добавлять провода. Этот выпадающий список позволяет вам изменить это поведение так, чтобы Logisim оставался на том же инструменте для добавления ещё одного такого же компонента, пока вы сами не выберите Инструмент Правка. (Это было поведение Logisim по умолчанию до Logisim 2.3.0. Хотя такое поведение более интуитивно, оно требует больше перемещений мыши для переключения между инструментами.)

  • Первое основание при взаимодействии с проводом: настраивает, как отображаются значения, когда на проводе щёлкнули Инструментом Нажатие. Щелчок на проводе временно отображает значение, пока пользователь не щёлкнет в другом месте схемы.

  • Второе основание при нажатии на провод: настраивает вторую часть отображаемого значения.

Далее: Вкладка Экспериментальные.

logisim-2.7.1/doc/ru/html/guide/prefs/intl.html0000644000175000017500000001461411541757146021312 0ustar vincentvincent Вкладка Интернациональные

Вкладка Интернациональные

Эта вкладка позволяет настроить Logisim в соответствии с региональными предпочтениями.

  • Форма элементов: Logisim поддерживает три стандарта для отрисовки логических элементов: фигурные элементы, прямоугольные элементы, и элементы DIN 40700. В следующей таблице приведены различия.

    Фигурные Прямоугольные DIN 40700
    И
    ИЛИ

    Поскольку стиль с формой, как правило, более популярен в США, а прямоугольный стиль более популярен в Европе, некоторые люди обозначают стили в соответствии с этими регионами; нейтральные по отношению к регионам термины фигурные и прямоугольные - предпочтительнее. Стандарт DIN 40700 был стандартом для разработки цифровых и аналоговых электронных компонентов, принятым DIN, немецкой организацией по стандартизации. DIN принял прямоугольную форму как стандарт для цифровых компонентов в 1976 году, но некоторые инженеры продолжают использовать устаревший стиль; они встречаются всё реже.

    Logisim не соответствует какому-либо стандарту в точности; он придерживается середины чтобы переключаться между ними. В частности, фигурные элементы более квадратные, чем должны быть по размерам, установленным соответствующим стандартом IEEE. Ещё, хотя элементы Исключающее ИЛИ и Исключающее ИЛИ-НЕ должны быть той же ширины, что и элементы ИЛИ и ИЛИ-НЕ в прямоугольном стиле, они имеют разную ширину из-за сложностей при сжатии фигурного элемента Исключающее ИЛИ.

  • Язык: Переключение между языками. Текущая версия снабжена переводами на английский, испанский, русский и немецкий языки.

    • Немецкий перевод был представлен в Logisim 2.6.1 и остаётся актуальным. Его выполнил Уве Зиммерманн, преподаватель университета Уппсалы в Швеции.
    • Греческий перевод был представлен в Logisim 2.7.0 и остаётся актуальным. Его выполнил Танос Какароунтас, преподаватель Технологического образовательного института Ионических островов в Греции.
    • Португальский перевод был представлен в Logisim 2.6.2 и остаётся актуальным. Его выполнил Телдо Круз Франкуэйра, преподаватель Папского Католического Университета Минас-Жерайса в Бразилии.
    • Русский перевод был представлен в Logisim 2.4.0 и остаётся актуальным. Его выполнил Илья Лилов из России.
    • Испанский перевод был полным для Logisim 2.1.0, но последующие версии Logisim добавили новые опции, которые остаются непереведёнными. Его предоставил Пабло Лил Рамос из Испании.

    Переводы Logisim на другие языки приветствуются! Если вы заинтересованы, свяжитесь со мной, Карлом Берчем. Это не будет обязательством: я буду рад услышать о вашем интересе, скажу, не знаю ли я кого-то, кто уже работает над ним, подготовлю вам версию для работы, и пришлю вам инструкции. Процесс перевода не требует понимания Java.

  • Заменять специфичные символы: некоторые платформы имеют плохую поддержку для символов (например ñ или ö), которых нет в 7-битном наборе символов ASCII. Когда это включено, Logisim будет заменять все вхождения таких символов соответствующими эквивалентными символами из 7-битного набора символов ASCII. Флажок отключен, если текущий язык не имеет доступных эквивалентов (например, английский).

Далее: Вкладка Окно.

logisim-2.7.1/doc/ru/html/guide/prefs/index.html0000644000175000017500000000363111541757146021450 0ustar vincentvincent Настройки приложения

Настройки приложения

Logisim поддерживает две категории параметров конфигурации: настройки приложения и параметры проекта. Настройки приложения охватывают все открытые проекты, а параметры проекта специфичны для одного определённого проекта. В этом разделе рассматриваются настройки приложения; параметры проекта описаны в другом разделе.

Вы можете просматривать и редактировать настройки приложения через пункт Настройки... из меню Файл (или из меню Logisim на Mac OS); появится окно с несколькими вкладками. Мы будем обсуждать эти вкладки по отдельности, а потом мы посмотрим, как настройки могут быть заданы с помощью командной строки.

Вкладка Шаблон
Вкладка Интернациональные
Вкладка Окно
Вкладка Чертёж
Вкладка Экспериментальные
Командная строка

Далее: Вкладка Шаблон.

logisim-2.7.1/doc/ru/html/guide/prefs/exp.html0000644000175000017500000000313511541757146021134 0ustar vincentvincent Вкладка Экспериментальные

Вкладка Экспериментальные

Эти настройки включают возможности, которые считаются экспериментальными, включенные для налаживания обратной связи с пользователями.

  • Ускорение графики: один из пользователей Logisim отметил, что добавление -Dsun.java2d.d3d=True к командной строке кажется улучшает производительность графики Logisim, заставляя его использовать аппаратное ускорение графики. Этот выпадающий список пытается настроить Logisim так, чтобы эта возможность была включена; сообщения о том, влияет ли этот список на производительность, будут приветствоваться. Это не будет иметь никакого эффекта, пока Logisim не будет перезапущен.

Далее: Параметры командной строки.

logisim-2.7.1/doc/ru/html/guide/prefs/cmdline.html0000644000175000017500000001003411541757146021747 0ustar vincentvincent Параметры командной строки

Параметры командной строки

Вы можете изменять многие настройки приложения Logisim через параметры командной строки. Это может быть особенно полезным в лаборатории с одним компьютером на учащегося, где вы хотите запускать Logisim каждый раз одинаково, вне зависимости от того, как предыдущие студенты могли настроить программу.

Общий синтаксис командной строки выглядит следующим образом.

java -jar имяJarФайла [параметры] [именаФайлов]

Необязательные дополнительные файлы, указанные в командной строке, будут открыты как отдельные окна в Logisim.

Следующий пример запускает Logisim в его базовой конфигурации.

java -jar имяJarФайла -plain -gates shaped -locale en

Поддерживаемые параметры следующие.

-plain
-empty
-template файлШаблона

Задаёт шаблон для использования в Logisim

-gates [shaped|rectangular]

Задаёт какой использовать тип логических элементов.

-locale идентификаторЯзыка

Задаёт какой перевод использовать. На момент написания поддерживаются следующие языки:

deНемецкий
enАнглийский
esИспанский
ruРусский
elГреческий
-accents [yes|no]

Это имеет смысл только для языков, которые используют символы вне 7-битного набора символов ASCII; сюда относятся языки, использующие специфичные символы; английский сюда не входит. При no символы вне 7-битного набора символов ASCII заменяются эквивалентами соответственно языку; это будет полезно для комбинаций Java/ОС, где такие символы не поддерживаются хорошо.

-clearprops

Очистить все настройки приложения при запуске, так что Logisim будет вести себя так, как будто он запущен в данной системе первый раз.

-nosplash

Скрывает стартовое окно заставки Logisim.

-help

Отображает список параметров командной строки.

-version

Отображает номер версии Logisim.

Далее: Руководство пользователя.

logisim-2.7.1/doc/ru/html/guide/opts/0000755000175000017500000000000011541757146017316 5ustar vincentvincentlogisim-2.7.1/doc/ru/html/guide/opts/toolbar.html0000644000175000017500000000472511541757146021656 0ustar vincentvincent Вкладка Панель инструментов

Вкладка Панель инструментов

Вкладка Панель инструментов позволяет вам настраивать, какие инструменты появятся на пенели инструментов.

Левая часть - проводник со списком всех доступных инструментов, а список в правой части отображает текущее содержимое панели инструментов. (Три тире "---" обозначают разделитель, который отрисовывается как серая линия.) Между проводником и списком - пять кнопок и выпадающий список:

  • Добавить инструмент добавляет выбранный в проводнике слева инструмент в конец панели инструментов.

  • Добавить разделитель добавляет в конец панели инструментов разделитель.

  • Сдвинуть вверх перемещает выбранный в данный момент элемент панели инструментов на одну позицию вверх/влево.

  • Сдвинуть вниз перемещает выбранный в данный момент элемент панели инструментов на одну позицию вниз/вправо.

  • Удалить удаляет выбранный элемент с панели инструментов.

Атрибуты, связанные с инструментами, не отображаются в этом окне, вместо этого вы можете просматривать и редактировать их в главном окне рисования программы.

Далее: Вкладка Мышь.

logisim-2.7.1/doc/ru/html/guide/opts/simulate.html0000644000175000017500000001131611541757146022031 0ustar vincentvincent Вкладка Моделирование

Вкладка Моделирование

Вкладка Моделирование позволяет настраивать алгоритм, используемый для моделирования схем. Эти параметры применяются ко всем схемам, моделируемым в одном и том же окне, даже к схемам, которые существуют в других библиотеках, загруженных в проекте.

  • Раскрывающееся меню Итераций до возбуждения определяет, как долго моделировать схему, прежде чем принять решение, что она возбуждается. Число представляет собой количество срабатываний скрытого тактового генератора (простой логический элемент тратит всего одно срабатывание). Значение по умолчанию 1000 достаточно хорошо почти для всех целей, даже для больших схем. Но вы можете увеличить число итераций, если вы работаете со схемой, где Logisim сообщает о ложных возбуждениях. Это вряд ли будет проблемой на практике, но одним из таких случаев является схема, которая включает много схем триггеров, показанных ниже, с включенным случайным шумом. Вам может понадобиться уменьшить число итераций, если вы работаете со схемой, предрасположенной к возбуждению, и вы используете необыкновенно медленный процессор.

  • Раскрывающееся меню Выход элемента при неопределённости определяет, как ведут себя логические элементы, если некоторые их входы не подключены, или на них плавающее значение. По умолчанию Logisim игнорирует такие входы, что позволяет логическим элементам работать с меньшим количеством входов, чем они рассчитаны. Однако в реальной жизни элементы будут вести себя непредсказуемо в такой ситуации, и поэтому это раскрывающееся меню позволяет изменить элементы так, что они будут обращаться с такими отключенным входам как с ошибками.

  • Флажок Добавлять шум к задержкам компонентов позволяет вам включать и выключать случайный шум, добавляемый к задержкам компонентов. Внутреннее моделирование использует скрытый тактовый генератор для имитации такого шума, и для обеспечения в некоторой степени реалистичного моделирования каждый компонент (кроме проводов и разветвителей) имеет задержку между получением сигналов на входе и выдачей сигнала на выходе. Если эта опция включена, Logisim будет время от времени (примерно один раз на 16 реакций компонента) заставлять компонент потратить на одно срабатывание больше, чем обычно.

    Я рекомендую держать эту опцию выключенной, так как эта техника приводит к необычным ошибкам в нормальных схемах.

Далее: Вкладка Панель инструментов.

logisim-2.7.1/doc/ru/html/guide/opts/mouse.html0000644000175000017500000000767411541757146021352 0ustar vincentvincent Вкладка Мышь

Вкладка Мышь

По умолчанию, когда вы щёлкаете мышью в области отрисовки Logisim, будет использоваться выбранный в данный момент инструмент. Если вы щёлкните правой кнопкой мыши или с клавишей Control, то появится всплывающее меню для текущего компонента под курсором мыши.

Logisim позволяет вам изменить это поведение, избавляя вас от необходимости постоянно обращаться к панели инструментов или проводника. (Это также может быть полезно, если вы левша.) Каждая комбинация кнопки мыши и клавиши-модификатора (любая комбинация Shift, Control и Alt) может быть привязана к определённому инструменту. Вкладка Мышь позволяет вам настроить эти привязки.

  • С левой стороны - проводник, где вы можете выбрать инструмент, который необходимо привязать.

  • Сверху правой стороны - прямоугольник, в котором вы можете щёлкнуть с комбинацией мыши, которая вам нужна. Например, если вы хотите создавать новые провода перетаскиванием мыши с зажатой Shift, то выберите Инструмент Проводка в проводнике (в библиотеке Базовые); дальше вам нужно щёлкнуть с клавишей Shift там, где написано "Щёлкните здесь используя комбинацию, чтобы привязать Инструмент Проводка". Если это сочетание уже используется, то привязка будет заменена новым инструментом.

  • Ниже этой области - список текущих привязок. Обратите внимание, что любые комбинации, которые не перечислены, просто используют выбранный в текущий момент инструмент.

  • Ниже - кнопка Удалить, с помощью которой вы можете удалить выбранную в таблице выше привязку. После этого эта комбинация мыши будет использовать инструмент, выбранный в текущий момент на панели инструментов или панели проводника.

  • Ниже - список атрибутов для инструмента, выбранного в списке привязок. Каждый привязанный к мыши инструмент имеет собственный набор атрибутов, отличающийся от атрибутов, используемых инструментами на панели проводника или панели инструментов. Здесь вы можете редактировать значения этих атрибутов.

Далее: Руководство пользователя.

logisim-2.7.1/doc/ru/html/guide/opts/index.html0000644000175000017500000000405211541757146021314 0ustar vincentvincent Параметры проекта

Параметры проекта

Logisim поддерживает две категории параметров конфигурации: настройки приложения и параметры проекта. Настройки приложения охватывают все открытые проекты, а параметры проекта специфичны для одного определённого проекта. В этом разделе рассматриваются параметры проекта; настройки приложения описаны в другом разделе.

Вы можете просматривать и редактировать параметры проекта через пункт Параметры... из меню Проект. Это вызовет окно Параметры с несколькими вкладками.

Мы будем обсуждать каждую из этих вкладок отдельно.

Вкладка Моделирование
Вкладка Панель инструментов
Вкладка Мышь

В нижней части окна есть кнопка Вернуть все к шаблону. При её нажатии все параметры и атрибуты инструментов заменяются на настройки из текущего шаблона (выбранного в настройках приложения).

Далее: Вкладка Моделирование.

logisim-2.7.1/doc/ru/html/guide/menu/0000755000175000017500000000000011541757146017275 5ustar vincentvincentlogisim-2.7.1/doc/ru/html/guide/menu/winhelp.html0000644000175000017500000000514511541757146021636 0ustar vincentvincent Меню Окно и Справка

Меню Окно

Минимизировать

Минимизирует (сворачивает в значок) текущее окно.

Максимизировать (Zoom на MacOS)

Изменяет размер текущего окна до оптимального размера.

Закрыть

Закрывает текущее окно.

Комбинационный анализ

Показывает текущее окно Комбинационного анализа без изменения его содержимого.

Настройки

Отображает окно настроек приложения.

названия отдельных окон

Выводит соответствующее окно на передний план.

Меню Справка

Пособие начинающего

Открывает справочную систему на разделе "Пособие начинающего" руководства "Как стать пользователем Logisim".

Руководство пользователя

Открывает справочную систему на руководстве "Как стать пользователем Logisim".

Справка по библиотеке

Открывает справочную систему на Справке по библиотеке.

О программе...

Отображает окно, содержащее номер версии, совмещённый с графикой заставки. (На MacOS этот пункт меню находится в меню Logisim.)

Далее: Руководство пользователя.

logisim-2.7.1/doc/ru/html/guide/menu/simulate.html0000644000175000017500000001250711541757146022013 0ustar vincentvincent Меню Моделировать

Меню Моделировать

Моделирование включено

Если установлено, то просматриваемая схема будет "живой": то есть значения, просчитываемые для схемы будут обновляться при каждом нажатии или изменении схемы.

Пункт меню будет автоматически отключен, если обнаружено возбуждение схемы.

Сбросить моделирование

Очищает всё связанное с текущим состоянием схемы, так, как если бы вы просто открыли файл заново. Если вы рассматриваете состояние подсхемы, то вся иерархия будет очищена.

Шаг моделирования

Продвигает моделирование на один шаг вперёд. Например, сигнал может закончить поступать на элемент в течение одного шага, но элемент не будет показывать другой сигнал до следующего шага моделирования. Чтобы помочь определить, какие пункты во всей схеме были изменены, любые точки, значения на которых изменились, указаны синим кругом; если подсхема содержит точки, значения на которых были изменены в ней (или её подсхемах, рекурсивно), то она будет отрисована с синей обводкой.

Состояние уровнем выше

Когда вы углубляетесь в состояние подсхемы через её всплывающее меню, подменю Состояние уровнем выше выдаёт список схем выше состояния рассматриваемой схемы. Выбор одной из них отображает её.

Состояние уровнем ниже

Если вы углубились в состояние подсхемы и затем вышли обратно, то это подменю выдаст список схем ниже состояния текущей схемы. Выбор одной из них отображает её.

Один такт

Продвигает моделирование на один шаг вперёд. Это может быть полезно, если вы хотите проходить такты тактовых генераторов вручную, особенно когда тактовый генератор не в той схеме, что вы рассматриваете в данный момент.

Такты включены

Запускает автоматическое прохождение тактов для тактовых генераторов. Это будет иметь эффект только тогда, когда схема содержит тактовые генераторы (из библиотеки Проводка). По умолчанию опция отключена.

Тактовая частота

Позволяет вам выбирать, как часто происходят такты. Например, 8 Гц означает, что такты будут происходить 8 раз в секунду. Такт - это основная единица измерения скорости тактовых генераторов.

Обратите внимание, что скорость циклов тактовых генераторов будет медленнее, чем скорость тактов: наиболее быстрый возможный тактовый генератор будет иметь один такт нарастания и один такт спада за цикл; такой тактовый генератор будет иметь скорость цикла нарастания/спада в 4 Гц, если такты происходят с частотой 8 Гц.

Запись в журнал...

Входит в модуль записи в журнал, который помогает автоматически отмечать и сохранять значения в схеме во время процесса моделирования.

Далее: Меню Окно и Справка.

logisim-2.7.1/doc/ru/html/guide/menu/project.html0000644000175000017500000002126411541757146021636 0ustar vincentvincent Меню Проект

Меню Проект

Добавить схему...

Добавляет новую схему в текущий проект. Logisim потребует вас дать название новой схеме. Имя не должно совпадать с именем существующей в проекте схемы.

Загрузить библиотеку

Загружает библиотеку в проект. Вы можете загружать три типа библиотек, как описано в другом месте Руководства пользователя.

Выгрузить библиотеки

Выгружает текущие библиотеки из проекта. Logisim не разрешит вам выгрузить библиотеки, используемые в данный момент, включая библиотеки, содержащие компоненты, находящиеся в схеме проекта, или содержащие инструменты, присутствующие в панели инструментов, или привязанные к мыши.

Переместить схему вверх

Перемещает отображаемую в данный момент схему на одну позицию вверх в списке схем проекта, показанном в панели проводника.

Переместить схему вниз

Перемещает отображаемую в данный момент схему на одну позицию вниз в списке схем проекта, показанном в панели проводника.

Сделать главной схемой

Устанавливает отображаемую в данный момент схему как главную схему проекта. (Этот пункт меню будет недоступен, если текущая схема - уже главная схема проекта.) Единственным значением главной схемы является то, что эта схема появляется первой, когда открывается файл проекта.

Вернуть внешний вид по умолчанию

Если вы изменили внешний вид схемы, то этот пункт меню вернёт внешний вид по умолчанию: прямоугольник с выемкой. Этот пункт меню включен только при редактировании внешнего вида схемы.

Показать инструменты

Изменяет панель проводника для отображения списка схем проекта и загруженных библиотек.

Показать дерево моделирования

Изменяет панель проводника для отображения иерархии подсхем в текущем моделировании.

Редактировать чертёж схемы

Переключает вас на режим редактирования чертежа расположения компонентов, который определяет, как работает схема. Этот пункт меню обычно недоступен, поскольку как правило вы и так редактируете чертёж.

Редактировать внешний вид схемы

Переключает вас на режим редактирования того, как будет выглядеть схема, когда она используется как подсхема внутри другой схемы. По умолчанию схема представляется в виде прямоугольника с серой выемкой на северном крае, но этот пункт меню позволяет вам нарисовать другой внешний вид для подсхемы.

Удалить схему

Удаляет отображаемую в данный момент схему из проекта. Logisim не позволит вам удалить схемы, которые используются в качестве подсхем, и он не позволит вам удалить последнюю в проекте схему.

Анализировать схему

Вычисляет таблицу истинности и логические выражения, соответствующие текущей схеме, отображая их в окне Комбинационный анализ. Процесс анализа будет иметь смысл только для комбинационных схем. Полное описание процесса анализа расположено в разделе Комбинационный анализ.

Получить статистику схемы

Показывает диалог, содержащий статистические данные о компонентах, используемых в рассматриваемой схеме. Диалог включает таблицу с пятью столбцами:

  • Компонент: название компонента.
  • Библиотека: название библиотеки, из которой взят компонент.
  • Непосредственно: сколько раз компонент непосредственно встречается в рассматриваемой схеме.
  • Уникальных: сколько раз компонент встречается в иерархии схемы, при условии, что каждая подсхема в иерархии считается только один раз.
  • Рекурсивно: сколько раз компонент встречается в иерархии схемы, при условии, что каждая подсхема считается столько раз, сколько она встречается в иерархии.

Различие между Уникальных и Рекурсивно проще всего объяснить, рассматривая мультиплексор 4:1, построенный с использованием трёх мультиплексоров 2:1, как в разделе Использование подсхем. Мультиплексор 2:1 содержит два элемента И (а схема 4:1 не содержит ни одного), так что количество Уникальных элементов И будет 2; но если вы строили мультиплексор 4:1 с использованием этой схемы, вам потребовалось 2 элемента И для каждого из трёх мультиплексоров 2:1, так что количество Рекурсивно равно 6.

Если вы используете схемы из загруженной библиотеки Logisim, то эти компоненты считаются чёрными ящиками: содержимое схем библиотеки не включается в количество уникальных и подсчитанных рекурсивно.

Параметры...

Открывает окно Параметры проекта.

Далее: Меню Моделировать.

logisim-2.7.1/doc/ru/html/guide/menu/index.html0000644000175000017500000000243411541757146021275 0ustar vincentvincent Справка по меню

Справка по меню

Этот раздел объясняет шесть меню, которые сопровождают все основные окна Logisim.

Меню Файл
Меню Правка
Меню Проект
Меню Моделировать
Меню Окно и Справка
Многие пункты меню касаются конкретно открытого в данный момент проекта. Но некоторые окна Logisim (в частности, окна Комбинационный анализ и Настройки приложения) не связаны с проектами. Для этих окон специфичные для проекта элементы меню будут отключены.

Далее: Меню Файл.

logisim-2.7.1/doc/ru/html/guide/menu/file.html0000644000175000017500000001530411541757146021105 0ustar vincentvincent Меню Файл

Меню Файл

Новый

Открывает новый проект в новом окне. Проект первоначально будет копией текущего выбранного шаблона.

Открыть...

Открывает существующий файл как проект в новом окне.

Открыть недавние

Открывает недавно открытый проект в новом окне без приглашения пользователя к навигации через диалог выбора файла.

Закрыть

Закрывает все окна, связанные с просматриваемым в данный момент проектом.

Сохранить

Сохраняет просматриваемый в данный момент проект, перезаписывая то, что было раньше в файле.

Сохранить как...

Сохраняет просматриваемый в данный момент проект, предлагая пользователю сохранить его в другой файл.

Экспортировать изображение...

Создаёт файл(ы) изображений, соответствующие схемам. Диалоговое окно настройки описано ниже.

Печать...

Посылает схему (или несколько) на принтер. Диалоговое окно настройки описано ниже.

Настройки...

Отображает окно настроек приложения. (На системах с Mac OS появится в меню Logisim.)

Выход

Закрывает все открытые проекты и завершает Logisim. (На системах с Mac OS появится как Quit в меню Logisim.)

Настройка экспорта

Когда вы выбираете Экспортировать изображение..., Logisim отображает диалоговое окно с четырьмя настройками.

  • Схемы: Список, где вы можете выбрать одну или несколько схем, которые должны быть экспортированы в файлы изображений. (Пустые схемы не отображаются как варианты.)
  • Формат изображения: Вы можете создавать PNG, GIF и JPEG файлы. Я бы порекомендовал PNG файлы: формат GIF довольно устаревшей, а формат JPEG внесёт артефакты в изображение, так как формат JPEG вообще-то предназначен для фотографических изображений.
  • Масштабный коэффициент: с помощью этого ползунка вы можете изменять масштаб изображений, в котором они сохраняются в файлы.
  • Вид для печати: следует ли использовать "вид для печати" при экспорте схем.

После нажатия OK Logisim покажет диалоговое окно выбора файла. Если вы выбрали одну схему, выберите файл, в который изображение должно быть помещено. Если вы выбрали несколько схем, выберите директорию, куда файлы должны быть помещены; Logisim назовёт изображения, основываясь на названиях схем (main.png например).

Настройка печати

Когда вы выбираете Печать..., Logisim отображает диалоговое окно для настройки того, что печатается.

  • Схемы: Список, где вы можете выбрать одну или несколько схем для печати. (Пустые схемы не отображаются как варианты.) Logisim будет печатать по одной схеме на каждой странице. Если схема слишком велика для страницы, изображение будет уменьшено чтобы уместиться.
  • Заголовок: Текст, который должен появиться сверху по центру каждой страницы. Следующие замены будут внесены в текст.
    %nНазвание схемы на странице
    %pНомер страницы
    %PОбщее количество страниц
    %%Одиночный знак процента ('%')
  • Повернуть для подгонки: если установлено, то Logisim будет поворачивать каждую схему на 90 градусов, когда схема слишком велика, чтобы уместиться на странице, и её не нужно так же сильно масштабировать, когда она повёрнута на 90 градусов.
  • Вид для печати: следует ли использовать "вид для печати" при печати схем.

После нажатия OK Logisim покажет диалоговое окно установок страницы до печати схем.

Далее: Меню Правка.

logisim-2.7.1/doc/ru/html/guide/menu/edit.html0000644000175000017500000002032711541757146021114 0ustar vincentvincent Меню Правка

Меню Правка

Отменить XX

Отменяет самое последнее завершённое действие, влияющее на то, как схема будет сохранена в файле. Обратите внимание, что это не включает изменения в состоянии схемы (такие как манипуляции, выполненные Инструментом Нажатие).

Вырезать

Удаляет выбранные компоненты из схемы в буфер Logisim.

Примечание: буфер Logisim поддерживается отдельно от буфера для всей системы; в результате вырезать/копировать/вставить не будет работать в других приложений, даже включая другие запущенные копии Logisim. Однако, если у вас есть несколько проектов, открытых одним и тем же процессом Logisim, то вы можете вырезать/ копировать/вставлять между ними.

Копировать

Копирует выбранные в схеме компоненты в буфер Logisim. (См. примечание к пункту меню Вырезать.)

Вставить

Вставляет компоненты из буфера Logisim в текущее выделение. (См. примечание к пункту меню Вырезать.)

Когда вы вставляете компоненты, они не будут сброшены мгновенно; вместо этого они будут отрисованы светло-серым. Они не будут фактически "сброшены" в схему, пока вы или не переместите выделение, или не измените выделение так, чтобы эти компоненты не были в нём.

Причина такого странного поведения следующая: для согласования со своим поведением в других ситуациях Logisim должен немедленно объединить все провода, как только они сбрасываются в схему; этот процесс слияния изменяет существующие в схеме провода. Когда вы вставляете провода из буфера обмена, вам может понадобиться разместить их в другом месте, и изменения, сделанные процессом слияния, будут вопреки вашим желаниям.

Удалить

Удаляет из схемы все компоненты в текущем выделении без изменений в буфере обмена.

Дублировать

Создает копию всех компонентов в текущем выделении. Это подобно выбору Копировать и затем Вставить, кроме того, что Дублировать не изменяет и не использует буфер обмена.

Выбрать все

Выбирает все компоненты в текущей схеме.

Поднять выделение

Этот пункт меню доступен только при редактировании внешнего вида схемы. Он поднимает выделенный в данный момент объект(ы) так, чтобы он оказался над объектом, перекрывающим выделение. Если выделение перекрывается несколькими объектами, то оно поднимается только выше самого нижнего из них; используйте этот пункт меню несколько раз подряд, пока объект не окажется в нужном месте.

(Определение перекрытия двух произвольных объектов сложно. Logisim использует алгоритм, заключающийся в выборе нескольких случайных точек на каждом из двух объектов и проверке принадлежности другому объекту хотя бы одной из них. Иногда он не сможет обнаружить перекрытие, если оно небольшое - скажем, менее 5% любого из объектов.)

Опустить выделение

Этот пункт меню доступен только при редактировании внешнего вида схемы. Он опускает выделенный в данный момент объект(ы) так, чтобы он оказался под объектом, перекрывающим выделение. Если выделение перекрывает несколько объектов, то оно опускается только ниже самого верхнего из них; используйте этот пункт меню несколько раз подряд, пока объект не окажется в нужном месте.

Поднять наверх

Доступный только при редактировании внешнего вида схемы, этот пункт меню поднимает выделенный в данный момент объект(ы) так, чтобы он оказался над всеми другими объектами. (Якорь и порты являются исключениями - они всегда наверху.)

Опустить вниз

Доступный только при редактировании внешнего вида схемы, этот пункт меню опускает выделенный в данный момент объект(ы) так, чтобы все другие объекты оказались над ним.

Добавить вершину

Этот пункт меню доступен только при редактировании внешнего вида схемы и при условии, что выделена точка на линии, на ломанной, или на многоугольнике. Он вставляет новую вершину в фигуру. Перед вставкой выделенная точка отображается в виде ромба.

Удалить вершину

Этот пункт меню доступен только при редактировании внешнего вида схемы и при условии, что выделена вершина на ломанной или на многоугольнике. Он удаляет выделенную вершину. Перед вставкой выделенная вершина отображается в виде ромба внутри квадрата, представляющего вершину. Logisim не позволит удалить вершину из многоугольника с тремя вершинами или из ломанной с двумя вершинами.

Далее: Меню Проект.

logisim-2.7.1/doc/ru/html/guide/mem/0000755000175000017500000000000011541757146017107 5ustar vincentvincentlogisim-2.7.1/doc/ru/html/guide/mem/poke.html0000644000175000017500000000550611541757146020741 0ustar vincentvincent Нажатие на память

Нажатие на память

Вы можете манипулировать содержимым памяти, используя Инструмент Нажатие, но интерфейс для этого серьёзно ограничен размерами: если вам нужно больше, чем простейшее редактирование, то вы, вероятно, найдёте встроенный шестнадцатеричный редактор гораздо более удобным.

Тем не менее, для просмотра и редактирования значений в схеме Инструмент Нажатие имеет два режима работы: вы можете изменять отображаемый адрес и отдельное значение.

Чтобы изменить отображаемый адрес, щёлкните за пределами прямоугольника со значениями. Logisim нарисует красный прямоугольник вокруг верхнего адреса.

  • Ввод шестнадцатеричных цифр будет изменять верхний адрес.

  • Нажатие клавиши Enter пролистает одну строку вниз.

  • Нажатие клавиши Backspace пролистает одну строку вверх.

  • Нажатие пробела пролистает на одну страницу вниз (4 строки).

Для изменения определённого значения нажмите на значение внутри прямоугольника. Logisim нарисует красный прямоугольник вокруг этого адреса.

  • Ввод шестнадцатеричных цифр будет изменять значение по редактируемому адресу.

  • Нажатие клавиши Enter приведёт к редактированию значения на одну строку ниже.

  • Нажатие клавиши Backspace приведёт к редактированию значения по предыдущему адресу.

  • Нажатие пробела приведёт к редактированию значения по следующему адресу.

Далее: Всплывающие меню и файлы.

logisim-2.7.1/doc/ru/html/guide/mem/menu.html0000644000175000017500000000714511541757146020750 0ustar vincentvincent Всплывающие меню и файлы

Всплывающие меню и файлы

Всплывающее меню для памяти включает в себя четыре пункта, в дополнение к опциям, общим для всех компонентов:

  • Редактировать содержимое: вызывает шестнадцатеричный редактор для редактирования содержимого памяти.
  • Очистить содержимое: сбрасывает все значения памяти на 0.
  • Загрузить образ...: устанавливает все значения в памяти, основываясь на значениях, содержащихся в файле, используя формат, описанный ниже.
  • Сохранить образ...: записывает все значения из памяти в файл, используя формат, описанный ниже.

Формат файла, используемый для файлов образов, намеренно сделан простым; это позволяет вам писать программы, такие как ассемблер, которые генерируют образы памяти, которые могут быть загружены в память. Вот пример этого формата файла. Если бы мы имели 256-байтовую память, чьи первые пять байт 2, 3, 0, 20, и -1, а все последующие значения - 0, то образом был бы следующий текстовый файл.

v2.0 raw
02
03
00
14
ff

Первая строка определяет используемый формат (в настоящее время есть только один распознаваемый формат). Последующие значения перечисляют значения в шестнадцатеричной форме, начиная с адреса 0; вы можете разместить несколько таких значений на одной строке. Если ячеек памяти больше, чем указано в файле, то Logisim загрузит 0 в остальные ячейки.

Файл образа может использовать кодирование повторов; например, вместо перечисления значения 00 шестнадцать раз подряд, файл может включать 16*00. Обратите внимание, что количество повторений записывается по основанию 10. Файлы, созданные Logisim, будут использовать кодирование повторов для последовательностей из по крайней мере четырёх одинаковых значений.

Вы можете размещать комментарии в файле, используя символ '#': все символы в строке, начиная с '#' будут игнорироваться Logisim.

Далее: Шестнадцатеричный редактор.

logisim-2.7.1/doc/ru/html/guide/mem/index.html0000644000175000017500000000274211541757146021111 0ustar vincentvincent Компоненты памяти

Компоненты памяти

Компоненты ОЗУ и ПЗУ - два из наиболее полезных компонентов во встроенной библиотеке Logisim. Однако, в силу большого объёма информации, которую они могут хранить, они также - два из наиболее сложных компонентов.

Документацию по их работе в схеме можно найти на страницах ОЗУ и ПЗУ справки по библиотеке. Эти разделы руководства пользователя объясняют интерфейс, позволяющий пользователю просматривать и изменять содержимое памяти.

Нажатие на память
Всплывающие меню и файлы
Встроенный шестнадцатеричный редактор Logisim

Далее: Нажатие на память.

logisim-2.7.1/doc/ru/html/guide/mem/hex.html0000644000175000017500000000540611541757146020566 0ustar vincentvincent Шестнадцатеричный редактор

Шестнадцатеричный редактор

Logisim включает в себя встроенный шестнадцатеричный редактор для просмотра и редактирования содержимого памяти. Для доступа к нему вызовите всплывающее меню компонента памяти и выберите Редактировать содержимое... . Для компонентов ПЗУ, содержимое памяти которых - часть значения атрибута, вы можете получить доступ к шестнадцатеричному редактору, нажав на соответствующее значение атрибута.

Числа, выделенные курсивом слева, отображают адреса памяти, записанные в шестнадцатеричной форме. Другие числа отображают значения, начиная с этого адреса памяти; шестнадцатеричный редактор может отображать 4, 8 или 16 значений в каждой строке, в зависимости от того, что вписывается в окно. Чтобы помочь в подсчёте, каждая группа из четырех значений имеет больший промежуток между ними.

Вы можете перемещаться по памяти с помощью полосы прокрутки или с помощью клавиатуры (клавиши со стрелками, Home, End, Page Up, и Page Down). Ввод шестнадцатеричных символов будет изменять выбранное значение.

Вы можете выбрать диапазон значений перетаскиванием мыши, щелчком мыши с нажатой Shift, или перемещаясь по памяти с помощью клавиатуры с нажатой Shift. Значения могут быть копированы и вставлены с помощью меню Правка; также, буфер обмена может быть передан в другие приложения.

Далее: Руководство пользователя.

logisim-2.7.1/doc/ru/html/guide/log/0000755000175000017500000000000011541757146017112 5ustar vincentvincentlogisim-2.7.1/doc/ru/html/guide/log/table.html0000644000175000017500000000255111541757146021072 0ustar vincentvincent Вкладка Таблица

Вкладка Таблица

Вкладка Таблица отображает текущий журнал графически.

Таблица содержит столбец для каждого компонента в выборке. Каждая строка в таблице показывает снимок моделирования после завершения просчёта значений. Повторяющиеся строки не добавляются в журнал. Обратите внимание, что отображаются только последние 400 строк. Некоторые строки могут иметь пустые записи, если соответствующий компонент не был в выборке в то время, когда строка была вычислена.

Отображаемая таблица - только для просмотра; она не интерактивна.

Далее: Вкладка Файл.

logisim-2.7.1/doc/ru/html/guide/log/selection.html0000644000175000017500000000764611541757146022002 0ustar vincentvincent Вкладка Выбор

Вкладка Выбор

Вкладка Выбор позволяет вам выбрать, какие значения должны быть включены в журнал. Окно ниже соответствует следующей схеме.



Вкладка разделена на три вертикальных области. Первая (крайняя слева) представляет собой список всех компонентов схемы, значения которых могут быть записаны в журнал. Среди встроенных библиотек следующие типы компонентов поддерживают запись в журнал.

Библиотека Проводка: компоненты Контакт, Датчик и Тактовый генератор
Библиотека Ввод/вывод: компоненты Кнопка и Светодиод
Библиотека Память: все компоненты за исключением ПЗУ
Для компонентов, имеющих метки, связанные с ними, имена соответствуют меткам; имена других компонентов определяют их тип и расположение в схеме. Все подсхемы также появятся в списке; их нельзя выбрать для записи, но подходящие компоненты внутри них - можно. Обратите внимание, что компонент ОЗУ требует выбрать, какие адреса памяти должны записываться в журнал; он поддерживает запись только первых 256 адресов.

Последняя (крайняя правая) вертикальная область содержит список тех компонентов, которые были выбраны. Кроме того, в ней указывается основание, по которому многобитные значения компонента будут записываться; основание не влияет на однобитные значения.

Средний столбец кнопок позволяет манипулировать элементами внутри выборки.

  • Добавить добавляет в выборку выделенный в левой области элемент (или несколько).
  • Изменить основание переключает основание для компонента, выделенного в данный момент в выборке между 2 (двоичным), 10 (десятичным), и 16 (шестнадцатеричным).
  • Сдвинуть вверх перемещает компонент, выделенный в данный момент в выборке, вверх на одну позицию.
  • Сдвинуть вниз перемещает компонент, выделенный в данный момент в выборке, вниз на одну позицию.
  • Удалить удаляет компонент, выделенный в данный момент в выборке.

Далее: Вкладка Таблица.

logisim-2.7.1/doc/ru/html/guide/log/index.html0000644000175000017500000000530611541757146021113 0ustar vincentvincent Запись в журнал

Запись в журнал

При тестировании больших схем и при документировании поведения схемы, может быть полезен журнал поведения схемы. Это задача для модуля ведения журнала Logisim, который позволяет вам выбрать компоненты, чьи значения должны быть записаны в журнал; по желанию, вы можете указать файл, в который будет помещён журнал.

Вы можете войти в модуль ведения журнала через пункт Запись в журнал... меню Моделировать. Это вызовет окно с тремя вкладками.

Мы будем обсуждать каждую из этих вкладок отдельно.

Вкладка Выбор
Вкладка Таблица
Вкладка Файл

Каждый проект имеет только одно окно журнала; когда вы переключаетесь на просмотр другой схемы проекта, окно журнала автоматически переключается на запись журнала для другой схемы. То есть оно делает это, если вы не перемещаетесь вверх или вниз в пределах одного моделирования - в этом случае модуль ведения журнала остаётся неизменным.

Заметьте, что когда модуль ведения журнала переключается на запись другого моделирования, он перестаёт записывать что-либо в файл. Если вы вернётесь к предыдущему моделированию снова, он "вспомнит" настройки для этого моделирования, но вам нужно будет снова вручную включить запись журнала в файл.

Далее: Вкладка Выбор.

logisim-2.7.1/doc/ru/html/guide/log/file.html0000644000175000017500000000752511541757146020730 0ustar vincentvincent Вкладка Файл

Вкладка Файл

Вкладка Файл позволяет вам выбрать файл, в который будет помещён журнал.

Наверху - индикатор того, ведётся ли в данный момент запись в файл, и кнопка для её включения или выключения. (Обратите внимание, что вы не можете включить её, пока не выбран файл ниже.) Кнопка позволяет приостанавливать и начинать снова запись в файл. Когда вы переключаетесь в окне проекта на просмотр другого моделирования, запись журнала в файл автоматически останавливается; если вы вернулись к исходному моделированию, и хотите продолжить запись журнала, то вам придётся вручную включить её снова, используя кнопку наверху.

По середине - индикатор того, в какой файл ведётся запись журнала. Чтобы изменить его, используйте кнопку Выбрать... . После выбора файла запись в журнал начнётся автоматически. Если вы выберите уже существующий файл, то Logisim спросит, хотите вы перезаписать файл, или добавить новые записи в конец.

Внизу вы можете контролировать, должна ли быть добавлена в файл строка заголовка, указывающая, какие элементы выбраны. Если строки заголовка добавляются, то новая строка заголовка будет помещена в файл каждый раз, когда выборка изменяется.

Формат файла

Записи помещаются в файл с разделителями в виде символов табуляции, близко к тому, что появляется на вкладке Таблица. (Одним из отличий является то, что любая строка заголовка будет содержать полный путь к компонентам, находящимся в подсхемах.) Формат специально сделан таким простым, чтобы вы могли передать файл в другую программу для обработки, например в скрипт на Python/Perl или в электронную таблицу.

Поскольку скрипт может обрабатывать файл в то время, когда Logisim запущен, Logisim сбрасывает новые записи на диск каждые 500 мс. Обратите внимание, что Logisim может периодически закрывать и затем повторно открывать файл при моделировании; в частности, если прошло несколько секунд без добавления каких-либо новых записей.

Далее: Руководство пользователя.

logisim-2.7.1/doc/ru/html/guide/jar/0000755000175000017500000000000011541757146017105 5ustar vincentvincentlogisim-2.7.1/doc/ru/html/guide/jar/simpctr.html0000644000175000017500000002365011541757146021462 0ustar vincentvincent Простой счётчик кода Грея

Простой счётчик кода Грея

Часто нам нужны компоненты, которые не являются исключительно комбинационными по своей сути - то есть, мы хотим, чтобы компонент имел некоторую память. Существует важная тонкость в объявлении таких компонентов: у вас не может быть компонента, который сам по себе хранит состояние, так как конкретный компонент может встречаться несколько раз в той же схеме. Он не может появиться в схеме несколько раз непосредственно, но он может появиться несколько раз, если он встречается в подсхеме, которая используется несколько раз.

Решение состоит в том, чтобы создать новый класс для представления текущего состояния объекта, и ассоциировать его экземпляры с компонентом через состояние родительской схемы. В этом примере, который реализует реагирующий на фронт 4-битный счётчик кода Грея, мы объявляем класс CounterData для представления состояния счётчика, в дополнение к подклассу InstanceFactory, как было показано раньше. Объект CounterData запоминает как состояние текущего состояния счётчика, так и последнее состояние тактового входа (чтобы обнаруживать передние фронты).

CounterData

package com.cburch.gray;

import com.cburch.logisim.data.BitWidth;
import com.cburch.logisim.data.Value;
import com.cburch.logisim.instance.InstanceData;
import com.cburch.logisim.instance.InstanceState;

/** Представляет состояние счетчика. */
class CounterData implements InstanceData, Cloneable {
    /** Получает состояние, связанное с этим счётчиком в состоянии схемы,
     * генерируя состояние, если необходимо.
     */
    public static CounterData get(InstanceState state, BitWidth width) {
        CounterData ret = (CounterData) state.getData();
        if(ret == null) {
            // Если оно ещё не существует, то мы установим его на наши
            // значения по умолчанию, и добавим его в состояние схемы, так что оно может быть получено
            // в следующих просчётах.
            ret = new CounterData(null, Value.createKnown(width, 0));
            state.setData(ret);
        } else if(!ret.value.getBitWidth().equals(width)) {
            ret.value = ret.value.extendWidth(width.getWidth(), Value.FALSE);
        }
        return ret;
    }

    /** Последнее наблюдаемое значение на тактовом входе. */
    private Value lastClock;
    
    /** Текущее значение, выдаваемое счётчиком. */
    private Value value;

    /** Создает состояние с заданными значениями. */
    public CounterData(Value lastClock, Value value) {
        this.lastClock = lastClock;
        this.value = value;
    }

    /** Возвращает копию этого объекта. */
    public Object clone() {
        // Мы можем просто использовать то, что возвращает super.clone(): только переменные экземпляра являются
        // объектами Value, которые неизменяемы, так что нас не волнует, что и копия,
        // и оригинал ссылаются на одни и те же объекты Value. Если бы мы имели изменяемые переменные экземпляра,
        // то, конечно, нам пришлось бы клонировать их.
        try { return super.clone(); }
        catch(CloneNotSupportedException e) { return null; }
    }
    
    /** Обновляет последнее наблюдаемое значение на тактовом входе, возвращая истину, если он сработал. */
    public boolean updateClock(Value value) {
        Value old = lastClock;
        lastClock = value;
        return old == Value.FALSE && value == Value.TRUE;
    }
    
    /** Возвращает текущее значение, выдаваемое счётчиком. */
    public Value getValue() {
        return value;
    }
    
    /** Обновляет текущее значение, выдаваемое счётчиком. */
    public void setValue(Value value) {
        this.value = value;
    }
}

SimpleCounter

package com.cburch.gray;

import com.cburch.logisim.data.BitWidth;
import com.cburch.logisim.data.Bounds;
import com.cburch.logisim.data.Direction;
import com.cburch.logisim.instance.InstanceFactory;
import com.cburch.logisim.instance.InstancePainter;
import com.cburch.logisim.instance.InstanceState;
import com.cburch.logisim.instance.Port;
import com.cburch.logisim.util.GraphicsUtil;
import com.cburch.logisim.util.StringUtil;

/** Создаёт простой счётчик, который пробегает по очереди 4-битные коды Грея. Этот
 * пример показывает, как компонент может сохранять своё внутреннее состояние. Весь
 * код, относящийся к состоянию, появляется в классе CounterData. */
class SimpleGrayCounter extends InstanceFactory {
    private static final BitWidth BIT_WIDTH = BitWidth.create(4);
    
    // Опять же, заметьте, что у нас нет никаких переменных экземпляра, связанных с
    // состоянием конкретного экземпляра. Мы не можем поместить их здесь, потому что только один
    // объект SimpleGrayCounter вообще создаётся, и его работа - управлять всеми
    // экземплярами, появляющимися во всех схемах.
    
    public SimpleGrayCounter() {
        super("Gray Counter (Simple)");
        setOffsetBounds(Bounds.create(-30, -15, 30, 30));
        setPorts(new Port[] {
                new Port(-30, 0, Port.INPUT, 1),
                new Port(  0, 0, Port.OUTPUT, BIT_WIDTH.getWidth()),
        });
    }

    public void propagate(InstanceState state) {
        // Здесь я получаю состояние, связанное с этим компонентом через вспомогательный
        // метод. В данном случае состояние - это объект CounterData, который также есть
        // там, где объявлен вспомогательный метод. Этот вспомогательный метод закончит
        // созданием объекта CounterData, если ещё ни одного не существует.
        CounterData cur = CounterData.get(state, BIT_WIDTH);

        boolean trigger = cur.updateClock(state.getPort(0));
        if(trigger) cur.setValue(GrayIncrementer.nextGray(cur.getValue()));
        state.setPort(1, cur.getValue(), 9);
        
        // (Вы, возможно, подумываете о том, чтобы определить текущее состояние счётчика
        // через state.getPort(1). Это ошибка, потому что другой
        // компонент может записывать значение в эту же точку, и это
        // "испортит" значение, содержащееся там. Нам действительно нужно хранить
        // текущее значение в экземпляре.)
    }

    public void paintInstance(InstancePainter painter) {
        painter.drawBounds();
        painter.drawClock(0, Direction.EAST); // draw a triangle on port 0
        painter.drawPort(1); // draw port 1 as just a dot
        
        // Отобразить текущее значение счётчика по центру прямоугольника.
        // Впрочем, если по контексту показывать состояние не надо (при составлении
        // вида для печати), то пропустить это.
        if(painter.getShowState()) {
            CounterData state = CounterData.get(painter, BIT_WIDTH);
            Bounds bds = painter.getBounds();
            GraphicsUtil.drawCenteredText(painter.getGraphics(),
                    StringUtil.toHexString(BIT_WIDTH.getWidth(), state.getValue().toIntValue()),
                    bds.getX() + bds.getWidth() / 2,
                    bds.getY() + bds.getHeight() / 2);
        }
    }
}

Next: Gray Code Counter.

logisim-2.7.1/doc/ru/html/guide/jar/library.html0000644000175000017500000000564011541757146021444 0ustar vincentvincent Класс Library

Класс Library

Точка доступа для JAR библиотеки - это класс, расширяющий класс Library. Основная задача библиотеки - перечислить инструменты, доступные через библиотеку; чаще всего, все инструменты - это инструменты для добавления различных объявленных компонентов, то есть экземпляры класса AddTool, работающие с разными фабриками компонентов.

Components

package com.cburch.gray;

import java.util.Arrays;
import java.util.List;

import com.cburch.logisim.tools.AddTool;
import com.cburch.logisim.tools.Library;

/** The library of components that the user can access. */
public class Components extends Library {
    /** Список всех инструментов, содержащихся в этой библиотеке. Технически,
     * библиотеки содержат инструменты, являющиеся несколько более общим понятием,
     * чем компоненты; с практической точки зрения, однако, вы чаще захотите
     * создать AddTools для новых компонентов, которые могут быть добавлены в схему.
     */
    private List<AddTool> tools;
    
    /** Создаёт экземпляр этой библиотеки. Этот конструктор - это то, к чему
     * Logisim получает доступ в первую очередь, когда открывает JAR файл: он ищет
     * метод-конструктор без аргументов объявленного пользователем класса.
     */
    public Components() {
        tools = Arrays.asList(new AddTool[] {
                new AddTool(new GrayIncrementer()),
                new AddTool(new SimpleGrayCounter()),
                new AddTool(new GrayCounter()),
        });
    }
    
    /** Возвращает имя библиотеки, которое будет видеть пользователь. */ 
    public String getDisplayName() {
        return "Gray Tools";
    }
    
    /** Возвращает список всех инструментов, доступных в этой библиотеке. */
    public List<AddTool> getTools() {
        return tools;
    }
}

Далее: Простой счётчик кода Грея.

logisim-2.7.1/doc/ru/html/guide/jar/index.html0000644000175000017500000001710011541757146021101 0ustar vincentvincent Библиотеки JAR

Библиотеки JAR

Использование JAR библиотек

В Logisim есть два типа компонентов схемы: те, которые разработаны в Logisim как сочетания компонентов, и примитивные компоненты, написанные на Java. Схемы Logisim проще в разработке, но они не могут поддерживать сложные взаимодействия с пользователем, и они относительно неэффективны.

Logisim содержит достаточно полную коллекцию встроенных библиотек компонентов Java, но он также может загружать дополнительные библиотеки, написанные вами или другими людьми. После того, как вы загрузили библиотеку, вы можете импортировать её в ваш проект, щёлкнув правой кнопкой мыши на проекте в панели проводника (верхняя строка), и выбрав Загрузить библиотеку > Библиотека JAR... . Затем Logisim предложит вам выбрать JAR файл. (В некоторых случаях, вам возможно придётся ввести имя стартового класса, которое должно быть предоставлено разработчиком библиотеки. Впрочем, разработчик обычно настраивает JAR библиотеку так, чтобы избежать этого (включением в JAR файла manifest с атрибутом Library-Class, указывающим имя главного класса).)

Создание JAR библиотек

Оставшаяся часть этого раздела отведена под ряд тщательно прокомментированных примеров, иллюстрирующих, как разрабатывать библиотеки Logisim самостоятельно. Вам стоит пробовать это, только если вы опытный Java программист. Документация за пределами этих примеров покажется вам довольно скудной.

Вы можете скачать JAR файл, позволяющий импортировать эти примеры в Logisim, через раздел Ссылки сайта Logisim. Этот JAR файл также содержит исходный код, содержащийся в этих примерах.

Инкрементатор кода Грея

Иллюстрирует важнейшие элементы любого типа компонентов, используя простой пример компонента, который принимает многобитное значение на входе и вычисляет следующее после него значение кода Грея.

Класс Library

Показывает, как объявить библиотеку. Это входная точка для любого JAR файла - класс, имя которого пользователь вводит при загрузке JAR библиотеки.

Простой счётчик кода Грея

Показывает, как сделать компонент, имеющий внутреннее состояние, в частности, 8-битный счётчик, который перебирает коды Грея.

Счётчик кода Грея

Демонстрирует полный, довольно сложный компонент, с которым пользователь может взаимодействовать. Он реализует счётчик кода Грея, в котором число запоминаемых битов настраивается, и в котором пользователь может изменить текущее значение, нажав на нём Инструментом Нажатие и введя значение.

Указания
Общая информация по разработке сторонних библиотек.

Лицензия

Код в этом примере JAR библиотеки выпущен под лицензией MIT, более либеральной лицензией, чем GPL, под которой выпущена остальная часть Logisim.

Copyright (c) 2009, Carl Burch.

Данная лицензия разрешает, безвозмездно, лицам, получившим копию данного программного обеспечения и сопутствующей документации (в дальнейшем именуемыми "Программное Обеспечение"), использовать Программное Обеспечение без ограничений, включая неограниченное право на использование, копирование, изменение, добавление, публикацию, распространение, сублицензирование и/или продажу копий Программного Обеспечения, также как и лицам, которым предоставляется данное Программное Обеспечение, при соблюдении следующих условий:

Вышеупомянутый копирайт и данные условия должны быть включены во все копии или значимые части данного Программного Обеспечения.

ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ ЛЮБОГО ВИДА ГАРАНТИЙ, ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ГАРАНТИЯМИ ТОВАРНОЙ ПРИГОДНОСТИ, СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И НЕНАРУШЕНИЯ ПРАВ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ПО ИСКАМ О ВОЗМЕЩЕНИИ УЩЕРБА, УБЫТКОВ ИЛИ ДРУГИХ ТРЕБОВАНИЙ ПО ДЕЙСТВУЮЩИМ КОНТРАКТАМ, ДЕЛИКТАМ ИЛИ ИНОМУ, ВОЗНИКШИМ ИЗ, ИМЕЮЩИМ ПРИЧИНОЙ ИЛИ СВЯЗАННЫМ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ИЛИ ИНЫМИ ДЕЙСТВИЯМИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.

Далее: Инкрементатор кода Грея.

logisim-2.7.1/doc/ru/html/guide/jar/incr.html0000644000175000017500000003343211541757146020733 0ustar vincentvincent Инкрементатор кода Грея

Инкрементатор кода Грея

Каждый компонент, включенный в библиотеку, объявляется путём создания подкласса InstanceFactory, расположенного в пакете com.cburch.logisim.instance. Этот подкласс содержит весь необходимый код.

(Здесь мы описываем API текущей версии Logisim. Вы можете найти некоторые библиотеки, разработанные для более ранних версий Logisim, в которых компоненты были разработаны путём объявления двух классов; один - расширяющий Component и другой - расширяющий ComponentFactory. Версия 2.3.0 вводит гораздо более простой API InstanceFactory; старые приёмы являются устаревшими.)

Три пакета Logisim объявляют большинство классов, имеющих отношение к объявлению библиотек компонентов.

com.cburch.logisim.instance

Содержит классы, непосредственно связанные с объявлением компонентов, в том числе классы InstanceFactory, InstanceState, InstancePainter, и Instance.

com.cburch.logisim.data

Содержит классы, связанные с элементами данных, связанных с компонентами, такие как класс Bounds для представления ограничивающих прямоугольников или класс Value для представления значений, которые может передавать провод.

com.cburch.logisim.tools

Содержит классы, связанные с объявлением библиотеки.

О коде Грея

Прежде чем мы продолжим, позвольте мне кратко описать код Грея, на котором основаны эти примеры. Это не так важно для понимания того, как эти примеры работают, так что вы можете спокойно пропустить текст до кода ниже, если хотите; особенно если вы уже знаете код Грея.

Код Грея - это техника (по имени Фрэнка Грея) для итерации n-битной последовательности с изменением только одного бита на каждом шаге. В качестве примера, рассмотрим 4-битный код Грея, приведённый ниже.

0000
0001
0011
0010
       0110
0111
0101
0100
       1100
1101
1111
1110
       1010
1011
1001
1000

Каждое значение имеет подчёркнутый бит, который изменится для следующего значения в последовательности. Например, после 0000 идет 0001, в котором последний бит был переключен, поэтому последний бит подчёркнут.

Встроенные компоненты Logisim не включают в себя ничего, что работало бы с кодом Грея. Но разработчики электроники иногда находят код Грея полезным. Один из наиболее заметных примеров использования кода Грея - вдоль осей в картах Карно.

GrayIncrementer

Это минимальный пример, иллюстрирующий основные элементы для объявления компонента. Данный компонент - инкрементатор, который принимает многобитное значение на входе и выдаёт следующий код Грея в последовательности.

package com.cburch.gray;

import com.cburch.logisim.data.Attribute;
import com.cburch.logisim.data.BitWidth;
import com.cburch.logisim.data.Bounds;
import com.cburch.logisim.data.Value;
import com.cburch.logisim.instance.InstanceFactory;
import com.cburch.logisim.instance.InstancePainter;
import com.cburch.logisim.instance.InstanceState;
import com.cburch.logisim.instance.Port;
import com.cburch.logisim.instance.StdAttr;

/** Этот компонент принимает многобитное значение на входе и выдаёт значение, следующее за ним
 * в коде Грея. Например, при входном значении 0100 на выходе будет 1100. */
class GrayIncrementer extends InstanceFactory {
    /* Обратите внимание на то, что нет переменных экземпляра. Только один экземпляр
     * создан этим классом, и он управляет всеми экземплярами компонента. С любой
     * информацией, связанной с отдельными экземплярами нужно работать
     * через атрибуты. Для GrayIncrementer каждый экземпляр имеет "разрядность",
     * с которой он работает, так что у нас будет атрибут. */

    /** Конструктор конфигурирует фабрику. */
    GrayIncrementer() {
        super("Gray Code Incrementer");
        
        /* Так мы можем устанавливать атрибуты для GrayIncrementer'ов. В
         * этом случае атрибут только один - разрядность - и он по умолчанию
         * равен 4. Класс StdAttr объявляет некоторые часто встречающиеся
         * атрибуты, включая "разрядность". Лучше использовать эти
         * атрибуты StdAttr, когда это уместно: пользователь может выбрать несколько
         * компонентов (даже из разных фабрик) с одинаковым атрибутом
         * и изменять их все сразу. */
        setAttributes(new Attribute[] { StdAttr.WIDTH },
                new Object[] { BitWidth.create(4) });
        
        /* "Offset bounds" - это положение ограничивающего прямоугольника
         * относительно положения мыши. Здесь мы задаём компонент
         * 30x30, и закрепляем его относительно его основного выхода
         * (это типично для Logisim), расположенного в центре
         * восточного края. Так, левый верхний угол ограничивающего прямоугольника на 30 пикселей
         * западнее и на 15 пикселей севернее положения мыши. */
        setOffsetBounds(Bounds.create(-30, -15, 30, 30));
        
        /* Порты - это места, где провода могут быть присоединены к этому
         * компоненту. Каждый объект Port говорит, где искать порт относительно
         * места крепления компонента, затем является ли порт
         * входом/выходом/обоими, и наконец ожидаемую разрядность для порта.
         * Разрядность может быть константой (например, 1) или атрибутом (как здесь).
         */
        setPorts(new Port[] {
                new Port(-30, 0, Port.INPUT, StdAttr.WIDTH),
                new Port(0, 0, Port.OUTPUT, StdAttr.WIDTH),
            });
    }

    /** Вычисляет текущее значение на выходе для этого компонента. Этот метод вызывается
     * каждый раз, когда значение на любом из входов меняется; он также может быть вызван при
     * других обстоятельствах, даже если нет никаких оснований ожидать, что он изменит
     * что-то. */
    public void propagate(InstanceState state) {
        // Сначала мы получаем значение, поданное на вход. Отметим, что при
        // вызове setPorts выше, вход компонента был включен
        // с индексом 0 в массив-параметр, так что мы используем 0 как параметр ниже.
        Value in = state.getPort(0);
        
        // Теперь вычислим значение на выходе. Мы передали эту работу вспомогательному методу,
        // раз уж такая логика приемлема для других библиотечных компонентов.
        Value out = nextGray(in);
        
        // Наконец, мы передаём значение с выхода дальше в схему. Первый параметр
        // равен 1, потому что в нашем списке портов (сформированном вызовом
        // setPorts выше) выход имеет индекс 1. Второй параметр - это
        // значение, которое мы хотим послать на этот порт. И последний параметр - это его
        // "задержка" - количество шагов, которое уйдёт на обновление выхода
        // после поступления значения на вход.
        state.setPort(1, out, out.getWidth() + 1);
    }

    /** Говорит, как должен отдельный экземпляр появляться на холсте. */
    public void paintInstance(InstancePainter painter) {
        // Когда это происходит, InstancePainter содержит несколько удобных методов
        // для отрисовки и мы будем использовать их здесь. Часто вам захочется
        // получить его объект Graphics (painter.getGraphics), так что вы сможете рисовать
        // непосредственно на холсте.
        painter.drawRectangle(painter.getBounds(), "G+1");
        painter.drawPorts();
    }
    
    /** Вычисляет следующее значение кода Грея в последовательности после предыдущего. Этот статический
     * метод просто выполняет некоторые манипуляции с битами; ему не надо делать ничего особенного с
     * Logisim, за исключением того, что он манипулирует с объектами Value и BitWidth. */
    static Value nextGray(Value prev) {
        BitWidth bits = prev.getBitWidth();
        if(!prev.isFullyDefined()) return Value.createError(bits);
        int x = prev.toIntValue();
        int ct = (x >> 16) ^ x; // вычислить соотношение для x
        ct = (ct >> 8) ^ ct;
        ct = (ct >> 4) ^ ct;
        ct = (ct >> 2) ^ ct;
        ct = (ct >> 1) ^ ct;
        if((ct & 1) == 0) { // если соотношение чётное, то поменять первый бит
            x = x ^ 1;
        } else { // иначе поменять бит сразу выше последней 1
            int y = x ^ (x & (x - 1)); // сначала вычислить последнюю 1
            y = (y << 1) & bits.getMask();
            x = (y == 0 ? 0 : x ^ y);
        }
        return Value.createKnown(bits, x);
    }
}

Этого примера самого по себе недостаточно, чтобы создать работающий JAR файл; вы должны ещё предусмотреть класс Library, как показано на следующей странице.

Далее: Класс Library.

logisim-2.7.1/doc/ru/html/guide/jar/guide.html0000644000175000017500000000545311541757146021077 0ustar vincentvincent Указания

Указания

Дальнейшее изучение

Помимо ряда примеров, приведённых здесь, исходные коды Logisim предоставляют много дополнительных примеров, хотя они не всегда иллюстрируют ту же заботу об удобочитаемости и хорошем дизайне.

Для максимальной переносимости на будущие версии вам следует насколько возможно придерживаться использования классов в пакетах ...instance, ...data, и ...tools. Конечно, вы можете использовать API других пакетов, но они более уязвимы к изменениям в будущих версиях Logisim.

Я в целом готов ответить на некоторые просьбы о помощи. И сообщения об ошибках и предложения по улучшению, конечно, всегда приветствуются.

Распространение

Вы можете свободно распространять любые разработанные вами JARы без ограничений. Ограничения GPL применяются, однако, если часть вашей работы основана на исходном коде Logisim (выпущенного под GPL). Разработанное на основе кода примеров этого раздела Руководства пользователя не подвергается таким ограничениям; эти примеры выпущены под лицензией MIT.

Если вы хотите поделиться своими библиотеки с другими пользователями Logisim, я буду рад предоставить ссылку на хостинг веб-страницы или сам JAR файл на сайте Logisim. Если вы считаете, что ваша библиотека должна быть встроена в основной выпуск Logisim, то я приветствую ваше предложение, и я буду рад признать ваш вклад в выпуски Logisim, включающие вашу работу.

Далее: Руководство пользователя.

logisim-2.7.1/doc/ru/html/guide/jar/counter.html0000644000175000017500000002376611541757146021470 0ustar vincentvincent Счётчик кода Грея

Счётчик кода Грея

Этот курс по библиотекам Logisim завершается довольно сложным счётчиком кода Грея, который позволяет пользователю менять его текущее значение, используя Инструмент Нажатие и размещать на компоненте метку, используя Инструмент Текст. Он также настраивает значок в проводнике, связанный с этим инструментом.

GrayCounter

package com.cburch.gray;

import java.net.URL;

import javax.swing.ImageIcon;

import com.cburch.logisim.data.Attribute;
import com.cburch.logisim.data.BitWidth;
import com.cburch.logisim.data.Bounds;
import com.cburch.logisim.data.Direction;
import com.cburch.logisim.instance.Instance;
import com.cburch.logisim.instance.InstanceFactory;
import com.cburch.logisim.instance.InstancePainter;
import com.cburch.logisim.instance.InstanceState;
import com.cburch.logisim.instance.Port;
import com.cburch.logisim.instance.StdAttr;
import com.cburch.logisim.util.GraphicsUtil;
import com.cburch.logisim.util.StringUtil;

/** Создаёт счётчик, который пробегает по очереди коды Грея. Он демонстрирует
 * некоторые дополнительные возможности по сравнению с классом SimpleGrayCounter. */
class GrayCounter extends InstanceFactory {
    public GrayCounter() {
        super("Gray Counter");
        setOffsetBounds(Bounds.create(-30, -15, 30, 30));
        setPorts(new Port[] {
                new Port(-30, 0, Port.INPUT, 1),
                new Port(  0, 0, Port.OUTPUT, StdAttr.WIDTH),
        });
        
        // У нас будут атрибуты ширина, метка и шрифт метки. Последние два
        // атрибута позволяют нам связать метку с компонентом (однако,
        // нам также нужен configureNewInstance для настройки расположения
        // метки).
        setAttributes(
                new Attribute[] { StdAttr.WIDTH, StdAttr.LABEL, StdAttr.LABEL_FONT },
                new Object[] { BitWidth.create(4), "", StdAttr.DEFAULT_LABEL_FONT });
        
        // Следующее обращение к методу устанавливает всё так, чтобы состоянием
        // экземпляра можно было управлять с помощью Инструмента Нажатие.
        setInstancePoker(CounterPoker.class);
        
        // Следующие две строчки настраивают его так, чтобы окно проводника показывало
        // определённый значок, представляющий тип компонента. Это должно быть
        // изображение 16x16.
        URL url = getClass().getClassLoader().getResource("com/cburch/gray/counter.gif");
        if(url != null) setIcon(new ImageIcon(url));
    }
    
    /** Метод configureNewInstance вызывается каждый раз, когда создаётся
     * новый экземпляр. В суперклассе метод ничего не делает, поскольку
     * новый экземпляр уже довольно хорошо настроен по умолчанию. Но
     * иногда вам нужно делать что-то специфическое с каждым экземпляром, так что вам
     * придётся переопределить метод. В этом случае мы должны задать расположение
     * для его метки. */
    protected void configureNewInstance(Instance instance) {
        Bounds bds = instance.getBounds();
        instance.setTextField(StdAttr.LABEL, StdAttr.LABEL_FONT,
                bds.getX() + bds.getWidth() / 2, bds.getY() - 3,
                GraphicsUtil.H_CENTER, GraphicsUtil.V_BASELINE);
    }

    public void propagate(InstanceState state) {
        // Это так же, как и с SimpleGrayCounter, кроме того, что мы используем
        // атрибут StdAttr.WIDTH чтобы задать разрядность.
        BitWidth width = state.getAttributeValue(StdAttr.WIDTH);
        CounterData cur = CounterData.get(state, width);
        boolean trigger = cur.updateClock(state.getPort(0));
        if(trigger) cur.setValue(GrayIncrementer.nextGray(cur.getValue()));
        state.setPort(1, cur.getValue(), 9);
    }

    public void paintInstance(InstancePainter painter) {
        // Это по существу так же, как и с SimpleGrayCounter, за исключением
        // вызова painter.drawLabel чтобы сделать метку отрисованной.
        painter.drawBounds();
        painter.drawClock(0, Direction.EAST);
        painter.drawPort(1);
        painter.drawLabel();
        
        if(painter.getShowState()) {
            BitWidth width = painter.getAttributeValue(StdAttr.WIDTH);
            CounterData state = CounterData.get(painter, width);
            Bounds bds = painter.getBounds();
            GraphicsUtil.drawCenteredText(painter.getGraphics(),
                    StringUtil.toHexString(width.getWidth(), state.getValue().toIntValue()),
                    bds.getX() + bds.getWidth() / 2,
                    bds.getY() + bds.getHeight() / 2);
        }
    }
}

CounterPoker

package com.cburch.gray;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;

import com.cburch.logisim.data.BitWidth;
import com.cburch.logisim.data.Bounds;
import com.cburch.logisim.data.Value;
import com.cburch.logisim.instance.InstancePainter;
import com.cburch.logisim.instance.InstancePoker;
import com.cburch.logisim.instance.InstanceState;
import com.cburch.logisim.instance.StdAttr;

/** Когда пользователь щёлкает на счётчике, используя Инструмент Нажатие, объект CounterPoker
 * создан, и этот объект будет обрабатывать все события пользователя. Обратите внимание, что
 * CounterPoker - это класс, специфичный для GrayCounter, и что он должен быть
 * подклассом InstancePoker из пакета com.cburch.logisim.instance. */
public class CounterPoker extends InstancePoker {
    public CounterPoker() { }

    /** Определяет, должно ли положение, в котором нажата мышь,
     * инициировать нажатие. 
     */
    public boolean init(InstanceState state, MouseEvent e) {
        return state.getInstance().getBounds().contains(e.getX(), e.getY());
            // В любом месте главного прямоугольника инициирует нажатие. Пользователь может
            // нажать на метке, но это будет за пределами границ.
    }

    /** Рисует индикатор того, что указатель был выбран. Здесь мы будем рисовать
     * красный прямоугольник вокруг значения. */
    public void paint(InstancePainter painter) {
        Bounds bds = painter.getBounds();
        BitWidth width = painter.getAttributeValue(StdAttr.WIDTH);
        int len = (width.getWidth() + 3) / 4;

        Graphics g = painter.getGraphics();
        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);
    }

    /**Обрабатывает клавишу, просто добавив её в конец текущего значения. */
    public void keyTyped(InstanceState state, KeyEvent e) {
        // преобразовать её в шестнадцатеричное число; если она - не шестнадцатеричное число, то отменить.
        int val = Character.digit(e.getKeyChar(), 16);
        BitWidth width = state.getAttributeValue(StdAttr.WIDTH);
        if(val < 0 || (val & width.getMask()) != val) return;

        // вычислить следующее значение
        CounterData cur = CounterData.get(state, width);
        int newVal = (cur.getValue().toIntValue() * 16 + val) & width.getMask();
        Value newValue = Value.createKnown(width, newVal);
        cur.setValue(newValue);
        state.fireInvalidated();
        
        // Вы, возможно, подумываете о том, чтобы просчитать значение здесь сразу, используя
        // state.setPort. Однако, схема может просчитываться в данный момент в
        // другом потоке, и непосредственный вызов setPort может помешать
        // этому. Использование fireInvalidated уведомляет поток просчёта о том,
        // чтобы вызвать просчёт для счётчика при первой же возможности.
    }
}

Далее: Указания.

logisim-2.7.1/doc/ru/html/guide/index.html0000644000175000017500000000746311541757146020340 0ustar vincentvincent Руководство "Как стать пользователем Logisim"

Руководство "Как стать пользователем Logisim"

Logisim является образовательным инструментом для разработки и моделирования цифровых логических схем. Благодаря простому интерфейсу панели инструментов и моделированию схем по ходу их проектирования, Logisim достаточно прост, чтобы облегчить изучение основных понятий, связанных с логическими схемами. При возможности постройки больших схем из меньших подсхем и рисования пучков проводов одним перетаскиванием мыши, Logisim может быть использован (и используется) для проектирования и моделирования целых процессоров в образовательных целях.

Учащиеся колледжей и университетов по всему миру используют Logisim для различных целей, в том числе:

  • Как элемент обзорного курса информатики в общеобразовательных учреждениях
  • Как элемент курса организации ЭВМ следующего уровня
  • На протяжении всего семестра в курсах архитектуры компьютеров высокого уровня

Руководство "Как стать пользователем Logisim", которое вы сейчас читаете - это официальный обзор возможностей Logisim. Его первая часть представляет собой последовательность разделов, представляющих основные части Logisim. Эти разделы написаны так, что их можно читать "от корки до корки" чтобы узнать обо всех наиболее важных возможностях Logisim.

Пособие начинающего
Библиотеки и атрибуты
Подсхемы
Пучки проводов
Комбинационный анализ

Остальные разделы - разнородная куча справочных материалов и объяснений некоторых тонких моментов в Logisim.

Справка по меню
Компоненты памяти
Запись в журнал
Проверка из командной строки
Настройки приложения
Параметры проекта
Просчёт значений
Библиотеки JAR
О программе
logisim-2.7.1/doc/ru/html/guide/bundles/0000755000175000017500000000000011541757146017765 5ustar vincentvincentlogisim-2.7.1/doc/ru/html/guide/bundles/splitting.html0000644000175000017500000001165311541757146022676 0ustar vincentvincent Разветвители

Разветвители

При работе с многобитными значениями вам часто захочется направить разные биты по разным направлениям. Инструмент Разветвитель из библиотеки Проводка () позволяет вам решить эту задачу.

Например, предположим, что нам нужна схема, которая вычисляет побитовое И между двумя частями её восьмибитного входа (старшими четырьмя битами и младшими четырьмя битами). Мы будем иметь восьмибитное значение, поступающее с входного контакта, и мы хотим разделить его на два четырёхбитных значения. На схеме ниже мы использовали для этого разветвитель: 8-битный вход подводится к разветвителю, который разделяет 8 битов на два 4-битных значения, которые затем подаются на элемент И, а с него - на выход.

В этом пример разветвитель разделяет входящее значение на несколько исходящих значений. Но разветвители также могут работать по-другому: они могут объединять несколько значений в одно значение. На самом деле они не имеют направления: они могут пересылать значение один раз в одном направлении, а позже - в другом; они даже могут делать и то и другое одновременно, как показано в примере ниже, где значение проходит на восток через два разветвителя, затем направляется обратно через них на запад, и затем обратно на восток, где оно наконец достигает выхода.

Ключ к пониманию разветвителей - их атрибуты. Далее термин разъединённый конец относится к одному из нескольких проводов на одной стороне, а термин объединённый конец относится к одиночному проводу на другой стороне.

  • Атрибут Направление говорит о том, где должны быть разъединённые концы по отношению к объединённому концу.
  • Атрибут Веерный выход определяет, сколько должно быть разъединённых концов.
  • Атрибут Разрядность входа определяет разрядность объединённого конца.
  • Атрибут Бит x определяет, какой разъединённый конец соответствует биту x объединённого конца. Если несколько битов соответствуют одному и тому же разъединённому концу, то их относительный порядок будет тем же, что и в объединённом конце. Разветвители в Logisim не могут иметь соответствие бита в объединённом конце нескольким разъединённым концам.

Обратите внимание, что любые изменения атрибутов Веерный выход или Разрядность входа сбросят все атрибуты Бит x так, чтобы биты значения на объединённом конце были как можно более равномерно распределены между разделёнными концами.

Далее: Цвета проводов.

logisim-2.7.1/doc/ru/html/guide/bundles/index.html0000644000175000017500000000170611541757146021766 0ustar vincentvincent Пучки проводов

Пучки проводов

В простых схемах Logisim большинство проводов несут только один бит, но Logisim также позволяет вам создавать провода, связывающие вместе несколько битов. Количество битов, проходящих по проводу - это разрядность данного провода.

Создание пучков
Разветвители
Цвета проводов

Далее: Создание пучков.

logisim-2.7.1/doc/ru/html/guide/bundles/creating.html0000644000175000017500000000727211541757146022457 0ustar vincentvincent Создание пучков

Создание пучков

Каждый вход и выход каждого компонента в схеме имеет разрядность, связанную с ним. Часто разрядность равна 1, и нет никакого способа изменить это, но многие из встроенных компонентов Logisim включают атрибуты, позволяющие вам настроить разрядности их входов и выходов.

Снимок экрана ниже показывает простую схему для вычисления побитового И между двумя трёхбитными входами. Обратите внимание, что трёхбитный выход является побитовым И для двух входов. Все компоненты были настроены для работы с трёхбитными данными через их атрибут Биты данных; снимок экрана показывает атрибуты элемента И, включая атрибут Биты данных, имеющий значение 3.

Все компоненты Logisim определяют разрядность для каждого входа и выхода. Разрядность провода, напротив, не определена: вместо этого она подстраивается под компоненты, к которым провод присоединён. Если провод соединяет два компонента, требующие разную разрядность, Logisim пожалуется на "Несовместимые разрядности" и обозначит вызывающие проблему участки оранжевым цветом. Ниже атрибут Биты данных выходного контакта изменён на 1, так что Logisim жалуется, что провод не может соединить трёхбитное значение с однобитным.

Провода, которые соединяют несовместимые участки (отрисованные оранжевым), не передают значения.

Для однобитных проводов вы сразу можете увидеть, какое значение передаёт провод, потому что Logisim окрашивает провод в светло- или тёмно- зелёный в зависимости от значения. Значения, передаваемые многобитными проводами не отображаются: они просто чёрные. Вы можете, однако, исследовать провод, щёлкнув на нём Инструментом Нажатие ().

Эта возможность исследования полезна для отладки схем, использующих пучки проводов.

Далее: Разветвители.

logisim-2.7.1/doc/ru/html/guide/bundles/colors.html0000644000175000017500000000711711541757146022162 0ustar vincentvincent Цвета проводов

Цвета проводов

Сейчас нам уместно обобщить все цвета радуги, которые могут иметь провода в Logisim. Следующая небольшая схема демонстрирует их все одновременно.

  • Серый: Разрядность провода неизвестна. Это происходит потому, что провод не подключен к каким-либо входам или выходам компонента. (Все входы и выходы имеют определенную разрядность.)

  • Синий: Провод несёт однобитное значение, но ничто не передаёт определённое значение проводу. Мы называем это плавающим битом; некоторые называют это высокоимпедансным состоянием. В этом примере компонент, передающий значение проводу - контакт с тремя состояниями, поэтому он выдаёт это плавающее значение.

  • Тёмно-зелёный: Провод несёт однобитное значение 0.

  • Яркий зелёный: Провод несёт однобитное значение 1.

  • Чёрный: Провод несёт многобитное значение. Некоторые или все биты могут быть не определены.

  • Красный: Провод несёт значение ошибки. Это часто возникает из-за того, что элемент не может определить правильное выходное значение, или потому что ни на один вход не подано определённого значения. Также это часто возникает из-за того, что два компонента пытаются передать проводу два разных значения; это то, что происходит в примере выше, где один входной контакт передаёт проводу 0, а другой - передаёт 1 тому же проводу, вызывая конфликт. Многобитные провода станут красными, если какие-либо биты несут значение ошибки.

  • Оранжевый: Компоненты, присоединённые к проводу, не согласованы по разрядности. Оранжевый провод фактически "сломан": он не передаёт значения между компонентами. Здесь мы присоединили двухбитный компонент к однобитному, поэтому они несовместимы.

Далее: Руководство пользователя.

logisim-2.7.1/doc/ru/html/guide/attrlib/0000755000175000017500000000000011541757146017772 5ustar vincentvincentlogisim-2.7.1/doc/ru/html/guide/attrlib/tool.html0000644000175000017500000001122111541757146021632 0ustar vincentvincent Атрибуты инструментов

Атрибуты инструментов

Каждый инструмент для добавления компонентов в схему также имеет набор атрибутов, которые передаются компоненту, созданному с помощью этого инструмента, хотя атрибуты компонента могут быть изменены позднее, не затрагивая атрибуты инструмента. Когда вы выбираете инструмент, Logisim изменит таблицу атрибутов для отображения атрибутов инструмента.

Например предположим, что мы хотим создавать маленькие элементы И. Сейчас, каждый раз, когда мы выбираем инструмент Элемент И, он создаёт большой элемент И. Но если мы изменяем атрибут Размер элемента сразу после выбора инструмента (до размещения элемента И в схеме), то мы изменяем атрибуты для инструмента, так что в дальнейшем элементы И, добавленные с помощью этого инструмента, будут узкими, а не широкими.

Теперь мы можем удалить два существующих элемента И, и добавить два новых элемента И на их месте. На этот раз они будут узкими. (Если вы решили уменьшить число входов до 3, то элемент И не будет иметь вертикальное расширение на левой стороне. Но вы также должны перемонтировать схему так, чтобы провода подходили к левой стороне элемента И.)

Для некоторых инструментов значок инструмента отражает некоторые из значений атрибутов. Одним из таких примеров является инструмент Контакт, чей значок расположен так, как указано в его атрибуте Направление.

Каждый инструмент на панели инструментов имеет независимый набор атрибутов, свойственных соответствующему инструменту на панели проводника. Таким образом, хотя мы изменили инструмент Элемент И на панели инструментов для создания узких элементов И, инструмент Элемент И в библиотеке Элементы по-прежнему создаёт широкие элементы И, пока вы не измените и его атрибуты тоже.

На самом деле, инструменты Входной контакт и Выходной контакт на панели инструментов по умолчанию являются экземплярами инструмента Контакт библиотеки Проводка, но наборы атрибутов у них различны. Значок инструмента Контакт отрисовывается как круг или квадрат в зависимости от значения его атрибута "Выход?".

Logisim предоставляет быстрый удобный метод для изменения атрибута Направление, который управляет направлением, в котором ориентированы многие компоненты: нажатие клавиш со стрелками когда инструмент выбран, автоматически меняет направление компонента.

Далее: Руководство пользователя.

logisim-2.7.1/doc/ru/html/guide/attrlib/index.html0000644000175000017500000000170311541757146021770 0ustar vincentvincent Библиотеки и атрибуты

Библиотеки и атрибуты

В этом разделе мы рассмотрим, как использовать другие две основные области окна Logisim: панель проводника и таблицу атрибутов.

Панель проводника
Таблица атрибутов
Атрибуты инструментов и компонентов

Далее: Панель проводника.

logisim-2.7.1/doc/ru/html/guide/attrlib/explore.html0000644000175000017500000001522411541757146022342 0ustar vincentvincent Панель проводника

Панель проводника

Logisim организует инструменты в библиотеки. Они отображаются в виде папок в панели проводника; для доступа к компонентам библиотеки вам нужно дважды щёлкнуть соответствующую папку. Ниже я открыл библиотеку Элементы и выбрал инструмент И-НЕ из неё. Вы видите, что Logisim теперь готов добавить элемент И-НЕ в схему.

Если вы просмотрите варианты в библиотеке Элементы, вы заметите, что у нас не было необходимости разрабатывать схему Исключающее ИЛИ ранее: она встроена в Logisim.

При создании проекта он автоматически включает в себя несколько библиотек:

  • Проводка: компоненты, которые взаимодействуют непосредственно с проводами.
  • Элементы: компоненты, которые выполняют простые логические функции.
  • Плексоры: более сложные комбинационные компоненты, такие как мультиплексоры и декодеры.
  • Арифметика: компоненты, выполняющие арифметические действия.
  • Память: компоненты, хранящие данные, такие как триггеры, регистры, и ОЗУ.
  • Ввод/вывод: компоненты для взаимодействия с пользователем.
  • Базовые: инструменты, которые являются неотъемлемой частью использования Logisim, хотя вы, вероятно, не будете заглядывать в эту библиотеку очень часто.

Logisim также позволяет вам добавлять другие библиотеки с помощью подменю Загрузить библиотеку в меню Проект. Вы видите, что Logisim имеет три категории библиотек.

  • Встроенные библиотеки - библиотеки, распространяющиеся с Logisim. Они описаны в Справке по библиотеке.

  • Библиотеки Logisim - проекты, построенные в Logisim и сохранённые на диск как проект Logisim. Вы можете разработать набор схем в одном проекте (как описано в разделе Подсхемы данного руководства), а затем использовать этот набор схем в виде библиотеки для других проектов.

  • Библиотеки JAR - библиотеки, разработанные в Java, но не распространяемые вместе с Logisim. Вы можете скачать JAR библиотеки, написанные другими людьми, или же вы можете написать свои собственные, как описано в разделе Библиотеки JAR этого руководства. Разработка JAR библиотеки гораздо сложнее, чем разработка библиотеки Logisim, но компоненты могут быть гораздо более необычными, в том числе в плане атрибутов и взаимодействия с пользователем. Встроенные библиотеки (кроме библиотеки Базовые) были написаны с использованием того же API, что могут использовать библиотеки JAR, так что они удачно демонстрируют набор функциональных возможностей, которые JAR библиотеки могут поддерживать.

    Некоторые JAR библиотеки распространяются без какой-либо информации о том, с какого класса Java начинать. При загрузке таких JAR, Logisim предложит вам ввести имя класса. Это имя класса должно быть предоставлено тем, кто распространяет этот JAR файл.

Чтобы удалить библиотеку, выберите Выгрузить библиотеки... из меню Проект. Logisim предостережёт вас от выгрузки библиотек, которые содержат компоненты, используемые в схеме, присутствующие в панели инструментов, или привязанные к кнопке мыши.

Кстати, технически библиотека содержит инструменты, а не компоненты. Так, в библиотеке Базовые вы найдете Инструмент Нажатие (), Инструмент Правка(), и другие инструменты, которые не связаны напрямую с конкретными компонентами. Большинство библиотек, однако, содержат лишь инструменты для добавления отдельных компонентов; все встроенные библиотеки, кроме библиотеки Базовые - как раз такие.

Далее: Таблица атрибутов.

logisim-2.7.1/doc/ru/html/guide/attrlib/attr.html0000644000175000017500000000737711541757146021650 0ustar vincentvincent Таблица атрибутов

Таблица атрибутов

Многие компоненты имеют атрибуты, являющиеся свойствами для настройки поведения или внешнего вида компонента. Таблица атрибутов служит для просмотра и отображения значений атрибутов компонента.

Для выбора атрибутов компонента, которые вы хотите просмотреть, щёлкните на компоненте с помощью Инструмента Правка (). (Можно также щёлкнуть на компоненте правой кнопкой мыши (или с зажатой клавишей Ctrl) и выбрать Показать атрибуты из контекстного меню. Кроме того, взаимодействие с компонентом через Инструмент Нажатие () или Инструмент Текст () покажет атрибуты этого компонента.)

Снимок экрана ниже показывает, как это выглядит после выделения верхнего входа нашей схемы Исключающее ИЛИ и пролистывания вниз до атрибута Шрифт метки.

Чтобы изменить значение атрибута, щёлкните по значению. Интерфейс для изменения атрибута будет зависеть от того, какой атрибут вы меняете; в случае атрибута Шрифт метки появится диалоговое окно для выбора нового шрифта, но некоторые атрибуты (например, Метка) позволят вам изменить значение в текстовом поле, в то время как другие (например, Направление метки) отобразят выпадающее меню для выбора значения.

Каждый тип компонента имеет свой набор атрибутов; чтобы узнать, что они означают, перейдите к соответствующей документации в Справке по библиотеке.

Если вы выбрали несколько компонентов с помощью Инструмента Правка, то таблица атрибутов отобразит атрибуты, общие для всех выбранных компонентов (за исключением проводов). Если выделенные компоненты не имеют общего значения для атрибута, то отображаемое значение будет пустым. Вы можете изменить значение атрибута всех выбранных компонентов одновременно, используя таблицу атрибутов.

Далее: Атрибуты инструментов.

logisim-2.7.1/doc/ru/html/guide/analyze/0000755000175000017500000000000011541757146017774 5ustar vincentvincentlogisim-2.7.1/doc/ru/html/guide/analyze/table.html0000644000175000017500000001152611541757146021756 0ustar vincentvincent Редактирование таблицы истинности

Редактирование таблицы истинности

При открытии окна Комбинационный анализ вы увидите, что оно состоит из пяти вкладок.

На этой странице описаны первые три вкладки: Входы, Выходы, и Таблица. Следующая страница руководства описывает последние две вкладки: Выражение и Минимизация.

Вкладки Входы и Выходы

Вкладка Входы позволяет вам просматривать и редактировать список входов. Чтобы добавить новый вход, введите его в поле внизу вкладки, и нажмите кнопку Добавить. Если вы хотите переименовать существующий вход, выберите его в списке в левой верхней области вкладки, а затем введите название и нажмите Переименовать.

Чтобы удалить вход, выберите его из списка и нажмите кнопку Удалить. Вы также можете изменять порядок входов (который влияет на порядок столбцов в таблице истинности и в построенной схеме), используя кнопки Сдвинуть вверх или Сдвинуть вниз на выбранном входе.

Все действия отражаются на таблице истинности немедленно.

Вкладка Выходы работает в точности также, как вкладка Входы; конечно, за исключением того, что она работает со списком выходов.

Вкладка Таблица

Единственный элемент на вкладке Таблица - это текущая таблица истинности, изображённая в привычном виде: входы составляют столбцы слева, а выходы составляют столбцы справа.

Вы можете изменять текущие значения, входящие в столбцы с выходами, нажимая на интересующее значение. Значения будут переключаться между 0, 1, и x (обозначающим "не важно"). Как мы увидим на следующей странице, каждое значение "не важно" придаёт вычислению минимизированных выражений некоторую гибкость.

Вы также можете перемещаться и редактировать таблицу истинности с помощью клавиатуры. И вы можете копировать и вставлять значения, используя буфер обмена. Буфер может быть перенесён в любое другое приложение, поддерживающее текст, разделённый символами табуляции (например, в электронную таблицу).

Если таблица истинности основана на существующей схеме, то вы можете увидеть несколько розовых квадратов на столбцах с выходами с "!!" в них. Они соответствуют ошибкам, которые произошли при расчёте значения для этой строки - либо схема возбуждается, либо на выходе было значение ошибки (которое отображается в виде красного провода на схеме Logisim). При наведении мыши на такое значение должна появится подсказка, описывающая, какой это был тип ошибки. Как только вы нажмёте на значение ошибки, вы войдёте в цикл 0-1-x; вернуться назад возможности нет.

Далее: Создание выражений.

logisim-2.7.1/doc/ru/html/guide/analyze/open.html0000644000175000017500000001654111541757146021632 0ustar vincentvincent Открытие окна Комбинационный анализ

Открытие окна Комбинационный анализ

К основной части модуля Комбинационный анализ можно получить доступ через единственное окно с таким же именем, оно позволяет просматривать таблицы истинности и логические выражения. Это окно можно открыть двумя способами.

Через меню Окно

Выберите Комбинационный анализ, и появится текущее окно Комбинационного анализа. Если вы ещё не рассматривали это окно прежде, открытое окно не будет представлять никакой схемы.

Только одно окно Комбинационный анализ существует в Logisim, независимо от того, сколько проектов открыто. Нет никакого способа одновременно иметь открытыми два разных окна анализа.

Через меню Проект

Из окна для редактирования схем вы также можете запросить Logisim анализировать текущую схему, выбрав пункт Анализировать схему из меню Проект. Перед тем, как открыть окно, Logisim вычислит логические выражения и таблицу истинности, соответствующие схеме, и разместит их в нём для просмотра.

Для успешного анализа каждый вход должен быть присоединён к входному контакту, а каждый выход - к выходному контакту. Logisim будет анализировать только схемы, содержащие не более восьми контактов каждого типа, и все они должны быть однобитными. В противном случае вы увидите сообщение об ошибке и окно не откроется.

При составлении логических выражений, соответствующих схеме, Logisim сначала попытается построить логические выражения, в точности соответствующие элементам на схеме. Но если схема использует какие-то компоненты, отличные от логических элементов (такие как мультиплексор), или если схема имеет более ста уровней в глубину (маловероятно), то всплывёт диалоговое окно, сообщающее вам, что составление логических выражений невозможно, и вместо этого Logisim будет составлять выражения на основе таблицы истинности, которая будет составлена перебором всех комбинаций значений на входах и считыванием значений с выходов.

После анализа схемы не остаётся никакой постоянной связи между схемой и окном Комбинационный анализ. То есть, изменения схемы не будут отражены в окне, и изменения в логических выражениях и/или таблице истинности, сделанные в окне, не будут отражены в схеме. Конечно, вы всегда можете проанализировать схему ещё раз; и, как мы увидим позже, вы можете заменить схему схемой, соответствующей тому, что находится в окне Комбинационный анализ.

Ограничения

Logisim не будет пытаться выявить последовательностную схему: если вы скажете ему проанализировать последовательностную схему, он по-прежнему создаст таблицу истинности и соответствующие логические выражения, хотя они не будут точно отражать поведение схемы. (На самом деле, выявление последовательностных схем доказуемо невозможно, поскольку это будет означать решение проблемы остановки. Конечно, вы можете надеяться, что Logisim сделает по крайней мере некоторые попытки - возможно, поищет триггеры или циклы в проводах - но это не так). В результате, система Комбинационный анализ не должна использоваться без разбора: используйте её только когда вы уверены, что схема, которую вы анализируете, действительно комбинационная!

Logisim будет вносить изменения в исходную схему, возможно неожиданные: система Комбинационный анализ требует, чтобы каждый вход и выход имел уникальное имя, удовлетворяющее правилам для идентификаторов Java. (Вкратце, каждый символ должен быть буквой или цифрой, и первым символом должна быть буква. Пробелы не допускаются!) Logisim пытается использовать существующие метки контактов, или список умолчаний, если меток нет. Если существующая метка не соответствует правилам для Java идентификаторов, то Logisim попытается выделить допустимое имя из метки, если это вообще возможно.

Кстати, порядок входов в таблице истинности будет соответствовать их следованию сверху вниз в оригинальной схеме, и никак не связан с порядком их следования слева направо. (То же самое относится и к порядку выходов).

Далее: Редактирование таблицы истинности.

logisim-2.7.1/doc/ru/html/guide/analyze/index.html0000644000175000017500000000514511541757146021776 0ustar vincentvincent Комбинационный анализ

Комбинационный анализ

Все схемы попадают под одну из двух хорошо известных категорий: в комбинационных схемах состояния всех выходов схемы - строгая комбинация текущих состояний входов схемы, тогда как в последовательностных схемах состояния некоторых выходов могут зависеть от прошлых состояний входов (последовательности состояний входов во времени).

Категория комбинационных схем является более простой из них. Практики используют три основных метода для обобщения поведения таких схем.

  • логические схемы
  • логические выражения, которые дают алгебраическое представление о том, как работает схема
  • таблицы истинности, которые перечисляют все возможные комбинации значений на входах и значения на соответствующих выходах
Модуль Logisim Комбинационный анализ позволяет вам конвертировать данные между этими тремя представлениями во всех направлениях. Это особенно удобный способ для создания и понимания схем с несколькими однобитными входами и выходами.

Открытие окна Комбинационный анализ
Редактирование таблицы истинности
Создание выражений
Создание схемы

Далее: Открытие окна Комбинационный анализ.

logisim-2.7.1/doc/ru/html/guide/analyze/gen.html0000644000175000017500000000660511541757146021442 0ustar vincentvincent Создание схемы

Создание схемы

Кнопка Построить схему построит схему, элементы которой будут соответствовать выбранным в данный момент выражениям для каждого выхода. Входы и выходы схемы будут отображены сверху вниз в порядке, соответствующем тому, как они следуют во вкладках Входы и Выходы. Вообще говоря, построенные схемы будут привлекательными; и, по сути, одно из применений модуля Комбинационный анализ в Logisim - украшение плохо нарисованных схем. Тем не менее, как и при любом автоматическом форматировании, оно не будет выражать структурных деталей, которые выражают нарисованные человеком схемы.

Когда вы нажмёте кнопку Построить схему, появится диалоговое окно с приглашением выбрать, в каком проекте и с каким названием вы хотите построить схему.

Если введёте имя существующей схемы, то эта схема будет заменена (после того, как Logisim попросит вас подтвердить, что вы действительно хотите это сделать).

Диалоговое окно Построить схему включает две опции. Опция Использовать только двухвходовые элементы определяет, что вы хотите, чтобы все построенные элементы имели по два входа. (Элементы НЕ, конечно же, являются исключением из этого правила). Опция Использовать только элементы И-НЕ указывает, что вы хотели бы, чтобы схема была переведена в такую, которая использует только элементы И-НЕ. Вы можете выбрать оба варианта, если вы хотите использовать только двухвходовые элементы И-НЕ.

Logisim не может построить использующую только И-НЕ схему для выражений, содержащих любые операторы Исключающее ИЛИ. Эта опция будет отключена, если любые выходные выражения содержат Исключающее ИЛИ.

Далее: Руководство пользователя.

logisim-2.7.1/doc/ru/html/guide/analyze/expr.html0000644000175000017500000001763311541757146021652 0ustar vincentvincent Создание выражений

Создание выражений

Для каждой выходной переменной окно Комбинационный анализ поддерживает две структуры - соответствующую колонку таблицы истинности и логическое выражение - указывающее, как каждый выход связан со своими входами. Вы можете редактировать и таблицу истинности и выражение; одно будет автоматически менять другое по мере необходимости, чтобы они соответствовали друг другу.

Как мы увидим на следующей странице, логические выражения особенно полезны, потому что окно Комбинационный анализ будет использовать их, когда мы укажем ему построить схему, соответствующую текущему состоянию.

Вы можете просматривать и редактировать выражения, используя две последние вкладки: Выражение и Минимизация.

Вкладка Выражение

Вкладка Выражение позволяет вам просматривать и редактировать текущее выражение, связанное с каждой выходной переменной. Вы можете выбрать выходное выражение, которое вы хотите просматривать и изменять, с помощью списка "Выход:" наверху вкладки.

Чуть ниже списка появится выражение, отформатированное в довольно общепринятых обозначениях, где ИЛИ представляется в виде сложения, И - как умножение, а НЕ обозначается чертой над той частью, для которой вычисляется НЕ.

Текстовое поле ниже отображает ту же информацию в виде ASCII последовательности. Здесь НЕ представляется как тильда ('~').

Вы можете изменить выражение в текстовом поле и нажать кнопку Ввести, чтобы изменения вступили в силу; это также обновит таблицу истинности для соответствия. Кнопка Очистить очищает текстовое поле, а кнопка Вернуть меняет поле обратно к представлению текущего выражения.

Обратите внимание, что отредактированные вами выражения будут потеряны, если вы измените таблицу истинности.

В дополнение к умножению и сложению, обозначающим И и ИЛИ, выражение, которое вы набираете, может содержать любой из логических операторов C/Java, а также просто английские слова сами по себе.

высший приоритет~ ! ' НЕ
(отсутствие символа) & && AND И
^ XOR Исключающее ИЛИ
низший приоритет+ | || OR ИЛИ

Все нижеприведённые примеры - допустимые представления одного и того же выражения. Кроме того, можно смешивать операторы.

a' (b + c)
!a && (b || c)
NOT a AND (b OR c)

Вообще-то, скобки в последовательностях AND'ов (или OR'ов или XOR'ов) не имеют значения. (В частности, когда Logisim создаёт соответствующую схему, он будет игнорировать такие скобки.)

Вкладка Минимизация

Последняя вкладка отображает минимизированное выражение, соответствующее столбцу таблицы истинности. Вы можете выбрать, для какого выхода вы хотите просматривать минимизированное выражение с помощью списка сверху, и можете указать, какое выражение вы хотите получить - сумму произведений или произведение сумм, с помощью списка снизу.

Если входов четыре или меньше, то ниже списка появится карта Карно, соответствующая выходной переменной. Вы можете щёлкать на карте Карно для изменения соответствующих значений таблицы истинности. Карта Карно будет также показывать выбранные в данный момент для минимизированного выражения термы в виде сплошных полупрозрачных скругленных прямоугольников.

Ниже - само минимизированное выражение, отформатированное так же, как во вкладке Выражение. Если выходов более четырёх, то карта Карно не появится, но минимизированное выражение всё равно будет вычислено. (Logisim использует метод Куайна — Мак-Класки для вычисления минимизированного выражения. Он эквивалентен карте Карно, но применим к любому числу входных переменных.)

Кнопка Установить как выражение позволяет вам выбрать минимизированное выражение как выражение, соответствующее переменной. Это, как правило, не нужно, поскольку изменения в таблице истинности приводят к использованию минимизированного выражения для изменённого столбца; но если вы введете выражение через вкладку Выражение, то это может быть удобно, чтобы перейти к соответствующему минимизированному выражению.

Далее: Создание схемы.

logisim-2.7.1/doc/ru/html/guide/about/0000755000175000017500000000000011541757146017443 5ustar vincentvincentlogisim-2.7.1/doc/ru/html/guide/about/index.html0000644000175000017500000002111311541757146021436 0ustar vincentvincent О программе

О программе

Logisim - это программа с открытым исходным кодом. Исходный код включен в подкаталог src распространяемого JAR файла.

Если вы находите Logisim полезным, пожалуйста, дайте мне знать. Тем более сделайте это, если вы - учебное заведение; эта информация поможет мне в получении поддержки для работы.

Я приветствую электронную почту о Logisim, в том числе сообщения об ошибках, предложения и исправления. Когда вы пишите мне, пожалуйста, помните, что я усердно работал над разработкой Logisim, не получая никакой оплаты от вас. Если вы хотите иметь право жаловаться на программу, то я предлагаю наскрести денег на программу, конкурирующую с Logisim. (Мне не известны конкуренты с открытым исходным кодом, приближающиеся к Logisim по набору возможностей). Тем не менее, я по-прежнему заинтересован в продолжении улучшения Logisim, и ваши предложения будут только приветствоваться.

Уведомление об авторских правах

Copyright (c) 2005, Carl Burch.

Logisim является свободным программным обеспечением; вы можете его распространять и/или модифицировать его в соответствии с условиями Универсальной Общественной Лицензии GNU, опубликованной Фондом свободного программного обеспечения; версии 2 лицензии, либо (по вашему выбору) любой более поздней версии.

Logisim распространяется в надежде, что он будет полезным, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, даже без подразумеваемых гарантий КОММЕРЧЕСКОЙ ЦЕННОСТИ или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ. См. Универсальную Общественную Лицензию GNU для более подробной информации.

Благодарности

Исходный код Logisim - в основном моя собственная работа; я должен выразить признательность, моим работодателям, которые финансируют мою работу в качестве профессора, в том числе данную программу: я начал программу в Университете Сент-Джона (Коллегевилье, штат Миннесота, США) в 2000-2004 годах, и я продолжаю её в колледже Хендрикс (Конуэй, штат Арканзас, США) с 2004 года по настоящее время. Я очень благодарен этим учреждениям за предоставленные мне время и ресурсы для работы над этим проектом. Если бы только все колледжи и университеты действовали сообща и так заботились об отличном преподавании, как эти учреждения!

Некоторые другие люди, которые были особенно полезны:

  • Телдо Круз Франкуэйра, Танос Какароунтас, Илья Лилов, Пабло Лил Рамос, и Уве Зиммерманн, которые внесли свой вклад в переводы, поставляемые с Logisim. Более подробную информацию о переводах можно найти на странице Интернациональные настройки.
  • Выпуск весны 2005 CS61C Университета Калифорнии, Беркли, который выдержал бета-версии Logisim 2.0. Эти студенты мирились с многими ошибками, и я очень признателен за их терпение и за их предложения!
  • Выпуски весны 2001 CSCI 150 Колледжа святого Бенедикта и Университета Сент-Джон, которые использовали самые зачаточные версии Logisim, когда он был в стадии разработки.

Некоторые части Logisim пришли из других пакетов, которые Logisim использует; некоторые из этих частей распространяются как часть Logisim.

Sun Java API (само собой)
Проект Sun JavaHelp
Обеспечивает встроенную систему помощи из меню "Справка".
MRJAdapter, от Стива Роя
Интеграция с платформой Macintosh OS X.
launch4j, от Григория Ковальта
Позволяет распространение Logisim в виде исполняемого файла Windows.
GIFEncoder, от Адама Доппельта
Сохраняет изображения в формате GIF. Он в свою очередь был основан на C коде, написанном Сверре Хьюсби.
ColorPicker, от Джереми Вуда
Предоставляет диалоговое окно выбора цвета, которое всплывает при настройке цветов (как у компонента Светодиод).
JFontChooser, от Христоса Богориса
Предоставляет диалоговое окно выбора шрифта, которое всплывает при выборе атрибутов шрифта (как в атрибуте Шрифт метки многих компонентов).
TableSorter, приписываемый Филипу Милну, Брендону Маклину, Дэну ван Энкеворту, Парвиндеру Секону, и ouroborus@ouroborus.org
Предоставляет возможность сортировки таблицы в диалоге Получить статистику схемы путём щелчка мышью на заголовке столбца.
Farm-Fresh Web Icons, http://www.fatcow.com/free-icons
Предоставляет значки для управления моделированием, которые появляются в режиме дерева моделирования. Эти значки распространяются по лицензии Creative Commons Attribution 3.0 License, и они не могут распространяться в соответствии с условиями GPL.

И наконец, я хотел бы поблагодарить всех тех пользователей, которые связались со мной - будь то по поводу сообщения об ошибке, предложения, или просто чтобы дать мне знать, что они используют Logisim в своих курсах. Мне придется оставить этих людей анонимными, потому что я не имею их разрешения упоминать о них здесь, но: спасибо!

logisim-2.7.1/doc/ru/html/guide/about/gpl.html0000644000175000017500000007375011541757146021127 0ustar vincentvincent Об этой программе
		    УНИВЕРСАЛЬНАЯ ОБЩЕСТВЕННАЯ ЛИЦЕНЗИЯ GNU
		       Версия 2, июнь 1991 г.

 Copyright (C) 1989, 1991 Free Software Foundation, Inc.
                       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

Copyright (C) перевод на русский язык,
1993 Кузина О.В., Юфа В.М.
1998 Тихонов О.С.

 Всем разрешается копировать и распространять дословные копии
 этого лицензионного документа, но изменять его нельзя.

			    Преамбула

  Лицензии на большую часть программного обеспечения (ПО), составлены так, чтобы
лишить вас свободы совместно использовать и изменять его.  Напротив,
Универсальная Общественная Лицензия GNU предназначена гарантировать вашу свободу
совместно использовать и изменять свободное ПО, т.е. удостоверить, что ПО
является свободным для всех его пользователей.  Эта Универсальная Общественная
Лицензия применима к большей части ПО Фонда Свободного ПО и ко всем другим
программам, чьи авторы принимают на себя обязательства ее использовать.
  (Вместо нее для части ПО Фонда Свободного ПО применяется Универсальная
Общественная Лицензия GNU для библиотек.) Вы тоже можете использовать ее для
своих программ.

  Когда мы говорим о свободном ПО, мы имеем в виду свободу, а не цену.
  Предполагается, что наши Универсальные Общественные Лицензии гарантируют,
что вы пользуетесь свободой распространять копии свободного ПО (и получать за
это вознаграждение, если вы того желаете); что вы получаете исходный код или
можете получить его, если захотите; что вы можете изменять ПО или использовать
его части в новых свободных программах; и что вы знаете, что вы можете все это
делать.

  Чтобы защитить ваши права, нам нужно ввести такие ограничения, которые
запретят кому бы то ни было отказывать вам в этих правах или потребовать от вас
отказаться от этих прав.
Эти ограничения переводятся в некоторые обязательства для вас, если вы
распространяете копии ПО или если вы модифицируете его.

  Например, если вы распространяете копии такой программы бесплатно или за
вознаграждение, вы должны предоставить получателям все права, которыми вы
обладаете.  Вы должны гарантировать, что они тоже получат или смогут получить
исходный код.  И вы должны показать им эти условия, чтобы они знали о своих
правах. 

  Мы защищаем ваши права в два этапа: (1) сохраняем авторские права на ПО и
(2) предлагаем вам эту лицензию, которая дает вам законное право копировать,
распространять и/или модифицировать ПО.

  Также, чтобы защитить нас и каждого автора, мы хотим удостовериться, что все
понимают, что гарантий на это свободное ПО нет.  Если ПО модифицируется и
передается кем-то еще, мы хотим, чтобы получатели ПО знали, что то, что у них
есть --- это не оригинал, чтобы любые проблемы, созданные другими, не отразились
на репутации первоначальных авторов.

  И наконец, каждой свободной программе постоянно угрожают патенты на ПО.
  Мы хотим избежать опасности, что повторные распространители свободной
программы самостоятельно получат патенты, делая программу таким образом частной
собственностью.  Чтобы предотвратить это, мы явно заявляем, что любой патент
должен быть либо предоставлен всем для свободного использования, либо не
предоставлен никому.

  Ниже следуют точные определения и условия для копирования, распространения и
модификации.

		    УНИВЕРСАЛЬНАЯ ОБЩЕСТВЕННАЯ ЛИЦЕНЗИЯ GNU
   ОПРЕДЕЛЕНИЯ И УСЛОВИЯ ДЛЯ КОПИРОВАНИЯ, РАСПРОСТРАНЕНИЯ И МОДИФИКАЦИИ.

  0. Эта Лицензия применима к любой программе или другому произведению,
содержащему уведомление, помещенное держателем авторских прав и сообщающее о
том, что оно может распространяться при условиях, оговоренных в данной
Универсальной Общественной Лицензии.  В последующем термин "Программа" относится
к любой такой программе или произведению, а термин "произведение, основанное на
Программе" означает Программу или любое произведение, содержащее Программу или
ее часть, дословную, или модифицированную, и/или переведенную на другой язык.
  (Здесь и далее перевод включается без ограничений в понятие "модификация".)
Каждый обладатель лицензии адресуется как "вы".

Виды деятельности, не являющиеся копированием, распространением или модификацией
не охватываются этой Лицензией; они за пределами ее влияния.  Использование
Программы по ее функциональному назначению не ограничено, и выходные данные
Программы охватываются этой Лицензией, только если их содержание является
произведением, основанным на Программе (вне зависимости от того, были ли они
получены в процессе использования Программы).
Являются ли они таковыми, зависит от того, что что именно делает Программа.

  1. Вы можете копировать и распространять дословные копии исходного кода
Программы по его получении на любом носителе, при условии что вы соответствующим
образом помещаете на видном месте в каждой копии соответствующее уведомление об
авторских правах и отказ от гарантий; оставляете нетронутыми все уведомления,
относящиеся к данной Лицензии и к отсутствию каких-либо гарантий; и передаете
всем другим получателям Программы копию данной Лицензии вместе с Программой.

Вы можете назначить плату за физический акт передачи копии и можете по своему
усмотрению предоставлять гарантии за вознаграждение.

  2. Вы можете изменять свою копию или копии Программы или любой ее части,
создавая таким образом произведение, основанное на Программе, и копировать и
распространять эти модификации или произведение в соответствии с Разделом 1,
приведенным выше, при условии, что вы выполните все нижеследующие условия:

    a) Вы обязаны снабдить модифицированные файлы заметными уведомлениями,
    содержащими указания на то, что вы изменили файлы, и дату каждого изменения.

    b) Вы обязаны предоставить всем третьим лицам лицензию на бесплатное
использование каждого произведения, которое вы распространяете или публикуете,
    целиком, и которое полностью или частично содержит Программу или какую-либо
    ее часть, на условиях,
    оговоренных в данной Лицензии.

    c) Если модифицированная программа обычно читает команды в интерактивном
    режиме работы, вы должны сделать так, чтобы при запуске для работы в таком
    интерактивном режиме обычным для нее способом она печатала или выводила на экран
    объявление, содержащее соответствующее уведомление об авторских правах и
    уведомление о том, что гарантий нет
(или, наоборот, сообщающее о том, что вы обеспечиваете
    гарантии), и что пользователи могут повторно распространять программу при
    этих условиях, и указывающее пользователю, как просмотреть копию данной
    Лицензии.  (Исключение: если сама Программа работает в интерактивном режиме, но
    обычно не выводит подобное объявление, то ваше произведение, основанное на
    Программе, не обязано выводить объявление.)

Эти требования применяются к модифицированному произведению в целом.  Если
известные части этого произведения не были основаны на Программе и могут
обоснованно считаться независимыми и самостоятельными произведениями, то эта
Лицензия и ее условия не распространяются на эти части, если вы распространяете
их как отдельные произведения.  Но если вы распространяете эти части как часть
целого произведения, основанного на Программе, то вы обязаны делать это в
соответствии с условиями данной Лицензии, распространяя права получателей
лицензии на все произведение и, таким образом, на каждую часть, вне зависимости
от того, кто ее написал.

Таким образом, содержание этого раздела не имеет цели претендовать на ваши права
на произведение, написанное полностью вами, или оспаривать их; цель скорее в
том, чтобы развить право управлять распространением производных или коллективных
произведений, основанных на Программе.

Кроме того, простое нахождение другого произведения, не основанного на этой
Программе, совместно с Программой (или с произведением, основанным на этой
Программе) на том же носителе для постоянного хранения или распространяемом
носителе не распространяет действие этой Лицензии на другое произведение.

  3. Вы можете копировать и распространять Программу (или произведение,
основанное на ней) согласно Разделу 2) в объектном коде или в выполнимом виде в
соответствии с Разделами 1 и 2, приведенными выше, при условии, что вы также
выполните одно из следующих требований:

    a) Сопроводите ее полным соответствующим машиночитаемым
    исходным кодом, который должен распространяться в соответствии с Разделами
    1 и 2, приведенными выше, на носителе, обычно используемом для обмена ПО; или,

    Сопроводите ее письменным предложением, действительным по крайней мере в течение трех
    лет, предоставить любому третьему лицу за вознаграждение не большее стоимости
    физического акта изготовления копии полную
    машиночитаемую копию соответствующего исходного кода,
    подлежащую распространению в соответствии с Разделами 1 и 2,
    приведенными выше; или

    c) Сопроводите ее информацией, полученной вами в качестве предложения
    распространить соответствующий исходный код.  (Эта возможность
    допустима только для некоммерческого распространения, и только если вы
    получили программу в объектном коде или в выполнимом виде с
    предложением в соответствии с Пунктом b) выше.)

Исходный код для призведения означает его вид, предпочтительный для выполнения в
нем модификаций.  Для исполняемого произведения полный исходный код означает все
исходные коды для всех модулей, которые он содержит, плюс любые связанные с
произведением файлы определения интерфейса, плюс сценарии, используемые для
управления компиляцией и установкой исполняемого произведения.  Однако, в виде
особого исключения распространяемый исходный код не обязан включать то, что
обычно предоставляется с основными компонентами операционной системы, под
управлением которой работает исполняемое произведение, за исключением случая,
когда сам компонент сопровождает исполняемое произведение.

Если распространение исполняемого произведения или объектного кода происходит
путем предоставления доступа для копирования с обозначенного места, то
предоставление доступа для копирования исходного кода с того же места считается
распространением исходного кода, даже если третьи лица не принуждаются к
копированию исходного кода вместе с объектным кодом.

  4. Вы не можете копировать, изменять, повторно лицензировать, или
распространять Программу иначе, чем это явно предусмотрено данной Лицензией.
  Любая попытка копировать, изменять, повторно лицензировать, или распространять
Программу каким-либо другим способом неправомерна и автоматически прекращает
ваши права данные вам этой Лицензией.
Однако лицензии лиц, получивших от вас копии или права согласно данной
Универсальной Общественной Лицензии, не прекратят своего действия до тех пор,
пока эти лица полностью соблюдают условия.

  5. Вы не обязаны соглашаться с этой Лицензией, так как вы не подписывали ее.
  Однако тогда вы не получаете права модифицировать или распространять Программу
или основанные на Программе произведения.  Эти действия запрещены законом, если
вы не принимаете к соблюдению эту Лицензию.  А значит, изменяя или распространяя
Программу (или произведение, основанное на Программе), вы изъявляете свое
согласие с этой Лицензией и всеми ее условиями о копировании, распространении
или модификации Программы или произведений, основанных на ней.

  6. Каждый раз, когда вы повторно распространяете Программу (или любое
произведение, основанное на Программе), получатель автоматически получает
лицензию от первоначального держателя лицензии на копирование, распространение
или модификацию Программы, обсуждаемую в этих определениях и условиях.  Вы не
можете налагать каких-либо дополнительных ограничений на осуществление
получателем прав, предоставленных данным документом.
Вы не несете ответстенности за соблюдение третьими лицами условий этой Лицензии.

  7. Если в результате судебного разбирательства, или обвинения в нарушении
патента или по любой другой причине (не обязательно связанной с патентами), вам
навязаны условия, противоречащие данной Лицензии (как по решению суда, так и
нет), то это не освобождает вас от соблюдения Лицензии.  Если вы не можете
заниматься распространением так, чтобы одновременно удовлетворить требованиям и
этой Лицензии, и всем другим требованиям, то вы не должны заниматься
распространением Программы.  Например, если патент не позволяет безвозмездное
повторное распространение Программы всем, кто получил копии от вас
непосредственно или через посредников, то единственным способом удовлетворить и
патенту, и этой Лицензии будет ваш полный отказ от распространения Программы.

Если какая-либо часть этого раздела не имеет силы или не может быть применена
при любых конкретных обстоятельствах, то подразумевается, что имеет силу
остальная часть раздела, и весь Раздел имеет силу при других обстоятельствах.

Цель этого раздела не побудить вас делать заявления о нарушениях прав на патент,
или других претензиях на право собственности, или оспаривать правильность
подобных претензий; единственная цель этого раздела --- защита целостности
системы распространения свободного ПО, которая реализуется использованием общих
лицензий.  Многие люди благодаря этой системе внесли щедрый вклад в широкий
спектр распространяемого ПО полагаясь на согласованное применение этой системы;
автору принадлежит право решать хочет ли он или она распространять ПО в этой
системе или в какой-то другой, и получатель лицензии не может влиять на принятие
этого решения.

Этот раздел предназначен для того, чтобы тщательно прояснить, что полагается
следствием из остальной части данной Лицензии.

  8. Если распространение и/или применение Программы ограничено в ряде стран
либо патентами, либо авторскими правами на интерфейсы, первоначальный обладатель
авторских прав, выпускающий Программу с этой Лицензией, может добавить явное
ограничение на географическое распространение, исключив такие страны, так что
распространение разрешается только в тех странах, которые не были исключены.  В
этом случае данная Лицензия включает в себя это ограничение, как если бы оно
было написано в тексте данной Лицензии.

  9. Фонд Свободного ПО может время от времени публиковать пересмотренные и/или
новые версии Универсальной Общественной Лицензии.  Такие новые версии будут
сходны по духу с настоящей версией, но могут отличаться в деталях, направленных
на новые проблемы или обстоятельства.

Каждой версии придается отличительный номер версии.  Если в Программе указан
номер версии данной Лицензии, которая к ней применима, и слова "любая
последующая версия", вы можете по выбору следовать определениям и условиям либо
данной версии, либо любой последующей версии, опубликованной Фондом Свободного
ПО.  Если в Программе не указан номер версии данной Лицензии, вы можете выбрать
любую версию, когда-либо опубликованную Фондом Свободного ПО.

  10. Если вы хотите встроить части Программы в другие свободные программы с
иными условиями распространения, напишите автору с просьбой о разрешении.  Для
ПО, которое охраняется авторскими правами Фонда Свободного ПО, напишите в Фонд
Свободного ПО; мы иногда делаем исключения для этого.  Наше решение будет
руководствоваться двумя целями: сохранения свободного статуса всех производных
нашего свободного ПО и содействия совместному и повторному использованию ПО
вообще.

			    НИКАКИХ ГАРАНТИЙ

  11. ПОСКОЛЬКУ ПРОГРАММА ПРЕДОСТАВЛЯЕТСЯ БЕСПЛАТНО, НА ПРОГРАММУ НЕТ ГАРАНТИЙ
В ТОЙ МЕРЕ, КАКАЯ ДОПУСТИМА ПРИМЕНИМЫМ ЗАКОНОМ.  ЗА ИСКЛЮЧЕНИЕМ ТЕХ СЛУЧАЕВ,
КОГДА ПРОТИВНОЕ ЗАЯВЛЕНО В ПИСЬМЕННОЙ ФОРМЕ, ДЕРЖАТЕЛИ АВТОРСКИХ ПРАВ И/ИЛИ
ДРУГИЕ СТОРОНЫ ПОСТАВЛЯЮТ ПРОГРАММУ "КАК ОНА ЕСТЬ" БЕЗ КАКОГО-ЛИБО ВИДА
ГАРАНТИЙ, ВЫРАЖЕННЫХ ЯВНО ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ
ПОДРАЗУМЕВАЕМЫМИ ГАРАНТИЯМИ КОММЕРЧЕСКОЙ ЦЕННОСТИ И ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ
ЦЕЛИ.  ВЕСЬ РИСК В ОТНОШЕНИИ КАЧЕСТВА И ПРОИЗВОДИТЕЛЬНОСТИ ПРОГРАММЫ ОСТАЕТСЯ
ПРИ ВАС.  ЕСЛИ ПРОГРАММА ОКАЖЕТСЯ ДЕФЕКТИВНОЙ, ВЫ ПРИНИМАЕТЕ НА СЕБЯ СТОИМОСТЬ
ВСЕГО НЕОБХОДИМОГО ОБСЛУЖИВАНИЯ, ВОССТАНОВЛЕНИЯ ИЛИ ИСПРАВЛЕНИЯ.

  12. НИ В КОЕМ СЛУЧАЕ, ЕСЛИ НЕ ТРЕБУЕТСЯ ПОДХОДЯЩИМ ЗАКОНОМ ИЛИ НЕ УСЛОВЛЕНО В
ПИСЬМЕННОЙ ФОРМЕ, НИКАКОЙ ДЕРЖАТЕЛЬ АВТОРСКИХ ПРАВ ИЛИ НИКАКОЕ ДРУГОЕ ЛИЦО,
КОТОРОЕ МОЖЕТ ИЗМЕНЯТЬ И/ИЛИ ПОВТОРНО РАСПРОСТРАНЯТЬ ПРОГРАММУ, КАК БЫЛО
РАЗРЕШЕНО ВЫШЕ, НЕ ОТВЕТСТВЕННЫ ПЕРЕД ВАМИ ЗА УБЫТКИ, ВКЛЮЧАЯ ЛЮБЫЕ ОБЩИЕ,
СПЕЦИАЛЬНЫЕ, СЛУЧАЙНЫЕ ИЛИ ПОСЛЕДОВАВШИЕ УБЫТКИ, ПРОИСТЕКАЮЩИЕ ИЗ ИСПОЛЬЗОВАНИЯ
ИЛИ НЕВОЗМОЖНОСТИ ИСПОЛЬЗОВАНИЯ ПРОГРАММЫ (ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ПОТЕРЕЙ
ДАННЫХ, ИЛИ ДАННЫМИ, СТАВШИМИ НЕПРАВИЛЬНЫМИ, ИЛИ ПОТЕРЯМИ, ПОНЕСЕННЫМИ ИЗ-ЗА ВАС
ИЛИ ТРЕТЬИХ ЛИЦ, ИЛИ ОТКАЗОМ ПРОГРАММЫ РАБОТАТЬ СОВМЕСТНО С ЛЮБЫМИ ДРУГИМИ
ПРОГРАММАМИ), ДАЖЕ ЕСЛИ ТАКОЙ ДЕРЖАТЕЛЬ ИЛИ ДРУГОЕ ЛИЦО БЫЛИ ИЗВЕЩЕНЫ О
ВОЗМОЖНОСТИ ТАКИХ УБЫТКОВ. 

		     КОНЕЦ ОПРЕДЕЛЕНИЙ И УСЛОВИЙ
logisim-2.7.1/doc/ru/html/contents.html0000644000175000017500000002215211541757146017761 0ustar vincentvincent

Ссылки Logisim

Руководство пользователя Logisim

  • Просчёт значений
  • Библиотеки JAR
  • О программе
  • Справка по библиотеке

    logisim-2.7.1/doc/ru/contents.xml0000644000175000017500000002632211541757152016651 0ustar vincentvincent logisim-2.7.1/doc/pt/0000755000175000017500000000000011541757152014262 5ustar vincentvincentlogisim-2.7.1/doc/pt/html/0000755000175000017500000000000011541757136015230 5ustar vincentvincentlogisim-2.7.1/doc/pt/html/libs/0000755000175000017500000000000011541757142016156 5ustar vincentvincentlogisim-2.7.1/doc/pt/html/libs/plexers/0000755000175000017500000000000011541757144017642 5ustar vincentvincentlogisim-2.7.1/doc/pt/html/libs/plexers/selector.html0000644000175000017500000000552111541757144022353 0ustar vincentvincent Seletor de Bits

    Seletor de Bits

    Biblioteca: Plexers
    Introdução: 2.0.5
    Aparência:

    Comportamento

    Dada uma entrada com vários bits, o seletor irá dividi-lo em grupos de igual tamanho (a partir do bit de mais baixa ordem - LSB) e dar saída ao grupo escolhido pela seleção feita à entrada.

    Por exemplo, se tivermos uma entrada de oito bits com 01010101, e desejarmos ter uma saída de três bits, em seguida, o grupo 0 será o de menor ordem com três bits em 101; grupo 1 serão os próximos três bits, 010; e o grupo 2 serão os próximos três bits, 001. (Se faltarem bits, serão preenchidos com 0.) A escolha feita à entrada deverá ser um número de dois bits que selecionará qual desses três grupos irá para a saída, se a seleção for 3, então 000 irá a saída

    .

    Pinos (componente supondo voltado para leste)

    Na face oeste (entrada, com largura de bits de acordo com o atributo Bits de Dados)
    Valores dos dados a partir da qual os bits deverão ser selecionados para a saída.
    Na face leste (saída, com largura de bits de acordo com o atributo Bits de Saída)
    Um grupo de bits de dados, escolhido pelo Seletor de Entrada.
    Na face sul (entrada, com a largura de bits igual ao quociente entre Bits de Dados e Bits de Saída, arredondada para cima)
    Seletor de Entrada: determinará qual dos grupos de bits deverá ser encaminhado para a saída.

    Atributos

    Quando o componente for selecionado ou estiver sendo acrescentado, os dígitos de '0' a '9' poderão ter o seu atributo Bits de Saída alterado, Alt-0 até ALT-9 irão alterar o seu atributo Bits de dados , e as teclas com setas poderão alterar o seu atributo Direção .

    Direção
    A direção do componente (especificará qual a saída relativa à entrada).
    Bits de Dados
    Largura em bits da entrada de dados do componente.
    Bits de saída
    Largura em bits da saída do componente.

    Comportamento da ferramenta Testar

    Nenhum.

    Comportamento da ferramenta Texto

    Nenhum.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/plexers/priencod.html0000644000175000017500000001127011541757144022334 0ustar vincentvincent Codificador de prioridades

    Codificador de prioridades

    Biblioteca: Plexers
    Introdução: 2.3.0
    Aparência:

    Comportamento

    O componente tem um número de entradas em sua face oeste, com a primeira rotulada com 0 e as outras numeradas a partir daí. O componente determinará os índices das entradas cujos valores estarão em 1, e emitirá o maior índice. Por exemplo, se as entradas 0, 2, 5 e 6 estiverem todos um, então o codificador de prioridades emitirá o valor 110. Se não houver entradas em 1, ou se o componente for desativado, a saída do codificador de prioridades será flutuante.

    O codificador de prioridade é projetado de modo que uma série de codificadores possam ser encadeados para acomodar entradas adicionais. Em particular, o componente permite apenas uma entrada e uma saída habilitadas. Sempre que a habilitação for 0, o componente estará desativado, e o resultado será ter todos os bits flutuantes. A saída habilitada será 1 quando o componente for ativado e nenhum das entradas indexadas forem iguais a 1. Assim, você pode ter dois codificadores de prioridades e ligar saída habilitada do primeiro à entrada para habilitação do segundo. Mas se nenhuma das entradas indexadas do primeiro for 1, todas as suas saídas serão flutuantes, e o segundo será desativado. Porém se nenhum das entradas indexadas do primeiro for 1, então sua saída terá todos os bits flutuantes, e o segundo codificador de prioridades será ativado e irá identificar a entrada com a mais alta prioridade com um 1.

    Uma saída adicional do codificador de prioridades estará sempre em 1 quando estiver ativado e encontrar uma das entradas indexadas em 1. Quando houver encadeamento de codificadores de prioridades, essa saída poderá ser usada para identificar qual dos codificadores foi acionado.

    Pinos (componente supondo voltado para leste)

    Na face oeste, quantidade variável (entradas, com largura de 1 bit)
    Valores de entrada, indexados a partir de 0 no extremo superior/oeste da borda.
    Na face leste, pino superior (de saída, com largura de bits de acordo com o atributo Bits de Dados)
    Saída: o maior índice entre as entradas com valor igual a 1 - ou todos os bits flutuantes se não houver entradas em 1, ou se o componente estiver desativado via Habilitar Entrada.
    Na face leste, pino inferior (de saída, com largura de 1 bit)
    Grupo Sinal: 1, se o componente estiver habilitado e pelo menos uma entrada indexada tiver valor igual a 1, caso contrário, essa saída será 0.
    Na face sul (entrada, com largura de 1 bit)
    Habilitar Entrada: se for 0, o componente estará desativado; caso contrário, o componente estará habilitado.
    Na face norte (saída, com largura de 1 bit)
    Habilitar Saída: 1, se este componente estiver ativado e nenhuma das entradas indexadas estiver em 1, caso contrário a saída será 0
    .

    Atributos

    Quando o componente for selecionado ou estiver sendo acrescentado, os dígitos de '1' a '4' poderão ter o seu atributo Bits Selecionados alterado, e as teclas com setas poderão alterar o seu atributo Direção .

    Direção
    A direção do componente (especificará qual a saída relativa à entrada).
    Bits selecionados
    A largura em bits da entrada primária do componente. O número de entradas indexadas pelo codificador de prioridades será 2 Bits Selecionados .
    Saída desabilitada
    Especificará qual deverá ser o valor de cada bit das saídas quando o componente estiver desabilitado (ou seja, quando o pino de habilitação estiver em 0). Opções incluem zero e flutuante; e neste caso, as saídas estarão efetivamente desconectadas de quaisquer outras portas.

    Comportamento da ferramenta Testar

    Nenhum.

    Comportamento da ferramenta Texto

    Nenhum.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/plexers/mux.html0000644000175000017500000000712411541757144021345 0ustar vincentvincent Multiplexador

    Multiplexexador

    Biblioteca: Plexers
    Introdução: 2.0 Beta 11
    Aparência:

    Comportamento

    Copiará uma entrada na face oeste para a saída na face leste; qual das entradas será copiada é especificado pelo valor atual recebido através da entrada na face sul. Acho útil pensar em um demultiplexador como análogo a um comutador de trilhos em uma estrada de ferro, controlado por uma seleção feita à entrada.

    (A propósito, algumas autoridades sugerem o termo em inglês multiplexor, mas multiplexer é a ortografia predominante.)

    Pinos (componente supondo voltado para leste)

    Na face oeste, quantidade variável (entradas, com largura em bits de acordo com o atributo Bits de Dados)
    Valores de dados, um dos quais será encaminhado para a saída. Cada valor de entrada de dados é numerado, começando em 0 na face norte.
    Na face leste (saída, com largura em bits de acordo com o atributo Bits de Dados)
    O valor da saída irá coincidir com um dos valores das entradas na face oeste, borda, aquele cujo número for o mesmo do valor atual recebido através da seleção de entrada na face sul. Se a selecção de entrada contiver algum bit não especificado (isto é, flutuante), então a saída será totalmente flutuante.
    Na face sul (entrada, com largura em bits de acordo com o atributo Bits de Dados)
    Entrada selecionada: o valor dessa entrada determinará qual a entrada na face oeste será roteada para a saída na face leste.

    Atributos

    Quando o componente for selecionado ou estiver sendo acrescentado, os dígitos de '1' a '4' poderão ter o seu atributo Bits Selecionados alterado, Alt-0 até ALT-9 irão alterar o seu atributo Bits de Dados, e as teclas com setas poderão alterar o seu atributo Direção.

    Direção
    A direção do componente (especificará qual a saída relativa à entrada).
    Bits Selecionados
    A largura em bits da entrada selecionada do componente na face sul. O número de saídas para o multiplexador será 2 Bits Selecionados .
    Bits de dados
    Largura dos bits de dados que serão roteados pelo multiplexador.
    Tri-state?
    Especificará se as saídas não selecionadas deverão ser flutuantes (Sim) ou zero (Não).
    Saída desabilitada
    Especificará qual deverá ser o valor de cada bit das saídas quando o componente estiver desabilitado (ou seja, quando o pino de habilitação estiver em 0). Opções incluem zero e flutuante; e neste caso, as saídas estarão efetivamente desconectadas de quaisquer outras portas.

    Comportamento da ferramenta Testar

    Nenhum.

    Comportamento da ferramenta Texto

    Nenhum.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/plexers/index.html0000644000175000017500000000244511541757144021644 0ustar vincentvincent Biblioteca Plexers

    Biblioteca Plexers

    A biblioteca Plexers inclui componentes de controle. Assim como os componentes na biblioteca Portas, todos são combinacionais, geralmente servem para rotear valores.

    Multiplexador
    Demultiplexador
    Decodificador
    Codificador de prioridades
    Seletor de Bits

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/plexers/demux.html0000644000175000017500000000721611541757144021660 0ustar vincentvincent Demultiplexador

    Demultiplexador

    Biblioteca: Plexers
    Introdução: 2.0 Beta 11
    Appearance:

    Comportamento

    Copiará a entrada na face oeste para apenas uma das saídas na face leste; qual será a saída será especificado pelo valor atual recebido através da entrada na face sul. Acho útil pensar em um demultiplexador como análogo a um comutador de trilhos em uma estrada de ferro, controlado por uma seleção feita à entrada.

    (A propósito, algumas autoridades sugerem o termo em inglês demultiplexor, mas demultiplexer é a ortografia predominante.)

    Pinos (componente supondo voltado para leste)

    Na face oeste (entrada, com largura de bits de acordo com o atributo Bits de Dados)
    O valor a ser encaminhado para uma das saídas na face leste.
    Na face leste, quantidade variável (saídas, com largura de bits de acordo com o atributo Bits de Dados)
    As saídas são numeradas a partir de 0 começando na face norte. Uma saída irá coincidir com a entrada oeste, se seu número coincidir com o valor atual recebido através da seleção de entrada na face sul; caso contrário, seu valor será ou todos zeros ou todos flutuantes, dependendo do valor do atributo Tri-state?. Se a selecção de entrada contiver bits não especificados, todas as saídas serão flutuantes.
    Na face sul (entrada, com largura de bits de acordo com o atributo Bits de Dados)
    Entrada selecionada: o valor dessa entrada determinará para qual a saída na face leste será encaminhado o valor recebido na face oeste.

    Atributos

    Quando o componente for selecionado ou estiver sendo acrescentado, os dígitos de '1' a '4' poderão ter o seu atributo Bits Selecionados alterado, Alt-0 até ALT-9 irão alterar o seu atributo Bits de dados, e as teclas com setas poderão alterar o seu atributo Direção.

    Direção
    A direção do componente (especificará qual dos lados terá as saídas).
    Bits Selecionados
    A largura em bits da entrada selecionada do componente na face sul. O número de saídas para o demultiplexador será 2 Bits Selecionados.
    Bits de dados
    Largura dos bits de dados que serão roteados pelo demultiplexador.
    Tri-state?
    Especificará se as saídas não selecionadas deverão ser flutuantes (Sim) ou zero (Não).
    Saída desabilitada
    Especificará qual deverá ser o valor de cada bit das saídas quando o componente estiver desabilitado (ou seja, quando o pino de habilitação estiver em 0). Opções incluem zero e flutuante; e neste caso, as saídas estarão efetivamente desconectadas de quaisquer outras portas.

    Comportamento da ferramenta Testar

    Nenhum.

    Comportamento da ferramenta Texto

    Nenhum.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/plexers/decoder.html0000644000175000017500000000535311541757144022143 0ustar vincentvincent Decodificador

    Decodificador

    Biblioteca: Plexers
    Introdução: 2.0 Beta 11
    Aparência:

    Comportamento

    Emitirá 1 em apenas em uma saída; a saída em 1 dependerá do valor corrente recebido através da entrada na face sul.

    Pinos (componente supondo voltado para leste)

    Na face leste, quantidade variável (saídas, com largura de 1 bit)
    As saídas são numeradas começando em 0 na face norte. Cada saída será 1 se o seu número coincidir com o valor atual recebido pela seleção da entrada na face sul; caso contrário, seu valor será zero ou flutuante, dependendo do valor do atributo Tri-state?. Se a selecção da entrada contiver quaisquer bits não especificados, todas as saídas serão flutuantes.
    Na face sul (entrada, largura de acordo com o atributo Bits Selecionados)
    Entrada selecionada: o valor dessa entrada determinará quais as saídas serão iguais a 1.

    Atributos

    Quando o componente for selecionado ou estiver sendo adicionado, os dígitos de '1' a '4' irão alterar os seus Bits Selecionados e as teclas com setas poderão alterar o seu atributo Direção.

    Direção
    A direção do componente (especificará qual dos lados terá as saídas).
    Bits selecionados
    A largura em bits da entrada selecionada do componente na face sul. O número de saídas para o decodificador será 2 Bits Selecionados .
    Tri-state?
    Especificará se as saídas não selecionadas deverão ser flutuantes (Sim) ou zero (Não).
    Saída desabilitada
    Especificará qual deverá ser o valor de cada bit das saídas quando o componente estiver desabilitado (ou seja, quando o pino de habilitação estiver em 0). Opções incluem zero e flutuante; e neste caso, as saídas estarão efetivamente desconectadas de quaisquer outras portas.

    Comportamento da ferramenta Testar

    Nenhum.

    Comportamento da ferramenta Texto

    Nenhum.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/mem/0000755000175000017500000000000011541757144016736 5ustar vincentvincentlogisim-2.7.1/doc/pt/html/libs/mem/shiftreg.html0000644000175000017500000001241311541757144021440 0ustar vincentvincent Registrador de Deslocamento

    Registrador de Deslocamento

    Biblioteca: Memória
    Introdução: 2.3.0
    Aparência:

    Comportamento

    Esse registrador é constituído por vários estágios, onde a cada variação do clock fará com que um estágio receba o valor do estágio anterior, enquanto um novo valor será carregado no primeiro estágio. O componente também poderá opcionalmente oferecer a carga e o armazenamento em paralelo para todos os estágios.

    A entrada Limpar (clear) reiniciará todos os estágios com valor igual a 0 assincronamente; ou seja, enquanto a entrada Limpar (clear) for igual a 1, todos os valores serão iguais a 0, independente da entrada do clock.

    Pinos

    Um asterisco (*) marcará os pinos que existirão somente quando o atributo Carga em Paralelo estiver habilitado.

    Na face oeste, pino superior (entrada, com largura de 1 bit)
    Deslocar: se for 1 ou desconectado, todos os estágios avançarão ao gatilho do clock; mas se for 0, não haverá avanço. Essa entrada será ignorada se a entrada Carga for 1.
    Na face oeste, pino central (entrada, com largura em bits de acordo com o atributo Bits de Dados)
    Dado: quando houver avanço dos estágios, o valor encontrado nessa entrada será carregado no primeiro estágio.
    Na face oeste, pino inferior marcado com um triângulo (entrada, com largura de 1 bit)
    Clock: no instante em que sofrer variação, conforme especificado pelo atributo Gatilho, o componente poderá avançar os estágios ou carregar novos valores.
    *Na face norte, pino à esquerda (entrada, com largura de 1 bit)
    Carga: se for 1, os valores encontrados nos outros pinos na face norte serão carregados em todos os estágios na próxima variação do clock. Se for 0 ou desconectado, não haverá carga.
    *Na face norte, outros pinos (entrada, com largura em bits de acordo com o atributo Bits de Dados)
    Dado: esses valores serão carregados em todos os estágios quando houver variação do clock e enquanto Carga estiver em 1. A entrada mais à esquerda corresponderá ao valor mais recente.
    Na face sul, pino à esquerda (entrada, com largura de 1 bit)
    Limpar (clear): se for 1, todos os estágios serão levados para zero assincronamente, e todas as outras entradas serão ignoradas.
    *Na face sul, outros pins (saída, com largura em bits de acordo com o atributo Bits de Dados)
    Saída: Emitirá o valor armazenado em cada estágio, com o estágio mais recente refletido nos pinos mais à esquerda (próximo à entrada Limpar (clear)).
    Face leste (saída, com largura em bits de acordo com o atributo Bits de Dados)
    Saída: Emitirá o valor armazenado no estágio final (mais antigo).

    Atributos

    Quando o componente for selecionado ou estiver sendo acrescentado, os dígitos de '0 'a '9' poderão alterar o atributo Número de Estágios, Alt-0 até ALT-9 irão alterar o seu atributo Bits de Dados.

    Bits de Dados
    A largura em bits do valor armazenado em cada estágio.
    Número de Estágios
    O número de estágios incluídos no componente.
    Carga em Paralelo
    Se sim, então o componente incluirá entradas e saídas facilitando o acesso em paralelo a todos os valores dos estágios.
    Gatilho
    Serve para configurar como a entrada de clock será interpretada. O valor Borda de Subida serve para indicar que o registrador deverá atualizar seu valor no instante em o clock variar de 0 para 1. O valor Borda de Descida indicará que ele deverá realizar a atualização no instante em que o clock variar de 1 para 0.
    Rótulo
    O texto para o rótulo associado ao componente.
    Fonte do Rótulo
    A fonte com a qual o rótulo será mostrado.

    Comportamento da ferramenta Testar

    Se o atributo Carga em Paralelo for não, ou se o atributo Bits de Dados for maior que 4, então o acionamento do registrador não terá efeito. Do contrário, ao clicar sobre o componente, o foco do teclado estará sobre o estágio selecionado (indicado por um retângulo vermelho), e ao digitar um dígito hexadecimal, o valor desse estágio irá mudar.

    Comportamento da ferramenta Texto

    Permite que o rótulo associado à porta seja editado.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/mem/rom.html0000644000175000017500000000725311541757144020430 0ustar vincentvincent ROM

    ROM

    Biblioteca: Memória
    Introdução: 2.1.0
    Aparência:

    Comportamento

    O componente ROM pode armazenar até 16,777,216 valores (especificado pelo atributo Largura em Bits do Endereço), cada um deles com até 32 bits (especificado pleo atributo Largura em Bits de Dados). Um circuito poderá acessar os valores correntes guardados na ROM, mas não poderá alterá-los. O usuário poderá modificá-los interativamente via a ferramenta Testar, ou poderá alterá-los completamente via ferramenta Menu.

    Diferente do componente RAM, o conteúdo corrente armazenado na ROM poderá ser um atributo. Assim, se um circuito que contiver um componente ROM for usado duas vezes, então esse irá manter os mesmos valores em ambos os usos. Também por causa desse comportamento, os valores atualmente na ROM poderão ser guardados em arquivos criados pelo Logisim.

    Os valores correntes serão mostrados no componente. Os endereços apresentados serão listados em cinza à esquerda. Na parte de dentro, cada valor será listado em hexadecimal. O endereço atual do endereço selecionado será mostrado em texto negativo (branco sobre preto).

    Pinos

    A Na face oeste (entrada, com largura em bits de acordo com o atributo Bits de Dados)
    Serve para selecionar quais os valores estarão sendo acessados atualmente pelo circuito.
    D Na face leste (entrada/saída, com largura em bits de acordo com o atributo Bits de Dados)
    Serve para emitir o valor do endereço atualmente selecionado pelo pino D se sel for 1 ou flutuante. Se sel for 0, então D será flutuante.
    sel Na face sul (entrada, com largura de 1 bit)
    Se você tiver apenas um módulo ROM, ignore essa entrada. Se você tiver múltiplos módulos ROM em paralelo, poderá usar essa entrada para habilitar ou desabilitar o módulo inteiro, caso seu valor seja 1 ou 0. Em outras palavras, quando este valor for 0, nenhum valor será emitido pela saída D.

    Atributos

    Quando o componente for selecionado ou estiver sendo acrescentado, os dígitos de '0 'a '9' poderão alterar o atributo Número de Entradas, Alt-0 até ALT-9 irão alterar o seu atributo Bits de Dados.

    Largura em Bits do Endereço
    A largura em bits do endereço. O número de valores armazenados na ROM será 2Largura em Bits do Endereço.
    Bits de Dados
    A largura em bits de cada valor individual na memória.
    Conteúdo
    Guardará os conteúdos da memória.

    Comportamento da ferramenta Testar

    Ver Testar memória no Guia do Usuário.

    Comportamento da ferramenta Texto

    Nenhum.

    Comportamento da ferramenta Menu

    Ver Menus pop-up e Arquivos no Guia do Usuário.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/mem/register.html0000644000175000017500000001065711541757144021461 0ustar vincentvincent Registrador

    Registrador

    Biblioteca: Memória
    Introdução: 2.0 Beta 1
    Aparência:

    Comportamento

    Um registrador serve para guardar um único valor multibit, que será mostrado em hexadecimal dentro de seu retângulo, e emitido em sua saída Q saída. Quando a entrada de clock (marcada por um triângulo na face sul), assim indicar, o valor armazenado no registrador será alterado para o valor na entrada D naquele instante. Exatamente quando a entrada de clock indicará a situação para que isso aconteça será configurado através do atributo Gatilho.

    A entrada Reset levará o valor no registrador para 0 (em todos os bits) de forma assíncrona, ou seja, enquanto essa entrada for 1, o valor ficará fixo em 0, independente da entrada de clock.

    Pinos

    Na face leste, marcado por Q (saída, com largura em bits de acordo com o atributo Bits de Dados)
    Emitirá o valor atualmente armazenado pelo registrador.
    Na face oeste, marcado por D (entrada, (saída, com largura em bits de acordo com o atributo Bits de Dados)
    Entrada de Dados: no instante em que o valor do clock variar de 0 para 1, o valor no registrador irá mudar para o valor da entrada D naquele instante.
    Na face oeste, marcado por en (entrada, com largura de 1 bit)
    Enable: quando for 0, os gatilhos de clock serão ignorados. O valor atual continuará a aparecer na saída. Os gatilhos de clock estarão ativados quando essa entrada for 1 ou indefinida.
    Na face sul, indicada por um triângulo (entrada, com largura de 1 bit)
    Entrada do Clock: no instante em que o valor da entrada variar de 0 para 1 (borda de subida), o valor no registrador será atualizado para o valor da entrada D .
    Na face sul, marcado por 0 (entrada, com largura de 1 bit)
    Reset assíncrono: quando for 0 ou indefinido, essa entrada não terá efeito. Enquanto ele permanecer em 1, o valor de registrador ficará fixo em 0. Isso ocorrerá assíncronamente - ou seja, sem levar em conta o valor atual da entrada de clock. Enquanto se mantiver em 1, as outras entradas não terão qualquer efeito.

    Atributos

    Quando o componente for selecionado ou estiver sendo acrescentado, Alt-0 até ALT-9 irão alterar o seu atributo Bits de Dados.

    Bits de Dados
    A largura em bits do valor armazenado no registrador.
    Gatilho
    Serve para configurar como a entrada de clock será interpretada. O valor Borda de Subida serve para indicar que o registrador deverá atualizar o seu valor no instante em o clock variar de 0 para 1. O valor Borda de Descida indicará que ele deverá realizar a atualização no instante em que o clock variar de 1 para 0. O valor Nível Alto indicará que o registrador deverá atualizar continuamente, enquanto a entrada de clock for igual a 1. E o valor Nivel Baixo indicará que ele deverá realizar a atualização continuamente enquanto a entrada de clock for 0.
    Rótulo
    O texto para o rótulo associado ao componente.
    Fonte do Rótulo
    A fonte com a qual o rótulo será mostrado.

    Comportamento da ferramenta Testar

    Ao clicar sobre o registrador mudará o foco do teclado para esse componente (indicado por um retângulo vermelho), e ao digitar dígitos hexadecimais poderá alterar o valor armazenado no registrador.

    Comportamento da ferramenta Texto

    Permite que o rótulo associado à porta seja editado.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/mem/random.html0000644000175000017500000001103711541757144021106 0ustar vincentvincent Gerador Aleatório

    Gerador Aleatório

    Biblioteca: Memória
    Introdução: 2.3.0
    Aparência:

    Comportamento

    Este componente itera através de uma sequência de números pseudo-aleatórios, que avançará para o próximo valor na seqüência cada vez que o clock for gatilhado enquanto o componente estiver ativado. Tecnicamente falando, o algoritmo usadoa para calcular a sequência é um gerador pseudo-linear congruencial: a partir de uma semente r0, o próximo valor r1 será o número

    r1 = (25,214,903,917 r0 + 11) mod 248

    O próximo valor r2 será computado a partir de r1 usando o mesmo cálculo, e assim por diante. Essa sequência é de números de 48 bits; o valor produzido pelo componente será formado pelos bits de mais baixa ordem como configurado pelo seu atributo de Bits de Dados, após dispensar os 12 primeiros bits de mais baixa ordem da semente atual.

    Além da entrada de clock, o componente também inclui uma entrada para habilitação Enable , que fará a entrada de clock ser ignorada quando seu valor for 0, e a entrada Reset , que redefinirá o valor do componente de forma assíncrona ao valor inicial da semente r 0 .

    A semente inicial é configurável pelo usuário. Se ela estiver configurada em 0 (o padrão), então a semente será baseada no tempo atual, quando instruído pela entrada de Reset, o componente iniciará com a mesma semente usada anteriormente. Ele adquirirá uma nova semente somente quando toda a simulação for reiniciada.

    Pinos

    Na face leste, marcado por Q (saída, com largura em bits de acordo com o atributo Bits de Dados)
    Emitirá o valor atualmente armazenado pelo registrador.
    Na face oeste, pino superior, marcado por um triângulo (entrada, com largura de 1 bit)
    Clock: no instante em que essa entrada for acionada, conforme especificado pelo atributo Gatilho, o componente passará ao próximo número na sequência.
    Na face oeste, pino inferior (entrada, com largura de 1 bit)
    Enable: O componente estará ativado enquanto essa entrada estiver desconectada ou igual a 1; mas se for 0, então a entrada de clock será ignorada.
    Na face sul (entrada, com largura de 1 bit)
    Reset: quando for 1, a sequência pseudoaleatória assincronamente retornará para o valor inicial da semente.

    Atributos

    Quando o componente for selecionado ou estiver sendo acrescentado, Alt-0 até ALT-9 irão alterar o seu atributo Bits de Dados.

    Bits de Dados
    A largura em bits do valor armazenado no registrador.
    Semente
    O valor inicial usado para a sequência pseudoaleatoria. Se for 0 (o padrão), então o valor inicial será baseado no tempo atual em que a simulação iniciar.
    Gatilho
    Serve para configurar como a entrada de clock deverá ser interpretada. O valor Borda de Subida indicará que o componente deverá atualizar seu valor no instante em que o clock variar de 0 para 1. O valor Borda de Descida indicará que ele deverá ser atualizado no instante em que o clock variar de 1 para 0.
    Rótulo
    O texto para o rótulo associado ao componente.
    Fonte do Rótulo
    A fonte com a qual o rótulo será mostrado.

    Comportamento da ferramenta Testar

    Nenhum.

    Comportamento da ferramenta Texto

    Nenhum.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/mem/ram.html0000644000175000017500000001634411541757144020413 0ustar vincentvincent RAM

    RAM

    Biblioteca: Memória
    Introdução: 2.0 Beta 1
    Aparência:

    Comportamento

    O componente RAM, certamente é o componente mais complexo nas bibliotecas predefinidas do Logisim, capaz de armazenar até 16,777,216 valores (especificado pelo atributo Largura em Bits do Endereço), cada um deles com até 32 bits (especificado pleo atributo Largura em Bits de Dados). Um circuito poderá ler e escrever os valores na RAM. O usuário também poderá modificá-los interativamente via a ferramenta Testar, ou poderá alterá-los completamente via a ferramenta Menu.

    Os valores correntes serão mostrados no componente. Os endereços apresentados serão listados em cinza à esquerda. Na parte de dentro, cada valor será listado em hexadecimal. O endereço atual do endereço selecionado será mostrado em texto negativo (branco sobre preto).

    O componente RAM oferece três interfaces diferentes, dependendo do atributo Interface de Dados.

    Uma porta para leitura/escrita síncrona (padrão)

    O componente possui na sua face leste uma porta que servirá tanto para ler quanto para gravar dados. Qual a ação a ser executada dependerá da entrada marcada por ld: 1 (ou flutuante) indicará a leitura de dados do endereço informado pela face oeste, e 0 indicará a escrita dos dados entregues na porta. Para transmitir dados para dentro e para fora do componente, você precisará usar um componente do tipo Buffer Controlado, como ilustrado abaixo.

    Uma porta para leitura/escrita assíncrona

    O mesmo descrito acima, exceto que não haverá participação do clock. O valor encontrado no barramento de dados será carregado na memória sempre que a entrada ld estiver em 0. Se, enquanto ld estiver em 0, o endereço ou os dados mudarem, então uma carga adicional ocorrerá. Essa opção é a que mais se aproxima de muitas das memórias de acesso aleatório comumente disponíveis.

    Portas separadas para leitura e escrita

    Duas portas estão disponíveis - uma na face oeste para a escrita de dados, e outra na face leste para leitura de dados. Essa opção retirará a necessidade de se lidar com o Buffer Controlado e então ficará mais fácil de usar.

    Pinos

    A Na face oeste (entrada, com largura em bits de acordo com o atributo Bits de Dados)
    Serve para selecionar quais os valores estarão sendo acessados atualmente pelo circuito.
    D Na face oeste (entrada/saída, com largura em bits de acordo com o atributo Bits de Dados)
    Se essa entrada estará presente somente se "portas separadas para leitura e escrita" tiverem sido selecionadas pelo atributo Interface de Dados. Quando uma escrita for requisitada (via mudança do clock de 0 para 1 enquanto sel e str forem ambos iguais a 1 ou flutuante), o valor encontrado nessa porta será escrito na memória no endereço atualmente selecionado.
    D Na face leste (entrada/saída ou saída, com largura em bits de acordo com o atributo Bits de Dados)
    Se sel e ld forem iguais a 1 ou flutuante, então o componente RAM emitirá o valor encontrado no endereço corrente por essa porta. Se houver uma porta para leitura/escrita, o valor lido nessa porta será escrito onde quer que o armazenamento seja requisitado.
    str Na face sul (entrada, com largura de 1 bit)
    store: essa entrada estará presente somente se "portas separadas para leitura e escrita" tiverem sido selecionadas pelo atributo Interface de Dados. Se for 1 ou flutuante, um pulso de clock resultará na escrita dos dados encontrados na face oeste na memória (se a entrada sel também for 1 ou flutuante).
    sel Na face sul (entrada, com largura de 1 bit)
    chip select: essa entrada habilita ou desabilita o módulo RAM por inteiro, caso o valor seja igual a 1, flutuante ou 0. Essa entrada destina-se primariamente para as situações em que houver múltiplas RAMs, mas somente uma delas deva estar habilitada em certo instante.
    Triângulo na face sul (entrada, com largura de 1 bit)
    clock: essa entrada estará ausente quanto o atributo Interface de Dados for "uma porta assíncrona para leitura/escrita". Em outras circunstâncias, quando ld for igual a 0, e essa entrada variar de 0 para 1 (e sel for igual a 1, indefinido e clr for 0), então o valor no endereço atualmente selecionado será alterado para o valor presente no pino D. Enquanto a entrada de clock permanecer em 0 ou 1, no entanto, o valor em D não será escrito na memória.
    ld Na face sul (entrada, com largura de 1 bit)
    load: serve para selecionar se a RAM deverá emitir (em D) o valor no endereço atual (A). O comportamento dessa saída estará habilitado se out estiver em 1 ou indefinido; se out for 0, então nenhum valor será colocado em D - mas se houver uma porta de leitura/escrita combinada, a escrita estará habilitada.
    clr Na face sul (entrada, com largura de 1 bit)
    clear: quando for igual a 1, todos os valores na memória ficarão iguais a 0, independente do que estiver nas outras portas.

    Atributos

    Quando o componente for selecionado ou estiver sendo acrescentado, os dígitos de '0 'a '9' poderão alterar o atributo Número de Entradas, Alt-0 até ALT-9 irão alterar o seu atributo Bits de Dados.

    Largura em Bits do Endereço
    A largura em bits do endereço. O número de valores armazenados na ROM será 2Largura em Bits do Endereço.
    Bits de Dados
    A largura em bits de cada valor individual na memória.
    Interface de Dados
    Serve para configurar quais das três interfaces serão usadas para comunicar dados para dentro e para fora do componente.

    Comportamento da ferramenta Testar

    Ver Testar memória no Guia do Usuário.

    Comportamento da ferramenta Texto

    Nenhum.

    Comportamento da ferramenta Menu

    Ver Menus pop-up e Arquivos no Guia do Usuário.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/mem/index.html0000644000175000017500000000323311541757144020734 0ustar vincentvincent Biblioteca Memória

    Biblioteca Memória

    A biblioteca Memória inclui componentes que guardam informação.

    Flip-Flops D/T/J-K/S-R
    Registrador
    Contador
    Registrador de Deslocamento
    Gerador Aleatório
    RAM
    ROM

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/mem/flipflops.html0000644000175000017500000002076211541757144021631 0ustar vincentvincent Flip-Flops D/T/J-K/S-R

    Flip-Flops D/T/J-K/S-R

    Biblioteca: Memória
    Introdução: 2.0 Beta 1
    Aparência:

    Comportamento

    Cada flip-flop armazena um único bit como dado, o qual será emitido através da saída Q na face leste. Normalmente, o valor poderá ser controlado pelas entradas do lado oeste. Em particuar, o valor irá mudar quando houver variação da entrada de clock, marcada por um triângulo em cada flip-flop, quando essa passar de 0 para 1 (ou o contrário se assim configurado); ao ocorrer, portanto, uma borda de subida, o valor mudará de acordo com a tabela abaixo.

    Flip-Flop D Flip-Flop T Flip-Flop J-K Flip-Flop S-R
    DQ
    00
    11
    TQ
    0Q
    1Q'
    JKQ
    00 Q
    01 0
    10 1
    11 Q'
    SRQ
    00 Q
    01 0
    10 1
    11 ??

    Outra maneira de descrever os diferentes comportamentos dos flip-flops está no texto original em inglês.

    • Flip-Flop D: Quando houver variação do clock, o valor guardado no flip-flop será o valor na entrada D (Data) naquele instante.

    • Flip-Flop T: Quando houver variação do clock, o valor guardado no flip-flop será alternado ou mantido dependendo se o valor na entrada T (Toggle) for 1 ou 0.

    • Flip-Flop J-K: Quando houver variação do clock, o valor guardado no flip-flop será alternado se as entradas J e K forem ambas iguais a 1 e será mantido se ambas forem iguais a zero; se forem diferentes, então o valor se tornará 1 se a entrada J (Jump) for 1 e será 0 se a entrada K (Kill) for 1.

    • Flip-Flop S-R: Quando houver variação do clock, o valor guardado no flip-flop será mantido se R e S forem ambos iguais a 0; irá mudar para 0, se a entrada R (Reset) for 1, e se tornará 1 se a entrada S (Set) for 1. O comportamento não será especificado se as duas entradas forem forem iguais a 1. (No Logisim, o valor anterior do flip-flop será mantido.)

    Por padrão, o clock irá variar na borda de subida — ou seja, quando a entrada de clock variar de 0 para 1. Contudo, o atributo Gatilho permitirá que essa mudança ocorra na borda de descida (quando a entrada de clock variar de 1 para 0), ou em nível baixo (enquanto a entrada de clock permanecer em 0). As opções de disparo dependentes do nível não estão disponíveis para os flip-flops T e J-K, porque esses se comportam de forma imprevisível quando forçados a alternar por tempo indeterminado.

    Pinos

    Na face oeste, marcado por um triângulo (entrada, com largura de 1 bit)
    clock: no instante em que o valor dessa entrada variar de 0 para 1 (borda de subida), haverá atualização de acordo com as entradas na face oeste. Enquanto se mantiver em 0 ou 1, essas entradas não terão efeito.
    Na face oeste, outros pino(s) rotulados (entrada(s), com largura de 1 bit)
    Essas entradas controlarão como o valor do flip-flop irá mudar durante a subida de borda do clock. O comportamento exato dependerá do tipo de flip-flop; a tabela acima resume esses comportamentos.
    Na face leste, marcado por Q, extremo norte (saída, com largura de 1 bit)
    Emitirá o valor corrente armazenado pelo flip-flop.
    Na face leste, extremo sul end (saída, com largura de 1 bit)
    Emitirá o complemento do valor corrente armazenado pelo flip-flop.
    Na face sul, extremo leste (entrada, com largura de 1 bit)
    reset assíncrono: se for igual a 0 ou indefinido, essa entrada não terá efeito algum. Enquanto se mantiver em 1, o valor do flip-flop ficará fixo em 0. Isso ocorrerá assincronamente - ou seja, sem depender do valor corrente da entrada de clock. Enquanto se mantiver em 1, as outras entradas não terão efeito algum.
    Na face sul, posição central (entrada, com largura de 1 bit)
    enable: se for igual a 0, o disparo do clock será ignorado. O valor corrente continuará a aparecer na saída. Os gatilhos do clock estarão habilitados quando essa entrada for 1 ou indefinida.
    Na face sul, extremo oeste (entrada, com largura de 1 bit)
    set assíncrono: se for igual a 1 ou indefinido, essa entrada não terá efeito algum. Enquanto se mantiver em 1, o valor do flip-flop ficará fixo em 1. Enquanto se mantiver em 1, as outras entradas não terão efeito algum, exceção feita para a entrada reset, que tem prioridade.

    Atributos

    Gatilho
    Serve para configurar como a entrada de clock deverá ser interpretada. O valor borda de subida indicará que a atualização do flip-flop deverá ocorrer no instante em que o clock variar de 0 para 1. O valor borda de descida indicará que a atualização deverá ocorrer no instante em que o clock variar de 1 para 0. O valor nível alto indicará que a atualização deverá ocorrer continuamente enquanto o clock se mantiver em 1. E o valor nível alto indicará que o valor deverá ser atualizado continuamente enquanto a entrada de clock se mantiver em 0. Observar que as duas últimas opções não estão disponíveis para os flip-flops T e J-K.
    Rótulo
    O texto para o rótulo associado ao flip-flop.
    Fonte do Rótulo
    A fonte com a qual o rótulo será mostrado.

    Comportamento da ferramenta Testar

    Ao cliclar sobre um flip-flop usando a ferramenta Testar isso irá alternar o bit nele armazenado, a menos que as entradas assíncronas set/reset tenham fixado o valor corrente do flip-flop.

    Comportamento da ferramenta Texto

    Permite que o rótulo associado à porta seja editado.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/mem/counter.html0000644000175000017500000001561011541757144021306 0ustar vincentvincent Contador

    Contador

    Biblioteca: Memória
    Introdução: 2.3.0
    Aparência:

    Comportamento

    O contador mantém certo valor, o qual será emitido pela saída Q. Cada vez que a entrada de clock (indicada por um triângulo na face sul do componente) variar de acordo com o atributo Gatilho, o valor do contador será atualizado de acordo com as duas entradas na face oeste do componente: a superior será chamada load e a inferior count, e serão interpretadas com se segue.

    loadcountAção do gatilho
    0 ou z0 Contador permanecerá imutável.
    0 ou z1 ou z Contador incrementará.
    10 Contador carregará valor encontrado na entrada D.
    11 ou z Contador decrementará.

    O limite da contagem poderá ser configurado pelo atributo Valor Máximo. Quando o contador alcançar esse valor, o próximo incremento levará o contador de volta para 0; e se já estiver em 0, um decremento o levará de volta ao Valor Máximo.

    Além da saída Q, o componente também possui uma saída de apenas um bit chamada carry. Essa será igual a 1 sempre que o contador atingir o valor máximo e as entradas load e count indicarem que o componente deverá fazer um incremento no próximo passo - ou quando o contador estiver em 0 e as entradas load e count indicarem decremento no próximo passo.

    A entrada clear reiniciará o contador a partir do valor 0 (em todos os bits) assincronamente; ou seja, enquanto a entrada clr estiver em 1, o valor ficará fixo em 0, independente da entrada de clock.

    Pinos

    Na face leste, marcado por Q (saída, com largura em bits de acordo com o atributo Bits de Dados)
    Emitirá o valor atualmente armazenado pelo contador.
    Na face leste, pino inferior (saída, com largura de 1 bit)
    carry: quando load e count indicarem incrementar, a saída será 1 sempre que o contador estiver no máximo. Quando load e count indicarem decrementar, essa saída será 1 sempre que o contador estiver em 0. Todas as outras vezes, a saída será 0.
    Na face oeste, pino superior (entrada, com largura de 1 bit)
    load: Se for 1, enquanto a entrada count for 0, o contador irá carregar o valor encontrado na entrada data na próxima variação do clock - ou, se a entrada count for 1, o valor do contador será decrementado.
    Na face oeste, pino central marcado por D (entrada, com largura em bits de acordo com o atributo Bits de Dados)
    Dado: quando o clock variar enquando a entrada load estiver em 1 e count for 0, o conteúdo do contador irá mudar para o valor encontrado nessa entrada.
    Na face oeste, pino inferior marcado por ct (entrada, com largura de 1 bit)
    count: quando estiver em 1 ou desconectado, o valor no contador será incrementado sempre que a entrada de clock variar - ou decrementado se a entrada load também estiver em 1.
    Na face sul, indicado por um triângulo (entrada, com largura de 1 bit)
    clock: no instante em que variar conforme especificado pelo atributo Gatilho, o contador irá se atualizar de acordo com as entradas load e count.
    Na face sul, marcado por 0 (entrada, com largura de 1 bit)
    clear: quando estiver em 0 ou indefinido, essa entrada não terá efeito algum. Enquanto permanecer em 1, o valor do contador se manterá em 0 assincronamente. Isso ocorrerá assincronamente - ou seja, sem depender do valor corrente da entrada de clock. Enquanto permanecer em 1, as outras entradas não terão efeito.

    Atributos

    Quando o componente for selecionado ou estiver sendo acrescentado, Alt-0 até ALT-9 irão alterar o seu atributo Bits de Dados.

    Bits de Dados
    A largura em bits do valor emitido pelo componente.
    Valor Máximo
    O maior valor possível, a partir do qual o contador irá produzir saída de carry.
    Ação quando Overflow
    O comportamento do contador quanto tentar fazer incremento além do valor máximo ou decrementar além de 0. Há quatro ações possíveis:
    Circular
    O próximo valor será 0 (se estiver incrementando - ou valor máximo se decrementando).
    Permanecer no Valor
    O contador permanecerá no valor máximo (ou 0 se estiver decrementando)
    Continuar Contando
    O contador continuará incrementando/decrementando, mantendo o número de bits conforme o estabelecido pelo atributo Bits de Dados.
    Carregar Próximo Valor
    O próximo valor será carregado a partir da entrada D.
    Gatilho
    Serve para configurar como a entrada de clock será interpretada. O valor Borda de Subida serve para indicar que o contador deverá atualizar o seu valor no instante em o clock variar de 0 para 1. O valor Borda de Descida indicará que ele deverá realizar a atualização no instante em que o clock variar de 1 para 0.
    Rótulo
    O texto para o rótulo associado à porta.
    Fonte do Rótulo
    A fonte com a qual o rótulo será mostrado.

    Comportamento da ferramenta Testar

    Ao clicar sobre o contador mudará o foco do teclado para esse componente (indicado por um retângulo vermelho), e ao digitar dígitos hexadecimais poderá alterar o valor armazenado no contador.

    Comportamento da ferramenta Texto

    Permite que o rótulo associado à porta seja editado.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/legacy/0000755000175000017500000000000011541757144017424 5ustar vincentvincentlogisim-2.7.1/doc/pt/html/libs/legacy/register.html0000644000175000017500000000516311541757144022143 0ustar vincentvincent Registrador de 8-bits do Logisim

    Registrador de 8-bits do Logisim

    Biblioteca: Legada
    Introdução: 2.0 Beta 12
    Aparência:

    Comportamento

    Esses componentes existem apenas para compatibilidade com versões anteriores como as Logisim 1.0X, pois os novos circuitos, o registrador da biblioteca Memória devem ser usados em seu lugar.

    O registrador armazena um único valor de 8 bits, que será exibido em hexadecimal dentro do retângulo, e será emitido através da saída em sua face leste. (O Logisim 1.0X não oferecia suporte para valores multibit, por isso registrador tinha que ter um pino individual para cada bit.) No momento em que a entrada de clock (indicada por um triângulo na face oeste) varia de 0 para 1, o valor a ser armazenado no registrador será guardado de acordo com os oito bits das entradas na face oeste.

    Pinos

    Na face leste, oito pinos (saídas, com largura de 1 bit cada)
    Emitirá o valor atualmente armazenado pelo registrador, com o bit menos significativo no pino mais acima.
    Na face oeste, oito pinos (entradas, com largura de 1 bit cada)
    Cada vez que o clock variar de 0 para 1, o valor do registrador irá mudar para aquele presente na entrada naquele instante. O bit menos significativo estará no pino mais acima.
    Na face oeste, indicado por um triângulo (entrada, com largura de 1 bit)
    Entrada de clock: cada vez que esse valor variar de 0 para 1 (borda de subida), o valor do registrador será atualizado para armazenar os valores das outras entradas na face oeste.

    Atributos

    Nenhum.

    Comportamento da ferramenta Testar

    Ao clicar no registrador, o foco será passado ao teclado associado ao registrador (indicado por um retângulo vermelho) e, ao digitar valores hexadecimais, esses irão ser armazenados no registrador.

    Comportamento da ferramenta Texto

    Nenhum.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/legacy/index.html0000644000175000017500000000161711541757144021426 0ustar vincentvincent Biblioteca legada

    Biblioteca legada

    A biblioteca legada inclui componentes que existem apenas para manter compatibilidade com versões da série 1.0x do Logisim.

    Flip-Flop D/J-K do Logisim 1.0
    Registrador de 8-bits do Logisim 1.0

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/legacy/flipflops.html0000644000175000017500000001036511541757144022315 0ustar vincentvincent Flip-Flop D/J-K do Logisim 1.0

    Flip-Flop D/J-K do Logisim 1.0

    Biblioteca: Legada
    Introdução: 2.0 Beta 12
    Aparência:

    Comportamento

    Esses componentes existem apenas para compatibilidade com versões anteriores como as Logisim 1.0X, pois os novos circuitos, flip-flops da biblioteca Memória devem ser usados em seu lugar.

    Cada flip-flop armazenará um único bit de dado, que será emitido através da saída Q no lado leste. Normalmente, o valor pode ser controlado através das entradas do lado oeste. Em particular, haverá variação quando a entrada de clock, marcada por um triângulo em cada flip-flop, varia de 0 para 1 (borda de subida), e o valor mudará de acordo com a tabela abaixo.

    Flip-Flop D Flip-Flop J-K
    DQ
    00
    11
    JKQ
    00 Q
    01 0
    10 1
    11 Q'
    Outra forma para descrever o comportamento singular dos flip-flops está no texto original em inglês.
    • Flip-Flop D: Quando o relógio varia de 0 para 1, o valor a ser guardado pelo flip-flop será aquele presente na entrada D (Dado) naquele instante.

    • Flip-Flop JK: Quando o relógio varia de 0 para 1, o valor a ser guardado pelo flip-flop alternará se as entradas J e K forem iguais a 1, e permanecerá o mesmo se ambos forem 0; se forem diferentes, então o valor torna-se 1 se a entrada J ( Jump ) for 1 e 0 se a entrada K (Kill) for 1.

    Pinos

    Na face oeste, marcada pelo triângulo (entrada, com largura de 1 bit)
    entrada do clock: no instante em que esse valor de entrada muda de 0 para 1 (a borda de subida), o valor será atualizado de acordo com os outras entradas na face oeste. Enquanto permanecer em 0 ou 1, nenhuma das outras entradas na face oeste terá qualquer efeito.
    Na face oeste, outro pino(s) rotulado(s) (entrada(s), com largura de 1 bit)
    Essas entradas controlam como serão as mudanças do valor flip-flop quando houver subida de borda do clock. Seu comportamento exato dependerá do flip-flop; as tabelas acima resumem seu comportamento.
    Na borda leste, marcado como Q, em cima (saída, com largura de 1 bit)
    Saída com o valor atualmente armazenado pelo flip-flop.
    Na borda leste, em baixo (saída, com largura de 1 bit)
    Saída com o complemento do valor atualmente armazenado pelo flip-flop.

    Atributos

    Nenhum.

    Comportamento da ferramenta Testar

    Nenhum.

    Comportamento da ferramenta Texto

    Nenhum.

    Back to Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/io/0000755000175000017500000000000011541757144016567 5ustar vincentvincentlogisim-2.7.1/doc/pt/html/libs/io/tty.html0000644000175000017500000000633311541757144020302 0ustar vincentvincent TTY

    TTY

    Biblioteca: Entrada/Saída
    Introdução: 2.2.0
    Aparência:

    Comportamento

    Esse componente implementa um terminal burro muito simples. Ele recebe uma sequência de códigos ASCII e exibe cada caractere imprimível. Quando a linha atual estiver completa, o cursor se moverá para a linha seguinte, possivelmente movendo todas as linhas correntes para cima se o cursor já estiver na última linha. As únicas sequências de controle oferecidas são: backspace (ASCII 8), que eliminará o último caractere na última linha, a menos que essa já esteja vazia; nova linha (ASCII 10), que moverá o cursor para o início da linha seguinte, haverá rolagem de linhas, se necessário; e alimentação de formulário (ASCII 12, digitando-se control-L), que limpará a tela.

    Pinos

    Na face oeste, pino superior (entrada, com largura de 7 bits)
    Dados - esse é o valor ASCII do próximo caractere que entrar no terminal.
    Na face oeste, pino inferior marcado pelo triângulo (entrada, com largura de 1 bit)
    Clock - quando ativado, enquanto pino para habilitar a escrita não for 0, o valor ASCII corrente na entrada de dados será processado pelo terminal.
    Na face sul, pino mais à esquerda (entrada, com largura de 1 bit)
    Habilitar escrita - quando em 1 (ou flutuante, ou de erro), uma variação de borda do sinal de clock resultará no processamento de um novo caractere a partir da entrada de dados. As entradas de clock e de dados serão ignoradas quando seu valor for 0.
    Na face sul, segundo pino da esquerda (entrada, com largura de 1 bit)
    Limpar - se 1, o terminal será limpo de todos os dados e todas as outras entradas serão ignoradas.

    Atributos

    Linhas
    O número de linhas exibidas no terminal.
    Colunas
    O número máximo de caracteres exibidos em cada linha do terminal.
    Gatilho
    Se o valor for Borda de Subida, , então, quando o clock variar de 0 para 1, a entrada de dados será processado (quando ativado pelas entradas Habilitar Escrita e Limpar Entradas). Se for Borda de Descida, , então isso acontecerá quando o clock variar de de 1 para 0.
    Cor
    A cor com a qual o texto aparecerá no terminal.
    Cor de Fundo
    A cor com que desenhar o fundo do terminal.

    Comportamento da ferramenta Testar

    Nenhum.

    Comportamento da ferramenta Texto

    Nenhum.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/io/segs.png0000644000175000017500000000050311541757144020234 0ustar vincentvincentPNG  IHDRRp} PLTEaaa pHYs  tIME wIDATHA PoЫ9t٣>G7qU6Aҩi( "~|8+bVJԇiGՁw cAk}^ WAe6}`9"픁9I8A7mi#Ӓo\[TG1"9IlMM9m[*&r&~Be-۰*R0&$ logisim-2.7.1/doc/pt/html/libs/io/led.html0000644000175000017500000000434611541757144020230 0ustar vincentvincent LED

    LED

    Biblioteca: Input/Output
    Introdução: 2.1.3
    Aparência:

    Comportamento

    Exibirá o valor de sua entrada colorindo, ou não, o LED (conforme especificado pelo seu atributo Cor), dependendo se a entrada for 1 ou 0.

    (O componente LED é similar a um pino de saída, exceto com uma aparência um pouco diferente. Alguns usuários, no entanto, acharam que seria bom incluir.)

    Pinos

    Um LED tem apenas um pino, uma entrada de 1 bit que é utilizada para determinar se é para mostrar o LED colorido (quando a entrada for 1) ou apagado (quando a entrada for outra coisa).

    Atributos

    Quando o componente for selecionado ou estiver sendo acrescentado, as teclas com setas poderão alterar o seu atributo Direção.

    Direção
    Posição do pino de entrada em relação ao componente.
    Cor
    A cor a ser exibida quando o valor da entrada for 1.
    Ativo em Alto
    Se sim, então, o LED será colorido quando a entrada for 1. Se não, será colorido quando a entrada for 0.
    Rótulo
    O texto no rótulo associado ao componente.
    Posição do Rótulo
    A posição do rótulo em relação ao componente.
    Fonte do rótulo
    A fonte a ser usada no rótulo.
    Cor do rótulo
    A cor com a qual desenhar o rótulo.

    Comportamento da ferramenta Testar

    Nenhum.

    Comportamento da ferramenta Texto

    Permite que o rótulo associado ao componente possa ser editado.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/io/keyboard.html0000644000175000017500000001060311541757142021253 0ustar vincentvincent Teclado

    Teclado

    Biblioteca: Entrada/Saída
    Introdução: 2.2.0
    Aparência:

    Comportamento

    Esse componente permitirá ao circuito ler o que for digitado no teclado - contanto que as teclas sejam representáveis no código ASCII de 7 bits. Depois de clicar no componente usando a ferramenta Testar (Poke), o usuário poderá digitar caracteres, que serão armazenados em um buffer. Sempre que necessário, o valor ASCII do caractere mais a esquerda no buffer será enviado para a saída mais à direita. Quando a entrada de clock for disparada, o caracteres mais à esquerda será suprimida do buffer e o caractere mais à esquerda será enviado para a saída da direita.

    Os caracteres armazenáveis no buffer serão todos os caracteres ASCII imprimíveis, como o espaço, nova linha, backspace, e control-L. Além disso, as setas para a esquerda e a direita moverão o cursor dentro do buffer, e a tecla backspace apagará o caractere à direita do cursor (se houver).

    O componente é assíncrono no sentido que quando o buffer estiver vazio e o usuário digitar um caractere, esse será enviado imediatamente para uma saída, sem esperar por um pulso de clock.

    Pinos

    Na face oeste, marcada por um triângulo (entrada, com largura de 1 bit)
    Clock - quando for ativado, e enquanto o pino de leitura não for 0, o caractere mais à esquerda do buffer será excluído, e as saídas serão atualizadas para refletir novo status do buffer.
    Na face sul, o pino mais à esquerda (entrada, com largura de 1 bit)
    Ativar Leitura - quando 1 (ou flutuante, ou erro), quando houver uma variação de borda do sinal de clock o caractere mais à esquerda do buffer será consumido. A entrada de clock será ignorada quando o Ativar Leitura for 0.
    Na face sul, o segundo pino mais à esquerda (entrada, com largura de 1 bit)
    Limpar - se for 1, o buffer será esvaziado e não aceitará mais caracteres.
    Na face sul, o segundo pino mais à direita (saída, com largura de 1 bit)
    Disponível - será 1 quando o buffer contiver pelo menos um caractere e será 0 quando o buffer estiver vazio.
    Na face sul, o pino mais à direita (saída, com largura de 7 bits)
    Dados - código ASCII com 7-bits para o caractere mais à esquerda no buffer; ou 0, se o buffer estiver vazio.

    Atributos

    Tamanho do Buffer
    O número de caracteres que o buffer poderá conter.
    Gatillho
    Se o valor for Borda de Subida, então, quando o valor do clock variar de 0 para 1, o caractere mais à esquerda será consumido (quando ativado pela entrada Habilitar Leitura). Se for Borda de Descida, isso acontecerá quando o clock mudar de 1 para 0.

    Comportamento da ferramenta Testar

    Ao pressionar o botão do mouse mudará o foco do teclado para esse componente, e um cursor na forma de barra vertical será exibido.

    Cada caractere digitado será inserido no buffer, enquanto este não atingir a sua capacidade e o caractere for um daqueles aceitáveis pelo componente: os caracteres imprimíveis em código ASCII de 7 bits, como espaço, backspace, nova linha, e control-L. Além disso, o usuário poderá usar as setas para a esquerda e para a direita para alterar a posição do cursor no buffer, e o usuário poderá usar a tecla Delete para apagar o caractere no buffer (se houver) à direita do cursor.

    Comportamento da ferramenta Texto

    Nenhum.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/io/joystick.html0000644000175000017500000000506411541757142021317 0ustar vincentvincent Joystick

    Joystick

    Biblioteca: Entrada/Saída
    Introdução: 2.2.0
    Aparência:

    Comportamento

    O usuário poderá arrastar o botão vermelho na área quadricular arredondada, e as saídas serão atualizadas para indicar as coordenadas atuais de x - e y. Isso serve para emular como funcionam os conhecidos joysticks dos jogos clássicos do tipo arcade.

    Pinos

    Na face oeste, pino superior (saída, com tamanho dado pelo atributo Largura em Bits)
    Indicará a coordenada x, e deverá ser interpretado como um inteiro sem sinal cujo valor nunca será 0. Assim, um valor igual a 1 representará o extremo à esquerda, e o valor máximo para a largura do bit indicará o extremo à direita. Quando o botão está em repouso (no centro), o valor terá o padrão de bits 10 ... 00.
    Na face oeste, pino inferiro (saída, com tamanho dado pelo atributo Largura em Bits)
    Indicará a coordenada y, cujo valor irá variar conforme com o pino da coordenada x. Quando o botão for levado para cima, essa saída terá valor igual a 1, e quando o botão for levado para baixo, a saída será o valor máximo para a largura de bits selecionada.

    Atributos

    Largura em Bits
    O número de bits usado para indicar cada uma das coordenadas do botão.
    Cor
    A cor do botão como será desenhada na tela.

    comportamento da ferramenta Testar

    Ao pressionar o botão do mouse enquanto dentro da área joystick movimentará o botão para aquela posição e atualizará as saídas. Ao arrastar o mouse continuará a mover o botão e atualizar as saídas, enquanto mantiver o botão dentro da área do joystick. Ao liberar o botão do mouse voltará à sua posição de repouso.

    Comportamento da ferramenta Texto

    Nenhum.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/io/index.html0000644000175000017500000000332211541757142020562 0ustar vincentvincent Biblioteca para Entrada/Saída

    Biblioteca para Entrada/Saída

    A biblioteca para Entrada/Saída inclui componentes que se destinam a corresponderem àqueles típicos encontrados em produtos eletrônicos para interface com um usuário.

    Botão
    Joystick
    Teclado
    LED
    Display de 7-segmento
    Display hexadecimal
    Matriz de LEDs
    TTY

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/io/hexdig.html0000644000175000017500000000423111541757142020723 0ustar vincentvincent Display hexadecimal

    Display hexadecimal

    Biblioteca: Input/Output
    Introduçaõ: 2.2.0
    Aparência:

    Comportamento

    Ao usar um display de 7-segmentos, mostrará o dígito hexadecimal correspondente à entrada de quatro bits. Se qualquer uma das entradas não forem 0/1 (ou flutuante ou erro), então, o display mostrará um traço ('-'). Uma entrada de um bit em separado controlará a exibição do ponto decimal.

    Pinos

    Na face sul, a primeira a partir da esquerda (entrada, com largura de 4 bits)
    Essa entrada será interpretada como um número de quatro bits sem sinal, e os dígitos hexadecimais correspondentes serão exibida. Se algum dos bits for flutuante ou erro, então, um traço ('-') será exibido.
    Na face sul, a segunda a partir da esquerda (entrada, com largura de 1 bit)
    Serve para controlar o ponto decimal. Se este não estiver conectado, o ponto decimal permanecerá desligado.

    Atributos

    Cor se Ligado
    A cor com a qual desenhar os segmentos do display e do ponto decimal quando eles estiverem acesos.
    Cor se Desligado
    A cor com a qual desenhar os segmentos do display e do ponto decimal quando elas estiverem apagados.
    Cor de Fundo
    A cor com a qual desenhar o fundo da tela (transparente por padrão).

    Comportamento da ferramenta Testar

    Nenhum.

    Comportamento da ferramenta Texto

    Nenhum.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/io/dotmat.html0000644000175000017500000001142411541757142020745 0ustar vincentvincent Matriz de LED

    Matriz de LED

    Biblioteca: Entrada/Saída
    Introdução: 2.2.0
    Aparência:

    Comportamento

    Exibirá uma pequena matriz de pixels, cujos valores serão determinados pelas entradas atuais. A matriz poderá ter até 32 linhas e 32 colunas.

    Pinos

    A interface para o componente irá variar dependendo do valor do atributo Formato da Entrada. Ele tem três valores possíveis.

    Colunas
    As entradas serão alinhadas ao longo da face sul do componente, com uma entrada multibit para cada coluna da matriz. Cada entrada tem tantos bits quanto existirem linhas na matriz, com o bit de mais baixa ordem correspondente ao pixel mais ao final de cada coluna. Um valor igual a 1 indicará que o pixel correspondente deverá ser ligado, enquanto um valor igual a 0 indicará que o pixel deverá permanecer apagado. Se algum bit de uma coluna for flutuante ou erro, então todos os pixels da coluna ficarão acesos.
    Linhas
    As entradas serão alinhadas ao longo da face oeste do componente, com uma entrada multibit para cada linha da matriz. Cada entrada terá tantos bits quantos forem as colunas na matriz, com o bit de mais baixa ordem correspondente ao pixel mais à direita na linha. Tal como acontece com o formato de colunas, um valor igual a 1 indicará que o pixel correspondente deverá ser ligado, e um valor igual a 0 indicará que o pixel deverá se manter apagado. Se algum bit de uma linha for flutuante ou erro, então, todos os pixels da linha ficarão acesos.
    Selecionar Linhas/Colunas
    Há duas entradas na face oeste do componente. A entrada multibit superior terá tantos bits quantos forem as colunas na matriz, com o bit de mais baixa ordem correspondente à coluna mais à direita. A entrada multibit inferior terá tantos bits quanto as linhas da matriz, com o bit de mais baixa ordem correspondente para o final de cada linha. Se algum bit for flutuante ou erro, todos os pixels da matriz estarão acesos. Normalmente, no entanto, um pixel em uma certa linha-coluna ficará aceso, se o bit correspondente à coluna na entrada superior for 1 e o bit da linha correspondente na entrada inferior também for 1. Por exemplo, para uma matriz 5x7, se a primeira entrada for 01010 e a segunda for 0111010, então, a segunda e a quarta coluna estarão acesas para a segunda, a terceira, a quarta e a sexta linha, o resultado aparecerá como um par de pontos de exclamação. (Esse formato de entrada pode parecer pouco intuitivo, mas matrizes de LED são vendidas exatamente com essa interface. A Lite-On vende componentes como esse, por exemplo.)

    Atributos

    Formato da Entrada (somente leitura após o componente ser criado)
    Serve para selecionar como os pinos corresponderão aos pixels, como descrito acima.
    Colunas da Matriz
    Serve para selecionar quantas colunas estarão na matriz, o que poderá variar de 1 a 32.
    Linhas da Matriz
    Serve para selecionar quantas linhas estarão na matriz, o que poderá variar de 1 a 32.
    Cor se Ligado
    Serve para selecionar a cor de um pixel quando for aceso.
    Cor se Desligado
    Serve para selecionar a cor de um pixel quando estiver apagado.
    Persistência da Luz
    Quando for diferente de 0, um pixel aceso permanecerá aceso pelo número de alternâncias do clock após quantidade da entrada do componente indicar que o pixel deverá ficar apagado.
    Forma dos pontos
    A opção quadrado significa que cada pixel será desenhado como um quadrado 10x10, preenchendo o componente, sem lacunas entre os pixels. A opção círculo significa que cada pixel será desenhado como um círculo de diâmetro-8, com intervalos entre cada círculo. O círculo é a opção mais difícil de interpretar, mas é mais se aproxima dos componentes do tipo matriz de LEDs comerciais.

    Comportamento da ferramenta Testar

    Nenhum.

    Comportamento da ferramenta Texto

    Nenhum.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/io/button.html0000644000175000017500000000376311541757142020777 0ustar vincentvincent Botão

    Botão

    Biblioteca: Entrada/Saída
    Introdução: 2.1.3
    Aparência:

    Comportamento

    As saídas serão normalmente 0, mas quando o usuário estiver pressionando o botão usando a ferramenta Testar (Poke), a saída será 1.

    Pinos

    Um botão tem apenas um pino, uma saída 1-bit, que é 0, exceto quando o usuário está pressionando o botão usando a ferramenta Testar (Poke), quando é 1.

    Atributos

    Quando o componente for selecionado ou estiver sendo acrescentado, as teclas com setas poderão alterar o seu atributo Direção.

    Direção
    A posição do pino de saída em relação ao componente.
    Cor
    A cor com a qual o botão será exibido.
    Rótulo
    O texto no rótulo associado ao componente.
    Posição do rótulo
    A posição do rótulo em relação ao componente.
    Fonte do rótulo
    A fonte a ser usada no rótulo.
    Cor do rótulo
    A cor com a qual desenhar o rótulo.

    Comportamento da ferramenta Testar

    Quando o botão do mouse for pressionado, a saída do componente será 1. Ao soltar o botão do mouse, o resultado voltará a 0.

    Comportamento da ferramenta Texto

    Permitirá que o rótulo associado ao componente seja editado.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/io/7seg.html0000644000175000017500000000572711541757142020333 0ustar vincentvincent Display de 7-segmentos

    Display de 7-segmentos

    Biblioteca: Entrada/Saída
    Introdução: 2.1.3
    Aparência:

    Comportamento

    Exibirá os valores de suas oito entradas de um bit. Segmentos ou serão coloridos ou cinzas, dependendo das entradas. A correspondência é a que se segue.

    (Os fabricantes variam a forma como eles mapeiam as entradas para os segmentos, o correspondência usada aqui é baseada no Texas Instruments TIL321.)

    Pinos

    Na face norte, primeiro da esquerda (entrada, com largura de 1 bit)
    Serve para controlar o segmento médio horizontal.
    Na face norte, de segunda à esquerda (entrada, com largura de 1 bit)
    Serve para controlar o segmento superior vertical no lado esquerdo.
    Na face norte, o terceiro da esquerda (entrada, com largura de 1 bit)
    Serve para controlar o segmento superior horizontal.
    Na face norte, o quarto da esquerda (entrada, com largura de 1 bit)
    Serve para controlar o segmento superior vertical no lado direito.
    Na face sul, primeiro da esquerda (entrada, com largura de 1 bit)
    Serve para controlar o segmento menor vertical do lado esquerdo.
    Na face sul, de segunda à esquerda (entrada, com largura de 1 bit)
    Serve para controlar o segmento horizontal inferior.
    Na face sul, o terceiro da esquerda (entrada, com largura de 1 bit)
    Serve para controlar o segmento menor vertical do lado direito.
    Na face sul, a quarta da esquerda (entrada, com largura de 1 bit)
    Serve para controlar o ponto decimal.

    Atributos

    Cor Se Ligado
    Cor com a qual desenhar os segmentos do display e do ponto decimal quando eles estiverem ligados.
    Cor Se Desligado
    Cor com a qual desenhar os segmentos do display e do ponto decimal quando elas estiverem desligados.
    Cor de Fundo
    Cor com a qual desenhar o fundo de tela (transparente por padrão).
    Ativado em alto?
    Se sim, então os segmentos se acenderão se a entrada correspondente for 1. Se não, eles acenderão somente quando a entrada correspondente for 0.

    Comportamento da ferramenta Testar

    Nenhum.

    Comportamento da ferramenta Texto

    Nenhum.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/index.html0000644000175000017500000002634211541757142020162 0ustar vincentvincent Referências para bibliotecas

    Referências para bibliotecas

    Uma biblioteca do Logisim possui um conjunto de ferramentas que lhe permitirá interagir com um circuito clicando-o e arrastando-o com o mouse na área de desenho. Na maioria das vezes, uma ferramenta tem por função adicionar componentes de um determinado tipo em um circuito, mas algumas das ferramentas mais importantes, como a Testar e a Selecionar permitem que você interaja com componentes de outras maneiras.

    Todas as ferramentas incluídas nas bibliotecas predefinidas do Logisim's serão documentadas nessas referências.

    Biblioteca Base
    Ferramenta Testar
    Ferramenta Editar
    Ferramenta Selecionar
    Ferramenta Conectar
    Ferramenta Texto
    Ferramenta Menu
    Distribuidor
    Pino
    Túnel
    Resistor
    Ponta de prova
    Clock
    Extensor de bits
    Rótulo

    Biblioteca de portas
    Constante

    Porta NOT
    Buffer

    Portas AND/OR/NAND/NOR

    Portas XOR/XNOR/Paridade ímpar/Paridade par
    Buffer/Inversor controlados

    Biblioteca Plexers
    Multiplexadores
    Demultiplexadores
    Decodificador
    Codificador de prioridades
    Seletor de bits

    Biblioteca aritmética
    Somador
    Subtrator
    Multiplicador
    Divisor
    Negador
    Comparador
    Deslocador
    Contador de bits
    Procurador de bits

    Biblioteca de memória
    Flip-Flops D/T/J-K/S-R
    Registrador
    Contador
    Registrador de deslocamento
    Gerador aleatório
    RAM
    ROM

    Biblioteca de entrada/saída
    Botão
    Joystick
    Teclado
    LED
    Display de 7-segmentos
    Display hexadecimal
    Matriz de LED
    TTY

    Biblioteca legada
    Flip-Flop D/J-K do Logisim 1.0
    Registrador de 8-bits do Logisim 1.0
    logisim-2.7.1/doc/pt/html/libs/images/0000755000175000017500000000000011541757142017423 5ustar vincentvincentlogisim-2.7.1/doc/pt/html/libs/images/xor.png0000644000175000017500000000515211541757142020744 0ustar vincentvincentPNG  IHDRyt^sRGBPLTE++>\\y**LbKGDH pHYs(`?8tIME00 mң IDATxwzK%1kLbz k'9vmmtuz?1A T=R1?OBYlq{@ a/:hD$:Us`1Wz[Wu=AsWM +=Ywu6~! [=U5 \:џj9a9rx,۴1oaZ=7",O"GaZoA.:R4 *G/x} :Cij2 V)*M=B˱ӍN9ql$- kҷIh:K]5~SgF尾w0j']e  &FPa@GmIOhY@^crF 좷vI^3=B0 U]BaPtXnPSjQ }uCUIB[CѣFSO&] Ozr&1m=!@QtD;Zr)*-y&gze Ġˏ~ dg x:Hc6$~-2Wf+y +}o}wIA/4qO&}{)o&}O>DvN>Զo]mlݨg#|)9͂Qz&b31k@o^(8h) - 5i dN C&^}Q p͇h'>gfI_;'Rnߌk&J'GYco,Iz'ΨvCkS8$}1ңh_ GY;R`]htWhOl@ݤR ],AҁO!x!D?^.HK??#m],;6{2d?Ӿ/ɺX ?';dו CDi{7=޴|8&Uū+ӂ##}t zG*bnOd])myFX֓]=\ >3½u)uIOe1TIZŞ ͿRWxđHAs+Tity %4%X2 Kd?X D;fWBmn󘄹A:mYXru-#o? t!3jJڠ39_!]GS/׵Um1Ц]R?ݴvϘ#9솹I JwE{0{릥qirib[uGbJKZcMJUGXCW7qnP@^ԱV,ͮ*~-nX[YtZp#v(Ëp&9gIu7[$'_X<ڨВm.O.mەJϕ~ۼuֵ9$歳E!DإYqnGQ'&Eq.K{`| &2<_I֑>(ZaP GeC^S}>g+wui-mOd3p\.i9@fGxOmes?۸3pT |z–,"'2X{~\+49dg/ +ëkso@e~[% )y{dYQ5=AFn~GS&ƥwp]jv+$jR;x,zwtn=Ͷt?wXeRBX;V WED"Ld8}SwFd+G`Pd _gSZh[]+]8SLx$z|T z*wbb9SZbh~-p$BD5\Orv?u%Gb%G*j;6{RxvBٽW~c< hꋱ2pQWBZ 4lT&)|Gc:;#ѫ2ǧ/m"{f}T'Donk,OG!_uu^W+5^c5^9ڨK;OU1RIENDB`logisim-2.7.1/doc/pt/html/libs/images/tunnel.png0000644000175000017500000000220211541757142021432 0ustar vincentvincentPNG  IHDRZ!%wsRGB0PLTE')'$#?@D]]npm{}zy[bKGDH pHYs  tIME&,}tEXtCommentCreated with GIMPWIDATh횿n1Cj"Őf@$"Tҁ / iH .2 e- k-o_|U9Iܕ<عC`lDpJp7 -fp8gpDYO~dV` 㫈;fʪ_.UuSƫtZu팗KT,^k9X ,Tsد6 S~1[t9{62eFRg,Km.MS|R ,mBb;2۸O8Q=RWSoq؟~d+'=[ƽoT8vP7T-BQ0mXT:Ek]**nd~1{ 8C/T(˨'¶E۸iIN4eq^EtFkÔH=Kfʬv@AÖl"t sE VYY@+jpҕM@I)bɴt,]DHuq͌X8wP8˛ZӕMġbUلl!EGa?}hبcE]s%ٴ+cqN*!j-'B$L,J#;[wq7,̒[k`S9nxP;TjtgMV\;9).ڝv'TPbNfOч0IENDB`logisim-2.7.1/doc/pt/html/libs/images/tunnel-demo.png0000644000175000017500000000233511541757142022363 0ustar vincentvincentPNG  IHDRVqdsRGB0PLTE4131JEFDgkmj`bzz%NabKGDH pHYs  tIME,`$tEXtCommentCreated with GIMPWIDAThMhA1kA*5 @A&4੐ɥCNКCॄ =UPa9H=X7n:lvRBvgov͛7CK]*З lI 饪0`)NI_fV4+raN9Isy0{. $ɉ)^ H ֲ3< :b$'E!/}=䁉Ӗ e[B #wq `$ 7=ـ+L^#t`<OuU 4&%E=ǡn(9JVK$U]ӳpI(@wgLdkƸC181%Ɯ BIqc`>kYS-qa<֚&0\0?f]b31'`hj9zbb7u ؓ}0Y<˔7#]ՙ5!{cHn͒KpT ^QGJȿ$|1rL/0jLZ!a, ٟyb04[hcrŰRtL͛ʉFqLOPȸl{ѲAh:̊`z\\3ˊwLc["oVEÊt809phJNi2Λr\lo%iX7ɠ:_!ɽnEĴ|=BLS㶛EAӢ.c1e b)i8`Tj"Gh;$>.1v.2&WŔSFџ@ ]cVWvI+4zAy<̉tmVt>|āiI 9:&1sn臨|Ԝ%_7f!^vM+'WK RԂ cͼ0N1&tCd%3>absCH]̮vg+=1X PA Gġޝ3='1  J iI;vF_JQ}>}¤ʾp~>e|]ZUm{~&@ޚ('072a(>m#ot+x-x85C qr<29_ fJeQZ*yo7/aO6æE2 cȡ,͗q\L׳L0zF!ogoD9GQ`Zꑵl1-ۤ îWSژRXb7348Z@6uԣ!fiSV[뇘ȍH.[v<7ȥ?o.r3U]9r%m`iz[ܘ5B FUYzC6|8uuGVoڞuAvp_8WߴIENDB`logisim-2.7.1/doc/pt/html/libs/images/subtractor.png0000644000175000017500000000060611541757142022323 0ustar vincentvincentPNG  IHDR,-'sRGBPLTE9=T<>ÿQbKGDH pHYs*b@tIME"IIDAT8˵M 0F#] @5jHVqI4&v%}$J92Wi:ǘtmw8vzRb__bfC{CȄ͵TM1ᄘCe1WnbPô{X {n jQd&!! f[l,{vbޡQҔ٣w[;"x%fNbҷЮ~`a@gP(0Q`"E Ń<"2@*U *<^Nxӣ Q4;ö8(IENDB`logisim-2.7.1/doc/pt/html/libs/images/shiftreg.png0000644000175000017500000000057311541757142021751 0ustar vincentvincentPNG  IHDRh,{sRGB0PLTEb;+-*%#Q"[]ZKBI*} pHYs  tIME-IDATH1 1ELTDOJpt mNa-;ShLFu$?in!83M5IRqqCJ";t Is|=Y`U5B9N}ibL_Z{X?`F $ N#`H=RYK$2$9AX$ay]";sCX9#KBx8a"IENDB`logisim-2.7.1/doc/pt/html/libs/images/shifter.png0000644000175000017500000000040311541757142021572 0ustar vincentvincentPNG  IHDR,*:/sRGB0PLTEb;+-*%#Q"[]ZKBI*} pHYs  tIME. LYIDAT(c3> & ؅'0`f.|ws0?Va>08 cU}D.AEb\rK| 8(IENDB`logisim-2.7.1/doc/pt/html/libs/images/selector.png0000644000175000017500000000061211541757142021750 0ustar vincentvincentPNG  IHDR"!Nd_sRGBPLTE.0-4-VXUŗbKGDH pHYsutIME=IDAT(]0VZwa{n1W˖} 6̼1։H>gtG౑BLXoIhE_9 D%EBB!˭ YN|ŝad7O{$]C#-Ҟ\aݛj1Jȓջ>`C$-jQxʪI\{8TE>ԫ́ohp30CǺXcIENDB`logisim-2.7.1/doc/pt/html/libs/images/rom.png0000644000175000017500000000125411541757142020730 0ustar vincentvincentPNG  IHDRTpsRGB0PLTEx=241&'THJGjli zJEѯx pHYs  tIME Um.IDATXj1=m PX(TBxۀȾV(P^z+=5ٝQ{lTc'&FD=:09$xq)A))lH1 +n[$ G eFvPȑ9H4 +RHQȕ-iBG!k +D@pdǻZN$oW*h*;-rduR2`\ HNd)h5 \%pd$]DZ*RQ #K%‘YR5HEO mWɤ(\7CwD zWqAL8Jkפ`٭j>[Tsji=3-WԠ󓫜HeU*$<[eَE >nN%O$PW'E2 笲 ̽bQN*'>W$3iBY2a!uA<#u3Bi>]UykF(ryqFȋnߛ3xs}a$ }=JPIENDB`logisim-2.7.1/doc/pt/html/libs/images/register.png0000644000175000017500000000066411541757142021763 0ustar vincentvincentPNG  IHDR#+,sRGB0PLTEx=241&'THJGjli zJEѯx pHYs  tIME]` IDAT(Ͻn0 -:'u oӡ:䶋ԁWaxwOp E1P֪clT\RG?S ]VQgh RPtmXgQl٤G!Ǫ<9RI zBx.)g/XHJ1U?A-.UDwhGKw>QN ]U"Uoٓ٦K޲M0 !#k W[7դr;*G([8 ~nnį ss~r_H))SIENDB`logisim-2.7.1/doc/pt/html/libs/images/random.png0000644000175000017500000000061411541757142021412 0ustar vincentvincentPNG  IHDR",cwsRGB0PLTEb;+-*%#Q"[]ZKBI*} pHYs  tIME IDAT(ϭ0O UӼf AցE){L#%mrkW0 ٯ//9xJ!1T#$P3]!Z5ӈB4vI~zoaHPɹ&'imj !ΰJkn!UQN>'&ۆIBrNvhG:Kt?;%LJyYr϶uD;KA~]7'=i}dIENDB`logisim-2.7.1/doc/pt/html/libs/images/ramdemo.png0000644000175000017500000000535411541757142021564 0ustar vincentvincentPNG  IHDRvsRGB0PLTE.0-BP3,<>;HJGbda9w:{{bKGDH pHYs   HIDATxAhFѳm.Ƃ䲧n\|X =eK !=0l!!bPjB@nY%捳00f$-+~H#Qy3C@6Rm!U-TdfX ÷tVI"UVB>BZHO@L2ʪ (WSM~(S,.3keM?Md@>I[}|y ?ÊL_}eĔ|S䏠MakDNa(w YT0\\ٟV%',CT[wJ !q peB~3 Fi<4"J} CʄܑLD|9`XL {lͲYOR61Xwk}(25#(c5Xir82 J|ћ>I\A "#Jwv- HNݴSYx5L4DqX_5vd.-s{8+^uWD[* 0r(=/:rOY8P 8Q֏J(pܼF=qM&]G{%(G[܏B/u@NsW(x\D D`c">`^nrfc%b'K6B(^]dvF(8ʍ~@MsQhhZ: |Eo̞zl[E˴ C M"?"%`2qPOYvBliM Mc2!f Fo"~%ci[0m@.yNɒcUDbmXprs~ D0LpRIա S uwh@K2@PsRmjPsi HsO Hϕ9[Ԯm՛.=rn`m\3_z!46}9 !)PWބS n 8@+ѸL'ǯ>PC&Pfйrͭ:%2CI/;:/NAܖP #\;uvYs+wŢ]D rw`- pv]Y8i[N+>NoI@{bjȢxsk(^8j6hW3ύrXCMh PNL6K/fB qb/@1aX$QڨlÄ2.V 8~Ή='^9j߉o$i@w~7ˍXhZ;=H`063h'6L5mK "a0ĺ7giܘ`8ftU.lIY;5؃&(Zh' b@Հmg ؆` =O6 e]:=л&Tۀ0h,/=ZQzm-vkSR30sWRyߍӇ~fgwp_#_.|MYvra/>|kt@e fB>@ 43@SvtJ>|p `SH9 ;9>3mJNgElg̫*5e}N{җ"&@yډbTܓOw'0#c\& `JMkrr9PF0Kr Rzqos-I7 %Z!Ƥge'V@Q`ˍ:IlD/} =EXob@b&W|̛*]"W15]sJ`BwD<3u POu‰@[8q;kz Q>m rB?P!Dtd-:ͨ eN /a`BFmMv{,}{JBcܦuoJqF#pp$ w_?G&n݁mMիq5@[#i8@!g=u=|O4c~QL!)>+,l-xuHT\ה[3U<0;X(h"=2E1Sf&:NۂfK55f lq1A'+7t gpR3y^'>[Jyi3xD\v'+55fggI>Ke xT=p,dHf^N_`mPWhLJ( ?٤j)rj*+43ml4飝kB gHWh%|I}AvAu^߮XHUʼ=+4v\6oYg鰢Ye^ٽCo9>YdIЪFRȽ HՃc\Tm*[:_`? 򂌍 q;xqEJ MmQVZJ͉CV5; -+M.G`1ɏ=<+{>!~iΕjj|'`V IENDB`logisim-2.7.1/doc/pt/html/libs/images/pull-rect.png0000644000175000017500000000044711541757142022045 0ustar vincentvincentPNG  IHDR(dysRGBPLTEE?A?"h"~}A6GbKGDH pHYs  tIME$3̓tEXtCommentCreated with GIMPWcIDATc(///G `2 2 \! y ea 3QQ 1UQ, 2Ý 1|q'6R\\I~PIENDB`logisim-2.7.1/doc/pt/html/libs/images/probe.png0000644000175000017500000000064311541757142021243 0ustar vincentvincentPNG  IHDR'4<3sRGBPLTEVbKGDH pHYs*b@tIME!?mIDAT8͒=k0/pDA{:t5{tmWEut?''ˁrWVjGS {~6C"Xu;)ndoԛ)!au6%t* 5ZpxǿJXrF K^Uw: k;NA8yV52`%@Z^iuvwW&+IENDB`logisim-2.7.1/doc/pt/html/libs/images/priencod.png0000644000175000017500000000063111541757142021734 0ustar vincentvincentPNG  IHDR,_a8]sRGB0PLTEb;+-*%#Q"[]ZKBI*} pHYs  tIMEWIDATHc# ` kɏ$ Eܐ@{¡؅aC8H}Mxk(VPO"H8KT0/9//pr;0O 3_0Ldxa{/%}<ӒZ Hу<Ŏh_nDGfqPU*{FÙ{`|_IENDB`logisim-2.7.1/doc/pt/html/libs/images/pin.png0000644000175000017500000000052311541757142020717 0ustar vincentvincentPNG  IHDRe3. PLTEP pHYs*b@IDATxA 1YG(9Ŵ'0/JbKGDH pHYs)aC$tIME,)q'>IDATHr0W䫡|Nb]))WI⫧@t ־~Wm $#I]iw \F4AԢ@YruΤ.^LWtB-山XӸ ״`A/OiK`cj՛+1yMØ `!CܲC]hOOzgR$6-q35=(i\.{Ym{xRV CCʂ:wmaBArTG9}A6`(C+b*P'JqN-4Vd}48ϝ:GuLwXo}N)T9?W%/~OZbЛ5'I=6-'kAgrگM/*z ?5vzrvմah8L3&^̰+}C3:F'D!EAHOJ7Jљ\pCC\\W& U?{]ԵE㔎|pK66Ut+_ XzQ љt6v*ϭdfb84t@Bi_h^Yask{dnG0ȼǮuK(nQ$Jѳ>b67GQ@no13=> 9WLwFv~lW/m &^b>;_ctw;Oeoӫ7즟^ZUrQ}EI}_w\uh&2CIENDB`logisim-2.7.1/doc/pt/html/libs/images/negator.png0000644000175000017500000000037711541757142021577 0ustar vincentvincentPNG  IHDR,+wsRGBPLTE<iIDAT(cpRT&L @a 0*LoaFLaFga ՊN* f agf.140&, Sx4.qi%\ Po78IENDB`logisim-2.7.1/doc/pt/html/libs/images/mux.png0000644000175000017500000000073611541757142020750 0ustar vincentvincentPNG  IHDR,?i7sRGBPLTE B9=T:<ÿI2bKGDH pHYs*b@tIME3"?IDAT8˭A IvQ X4FPo(RwLa1(<`#2H 9X'Fg~?*gߟmQӧp '>a4wxIxc@, R~JcJ+P$]Q-8M'EO&ޟ%ߟfaȑ6|T i9yޜasnUEnܝ  @ RM%y63 yv Wr9IENDB`logisim-2.7.1/doc/pt/html/libs/images/legacy-flipflops.png0000644000175000017500000000070511541757142023373 0ustar vincentvincentPNG  IHDRT!sRGBPLTE B3J?:<CAW8bKGDH pHYs*b@tIME& ~ &IDAT8ˍQj E #BV_S*dI_KsaFp\P$@Q^w=5,juUx+lijTb)TZlϏC]|L9x ۑf@L@ZV{wŪPh RU%-dyxX %DTxT;4+}N<ꋪU+'T)V-}kS @]SnYQ!*6K-e%KSLXYf/qDYIENDB`logisim-2.7.1/doc/pt/html/libs/images/led.png0000644000175000017500000000051511541757142020676 0ustar vincentvincentPNG  IHDReksRGBPLTE<GI6~ k\KbKGDH pHYs&a tIME'/Q~PtEXtCommentCreated with The GIMPd%nIDATU 0 ߕѫ=î*yvK[[#Mª1FM06LXIƪ5{0jl˩P{zn|H;\'PIo;W^P6IENDB`logisim-2.7.1/doc/pt/html/libs/images/label.png0000644000175000017500000000045611541757142021215 0ustar vincentvincentPNG  IHDR; -;sRGBPLTE<`FIENDB`logisim-2.7.1/doc/pt/html/libs/images/keyboard.png0000644000175000017500000000053711541757142021736 0ustar vincentvincentPNG  IHDRfSsRGB3PLTE ^7342O<>;;7higdtRNS@fbKGDH pHYs  tIMEV:IDATX׽0 v̏va(OJ"ى ae@D厺 DSGuԣQUThCP]DŽr8%!QX[hCD96s%"gUv[etP_PWV`,\+poXbIENDB`logisim-2.7.1/doc/pt/html/libs/images/joystick.png0000644000175000017500000000046311541757142021773 0ustar vincentvincentPNG  IHDR!sRGBPLTE .*&VWUq>tRNS@fbKGDH pHYs  tIME %q"IDAT(c`h6V$`aDQFBAB>"E LW9"..("*..("." 5栙\&QApZar|cMD& &YIENDB`logisim-2.7.1/doc/pt/html/libs/images/hexdig.png0000644000175000017500000000044211541757142021401 0ustar vincentvincentPNG  IHDR*?dG@sRGBPLTE '(&&!GHI1]tRNS@fbKGDH pHYs  tIME usIDAT8c u`#ZD]\%.DBK۠m/ܢx+/GWCc! 䔗W`EI #b@A)'a$ c("INIENDB`logisim-2.7.1/doc/pt/html/libs/images/flipflops.png0000644000175000017500000000154711541757142022136 0ustar vincentvincentPNG  IHDR+|sRGB0PLTEx=241&'THJGjli zJEѯx pHYs  tIME 7]IDATX1k@\/:t/urMk M)@-SP,=*E'ݓZATzNOҽ{Yζ V>"/^]*rcrD?cd.Ջh&7a,cZK ۤ5c* ;.Mm?[aSnf9>JF^!cپ*qcL 1Cw/24ʫ)?9$f {-LQlAIY XYG~KhZ 1AXJ9gV7;Ư̄S꯮o/ YwB3d-@SOޘ3F 3RޛsTg"T66֘OWMgQG=VTbi8#q}QCTJOig[Ui8<ѮQ:="*]r9bC5>{*CKB].Ո I9ͯJ? BKv%NmKT2ƀp|%#_8Ićƨ/IjCɉ;U\Zz 46λ[ΨR'<QGEQ00=bpgR *$u03«9aq;tvsF@bKGDH pHYs  tIME)|DtEXtCommentCreated with GIMPWIDAT(œn0ρ+,/T+"2x5^?GCU XY ŠW= aCJa{ HX5 lE@+Fk -J*J(!h?jJJq;{3%j" ;Ku&$~H k?nkRrNӝ3%IPݜCoN{@* 9P߲u_l]%OERғUg(`p/g 98IENDB`logisim-2.7.1/doc/pt/html/libs/images/dotmat.png0000644000175000017500000000042111541757142021416 0ustar vincentvincentPNG  IHDR4IsRGBPLTE%F1DD7A?A>Y[X+x- 6ktRNS@fbKGDH pHYs  tIME'FbIDAT8c IA*\QYP) hqKJD)h"Fƨ{9Y%å )%A!%%%AAto (J@ @VIENDB`logisim-2.7.1/doc/pt/html/libs/images/divider.png0000644000175000017500000000063111541757142021557 0ustar vincentvincentPNG  IHDR,-'sRGBPLTE9=T\_ÿlYbKGDH pHYs*b@tIME3xjIDAT8œ]0 G|#x]@=&{%)]o˜Qa嗮#UTxgՠګa{xgkXccƚ5[ɣ@p&\Q ʵe'+vc+X^h.qj*3ق Q"\*o!ΐ Rx?#B$+By/>UlyW=,r FsWjwqw7ucw*aMK\ꤳ+IENDB`logisim-2.7.1/doc/pt/html/libs/images/demux.png0000644000175000017500000000075111541757142021256 0ustar vincentvincentPNG  IHDR,?i7sRGBPLTE B9=T:<ÿI2bKGDH pHYs*b@tIMEngnJIDAT8˭ϊ0 Jk+>/ kvBJ{MEN*!QUT Ls&-c`1{=23U:9h>:jg;)’]q(xmq/L=su)uu[.|7)T1# K4ɶXyBSƪm\t_!e c-- )uy"4vmZˡ@Z(FL D <ơuwIEqw'Vpb3<|}.OU!I`oYH$:>yٻRפ\Ejv _IENDB`logisim-2.7.1/doc/pt/html/libs/images/decoder.png0000644000175000017500000000072711541757142021544 0ustar vincentvincentPNG  IHDR+?4,~sRGBPLTE B9=T:<ÿ&bKGDH pHYs*b@tIMEϮ8IDAT8˭n `"oUr*Vho^Qϐ@{ISd`, XaTrT¨'ar{j ޴zpInKLB%Sj"L5Thț**t<*9R# ) \pmBprҚͺZhl}Iaɏ"/9kՀ5k:JK7^U]|; رǎ c[Ox>3.fO?Tg^u '9Uљ\ةeX9;IENDB`logisim-2.7.1/doc/pt/html/libs/images/counter.png0000644000175000017500000000073211541757142021612 0ustar vincentvincentPNG  IHDR",cwsRGB0PLTEb;+-*%#Q"[]ZKBI*} pHYs  tIME* \b0IDAT(ϭn! :pÉs^&C;ebX)ϑ!czC䧸%ÉG(nUb.$*ղ0|2׶!\#kSPo2m YU IQAVsf,:]_J?2blK>8g'T:}Ŝ NCץVܒAep V\ bBԃi*H#ȧxB3?~ ~'jVymIENDB`logisim-2.7.1/doc/pt/html/libs/images/controlled.png0000644000175000017500000000056111541757142022300 0ustar vincentvincentPNG  IHDRJzsRGBPLTE B9=T)22bKGDH pHYs*b@tIME(IDAT(ϵ0Lځ4h̆A ^K:BPM,؂3K1@ fWXbNJl})BKl,18sRb6a u,>FfdoxG+1qqM,qO3zt#6ʆNkU 42Gԃ6r `3K1P4Ҡ6e}eM,&kgIENDB`logisim-2.7.1/doc/pt/html/libs/images/constant.png0000644000175000017500000000030211541757142021755 0ustar vincentvincentPNG  IHDRwsRGB PLTEBBNTbKGDH pHYs*b@tIME!8\/IDATcXJ09L@0ɀ`,`X$ fi ǔ1Y1IENDB`logisim-2.7.1/doc/pt/html/libs/images/comparator.png0000644000175000017500000000046611541757142022306 0ustar vincentvincentPNG  IHDR,+wsRGBPLTE B+9=T\_k֋bKGDH pHYs*b@tIME)<IDAT(͓!0 E,#b,f> T ^^Ja'05J. QdcK=Ȝ>Cox;;]_N=Jb{p[`n% 2I;f,[2I 1di%+--Spy78{Qpi.BmrgIENDB`logisim-2.7.1/doc/pt/html/libs/images/clock.png0000644000175000017500000000036211541757142021225 0ustar vincentvincentPNG  IHDRɓsRGBPLTE BNB~BbKGDH pHYs*b@tIME6:VIDATcpA$%@4 8G P$18N$+)92ii =``-qP8ŧa:'IuNIENDB`logisim-2.7.1/doc/pt/html/libs/images/button.png0000644000175000017500000000042511541757142021445 0ustar vincentvincentPNG  IHDR_hsRGBPLTE 1%ٵc}bKGDH pHYs&a tIME'귆tEXtCommentCreated with The GIMPd%nMIDATc`r(`E#qّ8pđ8AJ 1,S '4 Rf')c/qRz IENDB`logisim-2.7.1/doc/pt/html/libs/images/buffer.png0000644000175000017500000000041411541757142021401 0ustar vincentvincentPNG  IHDR5VqsRGBPLTEi+ABJe\bKGDH pHYs*b@tIME_5zmIDATM EbGh DL@Pj=[`pp=Tځҥ7l;.R@MZ5V)u`7%f9{Ftk+rIENDB`logisim-2.7.1/doc/pt/html/libs/images/bitfindr.png0000644000175000017500000000054111541757142021732 0ustar vincentvincentPNG  IHDR,+wsRGBPLTE''*%}kmj {}zub|tRNS@fbKGDH pHYs  IDAT(Ͻӻ0:[B F;]abm8D6_;Y@Vz[V6m3|ccv+< (3]FX q׊1$nr lK!xU xzkٻ;yڽu(+8Kk_5l?l?zI'=)(To{R$~IAWkS(P훻2bC>B`PcZ0va'Ġ)T_kZ@Mb/6kUAK ƾ/q1@McΪ6=o]fȾ^E͠sRQ=j"{V6ѻl? Рrm AA&ȵx\p6RP)rm ~ՓBMkcCFLPvީOމ*3һc#ޮmGQ~  fdaCw@RQ%mثPi՞YKC %$1RJ{CkK (Kb,+ų? |=SyIsGy\t W*DČ̊=<2ʒ2H_eO_?HdRy\iW^D+XHdEZ-G%+/y%xڞg Idlwm{U #uUmOu/_9Vaao9_>ӷLX"Zރ(dfbV V=P ~N8_ξA~LYm}1 E<ߊҞnλlĺBBlU;(~cKSEqYXgiƾj({L@8s=YsNdgFkODE25ڬ{mŚ[Z 5պ6klQO7]icOAQj'V~sfћBMM]A!r/-Yj b/KG\1IC##QG!%&;tƾH-@0CA&o$RZ'~0 j=V"-HAAȵ~3bIA&ȵa >APP|Ckˤ)(^ꢭ6!oP0qsCAƞ4tw.m/+5}מLSPDl?!rM9ϩ\dLd*/Lٳ+wT\_oeD[ @WPWڈGQY~wBi: #}(L\iGP01gK3۟-̘#Ggir2 j}ߩݿ j}[MoVIƴ7{>W 5&צv&RV 5*& AEs~\;0#Z9&#|f{fF%[7 ΏKsHL6uo5ɏU?/5y>Q {b&,ܞ{rZ΁ؕ8a2 1%k3ʣ^OmOyL]\rF| Ya{}tc>XGrY0& {g0/y[NvOrtٯ|aLe$%A̫V_a8Bܥ./ ? ;^z  ݹ8y2wwKpqY+(Fy@/[ cgo>^mEwd'0%w{y{C~{/a];~g9ιvε}q>FsiEIENDB`logisim-2.7.1/doc/pt/html/libs/images/basegate.png0000644000175000017500000000467511541757142021720 0ustar vincentvincentPNG  IHDR&z_sRGB`PLTE+ u>Pd&(&241/$;,DA?LH35GIqsp~}}̗]ro pHYs  tIME  ;1)utEXtCommentCreated with GIMPWIDATxz8դbD6PGrmlH0!W4^5rT/GơIl*Im5eL0Uڦ0;Ol, æ`k p& uvkO߱l`6Ml?tBp6QXTo_)AA5ԀBaSM6VUwMg:Ѵð&^69h\tTT6J{I"aXTEz P }ٽW?q0U˦)MP,@*M#[.ߧHEinxe0æ>*t(ǦA﹏[MQǦa쓴DZ)K;o}톛{]T*񘼪q M88LEMѪ֛wwE<LF`2,(*M}MQ,(*Mm8$QȂdC͛G(RqmCb&P'\z\"C4|`TƧ"=J/x)O?޼k_i*ޖzڟwsWYmjTR)DgOJ_1Sx_KNyUc-jzn?ÙDez7)0Y6pw&o/@iZ'+h@X,57*չU4JkN}+zكrMSs bpcS綨/aXT`9ڃaSR~!yH C ˗3sV~93EŲ`q5XpTe SBcQ wm^GEEE##,@*M `ۙ( 5GKTw/bNVXT%w[J:LEJnP,TkK1,`*B Or6VUy *{79ġ@l2{aP3o"o}`rf[)9P,X,<XT%Zl&Il&Il&IIl&Ild,,Ԥ՛mRyE*XM-`N6V[`6=@N"\ߴټդK7C@W&u] LMp#Ѷ7XTCJ|*\cmK 躮eU3JX[BeRm2m'jȂԙީ2:B,XMt*\/ʂ!7oTlGF* ȂJpcg3ϸwOI4,pD 'դ֓HDTzIl<0`~zwbӛ:һw'§7Cqsz<`T&*/t޽&w]=v zB]"i|ޝIw'6 7oj\ XK)n7kdr0U|̯Ta[`ā"^&:-Tz ,R V/aQ-bI*Xm*n|DKmb Չ)뤆+饶*=~^vRDS^rk Pi^jRw*>&)Ġkz77zG켋QK,{ #MgNz1s: VOR8mPJMmEO/? > ~h-]LK%Tz[jJ')6qj*Rmjun7TRTz*uT./22U,`*Oor%Nm2p1 T)|,̻`tU%DjR}zc;ȘzTz/t,I酎X5`d$6Mb_{tT7IENDB`logisim-2.7.1/doc/pt/html/libs/images/adder.png0000644000175000017500000000062011541757142021206 0ustar vincentvincentPNG  IHDR,-'sRGBPLTE9=T>@ÿqE}bKGDH pHYs*b@tIMElW8IDAT8˭0 gKT?x=o+# rI}7pFnc  UI†ͪK'Xe<~:3wuJ-Hw{oRFX#5m&> zJZtJSBU\i[ 6[K̦ftyIENDB`logisim-2.7.1/doc/pt/html/libs/images/7seg.png0000644000175000017500000000047211541757142021001 0ustar vincentvincentPNG  IHDR*@TsRGB0PLTE(Qm?@~CA}ӿ_nbKGDH pHYs&a tIME&G"IDAT8ce4 !c emR`bD߽C~q' gTB}4{ oS\ⱈcp(y%E$`, $6Q"BȄި+RIENDB`logisim-2.7.1/doc/pt/html/libs/gates/0000755000175000017500000000000011541757142017261 5ustar vincentvincentlogisim-2.7.1/doc/pt/html/libs/gates/xor.html0000644000175000017500000001770211541757142020766 0ustar vincentvincent Portas XOR/XNOR/Paridade Ímpar/Paridade Par

    Portas XOR/XNOR/Paridade Ímpar/Paridade Par

    Biblioteca: Base
    Introdução: 2.0 Beta 1 para XOR/Paridade Ímpar/Par; 2.0 Beta 6 para XNOR
    Aparência:

    Comportamento

    Portas XOR/XNOR/Paridade Ímpar/Paridade Par servem para calcular as respectivas funções das entradas, e emitir o resultado à saída.

    Por padrão, todos as entradas que não estiverem conectadas serão consideradas desligadas e, portanto, ignoradas - isso é, se a entrada realmente não tiver algo ligado a ela, nem mesmo um fio. Dessa forma, você poderá inserir um porta com 5 entradas, mas se conectar somente duas entradas, ele irá funcionar como uma porta de 2 entradas; isso irá aliviá-lo do trabalho de ter de se preocupar com a configuração do número de entradas cada vez que você criar uma porta. (Se todas as entradas estiverem desconectadas, a saída será o valor de erro X.) Alguns usuários, no entanto, preferem que o Logisim insista que todas as entradas devam estar ligado, pois isso corresponde melhor às portas do mundo real. Você poderá permitir esse comportamento, se usar em Projeto > Opções ... na guia Simulação, o item de menu Erro para entradas indefinidas para Saída de Porta Quando Indefinida.

    A tabela-verdade para portas com duas entradas é a que se segue.

    xyXOR XNOROddEven
    00 01 01
    01 10 10
    10 10 10
    11 01 01

    Como você pode ver, a porta Paridade Ímpar e o porta XOR se comportam de forma idêntica com duas entradas, da mesma forma, o fazem as portas Paridade Par e XNOR. Mas, se houver mais de duas entradas especificadas, a porta XOR emitirá 1 apenas quando houver exatamente uma entrada igual a 1, enquanto a porta Paridade Ímpar irá emitir 1 apenas se houver um número ímpar de entradas iguais a 1. O porta XNOR irá emitir 1 só quando não houver exatamente uma entrada igual a 1, enquanto a porta Paridade Par irá emitir 1 se houver uma quantidade par de entradas iguais a 1. As portas XOR e XNOR incluem um atributo chamado Comportamento para Entradas Múltiplas que lhes permite serem configuradas para usar o comportamento das portas Paridade Ímpar e até mesmo o da Paridade Par.

    Se alguma entrada for um valor de erro (por exemplo, se os valores estiverem entrando em conflito em uma mesma conexão) ou flutuante, a saída também o será.

    As versões multibit de cada porta executarão a mesma operação descrita acima bit a bit sobre suas entradas.

    Nota: Muitas autoridades alegam que a porta XOR convencional deve ter comportamento equivalente ao da Paridade Ímpar, mas não há não um acordo sobre isso. O comportamento padrão do Logisim para as portas XOR é baseado no padrão IEEE 91. É também coerente significado intuitivo subjacente ao termo ou exclusivo : um garçom perguntando se você quer um prato de purê de batatas, cenouras, ervilhas, ou couve-flor só aceitará uma escolha, e não três, independentemente do que algumas autoridades possam dizer. (Devo admitir, porém, que eu não sujeitei essa declaração a um teste rigoroso.) Você poderá configurar as portas XOR e XNOR para usar a paridade, alterando o seu atributo ao Comportamento para Entradas Múltiplas .

    Pinos (supondo o component voltado para leste)

    Na face oeste (entradas, com largura em bits de acordo com o atributo Bits de Dados)

    As entradas para o componente. Haverá tantos delas quanto o especificado pelo atributo Número de Entradas.

    Observar que se você estiver usando portas convencionais, o lado oeste das portas XOR e XNOR será curvo. No entanto, os pinos de entrada estarão sobre uma linha. O Logisim irá traçar marcas curtas para indicar essas entradas; se você ultrapassar essas indicações, ele irá supor que a intenção seria apenas atingi-los. Em "Prévia da Impressão", essas marcas não serão desenhadas a menos que estejam conectados a fios.

    Na face leste (saída, com largura em bits de acordo com o atributo Bits de Dados)

    A porta de saída, cujo valor será calculado com base nos valores atuais das entradas conforme descrito acima.

    Atributos

    Quando o componente for selecionado ou estiver sendo acrescentado, os dígitos de '0 'a '9' poderão alterar o atributo Número de Entradas , Alt-0 até ALT-9 irão alterar o seu atributo Bits de Dados, e as teclas com setas poderão alterar o seu atributo Direção.

    Direção
    A direção do componente (a posição das saídas em relação às entradas).
    Bits de Dados
    A largura em bits das entradas e das saídas do componente.
    Tamanho da Porta
    Serve para determinar se é para desenhar uma versão maior ou menor do componente. Isso não afetará o número de entradas, o que será especificada pelo atributo Número de Entradas. No entanto, se o número de entradas for maior que 3 (para o formato menor) ou 5 (para o formato maior), então a porta será desenhada com "asas" para acomodar as entradas adicionais além daquelas normalmente oferecidas.
    Número de Entradas
    Serve para determinar quantos pinos o componente terá em sua face oeste.
    Rótulo
    O texto para o rótulo associado à porta.
    Fonte do Rótulo
    A fonte com a qual o rótulo será mostrado.
    Comportamento para Entradas Múltiplas (XOR e XNOR apenas)
    Quando houver três ou mais entradas, as saídas das portas XOR/XNOR serão baseadas se apenas uma entrada for igual a 1 (padrão), ou em um número ímpar de entradas forem iguais a 1.

    Comportamento da ferramenta Testar

    Nenhum.

    Comportamento da ferramenta Texto

    Permite que o rótulo associado à porta seja editado.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/gates/not.html0000644000175000017500000000534411541757142020755 0ustar vincentvincent Porta NOT

    Porta NOT

    Biblioteca: Base
    Introdução: 2.0 Beta 1
    Aparência:

    Comportamento

    A porta NOT emitirá o complemento de qualquer entrada que receba. A tabela-verdade para a porta NOT é a que se segue.

    xout
    01
    10

    Se alguma entrada não for especificada (ou seja, flutuante), então a saída também não será especificada - a menos que a opção "Saída de Porta Quando Indefinida" seja "Erro para Entradas Indefinidas", caso onde a saída será um valor de erro. Se a entrada for um valor de erro, a saída também o será.

    A porta NOT multibit executará a mesma operação descrita acima bit a bit sobre a sua entrada.

    Pinos (supondo o component voltado para leste)

    Na face oeste (entrada, com largura em bits de acordo com o atributo Bits de Dados)
    A entrada do componente.
    Na face leste (saída, com largura em bits de acordo com o atributo Bits de Dados)
    A saída, cujo valor será o complemento daquele à entrada.

    Atributos

    Quando o componente for selecionado ou estiver sendo acrescentado, Alt-0 até ALT-9 irão alterar o seu atributo Bits de Dados, e as teclas com setas poderão alterar o seu atributo Direção.

    Direção
    A direção do componente (a posição das saídas em relação às entradas).
    Bits de Dados
    A largura em bits da entrada e da saída do componente.
    Tamanho da Porta
    Serve para determinar se é para desenhar uma versão maior ou menor do componente.
    Rótulo
    O texto para o rótulo associado à porta.
    Fonte do Rótulo
    A fonte com a qual o rótulo será mostrado.

    Comportamento da ferramenta Testar

    Nenhum.

    Comportamento da ferramenta Texto

    Permite que o rótulo associado à porta seja editado.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/gates/index.html0000644000175000017500000000461311541757142021262 0ustar vincentvincent Biblioteca Portas

    Biblioteca Portas

    A biblioteca Portas inclui uma variedade de componentes simples, todos com uma saída cujo valor é ditado inteiramente pelas suas entradas correntes.

    Constante

    Porta NOT
    Buffer

    Portas AND/OR/NAND/NOR

    Portas XOR/XNOR/Paridade Ímpar/Paridade Par
    Buffer/Inversor Controlado

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/gates/controlled.html0000644000175000017500000001014111541757142022311 0ustar vincentvincent Buffer/Inversor Controlado

    Buffer/Inversor Controlado

    Biblioteca: Portas
    Introdução: 2.0 Beta 1
    Aparência:

    Comportamento

    O buffer e o inversor controlados, são muitas vezes chamados de buffers/inversores tri-state, cada um tem uma entrada para um bit de "controle". O valor desse pino afetará a forma como o componente se comportará:

    • Quando o valor nesse pino for 1, então o componente se comporta exatamente como o equivalente não controlado (um buffer ou um inversor (porta NOT)).
    • Quando o valor for 0 ou desconhecido (ou seja, flutuante), então o valor da saída componente também será flutuante.
    • Quando o valor for um valor de erro (e isso pode ocorrer caso dois valores conflitantes estejam alimentando a entrada), então a saída será um valor de erro.

    Um buffer controlado pode ser útil quando você tiver uma conexão (muitas vezes chamado de barramento (bus)), cujo valor deverá corresponder a saída de um dentre vários componentes. Ao se colocar um buffer controlado entre cada saída de componente e o barramento, você poderá controlar se uma a saída deverá alimentar o barramento, ou não.

    Pinos (supondo o componente voltado para leste, linha de controle à direita)

    Na face oeste (entrada, com largura em bits de acordo com o atributo Bits de Dados)
    A entrada do componente que será usada para calcular a saída se a entrada de controle for 1.
    Na face sul (entrada, com largura de 1 bit)
    Entrada de controle do componente.
    Na face leste (saída, com largura em bits de acordo com o atributo Bits de Dados)
    Saída do componente, a qual estará flutuando se a entrada de controle for 0 ou flutuante; ou igual ao o valor de erro, se a entrada de controle também estiver com erro; ou será calculada com base na entrada, a oeste, se a entrada de controle for 1.

    Atributos

    Quando o componente for selecionado ou estiver sendo acrescentado, Alt-0 até ALT-9 irão alterar o seu atributo Bits de Dados, e as teclas com setas poderão alterar o seu atributo Direção.

    Direção
    A direção do componente (a posição das saídas em relação às entradas).
    Bits de Dados
    A largura em bits da entrada e da saída do componente.
    Tamanho da Porta
    Serve para determinar se é para desenhar uma versão maior ou menor do componente (aplicável apenas ao inversor controlado).
    Posição da Linha de Controle
    A posição da linha de controle, imaginando-se que a saída seja vista a partir da entrada: se o componente estiver voltado para a leste, e for escolhida a direção para a direita, a linha de controle estará voltada para baixo; mas se for escolhida a direção para a esquerda, a linha de controle estará para cima.
    Rótulo
    O texto para o rótulo associado à porta.
    Fonte do Rótulo
    A fonte com a qual o rótulo será mostrado.

    Comportamento da ferramenta Testar

    Nenhum.

    Comportamento da ferramenta Texto

    Permite que o rótulo associado à porta seja editado.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/gates/constant.html0000644000175000017500000000372111541757142022003 0ustar vincentvincent Constante

    Constante

    Biblioteca: Portas
    Introdução: 2.0 Beta 1
    Aparência:

    Comportamento

    Serve para emitir um valor especificado pelo seu atributo Valor.

    Pinos

    Há apenas um único pino, uma saída cuja largura em bits depende do atributo Bits de Dados. A posição de seu pino é especificada pelo atributo Direção. O componente emitirá a saída continuamente qualquer que seja o valor especificado no atributo Valor.

    Atributos

    Quando o componente for selecionado ou estiver sendo acrescentado, os dígitos hexadecimais de '0' a '9' e de 'a' até 'f' poderão alterar o seu atributo Valor, Alt-0 até ALT-9 irão alterar o seu atributo Bits de Dados, e as teclas com setas poderão alterar o seu atributo Direção.

    Direção
    A direção na qual cada pino está localizado relativa ao lugar onde é desenhado.
    Bits de Dados
    A largura em bits das entradas e das saídas do componente.
    Valor
    O valor, em hexadecimal, que será emitido pelo componente. O número de bits usados para especificar o valor não poderá exceder a largura em bits do componente.

    Comportamento da ferramenta Testar

    Nenhum.

    Comportamento da ferramenta Texto

    Nenhum.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/gates/buffer.html0000644000175000017500000000602311541757142021421 0ustar vincentvincent Buffer

    Buffer

    Biblioteca: Base
    Introdução: 2.0 Beta 1
    Aparência:

    Comportamento

    O buffer simplesmente passa para a saída à direita o conteúdo recebido na entrada do lado esquerdo. A tabela-verdade para o buffer de um bit é a que se segue.

    xout
    00
    11

    Se a entrada não for especificada (ou seja, flutuante), então a saída também não será especificada - a menos que a opção "Saída de Porta Quando Indefinida" seja "Erro para Entradas Indefinidas", caso onde a saída será um valor de erro. Se a entrada for um valor de erro, a saída também o será.

    Buffers são os componentes de menor importância dentre os disponíveis pelo Logisim; sua presença na biblioteca Gates é uma questão de completude (um componente para cada valor de um bit possível na tabela-verdade), pois é interessante proporcionar uma funcionalidade equivalente a um elemento real. Ainda assim, pode ser ocasionalmente útil para garantir que valores se propaguem em apenas uma direção ao longo de uma conexão.

    Pinos (supondo o component voltado para leste)

    Na face oeste (entrada, com largura em bits de acordo com o atributo Bits de Dados)
    A entrada para o componente.
    Na face leste (saída, com largura em bits de acordo com o atributo Bits de Dados)
    A saída, que sempre concordará com a entrada do lado esquerdo.

    Attributes

    Quando o componente for selecionado ou estiver sendo acrescentado, Alt-0 até ALT-9 irão alterar o seu atributo Bits de Dados, e as teclas com setas poderão alterar o seu atributo Direção.

    Direção
    A direção do componente (a posição das saídas em relação às entradas).
    Bits de Dados
    A largura em bits da entrada e da saída do componente.
    Rótulo
    O texto para o rótulo associado à porta.
    Fonte do Rótulo
    A fonte com a qual o rótulo será mostrado.

    Comportamento da ferramenta Testar

    Nenhum.

    Comportamento da ferramenta Texto

    Permite que o rótulo associado à porta seja editado.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/gates/basic.html0000644000175000017500000002055711541757142021241 0ustar vincentvincent Portas AND/OR/NAND/NOR

    Portas AND/OR/NAND/NOR

    Biblioteca: Base
    Introdução: 2.0 Beta 1
    Aparência:
    AND OR NAND NOR
    Convencional
    Retangular
    DIN 40700

    Comportamento

    As portas AND, OR, NAND, e NOT servem para calcular as respectivas funções das entradas, e emitir o resultado à saída.

    Por padrão, todos as entradas que não estiverem conectadas serão consideradas desligadas e, portanto, ignoradas - isso é, se a entrada realmente não tiver algo ligado a ela, nem mesmo um fio. Dessa forma, você poderá inserir um porta com 5 entradas, mas se conectar somente duas entradas, ele irá funcionar como uma porta de 2 entradas; isso irá aliviá-lo do trabalho de ter de se preocupar com a configuração do número de entradas cada vez que você criar uma porta. (Se todas as entradas estiverem desconectadas, a saída será o valor de erro X.) Alguns usuários, no entanto, preferem que o Logisim insista que todas as entradas devam estar ligado, pois isso corresponde melhor às portas do mundo real. Você poderá permitir esse comportamento, se usar em Projeto > Opções ... na guia Simulação, o item de menu Erro para entradas indefinidas para Saída de Porta Quando Indefinida.

    A tabela-verdade para portas de duas entradas é a que se segue. (A letra X representará o valor de erro, e a letra Z representará o valor flutuante.)

    AND
    01X/Z
    0000
    101X
    X/Z0XX
       
    OR
    01X/Z
    001X
    1111
    X/ZX1X
    NAND
    01X/Z
    0111
    110X
    X/Z1XX
       
    NOR
    01X/Z
    010X
    1000
    X/ZX0X

    Em resumo, esses componentes funcionarão como esperado, enquanto todas as entradas forem 0 ou 1. Se uma entrada não for nem 0 nem 1 (for flutuante, ou tiver o valor de erro) então, o componente a tratará como se fosse ambos 0 e 1: se a saída depender prioritariamente de um deles, (como quando uma porta AND tem uma entrada que é, definitivamente, 0 e uma segunda entrada questionável), esse será o valor de saída; mas se a saída mudar dependendo se ele for 0 ou 1, a saída terá o valor de erro.

    As versões multibit de cada porta irá realizar a operação bit a bit para cada uma de suas entradas.

    Pinos (supondo o component voltado para leste)

    Na face oeste (entradas, com largura em bits de acordo com o atributo Bits de Dados)

    As entradas para o componente. Haverá tantas delas quanto a quantidade especificada pelo atributo Número de Entradas.

    Observar que se você estiver usando portas convencionais, o lado oeste das portas OR e NOR serão curvos. No entanto, os pinos de entrada estarão sobre uma linha. O Logisim irá traçar marcas curtas para indicar essas entradas; se você ultrapassar essas indicações, ele irá supor que a intenção seria apenas atingi-los. Em "Prévia da Impressão", essas marcas não serão desenhadas a menos que estejam conectados a fios.

    Na face leste (saída, com largura em bits de acordo com o atributo Bits de Dados)

    A porta de saída, cujo valor será calculado com base nos valores atuais das entradas conforme descrito acima.

    Atributos

    Quando o componente for selecionado ou estiver sendo acrescentado, os dígitos de '0 'a '9' poderão alterar o atributo Número de Entradas , Alt-0 até ALT-9 irão alterar o seu atributo Bits de Dados , e as teclas com setas poderão alterar o seu atributo Direção .

    Direção
    A direção do componente (a posição das saídas em relação às entradas).
    Bits de Dados
    A largura em bits das entradas e das saídas do componente.
    Tamanho da Porta
    Serve para determinar se é para desenhar uma versão maior ou menor do componente. Isso não afetará o número de entradas, o que será especificada pelo atributo Número de Entradas. No entanto, se portas convencionais forem selecionadas, então a porta será desenhada com "asas" para acomodar as entradas adicionais além daquelas normalmente oferecidas.
    Número de Entradas
    Serve para determinar quantos pinos o componente terá em sua face oeste.
    Rótulo
    O texto para o rótulo associado à porta.
    Fonte do Rótulo
    A fonte com a qual o rótulo será mostrado.
    Negar x
    Se sim, a entrada será negada antes de ser introduzida no porta. As entradas serão contadas de cima para baixo, se a frente estiver a leste ou a oeste, e serão contados da esquerda para a direita, se a frente estiver ao norte ou ao sul.

    Comportamento da ferramenta Testar

    Nenhum.

    Comportamento da ferramenta Texto

    Permite que o rótulo associado à porta seja editado.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/base/0000755000175000017500000000000011541757142017070 5ustar vincentvincentlogisim-2.7.1/doc/pt/html/libs/base/wiring.html0000644000175000017500000000741611541757142021265 0ustar vincentvincent Ferramenta Conectar

    Ferramenta Conectar

    Biblioteca: Base
    Introdução: 2.0 Beta 1

    Comportamento

    A ferramenta Conectar será usada pra criar segmentos de fios que carregarão sinais de uma extremidade até outra. A largura em bits desses valores poderá ser qualquer; a largura exata será inferida automaticamente a partir dos componentes que estiver conectando. Se não estiver associada a qualquer componente, a conexão será traçada em cinza para indicar que a largura em bits é desconhecida; se não houver concordância na largura com a do componente, a conexão será traçada em cor laranja para indicar conflito, e efetivamente não haverá qualquer transmissão de sinal até que o usuário o resolva.

    Um simples arrastar do mouse poderá criar múltiplos segmentos de fios. O processo mais preciso é um pouco mais difícil de se descrever; mas funciona bem intuitivamente na prática: se você fizer uso da ferramenta Conectar um segmento particular de fio será interrompido tão logo atinja o pino de um componente que já exista, ou onde quer que alcance outro segmento de fio de uma conexão também existente. Além disso, se uma extremidade de qualquer conexão múltipla alcançar o meio de outra já existente, então essa também passará a ter múltiplos segmentos.

    Para alguns componentes que tiverem marcas para indicar onde há pontos de conexão disponíveis (tais como uma porta OR ou um buffer controlado), o Logisim irá de forma sutil corrigir tentativas em criar fios que ultrapassem ligeiramente os pontos de conexão.

    Você poderá encurtar um segmento de fio usando a ferramenta Conectar, ao arrastar qualquer das extremidades de um segmento, e isso irá superpor-se ao existente.

    Todas as conexões no Logisim serão ou horizontais ou verticais.

    As conexões não têm direção determinada; ou seja, elas transmitem valores de um ponto a outro. De fato, um fio pode transportar valores em ambas direções simultaneamente; a conexão central no exemplo abaixo fará isso.

    Atributos

    A ferramenta Conectar não possui atributos, mas as conexões que criar, sim.

    Direção
    Serve para indicar se uma conexão será horizontal ou vertical. O valor de seu atributo não poderá ser alterado.
    Comprimento
    Serve para indicar com quantos pixels será a conexão. O valor de seu atributo não poderá ser alterado.

    Comportamento da ferramenta Testar

    Quando você clicar sobre um segmento de uma conexão existente usando a ferramenta Testar, o Logisim irá mostrar o valor corrente que passa por ela. Esse comportamento é particularmente útil para as conexões multibit, cuja cor (preta) não oferece uma informação visual sobre o que passa pelos fios de uma conexão.

    Para valores multibit, você poderá configurar exatamente como esses valores serão apresentados (em binário, decimal, ou hexadecimal, por exemplo) usando o painel Área de Desenho da caixa de diálogo Opções de Projeto.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/base/tunnel.html0000644000175000017500000000603711541757142021271 0ustar vincentvincent Túnel

    Túnel

    Biblioteca: Base
    Introdução: 2.5.0
    Aparência:

    Comportamento

    Um túnel funciona como um fio na medida em que vincula pontos, mas ao contrário de um fio, a uma conexão não será traçada explicitamente. Isso será útil quando você precisar conectar pontos distantes no circuito e uma rede de fios possa tornar o circuito menos legível. A ilustração abaixo mostra como isso funciona.

    Aqui, todos os três túneis tem o mesmo rótulo, a, e assim todos os três pontos estarão conectados ao mesmo ponto. (Se um dos túneis tiver sido rotulado diferentemente, como b, então será parte de outro conjunto de túneis). O buffer controlado na parte superior emitirá uma saída flutuante uma vez que a sua entrada de mais baixa ordem é 0. Isso normalmente levará a conexão que venha do buffer controlado a ser azul; mas aqui ela está verde-escura, porque a saída flutuante combina-se através do túnel com o 0 originário do pino na parte inferior. Se a entrada de controle para as alterações do buffer for igual a 1, então, esse buffer controlado irá alimentar o túnel com 1, que combinado com 0 do pino ao fundo irá resultar em um valor de erro; portanto, fios vermelhos serão vistos alimentando todos os três túneis.

    Pinos

    Um túnel tem apenas um pino, cuja largura em bits será de acordo com o seu atributo Bits de Dados. Esse pino não é uma entrada nem uma saída — túneis correspondentes estarão conectados de forma transparente.

    Atributos

    Quando o componente for selecionado ou estiver sendo acrescentado, Alt-0 até ALT-9 irão alterar o seu atributo Bits de Dados, e as teclas com setas poderão alterar o seu atributo Direção.

    Direção
    A direção na qual o túnel aponta.
    Bits de Dados
    O número de bits para o túnel.
    Rótulo
    O texto do rótulo associado ao túnel. Esse túnel estará conectado a todos os outros com o mesmo rótulo.
    Fonte do Rótulo
    A fonte com a qual o rótulo será mostrado.

    Comportamento da ferramenta Testar

    Nenhum.

    Comportamento da ferramenta Texto

    Permite que o rótulo associado ao túnel seja editado.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/base/text.html0000644000175000017500000000540511541757142020746 0ustar vincentvincent Ferramenta Texto

    Ferramenta Texto

    Biblioteca: Base
    Introdução: 2.0 Beta 1

    Comportamento

    A ferramenta Texto lhe permitirá criar e editar rótulos associados aos componentes. Os componentes que dispõem de rótulos terão essa característica indicada na seção 'Comportamento da Ferramaneta Texto' de sua documentação. Até a presente versão, os seguintes componentes das bibliotecas predefinidas oferecem rótulos:

    Biblioteca Base Pino
    Clock
    Rótulo
    Ponta de Prova
    Biblioteca Memória Flip-Flops D/T/JK/SR
    Registrador
    Contador
    Registrador de Deslocament
    Gerador Aleatório
    Biblioteca para Entrada/Saída Botão
    LED

    Para os componentes que poderão ter um rótulo, mas que não o tiverem ainda, você poderá clicar sobre ele e acrescentá-lo. Se já houver um rótulo, você deverá clicar sobre o mesmo. Se você clicar em um ponto onde não houver rótulo para ser editado, o Logisim irá acrescentar um componente novo do tipo Rótulo.

    Na atual versão do Logisim, as funcionalidades para a edição de texto ainda são bastante primitivas. Selecionar uma região do texto dentro do rótulo é impossível. Não há como inserir uma quebra de linha dentro de um rótulo.

    Atributos

    Os atributos dessa ferramenta são os mesmos do componente Rótulo. Esses atributos não terão efeito algum quando se editar o rótulo de um componente que já exista, mas eles serão transmitidos para quaisquer rótulos criados usando essa ferramenta.

    Ao clicar em um componente que ofereça suporte à ferramenta Texto, isso fará com que os atributos do componente sejam apresentados.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/base/splitter.html0000644000175000017500000001015511541757142021626 0ustar vincentvincent Distribuidor

    Distribuidor

    Biblioteca: Base
    Introdução: 2.0 Beta 1
    Aparência:

    Comportamento

    O distribuidor cria uma correspondência entre um valor multibit e vários subconjuntos separados de bits equivalentes. A despeito do seu nome, ele pode separar tanto um valor multibit em partes, quanto combiná-las em um valor multibit - de fato ele poderá fazer ambos de uma vez. Uma descrição mais completa dos distribuidores poderá ser encontrada na seção 'Distribuidores' do Guia do Usuário.

    O Logisim trata os distribuidores de forma especial ao propagar sinais dentro de um circuito: enquanto todos os outros componentes precisam de um atraso calculado para fins do seu comportamento na simulação, os sinais propagados pelos distribuidores (assim como também pelas conexões) serão transmitidos instantaneamente.

    Nota: O termo distribuidor não é um termo padronizado, é único do Logisim até onde eu saiba. Desconheço qualquer termo padrão para tal conceito; o único termo que já ví foi bus ripper, mas esse termo é desnecessariamente violento para o meu gosto.

    Pinos

    Para distinguir entre os diversos pontos de conexão em um distribuidor, irei referir-me à terminação com um ponto de conexão como sua extremidade combinada, e aos múltiplos pontos de conexão do outro lado como sua extremidade dividida.

    A extremidade combinada (entrada/saída, com largura em bits de acordo com o atributo Bits de Dados)
    Representará um valor combinado por todos os bits que forem transmitidos pelo distribuidor.
    A extremidade dividida (entrada/saída, com largura em bits calculada com base nos atributos Bit x)
    O número de extremidades divididas será especificado pelo atributo Distribuição, e cada uma terá um índice que será no mínimo igual a zero e menor que o valor desse atributo. Para cada terminação, todos os bits para os quais o Bit x referir-se por seu índice, serão transmitidos através da extremidade, e a ordem desses bits será a mesma na extremidade combinada.

    Atributos

    Quando o componente for selecionado ou estiver sendo acrescentado, os dígitos de '0 'a '9' poderão alterar o atributo Distribuição, Alt-0 até ALT-9 irão alterar ambos os atributos Distribuição e Largura de Bits à Entrada, e as teclas com setas poderão alterar o seu atributo Direção.

    Direção
    A posição da extremidade dividida em relação à combinada.
    Distribuição
    O número de terminações em uma extremidade.
    Largura em Bits à Entrada
    A largura em bits da extremidade combinada.
    Bit x
    O índice de uma terminação ao qual o bit x corresponder na extremidade combinada. As terminações são indexadas a partir de 0 no topo (para um distribuidor voltado para leste ou oeste) e a partir de 0 da esquerda/oeste (para um distribuidor voltado para norte ou sul). Um bit pode ser especificado para não corresponder a qualquer uma das terminações. Não há qualquer maneira pela qual um bit possa corresponder a múltiplas terminações.

    Comportamento da ferramenta Testar

    Nenhum.

    Comportamento da ferramenta Texto

    Nenhum.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/base/select.html0000644000175000017500000001131511541757142021236 0ustar vincentvincent Ferramenta Selecionar

    Ferramenta Selecionar

    Biblioteca: Base
    Introdução: 2.0 Beta 1

    Comportamento

    Permite que componentes individuais possam ser colocados em uma mesma seleção. Há certo número de ações possíveis com essa ferramenta.

    • Ao pressionar o botão do mouse enquanto ele estiver sobre um componente selecionado, ele irá arrastar todos os componentes na mesma seleção.

      Por padrão, Logisim irá calcular uma forma de acrescentar novos fios de modo que nenhuma conexão existente seja perdida durante o movimento. (Às vezes, ele irá eliminar ou encurtar fios existentes.) Se você estiver realizando um movimento em que você queira que essas alterações sejam feitas, você poderá pressionar a tecla Shift durante a movimentação. Se você quiser desabilitar esse comportamento por completo, basta ir a Projeto > Opções, selecionar a guia Área de Desenho, e desmarcar a caixa Manter Conexões ao Mover ; nesse caso, as conexões serão calculadas somente quando a tecla shift for pressionada.

      Ao arrastar uma seleção isso poderá levar a um comportamento inesperado dos fios: se ao fazer isso, alguns fios passarem sobre outros, eles serão conectados, e todos serão colocados na mesma seleção. Como resultado, se você arrastar a seleção pela segunda vez, os fios que existirem previamente no local não serão deixados para trás. Esse comportamento é necessário manter coerência com o comportamento esperado para as conexões de fios no Logisim. E não constituirá, normalmente, um grande problema: o Logisim irá traçar a seleção inteira no instante em que desejar efetivá-la, e você não deverá fazê-lo, até que você tenha certeza que esteja no local correto.

    • Caso contrário, ao clicar com o mouse em um componente apagará todos os componentes na seleção, ao invés daquele(s) sobre onde houve a marcação.

    • Shift+click do mouse sobre um componente alternará sua presença na seleção. Se vários componentes compartilharem a mesma posição, a presença de todos será alternada. Nada disso ocorrerá, porém, se for feito por outra ferramenta (via a janela de opções de projeto Guia do Mouse).

    • Ao começar a arrastar o mouse em uma posição que não contenha qualquer componente, irá iniciar-se o traçado de uma área retangular para seleção. Todos os componentes contidos dentro dessa área serão colocados na seleção.

    • Ao clicar Shift e arrastar o mouse a partir de uma posição que não contiver qualquer componente iniciará uma seleção retangular. A presença de todos os componentes contidos nessa área será alternada. Isso não irá ocorrer, porém, se a ação do mouse for mapeado para outra ferramenta em seu lugar.

    Após selecionar os itens desejados, você poderá, naturalmente, recortar/copiar/colar/apagar todos os itens via menu Editar .

    O comportamento do Logisim quando colar a área de transferência em um circuito será um tanto peculiar: ele não irá colocar imediatamente os componentes no circuito, em vez disso, a seleção será uma coleção de "esboços transparentes", que será deixada no circuito assim que forem levados para outra posição ou removidos da seleção. (Esse comportamento peculiar é necessário porque, caso contrário, as conexões na seleção seriam fundidas àquelas no circuito atual de uma só vez, e não permitir que pudessem ser arrastadas de sua posição anterior junto com o conteúdo da área de transferência, até que fossem coladas onde o usuário desejasse.)

    Atributos

    Nenhum. Ao selecionar um componente, seus atributos serão apresentados. Se vários componentes forem selecionados, os atributos compartilhados por todos serão mostrados, em branco ficarão aqueles com valores diferentes e de outro modo os que tiverem em comum. (As conexões serão ignoradas, se não houver qualquer outro componente na seleção.) Mudanças no valor do atributo afetarão todos os componentes selecionados.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/base/pull.html0000644000175000017500000000423611541757142020737 0ustar vincentvincent Resistor para Ajuste

    Resistor para Ajuste

    Biblioteca: Base
    Introdução: 2.5.0
    Aparência:
    Portas convencionais:
    Portas retangulares:

    Comportamento

    Quando conectado a um ponto, esse componente terá efeito apenas quando o valor nesse ponto for flutuante (Z). Nesse caso, o resistor de ajuste fará com que a conexão concorde com valor especificado pelo atributo Direção de Ajuste.

    Se estiver conectado a um valor multibit, então cada bit que estiver flutuando será ajustado para a direção especificada, enquanto os bits, que não estiverem flutuando, não serão alterados.

    Pinos

    O resitor possui apenas um pino, que será uma saída e terá largura em bits inferida do componente ao qual estiver conectado.

    Atributos

    Quando o componente for selecionado ou estiver sendo acrescentado, as teclas com setas poderão alterar o seu atributo Direção.

    Direção
    A direção do pino do componente em relação ao seu centro.
    Direção para Ajuste
    Serve para especificar para qual valor um sinal flutuante deverá ser ajustado. Isso poderá ser para 0, 1, ou valor de erro.

    Comportamento da ferramenta Testar

    Nenhum.

    Comportamento da ferramenta Texto

    Nenhum.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/base/probe.html0000644000175000017500000000516111541757142021070 0ustar vincentvincent Ponta de Prova

    Probe

    Biblioteca: Base
    Introdução: 2.0.3
    Aparência:

    Comportamento

    Uma ponta de prova é um elemento que simplesmente exibirá o valor em um dado ponto de um circuito. Ela mesma não interage com os outros componentes.

    Na maioria dos aspectos, o componente ponta de prova é similar em funcionalidade ao componente Pino configurado para saída. A principal diferença é que se o circuito for usado como um subcircuito, então um pino de saída fará parte daquela interface, enquanto a ponta de prova não. Outra diferença é que a ponta de prova não possui um atributo Bits de Dados para ser configurado: a largura em bits será inferida a partir de qualquer valor que seja amostrado por sua entrada. Graficamente, elas são similares, mas possuem bordas ligeiramente diferentes: um pino possui a borda em preto, mais larga, enquanto a da ponta de prova será mais estreita, em cinza.

    Pinos

    O componente ponta de prova tem apenas um pino, o qual servirá como entrada. A largura em bits desse pino é adaptativa: a ponta de prova se ajustará a entradas de qualquer largura.

    Atributos

    Quando o componente for selecionado ou estiver sendo acrescentado, as teclas com setas poderão alterar o seu atributo Direção.

    Direção
    A face do componente onde o seu pino de entrada deverá estar.
    Rótulo
    O texto para o rótulo associado ao componente.
    Posição do Rótulo
    A posição do rótulo em relação ao componente.
    Fonte do Rótulo
    A fonte com a qual o rótulo será mostrado.
    Base
    A base do sistema de numeração (por exemplo, binário, decimal, ou hexadecimal) no qual o valor será exibido.

    Comportamento da ferramenta Testar

    Nenhum.

    Comportamento da ferramenta Texto

    Permite que o rótulo associado ao componente seja editado.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/base/poke.html0000644000175000017500000000442411541757142020720 0ustar vincentvincent Ferramenta Testar

    Ferramenta Testar

    Biblioteca: Base
    Introdução: 2.0 Beta 1

    Comportamento

    A ferramenta Testar (Poke) serve para manipular os valores correntes associados aos componentes. O comportamento preciso da ferramenta Testar (Poke) irá variar dependendo sobre qual componente for clicada; esse comportamento está documentado na seção 'Comportamento da Ferramenta Testar (Poke)' de cada componente.

    Biblioteca Base Pino
    Clock
    Biblioteca Memória Flip-Flop D/T/J-K/S-R
    Registrador
    Contador
    Registrador de Deslocamento
    RAM
    ROM
    Biblioteca Entrada/Saída Botão
    Joystick
    Teclado
    Biblioteca Legada Flip-Flops D/J-K do Logisim 1.0
    Registrador de 8-bits do Logisim 1.0

    Além disso, ao clicar em um segmento de fio usando a ferramenta Testar (Poke), isso exibirá o valor corrente que passa por esse fio, como descrito na página Ferramenta Conectar.

    Atributos

    Nenhum. Ao clicar em um componente que aceite a ferramenta Testar, então, os atributos do componente serão exibidos.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/base/pin.html0000644000175000017500000001245011541757142020546 0ustar vincentvincent Pino

    Pino

    Biblioteca: Base
    Introdução: 2.0 Beta 1
    Aparência:

    Comportamento

    Um pino pode ser uma saída ou uma entrada para um circuito, dependendo do valor de seu atributo Saída?. Ao desenhar um pino, o Logisim representará as saídas por círculos ou retângulos com bordas arredondadas, e as entradas serão representadas por quadrados ou retângulos. Em ambos os casos, os bits individuais do valor que for recebido ou enviado será mostrada pelo componente (exceto quando for prévia de uma impressão, quando o componente apenas informará quantos bits poderá comportar).

    Um pino é conveniente para se interagir com um circuito, e os usuários iniciantes do Logisim não precisarão usá-los necessariamente. Mas um usuário que estiver construindo um circuito que use vários subcircuitos (como descrito na seção 'Subcircuitos' do Guia do Usuário) poderá usar pinos para especificar a interface entre um circuito e um subcircuito. Em particular, o pino de um layout de circuito define como ele aparecerá quando for tomado por subcircuito e seu layout estiver sendo usado por outro. Em tal circuito, os valores enviados ou recebidos por essas posições no subcircuito serão vinculados aos pinos internos de seu layout.

    Pinos

    O componente tem apenas um ponto de conexão, que poderá ser uma entrada para o componente se for um pino de saída, ou uma saída para o componente caso seja um pino de entrada. Em ambos os casos, sua largura em bits irá corresponder ao atributo Bits de Dados, e sua posição será especificada pelo atributo Direção.

    Atributos

    Quando o componente for selecionado ou estiver sendo acrescentado, os dígitos de '0 'a '9' poderão alterar o atributo Bits de Dados , Alt-0 até ALT-9 irá alterar o atributo Direção e e Alt com as teclas com setas poderão alterar o seu atributo Posição do Rótulo.

    Direção
    A face do componente onde sua entrada/saída deverá estar.
    Saída?
    Serve para especificar se o componente irá funcionar com entrada ou saída. (Observar que se for um pino de entrada, então o pino irá funcionar como se sua interface dentro do circuito fosse uma saída, e vice-versa.)
    Bits de Dados
    O número de bits para o valor que o pino pode tratar.
    Tri-state?
    Para um pino de entrada, serve para configurar se o usuário poderá indicar que o pino poderá emitir valores indefinidos (ou seja, flutuantes). Esse atributo lida apenas com a interface com o usuário; ele não terá qualquer efeito sobre como o pino se comportará quanto o layout do circuito for usado como um subcircuito. Para um pino de saída, o atributo não terá efeito algum.
    Comportamento para Ajuste
    Para um pino de entrada, o atributo especificará como um valor flutuante deverá ser tratado quando recebido por uma entrada, talvez de um circuito que esteja usando o layout, como no caso de um subcircuito. Se "imutável", os valores flutuantes serão enviados como tal; se "pull-up", eles serão convertidos para 1 antes de serem submetidos; e se "pull-down", eles serão convertidos para 0 antes de serem entregues.
    Rótulo
    O texto para o rótulo associado ao componente.
    Posição do Rótulo
    A posição do rótulo em relação ao componente.
    Fonte do Rótulo
    A fonte com a qual o rótulo será mostrado.

    Comportamento da ferramenta Testar

    Ao clicar em um pino de saída não terá efeito algum, embora os atributos do pino sejam apresentados.

    Ao clicar em um pino de entrada irá alternar bit que for clicado. Se for um pino tri-state, em seguida, o bit correspondente irá alternar entre eles.

    Se, no entanto, o usuário estiver consultando o estado de um subcircuito conforme descrito em 'Depuração de Subcircuitos' do Guia do Usuário, então o valor do pino ficará fixo em qualquer valor que o subcircuito que estiver recebendo do circuito que o contiver. O usuário não poderá alterar o valor sem quebrar o vínculo entre os estados do subcircuito e o do circuito, e o Logisim pedirá ao usuário para verificar se a quebra desse vínculo é realmente desejada.

    Comportamento da ferramenta Texto

    Permite que o rótulo associado ao componente seja editado.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/base/menu.html0000644000175000017500000000436111541757142020726 0ustar vincentvincent Ferramenta Menu

    Ferramenta Menu

    Biblioteca: Base
    Introdução: 2.0 Beta 1

    Comportamento

    A ferramenta Menu permitirá ao usuário acionar um menu pop-up para os componentes que já existirem. Por padrão, ao clicar o botão da direita ou de controle um componente abrirá seu menu pop-up; contudo a guia do mouse das opções de projeto permitirá ao usuário configurar os botões do mouse para funcionar de forma diferente.

    O menu pop-up para a maioria dos componentes terá dois itens.

    • Apagar: Removerá o componente do circuito.
    • Mostrar atributos: colocará os atributos do componente na janela com a tabela de atributos, de modo que seus valores possam ser vistos e alterados.

    Para alguns componentes, no entanto, o menu poderá ter itens adicionais. Subcircuitos (ou seja, instâncias de um circuito usado como uma "caixa-preta" dentro de outro) são exemplos disso: além dos itens acima, o menu pop-up incluirá mais um item.

    • Ver XXX: serve para trocar o layout do circuito que estiver sendo visto e editado para o de um subcircuito. Os valores vistos no layout serão parte da mesma hierarquia do supercircuito. (Ver a seção 'Depurar subcircuitos' do Guia do Usuário.)

    Outros componentes também poderão estender o menu pop-up. Nas versões correntes das bibliotecas predefinidas do Logisim, os únicos componentes que poderão fazê-lo serão a RAM e ROM.

    Atributos

    Nenhum.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/base/label.html0000644000175000017500000000576311541757142021050 0ustar vincentvincent Rótulo

    Rótulo

    Biblioteca: Base
    Introdução: 2.0 Beta 1
    Aparência:

    Comportamento

    Um rótulo simples com texto poderá ser colocado em qualquer lugar de um circuito. Ele não irá interagir de forma alguma com os valores que atravessarão o circuito, exceto se impedir a sua visibilidade quando o circuito for desenhado.

    Diferente de todos os outros componentes nas bibliotecas predefinidas, os rótulos poderão ser colocados em qualquer lugar da área de desenho; eles não irão ajustar-se à grade.

    Pinos

    Nenhum.

    Atributos

    Texto
    O texto que aparecerá no rótulo. Esse valor poderá ser editado na tabela de atributos ou, usando a ferramenta Texto, diretamente sobre a área de desenho.
    Fonte
    A fonte a ser usada para traçar o rótulo.
    Alinhamento Horizontal
    A técnica para posicionamento horizontal do texto relativo à posição oficial do rótulo (quando o mouse for clicado para criá-lo). "Esquerda" significa que o texto deverá ser escrito de modo que a face esquerda esteja naquela posição; "Direita" significa que o texto deverá ser escrito de modo que a face direita esteja naquela posição; e "Central" significa que o texto deverá ser escrito centralizado (horizontalmente) naquela posição.
    Alinhamento Vertical

    A técnica para posicionamento vertical do texto relativo à posição oficial do rótulo (quando o mouse for clicado para criá-lo). "Base" significa que a linha de base deverá interceptar a posição; "Topo" significa que a parte de cima do texto deverá interceptar a posição; "Fundo" significa que a parte de baixo do texto deverá interceptar a posição; e "Centro" significa que o texto deverá ser centralizado (verticalmente) na posição.

    A parte de cima e a de baixo do texto serão calculadas tomando por base os valores ascendentes e descendentes do padrão da fonte; assim, mesmo se o texto atual não contiver letras ascendentes (tal como em b) ou letras descendentes (como em g), ainda assim os limites supostos para tais letras serão considerados para fins de posicionamento vertical.

    Comportamento da ferramenta Testar

    Nenhum.

    Comportamento da ferramenta Texto

    Permite que o texto do rótulo seja editado.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/base/index.html0000644000175000017500000000540711541757142021073 0ustar vincentvincent Biblioteca Base

    Biblioteca Base

    A biblioteca Base contém ferramentas de uso geral, assim como componentes cujo comportamento é distinto de outros (ou seja, serão tratados de forma singular pelo mecanismo de propagação do Logisim).

    Ferramenta Testar
    Ferramenta Editar
    Ferramenta Selecionar
    Ferramenta Conectar
    Ferramenta Texto
    Ferramenta Menu
    Distribuidor
    Pino
    Ponta de Prova
    Túnel
    Resistor Pull
    Clock
    Extensor de Bits
    Rótulo

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/base/extender.html0000644000175000017500000000546111541757142021602 0ustar vincentvincent Extensor de Bits

    Extensor de Bits

    Biblioteca: Base
    Introdução: 2.5.0
    Aparência:

    Comportamento

    O extensor de bits transformará um valor em outro de largura diferente. Se for para transformar para uma largura menor, os bits de mais baixa ordem serão simplesmente truncados. Se for para transformar para uma largura maior, os bits menos significativos serão os mesmos, e você terá uma escolha para os bits de mais alta ordem: eles poderão ser todos iguais a 0, ou todos iguais a 1, o concordarem com a entrada do bit de sinal (o mais significativo), ou ainda ter esse valor determinado por uma entrada adicional.

    Pinos

    Na face oeste (entrada, com largura em bits de acordo com o atributo Largura da Entrada)

    A entrada multibit cujo valor será transformado.

    Na face leste (saída, com largura em bits de acordo com o atributo Largura da Saída)

    A saída calculada.

    Na face norte (entrada, com largura de 1 bit)

    Especificará como deverão ser os bits adicionais à saída. Esse pino estará disponível apenas se o atributo Tipo da Extensão for Entrada.

    Atributos

    Quando o componente for selecionado ou estiver sendo acrescentado, os dígitos de '0 'a '9' poderão alterar o atributo Largura da Entrada , Alt-0 até ALT-9 irão alterar o seu atributo Largura da Saída.

    Largura da Entrada
    A largura em bits da entrada.
    Largura da Saída
    A largura em bits da saída.
    Tipo da Extensão
    Se a largura dos bits à saída puderem exceder aquela à entrada, esse atributo irá configurar como deverão ser os bits adicionais da saída. Se Zero ou Um, os bits adicionais serão 0 ou 1 respectivamente. Se Sinal, os bits adicionais serão tomados de acordo com o bit de mais alta ordem da entrada. E se Entrada, o componente usará o valor de uma segunda entrada adicional na face norte.

    Comportamento da ferramenta Testar

    Nenhum.

    Comportamento da ferramenta Texto

    Nenhum.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/base/edit.html0000644000175000017500000002054711541757142020713 0ustar vincentvincent Ferramenta Editar

    Ferramenta Editar

    Biblioteca: Base
    Introduçãp: 2.3.0

    Comportamento

    A ferramenta Editar permitirá ao usuário rearranjar os componentes que existirem e acrescentar conexões. Exatamente o que a ferramenta fará dependerá de onde o usuário clicar com o mouse na área de desenho.

    • Quando o mouse estiver sobre um ponto de conexão de um componente que já exista, ou sobre um fio, a ferramenta Editar irá mostrar um pequeno círculo verde em torno na posição do mouse. Ao pressionar o botão ali, iniciará a inclusão de uma nova conexão. Mas se o usuário não arrastar o mouse, longe o bastante para iniciar a conexão, antes de soltar o botão, a ação será tratada como um clique, e um fio será simplesmente adicionado à seleção corrente.

      A largura em bits de uma conexão acrescentada será inferida a partir dos componentes aos quais estiver conectada. Se não estiver vinculada a qualquer componente, um fio será traçado em cinza para indicar que sua largura é desconhecida; houver concordância na largura com a do componente naquela posição, a conexão será traçada em cor laranja para indicar conflito, e efetivamente não haverá qualquer transmissão de sinal até que o usuário o resolva.

      Todas as conexões no Logisim serão ou horizontais ou verticais, nunca diagonais.

      As conexões não têm direção determinada; ou seja, elas transmitem valores de um ponto a outro. De fato, um fio pode transportar valores em ambas direções simultaneamente: no exemplo abaixo, um bit será transmitido da entrada superior à esquerda através da conexão central, e então voltará por ela, e novamente de modo circular, até alcançar a saída inferior à direita.

      Um simples arrastar do mouse poderá criar múltiplos segmentos de fios. O processo mais preciso é um pouco mais difícil de se descrever; mas funciona bem intuitivamente na prática: se você fizer uso da ferramenta Conectar um segmento particular de fio será interrompido tão logo atinja o pino de um componente que já exista, ou onde quer que alcance outro segmento de fio de uma conexão também existente. Além disso, se uma extremidade de qualquer conexão múltipla alcançar o meio de outra já existente, então essa também passará a ter múltiplos segmentos.

      Você poderá encurtar ou apagar uma conexão existente ao arrastar qualquer das extremidades de um segmento e seguir o caminho inverso na direção da outra extremidade. Durante o movimento, a mudança de tamanho será indicada por uma linha branca sobre a parte do fio que estiver sendo removida.

      Para alguns componentes que tiverem marcas para indicar onde há pontos de conexão disponíveis (tais como uma porta OR ou um buffer controlado), o Logisim, de forma sutil, corrigirá tentativas em criar fios que ultrapassem ligeiramente os pontos de conexão.

    • Contudo, se o usuário pressionar a tecla Alt em um ponto no meio de um fio, então o círculo verde desaparecerá. Um clique do mouse selecionará a conexão e o mouse irá arrastá-la.

    • Ao pressionar o botão do mouse enquanto ele estiver sobre um componente selecionado ele irá arrastar todos os componentes na mesma seleção.

      Por padrão, Logisim irá calcular uma forma de acrescentar novos fios de modo que nenhuma conexão existente seja perdida durante o movimento. (Às vezes, ele irá eliminar ou encurtar fios existentes.) Se você estiver realizando um movimento em que você queira que essas alterações sejam feitas, você poderá pressionar a tecla shift durante a movimentação. Se você quiser desabilitar esse comportamento por completo, basta ir a Projeto > Opções, selecionar a guia Área de Desenho, e desmarcar a caixa Manter Conexões ao Mover ; nesse caso, as conexões serão calculadas somente quando a tecla shift for pressionada.

      Ao arrastar uma seleção isso poderá levar a um comportamento inesperado dos fios: se ao fazer isso, alguns fios passarem sobre outros, eles serão conectados, e todos serão colocados na mesma seleção. Como resultado, se você arrastar a seleção pela segunda vez, os fios que existirem previamente no local não serão deixados para trás. Esse comportamento é necessário para manter coerência com o comportamento esperado para as conexões de fios no Logisim. E não constituirá, normalmente, um grande problema: o Logisim irá traçar a seleção inteira no instante em que desejar efetivá-la, e você não deverá fazê-lo, até que você tenha certeza que esteja no local correto.

    • Ao clicar com o mouse sobre um componente não selecionado (mas não sobre um de seus pontos de conexão) todos os componentes da seleção atual serão fixados e a seleção passará ao(s) componente(s) que contiver(em) a posição clicada.

    • Shift+click do mouse sobre um componente alternará sua presença na seleção. Se vários componentes compartilharem a mesma posição, a presença de todos será alternada.

    • Ao começar a arrastar o mouse em uma posição que não contenha qualquer componente, fixará todos aqueles na seleção atual e iniciar o traçado de uma área retangular para seleção. Todos os componentes contidos dentro dessa área serão colocados na seleção.

    • Ao clicar shift e arrastar o mouse a partir de uma posição que não contiver qualquer componente iniciará uma seleção retangular. A presença de todos os componentes contidos nessa área será alternada.

    • Contudo, se a tecla alt for pressionada em uma posição que não contiver qualquer componente, iniciará o acréscimo de uma nova conexão. Um pequeno círculo verde será traçado em tal circunstância para indicar isso.

    Após selecionar os itens desejados, você poderá, naturalmente, recortar/copiar/colar/apagar todos os itens via menu Editar .

    Algumas teclas podem ter efeito sobre a ferramenta Editar.

    • As teclas com setas poderão alterar o atributo Direção para todos os componentes na seleção que tiverem tal atributo.

    • As teclas Delete e Backspace irão apagar tudo o que estiver selecionado no circuito.

    • As teclas Insert e MenuKey-D criarão uma cópia dos componentes na seleção corrente.

    O comportamento do Logisim ao duplicar uma seleção ou ao colar a área de transferência em um circuito será um tanto peculiar: ele não irá colocar imediatamente os componentes no circuito, em vez disso, a seleção será uma coleção de "esboços transparentes", que será deixada no circuito assim que forem levados para outra posição ou removidos da seleção. (Esse comportamento peculiar é necessário porque, caso contrário, as conexões na seleção seriam fundidas àquelas no circuito atual de uma só vez, e não permitir, assim, que pudessem ser arrastadas de sua posição anterior junto com o conteúdo da área de transferência até que fossem coladas onde o usuário desejasse.)

    Atributos

    Nenhum. Ao selecionar um componente, ela irá mostrar seus atributos. Se forem selecionados vários componentes, ela irá mostrar os atributos compartilhados por todos, em branco ficarão os valores diferentes e de outro modo, todos aqueles que tiverem em comum. (As conexões serão ignoradas se não houver qualquer outro componente na seleção.) Mudanças no valor do atributo afetarão todos os componentes selecionados.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/base/clock.html0000644000175000017500000000573611541757142021064 0ustar vincentvincent Clock

    Clock

    Biblioteca: Base
    Introdução: 2.0 Beta 13
    Aparência:

    Comportamento

    O clock alternará seu valor à saída periodicamente enquanto as variações (ticks) forem habilitadas via Menu Simulação. (As variações (ticks) estarão desabilitadas por padrão.) Uma variação (tick") é a unidade de tempo do Logisim; a velocidade em que deve ocorrer poderá ser selecionada pelo submenu Frequência de Tick no menu Simulação. O ciclo do clock pode ser configurado para usar os atributos Duração em Alto e Duração em Baixo.

    Observar que a simulação de clocks no Logisim's é pouco realista: em circuitos reais, vários clocks podem derivar de outros e dificilmente estão em sincronia. Mas em Logisim, todos eles experimentarão a mesma taxa de variação de tempo.

    Pinos

    O clock tem apenas um pino, uma saída com largura de 1 bit, cujo valor representará o estado corrente do clock. A posição desse pino será especificada pelo atributo Direção. O valor do clock irá alternar conforme programado sempre que as variações (ticks) forem habilitadas, e sempre que o componente for clicado pela ferramenta Testar.

    Atributos

    Quando o componente for selecionado ou estiver sendo acrescentado, as teclas com setas poderão alterar o seu atributo Direção .

    Direção
    A face do componente onde o pino de saída deverá estar.
    Duração em Alto
    Quanto tempo em cada ciclo que a saída do clock deverá ficar em 1.
    Duração em Baixo
    Quanto tempo em cada ciclo que a saída do clock deverá ficar em 0.
    Rótulo
    O texto para o rótulo associado à porta.
    Posição do Rótulo
    A posição relativa do rótulo em relação ao componente.
    Fonte do Rótulo
    A fonte com a qual o rótulo será mostrado.

    Comportamento da ferramenta Testar

    Ao clicar o componente clock, ele irá alternar o valor de sua saída corrente de imediato.

    Comportamento da ferramenta Texto

    Permite que o rótulo associado ao componente seja editado.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/arith/0000755000175000017500000000000011541757142017265 5ustar vincentvincentlogisim-2.7.1/doc/pt/html/libs/arith/subtractor.html0000644000175000017500000000714211541757142022347 0ustar vincentvincent Subtrator

    Subtrator

    Biblioteca: Aritmética
    Introdução: 2.0 Beta 11
    Aparência:

    Comportamento

    Esse componente subtrairá os valores que vierem através das entradas a oeste (o superior menos o inferior) e fornecerá na saída leste a diferença. O componente é projetado de modo a poder ser conectado a outros subtratores para subtrair mais bits do que for possível com um único subtractor. A entrada borrow-in fornecerá um valor de um bit que deverá ser tomado emprestado fora da diferença (se o empréstimo tivier sido especificado), e um borrow-out indicará se o componente precisar pedir um bit de mais alta ordem para completar a subtração sem underflow (supondo subtração sem sinal).

    Internamente, o subtrator simplesmente executará uma negação (NOT) bit a bit no subtraendo, e irá adicioná-lo ao minuendo, juntamente com a negação da entrada relativa ao borrow-in. (O minuendo é o primeiro operando (entrada superior), e o subtraendo será o segundo (entrada inferior). Acontece que gosto dos termos antiquados.)

    Se um dos operandos contiver algum bit flutuante, ou de erro, então o componente irá executar uma subtração parcial. Ou seja, irá calcular usando os bits de mais baixa ordem possíveis. Porém, acima do bit flutuante, ou de erro, o resultado terá bits flutuante ou de erro.

    Pinos

    Na face oeste, extremo norte (entrada, com largura em bits de acordo com o atributo Bits de Dados)
    O minuendo da subtração, ou seja, o número a partir do qual se irá subtrair.
    Na face oeste, extremo sul (entrada, com largura em bits de acordo com o atributo Bits de Dados)
    O subtraendo da subtração, ou seja, o número que será subtraído do minuendo.
    Na face norte, marcado b in (entrada, com largura de 1 bit)
    Se for 1, então 1 será emprestado fora da diferença. Se o valor for desconhecido (ou seja, flutuante), então será tomado como sendo igual a 0.
    Na face leste (saída, com largura em bits de acordo com o atributo Bits de Dados)
    Os bits menos significativos dos Bits de Dados da diferença dentre os dois valores oriundos da face oeste, menos o bin.
    Na face sul, marcado b out (saída, com largura de 1 bit)
    O bit de empréstimo calculado para a diferença. Se os valores subtraídos como valores sem sinal produzirem um valor negativo, então esse bit será 1; caso contrário, será 0.

    Atributos

    Quando o componente for selecionado ou estiver sendo acrescentado, Alt-0 até ALT-9 irão alterar o seu atributo Bits de Dados .

    Bits de Dados
    A largura em bits dos valores a serem subtraídos e do resultado.

    Comportamento da ferramenta Testar

    Nenhum.

    Comportamento da ferramenta Texto

    Nenhum.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/arith/shifter.html0000644000175000017500000001120011541757142021611 0ustar vincentvincent Deslocador

    Deslocador

    Biblioteca: Aritmética
    Introdução: 2.3.0
    Aparência:

    Comportamento

    Esse componente inclui duas entradas, os dados e dist, e uma saída, que será o resultado do deslocamento dos dados por dist posições. Ambos, os dados e a saída, possuem o mesmo número de bits. O componente oferece os seguintes tipos de deslocamento:

    • Lógico para a Esquerda: Todos os bits de dados serão deslocados no sentido dos bits mais significativo dist posições, com os bits menos significativos nas dist posições sendo preenchidos com 0's. Por exemplo, 11001011 logicamente deslocado para a esquerda duas vezes será 00101100. (Os dois primeiros serão perdidos.)
    • Lógico para a Direita: Todos os bits de dados serão deslocados no sentido dos bits menos significativos dist posições, com os bits mais significativos nas dist posições preenchidos com 0's. Por exemplo, 11001011 logicamente deslocado para a direita duas vezes será 00110010. (Os dois últimos serão perdidos.)
    • Aritmético para a direita: Todos os bits de dados serão deslocados no sentido dos bits menos significativos dist posições, com a parte mais significativa das dist posições preenchidas com qualquer que seja o conteúdo igualmente na parte mais significativa dos dados. Por exemplo, 11001011 aritmeticamente deslocado para a direita duas vezes será 11110010.
    • Com Rotação para a Esquerda: Todos os bits de dados serão deslocados no sentido dos bits mais significativo dist posições, com os bits mais significativos das dist posições copiados para a parte menos significativa. Por exemplo, 11001011 rotacionado para a esquerda duas vezes será 00101111.
    • Com Rotação para a Direita: Todos os bits de dados serão deslocados no sentido dos bits menos significativo dist posições, com os bits menos significativos das dist posições copiados para a parte mais significativa. Por exemplo, 11001011 direito rotacionado duas vezes será 11110010.

    Observar que dist contiver quaisquer entradas flutuantes ou erro, a saída será composta inteiramente por valores de erro, já que não há maneira de supor até que ponto deverá ser deslocada a entrada.

    Pinos

    Na face oeste, extremo norte (entrada, com largura em bits de acordo com o atributo Bits de Dados)
    O valor a ser deslocado.
    Na face oeste, extremo sul (entrada, com largura em bits de acordo com o atributo Bits de Dados)
    O número de bits para os quais a entrada de dados deverá ser deslocada. Essa entrada deverá ter tantos bits quanto o número mínimo para indicar qualquer distância desde 0 até Bits de Dados menos um, ou seja, deverá ter como limite máximo o logaritmo de base 2 dos Bits de Dados. Por exemplo, se os bits de dados forem 8, essa entrada exigirá 3 bits; mas, se fosse 9, exigiria 4 bits.
    Na face leste (saída, com largura em bits de acordo com o atributo Bits de Dados)
    O resultado do deslocamento do valor de entrada pela quantidade em posições.

    Atributos

    Quando o componente for selecionado ou estiver sendo acrescentado, Alt-0 até ALT-9 irão alterar o seu atributo Bits de Dados .

    Bits de Dados
    A largura em bits dos dados de entrada e de saída.
    Tipo de deslocamento
    Um dos cinco tipos possíveis para deslocamento como destacado acima (Lógico para a Esquerda, Lógico para a Direita, Aritmético para a Direita, Com Rotação para a Esquerda, Com Rotação para a Direita).

    Comportamento da ferramenta Testar

    Nenhum.

    Comportamento da ferramenta Texto

    Nenhum.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/arith/negator.html0000644000175000017500000000376611541757142021626 0ustar vincentvincent Negador

    Negador

    Biblioteca: Aritmética
    Introdução: 2.0 Beta 22
    Aparência:

    Comportamento

    Serve para calcular o complemento de dois da entrada. Essa operação será realizada através da manutenção de todos os bits de ordem inferior até o primeiro 1 de mais baixa ordem, e completando todos os bits acima disso.

    Se o valor à entrada já for o menor valor negativo, então a operação não se realizará (pois não poderá ser representada na forma de complemento de dois), e permanecerá como o menor valor negativo.

    Pinos

    Na face oeste (entrada, com largura em bits de acordo com o atributo Bits de Dados)
    O valor para se negar.
    Na face leste, marcado por -x (saída, com largura de bits de acordo com o atributo Bits de Dados)
    A negação da entrada. Se a entrada ultrapassar o menor valor negativo representável no atributo Bits de Dados, então, a saída coincidirá com a entrada.

    Atributos

    Quando o componente for selecionado ou estiver sendo acrescentado, Alt-0 até ALT-9 irão alterar o seu atributo Bits de Dados .

    Bits de dados
    Largura dos bits de dados da entrada e da saída do componente.

    Comportamento da ferramenta Testar

    Nenhum.

    Comportamento da ferramenta Texto

    Nenhum.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/arith/multiplier.html0000644000175000017500000000653711541757142022354 0ustar vincentvincent Multiplicador

    Multiplicador

    Biblioteca: Aritmética
    Introdução: 2.0 Beta 20
    Aparência:

    Comportamento

    Esse componente multiplicará os dois valores que vierem através das entradas a oeste e fornecerá o produto na saída leste. O componente é projetado de forma a poder ser conectado a outros multiplicadores para tratar com um multiplicando com mais bits do que for possível para um único multiplicador. A entrada carry-in fornecerá um valor multibit para ser adicionado ao produto (se ele for especificado), e saída carry-out fornecerá a metade superior do resultado do produto, que poderá ser enviada para outro multiplicador.

    Se o multiplicando, o multiplicador, ou a entrada carry-in de entrada contiverem algum bit flutuante ou erro, então, o componente irá realizar uma multiplicação parcial. Ou seja, ele irá calcular como tantos bits de mais baixa ordem quanto possível. Mas acima do bit flutuante ou do erro, o resultado terá bits flutuantes ou de erro. Observar que se a entrada carry-in for completamente flutuante, então serão supostos todos os valores iguais a zero.

    Pinos

    Na face oeste, extremo norte (entrada, com largura em bits de acordo com o atributo Bits de Dados)
    O multiplicando (ou seja, o primeiro dos dois números para se multiplicar).
    Na face oeste, extremo sul (entrada, com largura em bits de acordo com o atributo Bits de Dados)
    O multiplicador (ou seja, o segundo dos dois números a serem multiplicados).
    Na face norte, marcado por c in (entrada, com largura em bits de acordo com o atributo Bits de Dados)
    Valor de carry-in a ser adicionado ao produto. Se todos os bits do valor forem desconhecidos (ou seja, flutuantes), então eles serão considerados iguais a 0.
    Na face leste (saída, com largura em bits de acordo com o atributo Bits de Dados)
    Os bits de mais baixa ordem dos Bits de Dados do produto dos dois valores que vierem da face oeste, mais o valor do c in.
    Na face sul, marcado c out (saída, com largura em bits de acordo com o atributo Bits de Dados)
    Os bits mais significativos dos Bits de Dados do produto.

    Atributos

    Quando o componente for selecionado ou estiver sendo acrescentado, Alt-0 até ALT-9 irão alterar o seu atributo Bits de Dados .

    Bits de Dados
    A largura dos bits dos valores a serem multiplicados e também do resultado.

    Comportamento da ferramenta Testar

    Nenhum.

    Comportamento da ferramenta Texto

    Nenhum.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/arith/index.html0000644000175000017500000000364311541757142021270 0ustar vincentvincent Biblioteca aritmética

    Biblioteca aritmética

    A biblioteca inclui componentes combinacionais capazes de executar operações aritméticas com valores inteiros sem sinal e também com valores em complemento de dois.

    Somador
    Subtrator
    Multiplicador
    Divisor
    Negador
    Comparador
    Deslocador
    Contador de Bits
    Indexador de Bits

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/arith/divider.html0000644000175000017500000000723511541757142021610 0ustar vincentvincent Divisor

    Divisor

    Biblioteca: Aritmética
    Introdução: 2.0 Beta 22
    Aparência:

    Comportamento

    Esse componente divide dois valores que vierem através das entradas a oeste e fornecerá o quociente na saída a leste. O componente é projetado de forma a poder ser conectado a outros divisores tratar um dividendo com mais bits que o possível apenas um único divisor. A entrada superior fornecerá com os bits mais significativos dentre os Bits de Dados do dividendo (se isso tiver sido especificado), e os bits em rem serão o resto inteiro da divisão, que pode ser enviado para a entrada superior em outro divisor.

    Se o divisor for 0, nenhuma divisão será feita (ou seja, supõe-se o divisor no mínimo igual a 1).

    O divisor executará essencialmente uma divisão sem sinal. Ou seja, o resto estará sempre entre 0 e divisor -1. O quociente será sempre um número inteiro de modo que

    quociente * divisor + resto = dividendo .

    Se, no entanto, o quociente não couber nos Bits de Dados , apenas os bits menos significativos serão reportados. O componente não oferecerá método algum para o acesso aos bits mais significativos dos Bits de Dados .

    Se qualquer um dos operandos contiver algum bit flutuante, ou com erro, então o componente terá as saídas ou inteiramente flutuantes ou integralmente com valores de erro.

    Pinos

    Na face oeste, extremo norte (entrada, com largura em bits de acordo com o atributo Bits de Dados)
    Os bits menos significativos dentre os Bits de Dados do dividendo (ou seja, o primeiro operando para a divisão).
    Na face oeste, extremo sul (entrada, com largura em bits de acordo com o atributo Bits de Dados)
    O divisor (ou seja, o segundo operando para a divisão).
    Na face norte, marcado por upper (entrada, com largura em bits de acordo com o atributo Bits de Dados)
    Os bits mais significativos dentre os Bits de Dados do dividendo (ou seja, o primeiro operando para a divisão).
    Na face leste (saída, com largura em bits de acordo com o atributo Bits de Dados)
    Os bits menos significativos dentre os Bits de Dados do quociente, conforme especificado acima.
    Na face sul, marcado por rem (saída, com largura em bits de acordo com o atributo Bits de Dados)
    O resto da divisão. Esse valor estará sempre entre 0 e divisor-1.

    Atributos

    Quando o componente for selecionado ou estiver sendo acrescentado, Alt-0 até ALT-9 irão alterar o seu atributo Bits de Dados .

    Bits de Dados
    A largura em bits dos valores a serem divididos e o resultado.

    Comportamento da ferramenta Testar

    Nenhum.

    Comportamento da ferramenta Texto

    Nenhum.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/arith/comparator.html0000644000175000017500000000510011541757142022316 0ustar vincentvincent Comparador

    Comparador

    Biblioteca: Aritmética
    Introdução: 2.0 Beta 22
    Aparência:

    Comportamento

    Serve para comparar dois valores, quer sejam sem sinal ou em complemento de dois, dependendo do atributo Tipo Numérico. Normalmente, uma das saídas será 1, e as outras duas saídas serão 0.

    A comparação será feita a partir dos bits mais significativos em cada número e irá decrescendo, em paralelo, até onde forem encontrados dois valores em desacordo. Se, no entanto, um erro ou valor flutuante for encontrado, então, todas as saídas irão corresponder a esse erro ou ao valor flutuante.

    Pinos

    Na face oeste, extremo norte (entrada, com largura em bits de acordo com o atributo Bits de Dados)
    O primeiro dos dois valores a serem comparados.
    Na face oeste, extremo sul (entrada, com largura em bits de acordo com o atributo Bits de Dados)
    O segundo dos dois valores a serem comparados.
    Na face leste, marcado por >> (saída, com largura de 1 bit)
    Será 1, se a primeira entrada for maior que a segunda; ou 0, se a primeira entrada for menor ou igual à segunda.
    Na face leste, marcado por = (saída, com largura de 1 bit)
    Será 1, se a primeira entrada é igual à segunda; ou 0, se a primeira entrada não for igual à segunda.
    Na face leste, marcado por < (saída, com largura de 1 bit)
    Será 1, se a primeira entrada for menor que a segunda; ou 0, se a primeira entrada for maior ou igual a segunda.

    Atributos

    Quando o componente for selecionado ou estiver sendo acrescentado, Alt-0 até ALT-9 irão alterar o seu atributo Bits de Dados .

    Bits de dados
    Largura dos bits de dados da entrada e da saída do componente.

    Comportamento da ferramenta Testar

    Nenhum.

    Comportamento da ferramenta Texto

    Nenhum.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/arith/bitfinder.html0000644000175000017500000001037011541757142022122 0ustar vincentvincent Indexador de Bits

    Indexador de Bits

    Biblioteca: Arithmetic
    Introdução: 2.6.1
    Aparência:

    Comportamento

    O componente receberá uma entrada multibit e determinará o índice de um bit, onde esse índice será calculado pela contagem iniciando em 0 no bit de mais baixa ordem. O índice exato a ser calculado dependerá do atributo Tipo, como ilustrado nos exemplos do quadro abaixo para a amostra de 8 bits de uma entrada igual a 11010100.

    TipoSaída para 11010100
    Bit menos significativo em 12
    Bit mais significativo em 17
    Bit menos significativo em 00
    Bit mais significativo 05

    Para o 1 de mais baixa ordem, a saída será 2 porque começando o índice de bits em 0 para o bit de mais baixa ordem, o primeiro 1, a ser encontrado será no índice 2. (Os bits de índices iguais a 0 e 1 são iguais a 0). Para o 1 de mais alta ordem, a saída será 7 porque o bit 1 mais significativo corresponderá ao índice 7 (mais uma vez contando a partir do bit de mais baixa ordem começando em 0).

    A saída do componente na face sul indicará se o bit desejado foi encontrado. Nos exemplos acima, envolvendo a entrada 11010100, a saída sul será igual a 1 em todos os casos. Mas se a entrada fosse 00000000 e o componente não encontrasse o 1 de mais baixa ordem, então a saída ao sul seria 0 - e a saída borda a oeste seria 0 também.

    Se durante a pesquisa pelo valor desejado, um valor diferente de 0 ou 1 for encontrado (o bit pode ser flutuante ou um valor de erro), então, as duas saídas serão compostas inteiramente por bits de erro. Observar que isso ocorrerá apenas se o bit com problema for encontrado antes do bit desejado. Para a entrada x1010100, por exemplo, a saída ainda seria 2, se o valor 1 de mais baixa ordem for o desejado; contudo, obteremos valores de erro se o componente estiver a procurar o valor 0 ou 1 de mais alta ordem, uma vez que haverá um bit errado na posição mais significativa independente de ser 0 ou 1 o bit de mais alta ordem.

    Pinos

    Na face oeste (entrada, com largura em bits de acordo com o atributo Bits de Dados)
    A entrada multibit onde será procurado o bit desejado.
    Na face leste (saída, com largura em bits calculada conforme descrito abaixo)
    O índice do bit desejado, a contar de 0 para o bit de mais baixa ordem. A largura mínima em bits será a necessária para armazenar o máximo valor possível para índice, que deverá ser inferior ao valor do atributo Bits de Dados.
    Na face sul (saída, largura de 1 bit)
    Será 1, se o bit desejado for encontrado; 0, se todos os bits à entrada forem o inverso do bit desejado; e será igual ao valor de erro, se um valor diferente de 0 e de 1 for encontrado antes do bit desejado.

    Atributos

    Quando o componente for selecionado ou estiver sendo acrescentado, Alt-0 até ALT-9 irão alterar o seu atributo Bits de Dados .

    Bits de Dados
    A largura em bits da entrada.
    Tipo
    Serve para indicar qual o bit a ser procurado por — o 0 de mais baixa ordem, o 0 de mais alta ordem, o 1 de mais baixa ordem, e o 1 de mais alta ordem.

    Comportamento da ferramenta Testar

    Nenhum.

    Comportamento da ferramenta Texto

    Nenhum.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/arith/bitadder.html0000644000175000017500000000546511541757142021743 0ustar vincentvincent Contador de Bits

    Contador de Bits

    Biblioteca: Aritmética
    Introdução: 2.6.0
    Aparência:

    Comportamento

    O componente determinará quantos bits em 1 estão em sua(s) entrada(s) e emitirá o número total de bits em 1 em sua saída. Por exemplo, para a entrada de 8 bits 10011101, a saída será a 5, uma vez que há cinco bits 1 na entrada (o primeiro, o último, e uma sequência de três bits no meio).

    Se qualquer um dos bits de entrada for um valor flutuante ou erro, então a saída conterá bits de erro na saída correspondente à faixa de saídas possíveis dependendo se os valores de erro/flutuante forem contados como zeros ou uns. Por exemplo, se a entrada de 14 bits for 111x10110x1101, a saída deve ser pelo menos 9 (se cada "x" for interpretado como zero) e no máximo 11 (se eles forem interpretados como um). Assim, a saída será 10EE: os dois bits mais significativos serão 1 e 0, pois todos os inteiros entre 9 e 11 têm 1 e 0 como seus dois primeiros bits, mas os dois últimos bits serão EE já que os inteiros entre 9 e 11 variam dentro desses limites.

    Pinos

    Na face oeste (entradas, com largura em bits de acordo com o atributo Bits de Dados)
    As entradas cujos bits em 1 serão contados. O número de entradas será baseado no atributo Número de Entradas.
    Na face leste (saída, com largura en bits calculada conforme descrito abaixo)
    O número de bits de entrada iguais a 1. A largura em bits na saída será o número mínimo de bits para armazenar o maior valor possível (que seria o produto do atributo Bits de Dados pelo atributo Número de Entradas).

    Atributos

    Quando o componente for selecionado ou estiver sendo acrescentado, os dígito de '0' a '9' poderão alterar seu atributo Número de Entradas e Alt-0 até ALT-9 irão alterar o seu atributo Bits de Dados .

    Bits de dados
    Largura em bits da(s) entrada(s).
    Número de Entradas
    Número de valores de entrada.

    Comportamento da ferramenta Testar

    Nenhum.

    Comportamento da ferramenta Texto

    Nenhum.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/libs/arith/adder.html0000644000175000017500000000606711541757142021243 0ustar vincentvincent Somador

    Somador

    Biblioteca: Aritmética
    Introdução: 2.0 Beta 11
    Aparência:

    Comportamento

    Esse componente adicionará dois valores que vierem através das entradas a oeste e fornecerá a soma na saída a leste. O componente é projetado de modo a poder ser conectado a outros somadores para tratar mais bits que os possíveis para um único somador. A entrada carry-in fornecerá um valor de um bit para ser adicionado ao montante (se for especificado), e a saída carry-out fornecerá um valor de um bit correspondente ao valor de overflow (transbordamento) que poderá ser enviado a outro componente.

    Se qualquer um dos adendos contiver algum bit flutuante ou erro, então o componente irá executar uma adição parcial. Ou seja, ele irá calcular com tantos bits de mais baixa ordem quanto possível. Mas, acima do bit flutuante ou de erro, o resultado terá bits flutuantes ou de erro.

    Pinos

    Na face oeste, norte final (entrada, com largura em bits de acordo com o atributo Bits de Dados)
    Um dos dois valores a serem somados.
    Na face oeste, extremo sul (entrada, com largura em bits de acordo com o atributo Bits de Dados)
    O outro dos dois valores a serem somados.
    Na face norte, marcado c in (entrada, com largura de 1 bit)
    Valor do carry-in a ser acrescentado à soma. Se o valor for desconhecido (ou seja, flutuante), então será considerado como igual 0.
    Na face leste (saída, com largura em bits de acordo com o atributo Bits de Dados)
    Os bits de mais baixa ordem dos Bits de Dados da soma dos dois valores que vierem da face oeste, mais o bit de cin.
    Na face sul, marcado c out (saída, com largura de 1 bit)
    O valor de carry-out calculado para a soma. Se os valores sem sinais somados produzirem um resultado que caiba nos Bits de Dados , então, esse bit será 0, caso contrário, será 1.

    Atributos

    Quando o componente for selecionado ou estiver sendo acrescentado, Alt-0 até ALT-9 irão alterar o seu atributo Bits de Dados .

    Bits de Dados
    A largura em bits dos valores a serem adicionados e também do resultado.

    Comportamento da ferramenta Testar

    Nenhum.

    Comportamento da ferramenta Texto

    Nenhum.

    Voltar à Referência para bibliotecas

    logisim-2.7.1/doc/pt/html/index.html0000644000175000017500000000071011541757136017223 0ustar vincentvincent Bem vindo ao Logisim!

    Bem vindo ao Logisim!

    Unidades do sistema de ajuda do Logisim contêm:

    Guia para se tornar usuário do Logisim
    Referências para bibliotecas

    logisim-2.7.1/doc/pt/html/images/0000755000175000017500000000000011541757142016472 5ustar vincentvincentlogisim-2.7.1/doc/pt/html/images/toplevel.gif0000644000175000017500000000017311541757142021014 0ustar vincentvincentGIF89aP!,@x c/!cf,t-67ON*+FY/k87e7[^JN=KMK:VdPLES4^W*L9/t0Fgzab_s{]Wbn] eo{opmzpXc[''~'{{ed|tCdʂ;e^ƑgVʚY̘vۢɧ{*,АíRƨ{w؊Ǟ\߾ΩԮͼ˒俽̮˿΁}|ˮصտ^9tRNS@fbKGDH pHYs   IDATx흋CwEXbƫ{,dY7,~д:73yͤi mG9s?Í\u'\?农^#)_VWK<+OkG#^`هoF><*)ɭW`y}RVR>=ԣ)J#bdxAO#_\q&LޱRuAAC-ŒN2UC_ p%nInO!=Iv0>9y;yb7R++ʡw+ wkʄ><4Ç6]+M/!`R|=MzO mbe40u9:>BPq?Ŵ_7V}b=ںyބvx?`nQ;|8k&`l m7p~Gt,6 Ix pI*<(U+㆞qғ5~L)=Up1a Q'~Fr2Ro֖2qNxHV\Ap-~0JCC V>_}3No^~l_?\N Icϣ)2"j0e]*&“̛IYuD<3t~jF@'Dߟ|. [IOn[4{*sj=Ճk<Mm#//܀a7':_“ KiP2luߏ|swD ' r ~1ʼn" XQ!{&4`oz{v~k_`/?"1`~Tb9,]*Ʉq:?_|cdSӸZGEC}05cp_z14ѩ3 ʅ}ݿ<MIɩWa;nwG Jh+7;#Ҳ&U失L$c;jcZK颶:e7R#qٌ-;ͤR|>wǤOwmhmh:<^RxR9XMۖlJFm|gڸ4-b)*lZ J|U# rwLwwKi*Z~W-#_ڞn8+WoV!M=<V}Ud3UjrXzҎǔ$l8i]jA.l鮌R'rqύS|YTJrwL\r@xR5qiy\S.*E(n'5e9Y$ mg)s^靆Vىuu.D쪯l{d7;re㩥+2ȹyȹ-`uW<X|N]yt3; ;l[LY|6c NA{ڥ멭 uo3N]3^GCa'IScɏ~RVO>XK࣌#Ih{{HD̥̔U' ֆOV:(ד"G93`JBdhϺJ>IHA)> I]%>I]ZuDǹx׏3Hx#/\K\H+VO?#}lϞ_q+r~|Y4ʸʥ$WHHALÛ}Cf!Pdyo}χ 'CrBs\Z7u=yɫ'w|t=tu|'D_ 5+FMǟNu"JW.} ~p N Ax8:rvꅩjΖŰuOzh15F!wkz$څg@W*~j09"w!0bC?pz}~huoonxo{GΏ϶CgB;t Lߞd/$)7vƁsֽy}J3;GNF:j,`GZw \uvbGΝ̯t:εKX JZG\p y@mE.'`]P:5 X_̰uwH8I)ԂBT0D pIZD|Z-lj0pn2 ح:8!KceҀ!TPJà`4IԨ^˗_;Ƀw CP@ ccX ĹDx>˗/uVD e X*&4%GoeDctS1YEt2Hp"R0O,+s)pq1HȢM/YIŋ*N3^Zp+zXX-7r,чJ̞ X1~%; i$ 0dI#QMD_ 0ѡ7GP[:EhY9<-I v:i IĆ'|eXqL'B=mpvGgOwPK_IРK)N&@RoiIhƀWm f߽~wcqa؍?->+.ͧu0߼{g~ RۆV{$%:xOx{^Ep `f-H[O- o *Hgdq@iZ%PRs-]4s`Zu#izSK5 x{bDmXj` `g%gχ@@9UU ix ,hS;c0 *+u X/C 'r阮󙌼TQKiFܩ`( q|}v1`0'"܉-|xP=`|AtEω@ ȧӞX'S6`r߶$g #U`jІ5DSk/g`LT . @9k"eE?[c-sU P[DGSg }|88W${n@ZY:E󪪷slAEC vH+_{jpjLYyCضE pReApNۀm}+n яWs- B!+ *ѨKT;S!?Ě#>֞l0`| |]EtS!: kksx.tu#YVX+ O2 |0ڙZa ~$F_kKJwr͘5^O-E+_q>k=7 [ |l#xg{0ok¨Ʃ$O{L9 }3fh64ؘ40d-j^5):˛N&sN_?xgt aD8O/~n'b3L~E^e<$ )qQb,?5 &(6ڬN:1u|2U2dBft?I55 jn !{-@tء MUVPN%6W>s  z ې3Lzdy2͹ '`LwnS`7lC["W -*")A57 $phoƝHMLL1ʝ7:Xk4S0eםBT>eE ȼ@*)4P5/&Dl `CegNYw X>pY$HYN`2]Rd{?{9*R#:;[0&(PLc=>X_Z;K-x3ȄmTLzR%&`"{L&-`5t[߳푾gB+ڰr8;r~8_Q͌n?>1Y5@4C2gNo޴*SI X)qol-R'x@Zk6d (0lo?AAÛ5L ?&X8XUAA@LJ`^LU3NC%5A"!=^5R5=HVNjc{ZG@@4Xy!fEsxA7s1.dқz1{J:_ t&F =.S/NpȠF[+=k|,us4oP8z^48iN> vΘ&a훭 p>| 6`#_ ]OpE@H:\ܬ5Mkf|uVF0HXC+=j_E304ƜvEtpL h٨z\0}>dWU\&߷;u^{] !\clH0O30qZQ[n/NZ9?1\eLV#w%#SU4@zxhpo)x)|5<-lq,BD{LfgE&Wn&lObskp1su^/Y76"`]PƺTZJDQ@t$TL-~ [O]6mU<fȺ ka02lc11Y&`A  K|$a<?Uf,/"\JEu'd!hqZzV)kBɸ*+ w2 X qf@IR]"D 6&!aZрXDd&ͭ08k𲀩PD9:o:_K 5|5=eα%#16cEv *v,A;6.ɝrd\;#t&uaG@Y|ѱbݭDF)%@0&|&}DRTAm#BhK@ZApj!)\2#JݪKX3ԲLOXwyHYt` j0C ujS eK ө4G0SXGW L,) WCc/LhIK'`//eP 4IS$z|³0vmqd4}rmunpv8u=s4V`wkzqm!*ب 9)f[nWJ=Դ$\7_'Ó0`7%g~WL|g0e#:D[CP-j98|/iEG9>!;!"-Xl Q=DtBvdk\+`gn{{{]*Y8+ `-UrlLx;j8`Ɗ<}*dѱ[o;,Lb?irsQL`LAE1YzdYE{lh{;5ذR-Z {hؼJAēҞ,[5VI)LXlg1h$}:50τKIDATc̸*i&р>~o@wad/t}n[꫑Wi}DͻwpWt"}4f%a6Dkuwk/'zÅ!6"b-9wƀ*Kj~g^2OFN Pf-I#G<A{^SgыWX+q>&Q#iVJΙ9j !͸m Kϓe6CE# "f XXW' }wnDzk+d{>fϑ1tALM35opOĝ58hp`#-z*,%:ڊ5XK$pih͓e5QDU$7`9T0O# T4&ƝǤ**U/:oHUUq ~<_+ہY XiFUJ[un'h;(O3cj$J+Xj 9D9"''K\B99tP`UK^!J ۇKv\5yA,Ъ,o5'Ki$\#`(T?eʁ ,[fY4p%kJ}ĄK"QνyoJS.}v/9dȇ1>JqPngÜl1^e'aѱfZ&#'ggEb]# 2|H]~U9<2`ړuWHתvVkpV'8\2eE dA7hpLh^C>|D&ȁj63hXG 8xxJ.=o4p@bn+1YvaAw4QVwbDZcp<5Q5Ÿ\6L fWEgs tU#D74ƓehOQqt) Xߵ6y?vUfpnT`~;nVU70*_+.G}qU0GOnM?Y'#3B:8C I~o!B'˹*͠כlÛ3G# pfXӛ{CbϓU𫑥UIݽ͆y!oo`A!1"z 'W1 BnWCxe# ~v[YRffS$eDS*a6|m,}B4^T۵ %Cf^ٻ?9֪:ecNCZ{.8 BxqI(Z'Lw)*k&OS"xŇ~֭Ňؠ;]߯ϓZA̮PҊ>1Gn~L$%nabaޤ+| 3LP1Amǖ[,\6]g;/kϲ5<:FE͘RW]nmfwb+4 2?ϼO&F|iq5JՇXnyY,;o0`?;3+NI-1{\~R4LxXCSrLukRhYѥWP*(Ȫ߹F+{sEi1Y XL:R5ЕV zg jpC"UrJ3yk0%CG48&L&Aap÷܍装W o_RW|z>3u34 `vw֑R` >) d2̩Op&L** o>3wW n>QpL f,yz~]n 0V7Oas(ZYT#CP(DِR\|.7{c̗X&`:esҺvր+jC4D.Q< zhaT,)sU;\Ȝչh|N*,`:`)Y$!u:+<2Zty#+1`:s4Mt Ǟ8FdՕV Z /9&.zсV]g$X)6HngWbb+蘬zJ^= \epVwZg 5󩹧*҅3upeU൉'#+Ý/f7\x"1\~;[U9NHcd( }C ›o KXҀo/8{w<|jˇNA\w-EB/fh+3;PUgxr]LWIphӓ5GWgGLz|c eK.L  L.cXkLn67(ɭWpR[_߹ow+DNa-^L֧wHln{q;R0wga"7LHZ{1 ]` ޜųT:'ѾUrEX> Y&&DךpY\m=`s=)T$w{^ңg -w)w0ovz7gvXS㩹t3\5]ʸ>Mi:8>_O:K/qp j%v 5px:8&%xt"f^8QstuQDIDʀAHQsٰrZ`, nhK8$ n xE $Cz|RLA9ZqU su͹" DHkxlg")bLcޅ^bW1&Kȋv>71Yr2c[$qpEfU,!Z⹯c!: 8!J P  m V`li^KgͤIƣQ[Z<'`-(TXA5ko%`{*|S2eodE  دD@Dk'%L\`/ȚǬWp|-/N *h{xW5t姟?ˠOαƉ PsNL"\ -骄kʀ3Y_tq.dj'KWƌ7~K CF7{0`|0>^=M5^v}Q1Ct&ۃvk|lxA @(W]W.=Yu&]'`8;N^]x  y'}XJ eGJh6CgTNzwZxc,U k_/P?! o2!) X) XEZ,`!EsYS?9p0@?Fя`x-pڳ`A^a V)WO/g'K.GfD{)mQ9TÆ %(1 N( υuq}(۞e֚KZ``2y r8Yf 6 dQW3 IщTA X]תvcbrQP2O*1`dAG6 !àqY_ɺa\) qi D 1KE۷ZQjp̡BԪhs G mh^YjG c;:tZQj=@ |F30/pK :XQ*3by0QɌ43^0jV)dՇxFlV4A^@Vr聼RŠJ[Cnz"Ty(0̈YYA4 wZK+ 3UZmddMa'[+5ڤ.΅7xN ~45X/lpp/M( |k,u`=B;ĭ;e\qe1xM gQ`[55'wVi^LB+;\?:b3&K}@@;!Iwʤ+3K+WcЀHvI 'dbW^4NGujJ6]6k`}R4S9^0̯Ue7]]ͤ1{@?7dK~2h77sl9 s+Nz7W'd0|g"dvY2LwU>b!>R"sm`Bks4JdJ)E5f,EuIIJ0t9>|N@3'2Ԥvw7]By2~ r'.]Ι)K7Ppi m X"Q\.ЅBHP(ڦ؀Ϧ^vXWp|NI>%lL-yq`(^=r-'K@9XXgC䘬SfŊ2^l>C pf٭ 0{G?>yX-RD7| fךqc}_=:as1EQ@pfzZGp-\=b*uU:B8 cdÿ+vUbM-,p纊3DGf~QX~9r3 _#}f5+y=0"="˲lvù=X@ |󻑾JfnD1]7]p*Yf/[3Ck72^&T71&)"[4;g+x$|0[HS7{'bI+?^wD71ڬs XU G n~Xמ=‹nd{F)#r oΜQf=SI~W<֓ٗ \8& cUTRр`Qb`'q}GCd`$^O>"X9܉-A|'xX+Y\*$b8?:>?B*,5N _hE W?V1ˢR;(&ػ54 LkαKZbO6`3&8Ԍof sl)^ig X^. pVغQhߵR4ZH)Oz%'jۙn_[$Ή@hh:bm *Smk>A3W`w!`1ac<Ӆ ň\H̱͝ Q;FknS( =/EB^u῀hp+.PE0r왯EC v8}ny4<yֈAp; T€hd4e[pan:`sYMG&`s@Ʉ w,p8 +p?+ϘR`xv[ǞL5p xwwY`v~ác_`p[.\n}J .3;d:`3&1E4Ju6, T>mn&11Y *,FZ"I䳋h3n)Q"WZ;:Jw痶Cam3\*eY3Ie]hp$R %j= tuIrNJnyFH@ AqnfӹT <}z=ēڣGxrzS74[TJO!ƈ_7Tk|LW,#M`iIENDB`logisim-2.7.1/doc/pt/html/images/chapTopic.gif0000644000175000017500000000017011541757142021071 0ustar vincentvincentGIF89afff!,@=H* fs z CG:(!:TRFvi*n-Kг-"$vAjKUy;logisim-2.7.1/doc/pt/html/icons/0000755000175000017500000000000011541757142016340 5ustar vincentvincentlogisim-2.7.1/doc/pt/html/icons/xorGateRect.gif0000644000175000017500000000016511541757142021260 0ustar vincentvincentGIF89a!Created with The GIMP! ,-h"mYu]d:V)qi{un-;logisim-2.7.1/doc/pt/html/icons/xorGate.gif0000644000175000017500000000161211541757142020440 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,g H?(@ۣС?HA7NH+""H+ B| LbD)NS ȍFhgǏ%>P&X;logisim-2.7.1/doc/pt/html/icons/xnorGateRect.gif0000644000175000017500000000017211541757142021434 0ustar vincentvincentGIF89a!Created with The GIMP! ,2y#hNJ dm~yQX"LIJ0RO3H ;logisim-2.7.1/doc/pt/html/icons/xnorGate.gif0000644000175000017500000000161511541757142020621 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,j H?(b B{ l(P+l)x$R {)> 2Ɓ+YfĎ&AXf\ޔX'gJ yD;56uQʄ 5qj0 ;logisim-2.7.1/doc/pt/html/icons/wiring.gif0000644000175000017500000000012711541757142020326 0ustar vincentvincentGIF89a-o-P! ,( 3A)߆0^ImVh#sF;logisim-2.7.1/doc/pt/html/icons/tunnel.gif0000644000175000017500000000017011541757142020332 0ustar vincentvincentGIF89a!Created with GIMP! ,(H0I. p`@`hbfaST[G(Y/+!327H" ;logisim-2.7.1/doc/pt/html/icons/text.gif0000644000175000017500000000022111541757142020006 0ustar vincentvincentGIF89a )))777MMM\\\jjj~~~! ,>I؂\8d>$m$>i`) @@.2F9&4DU%#Kr5Dl[piV%AH" ;logisim-2.7.1/doc/pt/html/icons/select.gif0000644000175000017500000000013611541757142020306 0ustar vincentvincentGIF89a! ,/ɢ{ IY;e㖪(V^2Ri肇آ;logisim-2.7.1/doc/pt/html/icons/rom.gif0000644000175000017500000000013711541757142017625 0ustar vincentvincentGIF89a! ,0)ςƊ5nMM$Yz` y9'<@ P;logisim-2.7.1/doc/pt/html/icons/register.gif0000644000175000017500000000017611541757142020657 0ustar vincentvincentGIF89aUUU! ,CH 0J8zA C |VʒKX䇊4Sfk`1N%d_Cbeux ;logisim-2.7.1/doc/pt/html/icons/random.gif0000644000175000017500000000036211541757142020310 0ustar vincentvincentGIF89a66;NOT]``ssu! ,o $diqd(L03y7 X4 C>49By=/aу@!(4KP eG/}  &Qr , }r,"$!;logisim-2.7.1/doc/pt/html/icons/ram.gif0000644000175000017500000000013611541757142017606 0ustar vincentvincentGIF89arrr! ,/9ςƊ5nMM$Yz ʪyYσ;logisim-2.7.1/doc/pt/html/icons/pullshap.gif0000644000175000017500000000010611541757142020654 0ustar vincentvincentGIF89a! , "mQo͚_^~3v紦+S;logisim-2.7.1/doc/pt/html/icons/pullrect.gif0000644000175000017500000000012311541757142020655 0ustar vincentvincentGIF89a! ,$ -"M-QކedUN}S;logisim-2.7.1/doc/pt/html/icons/projup.gif0000644000175000017500000000012311541757142020342 0ustar vincentvincentGIF89ajl! ,$PIkYQydgY^э#;logisim-2.7.1/doc/pt/html/icons/projlayo.gif0000644000175000017500000000015611541757142020670 0ustar vincentvincentGIF89ad! ,3H 8C·weg)Z g7,*bGЧaPrH;logisim-2.7.1/doc/pt/html/icons/projdown.gif0000644000175000017500000000012311541757142020665 0ustar vincentvincentGIF89ajl! ,$\y H hikzvc;logisim-2.7.1/doc/pt/html/icons/projdel.gif0000644000175000017500000000012511541757142020464 0ustar vincentvincentGIF89a}! ,&ˑB#zyJ]#h&GY͓;logisim-2.7.1/doc/pt/html/icons/projapp.gif0000644000175000017500000000016411541757142020503 0ustar vincentvincentGIF89ad! ,9x 0JJB&1AYaR0E} |3m o1c$Pԑ;logisim-2.7.1/doc/pt/html/icons/projadd.gif0000644000175000017500000000012511541757142020450 0ustar vincentvincentGIF89awDD! ,& D)Ź^iM2̜;logisim-2.7.1/doc/pt/html/icons/probe.gif0000644000175000017500000000021311541757142020132 0ustar vincentvincentGIF89a?@>~ڥ! ,80IX=rGxlPbUS!P,6w }?XRr##X;logisim-2.7.1/doc/pt/html/icons/priencod.gif0000644000175000017500000000013711541757142020633 0ustar vincentvincentGIF89a! ,0ˍUDqeyY)u(1\a5 BĢP;logisim-2.7.1/doc/pt/html/icons/poke.gif0000644000175000017500000000022111541757142017760 0ustar vincentvincentGIF89aaKqV!"Created with The GIMP"! ,;1^a{WޝqGJ8P5cUqgx+DSOAC1Γ&%;logisim-2.7.1/doc/pt/html/icons/pinOutputReversed.gif0000644000175000017500000000023011541757142022531 0ustar vincentvincentGIF89a@@@ڤUUT! ,EIX 2Al A U@PQq u;G#$B ?wkjNU˪HC&G;logisim-2.7.1/doc/pt/html/icons/pinOutput.gif0000644000175000017500000000023011541757142021031 0ustar vincentvincentGIF89a@@@ڤUUT! ,EIX 2Al A U@PQ0ZaP1Ž&MCC {̣lw{OU HC.#";logisim-2.7.1/doc/pt/html/icons/pinInput.gif0000644000175000017500000000022711541757142020636 0ustar vincentvincentGIF89aڤUU! ,DI5A( A BXN@tAu=Ӭg^#L3P*:"}:`x|;logisim-2.7.1/doc/pt/html/icons/parityOddGate.gif0000644000175000017500000000166711541757142021601 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~!Created with The GIMP! ,{@Aǐq $PNcTEPqU2(1c C:°B䌬%4˨J?WV'Ѕ 4!ʣ Q@fʆ\ΪL2 fԧ;logisim-2.7.1/doc/pt/html/icons/parityEvenGate.gif0000644000175000017500000000165011541757142021760 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~!Created with The GIMP! ,l@Aǐq $PNcTEPqU2(1c C:°B䌬%4˨J?WV'Ѕ 4TѦIB]rϛVN=z;logisim-2.7.1/doc/pt/html/icons/orGateRect.gif0000644000175000017500000000025611541757142021071 0ustar vincentvincentGIF89arrrUUU!Created with The GIMP! ,B=@R}mm D!tlu'wUd ##F"&:]֫(Z);logisim-2.7.1/doc/pt/html/icons/orGate.gif0000644000175000017500000000157711541757142020262 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,\ H?v1X{2 L<"D ]YxH#=30J U^jsS@3?22DF&iS;logisim-2.7.1/doc/pt/html/icons/notGateRect.gif0000644000175000017500000000016311541757142021246 0ustar vincentvincentGIF89a!Created with The GIMP! ,+ˍ/؋Ay[Qvʖ)fw3 & ;logisim-2.7.1/doc/pt/html/icons/notGate.gif0000644000175000017500000000155711541757142020440 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,L H <Br0?^87^_I$ʏ"11PΟ@;logisim-2.7.1/doc/pt/html/icons/norGateRect.gif0000644000175000017500000000026311541757142021245 0ustar vincentvincentGIF89arrrUUU!Created with The GIMP! ,GI|X;Z&FD!%HrvUt"aUveS,ި6{r]ZےXΙ;logisim-2.7.1/doc/pt/html/icons/norGate.gif0000644000175000017500000000160611541757142020431 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,c H?v1X{2 L<"D ]YxH#=3yAMu2}2iKd㾏 8G д*À;logisim-2.7.1/doc/pt/html/icons/negator.gif0000644000175000017500000000156711541757142020477 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,T H@*TxÇhD*ZŌ7+ I#Ē#[bɐ#KQˎ7{\H;logisim-2.7.1/doc/pt/html/icons/nandGateRect.gif0000644000175000017500000000027211541757142021367 0ustar vincentvincentGIF89aUUUrrr999!Created with The GIMP! ,NI|X;&  eV{rQ 6!ຄ@ rPcnoV|Xޙ;logisim-2.7.1/doc/pt/html/icons/nandGate.gif0000644000175000017500000000160411541757142020551 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,a H*"JW,aA%; ƌu?H#LʕI4mfliQD$arcʗ>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~!Created with The GIMP! ,Y H@*TxÇhD$$㿋;n'R"E4#‘,=:"ȇ"W~r͏0QƬh$ј "4Ȕ`@;logisim-2.7.1/doc/pt/html/icons/multiplexer.gif0000644000175000017500000000022511541757142021400 0ustar vincentvincentGIF89aP??? ! ,BIW0QgE: kw4k!Ɨyza4H J5Hme';logisim-2.7.1/doc/pt/html/icons/menu.gif0000644000175000017500000000015711541757142017776 0ustar vincentvincentGIF89arrrTTT! ,4H0`*;`(uli tmpt5b<Ȍfd$;logisim-2.7.1/doc/pt/html/icons/led.gif0000644000175000017500000000017611541757142017577 0ustar vincentvincentGIF89a ]fUJ1! ,Cx: 2[&d| l<*߬@g.**/'] ex! ;logisim-2.7.1/doc/pt/html/icons/keyboard.gif0000644000175000017500000000035611541757142020633 0ustar vincentvincentGIF89ahjgopnꀂZבf騪۹! ,k $di,L*.8 Җ!3b1TA`. qlxe5!;( @WMka^w/E`vxC$WEl(WxP.9!;logisim-2.7.1/doc/pt/html/icons/joystick.gif0000644000175000017500000000032611541757142020667 0ustar vincentvincentGIF89a |&'%443>?>FFFPPPY[XGGgifM5porr}|֍! ,S'diqE:PL=&>#@0!"m,Cb@(K"l c8Љr:BT>0!;logisim-2.7.1/doc/pt/html/icons/jkFlipFlop.gif0000644000175000017500000000014511541757142021067 0ustar vincentvincentGIF89awww! ,6iTXuHFɁʦB@M?2z(&;logisim-2.7.1/doc/pt/html/icons/hexdig.gif0000644000175000017500000000017211541757142020277 0ustar vincentvincentGIF89aCsCCC! ,?x 0J@Sf ߵ=EŨXff{u-,>^WIS";logisim-2.7.1/doc/pt/html/icons/extender.gif0000644000175000017500000000012511541757142020643 0ustar vincentvincentGIF89a! ,& 0Iۡׄu'&yflf]tԺU;logisim-2.7.1/doc/pt/html/icons/drawrrct.gif0000644000175000017500000000023711541757142020661 0ustar vincentvincentGIF89a ak|s  ! ,LIw$rFM2gZ$,.iEAԏ[g%c=fЩCezi,Q 8f;D;logisim-2.7.1/doc/pt/html/icons/drawrect.gif0000644000175000017500000000022111541757142020635 0ustar vincentvincentGIF89a ak|s  ! ,>I8k _  $rFQ,LFsC'}xHXfv#;logisim-2.7.1/doc/pt/html/icons/drawpoly.gif0000644000175000017500000000022711541757142020671 0ustar vincentvincentGIF89a ` l|w   $ ! ,DI8S4D=BbV*IqӚ ȁB.CAA1(zӑx;logisim-2.7.1/doc/pt/html/icons/drawplin.gif0000644000175000017500000000014711541757142020651 0ustar vincentvincentGIF89aa lw! ,,H02$Z"xQdհAמ< 1D7pI;logisim-2.7.1/doc/pt/html/icons/drawpin.gif0000644000175000017500000000020211541757142020465 0ustar vincentvincentGIF89a r 98@>FEhhЀ! ,/)IJ4O5t J)"E;B KpO_P]r؊;logisim-2.7.1/doc/pt/html/icons/drawoval.gif0000644000175000017500000000023311541757142020644 0ustar vincentvincentGIF89a a ku  ! ,HI8cz[0 q_ JBF!Ҫ˴ܮP $>`ngpBCl6a*  Q4 ֘hJ;logisim-2.7.1/doc/pt/html/icons/drawline.gif0000644000175000017500000000007511541757142020636 0ustar vincentvincentGIF89ak! ,cڮŎ;logisim-2.7.1/doc/pt/html/icons/drawcurv.gif0000644000175000017500000000011411541757142020660 0ustar vincentvincentGIF89aef! , xb&KoNa#u38J;logisim-2.7.1/doc/pt/html/icons/drawarc.gif0000644000175000017500000000012711541757142020452 0ustar vincentvincentGIF89aa lw! ,80BA ;.^X~5iԮk;logisim-2.7.1/doc/pt/html/icons/dotmat.gif0000644000175000017500000000017211541757142020317 0ustar vincentvincentGIF89aCC! ,?H 0J8:B}37,a'gs@ Eܙz!MelBrU ׈";logisim-2.7.1/doc/pt/html/icons/divider.gif0000644000175000017500000000155711541757142020465 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,L H@*TxÇhD""HF3VQ!Mq$˒ EzlL._O@ ;logisim-2.7.1/doc/pt/html/icons/dinXorGate.gif0000644000175000017500000000160211541757142021072 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,_ H,0h2a#&Xv':RȆ=Svȍ7|!K1H@Ś 'xLz&LARP ;logisim-2.7.1/doc/pt/html/icons/dinXnorGate.gif0000644000175000017500000000157711541757142021263 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,\ H,0h2a#&XbƉ7ÓJ ȕ'r#Ɂ"tN%L'sHς >>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,V H,0h2a#&`Ɖ*>)#Cl8rǂ(@:)JJ>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,V H,0h2a#&h1D!yldB'r'v. rCz"{LAPH ;logisim-2.7.1/doc/pt/html/icons/dinNorGate.gif0000644000175000017500000000157111541757142021065 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,V H,0h2a#&`Ɖ*>)#C?6cATdIҤ?:)͕J>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,W H,0h2a#&XbƉBɍ C(J%M9%HwQgAF,*5;logisim-2.7.1/doc/pt/html/icons/dinAndGate.gif0000644000175000017500000000157211541757142021032 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,W H,0h2a#&XbƉBIe$ |1(AI%\xQ'F*%;logisim-2.7.1/doc/pt/html/icons/dFlipFlop.gif0000644000175000017500000000014211541757142020703 0ustar vincentvincentGIF89awww! ,3iTX`>uBQ ˥$ܚ+m~^ՂP(;logisim-2.7.1/doc/pt/html/icons/dff.gif0000644000175000017500000000033611541757142017570 0ustar vincentvincentGIF89a./-;=:MOL]_\qspz{y~! ,[ $d)h㾰 ON hCS@Oa;logisim-2.7.1/doc/pt/html/icons/comparator.gif0000644000175000017500000000156611541757142021206 0ustar vincentvincentGIF89a>  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,S H@*TxÇh&bD;^|B1ܨcʌ WtƒkdQ'ɗ-A.РQ;logisim-2.7.1/doc/pt/html/icons/clock.gif0000644000175000017500000000016311541757142020122 0ustar vincentvincentGIF89aUUP! ,8xI%! A`B)|Bf'@dwz`a 2:ޱ88!#;logisim-2.7.1/doc/pt/html/icons/button.gif0000644000175000017500000000022211541757142020336 0ustar vincentvincentGIF89a.*LMuswvvת! ,?I8<`x`'@\'-f>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~!Created with The GIMP! ,D H <Br0?^8ƍU""IB<#F#‡8s ;logisim-2.7.1/doc/pt/html/icons/bitSelector.gif0000644000175000017500000000024711541757142021311 0ustar vincentvincentGIF89aP??? !Created with The GIMP! ,;08 EUc (\5D'U>R';logisim-2.7.1/doc/pt/html/icons/bitfindr.gif0000644000175000017500000000022011541757142020622 0ustar vincentvincentGIF89a,-+YZX{}z! ,=I8k}tA ~ ܆ B$\6XeK;logisim-2.7.1/doc/pt/html/icons/bitadder.gif0000644000175000017500000000014111541757142020601 0ustar vincentvincentGIF89a! ,2iThAW0\>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,Y H*"JW,aA%; ƌu?H#,eI.WJ)%I'iqƔ*3C B4ut`@;logisim-2.7.1/doc/pt/html/icons/adder.gif0000644000175000017500000000043511541757142020110 0ustar vincentvincentGIF89an/xxggN# 'yPkk` {! ?,:pH, ȤRy 8P'N(RK}n,X.RY֒X77>;>>DA;logisim-2.7.1/doc/pt/html/icons/7seg.gif0000644000175000017500000000017511541757142017677 0ustar vincentvincentGIF89aCsCCC! ,Bx `+h/E \b*kϟ6ls }AW--MOT%̤";logisim-2.7.1/doc/pt/html/guide/0000755000175000017500000000000011541757136016325 5ustar vincentvincentlogisim-2.7.1/doc/pt/html/guide/verify/0000755000175000017500000000000011541757140017624 5ustar vincentvincentlogisim-2.7.1/doc/pt/html/guide/verify/sub.html0000644000175000017500000000705511541757140021312 0ustar vincentvincent Substituir bibliotecas

    Substituir bibliotecas

    Agora suponha que tenhamos dois circuitos do Logisim que deveriam fazer a mesma coisa. Como instrutor, você poderia ter pedido aos seus alunos concluírem uma tarefa. Você tem um arquivo que contém sua solução, mas também vários arquivos de alunos contendo seus trabalhos. Talvez a tarefa tenha sido construir um somador de dois bits.

    Imaginarei dois arquivos, chamados adder-master.circ e adder-query.circ. Cada arquivo conterá um circuito chamado 2-bit adder (é importante que o circuito para teste seja chamado exatamente igual), cuja aparência poderá ser a seguinte.

    adder-master.circ adder-query.circ

    Como você poderá ver, o circuito principal usará o somador predefinido no Logisim, enquanto o circuito para teste usará dois subcircuitos representando uma meia-soma e uma soma-completa (os quais serão constituídos apenas por portas simples). Para os fins do nosso exemplo, o circuito para teste terá um erro estúpido: O carry da meia-soma não estará conectado à soma completa.

    Nós construíremos o nosso circuito de teste em um arquivo diferente. Lá, carregaremos adder-master.circ como uma biblioteca do Logisim (Projeto > Carregar Biblioteca > Biblioteca do Logisim ...), e inserir seu somador de 2 bits como um subcircuito. Nós poderíamos executar esse circuito diretamente para obter a saída desejada para uma solução perfeita.

    java -jar logisim-filename.jar adder-test.circ -tty table

    Mas queremos executar o circuito usando adder-query.circ ao invés de adder-master.circ como o da biblioteca carregada. A abordagem ingênua seria abrir Logisim e carregar essa biblioteca de uma vez; ou você poderá simplesmente remover o adder-master.circ e renomear adder-query.circ para ser chamado de adder-master.circ em vez disso. Mas Logisim inclui uma prática opção sub que substituirá temporariamente um arquivo por outro durante a sessão - sem fazer quaisquer alterações em disco.

    java -jar logisim-filename.jar adder-test.circ -tty table -sub adder-master.circ adder-query.circ

    A saída que você iria ver a partir disso é mostrada abaixo, naturalmente é diferente daquela vista na seção anterior já que agora será a execução usando o adder-query.circ errado.

    00      00      0E0
    01      00      0E1
    10      00      EE0
    11      00      EE1
    00      01      0E1
    01      01      0E0
    10      01      EE1
    11      01      EE0
    00      10      EE0
    01      10      EE1
    10      10      1E0
    11      10      1E1
    00      11      EE1
    01      11      EE0
    10      11      1E1
    11      11      1E0
    

    Próximo: Outras opções para verificações.

    logisim-2.7.1/doc/pt/html/guide/verify/other.html0000644000175000017500000001142611541757140021637 0ustar vincentvincent Outras opções para verificação

    Outras opções para verificação

    Existem algumas opções adicionais relacionadas com a execução pela linha de comandos.

    O parâmetro -load na linha de comando

    Um circuito mais complexo poderá incluir um componente de memória RAM que precisará ser carregado com um programa para que o circuito possa usá-lo. Você poderá especificar um arquivo de imagem da memória na linha de comando, que será carregado em qualquer componente de RAM no circuito antes da simulação começar. (Isso não funcionará quando se carregar a interface gráfica - só servirá para a execução de linha de comando.)

    java -jar logisim-filename.jar cpu.circ -tty table -load mem-image.txt

    A ordem dos parâmetros não é importante (exceto para o parâmetro table que deverá ser imediatamente após -tty , e o nome do arquivo de imagem da memória que deverá ser logo após -load ). O arquivo de imagem deverá estar no formato de imagem da memória do Logisim .

    O Logisim pesquisará pela RAM recursivamente, de modo que esse continuará a funcionar mesmo se a RAM estiver embutida em um subcircuito. Não há maneira alguma, no entanto, de distinguir diferentes componentes do tipo RAM: o Logisim irá tentar carregar o mesmo arquivo em todas as RAMs que puder encontrar.

    Opções para o parâmetro -tty

    Em nossos exemplos até agora, sempre usamos tabela -tty table para indicar que uma tabela de valores de saída deverá ser exibida. Você poderá personalizar o comportamento de outras formas, listando uma ou mais opções, separados por vírgulas. Por exemplo, você poderá escrever -tty table,halt,speed, e o programa irá executar todas os três comportamentos listados abaixo. (A ordem em que estão listados não importa.)

    halt

    Após a simulação terminar, aparecerá uma mensagem de uma linha explicando porque a simulação terminou. Condições de erro - como uma oscilação detectada - serão exibidas em qualquer caso.

    speed

    Se você usar essa opção em conjunto com -tty , em seguida, depois que completar a simulação o Logisim irá exibir um resumo de quão rápido o circuito foi simulado, tal como:

    714 Hz (509 ticks in 712 milliseconds)

    Observar que a exibição de informações durante a simulação fará a simulação ser muito mais lento. Como apenas uma comparação, para o mesmo circuito e imagem funcionou acima de 714 Hz com a opção speed e apenas a 490 Hz com a opção table também.

    statistics

    Mostrar uma tabela delimitada por tabulações contendo dados estatísticos sobre os componentes utilizados pelo circuito principal no projeto. A tabela inclui quatro colunas:

    • Exclusiva: O número de vezes que o componente aparecer na hierarquia do circuito, onde cada subcircuito dentro da hierarquia será contabilizado apenas uma vez.
    • Recursiva: O número de vezes que o componente aparecer na hierarquia do circuito, onde contamos cada subcircuito quantas vezes ele aparecer na hierarquia.
    • Componente: O nome do componente
    • Biblioteca: O nome da biblioteca a partir do qual o componente veio

    A distinção entre exclusiva e recursiva também está explicada na seção menu de Projeto . Se o arquivo utilizar circuitos de uma biblioteca carregada do Logisim, os componentes serão considerado caixas pretas : o conteúdo dos circuitos da biblioteca não serão incluídos na contagem exclusiva ou recursiva.

    (Esse recurso pode ser útil para os instrutores que peçam aos alunos para criar projetos com um subconjunto de bibliotecas de Logisim.)

    table

    (já visto)

    tty

    Quaisquer componentes TTY enviarão suas saída para a tela (saída padrão), e todas as informações digitadas no teclado serão enviadas para todos os equivalentes no circuito. Esses componentes serão incluídos, mesmo que sejam profundamente aninhados à hierarquia do subcircuito.

    Próximo: Testar múltiplos arquivos.

    logisim-2.7.1/doc/pt/html/guide/verify/multi.html0000644000175000017500000000623611541757140021653 0ustar vincentvincent Testar múltiplos arquivos

    Testar múltiplos arquivos

    Em um exemplo de sala de aula, você poderá ter vários arquivos que deseje testar a equivalência, e você pode não querer ler as saídas para cada uma das soluções do aluno.

    Construir comparações de circuito

    Uma abordagem é a construir um circuito para testes que fará a comparação direta. Criaremos um circuito adicional no arquivo para testes que conterá nosso circuito com a solução. Nosso circuito de teste global, incluirá o subcircuito adder-master.circ e o subcircuio com solução acoplados em um mesmo circuito. Conexões serão feitas para que haja apenas uma saída, que será 1, quando os dois subcircuitos concordarem.

    Agora podemos simplesmente executar o Logisim substituindo cada arquivo de consulta. Para qualquer solução correta, haverá uma única saída igual a 1 .

    Usar redirecionamento e "shell scripts"

    Se você estiver completamente confortável com a linha de comando, você poderá construir seu próprio shell script para fazer isso. Aqui, vamos usar o redirecionamento (o operador>) para salvar a saída de cada circuito em um arquivo. Por exemplo, poderíamos emitir os seguintes comandos para coletar a saída do circuito principal e do circuito de consulta.

    java -jar logisim-filename.jar adder-test.circ -tty table > output-master.txt
    java -jar logisim-filename.jar adder-test.circ -tty table -sub adder-master.circ adder-query.circ > output-query.txt

    Agora teremos criado dois arquivos diferentes. Poderemos então comparar os dois arquivos de saída usando um programa construído para esse fim. Em Linux ou MacOS X, você poderá usar o cmp ou diff utilitários de linha de comando. No Windows, você poderá usar o WinMerge.

    Para processar vários arquivos de consulta, você poderá construir um programa simples como um script shell para percorrer cada um e comparar o resultado. Aqui está como eu faria isso no Linux com bash

    RUN_TEST="java -jar logisim-filename.jar adder-test.circ -tty table"
    ${RUN_TEST} > output-master.txt
    for QUERY_FILE in adder-query*.circ
    do
      if ${RUN_TEST} -sub adder-master.circ ${QUERY_FILE} | cmp -s output-master.txt
      then
        echo "${QUERY_FILE} OK"
      else
        echo "${QUERY_FILE} different"
      fi
    done

    Próximo: Guia do usuário.

    logisim-2.7.1/doc/pt/html/guide/verify/index.html0000644000175000017500000000613111541757140021622 0ustar vincentvincent Verificação pela linha de comando

    Verificação pela linha de comando

    Subseções:
    Substituir bibliotecas
    Outras opções para verificação
    Testar múltiplos arquivos

    O Logisim inclui suporte básico para a execução de circuitos a partir da linha de comando. Isso destina-se tanto para ajudar a verificação orientada de projetos de circuitos, quanto para que instrutores realizem testes automatizados em soluções feitas por alunos.

    Vamos começar por mostrar como executar um circuito pela linha de comando. Para o nosso exemplo, vamos supor que tenhamos construído o circuito a seguir em um arquivo chamado adder-test.circ. Ele utilizará um somador de dois bits como um subcircuito e iterará através de um contador com todas as 16 possíveis entradas para ele.

    Após esse circuito ter sido construído, executaremos a linha de comando do Logisim, fornecendo o nome do projeto e a opção -tty opção com o parâmetro table.

    java -jar logisim-filename.jar adder-test.circ -tty table

    Sem abrir qualquer janela, o Logisim carregará o circuito e começará a executá-lo, variando qualquer clock tão rápido quanto possível até concluir a propagação entre cada instante. Após cada propagação ter sido concluída, o Logisim carregará os valores atuais dos pinos de saída; caso tenham mudado na propagação anterior, os valores serão exibidos em formato delimitado por tabulações. Se houver um pino de saída marcado com a palavra especial halt , sua saída não será exibida - mas uma vez que o valor do pino chegue a 1, depois que uma propagação for concluída, o Logisim terminará a simulação.

    Para o nosso exemplo, o Logisim mostrará a tabela abaixo. Por termos dois pinos de saída correspondentes às duas entradas a e b para o somador de dois bits, essas saídas serão incluídas como as duas primeiras colunas da saída. E como há outro pino de saída correspondente no somador de dois bits, por isso, haverá uma terceira coluna. As colunas serão ordenadas da esquerda para a direita de acordo com a ordem de cima para baixo dentro do circuito.

    00      00      000
    01      00      001
    10      00      010
    11      00      011
    00      01      001
    01      01      010
    10      01      011
    11      01      100
    00      10      010
    01      10      011
    10      10      100
    11      10      101
    00      11      011
    01      11      100
    10      11      101
    11      11      110
    

    Próximo: Substituir bibliotecas.

    logisim-2.7.1/doc/pt/html/guide/verify/adder-test2.png0000644000175000017500000000204211541757140022446 0ustar vincentvincentPNG  IHDR\`6sRGBPLTE((PRbKGDH pHYs  tIME-8h[BcIDATh͎ ǽZ= T}o޽MyWY0BHΌ|_ƆU`Ԗ5oTP͛@4\R]tTͷ:<"N(@!儲m"T8o$.:܉J`o'*G3A8!Rvzpœyӳ攇 \t6;AL_":zĒcmZKjp }m>D-+!mWxy4O`B6e!klqz+1$Tbh9%Z}8Y~3o 6@,@p'hr D<̔1_ j%`<N\ô4*%f7DCvQkCLℶs?SBv1Ig+ sGo./0},:q$2c OC֡̂YeVA|T3PBXnj%m5.l JEu"}1 !BL],A &]ǐ,"{]_ O j&q=v:1뗎uy1/_wC(QcY5tq \mY6a%SUpXM@!, ,j4Zbf?61vA5!^m}P!Tcb*?܍@\uhUxjsD"4 ;?`qf)>_BK&c hqHCh!x ΅;?(w"D OagV@dX_ NKaDl78G 'ʍw~fBpYw@|P|FvPĤ [4r pَ b& vʍN^ b[MJ_Ƿxa'tk(L gAUͽaJ(tzͯ}_h#$nn H,n2B(nbgq>:h]$ƹ:u"Qp! aH`}@q T; 9/kA0:LDADdo] .l1 xf&uA ;ETA1 "zS'[1Aa@&#Lh=Cm3/7Q#,)lA*CۺN79HAM BՖ4lmdYRM +P_Dޭ]RqnHZ˵pp5! Mwv(zJDt7i(Qi爐HdcZb6H|t& !њ-cһi"{RH%\u6B2 $n ]byWѹWKmyBg$_c,%|(1{eG#zNkkIиd;M:r߬"W zfHm3L(ޛR e#0[8R[>D Qi_!Tn(zZ{B _| F K.IENDB`logisim-2.7.1/doc/pt/html/guide/verify/adder-query.png0000644000175000017500000000125311541757140022555 0ustar vincentvincentPNG  IHDR\QXsRGBPLTE((P(# bKGDH pHYs  tIME/hIDATXkn ` ,%ڹSl46CeIql>餬B6VV̛ {ǰ;},?ܹXLIYYp_9oTپl 7<+Xp_ەF]ڗ-Y҇6he}~حGi:Feqdmя bmMd>@|& oϪ΋gIfC6hb` {ɥN2; 5Ct I| Vμ0FZ_`C5[˴/+Y}##1Fv cu+#68˗_8t-g,lͻ} /^IENDB`logisim-2.7.1/doc/pt/html/guide/verify/adder-master.png0000644000175000017500000000102011541757140022673 0ustar vincentvincentPNG  IHDR5=]sRGBPLTE((P4bKGDH pHYs  tIME-(uRzIDATXm ;^ALQKAgGfjw 7^O<^DGNÐ;f̅?H R#Q "ׅT.Kry^GHDR& $=-"=}+U/baηLXA0ڐ.(̦2Kn$ ݆dUyOdr  iNZx-3y,h(]Α|&">!2r *]$ukJiYb{#ZEtȮ%:-3d\$\lGNO+Ed4Ȳ+IAIENDB`logisim-2.7.1/doc/pt/html/guide/tutorial/0000755000175000017500000000000011541757140020163 5ustar vincentvincentlogisim-2.7.1/doc/pt/html/guide/tutorial/xorDemo.xml0000644000175000017500000001704211541757140022326 0ustar vincentvincent
    logisim-2.7.1/doc/pt/html/guide/tutorial/xor-table.png0000644000175000017500000000203711541757140022570 0ustar vincentvincentPNG  IHDRsRGBPLTE222>>>aaa2bKGDH pHYs  ~tIME#YIDAThS0qmY;+WrEkg+ksy&"" 3v-&$P{m?r kp;#$vqooGo16 zc24"{v$HoLG ? AgZ8dr |߈=4?\[T1 ΥZz!.^OtgSqw3&oD d?| &iOpq w/F'tR⊖g3zd/HbKd򻙗Bfhe.xB-\H5/6$i6nE|X&Co`xwpY͙C 0o 0I9Rԇ۬XlĴ_^r7((nHFj~5NѩbHkac#6|kّw2Wd@2\H"'Ndb5)=OddAZLfc SR|+~$<%#Sd/dodQɰll8ϝOi= lP?N \Fq( u Kq\䶸]32 !Q '֬X.!lMّFIM(vqH5)S-mjTSZ*Rq]Rq]R _ ژx v$L'd+E(DlYI]Ȏ|CrK5igyZ\q5 +D2zR"z\oT-K_H?#ZqܣVSwB0%z#Wi;#%u P,|6ƘLKpR=_=|>MvI7hFR6m"MZ~ %JB gvuu=Ɩ)ϿngLvxkwJW!KiCm@hڌ: (xPVș"m."S_o=JWu}b3ۏ0;j˗sAN#/|Auo1U1u%W@ #Dt҆ ޴Xr䧆#Cҝ)6jѝ3_!GJ yoKlNڹ]$U3VK`$_[Bƈfsub}J O3EFSDf0nleSaآcRZǠN6o5BC "WN1j )FgpwVth1iv軄PU+j؏..*mWEpU1tn΁H9k" Y[ĂcClGPuh̪_V.V_u2l-!ҪӳU+"eW"z3b?) 6IRq" |g׌_'9}$$`5 0/ydX}-w[ϕ~粃A !bf쨉p#Kb:`uzgf求sUN!N8\ZD|?#ZG:|$M&q- qZQ1tJ.JhEBOkY4ԉTBDT=Ӕ7TAi hbs 8+f j23W^IGDǀuo`Bڥ, zC%#hUҌ6eR\*#^VE8w hE6S8!]9kl8Jn遣[Xw hWW$#2+f6앂i$9_jB0@k/X ƨyǛhk/mPjbn)'1NJ @V:ᢦ]LlGڲSE*}G#WF9:1"<ce0~hO1F٧~+?Dlogisim-2.7.1/doc/pt/html/guide/tutorial/tutor-wires.html0000644000175000017500000000536711541757140023370 0ustar vincentvincent Tutorial: Acrescentar conexões

    Próximo: Passo 3: Acrescentar texto

    Passo 2: Acrescentar conexões

    Depois de ter todos os componentes colocados na área de desenho (tela), você estará pronto para começar a adicionar as conexões.

    Selecionar a ferramenta Editar ().

    Quando o cursor estiver sobre um ponto que receberá uma extremidade do fio, um pequeno círculo verde será desenhado em torno dele. Pressione o botão do mouse e arraste até onde você quiser que a outra extremidade do fio vá.

    O Logisim é bem inteligente ao adicionar conxões: sempre que um fio terminar em outro, o Logisim automaticamente irá conectá-los. Você também poderá "estender" ou "encurtar" uma conexão arrastando uma de suas extremidades do fio usando a ferramenta de edição.

    As conexões (fios) em Logisim deverão ser horizontais ou verticais. Para conectar entrada superior à porta NOT e à porta AND, em seguida, acrescentei três fios.

    O Logisim automaticamente conectará os fios às portas e uns aos outros. Isso inclui automaticamente o desenho do círculo sobre o T da intersecção acima, indicando que os fios estão ligados.

    Ao traçar as conexões, você poderá ver alguns fios azuis ou cinzas. O azul no Logisim indicará que o valor naquele ponto é "desconhecido", e cinza indica que o fio não estará conectado a nada. Isso nã importa muito já que você estará em processo de construção de um circuito. Mas quando você terminar, nenhum de seus fios deverá ser azul ou cinza. (Os pontos desconectados da porta OR ainda estarão azuis: isso é bom.)

    Se você tiver um fio azul ou cinza depois que você achar que tudo já tiver sido conectado, então há algo de errado. É importante que você conecte os fios nos lugares certos. O Logisim apresenta pontinhos sobre os componentes para indicar onde os fios deverão se conectar. A medida em que prosseguir, você verá que os pontos mudarão de azul para verde-claro ou escuro.

    Depois que tiver todos os fios conectados, todas as conexões que tenham sido inseridas deverão estar em verde-claro ou escuro.

    Próximo: Passo 3: Acrescentar texto

    logisim-2.7.1/doc/pt/html/guide/tutorial/tutor-text.html0000644000175000017500000000243411541757140023213 0ustar vincentvincent Tutorial: Acrescentar texto

    Próximo: Passo 4: Testar seu circuito

    Passo 3: Acrescentar texto

    Acrescentar texto ao circuito não será necessário para fazê-lo funcionar; mas se você quiser mostrar o seu circuito para alguém (como a um professor), então, alguns rótulos ajudarão a comunicar os propósitos de diferentes partes do seu circuito.

    Selecionar a ferramenta de texto ().

    Você poderá clicar em um pino de entrada e começar a escrever para dar-lhe um rótulo. (É melhor clicar diretamente no pino de entrada do que clicar onde você quiser colocar o texto, porque o rótulo irá mover-se junto com o pino). Você poderá fazer o mesmo para o pino de saída. Ou você poderá simplesmente clicar em qualquer outro lugar e começar a escrever para colocar um rótulo ali.

    Próximo: Passo 4: Testar seu circuito

    logisim-2.7.1/doc/pt/html/guide/tutorial/tutor-test.html0000644000175000017500000000526411541757140023212 0ustar vincentvincent Tutorial: Testar seu circuito

    Próximo: Guia do usuário

    Passo 4: Testar seu circuito

    Nosso passo final será testar o circuito para garantir que ele realmente realiza o que pretendemos. O Logisim já está simulando o circuito. Vamos dar uma olhada novamente aonde estávamos.

    Observar que os pinos de entrada contêm zeros, e assim também o pino de saída. Isso já nos diz que o circuito já calcula um 0 quando ambas as entradas são iguais a 0.

    Agora tentaremos outra combinação das entrada. Selecione a ferramenta Testar (Poke) () e começaremos a alterar as entradas, clicando sobre elas. Cada vez que fizer isso sobre a entrada, seu valor será alternado. Por exemplo, poderíamos fazer isso.

    Quando você mudar o valor de entrada, o Logisim irá mostrar-lhe que os valores seguirão pelos fios marcando-os com a cor verde-claro para indicar um valor 1 ou verde-escuro (quase preto) para indicar um valor 0. Você também poderá ver que o valor de saída foi alterado para 1.

    Até agora, nós testamos as duas primeiras linhas da nossa tabela-verdade, e as saídas (0 e 1) corresponderão aos resultados desejados.

    Ao testar combinações diferentes, poderemos verificar as outras duas linhas. Se todos elas corresponderem, então terminamos: o circuito funciona!


    Para arquivar o seu trabalho concluído, talvez você queira salvar ou imprimir seu circuito. O menu Arquivo permitirá isso, e é claro que também lhe permitirá sair do Logisim. Mas por que parar agora?

    Agora que você está terminando o tutorial, poderá experimentar o Logisim construindo seus próprios circuitos. Se você quiser construir circuitos com recursos mais sofisticados, então você deverá navegar através das outras opções do sistema de ajuda para ver o que mais você poderá fazer. Logisim é um programa poderoso, que lhe permitirá construir e testar circuitos maiores; esse procedimento passo-a-passo apenas fez arranhões na superfície.

    Próximo: Guia do usuário

    logisim-2.7.1/doc/pt/html/guide/tutorial/tutor-orient.html0000644000175000017500000000277011541757140023532 0ustar vincentvincent Tutorial: Orientar-se

    Próximo: Passo 1: Acrescentar portas

    Passo 0: Orientar-se

    Quando você iniciar o Logisim, você verá uma janela semelhante à seguinte. Alguns dos detalhes poderão ser ligeiramente diferentes, pois você estará provavelmente usando um sistema diferente do meu.

    O Logisim é dividido em três partes, chamada de painel do explorador, tabela de atributos, e área de desenho (ou tela). Acima dessas estarão a barra de menu e a barra de ferramentas.

    Poderemos eliminar rapidamente o painel do explorador e a tabela de atributo. Não estaremos tratando delas neste tutorial, e você poderá simplesmente ignorá-las. Além disso, a barra de menu é auto-explicativa.

    Isso nos deixará com a barra de ferramentas e a área de desenho (ou tela). Esta última é onde você irá desenhar o circuito, e a barra de ferramentas contém os itens que você poderá usar para fazer isso.

    Próximo: Passo 1: Acrescentar portas

    logisim-2.7.1/doc/pt/html/guide/tutorial/tutor-gates.html0000644000175000017500000000732511541757140023336 0ustar vincentvincent Tutorial: Acrescentar portas

    Próximo: Passo 2: Acrescentar conexões

    Passo 1: Acrescentar portas

    Lembre-se que estamos tentando construir o circuito a seguir em Logisim.

    Sugiro a construção de um circuito, inserindo as portas primeiro para formar uma espécie de esqueleto e, em seguida, conectá-los com os fios. A primeira coisa que vamos fazer é adicionar as duas portas AND. Clicar na porta AND na barra de ferramentas (, a penúltima listada). Em seguida, clicar na área de edição onde você desejar que a primeira porta AND deva ficar. Certifique-se de deixar espaço suficiente para outras coisas do lado esquerdo. Em seguida, clicar na porta AND novamente e colocar a segunda mais abaixo.

    Observar que haverá cinco pontos do lado esquerdo da porta AND. Esses serão os pontos onde os fios poderão ser conectados. Acontece que nós iremos usar apenas dois deles para o nosso circuito XOR, mas para outros circuitos, você poderá achar mais útil ter mais de duas conexões em uma porta AND.

    Agora adicionaremos as outras portas. Primeiro clicar sobre a porta OR (); em seguida, clicar onde você quiser colocá-la. E colocar também duas portas NOT buscando-as em ().

    Deixei um pouco de espaço entre as portas NOT e as portas AND, se você quisero, porém, poderá colocá-las umas junto às outrss e poupar o esforço de conectá-las por um fio mais tarde.

    Agora queremos adicionar as duas entradas x e y no diagrama. Selecione uma entrada (), e coloque os pinos voltados para baixo. Você também deverá colocar uma saída junto à porta OR, usando (). (Novamente, estou deixando um pouco de espaço entre a porta OR e a saída, mas você poderá optar por colocá-las uma ao lado da outra.)

    Se você achar que não gosta de onde colocou alguma coisa, poderá selecioná-la usando a ferramenta Editar () e arrastá-la para o local desejado. Ou ainda poderá excluí-la totalmente, selecionando Excluir no menu Editar ou pressionar a tecla Delete.

    Quando você colocar cada componente do circuito, você verá que, logo que ele for colocado, o Logisim reverte para a ferramenta Editar para que possa mover o componente recém-colocado ou (como veremos em breve) conectar o componente a outros, usando fios. Se quiser acrescentar uma cópia do recém-colocado componente, um atalho é pressionar Control-D para duplicar a seleção. (Alguns computadores usam outra teclas para menus, tais como a tecla de comando no Macintosh. Você irá pressionar essa tecla junto com a tecla D).

    Próximo: Passo 2: Acrescentar conexões

    logisim-2.7.1/doc/pt/html/guide/tutorial/shot-wires.png0000644000175000017500000002101711541757140022776 0ustar vincentvincentPNG  IHDRfHsRGBPLTE8:f:<@)\W6(d7cd(:-A)*( 2u"T*#<1%P Fa<8#GVGIGLUcJIESD64^5epYYTDHr}omk D~02oX~trR85;zpԁ(DV½nKѓX͞]gҝ^d+_uԠͯNt˪XT܌ׇ^RbÇgލ̜׼ۏ܃ޫٌ tRNS@fbKGDH pHYs  tIMEIDATx흋CG+b9-r h4l -(A{EQ!@`jz?浻33nv에}o&7޳XE:=E5\{N O_Ñ?J4%;pT%bwVgfff -z֌e5uR~g5DdKϦXo4d/!Yb?pM/7+W/@VjyNjY n[[[j +Mb,H?1f*+$kiGFaƵVh!Y:9֒E(^K+5x̀%#$-ve- Y Mf;ٷyumFߘ>^ ©y[F>Q!XqH /hGhV;ixi.RRO(%񎹁5DDݹ Ϯ_oV,ׯ/1Y-" *~;2J;ٙA T޷@WV7O#V;xDjgv9-3[ZF*YORQ(RK,-![B-? b`ENjS/wv}/ YuS-6ZC!E1!rOm#ge(Ko<Te"k8mZ va&;V@WѲ4>ya] & [|ԍخ|wtDޖ^Nvmwtw>BY/{Kl#;:ʀu[9Dfh'nk25 3wCN-R'Yx _)"Ha(p/$)Yt?nd}%eYtyt*`bB ޹݁"f詫`|"++kGYFvN x/:QHnݺ]Pڡ+dJ46Wbɪo+CuaA"Ç %HW6vqf1Rf;L _y'˦(`5MfNLpdKIt´1Iߒi㯄lT.%MBI$ m*“LB+Dk"K-,NbM76hFkdˢ$IdG%L>`VVs=wcΝ_M]--"mm'-Z#\@WK|'%ۉ>5di67FOCd"dҼzfgMA1kCd\+Zi 2LXkk[Ť@yZc'c?-nC_)3zV9vuz\uj Z,@#rI 'h",BŘ~QvFkȺAK"۬<5'CVIHЂӆ1vmmql ٲ5Y ɜ##Ŧ&N}flFZ6ΨHncZhS5EqD~YYM |s$od6Wl*(#ۜ#CZDP@7Y74,SF%`6#gVˢu``n*Zk_!l(;\k>ˋlުtD]!o\޽v|іF7J9Իd4llMk3X "%V3Lq'ʩǧ_‡xKx n VpO u9O௵ΰ:Y';C~P#5 q|Qq+O3> /myxxZݶ~Xڊ&}Y@KWi|L|,][|C6-w/pItWFN| J˞! pCAx|>Ht3o>:3H>t~nB@LEvL#7UCtPƽ[>:c~҅Muy~!?}t|(<=>P'h`SV̓]A-~};>g odm >}?!ܽ~ Pu׾wW {0d1!Ya o $/!# χ~Ws-+,}Nɪ@{JZ,r&ޘ.cxG{'C|_"|x xc7d7dbocW&A& x B]gɣ},%F~ w <4Eq>j_܌PxW_dLFV _?FRZ]i?dggX!Eղ1 ;9ĐEMPwzX!,jSQrGH?ɘlhu?Vd$&V"O:dŘlk5Sa:&d[@LhC%k[,)@uY Yl,͚o.%Ӛ;9Yu^J" Ihw,O)-]BEkzrK=,WSR+eb-HdMn2hM풑Dds!E–SUdt!"\Ǔx@F9!}c`ȩ~@ Ȃ[0Yނ@BVCk&/'{_.YE@BVm9:ٯh faG%}d,t.%{ȓVKFׁ$p?eW[#,+*r)!AkF /h%6m dqSLfhAdr=T[\BsU$i !/'[ϒ-8P~E+Ah@#UT\蔬VL"&X_WcvٱJkEcah YEZRaT\ٯd&nL6Dbqm_ l%n֪dV JkLyRPnj`cCfʧ"ЧZ*byl,)di;1hP:xJLT4&{(W>AcKVbLC?YƯ/c" ~4pE{dO<k6~ӧ2_f.wm62dd~5L}7@2ɾvpb];pd<%1OGBp9ye|:ug]՘$$ cXH̓ 6E'`\d?%Y^zeKVr'[Le1YOILO_^W%Y}G~l?3](,2(aD˖AqOIHư쌚8I$6QډӴNMk$2ڬ5ֳY) !;:*azm\k&&d_57&oGd?dqax#AUwч#f3"XH8%!_/9== Z&|=NYw2G^7d/9rd)SP3cv)(^YpZl~,K=uFaJWa[HV7q6Vh]%gk~JmwDG6\(LZ]$øf[ha5?%76KA/V`Vo/nOʠJŸ l(2=%,)aF!ކ dYj^m6l5?%ic5վn 8'Œ¼aK[ IygGk~JmGoxe\o#BV8!Ɠ(/dDlجVSOkOVr=b)'d7E`L~Hu\{ Y61YI=Yqq֝JYTCM=e) ,,IYQld ↜h=Y0Zd'5ٺ8+$"J7}EdANL8o8㚬2PNى + [*UhR K7YרBAfRÜyqL ٜJIl6.a{&Sm6Imaں9&l.r.ҺEYK-ѓ6Yfhc)Kmp}yl(hݐ55w]NYMdKm; IWoGm~Ъ#rdH,wUkf:O~&/\fdcZ8ePe[zA ɖ^٬KR3 :O *ҭN*er {:ٚlT*K-gi LKFgIđ5vE^\3 M60{[&&k&kφ٥Ȳ!>)YRیd Jru=!vm6z:?z06#YחldgD]BPgC&[K I"SzgC<&yd]zתpk)j{r\fCm,LOFH.n6ElL־~VA@5Ɗgkugj6~wt[Lփx&kY},Xu4MR?;{cCC7o m6P?[rmٷs˒uU-F5YWRicmY\U0Y_NV6k[?u.o Dַ3ݛ(m̒:)(,$nњE6k[?z&m8g"Iǃ|;1hE8Nd~2(/dd9 "C{X/e}JPȒͪdjـlօ9Y{$d*Zz{@-6&djMk+<#?xpB6 vg=^.7l6~ 8+e謎X\pl}"qNfלdՆ5nd=~d%315?Y<hQQYggIvAOUEZ9?;u[:qM4&.^(]FvfGW/W)(aF-;㜬ߣ qIEd}lLM˯w3mKL֚,ɢqbbu 1٘ltn|a;ِr@61UQ1''l-m*"edQkdu_mM>Mg_fxN^~kMdyo,&{#X ddðpLf4pi=H|ڶ3"ĸ=dwr\O^ѧHi>ԩlDtSPN60/^֚Է g׹ 6 YC8#o,d < F6E{\+ ِ?uDV4FWlļx1YdMct[pPj &7#ʘ^`}F΋WElAY͋Ma' <9eP2qG `xVbPY:X%CV.~9 2/^lNzVLF2,d꘬eP @,[f lHUEd!Hc6&AE)=[w@NG8 &h[(Y2?"\g>ȒV yc4;nga7dE#xiSѬM ɪh}nU+3-KvPͺ$?K[2mEdC ߚ6x7n~Mqg 6WmLv͢w<+0&k$Y$7{kl i7VFkOU;YɌ1YY.2`Ids=hLeP^jx )lÒ5Y1"YomXƧdx6ϼxUeKI۬'}Pdz8+dTY=12bl%\A̖lɤEvdbV5].UX0UeOF"H$tyU})4jr0U.` b{"e]XP`;J狕ʽ}_+7:&[UTux 2}A+ٮȑ@#EL.)YVRo XF#[ 4~="=>< 11YHfm6^.b%d'K)ٮLA#K @Z<Kf NHv( :rG 7TۍKvc+ ,Z&<റ$?~bnO-F``QE<;4F<&aY9FO+TŚPˠ%L~ W0Z&?kY8d[T^l`Gv(bdYFp9$z-]Ͷ Ӎ!k[^eᙥdL,.%{c5 *UDvfijѪC--qJvv&LiVSՐ FRۍu~G|hPJI{zf9D6Y5!r`zV#ТFCMߒ߷;;3Ѧmv ތ6юFmv϶m=Q{1VGܻCK߷A=|X#1ضsߟ>V,rmΈ6/IENDB`logisim-2.7.1/doc/pt/html/guide/tutorial/shot-wire1.png0000644000175000017500000002077511541757140022706 0ustar vincentvincentPNG  IHDRfHsRGBPLTE:f:<@)\W6(d7cd(:-A)*( 2u"T*#<1%P Fa<8#GVGIGLUcJIESD64^5epYYTDHr}omk D~02oX~trR85;zpԁ(DV½nKѓX͞]gҝ^d+_uԠͯNt˪XT܌ׇ^RbÇgލ̜׼ۏ܃ޫٌbltRNS@fbKGDH pHYs  tIME/Z IDATx흋CWU E].(E^/VyHQT`+ŲvϿy%IfjҤmy'yyy$'Q W a0Ɠ?JdFvnթ <^8]G277G\ҼgLCh2K*?QMoVҳ*1Fq<0$4YM`C{)^.R8[ŕmѺ %= ^9ъ:Ra Q-A͚`>LvnnejE=rY] Xܐpedmڠ3 "td'5dx#bso=o"}i/䤕ug:[!ZNV V@} ydd7z9sPQ do@.-p0]1 7y5aK@kJaurVhDžlh5YBvcK,9puMu _n$@d~.[U΂ m^sTx̪;Eh duc,b7%*l6Emw5Z_n,pI\}NL:?x]/5^(WT+eR5V$m^(!T/-Mb{,?1f*+$kk%EZd!Nh ,`*B20X,z >ݻ<."[ZFSrP#DpM-!l'&kC,h[uk~DYcBycVeHd]WeXQbRR\zKF;O$ ٍ XX堥XTf\;\y aH1@7MPv˳#ԣg, RWZXi-E2hz5*0zmzڰ\Z]YCYV1ϫ"ufj;9;_($+sFɋ߻RK/EƏ[Zap`<9Ee. #Okf iX|Oˌ7,~~DKW=#3:OC Y|37[G(G7TA`tRvFAMz&uy8}ʪr}i`F̱&'AH>Dl܅A,1RѼ+LDQެ}dd> Ř=d?|&__d#DY%iaɮz<~+&m͛ϟ?j|9=-Ȑ-7~%o{ԦAw:[ɺ%1ǯAPq99ec};suHg]՘X),$ ̓ 6E`\dǒ,o^%&v g՘Xٳׯ5'g7e2A u|Q&'%[HJh:(.da KΩcERus7;To#Zm=ebI@g7Q #lSJ=oP}dHř!덬FVg?0qoS댬1e#ˠe$5&ouCVɑ#K҅͌:xge-hk%,9[];BڿlüG*K>[s,9Y"| ʇPJ;yKi`JOha5ǒlP௕(;;3:(j5.S9*(NX K.YR: ÌBe BgzٰK.j:@{}C` )Ty˖ ΆKuWtg6WOmb_jBFb1B%UQ^Ȇ 4'Y͝ړURZ YcMy6BU5,S5}wf{o$0s &+'+3кYI:k"|z2,EdCݑ!;=< $Jvd6/oɊvٓ_EvZ#;e_{ukl BB+!;-"+P*mş2P ٩)G^`ӮzqZdTeAvjJgêƖ*Q)Ά٥ׁkTavaN?]^8&lV% f%:fڰqͪ:f:Km]uJ6dYMgo~@Rzb BV|!kR\_& Z7d d]jW3iWژlÑ5vmjb3JȺ-*e $,ϊԪ_H XeN JH\.Mg]jO,\<.D:[q-XgkR.8ٛtSn2-igtV%K-2b~'hyl<fچ#렷Hxdff$7TD6#!zBRldu~avmFF/gD]BP!Mag=IvP~*Y :(΋ݷd3:tVY 5ע\"H6k&kUP%PGF ҟXlm5[dgp|׿dl=gkhgPDsOm!oU Eև% 1LƃV:wUe:*|~[clƕjj7mMŮZrk,Y[,jYv6Yt1K6?sPjY4 !WfkuA=pOko߷>.Y[Zt[^jS=XF+:ٍFX= YX/e}JPȒͨdYG:B=E? qlf#zHg=SE}5L&gA`sNfnY Nk!~Ng3ـR'4Ɯl%tm:+֣7^sˠNguϞR?b)1YggIvA6>ZO\:ɹwtړ[hL\?tnZ#j^aȺGPe hMmvϫE۞S|tӪo䷪͐κY Y^g_6;IlhtAd2|5sP0;Ϫs"YEdhtӪd d'R)YGgE&g7M[-U*?X|57NR&5JȒeAV|[XMF?IAg[睝?k$✬/xN1h'Os:/vP8iT. iSn:\m)ͻtɆ땩5WLvt4&YhmVg uv4&Yxœ]*;,A , dSkl[É47Ⱨ50{Fuv>IS#jq-\d!ZN6U'v5ffjc/nldƩy#OVƫ+9EQ'FjG:4ncQVFa{^j&ɞuC{PYw#j4hvYڙ_U; \H7kRs~k%3Y&⚊1C4o,zʹ-1Yk>Ғ,j.ȘlȆ3GL6&[y&?߉zy&tĤ1JlRzؐ: "n\'qVOgGGN4KiL9z4:uPQ{ɦh ,;ɻ7Go1PASg)Y@cR!EdQO/d~ N_-:K<dV)/%P3=m3t-X}-.צNpfSY=oÓX\U'*\1ʎ.9Je@'G BO:'^T}]dᒒeEjKkd+şQ$;U'W5&* "Yfu ,+#yYDH5dɾ}:%Օkd HzN3txd`㫯Vq+XJed!Ӹdvݲٰr9(($7g^ٝe w0Hgc;Xe:3ʳ1[S 5X~)r#;g 3 G,| ]fvX#;1 J~+8[Y5 ݋gW1l#rcR Z&YI\Rɮ#s+P6Yw(++܆&F/KY\ƙ2669I2Je؅FSۍu~G|XPߍQD7"ɥB6dSrLq5-h48$-}ۅss=)ҎzB;j֛ҦUڱL}s͹G;f֛=fЊ{s?ׄ%5IENDB`logisim-2.7.1/doc/pt/html/guide/tutorial/shot-text.png0000644000175000017500000002223711541757140022636 0ustar vincentvincentPNG  IHDRfHsRGBPLTEU::g<@)\W6(e7ee(:-A*+) 2u!T*#<1%P Fa<8#GVGIGFLUc dHDD6U4_5eZZvTDIr}pnl D~02oX~trR8:׾5zpՂ)DV½uKѓX͞^gҝ^d+_uԠͯNt˪XT܌ׇ^RbÇg̎׼ۏ܃ޫٌtRNS@fbKGDH pHYs  tIME%9$ IDATx흋CbUFC-(-FZT _O;3;&w̜ijjj'T/xZwaqe`zyaA9hUd X vPvB`K phs6?O]^Z{Yz.F,~HS:.`d]Ў`- -Rc=Qk"!iNԹs[`_ iqq} VjUU_Eq@+bBYJ6{YQ9{ Sq!;ۦ / EIlXK [Y-:Uգ5:[d UHydõLyӧ0T)W#y=";Evv& ڊ0xܢ?QEh%1 VEpڎQF6Q-SVV~g*9$Kl1 WS?RF\c+~I"ˬ~F7gU"`V6V66oy @+O5LU`d]-"{ѦNh!YYIVSsGAX"wd.$}T~[o"}kϼB;b++9kI>%XqP!AЎjٻHRVF)W9"^|>00o^(Yaݿ~, O?-J[e5 d v.E,+gb}K<*UuZ7 E|=!P.bQ$Yny?)"Ha(p-$S8hg/D;Ҿ%,:zi0?~@ ޺݂"v3!5[#{_Ng#,7>\ܺutN>WEHl'& +eCuqA"Ç %Hw|Vⲑbfx8l,dVY8"f޿/UljUIFp7BȦݱT rM#Y),TfBj!Zȶxh'j;I%k,hF+*2Rrad7RٙG8agCsG.%;w~z>qMEdxwv3e FP ZBvkOl+&}C `YжZ) Byc^e͇h9d<2gV/V7TՋ)MUqgc߯d7-*`)X]@ys\@ -,+*<exB0CrPR _IPvV9F%a*ϚY>LC'`;pZqЦ.=ʵ ֦LafVmz֛Xu~_Z%]9C9V1ϰ hzMlZ} ;QHdgI^]JͿTU?f~G" XO  Xt.>}('jI8yɳԼc#7 g<VǃQhh,}/h"_,_B՘~Y5c\Xl:"~В6OkYUpRq4ǎ['{(e[mJ6A ҂MqjD>{36٨>1VQߔ?tEhQZ{?W=쁬W8tKNF3l8TtTd}'9EJ[=쁂j3^i/ӏ[J@y+hVmڃEڵG48ZP .b8\i9+bފt-P/[ȆI7JL1dlC O"![&iLHICMtauvH#Hv+F;/Z7ϼpՁ(x^: axJX%˯~YK_{c"=vm"dZ#=-ޅ[>,O9@k/<_,${g>b1L֐%a~_rMq宭RWV 'd-, ~'??26 oL`uE{h.=nX'wo-^wAH.Gۯ O.zd%)y. >֩{fk#rdX>cxz za1?]tAݾ]sɱ8z?pĻr (uaEC{˨oowwkc/a, w,w2DԐ,r&dODC8 VHc@(%b' Zӯ[NA{:[NyJj^B6OK_9k!\:UtVNxJJ0ddOdk>{. ޟ,o߼~J%-ug&2儬秤&o~m=>0{)C6Evlol;3/Rsߚ"@zG gدAK@q, 렄$ SXBveq8;);To#YgODi))!M\쌦ԣl-^ +pz*AybBuc~7t=Kř㣺!A1G;)vhd;Zɇc[b'AĿ5V^Y`T`vtphJ?#Q΂jf#K{̜8:xAdZe7 DPīm-Aٞt(x!BYAujkJ>,5vgqNe25,P rAڣ?%:oyt,*U<,)G![K~f?Κ<yBfGBV.)Ƣ*bʳ2?μp{;Yuq ?դ6ȧvAx#SA[1Yx,ϲJ0cZq䟍d>_XӓU: \Ɇ"${߽<[c/8H`YUev-|.Nm٥K>ɂߓ7d\ҖuPdwYUƎR5⨳:[.ָ d} ڠ:[.31N!cd!؜Fgk٥ָr9zR[{Nz%a 7 Ԣ=S :!kml>w/O] Z?d;%.K3+mB]jԻrhH~m<~˳RؑGK->$ /Gp-uPK2ZUJIv:R{¥V=:qX-mO&:[NϑtzfoGWo(\^ZN.S:OEܥ_h{gvm8LBNV.ֲKmݑ;) WԲKm# "Ր|=5Rhdua Rۈde.gT]j5֘l%m*4l*46pLڷu+F V%x;Ws\]gk蟭/TOGh 6ElN?kJ "Fϫt^[xvdA8ѵ ;;5 LVYֿb${- y|gCb+!t( Vaf.o?rX޻ 9ڬI6? 5kg8dC1Z5V묫[cu.8luD6=*o̓z:c6rվ=d}r'OVho߹2YW,+&m8cbI#v c$aUYQj]g+ BKMX8ο1}JQȓ246"au*(#]mtl[oY͘defFφM6(^fҮ66Yjj_@w`Mg+ lE)љE?[]b:V7^c +`wNg-Ϟ>YHLOְTEUQ rr@`1xt[vǭ7QL\w0D7-B9:(OFt#o_GdYEvnٹhݴl͡ZY: BYW,A͎>[d40]y, 9_>9(pJgOϲ1i,!haiY7YPٴFEIٷEzÇ-KTTYe?ű"&'uNKD#k6d+[Y:hzĭ<[[lɺ3,Їoc+ɦ6ؒFAV}Z g8M?+Hx2:dCpZ}DTAz G\x^A9frPit6d:OEw`/kOkW\Q1l8d}um[;l8dǖHvpB6!Ȧ%k|g M'2zL -IWӺ#[˞Ѳ2Y!+hKS{1k)l- WUMvedG-\[OWdD:4vF]w)l-뀬QA#d \[ tŃIQٳoEWIt3#[nk*ׂl%-S_PMvpn|{>͔l;3*QՉea Jܮ%˵,wzFH9k̚gd>/^gp #<=r;&;HɎr֘k+!Ԏ";\rBMVAvAͦho\t_D͐."|[ b}E(SK8_F_!lQpmOIE5KTSl<2U%;>u2#Y<5]56"lf쏄lB6>d\~>l@63)狸(X^a\<{}5"{ Y1G'+=: (`M$ӥ";\d^tV d lɀM(Ǟ!Z ! 7k#+d3Y~?"9dk8 `diT.!<[)cZdY:Œ`@6MT0yH&H^gAgEBU3n dgk;rD.U,zbN:[kL}vP98m"oQEWc*o1 L6`D&spe9(kAA|  BWsFڍU^hdT6rU4d*OI#Y%_ʳ#ybtqtҒ5B ZB(,$4KŇ9q%ـ#6<["4N6uP6[4jlo̥YRj5! (y(THiVBjlCدGJ$kn`.}Tdxg {; /~K(i!+g1KuNIOlEIiV>+N,%YdKH"[_drX ;Y,ձ,i[d)) y(fJiob? SlwJhOt! o8{a |IDATW,ėn#MgZ{B7UOKp&ZdKdKn,e|ŸLdWJ-vdK]visJ5?,c-EGvhőlw\ɢAhBhtIKg#{쥡<,bHvhsdNmmkM4L7ǟY L6'^;%8Xc%j*ָTn/ٵ͠d'tVd%7֔g,TE68YD80ŗwʢegVg5ycAgעg* ;Qr&;:(uMW݋,lFSFYj*,\c`˳.dKledglͽxn/Oֳ,D,lIăcFgS4Dvzq*'+eqQb[^st֛222I2LeЇ Ӷ 㓉~F|HT֊ߍo4NCdSXGG]Ȧ0؞pƓlԷMMO? .J;`JTiGb6o55e?w1Ve6/mr\imj:oi9LqMﰒIENDB`logisim-2.7.1/doc/pt/html/guide/tutorial/shot-test.png0000644000175000017500000002167111541757140022632 0ustar vincentvincentPNG  IHDRfHsRGBPLTE7:f:<@)\W6(d7cd(:-A)*( 2u"T*#<1%P Fa<8#GVGIGLUcJIESD64^5epYYTDHr}omk D~02oX~trR85;zpԁ(DV½nKѓX͞]gҝ^d+_uԠͯNt˪XT܌ׇ^RbÇgލ̜׼ۏ܃ޫٌ<0tRNS@fbKGDH pHYs  tIMEn IDATx흋CW" ((V]@]+<J)jn;L2դI|b433XG=E" }O?} G`EIَ{g-y0z:433¬gX! ,QFӈT P  2lUVWGϣ MVŇ W [BF$;nl?'z"޿[Xzy;\՟4ClI`qphEd X퐎V fMh`>&;34 ӂpY[ XnHpedmڠ6 "DdG4d7xpנʡdg&ϷgDvA^䠥%g:[!ZNV V@<Z/:@ ɮ }zG٧(J ~w ߷\P.qzI.dºM/ݱ&lȲ`M)NU 툐#KȮAxɒ%;m/OPO{o:ٹmRe=Gڋ?cVIH5՝S"vĔ؎Pl֋h& >d/!Y\~ _ d7+U/@JiR5-n[[[q _؁&h? 3##EZd!N ZKT{IHkמ߻3pgKtOH[Z@蹿1df-|k|ny?-#X]ĸ^gcj5U1j'GJ$0׷(?w͛7J%m͛KLF§LҎ{mgiuU3pNPT#Vn-%IU*+*bKJGh-!  YlsIPVv" řW;;ܽ,]U}ęU-6ZC%co`=Y#9#FYz9 Dְ,cl-:LvX+eqE /pu~H uSLd3)GvƑ<ÓeO*!`5M֘fюsdKIvü1ߑy㯄lX*&OBIgIu O3! qd ,Y/b;I7 VE;04Z#[ #e"#>V297Gwmz >Ͻ{-Vm>}xvIBָ#)³?}ztq0Vzv>=H&>˯-eNd+ZY8$+ #ُg{OG'Kg~~ȯ/0$Z빷:2S~sbCo581%?OvGӞpw7.nAf舕3nhsh[GkUW 7ߟسusQC>zqkPԛQ?߰e jl 1+mo1z' /ӚcS܂Q?kknwb$&;B䍁,,<]Jϡsdw[?f&Kom)^jjȵZxcuc[fo=[ź|e7j"Љ9h=ɢ^[`"|ru_؟b|?ꇢvKD/D.Fry~W_dFӅf _?ŝFRZ]i=dggX!Ea٘lbȢ&;JG(j M#cuFzKbh% tC&[6Y:Td,ywh%k,)@MY[@B.-+$h!:tsthdmv^K"w IhW,ɣM]B R{/^Ȃ^eojjO J^GF6!YԋEC7!k퐑Ddh .E–U*ydthj鞙m@F!Ŕ.9u5en)C+# l1"{R^9)]dd,. YENd3%J}Dd"[Ns4/C,Z25 $f{6}-q 1ٹ7);"EZŕRBA Lf_KlhC R-LҜ4%ŕz,4WѦ ^9ZT 6oM%pdo2`MlGMk˓qSlYLꢣC@_ Le&IчɢC7d(^dZ5JL6Bam_ *BK­ƭRטl䠌dc5(X!3YMGSV)Jo4:vk)dvPʇ!#$wtVhޕ-LDQެ|dd뗬> Ř=d?|&__d#D4pEc.ze) ,ى YZ {4o<ⳁr -Y0Zd'4ٚW;+$"0b6"Om.ɂw q5Yu<\A2PeAv|f[*UhR K7YרBAfR9tq:㘬YJJl6.a{:&6f6KmM9&l6f.EYK-ѓ Yf' Ys5Pк!m kR YکvYcV\N+?򬡩M& Ywٽ$ecZ8uPPT%$[*f]jOΑ,\k?.D2],p-tӱVebgtSRPN1ʹ^t6dYcZ|őٽvn}lgcdd0Yx`)NfF$4TD6#!zBRhdu~javmDF-gD]BP!MŔPL 0P㳞$Ԕ\~d(ouP\{-fm6l},gz2@rw5)dfYUR:2jJgugj&%>;-&`AM<5x D>>b${j y|g|b+>t(Vf2⳺.'л}BMKyW!kY7f\gv~$YU/z@+bboLβEͶv{YY]g`'8>BIXnbrWGD6k1v|[m8"Ivʃ|H;1hExddD'V*꠼uҖXr|)SEl5q٬ sh$dG(Zg=_q6rژdZd+<#?xpB6v㳞_vU d'Nol6Y\2}٠nF8>[[xg36+֢7^cVhYkGV2SŨ@dd%?jB;8Yh)Lcs fڬ'ީ3ОFcݞ>iULO/Vrtn`kMLVEhfwh[sʮaZ:`~[>۬m|V˾S͎}l~ Y2rҜ9(2\uIjddAdS"* &{g- cR,#ZSQ{Zy~˚MYjjX6,Buyc´&[jAFRvp㳡g Y ~zT*eYF,7~>?ŒlJD6JYNыzVyg'gցE΋8 ,S!949meٮ㚶AYJub=5Yf{w?YIgzZ d!m*Ld!O=xKdb%lMzk8FiƢ*tt V [ͼx2نk95r4{d];(њvPU%#eDf{g\͚FndT#z:KZzcLv'{YCIgㅽM}R=)!鈩1t6+frb߆\$hȞaª.mE\q R`6 6 (KKDv(dڢm:+ޭ20tԋۛ:Y,VlFn(i(YJҒmm˳dyL: L;od:M-F, VI6ɲz;8xqDz y>Y@idՈ )"'zBےa=LQ%sk" 8,Y=hP5^JvfPC~l*z'i@pXȓ\;(qPctW1ߝ̋,AZяpRUN$dN1 7@*%AzA1Y(O鬳V Fٺ5x+SEO5gNl:v t hteȲctەgMe#Qy֟yd_%k#ʦiOILj@f30l3۷gGsNTHhw{'> @$Og9ӖlJ3l7oٔ, Dd$Ɏ1ϱ*yM` 9[54Q^E@NGӘ:&ԶPvh&DN֮#HxF <:(XNP8xh,Z>@ⴵL]?)!Y:7m]:,\i_NA3vPq!@2tQK^,5[mykERfo|Ҟ#9fPcf̤h,Z~.g]j|f9͊"٧VOd+*%$[W,NDh";PizX.Nu,xUuOz"H$t+) zh4zU`]$'=I;8''! o\lRn!3-GpP+?Hp6ZdۺrrNt`pPJ#rd˻=sH{kK,+7_,-Gvp="ި=9_< 11YHfm6^rV"NléSFV$7 AP]L6'Q;!ف(xcګej*޸\dn/ٍmd{7ㆹIDAT,l6,\ jrj%Yҋ5 =6,L",ف06Y̢$oF0~J*NDJ\Sg{q`ʳ#A} ]ۋuD3dCٕzl;?]ZlR, ,%[eb9?gtf)1\dWٙU5FĽĽ Y൐dgg24jxx5jRC):">q8(rzbYD6YudĆl=ZY y@N m4f~K~rCOF;bcCYf@v8h3}|o3ۣ"<5o]jAW\G+n?TMIIENDB`logisim-2.7.1/doc/pt/html/guide/tutorial/shot-labeled.svg.gz0000644000175000017500000000356711541757140023701 0ustar vincentvincent;Jshot-labeled.svgZkD_a\!_o-HHr+DB{,ZM_ϬN4-HUY3gƾ|ߤ#eTtSUHfG-PB,)T͘ MSsIk졈qNBav;փ:+kE`fz( ,QO?KbdC2Qnjw\>m6,+ʙY̓e-7K'+ CDBxh!x Ǧ"4 uyE8__; 1YLgD/_FnӀ?Xw oHF3^D8:NXa9&tE!d:~iTPԲԬ79pVb/ - C7xw`[od/HV N;^id3.%MIhV;lC @z='qJh;?-f^x4!sSͳz$g`$dYH ^y0s1'Lʵ8] {).t+~[×9ǜߴޖ(DBۮoM4z@+p9ﻛ}+BfbH #%b \9^OէS'7& L CUJ*ÊpD|L6ş1KwFcڋ5Nnc6pv<_G'FX'CrL786 leҶP-!_@;viv*CuBapƣQ>,YAÚ 8w iFFF^88wʆ"xvxT 30r T- jk8Kzw7nIUG;$P9M4I.ʄLz19&FsjuT)Sg=?+ζ%aWǻQ*DW6BMm(m׷SAv:IZǷO/ Ne{]R%P*"C[>%ZV9dsqH (iASy'iu*G]!8{ $JQ_VPs {!y ьA O)|EN3`Z[2HrG8q=Bߐ/π>L= ˬ.F#VwO⑃`Zez'헊}^mo+SVd122-(]Aϐrx^`qoV2~y~NffkN9-ʀoo6|pƁ7}|^ځ(DLww|t8KH}VYꋆבi֛d%qgp֠뛙jYƱMܣ˫WSꦤﯬ޿Naپ޺iɅֻĶێϾެ݂؋^tRNS@fbKGDH pHYs B(xtIME0iis IDATx흍cUP_\,FDxf5lp1kq1m][.CR.RBh6孵&ƀi9gf2L$M۴oy9gf2V̓6SN]p).YqF``-h ,vfeXehmpZ}ْ%-(J)g'2zXh:\flH6 ΢6[6`mt`K-٦ͦt`wCn}iCKv~c:c'\x[aѲg!։%p{ "en$ v#6K{#{ᓇ˞߅s6}͘^R֋X3jUlN kRͰm[ӝКl {1g@dY裏> bśE)$ۉdu=7hfُ1Y6K#]DbEuZ;mCbmll)lǞ3Mxvc{&1_ k变UFFYZ&;s׊B??0<~ض>a9^_y ^a%)[se7eK6Zu8gNl6V눖zd 'QC=;@HԺ۹/_f!GуdhS~,u6  _.T@ Zc6OTgڙ`tdMG<ӯFLZKa݅vIx <24ɋv&axȧ[{? Z(]W/FG)Y#51vzť1FXE0w[icEٱ[3 ~d?dd?4qz z іh)LmsɖX xvS<:{䩁 Nd͂ɂ70yXFr &vH?bm7`Nӂ+& ivÊ1,E`bbA cPEw#ԓ)ϲ+WvWIhlVG\-hlizH:Lf5cq$W,fj#^@!Y+luW V11**E~&'-lss9z/|Tm|zV$60e@p挥n1`-)f8#j[TguVHVgsl3Op+ԦgkDBk4t]s8\T>ieZ WXi>筽`ٺr:Y:@4@6[kZY:usg3f(WBc)TvlRF;#Z{ւXKQhWyоk&S3dJUj7lf6֕GI%eZLk̟C.L6 [㮕XuKh]Au%i ;|Sk$[pnOjE"#NI:YN;}Դ}8÷ހfGxH71;ؽ w@^?q|B;{;~r߸!ZU7t }g|c!׾t< y{6\DwƁu D<)Eg҃q#Ʒ'jT5x?[Q'?hkCO|r_Cd gQmm}ϐ7`GO0Yw\OC%x20~gK־߱=<`9.w1&D n} ?d[;?~mkd3^m5YW,pɟ! Qa!$z|..AV2mDwy yO:(w)Y m8md,d[ᇇoAX.Y60d&{f_y|ps 8ᗑy:py #$ݐvv(xB?#ܠ\nn|'|r %g; Y7vo7K]L~g8_Ro՚bլ7~;)mGyO7 =-8m aA;e< }T68~cܶ՞Pi-5!v1z&_a!7ڨWU)'&zIߣow2'K,uEkO3h\xqG&'`ywO# #qϟTG$O獓F\DjVȉ+? m?ͣOKZeq4BA+qem#_U70z-yHy\QRNdϜ)D w^ш EdXݑ{KɞPr~rB"^#'pUY,[:kʸc_qi>ιI'Eq*(7(yW: o'8ڰ$ kC^ƕ$ɿP(Gwdq,y,CیF ;e[%2Bu>NNՋ旝Nܟ;;ٯ'KRBxOvZ@fGvF '4Q^>r9%[Jb9du-a Hփ)qNѣ_JٸyN]Sѣg+ glC8ũJ!m&FxWۉm>Q|< V@"ˉd }_G~l-^HM'. 5ً3d!"Y[g'$ };`6ʧDďW_=M{`wESh3?6?!}IVxH=EQ"AQl 6*;CDB"{HX fl:ipNB6-`ݯdA,d҉.bxTt8-l6eDE =z쪜ܐVf`>bhۂjIdLKA`Gro\QεVMO`DV/( IeeaHш#v머 RPq v 'X _q%kX0w KKi [GdX=_PꉱWA%]䥞 Ź öR,k-$QQ#! ;)zYtm:t:i,粦b}\SaK,m\bK^+w@v8H>CUpx* Q٤$Gf+5OFM! $[7t굛LO_-x9nWXL#FɪCd4%;mLva3D &b3̧>\2 굫757Y'Ԕt[ɕO ,7޼y +7_7Fn\JRX7?dɖΓJ$Cčd {UٚYG[akqZI+WH!oDA_|XdaeMd 9&v-S'w$R+\Iܓ]:YSA_77&/ӇoXfч8tӳ/_fdEG- 8424d!;%%le!!KN챫Upl^5~.%׮R4s 'ȦoV-Vlv)3]d%lpKf?<_$gY;zHFrY::ڡ޼3͒YfQNvlaԠH*.MmNj\MEG]:|鬐ΦD2Hv-?Y `YnQD: Wdfκ;Q:ᅏd? /}oJjsiNl6l q\oR4MAI6EjnF*mFC8م* F2+oo_q~Cʆ/UYR-u>a1gKZENjJ*)v % 9(rs> 56m? kvK\a-%A/-P[[S ^`:݅[DK]81IkwdK!{XY0獼o?N!luNF {Z"yR^t^[#8_*=$aİVOϞ= -1˳c-%OL+R!}%Cd;K!Zty&CW Aqo\cNdY[@Pwk"5 ^az'%~ANH0S\H9)ycgGz.vd,CV3Vi(e^ݷn2+joflO&kƼ: Ç ٬1fPߧ6˒ҩ1+h'E4]Uޟ$.3Yʳf雦^muQZ=1G1 Kb@cDxR1֮T{y#k/kzPʥT{p+8ݮ;w{yZ 0"qȆYsmZg:]R/rm1ؖ<6{sz:z }b2B]2?VrKȑtg+tBF.Bk ja{Jm1l%Nۇj ہzUZ4EdU`ө.5h:ސ령蠖sBmi1mރrYːZpQXarɚ6{xCjY'[d_&3ۭC=DdžС]nhdl֐+~N +܊]eF/s'k><2{v,]ZdԔ,*ʑl"x6;vW^b[˿x flg!5hȆ΅.WlF6{H-:_eV Ð {+;#PA"&C"VE2V'l=VDq N6޸!1jdqfRK{Mq>VNj>(&EbCq*V::)OJd CVհc՚y:TD8*Hgsg\[ݓJ*S^2]'JZ-,*j1f򸕸<^YN[kSO(KI%\C>q466f*ϦBاoy2y1= ߆-KV[DޒdlЖ>KU۔FZ5jga^M'$,'[d ҩ>p νfnv9uA6WPiy+VL)t6EnyzHTKS`|JC^,СDDRU_{HgMm,}(ɎU( %57*v)1z[å4r ;0ٹ*2fkA<6[64df>VنFRkdlq`vllc>-}v %KbY.eUǯfmֹ}vY&QcoWt6cō]B6"3{ lqg!i!ts0FٙN? ӵҷW^۷7_ ~!-M|zyaR>=0mAe>{l w{ŭ6r|l7yPwi]A "en(fCm heHՆYlI>˲oš[Z:rl`:{fy&ǛJC8^1EzY"rkNzbay~8ͮ/DqgE}doMWm/ǟRrEԤ/K!Q`~ȕt&όl]&d+WtZHro= miYkX!&&]X.Uuggƀ.RO)cح>,ن׿Jg 3hO 66LM<:Bi>ya :md,vO-lԏƻD?ݍ#N KUH؎sUD6v&[$7ڡr",=R\*,}CO*^O#o\:Y0Ѭ u0FLnEBOkħD?MHFهMz${E8jHg~Kq2a-2\zoXW"<g:HZȂlH4laϝZO 1LfDSQbm:EXFdwX:/*c8#(!wW Hsl;*IT[-ϪYsJh9G7b|!X_I/}GwDyd#bXM MOs^!z3|o?Jm[e{)8*!eb5cV7ك+70t7*bH7!rܢgl֗AvRI莗=(W8 &v(_.)4i$ڤD; %Ibj=leTGv mG0M+UL2]"ѓUiIÂbW<i{a↽0Q$f/ʽqmdQ )e$KA jF6K NNC&qEnPUab:{*!렊$6md9م";6YW]\6 fdQd1bv< '*DQT+ }Xzm'9E]ƱOob<]\d#m:JvLex9&D;VxVJ2> qVXR:^rL{lH": e3}͆lĒU^o!(xꓚVΏ7=Ylrx"`t=Vld綦bdY%;ibY7Ud˱YRK Е=q,o4'd%}Yã+Ƌz!: SVJ2LE ygfz̖dX 8$ #>HY8ɖQS1K! *V桽ʻpNJ=dYn"$4U.mXdl,C"qT8d:!p[SxޘA[U7{RsPU]bԇyOg޸ϻt[s.Q?lycFoLT҈6_jX4"U 2aNL(5'DQ7FخJ6m ?NlxCΨɖIV׻T_[uPVgPY-ٲll''TȞd+Ev6Ҿ.1/rK/!+X~9j&;{Za?2x| fك“acnSь좲kM? F]ޣda{Hv[t/3v,*},Beahj;3Yq,^~514u{c I%@|T^yв'had(m}mݜJYZ' ˖^vO6`qs-hq}~񡭯/N6m'<2;>?#peO} G~nN?K㽍9ͅ\뀶xCi2L$_`qrhEd)X  -EВVXŲ-,7efdmA;>:l W5!éaCKve s{ыVWW> Ѫ\5b@G-|FZ )&Kkf?%;g$I?A.O}vY&9e7=wǚV#˂5UsVhDžlѪl= M K,YzbpU?mC%xƟaO٥]Q5@۰u'!]VGVsNȲ.6qCb;^̶|}O5 %eÖ|*c^mJr{z Y/U 굿a[.)T?+mQ*)!Tn0U_hcAI SX!Y[<>nqXLZ+@pc\i3]&j|zn*Ꞑ,I87;N͒~x?8s`~%#؀Gwo2jUr vN[-__2Jir`l1Qv{$CLb$D)NWn wo<] OVКxDjgvylͭ2UtR LRakB6КǓ5J\AR.=HBO‹= $ >†b1!rOGΙe,PD[ `hoNTj$V&0X]ГryO ޻ ~Hw;](Wl?:_̃Fw]3grT!=r6 _| /8y(։FlmG&JGp HM5dZdz xRLv"P(2Y (?l}w-=,~ΧO؂6mzn'&XW D֬(dK#rb$[/ܻә"ݴ``WK;Gvđ=(d,]7G.ddSrNWycdHCi2LX ӛ%QbڤBtKiėz'즡E,H80E e.=ZyZ;(KSŚI oYVA?k㚅hUZh`y<Z-Er/Ȳ+\F󆵷[vYՑD ZZcV1d=dl-;`J6-b3A;wd?`38S$کM13*۔=̹v*8쀬nG 9 _dvWl&(ۼGmZLX@7Gnh=Nu@Y+FM6mƁGE="44ZC(R`Qq,/RyZeqEzE%,ZMM8{$zTsI,$1dA<9LC8H /N/8ENpd;wHu. )^9 K㢏<9J5DvqW({zˌ@֎c?-@ݻwo/>yGҎ= xwg{aW=HU?[@Ndw_Szo/~+\ Tn tw/ tG{wp[r= Z_ _yGt@ޔ,ywZ[(;)O ڕI0;W_PqG@.#o?9xL@} @W[O)rpq|Ar`/Kb+Lb3@)ҁ^\[ Ay̓t|..S@ GRtǫ;OtV{d =!YAG<@HAʌ,\~W}s,'=,xv.*G*7Z,vXHS47G,乐@A)0N<΁,}ĜY S|u4==`ptSb{5ds#_>`)>!&ᑿ\"Aa4_}OOZ~ # zG{T5.,fB$e-@v6Q<Đ]PzDG%ܑEJb2!(dO"2-I❀fILLm zbgT'd,-Esr|Kt#Jid$0rhqPքVK"AN QX3^Rg[-!,s=|CY'>|x( !hGTFKض YuV uGE,RM'qldgʖdhVNٗg^7VHhMN "" ǺhcSSzx7nd:(&+:( SSV637f(씩͆96loU(hlCjI++n6oba 71ټb|fmHNl>6# #z &!|!kRX& Z7d{udCjReCiMGV? RJӡg#<Lj"!Ja% /l3  rA1}BV_Yi,uu*ѭVjGUs {6slR YݐZ-wrY'Js+ޝl#R/^2{؅И<6a-/YnipJV_ sHmӑ>lz96d;eds&dƚlCjcldg fCm }* Rt6p$~b<j3m6Y[ߍ"sKb۾<W16YxC+`YJR)i}jlY· 4U9W`=g\}4J-L֯Xl+Cg"NfDd}ҽي,ٜYRɎOI>nnMnp^lֶ}V)L"y1VjSWFkId5M>:(`힧DyclN!W+:Yf]ZvW6Y鬇r bC6o$ x)|ђlv3i5Nk!O6Hgݑ (ܐpB>Ofӵ,}Fkjd%km5lVbyVQYgg菆wgO8!6lhOd@>667]ך~]+ Y}Ϣ)kp[n(H>6*obJ[E>۬m.Z6;)٢ٔdbzk|`:?IɪLj>hEd3"J-$&Z<fzVhMEtm6#&k3~VOY A!:ʹ&{]̌gFʳφN֞y0d"d 6W% y[lFD6J"=F6\q:-κĄl9]i?(, Kg=(sf,C#^׽Ig.k$vOrّ?d][:)ّ?d}OvLv$!YFYsԑ輱aSo'9܌Ǟld&k|9c3r9CV!;Š]͙垃XuK3J]o1OŹg ѓdUo:Q$e1hܠ7V֓&},ezS-l˳K.(&;4"jܼr,:m&o%jm=Y!I?f!I67mUI")(/%D`7nr=O&FYC;@dc%7OE(ޘ#YWCE\f,7zSj`Ԉ,"P}&l_utTuD;rdkW˧^=$eB2YVJó!}Q%{!yxcj@kV#6\$Zt#N;$S٢JVz&H kh7xUiP1:|F]QMj3 XuDovf"@k4UK=$olRUJ#άV:$ )E:;4F[!&!,*Ϛ9 X7m9%;S&;:(qMS= >Y Z+>gu+ G,| M3+Od"FX![+n5E6R![J=ƿl83đm{5g6%e9ftn5ݛ(J/+d70ٹ & Z]>>%x- s9gg5::s5B#q#ac?82rwzayL6Y:>nC6-W#FCMҟ]47ȓю'#hm&P O]jk;Ӝ{hcw#-6O?k]~Dbg>K]®ŃsdIENDB`logisim-2.7.1/doc/pt/html/guide/tutorial/shot-comps.png0000644000175000017500000002070411541757140022770 0ustar vincentvincentPNG  IHDRfHsRGBPLTE:f:<@)\W6(d7cd(:-A)*( 2u"T*#<1%P Fa<8#GVGIGLUcJIESD64^5epYYTDHr}omk D~02oX~trR85;zpԁ(DV½nKѓX͞]gҝ^d+_uԠͯNt˪XT܌ׇ^RbÇgލ̜׼ۏ܃ޫٌuEdtRNS@fbKGDH pHYs  tIME0+]IDATx흉CI)GaUte5@h48C$좸Q䐠$+0fϿt;I?BTxuy$'QW a0Ɠ?JdFvnթ 8^8]G277G\ҼgLCh%|%;+#D gt8#)7|D 0$6YM`C{)^.R8\[ŕmѺ %^9ъ:R 1-A͚`>LvnnejE=qY] XܐpedmڠMlh[uVLP[rEw ^{?h׶/Lq7b Y[ dt'щv'Fr(=BwA38Y8։يCmFvښ& _B"!Po[$d˓rT>`:^DȮ!R < IcJiHfvaXEl/[}?mxD5E񉬬QZXd)c>;xkrEruEt,BZ\+&J,YεbbE:9b(P.-"HbB>!. Fʑn)dd%;#¶q3ی5ک)P lL Ƿ%KwٲWB6Q*&% |Y{BBe&d=lb%6MLa'R##A5e R"2⣒-$ pXq箱cܽ"e$;{ ; 1BM7kNvb Y<,-݁UHwmOO5V%(T6fUVKtHvĕxE+-![%8q9Q5/&$ ʅZNd$mD"`K; X(2)݀EX/ UZڎ%XaAux*0qu h ɓpTcH ?A*7'XEQ k=z}V̲`2;Y۔Jk)ZĕAN~p( IgUYmX[#Яj +a P\ەE;eP! YmF\3b@2g$;X*/{,5Rl c;`~o[$`Y2va֐e'a4*yh O=qn!?|Vu :r\y ZK'VP3/oTͲk $ZsQ>d=dl-93oJ-HNg}?lzI9}Tsލ͈SFSLmNm&( ; ![t"QodL4BMEufYdC H6:{&e׸l=&XYkYlCLӍ :0õֳZ[׻;䍫һ]_ŝR }4L8}ҷd8MBlMsXAxs4~=:::Z;#^; ax;epw J^0Cvխ"_ysG4%~qwc^h-g}!Pha }OXM3d>ӣ [t?1tuQ8@`N,wp1+F~ OzKcyS_riG-]ۏLh|>;, S?fk=883Su*LSe"<;.ݤ7hYЙ ̓G8@!Cɳ9ңXC9E#C?zд"!ˤ;;8X/ =ko15|̓|.N!!7!7Ư.bEFPb$&B@ ${pXFs5ǫ],3UΔ.4YdZMd-1`V lɓEi WĘ":N۠k Gx恙, 3MNYl & ryd>v#sݸxtE^g`&|:2 1PpH`Ӽ򇐬K|OFR 6KvTTӯ5Hec-@v6,ꂺۧ‘E}**4# dL6huw>hILD6S:dŘlk5Sa:&d@LhC%kUG[,)@ Y U]Zv~@NVͷDnNM,֜v] -!@BDR>Z-yt%b+^ȲhM)7 ^Ȃe}E(y R+-fۂd(nLM,֔j,dd_DVy.^R$l+0#QZ-MveE'=֘]y+NaOcn)C+# nb1"{ Y 쀜] `uU $d9ٖCf`txTZHBC* [m]G8cʪr-'&xSI'KAM(Np|&xTbzuW 쉢Y ɾ6.Y}1!{~8>lMvF,*$Jc8Œ]=xVL6d͛7?r:{|[![7l#K]+$MuuJb_?drdsj7wV1Y$$ sXHJ' 7l&XNƹ5Z:O%Yg߼~mKVr'[HϤ1Yǩ$&óg_kdOn*0%E}Gv\lu =/竆6(we۠T9,!;qIITv"KSu֚l,JDNJ%Fd' Mo0Y\8>n:+nhd;^{_l/XH8%! _/9 Z;<uCV#G2%(Y ٖz.!YkXţvU$ 9,D| WʇPJ;yKY==@ ),9KR. WC^gvp'c66(S*gAH,3-B6 UgV[s*( + LpjSge-[Y{gGkN%:۫Z:36W/`uX6Yp iO;㧵'hYcM}{ftɾ;eX8%n3кYI>k"|z(2ºo7VhXDvza}5ZI l>_ޒ VNkduonqb VHh%dEd J5>=!;5S q=A9mbZBj ;5enl(FxH[+G8_h{gv[tmq{n"kφ9:-Y9 Hr6YgxlCjQK62f#Pt6TldS=¼7|6Tls epki}L6c!gKgmURs-:)dfY5Ruf y6;ZsϾLƋOw|[L֓x&kֽOH4&NPd}P Cd=lMnp8hrS"ϪI@';E;U:eуo"kJt ៍`1= YX/e}JкȒͨdYG:BE"lJ%وYI~5L&gA`'s'NfnY N[!Ng3ـRO 'h1 gqN|âQgzkҵ,=2hY񳧿ԏd%''tJv\@Y2.d]PFgOqV͵LȪ=nuٓs 'МxݴTgFӳAѦu;$Cg,t^ǟW7=Uo5*nutjY}GN1[d5Z?]y,Y 9_m",A*뎬ꚴHVYm5Z?ݴ*&[ cV%٬lRDYEQWYME}tVKJD[*VMKERLf-SVa%:nomڠ]}6\ldCȧoVVdҤF ?Y Ȋz~%٤lD{5x-F u.,#bl9]i?(~U״E *iz_4Xb'Uv,&YFYFY& 4驷i7㱧l#:;[czH4c-{{lhU),m5.j4c/nlA0OE3Ɏ$y5^>Su1hqvI>5lks#__PLvdL`5u\4͆CB5IWu>(3uϺ=g-Eg|~9_m9*۠Qg!YkYٱ蓍ןFv,dMdlȫ6:Bc *e[42dON]#{Vڠꩳ,9є"rh$[}?lKVԦom%E}Ԟv|gtt-X6s-.ק.pfSY=˓㋯dEAc孱/*U CgQYKFA3iΈ58#&k=9E_#N'RPN% -A9-C.^ڌ֛Է g^׵0b+,mzJqF![h0!.ړeкjkV dLd`\m^ڿq*[ 2tL68[=/Pqs G{X,S5, LZ*tYn` HȚ6d+led4sH6t/]v,-B^2K6@oXftf%KsHbI%έC`dݡpp!K,eUsgbe||seʈ K%M`JRqqD=(,"Xz,ĚJِMGa0՘衱Flm=)v7MDmm~sv7{̠1xfmPΟO--+3E2R*#9@({ Fa99T-HV3/GHC>P/XRVdA+$^Q{USL@v7u}`JVqnmj D~02oX~R:4Ǿ5<{p}ق(DV’u8KYZgҝ^u+㸩d_uԠɰLǎs˪XT^܌ׇRֽbgɄ׼ۏ܃ޫٌCtRNS@fbKGDH pHYs  tIME6wPIDATxݍCȶp".+ >.B VP\)\\Cd *V@HL&I&mZZچs6MҴ33IJSSSӕv{\hh\]>/˰_t83n FvJ{e0["1??oXXK|>X2o|c"BCa]CV O b $l1IcD^"$ȫ[=LM xsgxoHO-|{=+1kO{}aamaM Ry9i: "2`ŖJ!FkFlaՑ}^4dmrڹu+ZQrV簺GXIx Yk6'5cݔaaѰq+Rwۛ^eY^:Xao˖'-۷ՒUªdD)@K+Z+’^.+''Yw KMlH񚙮^^.͚ٲeaMUV?akִ-\"Բ8{Q-G=N%(M";Od]IfHpXxdi%LBzUf )*[C6)3b1RCizd,{#q3~g_2 Y& W[p~bX"!_z맂} A3ZZMِ,+*`ղEKP(r%7.um!ZN(WlJL5'~ir ,%]%aS8BY??t;lN۝xH|5ܝ o X 6I\X4klXQ2GKy\UІͬUo$r#NxJ,Ð5-t^-K`Y" {[0TӦ@vC`L҈,I\VE0VjѬ-V"i.+[.+VYl`*YRnLeM=9 $tڜ*+vV݅7cwI3hiҲ{)LA38Q;mȭDf&r7iMֱ,#oI)S)LXih]%00uP>miӋ{yLky0ԧ~ qهt#`"y<0ƅ7lD`=Ā ;PGڰ@z˲`V^\-"@m%D\dž,:dy -:)ؖFvZWɪ$YΒjփSc-DZ!ѕԾ8kgᚶ+zvJo;t[mzK޾͗d!L&3SJ&9difZ+)>,UA\cwc66 TikӤ޹ ˆ-C6ֵ<.br mdiEمiU ŧ _B=yd6LfJfh,Ǭ4ֹ,{!y YB2dSJYZZxV[=N ʺ5*hü!)D&>\6;yaN bCEУG9lH&,oAS-oRpE-FWIvJڔ Sp#ɦƠlJc)}d1N[т"mce,`OaY5mH}5m(1O\:|p,_SҜg amK4.M9(i[hAkW"=p%0I,gޡ0031}H6BkwZwYRuxI8걎gPJiKP+lC?z5h@ۍq+Aa=!FǢA>U;B\耒 Cb^*زddWni;+w!8P;d37kUƋk"Sf?q%oQ簢mI@6"mEihFlu:+rF5spP@ӓ*1fGhpn$\V[5g&ےH7_x{*"V%,GVI;P:imź>Y[,,-O0cΕZzbRs@av$5{U a]>hg#h*'fٗ-ÏqNTROcs'S(FTQbM[mD^\XֆCы FM lCڂqy%q+!iO*$T[Eϕ)q*NT4Ne;Nx ϴ%9hkZSy\ ["N],eh{P=fg0/f:'؍tH_z* Y61q 1dSG\KT6d=bbΣ_eA){xxk4 orAE7c9i} 1Դ/kEXgBOb5 ꗰ3]:v5MIkW/'h՜'o[B=WifXsؔy|ϮFWjn~{} ڬⰀ,ܒZwb2VgݽТX\{u?kIM67?.؅8y~ًۧ/:zdբl9Z&&쀬q@X 9Wϴуgt5&lo?k>><E:F&w qx3Ƌª Yaϒ4$āocl||, 9I9 <Qp`Eѽv}^k=Ӳ!Rʲ6Yd,容%5 ?ݫlJO9e sg[qG ƖskGeYB7O:Gf&IY;ze3&ҰOFIYy-wv 'Fŵi@ _7~O%uTk\@ >q{pdS߫e|Օ8^ِ]ZZbP ˢ}d ky (Kϖb#٥ⲚkcYrʞYcR\4IeDdqOlZMِ;7Qe{4&TP+>BlʴkPq57UOg}'˾.+:]6"k b%lseLRrdEZǞִWٽWOSj='O "Mg%NZj{eUT|uS)c7Y#Ϳ"^)b)0㒴ve-YTɲ}w@iɾb^='5. IY4ȚNw'V`p{zMYIkXgU|{pecx\:@Zʲ4kٷ\k4zV=tVGՕ%TukR7*ټ{ J뀐Rj؂& |6̯WңNlq@QOmewKqلtԣ^̻ǙliT .{씽gŤklǩ.fgwѫ,Ufղ5::)mLlʒ裲dټkO=pd)P|)N(OBY:zbqzy([1Y{Cuf 6=4#g|b{L.X4Yz!:Ov Dre+\`ֿH.:frrgճLXbFVm'~m_46,l~b^~wn xgߢl%g<2.J({jdzvُmeEIf={!K3([Yu{i(KvzPX7RNlM/Ҹ²bZ";NNILl). %X+9D\s%ՒŲd#*9ii.%WDQAd͜;Uu^R[kyP7KjYri\J 'kU3 }i]JJT&ʞ\ܳY%|dv;x{x(b/>(l6 ͜U^RFfac*ݧl,}9{=y Kji=i̎揺٥Ոͧƛ({Rٌ$kPґٽ6M_!k*(k?%([AY{Z-SVwkzI-V1gkzI-VXngQ9[Yb=[YNa=bΖp8;uI'vߘxʖ'ӁYu|G~l欮e үbd{n|}6>;U.F-7gY+KG9:> ~Gٺ !4> M6>Kj4uҘ_:+\mQz*u㳴/%_v_P6K=kl,?Ҍ/;o8c l=b|{ABB g1gC!KVdC!& MPVqeΆrg[6c 1>nggOj<=q=k嬷gl=ˎpٰnz~]q:=3([NΆÒlgs?6v|'.5ô,g{ǟnbTI}PVilֳgɷh~i6h[/5JI,O\z5e?NlF[ѡ<^.c=[vil嬧gߤ%Țô؂*S6h,YO/Bwq%WWrVEY9rVy~1,Ϳ 40-ʖQO}Ϣl ٔ..QY-[6hn5eK%l(nYe-()g%׳m~ LYYl d!e~ biל mKAŜ ֳ~l4YeՈ^sve}-mcYm8Q( T,ֳ(U>(Y_lg*@YEƒ /exNse1gQr7*31gQeQ.d4ƜEYEYEYEYŠ=>(7}a4FYTs6(([+YlkOʢ,6u[߂~cEY}e}:"@d((P1ʢ,6,]<AuŌ,'gM_dmPR5n!e}&{e){MKV~Pesڴ2Ɍ{نԮG}0qLSlҊ,6Tξ IڵGoRY7dҸesף~(YʂΜ^үū,GkⲘrvfi ծKZPvT8mc<=p]ϩ5-*Д%fVϢlY.[r'Շl ٓ֙xe+"[:Q" p ɮ]G q_Aąyu҃GZ.̇P !0bAtcfo>qZt~oFI X1 qSl,Bd͹y!6*",Vbp@IV]1߽tvUȎ8 ʠ -/iUMڑJGJZ}k5]V㪔<^6(h+i#߸~1PSئ+/a'IQ_g;BIxIENDB`logisim-2.7.1/doc/pt/html/guide/tutorial/shot-ands.png0000644000175000017500000001713411541757140022577 0ustar vincentvincentPNG  IHDRfHsRGBPLTE:a:<?W6(d7cd(:-A*+) 2u!T*#<1% Fa(@q<8#GV"U_6GIFHLUcSD64_NH5epXfTDIr}pnk D~02oX~trR85;zp~Lԁ(DV½nKєX^gҝ^Y+uԠͯNt˪XT܌ׇRbνÇgގ׼ۏ܃ޫٌtRNS@fbKGDH pHYs  tIME1nBIDATx흋CY ZZ-jHh4ЖPEC şpy`hMiȽΙ+$n2_cv 9ikkk}U7RpE.ѥ>Q]կJv&ʛb|*P*g(c*W:T*MY WkD2o >!44yCGzë%'N}JÕrѦ ex9H r`MTCk: mhƐSl2V۽phF.k V\'`9/Q+X-%XgJvЄFv;Fw-![5ϼ E+++:6 \MB"@G]Z|IZ %IL6)58Οd?n]^2]Ȇu6=ƚVk!˂U-O[[g[w\d˒'~4hx?è_ O&*Eڦktxn0 "Z Y+Zf%l>lWˆ mn}qWN- A{M7)սbF&:Uϊs,mJzW%XxcTVL#g2ֺE[CT[ӻwtNVTwd+", dlN'=ucz}|Gw. 2(&"0}6sN(Woe#k9AlZjx!;UBňGwEY:AR Y#^ыwo!yTgYlӹSm;m|"Z;Yu?sbʳtv,Ot=4ݾ}&SOEdz2Xaom p$P#@sp)W(s\lds)GvnWW\ɲ'l?XG6cMms6vz#+brDiH.7@&kĽ$pM.&]ɂ;AҴW# V{,M8 QQLTx-`5Ц\:5:dYd䣓-%pI箵c-ܽӇ7mdwjwsP幎eF؀Ewz.BvZ^ap`j'j )Xmt7Zgٽ} <[TuCۅ o9]A?j㚅fxh}zdg\yzI-\a5ϭݵSE>ZlBC5m9gχec>@ 3 ZZlshg>=9>qwc4:i1wFE ր6}&N! k¡[A7_Arl4BMV7[0Cd$ySK ?8eucmڇG٭E׃-]4C(R`QqZ6ͮ#}UJ^~|@1CGt}Vz?&Qod={` ̃k)?m 5|ˡu"܆l1 Z;>gLYr"}}!:m9 Y=Y(d"& 86$0dY[C:+ّ>r&qc"PBu&0UsPJ+QZ,C=NcjzYR ,KɖRLbQug)>gYS15:v,`9ѲlϹ.VEdubU1YLcMOlE%;{XmIp>BwUk*x#+0`%dˇl}KhdnJVJ)l䠂1 搝( *Tbeb"k{-LZ? 1u4!>b黈뮔UXd7$5g !S'@;w{WNՂ$!TH;,fpŒ]m29.F76޽{DSi![˹ oaɾ2(늒7y?TڷUxWzƁcBvcc#YPW{Oo|_ppl$$d! O6l"EЎ78==#lX_rKOzx=}هYI,ɾ~//_dO.nTB#~m,پمYZƒ,lQ,nSwZމdMEsP$DlD1̒ld7t/%f"n7ǒ nd2? sdF /̗l9cEgvZ,76=9ywݨLKm DG]vhg_㟨݅&嗊/!RaW6~\}~><:/A~c6:([,HgYf 0͆nX 7ՀR)EiofS Xhmf^Ij*i XM-K6Tf6k4a+ jY5d˳V.ly?w#N6Dl!f#mzپÅUCvfgyVꍧ}dEyBujd˳_'oZ1YA:Nxwy6\NvzW[9XeATLvzfyƭڬEvP)om6!,b$l^' `6x卣D6l>wYCj%̒_3jCb*!>K;y*FdE6gTr۷qq>;U*8҈-\YJW鄴Ͼ¦ڿZU@`\}4ժ-LVzoe8;l[,ٜY҇d'}vj[y*63"lK=S6q, Xy6Dd3V,g#Xl4X9U>fßOL6m(LJ6o`d#3 m\C6F%gE|j(cfs}6Y5*L6T ojs'ɞLϒ$zQYg!y(֔7z=I8ΉK tUfZj}#ٵ\ϭʇ7>hjf:֚h; ^=i5o<2+r38le_if1[t5ں6llMH!Y}MZ*5Vk3m9(4F.Ed}UU}ZHr.nkM8ʹ<ؐLZLcnZlA]BuqiKV7J6*φ>[7tl9\nl5mȦEd#>+9(mt@,X?Y.~PJ{5([e,^Mg%Y$[[l6%ևlɦ$:X&=D<ō!M޸N=`(y_:ٌI6UŠ͙垃},^K3I'AEg4OƫUfG4cq62JthӚ.BeCŸlO_aVʁ잶4Cfڂ-kd3f:K{ycBv dY˷j@.֗6}}*rPZNIu5!k*H6Nv*Ȳ-ltbTY(JB+J!˭Ĵ+تl6bӈ$cVxꠢm8leMŀlyL:Jŀ,7Wm" ,7֒ewfj/'_։lql6em,M>Nc`L?(x3W {Wr˪LzmߘibU=TUkCoef/q|T0ޘ#kaYӻC".^3ԗ,7*eycfU+3ζiqlIWaXCcfÃ^ԓ,A|:Dl'0zh{,SJk,]pvf#lqxkrV69r]`d$FU#kɍHul܈$[7^.aˍH*φ-'~Pr]tvV,|VIFv*JAmI$+o,J癃 qf"+k:(BŻ㪴ٚlv!zd$[/p,OlVmND$0/I6dO>t)s{🰄R fcEvRzPLh﫰3luTU͒U`W)! [,+Hud,/ʚ':(XDc$&+-fbyc8tEYIlT려7$[u' L;ٳY{yV ٰ%K=JFZAo)]I^j%uH bS++C܇4^y|1OVSWJpҩq)0HnmҎ wRbOFeΆRvv5=#D/xZƋ+֓ÏF{wYF"KZH%Z[V@ѐ}* S;u1bCՑu'vtdDkUEl1ՒlʘEG87 ѩ~:vy w!;-..!*њ\-j K#h%[l]U"K_ˌ ø|O NSs L%a] &/&lJdy֢gvTVdlj,dɆk?'OT W#y-";Ev@OUF.> OtZeU5\vrAԶxh )v%Ɇ+(\%/_e+~I"ˬ^F7WU"`V*Cu ohcEIƘ EXdt/ڴ m:a[M彽/oΝ 7q`Qq1zS<;X.pAE,~fV(ZR%(38蟬 QeFVڀuZ a';V*C/yi Ed;;t"\ٟjςn{۠%v~Gpz'I-ܿE1: ڋ'^ dsّvh"ڬ}gS$ g]B"hXASC~!7^+D!厗"ˈB;%nBt#Ey{%,:zS+`t]݁"v3!5[)ݓ{H`: (W$nݺ 7]S(+dr46Wɲ |;+ * !CpWH"Ბbvx8l ,dVY8"f޻'U\jU->oMJ̕Rs"[ԑBɒ*/% -$ D9,NRuK`)lyEF|TC۰ryCsG.%;w~z6qUEPe9㎗EpM-" N_}d;19p y6xжZ)|@`Zc9(7U|/ VCv#OpfbjnCU T(o\)<"c߮d CMA-R<$w @ ,+*<W[#" >~WtT]o9(8D9duxIXʳfaO*؎+-E\9[ru,hYŢNGC9V1ϰ hzMlZ/;a+B$ s$/0/6~"DA03#-<[lh]Y}Z{aNJS2pdd65o:䡁<ͧ'2-s0`h=Zd=Z!| ڰ"P5_ب"5V"$Z{V6d-d\{m3J-jyB0<`r1QތMi6jOwFT76]Z { k!sEnN<ݒ/)+(U6Y߉mNg-" )ڌWZC?4P) ?#@`vzaEdw1 Uw(R;U]ˌjYAV#lLjI1ldqԍ4mdI9|$;3i 186NciN#% b'y}'OoK'_=l =x;/kIkxAdӮ"EӔXkV=)Sλ)m!! ɧ XkȒb?Dyl8wSJWϭ>iN)ZX8V~~pe m=|Swa~{xh߼}?h :r~zY|2vEv{{$L&h:c36cutS )}癍G#ȷ͓_ظ9vG\nzucxPћn7hrOvmoCm};bH}g-@H7h{rC/ ]]7b$ɒ/Y|%}:phw3ÅP3TKZ 'dm5-MVYkLg0v5O`OУ!E>3Eb̷C+m`g!_m'KNFw%ְOLn ["Yt1B8Vmdy/50>-9xPf 1zQn H.O_J B+oc)Z%~,ϯ5Dԑ,r&d[d"!YxH9D Ti ,JēDMdBDd3Iל@v'!du`:!d[j\Y^?dQ:vғnf^=YZ4_S2F5p];YZuUK7+igG[[-&VxzCjn=,5<2ޕ=b-HdQ&?d%s[td!;$[*sraY ӑ5 :{xK1'ׯa{:@:~lp #JBSRt7H*@}XYoΩJBSR),$ eO$ g|"XoskTd!w~{+W,ɍl73$d=?%5w~+71G nv)dxwd+|~!_ꠔ{8Zn8~ ZcY\%<%%Y,sHL7QމLi 禢}:L6~&JkXOIAgbg4Fd (O_  WS5lŘ_ט,6 ٞ`d=7)j9yNC#kpm튝lXIx%BgQ3rK#áK:+&o`D : '͚Ŏ,eJg1sj얃 7_hyc`(zjLvmk2F+2yc+K-NJ`]SOX/Y"D@vv>-R0d{8*!CZѕ| ?=vK?/lT  UX(:(l@LJH?UjxG; s3 ҄t)dww !BYAuj"&|Y:k`28o#! M̎H(Aq`lBeZOg{oY¾>[#t3B%e d Yӝ0/_Myc,HR^ʅ?XTEW\yV&lj7{!Y.r{;Yuq ?դ=6ȧ쎆,OYoPdA|޿<*biǑ6RC zJ'+0^dd﹗gk^q# :Ր"̮O;x_©-;w'YCy8l:sP|A2աʁ{N:QꢳFuVg٥׀oTuATg٥xaC6B9ֳKmq1rZإ6*zㄬ&˙:@} YK-3mNY{44ٺCDޥvxfѴvM6YKm; 6;IW/ѐݵ9YUG dVݥyf:Σ ɮ[Se8eyoꬲK7[3 :qh]v'JgKyϑtzfoW~(\YO6R:O%ܥ_h{gvm8L]U˳RpdE;Ɵ╬,Rیdfy_O6Ye]x]uvU㟭cf$++pm?ld *V'diSOdV=ܠl]c׿XX12T:(oT`:euYAtdA-XF?kJ "Fkt^bC|~a]f?^ sPd%khUd8#coP?;zcC CI0 k u6@VRv WA˒U-FfMY,/fMŮZɆc kYW,Ƭ,?\Qllh{W[Uޘ']9(u;>M}Ӛd}r'O6ۯ2+*uϲR8o҆3VQ(d{HiP>F6Z5u-?[ET^jYio4^jseFdֵm|Rg _O["E pȆTR"%4fb&]Ol={F:;,[c`d/.M}SxlEdhG\ W5Arm%>^ POȒA`\rڕrxw2hIUiFq*@"L+qm%YJ&G-GdO]}&͌lkRՌ#L~A5a5JTO򵢖KpyH#{@7SD_;PbD&5p<2ɏ#;JE; =#wbG5f3Jof2_Wbb2Y*γ8r$%;HɎr֘k+!ԍ"w[\rBMV@vAͦho\t_D͐.BkL.|[ b}E(SK8_F_!lQpmOIE5K}TSlցTk5GyjRXklD  لl|Ȯ|l@63K(X^a\<{}5"{ Y1G'+ѸsA2]* @V;8z@" ГכP=Y) hStCCo.MGV8Yg8ErpV:]B~y"6R0! 9tllSA*#Ml">xmƳN6:;{zj$Dik|`!]+e[uxuxSkjtm!lf-<0q+ZMYItHg ,ȏUUޘ ߛӗ`xP=а!XYjTذVw9Пsآ.e D3jTAo Cce ǤCZgA)9TUJ>gAgEBU3n dgk;rD .U,zbuXc胴0Ah7q+$,dVycig#2 g@,A]  ĆPx`3ndmB# <s!xVyJ=/a= WY'ϻCG+قdɹjcۤdtVkWdgkʕmNZZ1Y3FA͹bCst)ct;Qcl!d0l28;?/:L*/ʙ7ilAS11Fwq4`oAtVL>S{;֘7i7@vb<c0:\LlÇSy$pyVC5:uau[FN:,"k7*و+rYv1* YPte{c.͒rP hDqBJ5c^~=R%Ylp=p'?F t8Nq^6ϸx[:pFI+\Pě.7:i'q>{MF'ao'Yq$;[eN,eYdHvmIDAT"[_drT4|,X=\Hd, sQ;\H)6d.|)!>> ͎,H\܏K#U@4;i9^d3_StneL\'[.Zdq,(sd"^P]#[ ^/,Sh1al9:C3Gq%Cӏ5&* ɊY&-챗P!١Jɒu[8J+73PvBl&OvJqpᕗK8UT(q<4-4.ٵBPk:[/B GMRkʳexkHab֢Zp0pHg7`/`E0Ϭ*jZ%B NƿJ]Sgw{ՌH єgcA} K& ,ёY{yօl9a*Xy$[w/[ F!yK2k6@kD<#N/@Ydţ,. _LYbt+|zQ^FFFп iQ pva|2ψJZrlja ٴ۳4xmOMO? .J;`JTiGb6{O:?˴#hc7-6/nrTimk;i9Lq4IJ瞪IENDB`logisim-2.7.1/doc/pt/html/guide/tutorial/index.html0000644000175000017500000000343611541757140022166 0ustar vincentvincent Tutorial para o principiante

    Tutorial para o principiante

    Próximo: Passo 0: Oriente-se

    Bem-vindo ao Logisim!

    Logisim permite projetar e simular circuitos digitais. Foi planejado como ferramenta educacional para ajudar você a aprender como os circuitos funcionam.

    Para praticar o uso Logisim, vamos construir um circuito XOR - ou seja, um circuito que tem duas entradas (que chamaremos x e y ) e fornecerá a saída igual a 0 se as entradas forem iguais e 1 se forem diferentes. A tabela a seguir ilustra a tabela-verdade.

    Poderíamos projetar tal circuito em papel.
    Mas só porque ele está no papel não significa que ele está certo. Para verificar o nosso trabalho, nós iremos desenhá-lo no Logisim e testá-lo. Como um bônus adicional, nós obteremos um circuito que se parecerá melhor do que aquele que você provavelmente faria à mão.

    Passo 0: Orientar-se
    Passo 1: Acrescentar portas
    Passo 2: Acrescentar conexões
    Passo 3: Acrescentar texto
    Passo 4: Testar seu circuito

    Aproveite o seu contrutor de circuitos.

    Próximo: Passo 0: Orientar-se

    logisim-2.7.1/doc/pt/html/guide/subcirc/0000755000175000017500000000000011541757140017752 5ustar vincentvincentlogisim-2.7.1/doc/pt/html/guide/subcirc/using.html0000644000175000017500000001017311541757140021767 0ustar vincentvincent Usar subcircuitos

    Usar subcircuitos

    Agora, suponha que queiramos construir um multiplexador 4:1, utilizando instâncias de nosso multiplexador 2:1. É claro que gostaríamos de criar, primeiro, um novo circuito, que chamaremos de "MUX 4:1". Para adicionar multiplexadores 2:1 em nosso circuito, clicar no circuito MUX 2:1 uma vez no painel do Explorador para selecioná-lo como uma ferramenta, e depois poderemos juntar cópias disso, representadas como caixas, clicando na área de desenho.

    Se você clicar duas vezes no circuito MUX 2:1 no painel do explorador, então a janela mudará para a edição do circuito MUX 2:01.

    Depois de construir o circuito, obteremos o seguinte.

    Nosso circuito multiplexador 4:1 usará três cópias do multiplexador 2:1, cada uma desenhada como uma caixa com conexões em suas bordas. Os pinos nessa caixa corresponderão aos pinos de entrada e saída no circuito MUX 2:1. Os dois pinos no lado oeste da caixa corresponderão aos dois pinos direcionados para leste no circuito MUX 2:1; o pino do lado leste da caixa corresponderá ao pino a oeste no MUX 2:1 (que passa a ser um pino de saída) e os pinos no sul da caixa corresponderão aos pinos ao norte do MUX 2:1. A ordem dos dois pinos no lado oeste da caixa corresponderão aos mesmos de cima para baixo, de acordo com a concepção do subcircuito. (Se houvesse vários pinos no norte da caixa ou do lado sul, eles corresponderiam à mesma ordem da esquerda para a direita no subcircuito.)

    Se os pinos no layout do subcircuito tiverem rótulos associados eles, então Logisim irá mostrar a etiqueta como uma dica (isto é, uma caixa de texto temporária) quando o usuário passar o mouse sobre o localização correspondente do componente no subcircuito. (Se você encontrar essas dicas irritantes, poderá desativá-las através da aba Preferências da Janela de Layout .)

    Vários outros componentes irão mostrar essas dicas também: para alguns dos pinos de um flip-flop predefinido, por exemplo, ao passar sobre ele explicará a função do que faz o pino.

    Aliás, todos os pinos de um circuito deverão ser uma entrada ou uma saída. Muitos chips fabricados têm pinos que se comportam como uma entrada em algumas situações e como uma saída em outras, você não poderá construir esses tipos de chips dentro Logisim (pelo menos na versão atual).

    O Logisim irá manter informações de estado diferentes para todos os subcircuitos que aparecerem. Por exemplo, se um circuito contiver um flip-flop, e se for usado diversas vezes como subcircuito, então cada um deles terá o seu próprio valor quando for simular o circuito maior.

    Um vez que tenhamos o multiplexador 4:1 definido, poderemos usá-lo em outros circuitos. O Logisim não tem limites em quão profundo os circuitos possam ser aninhados - embora ele irá opor-se à colocação desses dentro de si próprios!

    Nota: Não há nada de errado com a edição de um circuito que estiver sendo usado como um subcircuito, na verdade, isso é muito comum. Esteja ciente, no entanto, que quaisquer alterações nos pinos de um circuito (adicionando, excluindo ou movendo-os) irá reorganizá-los também naquele que o contiver. Assim, se você alterar os pinos em um circuito, você também terá necessidade de editar qualquer circuito que usá-lo como um subcircuito.

    Próximo: Editar a forma do subcircuito.

    logisim-2.7.1/doc/pt/html/guide/subcirc/library.html0000644000175000017500000000350511541757140022307 0ustar vincentvincent Bibliotecas do Logisim

    Bibliotecas do Logisim

    Cada projeto Logisim é também uma biblioteca que poderá ser carregada em outros projetos: basta salvar em um arquivo e depois carregá-la como biblioteca em outro projeto. Todos os circuitos definidos no primeiro projeto estarão disponíveis como subcircuitos para o segundo. Esse recurso permite reutilizar componentes comuns em projetos e compartilhar componentes favoritos com seus colegas (ou alunos).

    Cada projeto possui um "circuito principal", que poderá ser alterado para se referir ao circuito corrente de acordo com a opção Marcar Como Principal no menu Projeto. O apenas significa que o circuito principal é o único a ser exibido quando você abrir pela primeira vez o projeto. O nome padrão do circuito em um arquivo recém-criado ("Principal") não tem nenhum significado algum, e você pode sentir-se livre para apagar ou mudar o nome desse circuito.

    Com uma biblioteca Logisim carregada, você terá permissão para ver os circuitos e manipular seus estados, mas o Logisim irá impedi-lo de alterar os aspectos dos circuitos e outros dados armazenados no arquivo.

    Se você quiser alterar um circuito em uma biblioteca já carregada, então, será preciso abri-la separadamente, no Logisim. Assim que você a salvar, outro projeto deverá carregar a versão modificada imediatamente, mas se isso não acontecer, você poderá com usar o botão direito do mouse sobre a pasta da biblioteca no painel do explorador e escolher Atualizar Biblioteca.

    Próximo: Guia do usuário.

    logisim-2.7.1/doc/pt/html/guide/subcirc/index.html0000644000175000017500000000261011541757140021746 0ustar vincentvincent Subcircuitos

    Subcircuitos

    Como você poderá construir circuitos cada vez mais sofisticados, poderá querer também construir circuitos menores que possam ser usados várias vezes como um módulo embutido em circuitos maiores. No Logisim, um circuito menor, que seja usado em outro maior, será chamado de subcircuito .

    Se você estiver familiarizado com programação de computadores, também deverá estar com conceito de subprograma, quer se trate de uma sub-rotina, função, método, ou procedimento na sua linguagem de preferência. O conceito de subcircuito é análogo a isso, e serve ao mesmo propósito: para dividir um trabalho em porções menores, para poupar esforço de definir o mesmo conceito várias vezes, e para facilitar a depuração.

    Criar circuitos
    Usar subcircuitos
    Editar aparência de subcircuito
    Depurar subcircuitos
    Bibliotecas do Logisim

    Próximo: Criar circuitos.

    logisim-2.7.1/doc/pt/html/guide/subcirc/debug.html0000644000175000017500000000576011541757140021736 0ustar vincentvincent Depurar subcircuitos

    Depurar subcircuitos

    Ao testar circuitos maiores, você provavelmente encontrará bugs. Para se descobrir o que estiver acontecendo de errado, explorar o que estiver acontecendo no subcircuitos enquanto estiver testando o circuito global poderá ser bastante útil. Você poderá ver o estado do subcircuito usando três maneiras diferentes. A mais simples provavelmente será ver a hierarquia da simulação ao clicar no segundo ícone na barra de tarefas acima do painel do explorador, (), ou ao selecionar "Ver Simulação" no menu Projeto. Isso alterará o painel do explorador de modo a exibir a hierarquia dos subcircuitos que estiverem sendo simulados.

    Um duplo-clique em um elemento nessa hierarquia irá mostrar o que estiver acontecendo dentro desse subcircuito.

    A segunda maneira pela qual você poderá entrar em um subcircuito abrir o menu pop-up do subcircuito pelo botão direito do mouse ou control-click, e escolher a opção Exibir (View).

    E a terceira maneira é primeiro selecionar a Ferramenta Testar e então clicar no subcircuito que desejar explorar; uma lupa irá aparecer sobre o centro do subcircuito, e um duplo-clique sobre ela irá apresentar o estado desse subcircuito.

    Em qualquer uma desses casos, uma vez dentro do subcircuito, será possível ver quais os valores dos pinos no subcircuito corresponderão aos valores que estiverem sendo enviados através deles para o circuito que os contiver.

    Enquanto no subcircuito, você terá permissão para alterar o circuito. Se as mudanças afetarem qualquer das saídas do subcircuito, elas serão propagadas para esse. Uma exceção: as entradas do subcircuito serão determinadas com base nos valores que entram no supercircuito, por isso não faz sentido alternar esses valores. Se você tentar introduzir uma modificação no subcircuito, uma caixa de diálogo se abrirá perguntando se o pino está ligado ao estado do supercircuito. Criar um estado novo para o circuito? Se clicar em Não, cancelarará o pedido de alteração, se clicar em Sim irá criar uma cópia dos estados vistos, diferente do circuito externo, com o pino de entrada alterado.

    Depois de ter completado a visualização e/ou edição, poderá retornar ao circuito original ao clicar duas vezes no circuito principal no painel do Explorador, ou através do submenu Ir Ao Estado do menu Simulação.

    Próximo: Bibliotecas do Logisim.

    logisim-2.7.1/doc/pt/html/guide/subcirc/custom-layout.png0000644000175000017500000002024611541757140023311 0ustar vincentvincentPNG  IHDR3 ksRGBPLTE N@EN(n hL(:uN,C1C0.,T*#42gP FaH&GU1FtIGDdMTbxOE5I>C2ifFdbcaZXx}6w^LRs_uNgfil|utJE$š}nV~>uh6t?\Iȗa)ǂOьYcʜTi-Cwoߟyաq}ؤ뮬~ʪXT܌۳ཾɸƎʪb̯Ӥ۽xFhbKGDH pHYs  IDATx CF'l lH&^ B¥!i{7K 7$,8Mp4FoX^ϧs̜tu^euΫ]]PxG.rl(dNb+}ToË"t"~_Ld}yٜ]^fA*@Ϸ,T+^"ȿ~b;w]]*,UB ,eaia~0XX 'O+K]VחVJeJ!4&P``"@䄐SD f`RP#[?2jѱywe{mN/7AC|av7"p% dMRڅl1҆44Y 8+,+f06C(CěV'}944 X9>~ +ﮬaы`jg^h˧X]+ Kwx @:)2g!&u`:_~;ݟ?{ M :ޭMC:j! ]d f3@ܽd7>~&2dHP_?_؀/{g@.~ElÏO40Zx C?\!x(\\wDvS+x F{ Vh"u,*V\yyǔH!ke\(O܅]|oV3T&F0XF[v:KO{SFNs#ZAVlBޅS ?o`(~ ǓǽV4VPbp|LL oR}Q" )tDת# @98`c X "86XG;k H86 1k`8/5SET=ulֻ}qFcon_`ROܣx!+v2 M"(Y /VX>׎1yi6EHd"Qѓz8&!XKwaݥջl=㎍DڅhI0,B[YIlA3ku;LH|]!ߥS8'6nn[ݚFe&ô.Xy%"K1 p f0 z %qs];)5UvOXխLbjU!+b(d@,(2@>+Zۗ92=Nu*mwW<]C'(b01P"X5,e&ȼ;\ym-_"={=bFB2C^'>[C jʠ^ wBB3q~˂]PTnBZSrjECయF|"N@x!~͎`QQ_c+H|d|`߹C9w\s{#! elHkF,."T3*91#$%zB2K VP%aA8+0rIX$,#r(%d5'ߥ#H #(rm{!@hs)#S&XrGr> Grg *$Xf ;*<O WQJOVsvd;Qp:" y$}U"2R]*iOܤfBϱigc7_!}D(+iC=U. |!`8y!JFVxV2S(#pΩlZ|A8W杛_W!FɀA"aa!ŀU`ް-F_ A60Yq[ 5XES' AHA4 2p @b@`:I:Fa1ܗ!0;<$AC :/ %w `!V R'!+8@'YgjRʚϖ(s@q)G`2#=8tsD`F/S6q"@39VFKDN,9vGK<* B1m"=Ĉn~ԍSW"U3Bp#HAe @cŊs"8C#Q1!@2rtS*9PU޻\[ylo aj5lhDDW_ ON;C/w oyP''mFW@@/'ob+'I!h@ 8Ȭj'ǂdX< SŃ{&{0 5&!Fw`D4D%,_D@B¶`4 sA#@O/+#'WW #h JVAdH` v|Ăm>!Viށ@Dd"S" Bi8<yC8qn ? AH?$2nB p=?[76 sS3ɮ䅠mYAī# :W;lG}Y;g l~D(Ă7LD`iw0= - 8s"T0v|!`{V "+ID_ F]p= # BP"̀ v6,^f襑ذñ0= Ev8[P;`6jǞ P^.ݙ+YD ǧh&j#2vi)"A%3# q'AfnkCf8 cA ,H AfΟׯ@Y[+!Oѳ X5+;= AU V0ϵ*ڵ}`(.|ZAQ `.P툊 OajK =x!(ZEĉ@;6 Af8S Qr:`!0|!A`Ho 9G$˭`` -4LMX;F$99S?y 򋅫ֱj;"D4"H^i.[˓b@ y8ܭ  ǒpDxE(AS;'ȯ-1 EP9T{p|||A^UpRXPJ,,/zAڱU*Z"BnH툴4 ê] )+ Q -^U )xZs;Yg_(jZGM_l؎껍S}XAQ;.sŖ!*NYVP0kw;e[buDX:PtTeb_@, AVx'AxF.Tl)eh NxA0GBtB}ŦڗC #AW/g|9`)f/a@0%|!8";F/ H}|EONAͅ 捠k =2+(Š/h6ʛ6JX =A?WJPzXhe+ x"8W֋iZA ņ xFXX/ ^(|>3L G3Mx=n.NqvԽԼw4` $0!!씘J[͊׎1 9jfem:mD 1|,_ t[J -1/`8[ !Vn@@^ wYtDKGcO=ljDI [p}UU" T C!/Ho[lBY8fA῟@HLXca8 nXtCe) Ȉ^ Y|pY2a!ad%1 1 ͬ%ߘI;D 1 b/+Pzd'QT8"[{߱+Ƭj| Yho16`8bfYA,cVh#bQsLӮAY ` sD_r~cCBC4 `iqDZ57~ұ!P!o$[`]RC=f|cCNOOގD13@!Eprr%Gn$#15-YF $Z:kj.mDYΚy$j\zƃ`lLk#tH+# LxZA3 b2I+@|Jg-l 4t5*Ws!wsB/p<:|䣯=:feNj+cA׸?`Q%cVVA` nn(}s qcV@+_fu4\E1^i :U; |#aQnC"5; %+_=pz ;iV/H"_|}#:~-/ `o'Ŵڈ"ЪκYM?n) _KiN鵔&XIAvDA;. zs"0gX 'V{fY`l/KX ]#9 `D@`?ֵf ;h][#F83[*'q!A (2١.D0h]H @Lu9 @poкF /@`Dbкb[O;0o8#4k,G#2@~X q9|M h7 rI䥝 A*s!A G@4nd?#0GᎾAV`)_ޯ(3P$5>@S"ȶ-Ҽ'[tqSCtcQ4#csF|S|FcPh=) \Z&F=C^A? "+wl>3Ğ]dLag@SYHAP:"GeotB $LNiΖVsc t@rD6#rQ{J-DxڱYAZzvQIG|Sb4@Y[JsQ<1p-'f;?;G`W`z^ ~8mH(iܱ}u{ `9 c4 0!h!8ưNB8 5bnxD#Gr9A5}͏`,rm`2`B@@Xv|厥d |ߌV!;#P=DUkn(Xlg0wm1`Lzc GE@d*Zc aAl9)ܱ;ǃxN9@xݹ&rvXi8fwYL 99v#h "94 5rY`[A1^iXP$FQW!slj 7QedGPψ,gb#9A3`4߃כ}+E<=qA $i'.Ny!^I#EV1楋 Cp";FR: (YD ׯ@BmN#Gp=AyէOk3 SBzqS+R ؋"8ٙ?lH {-6^ƯzPc#.-g'al_[g/B4NF%HfG#r0^ƯPG9Dq [ P;¯p`p+X^(Vp9xN^vɞOsAJDΪYV;W͘z^8A?F^lEY/H$@a[ՌleCZP/@P/셼~R5RqRF%xlN[Q&l=$,.?,lT*REvyC2ifsFdbcaXRx}gftnZRuil[RJEwxu}2~>tf6t?\Iȗa)ǂOYcՐTi-Coߟyաq}خ~ʪ܌۳ཾĎʪeջԤ֤Խ|y3bKGDH pHYs  IDATx흉CGƋ#g1bP1fw1` F`K2}UGUwTշZ:ZݨWUwszԅ?a%~58Pz>vaGu>nͲP A0Zvrv(Ty+_++c ?X.PЧ `-G_XyX)5 `y%4_=Eֺ{Pvzjv'dU71ENsZ.=x"24! r0|H>Y0_ JV~IG`_p !D\t[nHAE50<c@#(#Xz.p AϭNN/s+*?T pHu 1=im/FzhׂexV"g4YSlP{w==pcDJop4l8mͳؠZDt[xSD!~7H "1^"gұ2 {EQx"6ݣ-9,|1mqA@T 7HOqbx&) du4@X,-͐W${{wgt #GCq8.nfi4فt d@Yߢ8@ 2?pr`?=(Y 9F冫rkfLl^U|~;cTqsiQkX3rq? _,*rD ƠP]`l-79{,vn.<]Z++~['DOõs;H4{ DcZM;;[PnېbZL7Flca`!`?Z/S19+Iõ{΁܎>eT22M2,;Q#ھιp#n{M_v,t j\՜bΆjſ.5"@b 9 V>XkL!!LLBە5q׷"m;}U}E++ 'J́ B;ZiUp^PY X5e D5(e-#A ^S! hpK A<΢@@< J9 A*tHCPG1#@h6DC _~!q;vp l l/sh]lNF#0h;hO+ l6^5E:m#"g6EeCmlO JV&{kn/9B;A'ީQ N (:ğ\ {0"Y}  :d}v ɬp8xHӁKa "˾H<#h8c jt:1|xV+s|a! zF B.%P"メ؍%j4 "/L7`#A$@QwqBP#y@{)EX5S`GG#RYu$( BPV( 1 B#THQ_!+yuZeMP[Wa1B!E1;AȦ!8<y[Mnܤ\C,n#f!GA~B^-X,/wDdܿoCgYf>1y xGpV[AQCpG\-othA AzrRm9 D^ 4/j-޺m>=qࡎࡇg` 5\Ђ꽽u}CX䈀~ZAwpjiN|!A>K@LEo V"( ܢ \К^@E3~APKD]" f:f S( ~ğVGPivCp@!h6Zl#RDL'j)Ut P|V]6 񓉊ioE)a_.-hI 5֒d-' 9o $DO6s#~K_pSSS.]6^ D`BkC?ș4@ FtSdLyZ]!xk.~;A!  yeA悷?OsseA+#Sa "ʂV.>~|M^=0 `+ Zi(bұuSW 3ʂy[(U; + 6aV ATKirME *0(`B<O֒'OБ(ԷHz^TΎ,۩& P%Er~~v|{teN5^u.Jx*#j}{_'l!I︡DKph S {AƗ)H |ߓD f쟃/O! !(g2Asc| %"@R  T z|6`^"ʲp:d^qKikh zxA vQ8Ij@AF/&SSSK/d!PDrDZ"fgf ɖD(^n5@ @T/_'@$BzU/КP?-- 119"I[.@6""\"+`&3{A l?@0 HRGA@k.GF >'R4EA` D X:6FE C3YA@$3vZ(@*^f!qBA\-J;@8OӁ ff 7v9ZJ6N\j Ah9NIR V$F /ТF  .9(ث>L!@#[/@ wI"/(d U"_`+P D;m8 "A!0ZȤ@ HbP()8 (bh5L My%n.ydR".$ Q(`6-^AB"vMia@`t'}^AWx LΘ^ "D"v2Hy:A p5jmƻ3 \(Mv%+&ʗA"C@$NC5Ueh tcc%6f"f:YA_X0wh\H!Z~h77{S `cuξ6@#3LL)Lǡ;.X/}ԓR\5sވ]ڈ uv H;X&&6a84C,1yzBe9E 5BaK_%COWG-|0_~ \ySYJG৿hwd B~!o">=K4{AK4",}S`9!_+ Q5 eԪd aH!HRbG <{V7,QA`)w F]vD.P!t^pW6{A  W^7ϿbRHx!zK"hI}P5P~jdBVDˑaVӆra=|GD13Rv!ORUj~hE?Xc-.?״ךʪ,k! #xwf=W=T%!5ʠM"@s;jS*W7-y! ߂d; p۬-u. TY/Нō rv-=\D-84 Qmx)s%!\ݗ32C@?]D/ n\bEPzAA_׉,+f5&jVY5 P/8+{{h8zAAbj0ҵj_KǻR% ^7N[>}D ZӆW4UڊdblWQBilxRƿ vAB$:lely OƜeCaFNwW@ "e Bk{em F'Dkfwx1m ?߾փntwJ еwZ5}(8IENDB`logisim-2.7.1/doc/pt/html/guide/subcirc/creating.html0000644000175000017500000000257211541757140022442 0ustar vincentvincent Criar circuitos

    Criar circuitos

    Cada projeto Logisim é realmente uma biblioteca de circuitos. Em sua forma mais simples, cada projeto terá um único circuito (chamado "Principal" por padrão), mas é fácil adicionar mais: basta selecionar Adicionar Circuito ... a partir do menu Projeto, e digitar qualquer nome. Você poderá aproveitar, então, o novo circuito que criar.

    Suponha que queiramos construir um multiplexador 2:1 com o nome "MUX 2:1". Após adicionar o circuito, Logisim será parecido com isso.

    No painel de explorador, você poderá ver que o projeto agora conterá dois circuitos, "principal" e "MUX 2:1". O Logisim desenhará uma lupa sobre o ícone do circuito a ser visualizado, o nome corrente do circuito também aparecerá na barra de título da janela.

    Após a edição do circuito para parecer como um multiplexador 2:1, poderíamos ter o circuito a seguir.

    Próximo: Usar subcircuitos.

    logisim-2.7.1/doc/pt/html/guide/subcirc/appear.html0000644000175000017500000001767211541757140022125 0ustar vincentvincent Editar aparência de subcircuitos

    Editar aparência de subcircuitos

    Aparência padrão

    Por padrão, quando um subcircuito é colocado dentro de um circuito maior, ele será desenhado como um retângulo com um entalhe indicando a face norte do subcircuito. Pinos serão colocados nas bordas do retângulo com base em sua direção: pinos virados para o leste no layout (e que geralmente aparecem no lado oeste) serão colocados no lado do retângulo oeste, de acordo com sua ordem de cima para baixo no layout. Pinos que estiverem virados para o sul no layout (normalmente na direção norte) serão colocados no lado norte do retângulo, de acordo com a ordem da esquerda para a direita no layout.

    O retângulo padrão poderá opcionalmente incluir algumas letras que aparecerão no meio. Para especificar isso, escolher a ferramenta de seleção () e clicar no fundo do layout do circuito. Isso irá mostrar a tabela de atributos do circuito, incluindo o rótulo, direçao da etiqueta, e fonte de rótulos. O valor do atributo Rótulo será desenhado no centro do retângulo; o atributo da direção da etiqueta para personalizar o sentido em que o texto será desenhado, e, claro, atributo que personaliza a fonte utilizada.

    Forma personalizada

    A forma padrão é muito útil, e de fato Logisim existiu por muitos anos, sem outra opção. Se, no entanto, preferir que o subcircuito seja desenhado de forma diferente, você poderá selecionar Editar Forma do Circuito a partir do menu de projeto, e o Logisim mudará da sua interface normal de edição de layout para outra capaz de alterar a forma (aparência) do circuito. Abaixo, editaremos a aparência do multiplexador 2:1, para que seja desenhada como de costume por um trapézio, em vez de um retângulo. (Você poderá ver a barra de ferramentas do projeto, logo abaixo da normal. Isso poderá ser ativado através do menu de projeto, e ela permitirá uma mudança mais rápida entre a edição de layout e da forma.)

    Com a forma do multiplexador 2:1 desenhada como acima, o layout para o multiplexador 4:1, então, aparecerá como o que se segue.

    O editor de forma (aparência) é como um programa para desenho tradicional, mas há alguns símbolos especiais para indicar como o desenho funcionará quando colocado em um layout de circuito. Esses símbolos especiais não poderão ser removidos.

    • O círculo verde com uma linha que vem de fora, chamaremos de âncora. Há exatamente uma âncora em cada subcircuito. Cada componente em um circuito tem um único ponto para identificar a sua localização; um usuário verá isso ao criar um novo componente. O clique do mouse identificará apenas um local e, o componente será colocado em relação a ele (geralmente com a saída principal na posição do mouse). A âncora identificará a localização relativa ao desenho global do mouse quando o subcircuito for criado.

      A âncora também identificará a direção em sua aparência, conforme indicado pela direção da linha de pontos da âncora de seu círculo. Ao colocar um subcircuito em um layout, o usuário poderá mudar a face do subcircuito, a âncora indicará a direção em que a aparência será orientada. No nosso exemplo, a âncora será voltada para o leste, e cada instância do subcircuito no multiplexador 4:1 também estará voltada para o leste, então eles serão todos desenhados com a mesma orientação que a aparência do multiplexador 2:1.

    • Os círculos azuis e quadrados com pontos são as portas dos subcircuitos Haverá exatamente tantas portas quantos os pinos de entrada e saída no circuito. Portas correspondentes às entradas serão desenhadas como quadrados, enquanto as portas correspondentes às saídas serão desenhados como círculos. Cada porta indicará como uma conexão para o circuito corresponderá a um pino de entrada ou saída dentro do layout.

      Quando você selecionar uma porta, o Logisim indicará o pino correspondente fazendo sobressair um diagrama em miniatura do layout no canto inferior direito da janela, com o(s) pino(s) correspondente(s) desenhado(s_ em azul. Isso não acontecerá quando todas as portas estiverem selecionados.

    A barra de ferramentas contém aquelas para adicionar formas adicionais, conforme listado abaixo com descrições de como as teclas shift e alt modificam o comportamento da ferramenta. Além disso, clicando ou arrastando o mouse com a tecla control pressionada normalmente remeterá a posição do mouse para o ponto mais próximo na grade.

    Selecionar, mover, copiar, colar e formas.
    Adicionar ou editar texto.
    Criar um segmento de linha. Shift-drag mantém o ângulo da linha em um múltiplo de 45°.
    Criar uma curva Bézier quadrática. Para o primeira arraste, onde você especificará os parâmetros da curva, o shift-drag manterá os pontos da extremidade em um ângulo que será um múltiplo de 45°. Em seguida, clicar para indicar a localização do ponto de controle; shift-click garantirá que a curva será simétrica, enquanto alt-click desenhará a curva que passará pelo ponto de controle.
    Criar uma seqüência de linhas conectadas, cujos vértices serão indicados por uma sucessão de clicks. Shift-click garantirá que o ângulo entre o vértice anterior e o atual será um múltiplo de 45°. Bastará um duplo clique ou pressionar a tecla Enter para concluir o desenho.
    Criar um retângulo arrastando-o de um canto para outro oposto. Shift-drag para criar um quadrado, e alt-drag para criar o retângulo a partir do centro.
    Criar um retângulo com cantos arredondados arrastando-o de um canto para outro oposto. Shift-drage para criar um quadrado, e alt-drag para criar o retângulo de a partir do centro.
    Criar uma oval mediante o arrastar de um canto de seu contorno para outro oposto. Shift-drag para criar um círculo e alt-drag para criar a oval a partir do centro.
    Criar um polígono arbitrário, cujos vértices serão indicados por uma sucessão de cliques. Shift-click garantirá que o vértice estará a 45° do anterior. Se der um duplo clique, pressionar a tecla Enter, ou clicar no vértice inicial completará o desenho.

    Próximo: Depuração de subcircuitos.

    logisim-2.7.1/doc/pt/html/guide/subcirc/4-tip.png0000644000175000017500000001651311541757140021423 0ustar vincentvincentPNG  IHDR}%sRGBPLTE Ew<2(6:\W6b(PWe5 ,?*+)S+%AP Fa<7,HV]562GIE}BRRVdA)L@W~WU6d|Kt`JpnksD~ϟ~ 1oX~tr7={p_~$Ä:[FɽKzYίS]Ҝ\f+⬪{_sԠȯKt̪ՅܾRaھ]Ȩ̘xиؽَ۩؋i;tRNS@fbKGDH pHYs  tIME 0vlg4IDATx흉CHXpU)v UNYeP"E"ۮRO1hB4I3I:˛7oɥK.^%z$y&1QOgvߍ}踰>g*DufO,e†f P 9[H'vIBϲ"%}KY~ tVygB)mX5XoCxPh&0hJ&OgCX@ZDϻnz䧟~[0L'>>B3cu^^&xҝx>[=hм> wDI pNIZB3E9W / C*Z1pcuz>G"QD~I >C<_#vKe0 & \Ȕ(6[iQrӣ.rOwYLmY#T" v=_Bb/!ys3S( xeBkC'hbƐ>*8\+NO^QkdU6>H1~#P~ǐTѧt-F9K(#4/ Sp3SrX,Np"`ڇ`y0ٜG1 A-0")[~/@5a v\ow{ډ. UM_?c?˧jDxOo/j &m{r"1 ʉĺ}x ˓Q#Ed*_6bn&oWۦG/>YF"<1ax:S/0'c8K=L_u @gnb׭տacikG}ED{6w{VĚA nljhWp+ӗUunFb#k&v%i.Co,+O@O $Vˉ8*Z ul< b]=I#ѼnlAuQ#,u!mXVޫhD ߯q?qÙ|oSn1|~2O ִ']3m`Q#xOM]ۧ؛Cy69vQ[JU r߄a#==UD -O>Z"Hhݟ/S20ƗY[4lʴ 0VG/p=JiyTه9ܟ2砧Q߻4/)@SZ4b59szt3 1/%#olu@qk>~r+Nn\ ;Cua6O 5`M5垢\ [W# QƷw(bY'u^-v]K9B&,Pk,P^_D J3 LXpµPT~`O<퀓7:f~ Z~OƟ洜[N$Ml O_MmUmc r\xm|3ߺWGY?>88xuAm Yb@_p>8xԖ܌s5h]696=+~"$ Lt1x-|]'oyx B[`M[=H]ƭmFyO~]\Q~t}r}d '4-oFdFFbvwz1ּmh?0.7]|E!? 5 OLQitL?R'uIZ8Z".ڵÛCfkx+rjHuᣮG]r~zm/rfFP}&}EGKpKDnmz$ / C7p ]gC3b/Cp-੪GGwt,}>#lȑ Jr)%hh>9/W~c\ |` VGqzGǽJ{rt6i+@ :%铃'FR60*R~k.Iτ׮-F_"BAMcIHPւJݘSh%8='ݯĴ|_釭-c>_~:Gc_d鋖~ф>37 dm>+o[9Q_.9ގ -/PM[oi}ǃ #;,,CtC(qW`ҒVec獾~$#<$$ SWӘ@%M:>!6o菫mE\21+&N${A? /TC_Jї}IL?5:݇ަB<@G/ϢM B}d$% vyAZ[Sh&MWGMP1Z7 k!} L}y:>ʅv; 2Yd=#>zr7҇j/R4!dk+֖F=;b"*@# 4!|>}dYSSQ6Xӈ*瑾8saE8] iL?PhL-ƽ?Ua%O;J_1C"X#}Ǐ?F);yJ2塡xɡa?ۤ"I/N/'ҋׯ-}aWcW{h`<>F ?Mnv`L *R]uv?~ JXoBy#ϞO{%I#e>+SdsHH[ɩ\nY[לg,A-uCy!{4ZUt|շd*׷XiivΦ:o۪uq"m]ڦ@O_ ފ-!>)6ET>n0ANO81bOۢ/Ǔo ~ % =+^3oUյ >gQ ~'Zsη`"k%1~Z?o.ig}͸ 諟K,}rq|Ӷ1ԅ#(%} $'|1߃q-w, ݯ>p6tZYںIUi~ C6}ct܂>e?siyhMƧGG;;{; 7' (ffuiiWJ:0SG{;;.GfDB?KWFӅV^m5g l}OjP"?+X~+i P@ H}|ڠ>4\<֝]wS}g~[s۹ya,l9 }8z3t bhqȍPCjm9/55EÍ~mڢ +˚LH]]?35hm>ra3Qy<~^"nmCt832ǣ Z}U$ _dTb3YPQwSV&r3~"8vDyFU|"g1fv1N-#s5}/}>{uR }=>Z0uRl<xw[[)lrFk:v{:ijy>J_dy2ٌ-ߢH|_ӗЇ?~7 @*6-o }]{/ۢcp2_W,yj!ceug_i6u9!r}oۺB}lzW}}%>s0C?eUF,}?O,OJJl.}6w}]!EwH*}ӯ+/l@?%Ӈ/W[6Rf9$_D\m}nK߬w%s=9!}ԚӵH¤?vFdoAmU՛kbtC&#i<m]%o׵ʇ~]uC_2(3K^m$>Wi IEP9Jvt$yr(q+\}.OJ.QvYg@ھ0~#3sC<%~H~dh#6GIDߍINm4smY>1Ku-a0~˶Cl23q#MG;$Y}묭~]ňJm:$ ~]I@_0-h;>O7зץKtl*^mU 2omyΩ۲~պ}} ~ly"!~6[]穄/'[S M-OL?DS>h|tDw*nOO ML?D=1#՘uj1}F}@0š?>}ۍ/}Gwt^hU%KߛO[7X#Q:~~~L? }10ãS[?n[7`޷uQo>_}n%e=1~L?ӏc1̼֐ܯam}@L7GKj*o_}~)xnpj>il@}f}TH3II_s %CF"c\2"j&b(WƖGULCZžsŔ8>Si~mZ<uwXMj]Ǚ7ֺ=vߥc%T7ӿmݾڏpǦ2}#QL?qcn#*_!o8qݯ)1$p>9JL?Zo߾eli4*R9+;RH/P'3ݿ'4yOLu(zh JGAmy2_Ӥ"_thn#ӮtTOɔ~?*{.~\O'UNS>X{Ҹ~턖>ϊ@QΧ4w\JuۥԔ^Rv\Qr igԒ ,\ x-Tc9Ntoا!CuwZ8#3;U? }MhB<_,7b~$z//'Zc N u0˟&YӉ+7J-=Lq>,˺ӯ H̄+臅?|~{ҥ3nlO_ؚo/A~=1Xhv0|\Gf"ˌ@IENDB`logisim-2.7.1/doc/pt/html/guide/subcirc/4-done.png0000644000175000017500000002024211541757140021546 0ustar vincentvincentPNG  IHDR}%sRGBPLTE=Cu2F*79_X6(hSY +?*+)S+%?P Fa=73?n,HV_662HIE|BX@%RVd}UT-eL@X5sy|`JomkTss¸mF1oX~tr47{p_[FɽsKєۋ3>YΞ^f+סf_sԠt̪ՅܷϹ~ؼO_bﺍގ̛ˆиؽڏګ~ٌtRNS@fbKGDH pHYs  tIME!)h|IDATx흋Cւ4(2MRM-P@^%hiRD̽?>fvgvg`$W&9{̙ٙ+W\q*,_S9r$~}QWI â?d埍nIv}"ez~sq ye#tz*i,ȥ?ge<y%?BoV3nC7O|b4O SX2†~Cпc^HjjujY_36$8WdS;lePɲwF0nHr)DM @xnv& ]Q.nRL~ #%ɼM7IBʣՐ?Y@6hGD7̞z"zۛQ9;ʪ'q?z >C 0t,TBv'v.Ɏ/UrPm/B%T !6zGҷ|4|Ҵ@6Oч1 9l/F˟Z >g- }]kR,ԑmBa29fB]'Zl'G0_~Xt hv$CsWP.ki4?`mgCymhx3/j/"*}ӿ^Ӈ#}&g]\+ 5؂+ Y:G'HӬzcoS_%P՟h?B("*n <771<?ɀf}c⼻fs\9 xmAHdT˙ŚN~"/nEvfeB-IXcڽG'.!bO>΄;C)>WPF##h~{\nuZK}ݯ)h"c4ݰ fws$nejG38W[L stRwpJg֖-+ğv?ħw x/G |0nk?ĎCJŒ }|נowQ~V+;>[abˤ0Gj£;>Z[FֻV4Z;g?r-L}B}Z 4|GP]ww]mC3n0a4D6駲5" Ik:Lh6҇pY6Z}}#>ΰm91|냫no@V~s|~Qhrف Xxb!3D:G YJ߇`_E(y: bl; WqWUduz6yc~%xYqˋ7-Fg".u!8c݇F[e .[ouA`' @#nlwv'?Jʝ o}  }e0W&M>bZWu)obo.gې89M[dDMffZ֮z yƍ8C/" 5S]4[i~a{zQ?EϦE[-.͙ӢNi_Q!8YDic޹I,c7>Ӳ,4Մ^Bތ@h}|5Ddړ`,:p˕?a|K:yǤuA{(,yWMJT&4agoT%<hs~?U On+U&rq}UK8T%,ҿ8999CQϮ-wMkfZ/֯5oRG{Id~ݡaʅTKݩ%>%⯣~_'o'~?Oِ_AF"_,OwcWt15z 牌a-ul_AF"'V>}#he* م6Ggn#@q<ޭ׾U߸{]|<Hcӆ]L|"_zO6Sh_)Z9>ꓐ"<7֥j݌%2>:b;[J#%2Ase_bJOȹm<5=K}lj"S;?::#h;҄삷9GN6Y~^J| /sU#E-L 8z:AMӃ7gM^(RI'LDWhhV>L?m_nג|l=~+ԑnyDOY`@$T6{L.5=Ksƀ}|1A_>}bVC ShCK߸.,nH&0,#\rG0J\x(=.}z&G ?ٿc)~՚ٿ#~U$WO?Gs7&PՖŪ'/V%<B ~J?jY'U|z~,Xu,UA?gC\FlRccWON> ׯkEK-d)`A8Cwr5ٵ72ҡR>\{G6Ix_jIṊ̕\uypΐf jծN}QDJszpx*oɻZثSZ}HMKv3;yQqK?[y]skP;8אCS(%Ϡ◢v }b71b=C;`+;}zm"D-}%)Asv5SE\\ s2wC_f8%Fw5tM uV XO_Ϻ?,?7Nsnؐ=U@_EG_a铛;u\X>ӟcp %3ǡ4qD!ؤd/g?f]~'Kȃk( $]/PvVvMu]G$uI~CIF:@v=$w<T4ls)t;?ouI}=1Zt+TFyˢu~J]`C;ykJcwoj,Rg!V?fk{Eˣ!4EQbZk?-ϐs {e~u]?+u].}<1뾓Cx~p4 lƣ떧<8}M,@)DK_߷J\cӶ{֒5sPbjy|iu]suosբv]`|ߋ剅['_liye?>X|ʠ?$/MNPFnrxS/LʦjGBBX8I1N$o{TAٵߝCac(AҮk\2}-?l8TC>xHTM졄MH* _L^MJ 4}M6o}]S|_QtC=O& K27'v]>۪PỤ@y]iz u--O{.Tuۼv|bsˣ!waG?Aw^ G@:CŇB~Wm}o(^~(ˮVtT1N,+VC|v%ΖruOWݗ}o^^k} oYuݍJ?koj~z:wUIBHۓ~O;iϨ{KkL?龝zy#)K~ƈ>so4= ^7F>{}b߷> {y^Wy^7q}qFk;vVI~~(}]Kɡʳ<x8޳I: ˁuG?@C]iU}}^uϱ\x}T>[?`ev ?o76UXg@?00 #iu_;$uo76UhTPEv?!:ҷ*<ed9$q^Kg6aѷ'XYW>+ }fH:Px$US)!}*O*IuH22zOCP׵[Bz=1hוo:P$2תH }ɯkIAP{^>2GTݗ{zˣ_(n!_}'ԑyIO􋥖J)vчy4}ː@;G9G_,ݮ[ :$?O+I2]Ǝ~oc]7!5R3>ѮCϡOz+TLȾ$ypsCm=?8C ~VX[؏6F艹I2HAݤ 6'*#U:E-H_,>;%oՠa ۪sNãҺ_NʢoUDVj6g 8pRB+uܗ_/˞:Q_m/ cӷn~mWw5>O).)Xs?on0uJ_KFu.)}YTd0}@~UUݷj_*}Y =җsC>?g%N;#o?,0$H=>KB"Oj?eJ{sCä]5"# )NWxruCmUC>I o[m@Чu#ofwRܒrCAj(ODO5Z)Kh= 4 ζFKLQ }E6x@duyJ7[{*ܜCRIҧG+,}􅳝fa;\/蟇L]2=@}2Ѩu]4$uXvs3j~u] }מC)k@NIˣVT}}X/~`MQ&㎫m#槈R02.0[K]cE^-uh<Cdq ;~ }7v_?>y2!chzs JpqQs}#,ybEB&Ë]ts[Ijy*Q?$jͺ#qF4?{0#;>Oqlj >W]S? mބIA,~kY 'ږu>??9G#W3IL46չhu 'Mڣo; vNegW1Ȟ& kE ^F//y}Ϳ3.xFc7|ʣC_D"l>=+lnA_@X 6LlaD +eYA O}[d~:rXɻowA"_ȉfd> |"!l~Z<1oЇIG<ݧUF9I=or||<{1lkOo8ҡ/Z{>EƋ\t+7 Fz!~åJIOwMo$Ci+agdŮ9R ~WW)rd!s:}4d79+^~rD;ðSBY"eqbGkIOIgxoz>4tŰ=UC_ |97yA^b]u-?̌V^o㗿 }*v-#lV߁~qnӻQ&jI!D\GfKNY$IENDB`logisim-2.7.1/doc/pt/html/guide/subcirc/4-delve.png0000644000175000017500000002130511541757140021721 0ustar vincentvincentPNG  IHDR}%sRGBPLTEh4Cr:267W9`(gZ7SY ,?*+)S+%>P Fa<73?o,HV^664|@HIEX? QWd!b}VTL@Z|Hsllg`JÍsmG$pW~tr47ym_[Fɽs׊4Kѓ>YΞ^f+סf_sԠߩ_t̪ՅܷϹ~_ؿZﺍ̳͆؎ګ~ٌ쬭DtRNS@fbKGDH pHYs  tIME634^ IDATx흋C]%A17p-5$ZDJy1l.ĐyņTߎgWɺ[155J'K/N/Kf#ɬI/2?G"?IU?SUygP\JƕX# ?8hȐ?r3PB|jL~ <1!Rg)~uuB{ JUxE&J~C&O鏘чw ^UXeɺPfSʿy ,x>@mf:t\#ݷK\KC4lo]&2؇Y@lNޚ~& YƄ,[oh>1ɋ7KA[MCSA~)k w: $jkbdy?y۳MC{zĎx7EÓ)He?~|K# FEn '\F e9~@LP&$ݽPN`~z{rOox7-$~mAѾ;,~U@-.,'wdgt<|0ϥz0Xc~/g m$MY)xT0_H撅B.Wc ؑ>Pf } ۠@H_o}9WIFכ F_HsOޯw }屣M!YOw> `>gϞ=C%l={P:Ou \\Tn/-|d;Ce5wvGDg3v,ޜf˺OvZGdhy0UctC:K2E<ż3(=N!qNlŌ> I~s#!4g2 X:&>&4M-/FߌŦf__G 'ǩ8xs(;;ϑ>*?Iu3c`rjX7߰h/~"Lo}3"yX<'oJ L^'H_)7bl1K*ވ-ܗ|vYDF0O8ȬT B0PsFX6&￝Ɯ*fxDV؇8m $/9 /1ˏ9aV!\&W/߄hx#gy L) |5BNJsu3hKs)b/Kʼ&_w⌘]u sng1ېdؒeB;Wt/s=c i/;.ˈ|G#ocz3kӞµpeZ9-k3?lsև7>千FmڷoCm@^V-j9ktUo1}{`F1i5nVGGxxcW4\p[%X/ɏ M5|p|v bRF «]1ےʺU ;q#]jNk. R$Ԝ3tvi`7Ah=Au50;5H9?XRHس7n}=H~^O%!yzECC3pC בm87ou~?m|o n[9 <]b`$ɛХ:Hlxg/ >ws7J_⺐ O~^N|/K{<0җ>R[9M맊zڏ7W*l]6ɴM%8~RD'ziL?[(^gDox4>BQ2Ku^Ϛ?g}o+ {ϧ ѷ/зD4&ȻPW/0ѷ" +%=,rѐ|B<Z.NC lˢl8f(c_ 50rB߈ ;H  ;gѯT:;E~Ř~(>6%$ɣ/T 㪌^蟅c>j?LIx,}v[,`Lc3},!0k>a%1g<<>ɕB< m3/q6Y ~=}P{#S,m]clBj: 2@= siz^e3_G/ZZAJctl|3=F:Iu1pT]!|~d8iV=Xa$)}( >Qy~6{Z0}~ޒOۆWJ$8%YP`50<^wr*"Q+~RY/|>J X;]~k+"u_ZRoLU"sp4-~Hi+c|6tjiɧ%}) ~Kg|47}BIMԜTQޭi6NFO,8+\a+iY<!WR$`zKbzKRZk#7^:wKu?Y yYsmӗ ڧotފ-4C/}6k`Ep'?F"sN~[+;X5,8J) +KmUoUɵ6 } ՊO;oI|k>:@?D*x"1~~fFb\au"?'>}9G|QӶSL tX,f8srr"cg蟜0[3d$&O2+Ժ?.> ~g&KąWk8g:-rQMYW$oHUE6}!LO?@Av }+RcպT'BаDj/͏B ?$uOţ|}ER]C^G=,<GdDʟˮf}5H_ (A-B62I Ĺwte]m QI~u_WFt|wz' {7OX20,/5nz꾪^Wܡ_>hgd-Tcߗ|=*DٕS[.ŝ4>*ݯu\˯hMoYЖulxDBjO`bS2d-GȡG¦˺5n˙eΉ6GeyDC[C{c*@~~9cm:d9 } 76ŇwO.Ӓ[+8/հtR55O\>ku}V n|`AQ4sFA/h#pGݕzЖSP>Vl`nY LB}3/>N':s5}nVCN~RW"y |ɾd{fyVA |o؀qYW+RUd#Ty Ek:*|JGRd45<*p&E[@l4S![vU0YܿOmI-T+ R;O1W/- 6,.V}_p""#hf붴>8X)JI;DIp3_U de~G8̂ZEkU~׍F,:`fÀ$8t[@҃%}fvKߡ+SYB -ZS{ 0ѷ5 <>_}]~WkE uRÊCUkIY~Zo}Cf6bv/+~K(\TW (T5I7E)+:gTF!݌},f ҿ!JGeD߇nvn֔-!B=9C;2( Ч}3& 'a<'~P F9Cny D@peq.:h. vH~b#fhVTxy闋ժgZsJVvFG HJ*qrjޕqu8CJJ{\c' }Zۮ&2?.fد+~K ;㎶-?zߏ-Bt&iMZi"lpPѧy-&f-ڇzWLY'#_ء4spY/*}ͨIk}Cں\S F}5O[+R/$ 44s$B@?Qh F}7B4\-kO_?MCOѼnYNhܒ _0sAj \,f)_}QHl6_KvkGlΡ:}9dLGQd֫I|:^cRMѸŜCvˡA ~2 ox8ο?",NSfcwgޞ0.*uo+}bAQ/>CAmtwF9V&u?NJB2ĩ4t`{Zuzjçԝ,&]їR]$A2/.o@oEny\їƕMʀ3>R=uG_+6T_ڪӯ)}= 0cIH߆Y^٠sPsC_0/0p~ofϖ:K_E^o5?~^G7k=n#)ǦHĥϛĭNߔj}ñlyDg>!}(]'V[Mu\J{ðX⬗kX8Du%aU[Mb5.mΈ~9mZn~7)vA㎋uIm/xR0vR]A;.3Ou7 }Z{xCtqt o~HLvml֠,._Me4#<h[IlIm; _-ϥ)w+U&%'N!7, Ʀ2(Y%j\1$;Gz rpu}|8Qr7~˲nUdsKO_;7cS*z]†_dC6MGh [(}ӯE%V~ kgXr&_*2[ zy. } g?KQ>ţSNnqb4D2s.!m>D"q R-~4U yXmO˧!b8Zp"4 ~|$4|U-7n}ᑞcS׏syQq rB$_HQq> ENYO;{[j@ю,>EZxL~>"z>WOx _t9'{{kO; .%/\J.>C]ikL-:^ űwu Vٹ{L}D IENDB`logisim-2.7.1/doc/pt/html/guide/subcirc/4-add.png0000644000175000017500000001530711541757140021357 0ustar vincentvincentPNG  IHDR}%sRGBPLTEzϹ8`8=FW6(cbc +?)*( 2S+%1%@P Fa=7t60FR]5ZVX4JOOWdOUD6JFi}VUTD|Kromj$|tiœ} 1oX~O:ƽxnqc7DlR\ۊ3LX?TϓKqfԞb&㑱{՛_PqvϤt탻XTbھYȨ˾Ѳиؽڏ׀۩؋\ntRNS@fbKGDH pHYs  tIME9(z IDATx흋C]"r. vY镇KA] n93$Mi3G$ 9ΙG׮]P' vZ]l֣8بSB:މ2uC'ۋ6[u5 ]'l||<)D"1 2؛z8Hrl4fRB 9%t4s j#oh9)}!9̼d@BßX3 @ffmLiR,9R@v,/ KjlJ4G.׼YQʢ{  WIԇ;Btݢx K`uW#Zz0#?hWL}ɳ?.9={R{Dc,4 <s2?Lt3%})+ 2uq=²P? FFm珸ujPwФ^X>cW5F;U,rɉ*?EI$UEQ0/,[Zzmm: 11hH?9c[۫JzjЛn\oOC^MMzX.TçՎ9ٻ{ 9͇&˗j3\{bޟt?ƥXja 3oO;,Xvv aOgd{ >I Xk6=O`拚S%4c17Iz, 7xB_F>?CHH!!d%'fVw ~l : LTO }9g6!H^쀣H5ODž@FjZ$0W}_}8oqr󀁧KNw!/g}3U#Mؑa/d ]@0ڿ׮>0>Lp-W[PO~s88]3h/?P CFݧl{;U쀤Ӓ.Gf|17hV2~/~mJ0uFﳬYf+3 /?pY@ WM_*jêվTG6ý~ ~t*O}ZABK]GH>Ue/! q `ţ~CZnc%ƒ@̏!?Hﰂu}z?Ycſm,~h) J_-a+ʛvU9Kj4>7Ձ*Q!U]^5x>ws{ˆ?aƤꅁ~6/? z&KѼS\"kgUEd3%25r޾< p}pise[ـW` z[ siqN^~I,r<흈>]}L_uK׻ď-y4Y K ɍ &}4]sڋ^-_Qf= k𿅿sK?\ -`n9\Lh}=Zep#}6!86{m0^IpSǓdMNcN͒YX(߰qԧS+M&z4=45>!v1ph~:cKDҪ$xZD5MX ipi2f9ҳMM^ ~»_XZe5)6 }z!d}84F1>Jo8ey`z2bxZS!}4=MO5_+>}LBzQ,&Kl]gT)ѴHMu(~dW7<0sMCї> ~*^"tEUbxۗRȗ4_f/}K}s0--8"-8~NZp&W/释qIZH0ߗ#t'y4$ϸ'b ) jNi=W`}b0'OUщ$ĝ޽σ?BMbtd]1b?dS+!őW O"ʇǏ?(APϜ)~H8hDWJ87D*}[ܩ'\I7 &S"AžB+Gy|iߩw IT\! wX9}6>uDFЧg7/ur8L?VO׶4ts3>~$ЖUli@t}Kc_E"E"lvf])#o~O48c7٫(}u%ri9|!闓~N/+!iYCJ_9i0CyYGdZ%쿐`gE?ek L>Cyݽ0ooIϬcpbϔ>E nI)N㤫*mׁ&?_!} >鿿DQ K/ӭ-e_3l_sv4>p[[93}XERD"=>|偾Z~%>>c3y?Z\WvN\]bħw}z/e)-bU~,oْ-#߸ymN&>gǷ/'睾ӧo獾 ?JL[Ww E_,y(=}kl^REvg I?8n %)9i'[~駟 L_D[zr=Tlu>Q}}2~BLt\H _{Pno\_ߠkZ_}_ZS3{v~MONFAycCHr{}{cc+^;!q/5}<`]73~9/)=/+iWuquݤJ? ]|G Py*II'???}ޜ_  t1O3 } s]9RkLy'lipoo%}?'b?wPK O/x˜$/vP_2S//^{TG8M?brgWeFt 5 􁰙oS_t/u,f 3D0ى}+7iXd Oy4٣} Nos',rb< ~=~j[᥿g;)&J}ҷmHc;7N›@a~x};Lr ~:jg:i@M;-0_u:]'>~1Bu(rӿVObS?֍C o+IJF< -}_z=Iw]_ vY¯Otg_0[N)ϭz<^|߱7+6e{OT׿#?F'MB/|n*?07>7umty&C*zn*ݞǹ|VP%_sSM@})+zn*}蹩C?n=;R%)%_c*cmI~ɣ){L <[-SoypYϧ%덾eJaocK#6R~;YxJ~1k-A5f1}` /ESb3Vm" JuhJ@F?ͶKQDoC\qs==<iJ~:3ZB(OTQOPcS.u]s &ojwJ~30_3Џ9m;% '0*ޯ<6NCt}ԍQ c.utߏl/&}~,fy$`qLy$ u#~sSKIUha^[%57u.+bG*W(~WsSuu g 8a>vT 0}My6~ŸLy_"J#d9{?7^wP$}g]]5!JVC wX?*hF+RA<,4wR}7گxm6TPjiTI_/里~&}_/KAIO/.>Z3ُxFMk}쫭j6u.p~?9Dh8}:߬9&U}OwT]ֵŻguۑ =jGN_>-6_vڐB']ޱx:67zWN]vڰ{W veQ@H_KQf+}e DDUsP/3GmRS1F:7*WտW\vPӧʶ~ 27=FE?BQ}U^t_zpӗ-I_/u}}V}&_sp%0ҏI_NUuRWҗ%}I_җ}I_1I_JcTI_җ%}I+rY_ې􃤿lygֺ.Tw@U/V>1􋵳/rgO^w67}ˍ5lt6;-'W~ J֜ѤE>(s}o6~gRVuڶAQm+}S 9qҘ!uy3ƚqb!QR~uݰ*OY~8ot0\ 8H_8ѯŐjAZp]UoZ9lfI.eOB O Kպ̘+%~t1]ݗ?, f$q> @‘#Du׮5wOd&WU+33'I&tҥ[k\r?51I׹DeOΝJ?Ii{z^ʸyeH L,,ȭ^?{ٻ %?x, x'?B7[+w![_|bHhHS. L a ?Na#4|e= t1m'8U$ߕ3mldw.ӟJBX_q&uR>.;_J~f+m܃CO^@ =I)y5ۇj|cک#QfOH?cȻ33?YBHyd Or~J`6nY}n{T7A1 a{$m-q>gn Ax1uz\LHtg ,3ۡ@i@%ŽwS$#bPucu[ņe#@ӇGa}>G9uWmzOAa4,#GOBO'z 4(iDZ~+wCf>ߺmU?~=K(ZP9M Ba?әnR.zU#=LBE߰LNyy2K_}L.Lg񊣿Fvi?җw R&IsOUBcA'[,&35+ ' Cʿ0zX6Rz3}ҿ ҟ"eN )j[Z2'NR49s~EkD TYlWKwjޞ/zlG%jem0#- @'u8n4-\ҧ" {]^ Qe7)>Nky5JLBYTDY,\6 Ȩxu"}x>q$ nz*]\UpYe賀rIx5,Wɺiȃ~J ;ޡgt-,kLhi4ne2,n$^')*~MZ1gAn&a:nNd}%&C r,n]ۄ_l? }. Nag&,wy#~W 8 sK P k*xS~DC]˺\gM>P&iE%K*|Pr O?7x&`NGnպ(DU8?g5 K$,1?GK+?r4.3LC3X'VI{"aujr&AS4#d;ؓ{ۆ>:~&ÀZ6&:ED?B3Ў/olOlvn7>+VD Ǝ,b=h B$@|տ`~wxʞO`>| ϯm}46 CȨ_)Z"}l '/t-A0`Nzo }t:F%k7 |112AMh|ȗ M}|\_ Oؑ%GG is,Qۀvĝ oSO~K ޾>pYCȨn8T';BG }x>1ڝ$3px}VJZ@G>މ=}hF#~Y!}t"~~Owlȝ.SƇ|QoSQokߑ>0k '?wHp,2Jn.`YO_/n}OG>07'kuK`Ꮩ>)đK&G oKD/]oEALkY JhrvkO:ݚIxЧ-5 OL_Ix?TjяZgD>ht>^ ylj:1}JxWu>x!oHd[D.Yх [^`Noi }' ;[̧̡g,Kh?r(ZP"9 C==b/}+0IFGEI0Hga+s t}B5;l/-xMyƘ! @8/ })rLlH+rį?3>,mqSD(4WЋx a>~2/|z aZ[3j&KCXDߢp%s._wX)5~hÈ R?M<%N>zs-q9}2O-raֶ]:wy |S@<\<_L,l>]55e9,l|;3<̎DHF?T_p/>8JL<( ~^M K&IxbkrJOBjDqp0^-_/L(Qѿ/)b j~HѠyB}oKW~{iF ӐG{4 }Vc 7}7sVWߗ޽Ҁ{_k߿_wɓ{J@!9^q =-}5 ~SKz8 g~> JtuCQFAéD64WJ%=1B_5u)-1DJ-lU^ߒ%oqLm˚uQvKX&V}**ojænchz#7]ӏrD_7/X$R}cvm)пy'T}O1mGr+$BL֟o͹a]vO;>UZ`c5W8??p 3gI&clHH~'Ok8q:+(dw u]jq47]_5[!}xggwgV#2' uTuTw=0pyC{Φ-~dͿY*!krpec-%41?u_jFw:VT|Ą Yk^+ }u*O-3ەy6Ju G#ϖt/"}"~[ [zR}U\vۥ+i<~ENw]׻2STCeqh#? /+TB*9ШWlοݿ 4>#^;.|hR9}27gF1cRN۶0`_a':%wtL e?_n('O ]B\fVXeg>6ZYkXc)qV}Sʾ}7QYjHܳu' "*nMo  3V}-[ӞLmNO> vڜ`zMdבPDj:3$k>([7(.O5=m_]zi#_waxc&uˀUOsyw(g8}D?HǨVczg}b~W=ӗ~CB_ f;G> /1RJbz5_y;dTTC( }u ga; t-kv?Kk>Y>7dO=_} ݧސgN0CB?~@ELQ{*r }O _ѷ&rՉvXqdh=Q\G 퉖}]`T}V_Ǧk_I_W`iʱwۮ+<:};dOo/2GY?OC뚃̭JyĖ_/:dO4~= , G?&}c"(J"OC՗uWz׶ # (}kݏпTJI)~e}{rk=mY(ņ_k\@wC@:U }D2CS?uR.;CoMկĄ~ӰѷcˣNSrϟGsQt cS)}[>uաy%?@ oҕȆZT_-q:mdԋ-Of[rRڿO "۽S)ۺn}>*0GL?%u}];s^胘_adߎ>ELb%m[1ߟZƿo/{_l·hU"ٚ~T}[G5WW]纑M ݭOa qD_u_rk*mtވ~72I{0@/[fJqe @?fbMXpnyj#<wM47<}&UNf]\wX E6ng i2?݇ۈF Y>rzyg;Ŗg)R'Bx[r7IfIO1l!J{">Gfb4F^jz 韞^_QyͶAYcT=OwVP-F_jlG߱;uOuWE8O;+ \9K&ׅaKjYW ~'-o˃rݪ_^ˡBo`̕ybΪ}?YNwFFr+e~7Ͼnra Aihê]pF9w uu-C>z8`A_M'heTeR߉蓷U>z ;MH~7t0zWwJ&[j3!Oxp˽;j*_}t:%WO+G7'WdtqEo yEi{i}?kkM]CUlyD꼢45~q@]n1󊢃ƣ)(qLV]nyEH[i 썾do~d-^ #m軲ca^ kE}ckQaAn}o ;R┏d<]=K迊Dh+4#UK?xW'_0I}:V2-8ѿDSQjd_,d|V>vB2~̗K/n~0}>$p-}Ve(3Oq/Mȗ{'# \h/R/[tx嬥 }qњ~%`t|TۇxgEjy`Oκ&X ~!^urZ>/G1u'X9-D+z!N754hϷ&C* VnnV:]JAx!C~rz"5OW"QᏞЋ_~[S:alOwԚ.A~=9+`w׿IrK#!IENDB`logisim-2.7.1/doc/pt/html/guide/subcirc/2-delve.png0000644000175000017500000001647611541757140021734 0ustar vincentvincentPNG  IHDR}%sRGBPLTEI/"8^7<FW6(bac +?*+)S+%6u)1%P Fa=7J%HW]5GIFXLUcVX4OD6KF~WV6dTD|MspnktD~ϝ|1oX~tr7=~*{p_[CʽPKzYΞ]Nf+⑱{סf_sԠt̪ՅܸϹ~^ؼObﺍ̜ˆиؽُګ~չٌJwtRNS@fbKGDH pHYs  tIMEx'IDATx흋C]uˢ"XbWyey()\PAvۥV~˽?wf&I2GW!_Jft33'ҥKZ AS;:W<hT̩ZHPׇr&-T yש)23Q1*J"2mQ3ܝWCAݗT E7[ ;#ثe0Ӕ\ ’qProAƎ?5: }&){ݥ ODJUq+2o>MjW5$ԳOBRRDOm%?W.QiXw|7dޮvpwS]$̟_xJaVWQe`Q"lO`X~/~ ]s^ {2u[V%w -kcƟb;90B2&t,.-ʊKgPJYJ<.S`] ߃B()oi?Ø֡ J|vG~fuK |G\1w)S@m7u TE7_!%Ѝgۍ'oCYm_Y_N&&m:l7N!%4ЏK]G?S&O)'6߄tݙ=NhkA:;m|+nO]]4cʘ>4S;9x큥nإ _ ,,[`,l7`Dɻź-\NsN~He?~Jס?LmY폱>P`Nx XF? 1~Al9 AL&xEZڡ_b[w=эu+^ew \#Oh Z>bfg>@I`lx|ˠt9:>կBhPDNK}#рS\a B?GKiVnWL PB8+wՁ/׶֑*A1~j"bVq.x %ˀ'SMKbT*FnT//k`J ݓJ_nolJ~<%w2iL_<6֟Ÿ~o~ BK=ÇB]y R:͵pó=2yW(4s۹ߗè?Q|`+)iW&oo_]a髶OD+Y }fÊ#P yĶyN)^H kK[чkzB@^ +" FnF[>}R`,)$ [H$f=3_o mqڜFA//GrY=B_us vN l<@s;@lthmwPk' I"c}Ժ2}{i^7$6vx݄ѩ853Ƃ>V1' uB bWVE=@mhIh}ܺܠ.v~K׺0kZ콊HM&Ue}8u+w{Cm_Ë%O vÄO{}܏r{2}nW8 "GZѪ3Y7yɺժ=DgZ}HS9<n~ӈM(*7_wm>glm,_N42N1FJ{4+K Dg{ykҊռ;̹JضNoOO}0o[KUޙұ9S nM cw#}]9L;'ϴq;^Jވ_}<\􏦫bϐ˛ rc{>U DaIXߵ6Zct*K#/C-Ў~XH_&%(پXALG^Y9rI KWW` Se*~C1!֦j'nai:5kK-tsNqo8z;a:wt@Æo&G 5tI~cޅ8[sN|@Æ#3ϟ?C/,5ϊh^O״^߂-gn 4nO h0 N;^鵭[|!n!jf ŀEfEo3 ^y;xA 8N܋6oOPHzwtYΌil?C^؜P[^M?N^K$ECYycP=ym i8/32!m/tC][۝s\Q1Ul7\t>l>F=[dZ:3}WXgdt#%W=>bzXr<<~#8z$]`x%ƔC?4n˧f`\#@>t塭&DgeJ8nMԼ>>* 9ޖg?4Fh'\}N2GRFzߚsFR@?LKܟ1}+o+]9>~0'2+81;˱>*3BL?lob|zL? zeh,_">}Zd}6m=ѷŏQO.Yގh@n{AzwNzz2>)(4r?tCy90 wWB G]`m_<( FP>H?I*XH_:q OK%"JCCj9Z2'ǓBNއE\>/$-b/A -///O/*OS=wTK }Ve ꋥ|yqa0NAW[[xZ:?wlk[8P6]~#5Ƕc~Ä7y'M~5_O>X!TOW䅠'׶* M>s<~?Fd_Rts[켱ˍr_=O. )CUӸS%5?-k-?NtM۟kkC鿎Mk59,G}=B̕M\k㩄@M SS1-G_.*A W:z\mΏjW/ftlz{!;oI&lA(MWk8Rcl;|FҾS1 T'W=@h3ų}R𷣏R?#ۿ>#߿/|3jX>,m{8cfHanόbJ CvU3|8Di4E8s<.RH쒉bC>I߅{{*">gͅ-W=ϵ79Xw`}Sl+پk$}7؄BrM}ZS4 '+>B`5$2"~}q5jl_nvA`zJӖX%87\}!cTGq];VҙV˻CթDQT/W++^!qL/#m_"y$KJ5ND{'W|?2H!=>ip{1o56eJ/72FoCy_w#%}Tu}R|l_z51ߗEO9}O+Q*_#)~|a$k=eۢgf7lRgwTg7XTx*d_M|ߞ.>4*BqScB&InsFk6Y钾MtA_*cL*c<^UGmBuE'B߷ -]MQUk<~z r l@eoػ+;$}us" :m9$8/com~1NM)~V~2U4ILߞ(C<$5c/_-,r{eboO}Vz_.UC0$a/ÑPy{X@C+FO*ۀZk`^R?OF恥FU}[ԭ FDX,J4$?<}qvDu˭Ɂl`yuCcG~̳߈8J#xfuuH~O}I;$J̾EomUa~/>wHWg-k\%QD2{|ߞ>ۊp&-JlM?R|_'W]׺~OBxH}i}3̟[c+z6lS_u#+u{9G#&kyb"}=Ƞm?D1wãӏáӏc1sK7k_0zlھi~McozR>ӏC~OL?<1PH_Wy4g7wZaHԼ}_+]5c1ǫB_06sL?vbuS}֍_T=ޗ8c3㾮s=5\s{j6V1Θ~L{[Qwv_O5h5~L?ӏk>yӏ#2GGڼ(eL۾}]D쒖. '5ybj3pRbtK5Sjp@?m)mz~gq_7 ӌG~FPgB/,0uQ$3gfΣ*gMʲ# EJ٢3E~ rDYKq2G{4yJ&O˧QTpd'ZHBBԇs&#?n^p܎{9hi\(wL2, eB,_.jh5I^dMɒ~?V}2-0zzy'k&(rmL8>K`8{'l9 d}ojWw=arowφ <:\Y&*U 3#Ͽ~#a2|w tzɿc+p;>wuv.?;8qhIENDB`logisim-2.7.1/doc/pt/html/guide/subcirc/2-add.png0000644000175000017500000001376611541757140021364 0ustar vincentvincentPNG  IHDR}%sRGBPLTEZEw7'6W:\W7(hQX +?..,R*#AP Fa<7.Br\4,HV3/FHC}BXRVdA)zTRL@W9d3t}|`JoniTssD~0џ}1oX~uj7_[ց&~CYPʊ@KzYЌ]UҜ\fs͒u+_sز~ԠɰLt핺̪XTՅ܉R׹bhɄԸидۏּ܃ޫٌqHmtRNS@fbKGDH pHYs  tIME D IDATx흉CmQ\H$ A1>PXwe<@F$f F鯪{$3M}\=W~]S]S3iN:uRjhdSwAcNr͈0x\bB R6ʯh\UܪX_X,f[9g|̒8y%#UzЩc_[KW2d`X3Tϫ #Ajjia6YVMO+{UXJQq"%l4_5eh?_*L'P8ʭ6T[D&nxJF{7WBaFaΤA6 .5"*9AۏwQF_x^"X?X?5hwNḞWK'RqUw㏛g+I0BMF| X߁(CP{_KgE=f "<:6hS+CÔ }09W،=i76߻IPi0/UF?# a5dλN¢UǻVjL" ԅ'P.ެ^_M, 3zx = ŰD u[%䕹;q;sW6w_*6Q~/$_g>jЉb4ӗxǫ,ja0T7u1X9\L־CWgy0Hǜ>?&F@LO?^LK%8+c2UB؎R NyygpO&-~1qͣCd~|$tσ""Wmb-qxY J?u++\P ;|2iVsAH 2,aȉM+p]N{e1'8m!/DP#I 7g92”y7<|7c?jq,z"gDj*ifJqP:v8|+} }eT9LyDڬ!^/&=R~k xt21eފa$N/)HK"[)^jǜ陬]:Q̛<զfٔ`3jy;iLB*g3Fet 5e8cl=x6G NLW` I>b~9-JX{mt_P5yh4, R7ԊԬ[G=MP{8;@|㎨~'*[;?Ж07>@w︔dYD~CLTN;y?6]cCq|SʎL?1xw/ѫRB?GL=k3NOcmJ7Ӈ݄ IHe9ԣ6; l Q s7~kz߁~j͉>>Fۓʚn_nww~evi֪nF(#\c춶 ?~>x m} Fq=45~7e/vLlY 駶B&σuQisKbTpaڼIMFw e o37 |;)7g/v&"l#y'gIN9hU~m5~/TO"t_fN؏/ }v6g(}/9mݾD?/~@?_崼Hʭ˪lC6x@_z/~ 8dx#Cm*XZ Hkq{2%w^NmTYsUNXn-Dds/腴1eWYuG8BG;}gY//[7ѹf-u`/c̜> ҿ ?́#FpD?kiaf9(LѦJǝ2, =!vbh3%v9}wx<ǯfPߖw Y#}luYV~i=I<Б>E2lcɜ'u2~僶8n\08i=4d~LڍcWFflcٟ~()@{kq␞H{JP=Sum?[cz[ؕ'$^i&IRJ?僦o޼ʛɘ,"388?O8*j/x\N([:kD#i<-ߎja^ O/osa˚&_#嚙P/~sJ/_>8d[?A(O46vӧ^K_mAe`l|Jtn#jS(:UCox8{]}fU!loPioy Lw[} JσoDcm=\ǻ ֦YHH+O*f 1>XXpۄ_(xg?;K\?] нθ~_TyUfUۿYVMP>/5w5O7k6y~mMR͘k{Tr?KZR+n1Љmj$2} a~dm ,~"wKx?؞gd$Sysҏ~ۯpۏfyo~?1Oyl_/P Ɨ{V5wT2 Bl?_/"pƓ._}jlR M䈾3xaϴ޼FNN(Cd7D^{%#}Wqs~_j1|hM|/J?#^DxIͅk~2\d9 ~!~xEQx[݇}ITB!8}0^~0|CTD1ޯD'o+g#z*$6*;~j~!_.{7F?jvC_*w>.{B~^cj@eωf 6m],7qV!я9ؾ˞S`/a&WUMU,F_k(5WWU4_~cZĩO}i=G}}F ccF?\?}K=7sߛEW=DdF}k=h7'x]^l{ wCooT˞}*eO f~FO;}df~xJ}yfo?ϻW{~_D~tCu /_hMJB/ -/~?j7[]kTFi=p5x'/W#!tߧ'{]}}O>'D?@{{{^׷{]|K~OJ}O>'Dӽn%u=OJ!~!D}{]}}O>'D}O>ҽ.>yO>'DO=HY?8 %Y˜~PuL[Um#~;ktKO_٣:V4:Yd2(헝( kp&p~Wel)}T޴LJiN }y=QG{|[+xa@߬ ۾7Ų=~}k^\̀n+͡27eN('y~_l1cX>NC,$y^< ˘lkx{aGtʼn~U+ϳG''):? 7:pixo|?r$onΓUS3^IENDB`logisim-2.7.1/doc/pt/html/guide/prop/0000755000175000017500000000000011541757140017300 5ustar vincentvincentlogisim-2.7.1/doc/pt/html/guide/prop/weird.xml0000644000175000017500000001722311541757140021141 0ustar vincentvincent
    logisim-2.7.1/doc/pt/html/guide/prop/using-const0.png0000644000175000017500000000137011541757140022340 0ustar vincentvincentPNG  IHDRDR?SsRGBPLTE((P* bKGDH pHYs*b@tIME!bɈbIDATXYn0i@J0L$|)4<c6u5&zlTr9:@Z 죅Ʈv-({Ǣ|Ǖr!XuߏUc1(@YfQ+Od dE9)W3QrLK kѨ"!H_?Qȡ tJtX 75$:pe$_kF80[@WyJɴ۷Uv%B$H4Y(zSS1$:!ءK( hdT@kr硨<%PFGAxd_wWulW2bTK`=edTQ^zhCUQ R,A|ߍʚ2"?MV1nUݘ#HOi%bϐMS5 dt :^?]2[k_H򁺢ՙyVEjTlx=ƯV| 3}N*hCyoDQ4\$ hA)=VHџ:PwؿfODѪD4tJge.%IENDB`logisim-2.7.1/doc/pt/html/guide/prop/shortcome.html0000644000175000017500000000456311541757140022201 0ustar vincentvincent Limitações

    Limitações

    O algoritmo de propagação do Logisim é sofisticado o suficiente para quase todos os fins educativos, mas não é sofisticado o bastante para o projeto de um circuito industrial. Em ordem das mais para as menos contundentes, as deficiências da técnica de propagação do Logisim incluem:

    • Exceto para os problemas de atrasos em portas, o Logisim não trata de forma particular questões de temporização. É muito idealizada, de modo que um par de portas NOR configuradas em um latch SR irá mudar em sincronia infinitamente, melhor que, eventualmente, o circuito chegue a um estado permanente.

    • O Logisim não pode simular subcircuitos cujos pinos, às vezes, se comportem como entradas e às vezes como saídas. Componentes criados usando Java poderão ter tais pinos, como é o caso nas bibliotecas predefinidas, do circuito de memória da biblioteca RAM que contém um pino D, que pode atuar tanto como entrada e como saída.

    • O Logisim suspenderá sua simulação após um número fixo de iterações supondo haver um erro de oscilação. É concebível, que em um grande circuito isso não se trate de problema que possa levar à oscilação.

    • O Logisim não faz nada com relação à discriminação entre níveis de tensão: Um bit poderá estar apenas ligado, desligado, não especificado, e em erro.

    • Há outras lacunas, também, que eu tenha omitido porque elas podem ser tão obscuras que se estivesse ciente delas, seria óbvio que o Logisim nem perto chegaria a esse nível. Como um exemplo extremo, tenho um amigo que trabalha para um grande fabricante de chips, e seu trabalho é de se preocupar com "bolhas" em fios de chips com largura crescente em nanômetros e que possam levar a desconexão aleatória.

    • Mesmo fora isso, não sou um especialista em projeto de circuito, assim, poderão existir erros na técnica de propagação da qual não tenha conhecimento. Congratularei-me com as correções de especialistas.

    Próximo: Guia do usuário.

    logisim-2.7.1/doc/pt/html/guide/prop/oscillate.html0000644000175000017500000000503311541757140022146 0ustar vincentvincent Erros de oscilação

    Erros de oscilação

    O algoritmo de propagação, que normalmente trabalha silenciosamente, sem qualquer problemas, vai se tornar mair visível quando você criar um circuito que oscile.

    Esse circuito está em condição estável. Mas se você mudar a entrada para 1, o circuito irá efetivamente entrar em um loop infinito. Depois um tempo, o Logisim simplesmente desistirá e mostrará a mensagem "oscilação aparente" dizendo que ele acredita que o circuito esteja oscilando.

    Ele irá exibir os valores que tiver no momento em que desistir. Esses valores parecerão errados - nessa tela, a porta AND estará emitindo 1 apesar de uma de suas entradas serem 0, mas poderia ser porque a porta NOT tem uma entrada em 1 e uma saída em um 1.

    O Logisim prestativamente exibirá círculos em vermelho em cada local que possa estar envolvido na oscilação. Se um ponto envolvido estiver em um subcircuito, o Logisim irá colocar todo o contorno do subcircuito em vermelho.

    Quando Logisim detectar oscilação, ele desligará todas as simulações. Você poderá reativar a simulação usando o menu Simulação e a opção Simulação Ativada.

    O Logisim detecta oscilações usando uma técnica bastante simples: se a simulação dos circuitos aparecer em muitas iterações, então ele irá simplesmente desistir e reportará oscilação. (Os pontos que identificar como envolvidos serão aqueles que forem afetados nos últimos 25% do total das iterações.) Assim, ele poderia erroneamente relatar oscilação, especialmente se você estiver trabalhando com um circuito excepcionalmente grande, mas isso seria um bem maior do que qualquer outro que eu já tenha construído com o Logisim. Em qualquer caso, se você estiver confiante de que a mensagem seja um erro, você poderá configurar o número de iterações concluídas antes da oscilação ocorra através da janela Opções de projeto em Guia da simulação.

    Próximo: Deficiências.

    logisim-2.7.1/doc/pt/html/guide/prop/oscillate-error.png0000644000175000017500000001566411541757140023130 0ustar vincentvincentPNG  IHDR>lsRGBPLTEh; ~:"a;AV6(c7`b(: .B(*' 2v#T*#1%P Fa99"FVLHIGLUcRJFD6o5e~XWX`hi&UD5sy|nljSr#eT0FМ qY~truj9^Y}D̈́3uMXЌ83\񞠝g԰gԝ_*sƫQՠu풻̪܊ׇa׾Y黑p̜ؿَ۫շ݇؋gާtRNS@fbKGDH pHYs  tIME((<IDATx흋CHwYܮ]VXAp-Jc+Ty73yL23ɤI[~i43$~NptիW ᵫSٝ ]zj'^!}ʮ D/Ҝ_=Д&=nӄ^َ\e~I\$|+yՁuZSUHP݁&&}Ksɩ@itT65۰Əی^pNK^W|~h [)GVV֝ͬ[ӴipUǷ`+:I/W;'s% |6p ;(9'G,| ;%^vtm51ٟ;\G뜳Y>꺰>M ](f']_"ǽ t.čJG)b].o7Vބb_m[/Glߏa|ʧFmWϕvٞ4#PO/{n %4ssXxJ(ٰБ&K]>XgV:>۶~A{_5gDk$uu=^) u/.=!^.0?_{!λtCҝS49<Ͽ7 "1?/M.s*+*E1>xھiR޺4MLI =1M6`|>c&B7YY߃| ^`z0\9B[Z/e{n7ޭkh43V/5~Ι!`wo7$5[unZH"UScDNNhHk/Yw|n(B #&>"W|T,_fn5Ʒzq3#W[rỎSEM$`ffMD i>ߡĔyם(_nBMO׍hs?w>`!wr9`o3Cfk{0`(f÷gr>i!4Ck8}A)D K+;f3C1U9#s~"i)h8[7>G兒dj-)—Oa2  _n:f)G~9/s"` fJc-:%x~K鎨n=.1Dwl%λB+.B훴mb<[WMhןe@Nu \:4,Bp_46@ѱ[G 7.7%u3WQHa||4=fݜ$*0\u, G+h5(D6Ӌ+etj~SĿ 拌|oE+;hטB[*t*d΍>m+B!,gH*?_9s|ߜ(iFGeCgHq(hJan]/|~\OIFŒ:S1~+̦V6Jʐ9 қ@@pd+Qc` =+D?c#X[]>4kZ9iu&}=KY|R5#^z}k$h}bp Mj[?i=|ӾN4̌՗>cmkK5+?{O]|#O[[atpp"sŔb/.½f[3g΃7itK<}}xeԴ oxHG&@_C]qX ,~聨H| 7^\|/3=h~NY'ctC@}[u_jv!<}o0m?r5`pKV﯍8v:kn̢Yr]fzߵgg;龝d?|A!he n?k;yibA!j(7't^zx؃,$*, NYmfY"ul'k|·o1m^M8׉\">Ł$ wfJ.حR|[g[_ ;<<'CFzP@1Vi.C"7IoY,-`i8zxa{;kd5b{N"#Ziphû5P,44 v|V1HS!䮇=t?y|41ZᩔkB× ,o_.T| ŷDס-rm3uXVqWˇrN|H:-|:@@8f_bu|u|"|a%'["껇?~VUg}9$r.*lJ#i zeׂb|V]t$XA LGIl#|)\ %ŷxrv''w5%%(6?R05<>7~"vE80Hd9!1?$*S3L|xyOί=?t6y]B"|HJ2 b|=C|R~-.9IKzd4 RHO ?cb#>Ib)Wm;6; -|ӨI> t-[̏dTP VѨa1*>LM̛HL꺤NMr9> Of~1KX&<>"3?dkjEO$Ƈ=}R.meaҩħmu~;L|@=.9|si>kv;ju|WW|cuO;3l|2ű(Z,5^Po{{o?so=RwikG'Du;yo®'uG8`|i槌|&>(yjkn_Q >Q||N-?/|Sk۵5im 㼻?ixsM֞,،\.n$2O΢W2|k lK)9+dM{i^~g- y_Wl&L% _Œtj[ 2{liq\hOLŢ2,w|X{97zjn:րom_|{s7 ɻrO>!{3&UWjgMJS'0;An|,rl| i}uYɄ:>-$|ŠPȔO%- vj;&5vP*d*$FTk,䷓?Sq ;MMzJ`@|}+Kz*g(yϼ[=hjx+z %$?@vLQZ&rÛVܻ1d3Z ??b̟̞+qW>3<|Z,ץ77*7/We[ez]SY2k.q_UqE:d+k>W_&&>fy{'>Ty||1"E|XxO _HM]NW>V08$OS^.1qOS<ˠq^ި_' ߄UaF1#Ƥ&yҔ?5({k|zy;;F(4k}vʎgLk 6)e>A'`C}_(15_*Hn(.|#tLP,~|$fdj ->~r/ß_JSys#;F6wGd->sLk$hO_g&310v].>ݲ( Nd'u^-,GSfxqy_G}>[_\[Re[O4.郵v>o ayF>֧|M|{"|˭zO߈VsYtCy :y<\6#tG/_"ٳmOR;n>)bSij$Sǚ:rݭY{|`;;ڧ78|yNc*靈ͫ3#V$[9=.iY| UJŢ%g+O:4 1ROOUq^LK _W4Ӳ7aYKWrujObMN 4Җ@>eFCyQߺ%4{DB|d2|jc2: R8D K>`K9m B"H2-|tJqoJ/b7+T2rPtz# AbHG.qp IYN>-g$OD# 5AۈOxFo4M6=ѹ%{#=ӪsO >2Iс ts$Dy-@C_ae6|֬H;|-ߴλ+v^g<+3o}s wl;/}6Y>m7aszLOp,a!}}߾5+>y|_ƎL|9Ԍ7Ϛf(K^ytp G0"!u|S6`a!q|8Kl*VmNcD$"N|nuyDM&%ؼncB=obe"F"{[Tm>MZW' F͕3OPK_|+ :@hGF􎦉(x+ɻ#w7>_J&qv>ow}#m>ߗ4/1:>*vI,a~uSq/Z|O39Du#ih*NZt(= VmVzXާso84|~%*@ DQk|:)T|"tV͞;{'u|3Nz_,s^!c}z7Pť;1ݔu^ yKg}?ٓߠ?|NΗ;EJ|7>au)jqJO( />KEen'֭[>ļJg&JkR!Ae;jϖQ߶}x|,E?&qf$ܟ_fK=ӥx +w:WڱTc86V+0B||e0]%`c%u^YR>! .5p^j|.ٞzե$yJUB]c(0$Ta;vT<Я¦7,PTm8YWmE|nO(Tg+:@˴+.gƷHFPzܞPY"4VYu(E>Ik ڞ`lKa:fWx٬Rj;z_9U-%̇\ay+%7;]hPQħaUqOa|` ߠo|ݥ%|!w֟{9-E蒁oᩥr ji_j >\|XWޱ&qƙ'#sWC~5?/\ :.\xl o?{ց]r嗩Sไ+SW'x/IENDB`logisim-2.7.1/doc/pt/html/guide/prop/oscillate-before.png0000644000175000017500000001476711541757140023244 0ustar vincentvincentPNG  IHDR>lsRGBPLTE; ~:"a;AV6(c7`b(: .B(*' 2v#T*#1%P Fa99"FVLHIGLUcRJFD6o5e~XWX`hi&UD5sy|nljSr#0FМoX~truj95^YD؂(uMXЌ\񞠝Vgҝ^*_sՠɰLu풻̪XT^܊ׇ^RbÇhֺ̜Ըָվ܃ޫٌ<tRNS@fbKGDH pHYs  IDATx흋CȾ]VwyX u { l=eAU"H *W'Ld&<md|+%P4)Bׯ_޷<*z*PBTV6"WD-.zՂf5If$3M|ͭTE·"̯B 73#/n" ['*OSŧڤ xq) AQď[n݉ݚM_ׯ?Y/49N _-Pg#>#+˨f֧(J_|(.]W.ΣpGLwaDS7os~[# Mw4)(.6b,KTd=9s Qׅ% nR}7 f9r0+`yZZeIm;Aq!nlUf8O}R\ <WnB`yOaz?mN3ݶ:tAsi3G(_ۛϮ05J|veFg/׳k(!Ɇ YblCCCR24ۏ||_e_s/vZI;Wd$Aཀྵ~vex9y8R|J_@Rg XV~JOT|zu\>oPMVb{[[FseqMg73+4@Gb}z}~8ʠ^az0|~敝+9X D-o9d V tmIwⷼ`/ prO5?KCX{ivu (B I>urCCE4U* /_νly/ yr.0Uԫ^viUog!-Dv i>ofؼ(=ЃnBM <.`nBr0ir[,7^B`Eߠ| 7f=?ÎO>3V(yMZS0rt+|Wԯ||-|8,r(mg銵Ž9@Y+/$SkyMBk'[`I_^[Ja뇵1/ ͒hf|y=vZآcRo53o Zspe4SfuAw%ևowxV\i1x^"@; K \f|87؃Jpдu8~o>kncơ 57)77M?IfvՌ[&c~7pjCsnQfպQkj-,Ok8Mi5ѣi_^ 1é1szւwA-- {?5_S]cVRW snmC\ O!w7SU~ >?͋9w7Am [A"XsSt![/ |^\O 5`q<#T|lVheqB-.Bf 7S5_VW&AV$-*VGZo7$-;z܊~7HP]}1lMM^!77j^N;0=STO:%vc ]3_&:rñ[tf?Wkϟ''lX>O25S ž w'YhֻýqZ' ogfߧlن(o$P#61 %'3XH| k۟c~Ӄ#i>|b[MZ,': ~HpcPrZ;ORUW,'p>ugV}{~ЃBГ Y#KS QC`}Nwdе26n$X%]1f|ԃ·u`[ v`[!M?)2Ap:>k Y(>4MWr7Sb=<\5zPpWOL?ua0>Lxxɡ\|8:eH|3MtSЃNNS |{!mnM MdcrЌH2Ʈh=d=mG> OP>֥H8r!E—zssV yt05\CgƧ4Aw ;>$TZw|ylXS##8DPd7CCƯ6=Z|xԗ߃!>W~Hϭ(mVaӼQLUυ_; UvՒ`.!=R%C+L#spxBE)='槜Paj:/0>=/kE"|/(/MwRH"o V_W=B{HOȯ6dgHOQ"N#>E2,N JT_x"W u2uѧ}|FHv-Ty+1\7{PC SEEGU0|AV_WF|v&t]RCuSq9\ŅP3/FEYmUڬn7гګh+'jhs+|O]Wr[QX\仭o]%.6yg.]s,~،qV o!S>eiTbxL}yٯ9׈֣$+1ۨ>.:'}r| T]hÂz'GGEt)؀w>B/7ݽC>4 |\-?7|*/o|`&|I]7y}{IsSڹfU|GGG 6Jf|`3> r-{tx{{E_!oV>b|oߺӲA_{$9`SW5}|oWAAW- Hl.Jĭ _BT ף *>e #ňda3g2"d 7e| |m|R|M\~_uRWrs'0v?X*RUp7>a}Zt. ķR C]i|;(> aٮPȐO,-'8=-baw7ddTiXT$f})sR,9EkV|&|i%nf >%"WC뫜 Cɫ}کG7Po=>LHJWI~vNi |W޿kz<8ݚc2ֹt-U|1O`}z88_?çT }V|W:Z[ߌӆw_>ܻ CuYk.N*x"R|"ĵzi|_/|~||33ys?n ^^ OHM]!N⛔>VmrO{&]Ojȟ(yzL| @7|3WA@s'7YԐ?OW|ZN>!~-M:>xkmnD%HeXӜ7|̐?<%ɳH46v)d<@7||lg;HX5_*c1MmI.T;{][\*Joegnώofz)vcCi2xE:䯙=}-__Nu$zyY|zZAičs1uxnuH;:+J[w=k-{|s\'㼅B|!$P{Ɣ/; +Շ"Yty _:{-,kEr_庠8;-N>!bRq!ݖfߩ_ٞ<s͆`~1]pgls+FLcOK/u9tc%hIq6 a"T'F8WpzC䇧8&+kw!및2vCǗ;y\b#HZiˀ)>ch48>*ǩb|XJGƳaqRݓ eA6_܎MmECw&YjXEMq^.@2 _ wKˡ}v e|_U1J/]z.Uݴ*cz+ois 3>ysIL&>{g`+>ǶzRm V"\]gTh֧e}7W(KZ Sa+nyD1>ۣu}(сk_#8S |l@:J>/>3z:skuy'Dz-@CߔLQx{|t}7w^g<*\KFX1*/|\|G.cTL]|_֌ |ē*ڛg|hŅ ]d|`}&|6i|w8o_ ;> 갖 i}#wG|{w[_̯.iX_N_ k} |Uŷփ.(>o{wΝqM c.T·ތGQdM%l:#jkX~S8P|ZсXv K{*NXtHMv6KM'IMv`3$UL ߩt:)T|f:fOhM=ٳ'qa2Z9YgB6oKo|#_:/FY|KAd}YR?>kd7 ߒi%;%<|eI>}4Dlm5< a|sr0'M8CanݺeC̫̙ 0Q>Qgńlj|;V>nE->MAcXY}NI@a?39VO'Wr|]Ce1>f.ĉ>?D NX_50=yٹ}#w|m|8/5>gLs&^u9"tjf(n#9,>v.: o)Jw aB EB^㼦A:4|[f(g*:@hT+.s& FHVdpJf(t-yJUb|xJd^OP÷D_U×+yGhuL n>?8U %kzg+YicCE|[~ dW:T|#vΗ\Ye:Ր j6!]]͵ ;*׳Yk"稝?9H^'_ ߝɧҥ@Ogu39]޳t oM>}ڃ]jk(\BC yTIbmt']IENDB`logisim-2.7.1/doc/pt/html/guide/prop/index.html0000644000175000017500000000163511541757140021302 0ustar vincentvincent Propagação de valor

    Propagação de valor

    O algoritmo do Logisim para simular a propagação de valores através circuitos não é algo com que você normalmente precise se preocupar. Basta dizer que o algoritmo é sofisticado o suficiente para dar conta dos atrasos em portas, mas não é realista o bastante para lidar com fenômenos mais complexos como variações de voltagens ou condições conflitantes.

    Você ainda quer saber mais?

    Atrasos de portas
    Erros de oscilação
    Deficiências

    Próximo: Atrasos de porta (Gate delays).

    logisim-2.7.1/doc/pt/html/guide/prop/delays.html0000644000175000017500000000522411541757140021452 0ustar vincentvincent Atrasos em porta (Gate delays)

    Atrasos em porta (Gate delays)

    Como um exemplo do nível de sofisticação do algoritmo do Logisim, considere o circuito a seguir.

    "Obviamente" sempre terá saídas em 0. Mas, na verdade, as portas não reagem instantaneamente às suas entradas, e nem tampouco o Logisim. Como resultado, quando as entradas nesse circuito variam de 0 para 1, a porta AND brevemente verá duas entradas iguais a 1, e irá emitir um breve 1. Você não vai vê-lo na tela. Mas esse efeito é perceptível quando se utilizar a saída da porta AND como entrada de clock de um flip-flop tipo D.

    Se testar a entrada, variando de 0 para 1, isso levará a um valor instantâneo igual a 1 que irá para o flip-flop tipo D e, portanto, o valor do flip-flop irá alternar cada vez que o circuito de entrada for de 0 para 1.

    Cada componente tem um atraso associado a ele. Componentes mais sofisticados construídos em Logisim tendem a ter atrasos maiores, mas esses atrasos são um tanto arbitrários e podem não refletir a realidade.

    Do ponto de vista técnico, é relativamente fácil lidar com esse nível de sofisticação em um único circuito. Lidar com atrasos de porta em subcircuitos, porém, é um pouco mais complexo; o Logisim tem a pretensão de abordar isso corretamente, colocando todos os valores primitivos de propagação do componente em uma programação única, independentemente do subcircuito em que o componente se encontrar.

    (Via a opção Opções de projeto na janela Simulação, você poderá configurar o Logisim para adicionar um atraso aleatório, ocasional, para a propagação de um componente. Isso tem o objetivo de simular a desigualdade de circuitos reais. Em particular, um latch SR construído com duas portas NOR irá oscilar sem essa aleatoriedade, já que ambas as portas irão processar suas entradas em sincronia. Essa aleatoriedade é desabilitada por padrão.)

    Notar que pararei de dizer o Logisim sempre tratará bem atrasos de porta. Mas pelo menos ele tentará.

    Próximo: Erros de oscilação.

    logisim-2.7.1/doc/pt/html/guide/prop/const0.png0000644000175000017500000000100711541757140021212 0ustar vincentvincentPNG  IHDR7bPLTEP((^& pHYs*b@IDATxڽ0 @@yv3 dJ U|;LZ@ME {>?klW`Ͻ |6L òb,M,b0`.Zž:حR(3s)RpP+}R!OX.r>*؀ɚvbPXEf}p U\eEyI k]$n~r^AӗO[g۲\Q}F$DǪmN J^HɻhW0V':=cuxJw^AC'!thQ OQ!6/HySoSDb0=}``1u`z}`lnP;VR^K;d X͇GX|(q wmA:(\~ '-Lw"IENDB`logisim-2.7.1/doc/pt/html/guide/prefs/0000755000175000017500000000000011541757140017437 5ustar vincentvincentlogisim-2.7.1/doc/pt/html/guide/prefs/tools.png0000644000175000017500000001422311541757140021307 0ustar vincentvincentPNG  IHDRh>].sRGBPLTE#4S_5453 6^VfX6(UZ+?R*$642)1z<45a45 Fa-HV74];W=f0YZG `LyTRVdC3H>yYXMdZS|Msnpm1}Zy{1rd7ɏCo~]ɂ1~qFXY΄zJWu˲Q]ә]f)┴zsԠ}tu[̪ՅӶvѼ۽}ֻ΅Ѿ·߫Ά੻ڼ׻ݫE!vtRNS@fbKGDH pHYs  IDATx흋CHƍ.(tYZWݠEA^*b\ZJkP3$MpK.3'/''Ӵ9^t6Q[7ur&ABXU<+:^Jm8[HԚ6,VzM:1?h(h7]^;Vwzg)Z~~5wm%%nڊ3S՞[鶅q.w*6Z1U-Km't/?-ɎA,Pq)|Z3cvqzrzrtEMA?{;{Kʘ~BLDsonS`(C[J]=衐.rEeNԍ.#h%8? Q@A#?%WFZ2m3,n!bnѯ~QJ:86fqe2hA:goWyI 2GŖQHEf9. hmFR3W"LÎxYP)OħK\zt i F [V@X:a9*!] z\ؼ"J"̥qByGӭkK,hcDQ.`ydmK=f@WKL%eh0#2R+iYЮF1avRsNE7-qg{XbFi7I;mٚ_!gKiwP;]lNWf`t+XFKj ^A7tj6WM4҃&m]Ljb 3Ët@s@OEa'@`,=ërBWd`<75a½A:δF:1{}V & 蒎 <[k~^73!=>6Ҿlvv/ OtKں+سzoTY3V:S{{/eZi_u6Usۀ).&4$ ҁӵMOy{Z!"6aOMOj%k{*Mf]K]xa@Nzi_{dVM@!~ 73f/(hݬ#w^OLt_?'bFgX jTl7Y bOkX5{kxOzMvH.{C6L FbFQ~N=Zks4t=CS[$lẺ&Y7 a(v Κx `C6[{#o_Gй\zA9F8}ʩd9 r)hNg-1Zy[Z;sJ_=/ cSN!79Tn 'sj0 i p)˾~oy 3i.Jٞy!#[!7BTCu֫&|1\A52'2r4)ɾO֩&]ӛc@fb_(ז_)h7U=A5EGWO9h4eAzJ?XvUe :A4h#t&*]ઉz™8A:3gLu}X e'teNCu]QJtUhπL&;%hyNVxa {teGVݣW462hKaс#>lEA<4ƬR:_^U4y "I-<%T{4ٹtP8=Z{Xbmtx|5n Ns9Oa#pS⢗c>R/<5}[-Ħ&` )9>jIkoغkLyC:>Ƨ Z`~- \ .{р=Z=ƐnWXoD Lm< z:o]$712ڐz&ڹů2(>Bu\vRF`hCxQ<ɟIZt=e'omgʱ$(QeG(;E* @',GXix-mG:C.dtM(o5oA‚,cߴ>2o/z&6wCa\A;k4V:-7z$JiL͖fzwcf“JJG7YѰte:8L4@/݇f&|e-4zSjCNAo :e%U ! f݌ '@;_ :_ѧkNA?_4e@ˊs k*oA_T_O8Z>إZ*|'r?dMqе=ZA4&9h9hEss+9hW@Os4As4As\4As5]=@KgE9sLu:&'78ZOMMtXBֵ4uڀ.~n%*}]t1KGHhot9pS<Z #jV+㌁N~l:0hu h toI-2aH]ab^&N: y :@d)2d {=7`L@iҹأ4@#(l4.ny4 12@40uG- @tm ad@1Q{]hZXp\4IDJ6tG9tLRo`/Z:Z.Oי}5 LA",]Wb]cڟiН wG< ZNAD&-{̫S'p|xs:Dz I  |j3 q3!AgTΎA3=6̣=%ӹC }{oZJ@Pט A9/QЭddR$3Z-xq O 3BG4Ň BȹEޓC3$4 byʟGAS{B A Nb蝽Ei\ B/AOlKoigZ-T -CI=I5Uͯ@O9>}7 YuAc*h| p- a:E} 3Ur6\X;~4z€B0 \ `8tzn [Jv :ZBʘAΆJ@'Ѕb.1--8)qc_?Sj1+#E^EFc\lp z|yNI]Wf<3x4,OŢSb}dAzh!z}A?jy(=eеU93:hLk5AWZb%6HJuz BRRW4UA>H IG]&=1i`'a)EJR3K18h%$tS7pdZ)"%JUWq YFM: Ѧo lJ`qwsM%zvڔ ̃AV0ڽYcfevaQm e})׳Ӧ8NWetAgĆD&309ɤ>4znE2[>8.leE8hG3r{}sQXo_"̖e0lYaު8_! ЃujYʞЃ:%ְ/w !-;9h9_xosDވ:'#\5QdZizP]*ՐNiȼɚ~RJKtbjM!h1{,CG=T'mM"7^67=VK]\t%Son]v{n.XK^tSoܹq /Wqp7npLm7.?ϼI"tQIENDB`logisim-2.7.1/doc/pt/html/guide/prefs/tools.html0000644000175000017500000000317411541757140021472 0ustar vincentvincent A guia Ferramentas (Tools)

    A guia Ferramentas (Tools)

    Essa guia inclui opções que afetam a forma como as ferramentas predefinidas se comportam.

    • Após adicionar componentes: Por padrão, após a adição de cada componente individal, o Logisim volta para a ferramenta Editar para permitir que você mova componentes de lugar e para adicionar conexões. Essa opção lhe permitirá configurar esse comportamento para que o Logisim permaneça na mesma ferramenta para adições do mesmo componente, até optar por escolher a ferramenta Editar novamente. (Esse foi o comportamento padrão antes da versão 2.3.0. Embora mais intuitivo, esse comportamento requer mais movimentos do mouse para alternar entre ferramentas.)

    • Mostrar contornos durante acréscimos: Quando marcado, ou quando uma ferramenta para adicionar um novo componente for selecionada, um contorno cinza-claro do componente a ser adicionado será desenhado a medida que o mouse se mover pela tela. Por exemplo, se você selecionar a ferramenta porta AND e mover o mouse pela janela (sem pressionar o botão do mouse), um contorno cinza de um porta AND será exibido onde o cursor estiver e aparecerá quando o mouse for clicado. Se desmarcar a opção, irá desativar esse comportamento.

    Próximo: A guia International.

    logisim-2.7.1/doc/pt/html/guide/prefs/template.png0000644000175000017500000001470711541757140021771 0ustar vincentvincentPNG  IHDRh>].sRGBPLTE Z4^O6663 6]Vg(V[Z8+?1|O+%VyYXZS|Ls npmZy{1Ete7ɚ~~/|r]}WFrJYKʰP{\fԝ_1ᾦ}sԠ}ɦWt푶෶tԵԼ۾{b忙чؔ՞φԳݮKtRNS@fbKGDH pHYs  IDATx흉CY- G114m1BK 1 gƄ@w-yff#I0_sg}fvwfik᪨jZzva?. Փ.Jw/5IYp,T5 4hƁMPAy% JFϓ=O'dH^z9Ҷmǹ0%Nsгk --5-qwP[qچt!VmA)UAkC0@lU3!I5期i` ATG#bzoL  hX5'ZittaG).0.<=?-m+гᴤQ:Pm^TB(j[<- ,ʑ#q$>A0=}ro4SZL:Ʃv\w4J.34jŦt t6ױNrd'}y8Qe *v̀DA#O=^  kԯ;شBڶF[ֹ(ZH@3AX;=1ϲheg֠󁄠ѧbtMNݍjB?1&sB:HY6`!QĮAk]t&C\g D zLD߼$c!s)EAU%L۳kg۠tVdmP,Π@gt@ g)!>M Bg2%yU';sSw !ATOv ]IUIwr ) w45i@:@:X W(MVkXSdBv-2QO zNn:0^ Uи?w$nCZ@0NK!^~Ol2g`AKЄGS}  xUa_ߓdccߛ@o: lf2cLڥ>g0IA1%BSp@M6h_$r A!s?'(Lj86v% "dЬa-L`pEE]<@8ft:.@amp6DmfrrUf:r-Lz5mTܕT\ۼ{7 MO,@g21b: H7`(hp Zu$8 p F߭y~ڮIl 9/i0j+֭AGpƕor{:7Otӧwы?&F:!q3.Ҏ^\yEAM6Em"  Y݉f#Hξ3wo'Vp [wmusI>I/$\ũr6Z\vYօthyg- Դ=/t4cɿta8<>:\Խ)e7Y'&(l#%rm5:3+BWYpd6 lYL"1xf< )|2O~Mԇp$6)1d+O4{]g>ޯ.BkJI9 z4$0cd:~ns4o{ؑb$;G/F%JK4ɏ&JlW>w$dqzo\C(7P aGC2&!iZݼL[>=*_ $._pH×lv.)&Y]jLaE? N@/`df;ّ$<]^Q9 z4,#$Nq+ܴhHPJhc 춧{4hr4,au u8F2I,:BDAcMR&#rI=pjw4P:49`+ūG…44&aJ#ӈ65 ցrgH8aZ:M*ߓՀξ2}~:sѣk4mG|umDWOv)}ZyW}_V#pVseh.3芸. NG3\ WEd-qUD&У%,t :|?+-OЅ2,e*hi|ʲe*@cwAf88@ȫh#q4\; ȇV ,qܭOB9L;N~>6hv%8LGH3H]|xg= >i:Y!/"w/&Es?]G> cbl`V}n[)Yp@cyEAľ>!yX$ 1Z:W@n^U 1.,A }wϓM Bf4awehjhrةG+OK/B#q.$.ҫ>! zآ%h宣*>xC%IgO,i'^A}>zMML#@{9hrTXF^n o9@oFC9X 6*Ge2h,>7Mo%N54D G9 IP̒@sthG*hS2q{㗧Nhb,xxHА`ؒq6-jtҼ.e@ѯ]G'鞏|nC f5IύU}CF !N#I![ KL#rxYa~< a}v:IJ2&PvetJ:Sww| >Y+lNz3P@=bX`hb` u"ِ oBL8t$ oJOR..|&$Fb45+<̢6]h_襸Muh\EkcPBbL}3sե+Ar<(%\=MZv]ԬGم+*h)גгJ:Kw|`5~{DQh[J[*4S.7)oOZ} JS4I|;Ai/:XeH\47#Mh#4.bDY48c됓pgPˍgQ Jjܓuwj"jAYY~K6(h8̪Alh X2Rᝳh,G 7䤲K:֖ѹ(%22B_*!ݰ}uޝh}G+3?/~ZІcRh߼//r$_.} }QA_ xibS:*\te7,e}sUwtAs4AsUr堫AW oh4Wd_edjeAs7 oh}@k+&1 yU\l/*ASЕ}uAst1sNAہ&a8~riKA Z72P{$[c%qTe3THa}ܽO͊X2,SnqɍX"Y#Ѐj ^\Âl[!oH\jTrZI)m Z?|] [ i:i _kOx~;{^T.t:;0OzVItkP=: -8/V6;/A:aY%ckOMlίNN\ o[SAWRᠫAW+]C ? 핹6oXg(~o)As\4}A't"rEeqUJ[ :: .iQXYq6] CX<\k:P&&],-55-^ayI`5뿸*&sMMۃ\S ^*QvfIENDB`logisim-2.7.1/doc/pt/html/guide/prefs/template.html0000644000175000017500000000341211541757140022140 0ustar vincentvincent A guia Gabarito

    A guia Gabarito

    Um gabarito é um arquivo do Logisim que será usado como ponto de partida (modelo) para se criar um novo projeto. Além disso, se você tiver um arquivo Logisim com um ambiente particularmente configurado, você poderá "redefinir" esse ambiente, utilizando o botão para restaurar o modelo na janela de edição das opções de projeto.

    Embora os gabaritos sejam úteis em outras situações também, eles são particularmente adequados para uso em sala de aula, onde um instrutor queira distribuir um modelo para os alunos começarem a trabalhar a partir dele. Isso é particularmente provável se a turma já usar o Logisim intensivamente, incluindo muitos dos recursos mais avançados, caso em que o padrão simples de configuração pode ser simples demais. Os gabaritos também podem ser úteis em sala de aula quando o professor quiser abrir um arquivo enviado por um aluno que tenha configurado o ambiente de forma mais significativa.

    Por padrão, a opção "Plain Template" estará selecionada, utilizando o modelo padrão que acompanha o Logisim. Se você quiser um configuração mais limpa, você poderá escolher um "gabarito vazio". Mas se você quiser designar um outro arquivo para usar como modelo, selecione-o através do botão Selecionar (Select)... e, em seguida, escolha o a opção "Gabarito personalizado" opção.

    Próximo: A guia Ferramentas (Tools).

    logisim-2.7.1/doc/pt/html/guide/prefs/intl.png0000644000175000017500000001051211541757140021112 0ustar vincentvincentPNG  IHDRHV6sRGBPLTE{0N(f+?N$43g Fa*HVOUaMB2G;GZUPGr}opnp|)o]yp;\7/HSZd˜k0x՞ڒϬɷ¦ϯзbKGDH pHYs  IDATx C:(2aG'9Dtc_j$MK))-m>Jzyi(Py'(~&LCZUW?MdOp8ԗy[K}Dϡkz66-{RWoVzc>NEQݣaQؿ oOA51F#)q"KG̥ onHL&P#AGM rXjE:H3Tl]Hz֭r4nx'<2 8ڨ0Kz$ӱUӛ7> E R04m _ /G}㑵#{tF_8 ]$hF$PBaөHz[וݸ2⿧vA=coPqD7b0;qSx8@tEg+>R7Vbr*^N-ibN7!$Grz)Mx>SO??|$tI/DV̏}G,|N[2waRTHF P/j /ǀ)Ao+ȋoߔ!fM~|lO+hrC1w(5K*;vP.2i$Ď860Oَ %GӠ '=]ӴpM[o{J@ޝ}<<<0˲AjȒȑ܏'WgH!ZJr9<;#wGӇ}mg hĔ ]V ق$KH_,%VNJ5KEؿcg9RNpG$%<%5 z!`sv'՗/gg#NRJvM 8kIb$)3#u1PZpDc٧# xb1gى9&IvWy٦=;>b[%lhao >&8H<;ᗓiH$]ql>- g4ydG&Fg?W1hygrGgcuc ÐzSM[G1 rQQ[jϛfʵ<ܞ3d,Qz9gt<鼜th{dP[l)Hv#Ns^ĩ[E{iṛxB,]`f ]IN4d['3$S֕8O4I?tT'?򒾘TOGÑl&8R:GE_;I#]gKȑa4w(|CNk'#B)z:}9lHjvW,d'ɢ=CU)~,U->LTHʫN!̵I2s1. =tE\rG5oNIv}!d4N$n7 IMSsJc"jy)aw ER2yBv=3 ] 'X0HUHwRUHuރ +}U@IGh[MC2D$13[3d@2%A821G,tZbFfN* _RL,b3IOfA¯%I!$E䄊-)N+ce:]#s tQGZq ?> 2@bNRY R:5etћv6fӆ h:0\&yHX ;UШY dMoq,2{M;7Z#1Hչl5E*u:rywAsd@WZaGn{ =2d#+};9oo$y;Az'olqHy,RG~O<Ȣ SR4mfaGi>AlhqW6Sb3xz.Ƨx;%Yp JPu;s /҃ TL@v:qv>0suAV$,@4`_2=h!I"HkgwZy*K@BEvH];[Ct"X#끄̛0;[1H@@R{YG7hY5HU=|j f}c H޵yK Iff8R/6ABd-A@i!q㵂>fy$q 2d:7% sD|ȚM\*9 ɜ{Ԉی_O|P? 'l9~1m9ّx$C$sqCvds(cp$ ׿Dyx]]k`e9j{{rAzzPLfHzִ )+' yAy}AyAOs$~qUA6Ҙ'a9\%jYhA&H~$r)[E.DL[FU A2 H1Qa<%[2#N![(jqj@vԑw9 *jFh^D[NW@BdAv#6mQ(/ m5 Ce2ٴm[KFi[@$.I`C1>NX`qiG++)Զ 2@:?!@d kmxAzy鵲 ۫#S‘Az^^$7e HBfe~cCy3+> rGB҃tr_ 20;y+@)@oD$j̙ , ,NGAB"Qx D!0<)NB `6dn lZBσ c()rGk =H҃mD`@2+qCxydA=H [Y m$aUH9u[h4(K^rc} D=-~mR'k6ׯ dVk~ϫh>1qث(ZUU{imIENDB`logisim-2.7.1/doc/pt/html/guide/prefs/intl.html0000644000175000017500000001043411541757140021275 0ustar vincentvincent A guia International

    A guia International

    Essa guia oferece opções que permitem ao Logisim ser usado de acordo com preferências regionais.

    • Forma da porta (Gate Shape): o Logisim oferece três padrões para portas: shaped, rectangular, e DIN 40700 . A tabela a seguir ilustrará a distinção.

      Shaped Retangular DIN 40700
      AND
      OR

      O estilo shaped tende a ser mais popular nos EUA, enquanto o estilo rectangular tende a ser mais popular na Europa, algumas pessoas se referem ao esses estilos de acordo com essas regiões, por isso os termos neutros shaped e rectangular tem sido os preferidos. A norma DIN 40700 foi um padrão para a elaboração de componentes electrônicos digitais e analógicos, adotada pela DIN, uma organização para padrões alemães. A DIN adotou a norma retangular para componentes digitais em 1976, mas alguns os engenheiros continuam a usar o estilo mais antigo, mas isso parece ser cada vez mais raro.

      O Logisim não segue estritamente nenhuma norma, ele procura usar um meio termo para permitir alternância entre eles. Em particular, as portas em formato convencional são mais quadradas que as dimensões definidas pelos relevantes padrões IEEE. E, apesar das portas XOR e XNOR devessem ser da mesma largura, assim como as portas OR e NOR fossem mais retangulares, elas não o são devido a dificuldades na compactação da porta XOR convencional.

    • Idioma: Alternar entre idiomas. A versão atual é fornecida para os idiomas inglês, espanhol, russo, alemão e português.

      • A tradução para o alemão foi introduzida na versão 2.6.1 do Logisim e continua atual. Feita por Uwe Zimmermann, um membro do corpo docente da Universidade de Uppsala, na Suécia.
      • A tradução para o grego foi introduzida na versão Logisim 2.7.0 e continua atual. Feita por Thanos Kakarountas, um membro do Technological Educational Institute das Ilhas Ionian na Grécia.
      • A tradução para o português foi introduzida na versão 2.6.2 e continua atual. Feita por Theldo Cruz Franqueira, um membro docente da Pontifícia Universidade Católica de Minas Gerais no Brasil.
      • A tradução para o russo foi introduzida na versão 2.4.0 do Logisim e continua atual. Feita por Ilia Lilov, da Rússia.
      • A tradução para o espanhol estava completa na versão 2.1.0 do Logisim, mas versões posteriores Logisim acrescentaram novas opções que permanecem sem tradução. A contribuição foi feita por Pablo Leal Ramos, da Espanha.

      Traduções do Logisim para outras línguas são bem-vindas! Se você estiver interessado, contacte-me, Carl Burch. Isso não será um compromisso. Ficarei feliz em ouvir de seu interesse, e eu lhe direi se souber de alguém que já esteja lidando com isso; prepararei uma versão para você trabalhar, e lhe enviarei instruções. O processo de tradução não requer uma compreensão de Java.

    • Substituir caracteres acentuados: Algumas plataformas têm pouco apoio para caracteres (como ñ ou ö), que não aparecem dentre os caracteres ASCII de 7 bits. Quando isso for verificado, o Logisim irá substituir todas as instâncias da caracteres com o equivalente adequado em caracteres ASCII de 7 bits. A opção estará desativada quando o idioma corrente não contiver qualquer equivalente disponível (como em inglês).

    Próximo: A guia Experimental.

    logisim-2.7.1/doc/pt/html/guide/prefs/index.html0000644000175000017500000000267611541757140021447 0ustar vincentvincent Preferências da aplicação

    Preferências da aplicação

    Logisim oferece dois tipos de opções para configuração: preferências para aplicação e opções para projeto . As preferências para a aplicação abrangem todas os projetos abertos, enquanto as opções para projeto são específicas para um projeto apenas. Esta seção apresentará as preferências para a aplicação; opções para projeto serão descritas em outra seção.

    Você poderá visualizar e editar as preferências para a aplicação através de Preferências ... opção no menu Arquivo (File) (ou, no Mac OS, no menu do Logisim), que fará aparecer uma janela com várias guias. Apresentaremos essas guias separadamente, e então veremos como as preferências poderão ser configuradas a partir da linha de comando.

    A guia Gabarito
    A guia Internacional
    A guia Janela
    A guia Layout
    A guia Experimental
    A linha de comando

    Próximo: A guia Gabarito (Template).

    logisim-2.7.1/doc/pt/html/guide/prefs/gates.png0000644000175000017500000000626211541757140021256 0ustar vincentvincentPNG  IHDRv0PLTEmmm___QQQ???ʸ^ =IDATx}p"/ 'V/1^ "b e0J#txcM2U /c1-bm rl-ZtK(6ct7wnw繽gK{g}Ɣk]d8,N&+q=-L392<Fd;e{J}h+8Tv{ T\8oY=4ߍX WlN"OFMuG.mMͅS6U\P/+# 'h)4n1o6\8)+taG!.NPoX|>-[s@k7?V&h?"5[op:\:aI^}g8袜I|E ڷ{=9Km}.`vM.ÍƯo8FT%q8A*Ӹ[İK r%Guu/+o(kv7p>Lݶ=Q_|bqp*qy<3WvK*kǶ3 Z꽓l<뎍8rgc׎+Hɡ?56p!UsNwWhrz+ټMtFqNӫ&r~w+FVPswtܵ7s\~6mi]k˓~e9c/LX0ԝuG84|}LYVBINYEQ $Vpl@ &&ӐdKe~X(8&wx8gO81 }28?u ܘ +,'d," qkࣚԘ۱q}Bs8`E-3 nJ okpqzwimMLPSC Ƹ8q̾GXW"uo|S$ @E8`)v _7YHp؇8oY{ pk%FEp<щ,Ąww,%6I&EJL'e* -HB N(Vo\#InZ@cM94.M0 ͇ɟ @-ΐH'"%أNwhdp ဩ"#A+OEF28RDpz#B#u/ #ZDB8"ZQ㸝_I߾w~72®t1M I 8f8\]pB9!qvpqrUrҶbhFٮKBc 'tFت/AdmqׁcN߱a (xTHf83FB}f86B83vpXmzԨ6pύdp$bi##Bd Gܓ'SmEd G| "z G<@Ek 䋥FqDpdA/ř)6aѓN@2FG2/68$lE:Ĩ7}Ź 88p+%Dv0hZԎNjLa8g%5b8'Ę*{+Ԙοf݆Y8+F<Ő8T[83e#$,O@={5^Q)k цQ{HBɮdeq2YYLV'Q1+~EQGYm3 C8 ѧYeh#oL4aGEr<I&mG$8yq nC ~ 8%?fLaE`b$SL dDBP%1bM7c!v/'޹U&*.Ac vC憃kĽ~q:@v@H|g^s_8Zax `"~g^=83Z>KB2$NWW׀ UJ<|ÃvjGmԇtU|L΁wɑSFSUELPΠ=dT<zUmLjbɨXP gȈTFz G ӏs#onQ_ŹzӈS@:BiBDtqؿLe>F K BJ^^kAnU͠O Ar`J<ҷ=Oqs;0].sRGBPLTEcע4M_6563 V7^d(Y6[^+?1{R*$765372y86a Fa56-HV744_?]yRPWcC3N#H>yYX^â[U_|JsnpmC~0̟|1ugw7ɏCo~]DŽ4~qFXJFYzӏ^ә_f)⻧sؖ~Ԡ}ht̪ZԵ׼ݾ{̈́ѾָЉφѴ٪߰[tRNS@fbKGDH pHYs  IDATx흋C]X F %6U"@0!^l,sξn1o̞fk׮]l\#i{ՖSJ #>y[/"rK,|hIeeFiIXdH0$ji&LyuRw/&vwmjHwWYY$m;N+#=ݑ};:&u]8:@@. zOI1cz̗&!г[AO o:WBu.OzZG=-zM}M8}i iM劅_巕 8tzv F,@?}saHPb`"G(ZW^ }xhJ9KkL"M5pл?e"/~g1gKVXY׭3tRk: @8-z-u׋CZ0L_gyΠ + 4]EwM,muEKBM:moiqd^%󂔰ؽFkl\L~Ak?ڃF;MCg7:|hKIRJW1&.RJHmHGuҤ%AMt&' Jb*GGVr RoK>.w TxiYC!{3POFGKNkb]iς3_I@g#\Ȍ<@#`rEnZ5ھlR>*܂o ~`?^߂J& ,EuHA%vڄS2#T :*Cź4juZ6fiC.Z}yA/\ʭ|F+#А `_;׭Ԃoa#ҥ}[dUP?lZmL=/h_}h,9ͅxCV?_K1d;b)Xͳo5<&g@f4>| h91_ vMPgF[ b_-Ep^E*t|:L8*%\$ٚ? 38-ų35SydXIZh!FW@:|.v2[EA.poT ?%} 3y5J})-فX%㙗A'8]41%8>8ؙJ-fJW XVWk^r]A:–ҸQ:`/>ydo}LxE)h"RsPXz+Ve(:'S>gj=K=۶>;xGdU} VZ%PbE^=WŰl{ĬsS;ODWWV 0e\(! 1Dv^]K//\s Ұc NHQPE_ R,t-᳂gidƬIW`+D՞+3ڤ؀zld82;+'jf1ػsϒVG;!v6"z%g@lA hBl :;h(~^k +]bٕΞ%G`Z>yٕMg+Š0d5a K0[[, D3h,CLvx767n@2ӑElolEj :of>;gXp[-_KdhlJMOYA]">PՀ?k} W! ƗAwQ7Σe׍0I<)`[==F.y<\5Z];\R\"ЧR\")ȅ=Y=t"ڀ45$ꔩXJ5)}vb5\Ӂ?0ʟb#tķ%  F=>x@֘F;,5hK?D7&ne9qZ1hRej5XG#/QQb d׏6 eא'нBk h|v Dj}QFOr:cK×O$7ƽCD!}<TgVL@9fA96NJAAŠIiْ͠ fBLSƃPk v ͗#ZXO#x}|h/f}r܂>Cn܏X~ M15~+54d'ւ!ݤV\M)I3hCT5z @aVofVI^]l=HEi OTB/CvQSo阒ɘ4m&\0"4038N#5hkMpnG[zƲ @m(+j_ T`$ 3n<͂:oH˟Zhb@Ao4,Tҵl"И%TN,ۃM@k~[5Е͛ꛡ]㕁F܀2ƹ4V%RhbA7$sAҍhkm/pNH%e*VS@)_JZW[5\(yk=9yްxbWGp@{w=; t@ sU2M`S[u ]K%h)-AK=#AKЗ ̌-A_.3m/o @OR'$hZu@S Zvg([!踢דscWt'|%4Z@c{t3Q :NLK?|Fs?0;2{-Lg;TtA3AC]sp=F>qtUFF   #hjQDv}|殝wg(~$=B܇' cA=I}LQaQ|bk*C\3MnO⨍ses#p 4&ϞU4zB1[I[H))7I9b64AF%o kf6~6ܕfx27W9p_1;QM5m4YLJǶ,5r7 ( ^ <ȜLsig*zfȡO`t "ע MK%QHo\Nzٽn ^x "Z6 <骃6h6#cnu+R!M> ~34fF,z <\7̋"I#{`)k%2RYGFv1CUxځdògNsKCv͕H>=L>#hx6q|؎*>GM>|?NWأ ,ZnjxD𙇟`#qlL:k!i(תu.Q io]PߠA+⍇ڽFH"sr& ߪ1 |yPhC-mqHcݼWq`Dx`8PadC}s7QLC\»} Qa(n9 }8a-mւ.-1)r=3hrq1ݗ"쵱W~a``={mX^-Gʈ:8ZmjxHv>@ yӺZ;YX] yy .3=hTǑp%@_g-AKtXtXtXtX Q У}@Je=:*A{zT-AKR$h Z%h Z@8 hnIFF{t3 IPHOlh@$hAtV'rAj۶r.:FF@^41{Zx>2s.=|+uc4J 4ˁFHGAc [M9QF#sCd8h+Nl<ĸGnYPcH!>0EleQydV9`![I7Ԇ#pX)0 z>LqVUJc<1F<1ɿ>b,1,&TAL],vlLci[HXDxC"۠ {˦Yd0`m@_gEk7OO9gܞ0YϥZdJÆnB0="<iDxXl:v q+:пNm!Vx~;o`S&r8ɼAӛY6646ЪtүHDŽ7f]cDfisEq8t"G4]t3pOS@3",N[f *; H"$:P4nfTS s' 9F\@S)it1@߫F:f{ = qU}j*<j JYCsS~5^@<~5:$A{:T}ח.[OmѻA׍FF4 TPtԤ)7i[VHAIO#G3&+ 0ohh@@j?"35[XJ`~v^]d.[-j^sff71ٿ߹~g-w_BI :m˸"xihn| A guia Experimental

    A guia Experimental

    Essas preferências servem para habilitar recursos considerados experimentais, inseridos com o intuito de receber retorno dos usuários.

    • Aceleração gráfica: Vários usuários relataram que o Logisim parece bastante lento na renderização gráfica. Um usuário notou que a adição de -Dsun.java2d.d3d = true na linha de comando pareceu resolver isso. Você poderá tentar controlar isso usando um menu drop-down. Eu mesmo não observei tais problemas com a velocidade em Logisim, por isso não posso avaliar a sua eficácia; confiarei nos relatórios dos usuários sobre se isso servirá como ajuda. Notar certamente não terá qualquer efeito até o Logisim seja reiniciado.

    Próximo: Opções da linha de comando.

    logisim-2.7.1/doc/pt/html/guide/prefs/cmdline.html0000644000175000017500000000554311541757140021747 0ustar vincentvincent Opções para a linha de comandos

    Opções para a linha de comandos

    Você poderá configurar as preferências do Logisim através de opções da linha de comando. Isso pode ser particularmente útil em um laboratório de computadores onde você queira que o Logisim inicie sempre da mesma forma para todos os alunos, independente da forma como tenham sido usados e configurados anteriormente.

    A sintaxe de linha de comando-geral é a seguinte.

    java-jar  jarFileName     [opções]   [nomes] 
    
    Os arquivos adicionais cujos nomes estiverem chamados na linha de comando serão abertos em janelas separadas dentro do Logisim.

    O exemplo a seguir iniciará Logisim em sua configuração básica.

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

    As opções oferecidas incluem:

    -plain
    -empty
    -template templateFile

    E servem para configurar o gabarito para o Logisim usar.

    -gates [ shaped | rectangular ]

    Serve para configura que tipo de portas será usado.

    locale LocaleIdentifier

    Serve para configurar o idioma para o uso. Assim como este documento, os idiomas disponíveis são:

    de Alemão
    en Inglês
    es Espanhol
    pt Português (Brasil)
    ru Russo
    -accents [ yes | no ]

    Esse é apenas relevante para as línguas que usam caracteres fora do conjunto de caracteres ASCII de 7 bits, o que inclui idiomas com caracteres acentuados, e não seria o caso do Inglês. Se no, os caracteres fora do conjunto de caracteres ASCII de 7 bits serão substituídos por equivalentes adequados à linguagem; isso seria útil para as combinações Java/SO onde esses caracteres também não forem disponíveis.

    -nosplash

    Serve para ocultar a tela de apresentação inicial do Logisim.

    -help

    Serve para exibir um resumo das opções de linha de comando.

    -version

    Serve para exibir o número da versão do Logisim.

    Next: User's Guide.

    logisim-2.7.1/doc/pt/html/guide/opts/0000755000175000017500000000000011541757140017305 5ustar vincentvincentlogisim-2.7.1/doc/pt/html/guide/opts/toolbar.png0000644000175000017500000002312411541757140021457 0ustar vincentvincentPNG  IHDRDu2sRGBPLTE]Do8%515bVh(Z7aa +>1|,-+R*$<.2z Fa;70?oSZ2-HV86KIDW=OVbO%c[SGEr~]| ¸eopm#¡} 3uea8~1]˃JFt܌5YΔ*۟Л[f_gӠ}[jzɰLȭXTR¾bg˜޴׌ۡϼڽ؏ݬ܃ٌ߻ʹjߋtRNS@fbKGDH pHYs   IDATx흋C Ee<P-~ . J PD.{w䝴I)Q4$$sΜt *%*Wo=KY)3%f:~XGf2J|2nQRL'o泖?13y՗Ogo"[~q`,*FeQK G}I̤g2(UhC1jŨ +XԤt-EW]li&16r98Z%>j'^$-ڿEw H`[diEbq;Ē^ҞƆ(S-Նb_a =E%$R)BIl8?,4(FݡW Qoⶳy EL&;z_dҺ5!oG=n&!Q}\JKfE1fnkD2 Jc1Y垬@B6#yyKni?6{_34 dv$ӧzBo5ΤAzS[J @V:s I[K?DԆ9B6,$H@R!*_fX+Oçrb !Sp&7g@R)X E)$b1'(&E!6z:9 3)$!: -4Ɋ2B(y ;!eVH͍M¢ g("N pTŠDX,9OP@B]re34EaH& $ qB } ij&)rY3yV2q8mkgA S z2qpb&T "q||,M%)'6 ()pBBiw#sM+x8U?E15X 0cσ" לRԂOjm' v֦͎w:s s8PgYJ"[:Vha [ T'zߺBIv onhI؁@ʏUP@bjjg\]lNig&SK/9gqQ"?G"RdIWk' vIXXJBi'ʒUV;XāZTda",->y2e[)K}91G}FTbE^#vb%( H}Ul),%%SvNXS $vj#Og'{ j1Y ͛ͬT{YGoe'2 @%"㹟sb7I*@` 'Yb~ˬgu>6gLt";GZlڔ 7*yזx|b-P?5O؂V ZČ"rӝ|P&7GGBNKZ7ڿnˋM}{ъ 3u,V MŢy7jQIIK^h~AiNADV|@aoE˒F#Neyf#$*(> ,X9ZxJBgb|*veBTNՂA?PhH0KbPmkj3&bvj(7}YF`]%`a9c(ABF9 eG,vP C򬺸k*+/;00y %33ـđ XZhxh3AkĔ`D!' RϪ$`%#w!$JL"% ^&aщNC,H|R189<&ݺNtfq/_VO P+'fסd5$>+>v{Í]v}o̐;tbE0i2`ַjALh[]%L>ߓI E~퇒N%dk·=5՗rC43rod.h{=PHwr%AN@ sS؟!>&Y1=w֯βPnAu}!cJf؁$@$pR;Yַ cY=:Qh]zz&<}[ 9?.zkLfd?f qW4! Ş=ݩÚH)cԤ9>Г8:>ْHN%s$TZ"hHd.ϒ?3 T |$A(^)•!Iwg9ȴ4p .Dxƥ>brHsԑ#ID­^8$εXpY<6Qp@8ǪcI\D:q%g9$ܓ |g̴UX$󄄋DM-kU$AtY`$g%ɗ'!В?shHOu1 D%|3GJC_H\-4.M ;Tȴ`;M4IОTA|W q'aE+Z(JӃt $.nԋݖxk߯H.9:_$zW}%п2sGR=бGμD)p5 @Z()֓'1Z/~Pta4DTDOQir6NM+ L"oM`%%wa9ȶn04, WV;wd$Dj/m))!ˠV$ހfm=_:0;f ~ "A2 Sk:a` ~R,cl$7x%>OϑNӾ1T2ErװoߺMl;WZ!`Vv:^hIhju9^uN0iZ+ZMgܼ '/b zo/H(\{U~\֕hI|f$ȒU p.I [1l"7ݲuZE>ɗi;#Q'` A&&Њ\(ΥUr׉# xW׉qIՉ Cbi)ppe8$0!+=jx]#Jd&] D(Ipa#1 ڐ(}SOG&Ns)$ QY; 0Bn[~uE_-FdIJ' V?':8K9i _ByZg EH OִVaE%4we!P!ڧOڑPxth,`z,mv:&! MO,_Z;:|&˳t!txZtF笐5$c\dj=b%\7KH 3OG$t$ZR3M+lҖ(vU&e֬ƒwIސJ[jYB"$2O>`X$?7=Fua*XO"|zBJy*k^gf),%Af$ğT$!7$$~]zr4L ܸ>E5(t|e>PY7$Nt$Nd"?vu|A_%Kttw$NF-z|Z,#THe $~?_ > :fI@ AI̬&i H6KVֻf`AW&NfIc@1p[Y7$u$ TSO`WϡXaVYV; I܃ItbP[zA %XIJzx.kk V&Aei+X-UZ>i?$|xF- C* E.ʫۂ0DG[I $vt$QTF#E!LB>FL+牄"$Nc~ϥ}@@TAcZA]~=N|.Wz8q4uO$Cg/ S;!NKщg'x,e~IN0_q{.JU_6^ oH$Gdl_q0 N(tNK&%KDJ&D"IؿOI^|Fm;qD Dov#J (JzK:d$p[g:'xrCb)' BUIL:o't@hůђ !tʖv9bz{"&:b&/-:*tNh%8F C!tXѓ::$a/p@"B5$ #(6xRJ=%NTӼW`.bxnvc< TT&qԻ2ߙ/$IbsyE'eMHJDNhQک~5N TX`1rd~i_1r`;BD6BӄёDB00JI _TX0"Pϰ9rBw_w4at7 !d9p8'qQj_l-"Ql;wH%u!nvN)XNRY6 :! RP̓8t)СQl`Ѻ0:Q%NEU9p-DPCY]TQ,JHyJbH⚁yH LLuDwE;v0(j&aRA2/ 7$-EcS8I ( !eKޅQI% xNX(tP$ N, ]_C*x,: ƹNnplD AšNohnxjՉ!c8J^w>aOVQnGOLrL( Ht Iʿ;vE qﳺH6<'1"}&==;HīOPT3^3OLWzdz8LBG'Hb#DcلD}ΎOx-};lI8?QNMlĪvJw^;FB65(=w3Sp/7$,8ƘL-)oLbːh`v1eWe8'h<'lLQκ4Sp$((1(ВLQGР 50~BKcLaa.vrucNIwHV!NZ}{D}‰{͉<pxjl0$Bh^sG,6F!OTv9zH(?>t:Q㒨}T{ R~nP!?QֽE'*L?6 'ʒtOl#:׹'<2Uwҏ% ''9͓ek8!INXp0~{וJܡpH"fbWOJcw ,'P :}8$b2Q ù[RrD&aSRf y UN\4DH(QJ 2xvf%bLfwlT:U\%L`\%`ئ@ݞ:LD}RL!d{USdA0qp;HO_VIQ_$ک߷$aIjԉt;[;Ґ T; {w-k'JSX0eX $21#:'}JU1:LF.#+}DHHܵ&B$I|\7 l06.j|'S]7;H7J|' Sl}IՓpi5zId^i7'a9}V7ĩ=l%7'E+$|VOub~$֟PGukߛƱٓ4~"1VOhqvyk Ā .a󁘫m|o! /["Ғ"QV} T MpiXHɆ7pu8k O=ld7 O 彣H@OEhH-uHXit.Ojrݖ1ZecO YB6uI8~>[%}b8U$A0`Ip'e\4_sސD,N'Q I."'IpV9 N$}ן6,xifyvNlcsXB}vN|܎e=ݞ -[s휄lt,pxHJ7hv3NӨBFX+'q|>+NVs>(u[ 9 ?k':YԶrvNb7=hX <:ѺN7U鲂BWGC{Ɗ)EaM% c|Y0Plxu4d;PңN^mVZڼ:8 $4  A~Ӵa٫!I FTIJɗOBB `.`I&1b~$d@Lo'!8"Z&Az@W$j'{˓Pk1p0^LR&Q$&\#'$pDr$ (GIH ؑA2HM'Fp.v<HF"=p" &GI#!uj$ :M| $ .3Q_IަJx4ЙI ժ|l ʖ

    Ե(wE[.Iӊ⽾EH6i=BR-DYWI`"Wr %_Zq6iNHU2u˖Bb{\fipF!XEcZ'U] H09*ĻpD0D8_$pv >H넍D27og@rf{F۱CC '$^qNIp\ʓHG~R,$6LzQؒ~C”eqR&8WeMf{ʝLQj(ML&Dd񉖄wB1@Q|wM$t(Dť?$@0JaAB"> t_~yR~yP?ɺ~嗛Hի_å~UO0̿IENDB`logisim-2.7.1/doc/pt/html/guide/opts/toolbar.html0000644000175000017500000000411511541757140021636 0ustar vincentvincent A guia Barra de Tarefas (Toolbar)

    A guia Barra de Tarefas (Toolbar)

    Essa guia lhe permitirá configurar que ferramentas devem aparecer na a barra de ferramentas.

    No lado esquerdo fica um explorador, listando todas as ferramentas disponíveis, e do lado direito localiza-se o conteúdo atual da barra de ferramentas. ("---" Três traços indicam um separador , que é desenhada com uma linha cinza). Entre o explorador e a lista estão cinco botões e as opções:

    • Adicionar Ferramenta serve para acrescentar a ferramenta selecionada ao explorador à esquerda, ao seu final.

    • Adicionar Separador serve para adicionar um separador ao final da barra de ferramentas.

    • Mover Para Cima serve para mover o item selecionado da barra para cima/esquerda uma posição.

    • Mover Para Baixo serve para mover o item selecionado da barra de baixo/direita uma posição.

    • Remover serve para apagar o item selecionado da barra de ferramentas.

    • Localização serve para configurar a posição da barra de ferramentas na janela global. A barra de ferramentas pode ser colocada em qualquer uma das quatro bordas da janela, descritas como norte, sul, leste e oeste. Também pode ficar oculta, ou poderá ser colocada "abaixo do centro" - isto é, à esquerda da tela, mas à direita do painel do explorador e a tabela de atributos.

    Os atributos associados às ferramentas não serão exibidas nessa janela, em vez disso, você poderá visualizá-las e editá-las no âmbito da janela principal.

    Próximo: A guia Mouse.

    logisim-2.7.1/doc/pt/html/guide/opts/simulate.png0000644000175000017500000001742511541757140021647 0ustar vincentvincentPNG  IHDRDu2sRGBPLTE&4^P65516^VfX6([]+>4R*$643.1z75^46 FaI\3-HV74= V>f0Z[`yTRVcC3H>WyYXZ44t|[U|Tsnpm ;}-˞{1rd^:ƀ1~EDV΄zJAYίM]՛]f,㓴zsԠ|Wtvʯ|̪܋Ե׼ܾ{̃ѾЉ՜ΆۿϽԷޯ:8tRNS@fbKGDH pHYs  IDATx흋C ܭ` lוvr "BlY-˟͜sJ[ 0qޙ_fNC8wI}K=o!))|'V8KO']2[REllLeȋ/Ƅ l2(6bNL,/Lͽ=˸ן\+<{ 鹛gbeɤ2Y`I1ŘZ~6vIAW&&&ĥ{04r솳`V!ࠄY;(%ǔDA 9@HxQe1,5bfN9Kk]s+įL,:Z x?IwFl5!ka9*KPz(ʏv`%,^4ݓMQao֮SP%L\ak$ M3"HOMAlpH7£J5D4-vAlK6_adLB`QID%`I0 y:f9 XH[Eq"UWa $@$W|8w'6HP 1i qdPpp_J^((Ț"0mg Dg?xEjQE# T h|OӨhfe6etՏk*JFXQ΃@5٬(yET.ˏN t3 ayȆ씦eA%'`C=qz0Ih0d@ Do ,s-- %HjV,H~hI03 ڂ}'kPƭ_PՌɰj'(D(>g4REOFI9m"u‹? .DϊO- WuW,A~EͪGSlEX2$< '1|Pc'NAY'mU?sP[-g`ltNTkQKrVbQ KV|2_^k'$dJKiNm›SMc(ISCP)s" J| [Ѱ'ƅt-k^,N<"I]YyV>36z'pKk^Q8 8Wm$w &&rN[6f!)b |@WS9'1cB,*F1ro*pŃX{!O&} oBE\ʘ*dc <1ů=oӫ?Ƙ3496M}4+M(("LUp ( ouI|XT $&}^,ōg1AYV}Y7v$a(J,$Gn\ CauB@Kx<HdI(㍛O.][ob^ *m,. 2HO-D #}װa'yek<.J@Q&jm.o5=/lQZJżC C! ڑ9v !+Wq+#׋DuӴu \8HN".$0$Cj1V1\.#K+g3ALв˅fl?g+msuďKxjlQXƻƻr: F+1){ִc`qH$ $w$X$r|[oMu00eDW&n gz'OXldNB{g()mu6` c<Ӝze $`Ć$ :t)qӹuTkY `Ÿ\z :; tE쓑OscwLg~WN"!#:~$`>@&AۑW8@O]w2/$5%aDb`$DD@Gl$&)I}Nb"sHRqD~exZM<$p.#&wHPX*WT[$yJzB;$pՐPȗ61WM1,ǡys6< ?܅._odGH$ti]NeS>U ET`Jn㎢ed/%jAC3AWm]DXf$.,&A;}mݩA"7lٶ6YMWOH3]^SW< NYEv\'reW`z(IpI(LL& ?BRZG7l",FvvGt:Ǔ$jH[&l4uN.=ov! N6(>x٥b:lY5;G{12$ Whɷ iɋ ;jXnl^S6$=6s2p/Բěטb5Af(HFFFQF,wRI 7 MEE!ABS{:43mޚ$ I":]|Ռks; \E[VѼSIBS1nQÓڰ *JfD5b K*_ tKV$6xtH|._&* IW̒ d&17WMT~Hxo]YٝD98px:#1?@$@H+D0H,, x "AR~Hԑ A"HD"$D$ۧD:M$B"M$@H$M" $pHԏľ>M_"#F @$D"A$H$DHyE"A$HJ;'u{a_*LH#A3"QW/gD6xF$Kŋd!!DIw"$D"$ƈ 1+131"c DH "A$H !DH "A$HjAbHM0a2'aNbxl:$  v" D"6A$2O "A$DHDH; c&bة':NoG>R3Mb^&;UsxDH\Ry_I"P5 Ѭ4ziҼR,VLCV0Cp#_,HlDMHz|H0PC>6]U%q]-}6N8SJbN. vNcn2w%|(o>y1E+gۄ_{ jwaUZB"S3ETo3WP{m;Peػk`y;}ɫD}]Z֛`l$dUƏLxR*N|dEqmD^~u,gJ=$ՍdrU75z ۹hScGNXE"۞uiyjI6Ѳ[hK7Lfz(nZ7y9HhQM-57 $k;OZ [ 1'X{'qjzΰ1c8^B9,$fl$Xq4٪4SnZmI &}]\ԎĠAbHDl г5!=[$FM#෧Y*D 1H$HbHD9A" D$"D" DSPSlD$IDDID8( |qR 0N6*Wʎ2x‰&meG;H<8$7JH<$Dę%:$Y*aUs#Q^۵&|r}n# ,R֍DETI¿ @þo{eCI`Tz%$R-:RbրKVSEDw`qDQ{JI%|T49$?^);"x%;rFI𷧧 "A$H !'DH ;HH ;H$Fd!E hU$|rlY=^&mvx,H5Yqꨓw>2*J⧀D4Z ^> k]$0_7 NݭD%~fm$ԡPъz]YjYZ3"Y7b?uSĠNg~UF`1Ǹ <[A Pd`[Ed_]7Zb^ьx EtWL4K_}E J>jFA%I [`Lc(3:V(,h71]Q3Fo"l$>9" xqy* MqK$T6IW[/Z>$c'!GS#7`aDU$D@qyL_v}c ڽ׍/$!hAD3hE\"pK ɘN9HA<"ψc1c5ʻflnVlDn3O&- 1 mp*`yB}Z"tg=vPH܉$D~$( 8$xDB6A$HOy'"A$DoHh&DB$ ! q|k?!DHID DH "AB$ $DH9((D`HDDPl"J$A"J6A$2( DbL "A$DpHn䏙DH,VJj+{oo`٥3.iY5w:K%/k}o@rC̰.[U}kk۫"_^ޛ} ݌;"$U\|-Er?;^Q@Ei7&HhHb¬9E"!'s"يWگon^l˖UOw?G7c -ѸlW{5I0]ovBB"4#Bj&I6/6B.[oj+&uxYmrk18yEBSfg\a_aE 5j.INЊhKk`U]Q6$6Y|8hOnN c/_mG-GOf-@RcY&QN8]$z @ه5OHdP<+֤؁!AB$ $DlXNR5H,#"| X1D̒A|ꖨ%S_<(ON4ۢn%m8]2$f_$E[w\ъF<\ÿܹKGO⁷QDOĎj; rXT oܥ0O*@1"zPUM$qҥ~$K :6IENDB`logisim-2.7.1/doc/pt/html/guide/opts/simulate.html0000644000175000017500000000636411541757140022027 0ustar vincentvincent A guia Simulação (Simulation)

    A guia Simulação (Simulation)

    A guia de simulação permite configurar o algoritmo usado para simulação de circuitos. Esses parâmetros são aplicáveis a todos os circuitos que estejam simulados na mesma janela, mesmo que os circuitos estejam em outras bibliotecas carregadas pelo projeto.

    • As Iterações Até Oscilação serve para especificar por quanto tempo deverá simular um circuito antes de decidir que é oscilante. O número representa a quantidade de cliques no relógio interno oculto (um porta simples, leva apenas um clique). O valor padrão 1000 é suficiente para quase todos os fins, inclusive para os circuitos de grande porte. Mas você poderá aumentar o número de iterações, caso estiver trabalhando com um circuito onde o Logisim reporte oscilações falsas. É pouco provável que isso seja um problema na prática; uma dessas circunstâncias é a de um circuito que incorpora muitos latches que podem travar quando a opção ruído aleatório é habilitada. Você poderá querer diminuir o número de iterações, se estiver trabalhando com um circuito que é propenso a oscilar e estiver usando um processador extremamente lento.

    • A Saída da Porta Quando Indefinida serve para configurar como as portas lógicas internas se comportarão quando algumas entradas não estiverem ligadas ou forem flutuantes. Por padrão, o Logisim ignora tais entradas, permitindo uma porta trabalhar sobre menos entradas do que aquelas para as quais foi projetado. No entanto, na vida real, uma porta irá se comportar imprevisivelmente em tal situação, e por isso esse menu drop-down permitirá que se mudem as portas para tratar as entradas desconectadas como erros.

    • O Adicionar Ruído Aos Atrasos de Componente permitirá ativar ou desativar o ruído aleatório a ser adicionado aos atrasos de componentes. A simulação interna usa um relógio oculto para sua simulação, e para fornecer maior verossimilhança, cada componente (excluindo conexões e distribuidores) tem um atraso entre o momento em que recebe uma entrada e quando ele emitirá uma saída. Se esta opção for habilitada, o Logisim ocasionalmente (uma vez a cada 16 reações do componente) fará com que ele tenha um clique a mais que normal. Essa aleatoriedade é adicionada especificamente para se lidar com a trava circuito (conforme abaixo): sem o ruído aleatório, o circuito oscila, uma vez que as duas portas vão trabalhar em sintonia, mas com ruído aleatório acrescentado, um porta finalmente ultrapassará a outra.

      <

      Recomendo manter essa opção, já que esta técnica implica na introdução de erros raros em circuitos normais.

    Próximo: A guia Barra de Ferramentas (Toolbar).

    logisim-2.7.1/doc/pt/html/guide/opts/mouse.png0000644000175000017500000001775511541757140021162 0ustar vincentvincentPNG  IHDRDu2sRGBPLTElF]u8"51V5ci(Z9`a +>1}220R*$.1z= Fa<7/?oS\2-HV8 WPVcC;NB0MH&d\yYXEr~|npme#£~6ܐ8ɾ}1wke]FɏnuJ܌4WΘsЛ[f_,}iң\yɰLt։Rýb•g޵؍ڽ؏׹Լܪ܃ٌLs[tRNS@fbKGDH pHYs  IDATx CJ V ǂBVYV"\P-R,?}ϙѦmhL2|9$s2ɥK טW.Q6o&Ee` 3F f{nifg-W*E 42MJKN&+id~&X(NwPX3)F0xaDFi&Q,`˯Cu%ћ,k2 D"eP3KK؜PVLpCQT-fC(< e?'ڥkbT&k Z[ɬB+ŧ  AC*Xb>V$_&X[QH*PYvMW"f:!I<f)&BI!XIdZrǜЂVH S$4(B,(-:?;1!Shbj`J3F7~}Jk辐%LsIήP {%EsF*pxE4D-xSHhXTDvbDi92fӕ=$H!!3+0$ۚQتK}ii_z4y/`ƪ8-A9k~ݻ, (ukEҢ!g(n1Iʝ=2E鳕SO$D2$N(&*<-r޶_t>!J,PȔBI5t (IL$v< -Y[sٷs0;2Sl]>dD&cėUY! RvEO c@!H!ubX̓6҉i$1iZ$ .ؒ;ߡayw;~ d (4)q vl@S& yOӶ ,` ЖaUP1X@ JAIh8Db$RHh2~p}H";f?I,Bn? @ Hւe5[u\mƹdlj=A&RD|yH)j![%P)~bh ( :e!> h2H鹭tJ:P"!|A{V^lAL@ʬ_>Jxsz -zҹNI?_Ȫ)tu+TBDg/_T{)0//W?>2%]#~~)^I= jJdIP H ~( E봦o*1%YhH+a=J覇7Wr}5 w TJ:l%E0K``XAJAAy/DH ?HKNh$X:$ cPP%(zWSnas=^\ߋ$`@%Ϧ)7AӠdž8UyO<64J'Sⱗw~`0ekk- IXWHNf|O4n!0mS)M/,tL.0|W\|9WJg?|祿^[qq=O@?Vu50yD2vƾӶZFϸao+PtNqO4Gſ%sb<+E{S??BfUE(00UY(6:U`[R*VuMIT#o! !"ummQ8D%wqm"qxCAoĩwΘ?mށ)E=F(F*9Tu$ T \Fh+kC7uhvΞ&QH<>4$qrY'&Q`mR)`:TI=DKI=\D qhzk]Z s]PB٦HR˖8WBIpRҠr}U%už~첔B%p!ؓ1N^:8soA?= _oD_V3H)tNQ}x|0*|QH58 ֯Ϫ!8uW`$vM?6qO奓ôO>|}0iy9u+&AW_TsH+!AvI?AIv\;l$0?[w1ѷND1쩉@0c46 IߺY?H}> QBKAXRX~5EfDwFInoNdBෞ$ԙdBV$跢4O4IˏuOn{pBIUza 1qgAOO#rԒגD:qWKoDNJ'[Dbf=+v9y7:Vz!~&<DDK$ =(&BNrc3%Zi%~_^%IOI 83Xl?x"#_I%AwFt'N'aΉ#Em'FBRD',&mo[=a$':1OFkHcRѐ(0hHGċ2) ,$^8TZDYŋ}TyBa_$Xª\t"w8   :8^'{tB$Dt SɪсΊNݼ[8hbÌqcI`ƣnyqfTU` ɧGcBnsH]q`s$ߵ͏3}ՌΪh_L?ϫ 1J"g/ :,'q6N~:֣}8n!ywLHt&9߅ДAI38}1ݖEp3R9YQ'.&h}dйOH xLV'2$yY/dz2=Ƨ@6Q9'1Bc} {b R:B6(lKM"O27L6ؓ+WQ/%Bk_pMt:틓YHXL,Ӕ+.W9%n0%O%,-K@%_5'MQ$6Z'Ks1l $4SFDk4RrZhxkv1B"uАX+#A'HP]_*'橿 |MOFiRA<,SQiX*9 Ű9atER:w@*8%"1㋐b(MmD"S>4h_ϔԜxqDzdA~=R:+r HHf/HlT9O I9˗2Wm~v7& | gX5juNP/^4A̮PI4 +/qD`b A\ĹH(gu;L٬|_-I[ $>M /ymF$@[IG>\`$*&H-kf1: Ilg$$qJI(vtǏoF$D 8[>$FœN(IstΝIvr_䛿˘NTEhI8'Vh_(l_Ȭʵ-C"H$?~'`*I[)d1ropE Νz{'ZD'ALIoy$Q#1X0E,w[ G'k@bhݧ c פ&q qΓAI 'O% $jj{Wh\&q qJHWMI"HH:oHl $>3!AӏmB<1v@*(,Z ^|Da$%K=HG'~No1uՉ[n1u j[FDMCΝ?C{vE3L0U 3#%X%mosL_8ϧl@|tOue>㶷t20 @'q GBۚ>ubI$> 5X.^4 l=9-O |JBMSEH̾6 ?qKCZH4'~o2C]25{X:Mb|Hڶ :K{i*"1;ڤN6u<9j*+Ĭy?ac`I|吰:Y~B.@V&ȗjᱍI(ZۤN?I u!N?H$b:arH#Q9@" $>P&! ;b +ItH1##Ra-O"DH$nHhTlDAPF$C*97DŽ2֒C)O"DŽ2f7#|>L(HXJ"N߄jH|dBPF{$ !hMjHXIB}=a FB!A_C* C*̑hfu™BCKE:DH:DhD ((`, Fy<ٓ F* QT3vO~ˣH2;e'$-å!>['HY I*O$ ?1o Fl|xla>)OGe$"fp;{TԶV$N脣\[jnY=*PA-@" VC""ĴNPƪ'Q~;H86>1h|= VJ^]$v">1M_"/</&!{A=> -OKބ+&$w&-5*Zpy_PO;rȶcJڼ D/mb GWK=Ց_P/{fZ07~rD{($ oOP]菑c[yow҉zi$,Տ56qn^lGU)Z[Id|Kas=ԳU5H3~Bx'Bg>LH3~Bf2~v%VuuI$4$JPx3 >KlHL(),>aN` '` {@bN4X| TM9>aLvj%"[OX_os|œ01~ȶgOX`lOD$̌}YOOX> ' ğhQ7z,EsFOxObj໲DJ !l]V';$ĔD9_钝fT_W73fIL)HO0$!*0#Q3495}e :H|+%/%Vz즌ODIi\:DH$j Ս'8O[D';IpOxZ'DayKATN%ag|B"A|ܣO5(OHH':ExvјE$lOI+IĀ;^n,* ag|BNba@-\9c/>QD o& KΦj"gbYr!>]8fAY- $4'LK>9V#hkl}&fb8o0ݿH1~B$tU3$lđ,,!j"ɌDe'a uUw^']OTجZf{Y1V'H4B|uY G'ZY'hepV|)RjZ'ʊOXo'V})e0W/#az~k.v㣆 H?Az7!Bc~BApRD$'C& .YܒǢfiJ1H?!Ev[IO.Дb$L(=~˜n^aISbPP;)cI|ڨO(~l u,_({1խכy-@v{W{տG`r놯 kH8MEmD-H|F aMM6w$Oً.=@@uUFF$d 7'7ߟGr[~ӜlmIx 'P-_ '4炑A'"GEj' :O{$SnZ0ȁs V*ɓȞQDNxH•#H0#$NO.*w|h8vp0#H0#H1Ee)jDͦ#H0#H0#H0Dsg$ FBIbp qF`$$ F`$ F`$ F`$"e$BH0p /#H03I0#H0?H0#H0#H0#H0#QSS$ы21j$Cw-yi]*H8O˵")Gȵa$ #H03RZCERYlL]L!:$Y'ѐ`6NH0L F #Ѳ$f&!36L HD : =;ezYg]TOu$<֓pJ'baž=*0MFс@*HD˨xYHxjJ"q~ݞ@.Ǡ I,W(o{_o/u$Qh_&< BFd$AJlwAI=PS5 % y|=_p{Hx&=*Pu/:7GN/D;í|S$Ά*`=q'`ʹ<>:qTH,dBviă (H,dcJ}%ivE1,o ^C}?I8S\=9{6(å,%Z ۙI,"K˄Qq2\2\"XroQ\NiQX'X. f֣t/9#ER{<Lv}kQ|wGG?@~=U_y hθ]t>*#$N( aŎe1MI `.'[B ۽H?zu[D/]P$֑H(Ǯbpȓ󘑂ɻԳWX SE2'{}H(҃.eC>":JV]N-zRh~2A˦=GCXa֐H;MOip 9%XO:D;}rG!B& Pǔz= /:>!oH5h_D)C$#Qj<FHMOزGR=N#I;S<-٥mǢ^qH|cl#+@ԆFI#`$'q`Rq $v|dDPo:q8i_*@bm> RUxkbj6YC{$Br&PWbkH(PpvҵyڐQ 2?ĥk7x]>y-OS>ۧA]s7 &k1\#TmIENDB`logisim-2.7.1/doc/pt/html/guide/opts/mouse.html0000644000175000017500000000523411541757140021327 0ustar vincentvincent A guia Mouse

    A guia Mouse

    Por padrão, quando você clicar com o mouse na área de desenho do Logisim, a ferramenta selecionada no momento será utilizada. Se você clicar com o botão direito ou control-click, ele irá exibir um menu pop-up para o componente sob o mouse.

    O Logisim lhe permite modificar esse comportamento, aliviando-lhe a necessidade de ir à barra de ferramentas e/ou ao explorador o tempo todo. (Isto também poderá ser útil se você for canhoto). Cada combinação de um botão do mouse e uma tecla modificadora (qualquer subconjunto de setas para deslocamento, control e alt) poderá ser mapeado para uma ferramenta diferente. A guia do mouse lhe permitirá configurar esses mapeamentos.

    • No lado esquerdo está um explorador, onde você poderá escolher a ferramenta que desejar mapear.

    • No lado superior direito está um retângulo no qual você pode clicar usando a combinação do mouse. Por exemplo, se você pretende criar novas conexões, arrastando-as, em seguida, você deverá primeiro selecionar a ferramenta Conexões (Wiring) no explorador (na biblioteca Base) e então fazer shift-click onde estiver "Clicar usando uma combinação para mapear a ferramenta para conexão". Se essa combinação já estiver sendo usada, o mapeamento logo em seguida será substituído pela nova ferramenta.

    • Abaixo desta área está uma lista dos mapeamentos correntes. Note-se que todas as combinações que não estiverem listadas simplesmente usarão a ferramenta selecionada.

    • Mais abaixo está o botão Remover, por meio do qual você poderá excluir o mapeamento que estiver atualmente selecionado na tabela acima dele. No futuro, então, que essa combinação de mouse seria mapeada para qualquer ferramenta que estiver selecionada na barra de ferramentas ou no painel de explorador.

    • Por último está uma lista de atributos para a ferramenta selecionada no momento na lista de mapeamentos. Cada ferramenta de mapeamento de mouse tem seu próprio conjunto de atributos, diferentes daqueles utilizados no painel do explorador e na barra de ferramentas. Você poderá editar os valores de atributo ali.

    Próximo: Guia do usuário.

    logisim-2.7.1/doc/pt/html/guide/opts/latch.png0000644000175000017500000000135711541757140021114 0ustar vincentvincentPNG  IHDRo}FPLTEP(()p pHYs*b@IDATx[z FdnB\d3b2_G ? aMd<#^z-ZbTvbe:bVR1Q+uYY}WQM;QS2.-j_ @X@tk3rNT==|kl<.~8Y [b&ڜXzqd{TZ+jCmp5,_J\  SBaR%Z R;$!_E f^93uƄUuj׍?*ΨR$Mb,LQEKpٷ/9s=>tbjTYw9JaؿCT1:>Lޜvz&uR=mh:FTIz Opções de projeto

    Opções de projeto

    O Logisim oferece dois tipos de opções de configuração: preferências de aplicação e opções projeto . As preferências do aplicativo abrangem todos os projetos abertos, enquanto as opções de projeto são específicas para que um projeto apenas. Esta seção discutirá as opções de projeto; preferências da aplicação serão descritas em outra seção.

    Você poderá visualizar e editar as opções de projeto através de "Opções ... no menu de projeto. A janela Opções tem quatro guias.

    Apresentaremos cada uma dessas guias separadamente.

    A guia Simulação
    A guia Barra de Ferramentas
    O guia Mouse

    Na parte inferior da janela está o botão para restaurar ao modelo do gabarito. Quando clicado, todas as opções e alterações nos atributos de ferramenta voltarão às definições do gabarito atual (tal como selecionado no âmbito das preferências da aplicação ).

    Próximo: A aba Simulação.

    logisim-2.7.1/doc/pt/html/guide/opts/canvas.png0000644000175000017500000002020011541757140021260 0ustar vincentvincentPNG  IHDRDu2sRGBPLTEo4_P6551V7_fX6(\^+>1{R*$:55375^82y25 Fae;-HV;~74W>g0[\`RVcC3WyYXQIMdc^`|]5Jsnpm 3}.019wkǂ1e~2]FJWѓ[u^fl,sؕzԠ|Xt훴ötɮ|̪܋Ե׼ܾ{˂Ѿ͆՜ھΆϰ⡸Էڪ˨ tRNS@fbKGDH pHYs  |IDATx흍CH" xi=J.Kk Of&ɤMJK64L{M_ΝBX9ۿHJБLU<=*W qWN|I7fe,G^xEQd+ccBKwK;s;忮^(+PL T,ƤQDb(LXHAĕ{5qt96Y0bxXB1쌢Yy`LynuMO+URbxM0B% J3hI"v @"A®pl1-H̿$1?k0/ "D`fa.桪GB" >}*1hU$1Eb6Kej\=MK9v CBa9EBX KKVa )?_IhKms`R(V~"TK & f"ȱ*V,$ vA M_H'܁JM!p?:'Z]FFV^{HQOX7G0Q c)m+ g]&d""PUt%0+dH@~.?$$"lo$Ħ$C:@$fF/* X66Ӳ8aN $.,b_gCwk_(p n%yE6+#$aE$5>umA0{ȇv/wH$acʈHBYM" DĐHRf;I"k '1k0+dk1P&ƳHBUgW*QDf˭T4@F0Ԫ|P{Ϻ?I$v )FPQ.@ fDXz\(~z/sa& mP ;΀)fV $@0҃]o:{')$  Fy`;laֺԬiYOZ$~?\X?@$ (mv!9[gf}Pu1}e^ @!H1) 7 N"fHU q( Nb 2Y$܁;bi_HY]6;>Ig#B3{ӜE_wBo'yEGn ϸM<dj}` ,p F*m" V!+2i. \SHB7f3R$6wIX8Eb'J 3K$"¸ċVJ"*и!PzҹB\OȀI|ym&#d-yF$ӿn#h&4'f)iы{dx; QĈm:HŘX9( YL'ofN!RN{wao_M&φf@tb#6E ur&w9aPfvYG8^Xv #_W\ܼ-EK79"&! b:U]-O"V˄ĭde]u]R[^9|]ij"! KC`|%45UP"\UxOJ_7o9@a\[߇$4lI:Jdu>K1؟6P$7H#i;4Ar!rtl¯6A* $EQFRªl2(Mi! CXMQmlOBiuݫ(?˭L'&&q,`!zy C)#| y2l7}#6ц'WOT[ijGONo=.Yl>*0fN,0?ND#A$AnÙWV[+|AյG;A΋a;vm"%}hП3WșrV%|hfl;gkmN,ru,ṱaUN}>g/|Aaᛞf <㼃o Le$X$r'Hl>Ngi>zs͸=ii`v"I` xf H_e<?$6EI)o kr\1 ~2bCw94~R^)|Ğ\pǸz):; tEf%٧wd;`$O~N"!G4_L1$H|ɆKy) PmI|h=??"Q1 8$ĿI#6S=%iILo$"x^="_^%x^U lJfiFB)$N^1 g$nJaZP 0]k J4松u5 LKtȳJdhjwm[GYƏӾlߝt6qGHo[K(+ofPTls(Msom-Yl~m$ѭ$Ju(ʨIV:_$24YPwXQlQ$*9 |e;ϱfs lwZI b ?5oh}=vmxϨ+$XhvcMBl)zǹ{Fkl&-&wBq º ̈&şe' ;6EpGxm⏓ ϲM %wkiIx  ̸H`J"KKH&_ )E3@DO$ `$$DH`R"+ٵD$t"A$HHH >AH4wDq$ )& "qIDH A# s8Aw;y4h4  H&^ ?x񂼓_Hw N#Ą,FpY'Dzo a$0T.lAyIH|fIDq$xfHļ'f-Ώ=[09&;g,;emQ=1݃ۻgD D&i$8fY%;w6J" a&$}6 |LdKw~X~FI'$Y 2M𥍄YᛀTsq"Q5`u%Ѿ$ :oPO]_ -IpFB>Յ{Յ_^.E$NFIH5OH}'H$^, DHH$ !DH ID=$Aw; J$Vxt$,wX HD >c)bQW 㳐F-D"0}>DHdg" ǡq~n< ИFx-.!;"HD&&)E T5F@cMxiwf{G;8v4VHh>&!fC}IXhw2 ;h61&`{'y f-`Qi$^'ݛ=s;p,*Ѵ4-V&らw$2:ͲGGmrIyH;UEb3DR%1";D$ƈ?H "A$I 4h0a"&nGu;nMm.$6Q,}G<ݳ&wdFA&*e~l#QGb 1ZY6&8zcco~iFyo$`S&ʟe\eo.a32gS@7^%V[c?|)yS ӟ$*e'Yyrrg $Z2|))]"~19LlZf>_Jauk@\6eHSϢ6QI.6b O$0oJ";0N$l$eS.[zlG$输OH "AB$ 8$&6A$J4"QDQu$DH ;p8K}URwO`_kRnI齮$4MS}TO" Y#;S"9 Q'#)hKb͗$"wJXjÜ OmKçC8n&`mkLBπ\p< UDC%HD"1ATK+bT杊H'_wQzX4_D66#vwbO\H'pԁN#\kd +ঽTK"w'"QM 7wjerW(;A$J8-S"N$$NK'NQ̎HI.7N~`ϢN o;?۶};㗖"Xje`xo6&\BթT6}Ok‡WmD͏'v5 -f'qi@02Qo쳮szb8!nf^ اߙ>buo򗗛NL ŲX6!> BbTW]uCB[5+ ‚NƏwyͷMrCZ m#t|&Q`ľ5N oyٓ wSTۻj\֫ؔmG۽X>ucwzfs=K۫ X60aư|\\ RRZ񃥌H\Bb 1wiq jfcK$R,kwX\O!w~"ז5,jnlsAt35yֿ3DaTMdVZ};:hغz~ǰ9*NH`^3m ;C T^X_1;iűg8k71XD0)űD]H88vuA;$NQHkF c7?SǖH)zH8#$cujK̃'$XZH#H[z&}O VX j=b?Bm,BJ6KJ,>C|zGD.W8"f6ocް\r#}JH<~ԘFDprg(ьh6tn$_X)4X.E>-$xZ}kS K{cT4H1;X6yH"uY?3]8wߝ4NQmNűuI$xFB.Hȁzı$8xxڈ/7"~؏MkPv km5VcWIO|F|Qm '7 Z}7c,;~=_Xݐ坤wmM~mٽ}'>5; =ٰSǎQPǎ4鳀O#&S=mVAI3}B"B$Xz qH " x@$ $DH "AB$ hBD/$)RD$0h$DbH4DHDHD$AbBmH@> "$DH "AB$,!Dh¯$&ꕠu9#8~#1Ց6T3;~x4T3:"DF$\rbh_JrҖn{JHu|f^mhREH@TIiKb;iVS$aMxuYc$Re4]H$lj ݏ;aBSZy1='1V3xW@3O;SHpK&ɛ,CoY3!T0pY;7%FǤXn;x wkJbv$] F~0%|Ӷ6Pw55`ifpW-?Չ6CBX(Opswuඕ˲-EטĘG$$|FA!n++.eA8ލcGy LfL+)++VqP4sY\qG9kfE$x&W(gDB.9q6v3G-՟~{.rF$ZI0]oB`Ҍ5Q3򦝄^BFeȨ-pлaX{c|&qmdm3+W3kL³qDF=?W: 6k_$х$ăLy& E_ fܥ]`kwL5Il$1`DaN ȊkݲHx,ޓlĮyJ QNСY&QN1"\$*LCu9#8~#1QTHVer8oH "AB$ 8$B7H#y*ZZ-!K(b_!~:| 05f0R $b0>ː g[IGO%*`by$B/eǢ=T"ԝPixö.Ȣ&$~8wt I<Q߬R/~ܘIӃJPw EӋ_~$]z &+?4N0J+.YIENDB`logisim-2.7.1/doc/pt/html/guide/opts/canvas.html0000644000175000017500000000743511541757140021457 0ustar vincentvincent A guia Área de Desenho (Canvas)

    A guia Área de Desenho (Canvas)

    Essa guia permitirá a configuração da aparência da área de desenho do circuito.

    Há oito opções.

    • A opção Prévia da impressão quando selecionada serve para especificar se o circuito deverá ser mostrado na tela da mesma forma como será impresso. Normalmente estará desligado, e o Logisim exibe instruções na tela com indicações do estado atual do circuito atual, e apresenta algumas dicas sobre a interface do componente (mais particularmente, indicações onde na porta OR poderiam haver conexões). A prévia da impressão, no entanto, omitirá essas indicações de estado, e também se omitirão tais referências da interface.

    • A opção Mostrar grade (Show Grid) quando selecionada serve para especificar se é para desenhar os pontos (marcas) no fundo, indicando o tamanho da grade.

    • A opção Mostrar halo (Show Attribute Halo) quando selecionada serve para especificar se é para desenhar a forma oval pálido em azul-petróleo em torno do componente ou da ferramenta cujos atributos estão sendo exibidos atualmente na tabela de atributos.

    • A opção Mostrar dicas de componentes (Show Component Tips) quando selecionada serve para especificar se é para apresentar as "dicas de ferramentas" que irão aparecer temporariamente enquanto o mouse passar sobre os componentes. Por exemplo, se você passar o mouse sobre o pino de um componente de subcircuito, ele irá mostrar o rótulo do pino correspondente - ou ele irá mostrar o nome do subcircuito se não tiver rótulo. Ao passar sobre uma das extremidades de um distribuidor ele irá dizer-lhe a que bits corresponde. Além disso, todos os componentes das bibliotecas MUXes e DEMUXes, Aritmética e Memória fornecerão informações sobre suas entradas e saídas.

    • A opção Manter conexões ao mover (Keep Connections When Moving) quando selecionada serve para indicar se deverão ser acrescentados novos cabos quando os componentes forem movidos para preservar suas conexões. Por padrão estará ligada - embora possa ser desativada temporariamente pressionando a tecla shift enquanto move os componentes. Se esta opção estiver desmarcada, então o padrão será de não adicionar os cabos durante uma movimentação. Mas você poderá ligá-lo temporariamente, pressionando a tecla shift durante a movimentação.

    • O menu Fator para Zoom (Zoom Factor) lhe permitirá "explodir" ou "implodir" a imagem proporcionalmente. A expansão (zoom) de um circuito pode ser útil para demonstrações em sala de aula, onde a resolução de tela for muito pequena para visualizar de longe; já a contração poderá ser útil para orientar-se em um circuito muito grande.

    • O menu Primeira base quando conexão ativada (First Radix When Wire Poked) serve para configurar como os valores serão exibidos quando uma conexão for clicada usando a ferramenta Testar (Poke). Ao clicar, temporariamente o valor será mostrado até que o usuário clique em outras partes do circuito.

    • O menu Segunda base quando conexão ativada (Second Radix When Wire Poked) serve para configurar a segunda parte da exibição do valor.

    Próximo: A guia Simulação (Simulation).

    logisim-2.7.1/doc/pt/html/guide/menu/0000755000175000017500000000000011541757140017264 5ustar vincentvincentlogisim-2.7.1/doc/pt/html/guide/menu/winhelp.html0000644000175000017500000000341311541757140021621 0ustar vincentvincent Menus Janela (Window) e Ajuda (Help)

    Menu Janela (Window)

    Minimizar (Minimize)

    Minimizar a janela atual.

    Maximizar (Maximize) ( Zoom no MacOS)

    Redimensionar a janela atual para tamanho de sua preferência.

    Análise Combinacional

    Mostrar a janela Análise Combinacional corrente, sem alterar qualquer conteúdo.

    Títulos de janela individual

    Trazer a janela respectiva para o foco.

    O menu Ajuda

    Tutorial

    Abrir o sistema de ajuda na seção " Beginner's Tutorial " do Guia para ser um usuário do Logisim .

    Guia do usuário

    Abrir o sistema de ajuda no Guia para ser um usuário do Logisim .

    Biblioteca de Referência

    Abrir o sistema de ajuda na Biblioteca de Referência .

    Sobre ...

    Exibir uma janela contendo o número da versão, bem como a tela de apresentação.
    (Em MacOS, esse item ficará no menu do Logisim.)

    Próximo: Guia do usuário.

    logisim-2.7.1/doc/pt/html/guide/menu/simulate.html0000644000175000017500000000724611541757140022006 0ustar vincentvincent O menu Simular (Simulate)

    O menu Simular (Simulate)

    Simulação ativada

    Se marcada, os circuitos serão vistos "ao vivo". Isso é, os valores de propagação através do circuito serão atualizado a cada teste ou alteração no circuito.

    A opção será automaticamente desmarcada se oscilação no circuito for detectada.

    Reiniciar simulação (Reset Simulation)

    Limpar tudo sobre o estado atual do circuito, de modo que será como se você tivesse acabado de abrir o arquivo novamente. Se você estiver vendo o estado de um subcircuito, a hierarquia inteira será eliminada.

    Simulação passo-a-passo (Step Simulation)

    Avançar a simulação um passo à frente. Por exemplo, um sinal pode acabar entrando em uma porta durante uma etapa, mas a porta não irá mostrar um sinal diferente até o próximo passo da simulação. Para ajudar a identificar quais pontos mudaram no circuito em geral, todos os pontos cujos valores forem modificados serão indicados por um círculo azul; se um subcircuito contiver todos os seus pontos alterados (ou em seus subcircuitos, recursivamente), então ele será desenhado com um contorno azul.

    Ir para estado (Go Out To State)

    Quando você desviar para um estado de um subcircuito , através do menu pop-up, a opção Ir para estado listará os circuitos acima daquele em foco. Se selecionar um deles, o circuito correspondente será mostrado.

    Seguir a partir do Estado (Go In To State)

    Se você já entrou em um estado de subcircuito e depois desviou-se para fora, esse submenu listará os subcircuitos subjacentes aos atuais. Se selecionar um deles, o circuito correspondente será mostrado.

    Pulso unitário (Tick Once)

    Executar um passo na simulação. Isso pode ser útil quando você acionar o clock manualmente, em especial quando ele estiver em circuito diferente daquele que estiver sendo visto.

    Pulsos ativados (Ticks Enabled)

    Iniciar automaticamente alternâncias do clock. Isso terá efeito somente se o circuito contiver dispositivos do tipo clock (na biblioteca Base). A opção é desabilitada por padrão.

    Frequência de pulso (Tick Frequency)

    Selecionar com que frequência ocorreráo as alternâncias do clock. Por exemplo, 8 Hz significa que as variações ocorrerão oito vezes por segundo. Um pulso (tick) é a unidade básica de medida para a velocidade do clock.

    Notar que a velocidade do clock será menor do que a dos ciclos: a variação mais rápida do clock deverá passar por um ciclo em nível alto e outro em nível baixo; esse clock teria um período de 4 Hz enquanto a alternância de ciclos ocorrer ocorrem em 8 Hz.

    Registro ...

    Entrar no módulo Registro, o que facilitará o anotar e guardar valores automaticamente em um circuito a medida em que a simulação avançar.

    Próximo: Menus Janela e Ajuda.

    logisim-2.7.1/doc/pt/html/guide/menu/project.html0000644000175000017500000001513511541757140021625 0ustar vincentvincent O menu Projeto (Project)

    O menu Projeto (Project)

    Adicionar Circuito ... (Add Circuit ...)

    Adicionar um novo circuito para o projeto atual. Logisim irá requerer o nome do novo circuito. O nome não deverá coincidir com o de outros circuitos existentes no projeto.

    Carregar Biblioteca (Load Library)

    href="../attrlib/explore.html"> Carregar uma biblioteca para o projeto. Você poderá carregar três tipos de bibliotecas, como explicado em outras partes do Guia do Usuário.

    Decarregar Bibliotecas ... (Unload Libraries ...)

    Descarregar bibliotecas atualmente no projeto. O Logisim não permitirá que você descarregue bibliotecas em uso, incluindo aquelas cujos componentes que aparecerem em quaisquer circuitos do projeto, bem como aquelas com itens que aparecerem na barra de ferramentas ou que estiverem mapeados para o mouse.

    Mover Circuito Para Cima (Move Circuit Up)

    Mover o circuito exibido atualmente uma posição para cima na lista de circuitos do projeto, como mostrado no painel do Explorer.

    Mover Circuito Para Baixo (Move Circuit Down)

    Mover o circuito exibido atualmente uma posição para baixo na lista de circuitos do projeto, como mostrado no painel do Explorer.

    Definir Como Circuito Principal (Set As Main Circuit)

    Definir o circuito a ser exibido no momento como circuito principal do projeto. (Esse item de menu ficará cinza se o circuito atual for o principal.) Isso significa que ele será o circuito a aparecer primeiro quando o arquivo do projeto for aberto.

    Restaurar Forma Padrão (Revert To Default Appearance)

    Se a forma (aparência) do circuito tiver sido editada, esse item de menu irá restaurar a forma padrão para o retângulo com entalhe. O item de menu será ativado somente quando houver edição da forma (aparência) do circuito.

    Ver Ferramentas

    Alterar o painel do explorador para exibir uma lista dos circuitos do projeto e as bibliotecas que tiverem sido carregadas.

    Ver Simulação

    Alterar o painel do explorador para exibir a hierarquia dos subcircuitos na simulação corrente.

    Editar Layout do Circuito (Edit Circuit Layout)

    Permitir editar o layout dos componentes que determinam como o circuito trabalha. Isso é o que o programa faz ao iniciar-se, e como você provavelmente irá editar layouts de circuitos na maioria das vezes usando o próprio Logisim, esse item de menu normalmente estará desativado.

    Editar Forma do Circuito (Edit Circuit Appearance)

    Permitir editar o circuito que estiver representado quando ele é usado como um subcircuito dentro de outro. Por padrão, o circuito será representado por um retângulo com um entalhe cinza em sua face norte, mas essa opção de menu lhe permitirá desenhar uma forma (aparência) diferente para o subcircuito.

    Remover Circuito (Remove Circuit)

    Remover o circuito do projeto em exibição. O Logisim irá impedir a remoção de circuitos estejam em uso como subcircuitos, bem como impedí-lo de retirar o último circuito de um projeto.

    Analisar Circuito (Analyze Circuit)

    Computar a tabela-verdade e expressões lógicas correspondentes ao circuito, exibindo-as na janela Análise Combinatória. O processo de análise só será válido para circuitos combinacionais. Uma descrição completa do processo de análise é descrita na seção Análise Combinatória.

    Obter Estatísticas Do Circuito (Get Circuit Statistics)

    Mostrar janela contendo as estatísticas sobre os componentes utilizados pelo circuito atual. O diálogo terá uma tabela com cinco colunas:

    • Componente: O nome do componente
    • Biblioteca: O nome da biblioteca de origem do componente
    • Simples: O número de vezes que o componente aparecer diretamente no circuito visto
    • .
    • Exclusivas: O número de vezes que o componente aparecer na hierarquia do circuito, ononde cada subcircuito dentro da hierarquia será contabilizado apenas uma vez.
    • Recursivas: O número de vezes que o componente aparecer na hierarquia do circuito, ononde cada subcircuito será contado quantas vezes aparecer na hierarquia.

    A distinção entre exclusivas e recursivas é mais fácil de se explicar considerando o multiplexador 4:1 construído com três multiplexadores 2:1 como na seção Usando subcircuitos . O multiplexador 2:1 contém duas portas AND (e o circuito 4:1, nenhuma), sendo que a contagem exclusiva de portas AND seria 2, mas se você fosse construir o multiplexador 4:1 utilizando esse diagrama, você realmente precisaria de 2 portas AND para cada um dos três multiplexadores 2:1, assim a contagem recursiva seria 6.

    Se você usar circuitos de uma biblioteca Logisim, os componentes serão considerado caixas pretas : o conteúdo dos circuitos da biblioteca não serão usados na contagem original e recursiva.

    Mostrar Barra De Projeto (Show Project Toolbar)

    Quando selecionado, esse item de menu mostrará uma pequena barra de ferramentas acima do painel Explorer, permitindo que o usuário tenha fácil acesso aos itens adicionar, renomear, reordenar e remover circuitos em um projeto. A barra de ferramentas também oferecerá suporte a alternância entre a edição de layout e a aparência do circuito.

    Opções ... (Options ...)

    Abrir a janela Opções de Projeto.

    Próximo: O menu Simular (Simulate).

    logisim-2.7.1/doc/pt/html/guide/menu/index.html0000644000175000017500000000203611541757140021262 0ustar vincentvincent Menu Referência (Reference)

    Menu Referência (Reference)

    Esta seção explica os seis menus que acompanham a janela principal do Logisim.

    O menu Arquivo
    O menu Editar
    O menu Projeto
    O menu Simular
    Os menus Janela e Ajuda
    Muitos itens do menu se referem especificamente ao projeto em foco. Mas algumas janelas do Logisim (particularmente Análise Combinacional e Preferências da Aplicação ) não estão associadas aos projetos. Para essas janelas, os itens de menu específicos de projeto estarão desativados.

    Próximo: O menu Arquivo (File).

    logisim-2.7.1/doc/pt/html/guide/menu/file.html0000644000175000017500000001144111541757140021072 0ustar vincentvincent O menu Arquivo (File)

    O menu Arquivo (File)

    Novo

    Abrir um novo projeto em uma nova janela. O projeto irá inicialmente ser uma cópia do gabarito atualmente selecionado.

    Abrir ...

    Abrir um arquivo existente como um projeto em uma nova janela.

    Fechar

    Fechar todas as janelas associadas atualmente com o projeto em foco.

    Salvar

    Salvar o projeto atualmente em foco, substituindo o que estiver anteriormente no arquivo.

    Salvar como ...

    Salvar o projeto atualmente em foco, solicitando que o usuário salve em um arquivo diferente do anterior.

    Exportar imagem ...

    Criar arquivo de imagem (ou imagens) correspondente(s) aos circuitos. A caixa de diálogo de configuração será descrita abaixo.

    Imprimir ...

    Enviar circuito(s) para uma impressora. A caixa de diálogo de configuração será descrita abaixo.

    Preferências ...

    Exibir a janela preferências da aplicação (Em sistemas Mac OS, isso irá aparecer no menu do Logisim.)

    Sair

    Fechar todos os projetos atualmente abertos e terminar o Logisim. (Em sistemas Mac OS, isso irá aparecer como Quit no menu do Logisim.)

    Configurar exportação

    Ao selecionar Exportar imagem ..., o Logisim exibirá uma caixa de diálogo com quatro opções:

    • Circuitos: Uma lista onde você poderá selecionar um ou mais circuitos que deverão ser exportados em arquivos de imagem. (Circuitos em branco não serão exibidos como opções.)
    • Formato da Imagem: Você poderá criar PNG, GIF e JPEG. Recomendamos os arquivos PNG. O formato GIF é bem antigo, e no formato JPEG poderão ser introduzidos outros elementos na imagem, uma vez que esse formato é realmente mais significativo para imagens fotográficas.
    • Fator de escala: Você poderá dimensionar as imagens que serão transferidas para os arquivos de imagem usando esse controle.
    • Prévia da impressão: Se quiser usar " prévia da impressão " ao exportar circuitos.

    Após clicar em OK, o Logisim irá mostrar uma janela de seleção de arquivos em caixa de diálogo. Se você já tiver selecionado um circuito, indicar então o arquivo no qual a imagem deverá ser colocada. Se você tiver selecionado vários circuitos, escolher uma pasta (diretório) onde os arquivos deverão ser colocados; o Logisim providenciará os nomes das imagens com base nos nomes dos circuitos ( main.png , por exemplo).

    Configurar impressão

    Quando você escolher Imprimir ..., o Logisim exibirá uma caixa de diálogo para configurar o que será impresso.

    • Circuitos: Exibirá uma lista onde você poderá selecionar um ou mais circuitos para serem impressos. (Circuitos em branco não serão exibidos como opções). O Logisim irá imprimir um circuito por página. Se o circuito for muito grande para a página, a imagem será redimensionada convenientemente.
    • Cabeçalho: Mostrará o texto que deverá aparecer centrado na parte superior de cada página. As seguintes substituições serão feitas no texto.
      Nome Número de página Total de páginas Um único sinal ('%')
      n% do circuito na página
      % p
      % P
      %%
    • Girar para ajustar: Se estiver assinalada, irá o Logisim rotacionar cada circuito em 90 graus, quando o circuito for muito grande para caber a página, e não precisar ser escalado para menor, se puder ser girado em 90 graus.
    • Prévia da impressão: Se quiser usar " prévia da impressão " antes de imprimir os circuitos.

    Após clicar em OK, o Logisim irá mostrar a configuração da página padrão em uma caixa de diálogo antes de imprimir os circuitos.

    Próximo: O menu Editar.

    logisim-2.7.1/doc/pt/html/guide/menu/edit.html0000644000175000017500000001300511541757140021076 0ustar vincentvincent O menu Editar

    O menu Editar

    Desfazer XX

    Desfazer a ação executada mais recentemente que afetará a forma como o circuito será salvo em arquivo. Notar que isso não incluirá mudanças no estado do circuito (como acontece com as manipulações executadas pela ferramenta Testar (Poke).

    Recortar

    Remover os componentes atualmente selecionados a partir do circuito para a área de transferência do Logisim.

    Nota: A área da transferência do Logisim é mantida em separado da área que serve o sistema global; como resultado, recortar, copiar e colar não irão funcionar em diferentes aplicações, incluindo até mesmo outras que estejam executando cópias do Logisim. Se, no entanto, você tiver outros projetos abertos no âmbito do mesmo processo Logisim, então você será capaz de copiar, recortar e colar entre eles.

    Copiar

    Copiar os componentes selecionados atualmente no circuito para área de transferência do Logisim.
    (Ver nota do menu Recortar acima.)

    Colar

    Colar os componentes da área de transferência do Logisim segundo a seleção atual.
    (Ver nota no item do menu Recortar).

    Quando você colar os componentes, isso não será imediatamente realizado, em vez disso, eles serão desenhados em cinza claro. Eles, na verdade, não serão "efetivados" no circuito até que você mova a seleção, ou a altere para que os componentes não estejam mais nela.

    A razão para esse comportamento estranho é o seguinte: para ser coerente com seu próprio comportamento, o Logisim deverá imediatamente mesclar quaisquer conexões tão logo sejam inseridas em um circuito; isso mudaria processo de fusão das conexões já existentes. Quando você colar as conexões transferidas, no entanto, você poderá colocá-las em um local diferente, e evitar a mudança inerente ao processo de fusão que for contra a sua vontade.

    Excluir

    Remover todos os componentes da seleção atual do circuito, sem modificar a área de transferência.

    Duplicar

    Criar uma cópia de todos os componentes na seleção atual. Isso é como selecionar, copiar e colar, exceto que a duplicação não irá modificar ou usar a área de transferência.

    Selecionar tudo

    Selecionar todos os componentes do circuito.

    Elevar a seleção

    Disponível somente durante a edição como deve ser a aparência de um circuito, esse item de menu elevará o(s) objeto(s) selecionado(s) a ser(em) desenhado(s) sobre outro quando houver sobreposições. Se o objeto selecionado for sobreposto por outros, ele será elevado apenas sobre o que estiver mais por baixo; selecionar o item de menu repetidamente até ficar na ordem que desejar.

    (Determinar se dois objetos arbitrários se sobrepõem é difícil. O Logisim usa um algoritmo de seleção de vários pontos aleatórios em cada um dos dois objetos, e verifica se algum ponto pertence também ao outro objeto. Às vezes, ele poderá deixar de detectar alguma sobreposição se essa for pequena - digamos, menos de 5% de um dos objetos.)

    Baixar a seleção

    Disponível apenas ao editar a aparência de um circuito, esse item de menu baixará o(s) objeto(s) selecionado(s) a ser(em) desenhado(s) sob outro, quando houver sobreposições. Se houver várias sobreposições, ela só abaixará em relação ao mais elevado; selecionar o item de menu várias vezes até ficar na ordem que desejar.

    Elevar ao topo

    Disponível apenas ao editar a aparência de um circuito, esse item de menu elevará o(s) objeto(s) selecionado(s) a ser(em) desenhados acima de todos os outros (A âncora e as portas são exceções. - Elas estarão sempre no topo.)

    Baixar ao fundo

    Disponível apenas ao editar a aparência de um circuito, esse item de menu abaixará o(s) objeto(s) selecionado(s) para que todos os outros objetos sejam desenhados por cima dele(s).

    Adicionar vértice

    Disponível apenas na edição aparência de um circuito, e um ponto tenha sido selecionado em uma linha, poligonal ou polígono, esse item de menu inserirá um novo vértice para a forma. Anterior à inserção, o ponto selecionado será desenhado como um losango.

    Remover vértice

    Disponível apenas na edição aparência de um circuito, e um vértice já existente tenha sido selecionado em uma poligonal ou polígono, esse item de menu removerá o vértice selecionado. Anterior à exclusão, o vértice selecionado será desenhado como um losango dentro do quadrado que o representar. O Logisim não permitirá remoção de um vértice de um polígono com apenas três vértices, ou em uma poligonal com apenas dois vértices.

    Próximo: O menu Projeto.

    logisim-2.7.1/doc/pt/html/guide/mem/0000755000175000017500000000000011541757140017076 5ustar vincentvincentlogisim-2.7.1/doc/pt/html/guide/mem/poke.html0000644000175000017500000000365711541757140020735 0ustar vincentvincent Testar memória

    Testar memória

    Você poderá manipular o conteúdo da memória usando a ferramenta Testar (Poke), mas a interface para isso é severamente limitada por restrições de espaço: Por mais que a simples edição, você provavelmente irá achar o editor hexadecimal integrado muito mais conveniente.

    No entanto, para visualizar e editar os valores dentro do circuito, a ferramenta Testar (Poke) tem dois modos de operação: você poderá editar o endereço exibido, e também poderá editar um valor individual.

    Para editar o endereço exibido, clicar fora do retângulo mostrado. O Logisim irá desenhar um retângulo vermelho em torno do endereço.

    • Se entrar com dígitos hexadecimais irá mudar o endereço de acordo.

    • Se digitar a tecla Enter irá rolar para baixo uma linha.

    • Se digitar a tecla Backspace irá rolar uma linha para cima.

    • Se digitar a barra de espaço irá rolar uma página (quatro linhas).

    Para editar determinado conteúdo, clicar no valor dentro do retângulo mostrado. Logisim irá desenhar um retângulo vermelho em torno desse endereço.

    • Se entrar com dígitos hexadecimais irá mudar o valor do endereço atual de acordo.

    • Se apertar a tecla Enter irá editar o valor mostrado logo abaixo (uma linha para baixo).

    • Se apertar a tecla Backspace irá editar o valor na endereço anterior.

    • Se apertar a barra de espaço irá editar o valor no endereço seguinte.

    Próximo: Menus pop-up menus e arquivos.

    logisim-2.7.1/doc/pt/html/guide/mem/menu.html0000644000175000017500000000450011541757140020727 0ustar vincentvincent Menus <i>pop-up</i> e arquivos

    Menus pop-up e arquivos

    O menu pop-up para a memória inclui quatro opções além das opções comuns a todos os componentes:

    • Editar conteúdo: Abrir um editor hexadecimal para editar o conteúdo de memória.
    • Limpar conteúdo: Redefinir todos os valores na memória como 0
    • Carregar imagem...: Redefinir todos os valores na memória com base em valores encontrados em um arquivo usando o formato descrito abaixo.
    • Salvar imagem...: Armazenar todos os valores na memória em um arquivo usando o formato descrito abaixo.

    O formato de arquivo usado para arquivos de imagem é intencionalmente simples; isso lhe permitirá escrever um programa, como um montador, que gerará imagens de conteúdos que poderão ser carregados na memória. Como exemplo desse formato de arquivo, se tivermos uma memória de 256-bytes cujos cinco primeiros bytes de 2, 3, 0, 20, e -1, e todos os valores subsequentes forem 0, a imagem em arquivo texto teria o seguinte conteúdo:

    v2.0 raw
    02
    03
    00
    14
    ff
    

    A primeira linha identifica o formato de arquivo usado (atualmente, só existe um formato de arquivo reconhecido). Valores subsequentes listados em hexadecimal, a partir de endereço 0. Você poderá colocar vários desses em uma mesma linha. Se houver mais posições de memória que as identificadas no arquivo, o Logisim irá carregar 0 nessas outras posições.

    O arquivo de imagem poderá usar codificação do tipo run-length. Por exemplo, ao invés de listar o valor 00 dezesseis vezes em sequência, o arquivo poderá incluir 16*00. Alerto que o número de repetições é escrito em base 10. Arquivos produzidos pelo Logisim usarão essa codificação para todos os casos com pelo menos quatro valores.

    Você poderá colocar comentários no arquivo usando o símbolo '#'. Todos os caracteres na linha a partir do símbolo "#" serão ignorado pelo Logisim.

    Próximo: Editor hexadecimal.

    logisim-2.7.1/doc/pt/html/guide/mem/index.html0000644000175000017500000000216311541757140021075 0ustar vincentvincent Componentes de memória bgcolor="FFFFFF"> Componentes de memória

    Os componentes RAM e ROM são dois dos tipos mais úteis de componentes nas bibliotecas predefinidas no Logisim. No entanto, devido ao volume de informações que poderão armazenar, eles serão também dois dos componentes mais complexos.

    A documentação sobre como eles funcionam dentro de um circuito poderá ser encontrada em RAM e ROM páginas de Biblioteca de Referência . Esta seção do Guia do usuário explicará a interface que lhe permitirá visualizar e editar o conteúdo da memória.

    Testar memória
    Menus pop-up e arquivos
    Editor hexadecimal integrado do Logisim

    Próximo: Testar memória.

    logisim-2.7.1/doc/pt/html/guide/mem/hex.png0000644000175000017500000001205611541757140020374 0ustar vincentvincentPNG  IHDR=sRGBPLTE5_5t4$W2T=EV6([_o(:+A0B+-+S*$"2{20~ Fa0:%ERv1b|1Z4.\9[XIRQH ZO@MTbXYzΰPs^՟is՞_,V֞zs؉ނͧzu툺ӅԵֽ}‡ߪҵ۩ǷݚԹոܪtRNS@fbKGDH pHYs  *IDATx흋_lj‚U/rcU(RR+w)X*[f;'\tXW$$d bCCCC{Z[[M#z=gӒRn f+w~Y|nhΒy<ܬGɄ&mJ@FѕVjN([B+K񋺚{}7-̞gD;53Ioӳ{>?ћ[kM|t.:j /|p1}G6~A:o6u4e{  NW9z֙@e.6\9^/:D~Z!'K0M٬^6[Ac;19LO‘ME`GA@ѫ()>z|zE/CR.J [&'6P=K '7/p[m5G6@PYg\7rAUwؿ: 4HI^;z#>QYnT`;F+;UAFczr ϑf4})LǾJب*vsڢvnmF:yX7g}<_t(85 .VEoҴ? [*״ 1n7)`z9C _IoLCl#t{ds="!> ?߳ ;N^_Q/$["#EĠJoKR{ͯ-+BoQaG)*3Ê\->lEKÃzwta?zqjĔk+hZ4:?Zt =A =V<`z zkSJT/BڼtXA 3Zv^{YznߋScKj@B\}Px=>l~}YپL";@t0o݈nl34|n$?oeXz{zEpF,;䩑W0bCMh6! CId<#Fp _H{ ߒƃ%1E.7gxϠV4fSԃL5m=SB /SOIs,%mqq w3ܜ9oZ*^i3V_:睭9㜧쾗lJE)*KƦ:S~W Eo"zצDhwnKz&Mv; '|f~:%,7%5yŃ]=[D4Wu}cše}b2x1FYv}UGz PR$ʌ[-aot| wEW (4!DBG~J5v+˚Sn y?hXJ<زVrˢ⤗o~W)jgU$ߪpNs?}¥w,W]H;3tϑ>8xso-[~lٱr=w>wmhVm*{Ѓ-Y 5u8%j7KӅ_v > 4aϝ{AOCh3kp{~ 6yE3|yiࢆ1s@ v ʐ _/< zspObp<};g$;*}j>9VZ,;M/9k :W\ؑu"X[YibhOф[ Zgi9.:r l_{quѓ'plX G#/L36+c;2]KvzxS@4'=z#Ow_Џ;Y>3]\L҃Ⱦ_OϨ>2=aӃ)+seY+2'O=}HzQsBu *ApzHҫ!iX&'"Wʓ^vIzDoRғ$^CX+gj&6$6\sԆ&9_u;#wOL =KY^{YoU;7)B/A#$ 4b; FO^VғNo搀T;/DBҫ^Bҫ^Bғ$^|^CVʩ^<9lgo9*uzzE VxS7Y Vx|#OOQCzoKySjC 淍AM[""ۖKl)~9gbTyP "[/,kaXbM_49EMkua^p㢗AjԈ-_Y_1RsY'FAmaM I4C|Mӗ/SУ eY[h*5Nk A]tgKCb/%̞TC‡}L[ȴQU EnORkT󽣒M?3> Mxwѐhu#|\*d։w-c߂4}h7mӻL3RNzJU;*tx!kK>3⣏*[$-|u[=xXҫD ML[fKl۷Mb㷶oBq9U#W Bؚp;q(=\k]F0LZR!s=#.;_6DF2(i^X >uK5Ã\mehp%IݖqR$Kv U-[Sx|#}{6Kz?VgUPH³䷜z:FJ7bo9.Fғ5D7ꗞG\oԤ)g\I/0Q{uۗ$^[oA,ͮnڴIQaI&iЛS iF8jn ggothqt79j;;z SS[OM͞13wJ;55ubRaK]l(L8luCIENDB`logisim-2.7.1/doc/pt/html/guide/mem/hex.html0000644000175000017500000000337011541757140020553 0ustar vincentvincent Editor hexadecimal

    Editor hexadecimal

    O Logisim inclui um editor hexadecimal integrado para visualizar e editar o conteúdo da memória. Para acessá-lo, basta abrir um menu pop-up para o componente de memória e selecionar Editar conteúdo... Para componentes ROM, cujo conteúdo de memória faz parte do valor do atributo, você também poderá acessar o editor hexadecimal ao clicar o valor do atributo correspondente.

    Os números em itálico à esquerda mostram endereços de memória, escritos em hexadecimal. Os outros números exibem valores a partir desse endereço de memória, o editor hexadecimal poderá exibir quatro, oito ou dezesseis valores por linha, dependendo do que couber na janela. Para ajudar a contar, cada grupo de quatro valores terá um espaço maior entre eles.

    Você poderá navegar através de memória usando a barra de rolagem, ou usando o teclado (as teclas de setas, home, end, page up e página para baixo). Escrever caracteres hexadecimais alterará o valor selecionado.

    Você poderá selecionar um intervalo de valores, arrastando o mouse, com shift-click do mouse, ou navegando através de memória com o teclado, enquanto pressionar a tecla shift. Os valores poderão ser copiados e colados usando o menu Editar; a área de transferência também poderá ser usada em outras aplicações.

    Próximo: Guia do usuário.

    logisim-2.7.1/doc/pt/html/guide/log/0000755000175000017500000000000011541757140017101 5ustar vincentvincentlogisim-2.7.1/doc/pt/html/guide/log/table.png0000644000175000017500000000765211541757140020710 0ustar vincentvincentPNG  IHDR0PLTE$G9Vǵ78:Ha]zx𡤬аT pHYs*b@tIME 32I/ IDATx}l\Y׮Ć2!r"9@_(K19 V-nmuH04]-۔ArOPi]Uq]gfw'ދwfxwfwvx^Zjz4,| 7I/GᎾ~[󴬜'Dwm:}ڴBA6Z)Ɬn$r*}qM|ln?\x;K:2Z`)IJ#GBPxxcc;3sL/C6|9ɺ6-_=6z,An?2aK*xĎFMFC]{YIvx-H׃xᗆt< QM D4*+񙪄+rbԙ-뾑H|W*oyV351cbV&=7P\ hX/0$]'xc'nuǰyEJ>ӊhTIt'P+ Un8Wi`D+*-bLqPw(ppkhLezBda0 #~|ݡy`"k'&n%YQ-1RI2z?FRT-)SS c}w0Lmf0ks#F@-)NROH߬%7 VM#Qo- eh$;ߤM&é;l[!j1MM"[[իb`FF*+xqTԿ6;2iҰdUsH+D^i-]iiH"d9]ϷlᩧH`ܲeZ`YV2)`;˯= ⩉)rm<\O|d2obo\iQFnX~F#T$+!kna[i!sgGsp-`LM1wҫYWնzՖx{ o>z@YgoVj@_pl CL~ipM}0it.ĜRb*c]EcQGuK[aXVE=(cDD4Kwn_wZ%֣,!ɂ*IӱLV;̨0Qb_ =0fcىc'"?uTV&f0qY8jf6fw:[`m$2Q1p6񜵩0q&:7N1sbFqLw&T3̇܎bu'|Db]bZfAKcǽTQu`fZZξ76IًցIAvBλoʀ'!Ecx*"܏1z.1 TtEc}eT>\r\S4a&;/5Dxha9,5f d X\PU$4fR̅(Y2'?,0HQ`ʤ\ 6vZ^-m`U{&`~c218i[ϙg1{&19b*tz2oɌ9jO= zޛ1E0GAIa,&.VӘV++,dM?0!E.=rŬ-zOJwlL0E\=s`&,'-̅.#*OO/1'%akLfIf11c?0G0Eľd*dKDǤ.bjS&u.$tSS)C qаKXt ea4iTX$ d\5Ma ʫq e+JA>VN,)L=IcBgaf'-^R&LĤ^UTiߊԥ\֋6[rSy15/bRɴMmkV#--mҺ>-`1;9 YbkAz] LDKKXK-\_6KLL;&E=(5i00ӝ|9din{LtNs۵V_WPL7/05%Tt0x35T\zpBg000?-dsrAP|Ԭ L!jnL1jnLAj0O oL䟭ָmo&MʅYT|Q{s%JV+ed=4[gnCg000eҬ\ѬvkW7414ݫMOծ-Yj?yݬY >T_ 2xmα[D{5ՒtE&̒CDs mTsX"ĻM'O| 000}%p1j iV_;"i_STE4/~MAj$iVswLLL?c*\9:{[9:-&& &[=zZw0u1krV65X cOw\pꋘѬv Sm~SDڭM|f{_"Yһ`V&`&`?0"`gjE/̸4 BbruTnu[,s=sMwEmO nSռ‰iV5 Bb٧TnO0]|xڬY `V/*Y;מ14r%12]|0;מ5t00S&Lf)W/ןx?b "=715000ՂռbռSEi9Dv!KdE ex,Y]L겛\go01ʏLԦ#L0{ 1[!d1?Z20$ S% 00}v1) fr&`^Z&`.bCkb8ᢥDE1SRab )WK6~)AafKJcQk#>E8FpFX =p`BLFBR`lc L3E*#lٵm&Lڶ[GȈl1=0DǼ)f>_3x\LYDZ~HMʏycz,>‹2`Cm+}uc&`g1ӲG+(*ڈңZRڂ4Ȉk0J3f אh5`-ўZY`u9IENDB`logisim-2.7.1/doc/pt/html/guide/log/table.html0000644000175000017500000000177111541757140021064 0ustar vincentvincent A guia Tabela (Table)

    A guia Tabela (Table)

    A guia Tabela exibe o registro atual graficamente.

    A tabela contém uma coluna para cada componente na seleção. Cada linha da tabela apresenta um instantâneo da simulação após as propagações de valores terem sido concluídas. As linhas duplicadas não serão adicionadas ao registro. Notar que apenas as 400 linhas mais recentes serão exibidas. Algumas linhas poderão ter entradas vazias, se o componente que lhes corresponder não estiver na seleção no momento em que a linha for computada.

    O quadro apresentado é apenas para ilustração. Ele não é interativo.

    Próximo: A guia Arquivo (File).

    logisim-2.7.1/doc/pt/html/guide/log/selection.png0000644000175000017500000001162211541757140021576 0ustar vincentvincentPNG  IHDR0PLTE3Ou"FD^457^|곽x `i pHYs*b@tIME 4#lIDATxl}pjm,9DA0a\U#0oY9C۲!+:E*{*wS hbԪsci|Qv&"&tu&;NI<(=|Qz0"Ic#Ғtyz6Έ]f"Qu+c=Ҁ%dfieμ;]b/xۻ 4`,}Yz§ut a>yᑿ(^3ɜs YKvv?6]dPgKcɟ u3PǻF3gyΗ.><S0_|jDQa gjr7vy!vIҶLҶG bWX?*ˢ)s[wиV惘ɦao7>nj,D[۵3=,- <|`%'G3:'v7O\< &dApCֹԃm,~zޜz:ik~vsStagk7c4\z޵+ƙoh:M'A{a<`jSky]<Ѓe<㏩0J0btq7?e=]^65lx ݆1u#rk}Eg>~'$)\@Wal0Mjt`GjYN!z؂R3 K1ǻ4w S,;8m?+Zá{Gݘa}cԓ6@"=;Kiz6{?;|[Yon0y3u:7f _*(E_ph/ֵ]{XLE^*/Քx_GGi\xߎ ё`VȌS|`uZă̈1OE73I'tv`1|xEsSZ5+VM4zN Y|Mg/{&0bfr+5S(J"H*$J$(:Lq`c\wisoUxvlb`Vb:ADt.E؇>\1 ҝd 'GVEL>k$0IoM);gb:og1d$0INop-LNMRL*1ٰk9vTbo 1KezvLj<Z B\&;RybZ9-,fw4KwZ썊 9n\^|C\!𴬚I$?'Dzg*>%ac~47k)5sjUU/2l%܄Uzʭ&5@j[B|< sr)巻sI?[~Q!xyI Q"91}6&K̙63^zl Y` I K!LvOm9zRp2 R@6CŬ'%I D_)* %̼/SazKAɄda{*!N.KMj&KDZɋܥ~E;mdM'{Yi.iCV]bFcf~$fQ--5&`F8zm1p[QA_o! 75 1uc,=$}sؚ կu͚ĚILUdIZxU5;Z&M7͔`ڏɪҗ uIXW\y]U'%oyza-\&b[\*\vcLql/D?֩HKUXJLN,&aI\Êk2]Hul^)TL͇Ic&׾V|*Qϝ6a [9'gc *ϛ c&]i{ L-#1+0=92^%|㬴!xO(c9t*&e\WA:I)s}sJC#筗řE9mM Y.|I%~'pgmLWa1D&25*:f-e~qLP0ԩ0:1wffj5s_0?jպCVLO-:([Ձ[s8SzYk)y7(-r)S[-^Y'J?io v.D&'% T$t{+jN AjeN1Ǵɢ}RfkKI7ɂ.OXړ$J\WD@7 {)bBt5Eaz 0 ;K}Radkq#`! u DEQ َdNtcCRh 3ʵcN yPRr57LY^ ̅3oz˨-e2 9L&穙_UW]prWý{~E vHu%{,( ̂TU)EJizۚv ,L.,0W#ݩY-4-h6W Y[˺\ѵ0 q Ӫ 33r}T/̢+Waӕ5Vjꤤb`ΕT3I.-D,. a {R*ϛvWAe&qcLYNؿP3eV{g3vb&0tXY}e$L7 N*0'<ְod,$I9_4ՋfOUPMH~iBZIN$6BtfR[BۅRuLu:c,k b1p4$X Hή[Yg&cL%Zn &}E1i)` dLِ0\" 0ǖ|ON;->HCv1ӧ:M.L,QLW0Y{J'F*(hvƴN˧ǀɏSӦ 0;[]e٘> ie!;XYsUPmLY޲E#ԬJ̣~ci⢻fЅ$1]YPO{0Qd:"MqdڹI'e7*Ggřu ^~6`*řte9eNJehS#VN*JV(mA'%Z#Qin)&6M>`D&25cvtÕd"D&2Ld"D&2Ld"D&2Ld"D&2Ld"D&2Ld"D&2Ld"D&2Ld"D&2Ld"D&2Ld"D&2Ld"D&2Ld"D&2Ld"D&2Ld"D&2Ld"Ȭp0 )`Z<7L;movZd"!e&!ɰ0#5aIM1`& oL]Mc`Ld%foDD`&fc1iAJc1ka!3S"v \S̚ŹaέD&2 Zn(e)E=&2(0-މBʀ&O$CI4 vQ h0f(3LMF o0!6ac4`~`͌gXh 4nY'd{3bB3agK];}KDӇ<ku`~r&Pi=/<RD&2CE=\a4b҉6ڣ30uS(2-[Jj;$i=|H*qIENDB`logisim-2.7.1/doc/pt/html/guide/log/selection.html0000644000175000017500000000505311541757140021757 0ustar vincentvincent A guia Seleção (Selection)

    A guia Seleção (Selection)

    A guia Seleção permite selecionar que valores deverão ser incluídos no registro. A janela abaixo corresponde ao seguinte circuito.



    A guia está dividida em três áreas verticais. A primeira (mais à esquerda) é uma lista de todos os componentes no circuito cujos valores poderão ser registrados. Entre as bibliotecas predefinidas, os seguintes tipos de componentes têm suporte para registro:

    Biblioteca Conexão: componentes Pino (Pin), Ponta de Prova (Probe) e Clock
    Biblioteca E/S: componentes Botão (Button) e LED
    Biblioteca Memória: todos os componentes, exceto ROM
    Para os componentes que tenham rótulos a eles associados, seus nomes corresponderão a esses rótulos; outros nomes poderão especificar seu tipo e sua localização dentro do circuito. Quaisquer subcircuitos que aparecerem na lista, não poderão ser selecionados para registro, mas os componentes elegíveis dentro deles poderão ser. Observar que o componente RAM exige a escolha de quais endereços da memória deverão ser registrados, mas lhe permitirá registrar apenas os 256 primeiros endereços.

    A última área vertical (à direita) enumera os componentes que foram selecionados. Além disso, indicará em que base os valores do componente multibit serão registrados, a base não tem um efeito significativo sobre valores de um bit só.

    A coluna do meio permitirá a manipulação dos itens dentro da seleção.

    • Acrescentar adicionará um ou mais itens escolhidos à esquerda na seleção.
    • Alterar Base mudará a base atual para componente selecionado entre 2 (binário), 10 (decimal), e 16 (hexadecimal).
    • Mover para cima deslocará o componente que estiver selecionado para a cima uma posição.
    • Mover para baixo deslocará o componente que estiver selecionado para baixo uma posição.
    • Remover apagará o componente que estiver selecionado.

    Próximo: A guia Tabela (Table).

    logisim-2.7.1/doc/pt/html/guide/log/index.html0000644000175000017500000000445011541757140021101 0ustar vincentvincent Registro

    Registro

    Ao testar um circuito maior, e para documentar seu comportamento, um registro poderá ser guardado. Essa é a finalidade do módulo de registro do Logisim, que lhe permitirá selecionar os componentes cujos valores deverão ser registrados, opcionalmente, você poderá especificar um arquivo onde o registro deverá ser colocado.

    Nota: O módulo de registro está em fase alfa, e poderá apresentar defeitos, bem como estar sujeito a alterações significativas no futuro. Enquanto relatórios de bugs e sugestões são bem-vindos para todos os casos, eles serão particularmente bem-vindos a respeito desse recurso relativamente novo. Se você não enviar comentários, então ele provavelmente não sofrerá alterações.

    Você poderá entrar no módulo através da opção Registro (Logging)... no menu Simular (Simulate). Ela abrirá uma janela com três guias.

    Vamos discutir cada uma dessas guias separadamente.

    A guia Seleção
    A guia Tabela
    A guia Arquivo

    Cada projeto tem apenas uma janela de registro; quando você alternar para a visualização de outro circuito dentro do projeto, haverá troca de janelas, e automaticamente o foco irá mudar para o outro circuito. Ou seja, ele fará isso a menos que você esteja movendo para cima ou para baixo dentro da mesma simulação , caso em que o módulo de registro não irá se alterar.

    Observe que, quando as opções de módulo de registro mudarem para outra simulação, ela deixará de gravar qualquer registro em arquivo. Se você alternar de volta para a simulação novamente, ele irá se lembrar da configuração para a simulação anterior, mas você terá que reativar o registro manualmente.

    Próximo: A guia Seleção (Selection).

    logisim-2.7.1/doc/pt/html/guide/log/file.png0000644000175000017500000000761211541757140020534 0ustar vincentvincentPNG  IHDR0PLTE6U|"Fb679Sgl@ pHYs*b@tIME 3 NVIDATx}lp?$:uD)丨BhkV!$6\HcB J*MIJYˆ[.͠dEP\@_Mwy'{?}:?N-辏kZ|kOޥ[_wމtx0&&Y^#"H䶩b۸11;g.ӽJDŘ6:n6gzMu4VMՉhΎPƊubciNVt!k]]u-k(h-nh0Myv2j:.'sNgɌ%YQQ tֶ];hhJ67LPۊ kϒgnXN3I`ತd=koo<ړ|iB'hMIz&+?rLf!i[d;D lX5=9&Vgziʓ̃)spw2g]LTm9=|iv :9?g7=νN ՛dEEܱi&ܽm[ sLh$ǓqM1ӿ!i3x@0#mLvչ-_Pullg!;maծx-vN[̽Kәrp]\for/-[13 ƺ Qx0.XI3tNc߻;sp$?Z-bj ˦sŬX]0kE3Su4[ 4V8}<23ޢ<ӌ95A3Rtptb5ϟTh`Skh4e },,- JiIu1ﶞeJ`0SfiEɬna3vے[l`u烫kzj䫳q%]kY)fb]om'uq!ޢ<Ӝt)o (2Rczc =Lub[LuH+;wsJYߑ/wX9kb"KSs7-+=t` }t[[M=Vt$-f&_4ZiGwd2%4l1f9sI_"kHo{|d 1RU[7Jf~R]0wa[ݏ@@I<-l_D`N)1RfU vY/<*]D'=XxtO/ "ʮ~(_/Goi48MPVdp-7ngw9WBW D&qq+fT]DiE61{W&*_n%NTkw|Decw>c|8f 7H#g6҇dFFr8{$v#vj%cg(`*jqA7hdgڄikLp1~P8cFe'ڄŴ0O;(I13 .3^.u&AWITqQu0+XFqҲKRu:5wόu3̋#*^f=&7>|&Y3Wn2_6? Rr!{ d2JHOEtAa1{HYPi?n̏_T3TCRYVeP'HeV3$ R'JrZ+.z#?N['3f6~&9)?=`if&b&9k'w)`=.zYI2I&~& ysfbpXmBU3=5]RLY鎻~y'm5_SRI9YUYJ['iKF7AD&2/yM3Y%\0+FjO1%2Ld"D&2Ld"D&2Ld"D&2Ld"D&2Ld"D&29`th:!mw-(P3Zy:w^2E}v#=0{t읃eyL͝ K1^C'*i؎<ΌL 2\iA^i5 qu셸%b.Hd{JGO_Hqf!sϔ](rq0K,^b6ho6WUXߨ&NZ#D~Fiƨ_rw%?0{b!~eOqWf} t/Lm#Q¶,o `2!af1K,LdVSvtoϛr=`Df0}jd"D&2Ld"D&2Ld"D&2Ld"D&2Ld"D&2LdQzYf=^SHm~-+#̔,3GTKn$VxJ吝MwgĒV.S+ԜO0!;bBil̬ۗѱHbRY6CMѼΧE@j[ ʒVVl.t"ka= iqL&vT Cǩ 8XN2u" %,(KZ+r|MsuvovJ$4(QLdZYP.q3$aʮff:;sN#mZ<7 &])sL$ */boצ]6SԊ&Tmgגe1kfj3&m&2ElfeD6s+-Lq&WZcWH9!~4iVE &O'ߢ&k. pZLaO@qf .*~3Qb6oeŜ0d̄]WfͶ~ҘL?1}Zd"D&2Ld"D&2Ld"D&2Ld"D&2Ld"D&2Ld"ȼ_;37h9ZQ{Z9eb~f8̎Qw˯ZsELUiA4 &o*fnJ>X&9_0j^L I2 T=!k-6Y~+o0%%d~m/0G q[{yoMh16nZ'-xTL=Q/'d"D&2Ld"D&2Ld"D&2Ld"D&2Ld"D&2Ld"D&2sc^1<j؍Ld"s^1/ 3tVF&2gÎY2y%Yk ;4,k'-ef}AuU]4?ē쉠c1#=p~tT[{큃 LW;@T_0脤 ;?U0m$:?Q˂xlc0Ã(u1^g"9fi\?3&nK7\9jc|)3^ /}juvd"Uˌ=nYJmWXtD}᠈Z?2'%f> ̑\-I;|D 6IENDB`logisim-2.7.1/doc/pt/html/guide/log/file.html0000644000175000017500000000515711541757140020716 0ustar vincentvincent A guia Arquivos (File)

    A guia Arquivos (File)

    A guia Arquivo (File) permitirá que você especifique onde o registro deverá ser colocado.

    Na parte superior há um indicador se existir registro em andamento e um botão para ativá-lo ou desativá-lo. (Note que você não poderá habilitá-lo até que um arquivo seja selecionado mais abaixo.) Um botão lhe permitirá suspender e reiniciar gravações no arquivo. Quando você escolher a janela do projeto para a visualização outra simulação, o arquivo de registros irá parar automaticamente e, se você retornar ao original, e quiser continuar a registrar, você precisará reativar a gravação manualmente utilizando o botão na parte superior.

    No meio, há um indicador do que está sendo gravado no arquivo. Para alterá-lo, deve-se usar o botão Selecionar (Select). Ao fazer isso, a gravação será iniciada automaticamente. Se você selecionar um arquivo pré-existente, o Logisim perguntará se você deseja substituir o arquivo ou acrescentar novos registros ao seu final.

    Na parte inferior você poderá controlar se uma linha de cabeçalho deverá ser colocada no arquivo para indicar quais itens estarão na seleção. Se linhas de cabeçalho forem adicionadas, então, uma nova linha de cabeçalho também será colocada no arquivo sempre que a seleção for alterada.

    Formato de arquivo

    As entradas serão colocadas no arquivo em formato delimitado por tabulações correspondentes o mais próximo possível do que aparecer sob a guia Tabela. (Uma diferença é que todas as linhas de cabeçalho irão fornecer o caminho completo para os componentes em subcircuitos.) O formato é intencionalmente simples, de modo que você poderá submetê-lo a outro programa para ser processado, como um script Python/Perl ou um gerenciador de planilhas.

    Assim um script poderá processar o arquivo, ao mesmo tempo em que o Logisim estiver em execução, liberando novos registros para o disco a cada 500 ms. Note-se que Logisim também poderá fechar intermitentemente e depois reabrir o arquivo durante a simulação, especialmente se alguns segundos decorrerem sem que qualquer novo registro tenha sido adicionado.

    Próximo: Guia do usuário.

    logisim-2.7.1/doc/pt/html/guide/log/counter.png0000644000175000017500000000304211541757140021265 0ustar vincentvincentPNG  IHDRSBPLTE8IBog pHYs*b@tIME 2sIDATxo8pmr-]E[+Tqo+'yp̎$ ? HZSB'B|*& Uy:{K3{d՜ UgMxFF3)_ P]Co}P4^D܁:[DuLHhe}UruN:W%U^UkQTl?v X5gyUin?pBju&կ#C8- nQl6Py&u窷Ɔo(nrl~c"-*aLC O|RJŽ`9Ej"ʕ⏉K!PIeO]yfQZUـA+4a8_F;?ڏsIENDB`logisim-2.7.1/doc/pt/html/guide/jar/0000755000175000017500000000000011541757140017074 5ustar vincentvincentlogisim-2.7.1/doc/pt/html/guide/jar/simpctr.html0000644000175000017500000001621211541757140021445 0ustar vincentvincent Contador simples em código de Gray

    Contador simples em código de Gray

    Muitas vezes queremos componentes que não são exclusivamente combinacionais em sua natureza - ou seja, queremos que o componente tenha alguma memória. Há uma sutileza importante na definição de tais componentes: você não poderá ter o componente armazenando por si mesmo o estado, porque um componente individual poderá aparecer várias vezes no mesmo circuito. Ele poderá até não aparecer diretamente dentro de um circuito, mas poderá ser contado mais de uma vez se existir em um subcircuito que seja usado várias vezes.

    A solução será criar uma nova classe para representar o estado atual do objeto e, associar instâncias a esse componente através do estado do circuito do qual for herdado. Neste exemplo, que implementa um contador em código de Gray de 4 bits sensível à borda, definimos uma classe CounterData para representar o estado do contador, além da subclasse InstanceFactory como ilustrado anteriormente. Um objeto CounterData se lembrará tanto do valor atual do contador, bem como da entrada de clock visto pela última vez (para detectar a borda de subida).

    CounterData

    package com.cburch.gray;
    
    import com.cburch.logisim.data.BitWidth;
    import com.cburch.logisim.data.Value;
    import com.cburch.logisim.instance.InstanceData;
    import com.cburch.logisim.instance.InstanceState;
    
    /** Represents the state of a counter. */
    class CounterData implements InstanceData, Cloneable {
        /** Retrieves the state associated with this counter in the circuit state,
         * generating the state if necessary.
         */
        public static CounterData get(InstanceState state, BitWidth width) {
            CounterData ret = (CounterData) state.getData();
            if(ret == 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.
                ret = new CounterData(null, Value.createKnown(width, 0));
                state.setData(ret);
            } else if(!ret.value.getBitWidth().equals(width)) {
                ret.value = ret.value.extendWidth(width.getWidth(), Value.FALSE);
            }
            return ret;
        }
    
        /** 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 CounterData(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; }
        }
    
        /** Updates the last clock observed, returning true if triggered. */
        public boolean updateClock(Value value) {
            Value old = lastClock;
            lastClock = value;
            return old == Value.FALSE && value == Value.TRUE;
        }
    
        /** 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;
        }
    }
    

    SimpleCounter

    package com.cburch.gray;
    
    import com.cburch.logisim.data.BitWidth;
    import com.cburch.logisim.data.Bounds;
    import com.cburch.logisim.data.Direction;
    import com.cburch.logisim.instance.InstanceFactory;
    import com.cburch.logisim.instance.InstancePainter;
    import com.cburch.logisim.instance.InstanceState;
    import com.cburch.logisim.instance.Port;
    import com.cburch.logisim.util.GraphicsUtil;
    import com.cburch.logisim.util.StringUtil;
    
    /** Manufactures a simple counter that iterates over the 4-bit Gray Code. This
     * example illustrates how a component can maintain its own internal state. All
     * of the code relevant to state, though, appears in CounterData class. */
    class SimpleGrayCounter extends InstanceFactory {
        private static final BitWidth BIT_WIDTH = BitWidth.create(4);
    
        // Again, notice how we don't have any instance variables related to an
        // individual instance's state. We can't put that here, because only one
        // SimpleGrayCounter object is ever created, and its job is to manage all
        // instances that appear in any circuits.
    
        public SimpleGrayCounter() {
            super("Gray Counter (Simple)");
            setOffsetBounds(Bounds.create(-30, -15, 30, 30));
            setPorts(new Port[] {
                    new Port(-30, 0, Port.INPUT, 1),
                    new Port(  0, 0, Port.OUTPUT, BIT_WIDTH.getWidth()),
            });
        }
    
        public void propagate(InstanceState state) {
            // Here I retrieve the state associated with this component via a helper
            // method. In this case, the state is in a CounterData object, which is
            // also where the helper method is defined. This helper method will end
            // up creating a CounterData object if one doesn't already exist.
            CounterData cur = CounterData.get(state, BIT_WIDTH);
    
            boolean trigger = cur.updateClock(state.getPort(0));
            if(trigger) cur.setValue(GrayIncrementer.nextGray(cur.getValue()));
            state.setPort(1, cur.getValue(), 9);
    
            // (You might be tempted to determine the counter's current value
            // via state.getPort(1). This is erroneous, though, because another
            // component may be pushing a value onto the same point, which would
            // "corrupt" the value found there. We really do need to store the
            // current value in the instance.)
        }
    
        public void paintInstance(InstancePainter painter) {
            painter.drawBounds();
            painter.drawClock(0, Direction.EAST); // draw a triangle on port 0
            painter.drawPort(1); // draw port 1 as just a dot
    
            // Display the current counter value centered within the rectangle.
            // However, if the context says not to show state (as when generating
            // printer output), then skip this.
            if(painter.getShowState()) {
                CounterData state = CounterData.get(painter, BIT_WIDTH);
                Bounds bds = painter.getBounds();
                GraphicsUtil.drawCenteredText(painter.getGraphics(),
                        StringUtil.toHexString(BIT_WIDTH.getWidth(), state.getValue().toIntValue()),
                        bds.getX() + bds.getWidth() / 2,
                        bds.getY() + bds.getHeight() / 2);
            }
        }
    }
    

    Próximo: Contador em código de Gray.

    logisim-2.7.1/doc/pt/html/guide/jar/library.html0000644000175000017500000000426711541757140021437 0ustar vincentvincent Classe Library

    Class Library

    O ponto de acesso para uma biblioteca JAR é uma classe derivada que estende a classe original Library . O trabalho principal da biblioteca é listar as ferramentas que estão disponíveis através da biblioteca, na maioria das vezes, as ferramentas são todas aquelas necessárias para se adicionar os vários componentes definidos - ou seja, instâncias da classe AddTool ao se trabalhar com diferentes fábricas de componentes.

    Components

    package com.cburch.gray;
    
    import java.util.Arrays;
    import java.util.List;
    
    import com.cburch.logisim.tools.AddTool;
    import com.cburch.logisim.tools.Library;
    
    /** 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 components; practically speaking, though, you'll most often want
         * to create AddTools for new components that can be added into the circuit.
         */
        private List<AddTool> 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 AddTool[] {
                    new AddTool(new GrayIncrementer()),
                    new AddTool(new SimpleGrayCounter()),
                    new AddTool(new GrayCounter()),
            });
        }
        
        /** Returns the name of the library that the user will see. */ 
        public String getDisplayName() {
            return "Gray Tools";
        }
        
        /** Returns a list of all the tools available in this library. */
        public List<AddTool> getTools() {
            return tools;
        }
    }
    

    Próximo: Contador simples em código de Gray.

    logisim-2.7.1/doc/pt/html/guide/jar/index.html0000644000175000017500000001117111541757140021072 0ustar vincentvincent Bibliotecas JAR

    Bibliotecas JAR

    Uso de bibliotecas JAR

    O Logisim tem dois tipos de componentes de circuito: os que são concebidos dentro Logisim como combinações de outros; e os primitivos, que são escritos em Java. Os circuitos do Logisim são mais fáceis de projetar, mas eles não podem oferecer suporte mais sofisticado à interação com o usuário, e são relativamente ineficientes.

    O Logisim contém uma coleção bastante completa de bibliotecas predefinidas de componentes em Java, mas poderá também acomodar bibliotecas adicionais escritas por você ou por outros. Uma vez em posse do código de uma biblioteca, você poderá importá-lo em seu projeto ao clicar em Projeto no painel de explorador (linha superior) e escolher carregar a biblioteca (Load Library > JAR Library)... Então, o Logisim pedirá para você selecionar o arquivo JAR. (Em algumas circunstâncias, você poderá ter que digitar o nome da classe inicial, quando solicitado, isso deverá ser previsto pelo desenvolvedor da biblioteca. No entanto, um desenvolvedor normalmente deverá configurar a biblioteca JAR para evitar isso (ao incluir no manifesto do arquivo JAR um atributo Library-Class especificando o principal nome da classe).)

    Criar bibliotecas JAR

    O restante desta seção será dedicado a uma série de exemplos bem comentados que ilustram como desenvolver bibliotecas do Logisim. Você só deverá tentar fazer isso, se for um programador Java experiente. Além desses exemplos, você irá encontrar documentação bastante escassa.

    Você poderá baixar um arquivo JAR que lhe permitirá importar esses exemplos do website do Logisim na seção Links. Esse arquivo JAR também conterá o código-fonte desses exemplos.

    Incrementador em código de Gray

    Ilustra os elementos essenciais de qualquer tipo de componente por meio de um exemplo simples de um componente que tem uma entrada multibit e calcula o valor do próximo código de Gray que o segue.

    Biblioteca de classes

    Ilustra como definir uma biblioteca. Este é o ponto de entrada para qualquer arquivo JAR - a classe cujo nome o usuário fornecerá quando for carregar a biblioteca JAR.

    href="simpctr.html"> Contador simples em código Gray

    Ilustra como fazer um componente que tem estado interno; em particular, um contador de 8 bits que itera em código de Gray.

    Contador em código de Gray

    Demonstra um componente completo, bem mais sofisticado, com o qual o usuário poderá interagir. Ele implementa um contador em código de Gray, onde o número de bits guardado é customizável, e onde o usuário poderá editar o valor corrente, ao clicar nele com a ferramenta Testar e digitar um novo valor.

    href="guide.html"> Orientações
    Informações gerais para as bibliotecas com desenvolvimento por terceiros.

    License

    The code in this example JAR library is released under the MIT license, a more permissive license than the GPL, under which the rest of Logisim is released.

    Copyright (c) 2009, Carl Burch.

    Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

    The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

    Próximo: Incrementador em código de Gray.

    logisim-2.7.1/doc/pt/html/guide/jar/incr.html0000644000175000017500000002306311541757140020721 0ustar vincentvincent Incrementador em código de Gray

    Incrementador em código de Gray

    Cada componente incluído em uma biblioteca é definido através da criação de uma subclasse de InstanceFactory encontrada no pacote com.cburch.logisim.instance. Esta subclasse tem todo o código necessário.

    (Aqui descreveremos a API para a versão atual do Logisim. Você poderá encontrar algumas bibliotecas desenvolvidas para versões anteriores do Logisim, para componentes que foram desenvolvidos através da definição de duas classes, uma extensão Component e outra que estende ComponentFactory. Versão 2.3.0 introduziu uma API muito mais simples a InstanceFactory, a técnica anterior está obsoleta.)

    Três pacotes do Logisim resumem a maioria das classes relevantes para a definição bibliotecas de componentes.

    com.cburch.logisim.instance

    Contém classes especificamente relacionadas com a definição de componentes, incluindo as classes InstanceFactory, InstanceState, InstancePainter e Instance.

    com.cburch.logisim.data

    Contém classes relacionadas com os elementos de dados associados aos componentes, como a classe Bounds para representar retângulos limítrofes, ou a classe Value para representar os valores que possam existir em uma conexão.

    com.cburch.logisim.tools

    Contém classes relacionadas com a definição da biblioteca.

    Acerca dos códigos de Gray

    Antes de prosseguir, descreverei brevemente o código Gray em que estes exemplos se baseiam. Não é realmente importante para se entender como esses exemplos funcionam, assim você poderá pular para o código abaixo, se desejar - especialmente se você já conhecer os códigos de Gray.

    O código de Gray é uma técnica (em homenagem a Frank Gray) para iterar n sequências de bits com apenas uma ligeira modificação em cada etapa. Como exemplo, considere os 4 bits do código de Gray listados abaixo.

    0000
    0001
    0011
    0010
           0110
    0111
    0101
    0100
           1100
    1101
    1111
    1110
           1010
    1011
    1001
    1000

    Cada valor tem o bit sublinhado que irá mudar no próximo valor da sequência. Por exemplo, depois de 0000 virá 0001, no qual o bit final foi alterado, por isso o último bit será sublinhado.

    Os componentes predefinidos do Logisim não incluem recurso para se trabalhar com códigos de Gray. Porém, os projetistas eletrônicos consideram os códigos de Gray úteis às vezes. Um exemplo de aplicação particularmente notável dos códigos de Gray é sobre os eixos em mapas de Karnaugh.

    GrayIncrementer

    Este é um pequeno exemplo que ilustra os elementos essenciais para se definir um componente. Esse componente em particular é um incrementador, que tem uma entrada multibit e produz o código de Gray imediatamente seguinte a ele em sequência.

    package com.cburch.gray;
    
    import com.cburch.logisim.data.Attribute;
    import com.cburch.logisim.data.BitWidth;
    import com.cburch.logisim.data.Bounds;
    import com.cburch.logisim.data.Value;
    import com.cburch.logisim.instance.InstanceFactory;
    import com.cburch.logisim.instance.InstancePainter;
    import com.cburch.logisim.instance.InstanceState;
    import com.cburch.logisim.instance.Port;
    import com.cburch.logisim.instance.StdAttr;
    
    /** This component takes a multibit input and outputs the value that follows it
     * in Gray Code. For instance, given input 0100 the output is 1100. */
    class GrayIncrementer extends InstanceFactory {
        /* Note that there are no instance variables. There is only one instance of
         * this class created, which manages all instances of the component. Any
         * information associated with individual instances should be handled
         * through attributes. For GrayIncrementer, each instance has a "bit width"
         * that it works with, and so we'll have an attribute. */
    
        /** The constructor configures the factory. */
        GrayIncrementer() {
            super("Gray Code Incrementer");
            
            /* This is how we can set up the attributes for GrayIncrementers. In
             * this case, there is just one attribute - the width - whose default
             * is 4. The StdAttr class defines several commonly occurring
             * attributes, including one for "bit width." It's best to use those
             * StdAttr attributes when appropriate: A user can then select several
             * components (even from differing factories) with the same attribute
             * and modify them all at once. */
            setAttributes(new Attribute[] { StdAttr.WIDTH },
                    new Object[] { BitWidth.create(4) });
            
            /* The "offset bounds" is the location of the bounding rectangle
             * relative to the mouse location. Here, we're choosing the component to
             * be 30x30, and we're anchoring it relative to its primary output
             * (as is typical for Logisim), which happens to be in the center of the
             * east edge. Thus, the top left corner of the bounding box is 30 pixels
             * west and 15 pixels north of the mouse location. */
            setOffsetBounds(Bounds.create(-30, -15, 30, 30));
            
            /* The ports are locations where wires can be connected to this
             * component. Each port object says where to find the port relative to
             * the component's anchor location, then whether the port is an
             * input/output/both, and finally the expected bit width for the port.
             * The bit width can be a constant (like 1) or an attribute (as here).
             */
            setPorts(new Port[] {
                    new Port(-30, 0, Port.INPUT, StdAttr.WIDTH),
                    new Port(0, 0, Port.OUTPUT, StdAttr.WIDTH),
                });
        }
    
        /** Computes the current output for this component. This method is invoked
         * any time any of the inputs change their values; it may also be invoked in
         * other circumstances, even if there is no reason to expect it to change
         * anything. */
        public void propagate(InstanceState state) {
            // First we retrieve the value being fed into the input. Note that in
            // the setPorts invocation above, the component's input was included at
            // index 0 in the parameter array, so we use 0 as the parameter below.
            Value in = state.getPort(0);
            
            // Now compute the output. We've farmed this out to a helper method,
            // since the same logic is needed for the library's other components.
            Value out = nextGray(in);
            
            // Finally we propagate the output into the circuit. The first parameter
            // is 1 because in our list of ports (configured by invocation of
            // setPorts above) the output is at index 1. The second parameter is the
            // value we want to send on that port. And the last parameter is its
            // "delay" - the number of steps it will take for the output to update
            // after its input.
            state.setPort(1, out, out.getWidth() + 1);
        }
    
        /** Says how an individual instance should appear on the canvas. */
        public void paintInstance(InstancePainter painter) {
            // As it happens, InstancePainter contains several convenience methods
            // for drawing, and we'll use those here. Frequently, you'd want to
            // retrieve its Graphics object (painter.getGraphics) so you can draw
            // directly onto the canvas.
            painter.drawRectangle(painter.getBounds(), "G+1");
            painter.drawPorts();
        }
        
        /** Computes the next gray value in the sequence after prev. This static
         * method just does some bit twiddling; it doesn't have much to do with
         * Logisim except that it manipulates Value and BitWidth objects. */
        static Value nextGray(Value prev) {
            BitWidth bits = prev.getBitWidth();
            if(!prev.isFullyDefined()) return Value.createError(bits);
            int x = prev.toIntValue();
            int ct = (x >> 16) ^ x; // compute parity of x
            ct = (ct >> 8) ^ ct;
            ct = (ct >> 4) ^ ct;
            ct = (ct >> 2) ^ ct;
            ct = (ct >> 1) ^ ct;
            if((ct & 1) == 0) { // if parity is even, flip 1's bit
                x = x ^ 1;
            } else { // else flip bit just above last 1
                int y = x ^ (x & (x - 1)); // first compute the last 1
                y = (y << 1) & bits.getMask();
                x = (y == 0 ? 0 : x ^ y);
            }
            return Value.createKnown(bits, x);
        }
    }
    

    Este exemplo, por si só não é suficiente para se criar um arquivo JAR funcional; você também deverá prover uma classe Library, conforme ilustrado na página a seguir.

    Próximo: Biblioteca de Classe.

    logisim-2.7.1/doc/pt/html/guide/jar/guide.html0000644000175000017500000000371311541757140021063 0ustar vincentvincent Orientações

    Orientações

    Aprender mais

    Além da sequência de exemplos apresentados aqui, o código-fonte do Logisim fornece exemplos adicionais, embora nem sempre eles ilustrem a mesma atenção para com a legibilidade e o bom design.

    Para maior portabilidade considerando versões futuras, você deverá manter tanto quanto possível as classes em pacotes de ... instâncias , ... dados , e ... ferramentas . Claro, você poderá usar outras APIs, mas elas poderão ser mais vulneráveis às alterações futuras.

    Em geral, estou disposto a responder a eventuais pedidos de ajuda. Relatórios com bugs e sugestões de melhorias, é claro, serão sempre bem vindos.

    Distribuição

    Você é livre para distribuir qualquer arquivo JAR que desenvolver, sem restrições. As restrições GPL se aplicarão, porém, se trechos de seu trabalho forem derivados de partes do código-fonte do Logisim (liberado sob a GPL). Derivações do código de exemplo nesta seção do Guia do Usuário não incorrem em tais restrições, esses exemplos estão cobertos nos termos da licença do MIT.

    Se você quiser de compartilhar sua biblioteca com outros usuários Logisim, estarei disposto a fornecer um link para uma página Web de hospedagem ou para o arquivo JAR através do site do Logisim. Se você achar que sua biblioteca deverá ser incorporada à distribuição básica do Logisim, então também me congratularei com a sua sugestão, e terei prazer em reconhecer sua contribuição em futuros lançamentos do Logisim, que incluírem o trabalho.

    Próximo: Guia do usuário.

    logisim-2.7.1/doc/pt/html/guide/jar/counter.html0000644000175000017500000001762611541757140021455 0ustar vincentvincent Contador em código de Gray

    Contador em código de Gray

    Esta orientação sobre bibliotecas do Logisim apresenta um sofisticado contador em código de Gray, que permite ao usuário alterar seu valor atual usando a ferramenta Testar (Poke) e colocar um rótulo sobre o componente usando a ferramenta de texto (Text Tool). Também personaliza o ícone que aparece no explorador, associado à ferramenta.

    GrayCounter

    package com.cburch.gray;
    
    import java.net.URL;
    
    import javax.swing.ImageIcon;
    
    import com.cburch.logisim.data.Attribute;
    import com.cburch.logisim.data.BitWidth;
    import com.cburch.logisim.data.Bounds;
    import com.cburch.logisim.data.Direction;
    import com.cburch.logisim.instance.Instance;
    import com.cburch.logisim.instance.InstanceFactory;
    import com.cburch.logisim.instance.InstancePainter;
    import com.cburch.logisim.instance.InstanceState;
    import com.cburch.logisim.instance.Port;
    import com.cburch.logisim.instance.StdAttr;
    import com.cburch.logisim.util.GraphicsUtil;
    import com.cburch.logisim.util.StringUtil;
    
    /** Manufactures a counter that iterates over Gray codes. This demonstrates
     * several additional features beyond the SimpleGrayCounter class. */
    class GrayCounter extends InstanceFactory {
        public GrayCounter() {
            super("Gray Counter");
            setOffsetBounds(Bounds.create(-30, -15, 30, 30));
            setPorts(new Port[] {
                    new Port(-30, 0, Port.INPUT, 1),
                    new Port(  0, 0, Port.OUTPUT, StdAttr.WIDTH),
            });
            
            // We'll have width, label, and label font attributes. The latter two
            // attributes allow us to associate a label with the component (though
            // we'll also need configureNewInstance to configure the label's
            // location).
            setAttributes(
                    new Attribute[] { StdAttr.WIDTH, StdAttr.LABEL, StdAttr.LABEL_FONT },
                    new Object[] { BitWidth.create(4), "", StdAttr.DEFAULT_LABEL_FONT });
            
            // The following method invocation sets things up so that the instance's
            // state can be manipulated using the Poke Tool.
            setInstancePoker(CounterPoker.class);
            
            // These next two lines set it up so that the explorer window shows a
            // customized icon representing the component type. This should be a
            // 16x16 image.
            URL url = getClass().getClassLoader().getResource("com/cburch/gray/counter.gif");
            if(url != null) setIcon(new ImageIcon(url));
        }
        
        /** The configureNewInstance method is invoked every time a new instance
         * is created. In the superclass, the method doesn't do anything, since
         * the new instance is pretty thoroughly configured already by default. But
         * sometimes you need to do something particular to each instance, so you
         * would override the method. In this case, we need to set up the location
         * for its label. */
        protected void configureNewInstance(Instance instance) {
            Bounds bds = instance.getBounds();
            instance.setTextField(StdAttr.LABEL, StdAttr.LABEL_FONT,
                    bds.getX() + bds.getWidth() / 2, bds.getY() - 3,
                    GraphicsUtil.H_CENTER, GraphicsUtil.V_BASELINE);
        }
    
        public void propagate(InstanceState state) {
            // This is the same as with SimpleGrayCounter, except that we use the
            // StdAttr.WIDTH attribute to determine the bit width to work with.
            BitWidth width = state.getAttributeValue(StdAttr.WIDTH);
            CounterData cur = CounterData.get(state, width);
            boolean trigger = cur.updateClock(state.getPort(0));
            if(trigger) cur.setValue(GrayIncrementer.nextGray(cur.getValue()));
            state.setPort(1, cur.getValue(), 9);
        }
    
        public void paintInstance(InstancePainter painter) {
            // This is essentially the same as with SimpleGrayCounter, except for
            // the invocation of painter.drawLabel to make the label be drawn.
            painter.drawBounds();
            painter.drawClock(0, Direction.EAST);
            painter.drawPort(1);
            painter.drawLabel();
            
            if(painter.getShowState()) {
                BitWidth width = painter.getAttributeValue(StdAttr.WIDTH);
                CounterData state = CounterData.get(painter, width);
                Bounds bds = painter.getBounds();
                GraphicsUtil.drawCenteredText(painter.getGraphics(),
                        StringUtil.toHexString(width.getWidth(), state.getValue().toIntValue()),
                        bds.getX() + bds.getWidth() / 2,
                        bds.getY() + bds.getHeight() / 2);
            }
        }
    }
    

    CounterPoker

    package com.cburch.gray;
    
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.event.KeyEvent;
    import java.awt.event.MouseEvent;
    
    import com.cburch.logisim.data.BitWidth;
    import com.cburch.logisim.data.Bounds;
    import com.cburch.logisim.data.Value;
    import com.cburch.logisim.instance.InstancePainter;
    import com.cburch.logisim.instance.InstancePoker;
    import com.cburch.logisim.instance.InstanceState;
    import com.cburch.logisim.instance.StdAttr;
    
    /** When the user clicks a counter using the Poke Tool, a CounterPoker object
     * is created, and that object will handle all user events. Note that
     * CounterPoker is a class specific to GrayCounter, and that it must be a
     * subclass of InstancePoker in the com.cburch.logisim.instance package. */
    public class CounterPoker extends InstancePoker {
        public CounterPoker() { }
    
        /** Determines whether the location the mouse was pressed should result
         * in initiating a poke. 
         */
        public boolean init(InstanceState state, MouseEvent e) {
            return state.getInstance().getBounds().contains(e.getX(), e.getY());
                // Anywhere in the main rectangle initiates the poke. The user might
                // have clicked within a label, but that will be outside the bounds.
        }
    
        /** Draws an indicator that the caret is being selected. Here, we'll draw
         * a red rectangle around the value. */
        public void paint(InstancePainter painter) {
            Bounds bds = painter.getBounds();
            BitWidth width = painter.getAttributeValue(StdAttr.WIDTH);
            int len = (width.getWidth() + 3) / 4;
    
            Graphics g = painter.getGraphics();
            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(InstanceState state, KeyEvent e) {
            // convert it to a hex digit; if it isn't a hex digit, abort.
            int val = Character.digit(e.getKeyChar(), 16);
            BitWidth width = state.getAttributeValue(StdAttr.WIDTH);
            if(val < 0 || (val & width.getMask()) != val) return;
    
            // compute the next value
            CounterData cur = CounterData.get(state, width);
            int newVal = (cur.getValue().toIntValue() * 16 + val) & width.getMask();
            Value newValue = Value.createKnown(width, newVal);
            cur.setValue(newValue);
            state.fireInvalidated();
            
            // You might be tempted to propagate the value immediately here, using
            // state.setPort. However, the circuit may currently be propagating in
            // another thread, and invoking setPort directly could interfere with
            // that. Using fireInvalidated notifies the propagation thread to
            // invoke propagate on the counter at its next opportunity.
        }
    }
    

    Próximo: Orientações.

    logisim-2.7.1/doc/pt/html/guide/index.html0000644000175000017500000000530311541757136020323 0ustar vincentvincent Guia para se tornar usuário do Logisim

    Guia para se tornar usuário do Logisim

    Logisim é uma ferramenta educacional para a concepção e a simulação digital de circuitos lógicos. Com uma interface simples e com ferramentas para simular circuitos a medida em que são construídos, é simples o bastante para facilitar a aprendizagem dos conceitos mais básicos relacionados aos circuitos lógicos. Com a capacidade de construir circuitos maiores a partir de subcircuitos menores, traçar conexões com um mero arrastar do mouse, o Logisim pode ser usado (e é usado) para projetar e simular CPUs completas para fins educacionais.

    Estudantes em faculdades e universidades de todo o mundo utilizam Logisim para uma variedade de propósitos, incluindo:

    • Um módulo
    • para o ensino de ciência da computação em geral
    • Uma unidade
    • para níveis intermediários em cursos de organização de computadores
    • Mais do que um semestre inteiro em
    • cursos mais avançados de arquiteturas de computadores.

    O Guia para tornar um usuário do Logisim , que você está lendo agora, é a referência oficial para os recursos do Logisim. A primeira parte é uma sequência de seções que estabelece as principais partes de Logisim. Essas seções são escritas para que possam ser lidas "de cabo a rabo" para se tomar conhecimento de todas as características mais importantes do Logisim.

    Tutorial para o iniciante
    Bibliotecas e atributos
    Subcircuitos
    Conexões
    Análise combinacional

    As demais seções formam um grupo heterogêneo de materiais de referência e explicações sobre aspectos menores do Logisim.

    Menu de referência
    Componentes de memória
    Registro
    Verificação por linha de comando
    Preferências da aplicação
    Opções de projeto
    Propagação de valor
    Bibliotecas JAR
    Sobre o programa
    logisim-2.7.1/doc/pt/html/guide/bundles/0000755000175000017500000000000011541757140017754 5ustar vincentvincentlogisim-2.7.1/doc/pt/html/guide/bundles/splitting.html0000644000175000017500000000664511541757140022672 0ustar vincentvincent Distribuidores (Splitters)

    Distribuidores (Splitters)

    Quando você trabalhar com valores multi-bit, muitas vezes poderá querer rotear bits em direções diferentes. A ferramenta Distribuidor (Splitter) da biblioteca Base () lhe permitirá fazer isso.

    Por exemplo, suponha que queiramos construir um circuito que calcula bit a bit a conjunção de dois nibbles (meio byte) de uma entrada de oito bits (os quatro bits superiores e os quatro bits inferiores). Teremos um valor de oito bits no pinos de entrada, e é desejável dividi-lo em dois valores de quatro bits. No circuito abaixo, usaremos um distribuidor para conseguir isso: a entrada de 8 bits irá conectar-se ao distribuidor (que se assemelha a um pé de pássaro), que dividirá os 8 bits em dois conjuntos de 4 bits, que irão para a porta AND e de lá para a saída.

    ()
    (Figura do original em inglês)

    Nesse exemplo, a distribuição acontecerá na verdade ao se separar um valor de entrada em vários de saída. Mas os distribuidores também poderão combinar vários valores em um só. Na verdade, eles não têm direção preferencial: podem enviar sinais em um sentido em dado instante, e em outro sentido mais tarde, e ainda poderão fazer as duas coisas ao mesmo tempo, como no exemplo abaixo, onde um sinal será transmitido para o leste através de dois distribuidores, e em seguida, será encaminhado de volta para o oeste através deles, e novamente para leste, onde finalmente chegará a sua saída.

    (Figura do original em inglês)

    A chave para o entendimento dos distribuidores são seus atributos. A seguir, o termo terminações (split end) refere-se às múltiplas conexões de um lado, enquanto o termo combinada (combined) refere-se à extremidade do único fio do outro lado.

    • O atributo Direção (Facing) dirá a posição relativa das terminações considerando-se a extremidade combinada.
    • O atributo Distribuição (Fan Out) especificará quantas terminações existem.
    • O atributo Largura em Bits à Entrada (Bit Width In) especificará a quantidade de bits combinados.
    • O atributo Bit x dirá qual a terminação correspondente ao bit x na extremidade combinada. Se vários bits corresponderem à mesma terminação, então a sua ordem relativa também será a mesma na extremidade combinada. Os distribuidores do Logisim não poderão ter um bit na parte combinada que não possua equivalente na parte com múltiplas terminações.

    Observar que qualquer alteração nos atributos multiplicidade ou largura de bit irá recompor todas os atributos Bit x de modo que eles possam distribuir os bits combinados da maneira mais uniforme possível entre as terminações.

    Próximo: Cores das conexões.

    logisim-2.7.1/doc/pt/html/guide/bundles/splitter-circ.png0000644000175000017500000002134311541757140023251 0ustar vincentvincentPNG  IHDR_p0BsRGBPLTE@m?1)8/ei(Y7aa)<2D2./-R*#> Ea=7W41a78xADLA/XKUdcHsD2zTRVL@uU4p{|`KpmjUreD~ϝ 2pX0~tr7|M{pX`BȽʊ@uO܍5YΞhҝ^^`+sՠɰLu̪XT܋ևԼb캎ƅ̐mչֺَܪٌʧEmtRNS@fbKGDH pHYs   IDATx흋CH *E|U*ZR[ {] ۖV {%w?d̤yf&c|/3_29s̙Kt2 ҥBQ7Tw*#~+-Zv%+Gz\@ω& yrPvRy jˬS'ŷX /)l|ioV y=0f~w9;&pUĀTKYqn? g 1b5k4!EQ8{Ae&ԗi*+M k - /B2?ܷo:)JS~`#li;|)#|wC4ag;;Nߚ E "FeYD2kqz0i'lr|F0Zm.]{gJw&_d|3myOg 6>~ER/(=wnP|sbDÉ{` ~=7 \-`;]|5FЄš54\ž?bM}wl/0`YC_[8q}AsKЊӁY0w(?G U*;Rx+PVjh |݁|e}o ν١ s5A2 l/T NX[4& q~рJh>: /5!IR<+IW.o >>+w./C~VD֙31>CJ`.X\7/bO`wwӳp5&X PS/aЀUMYմi{%Mg 3L.1tgpf*Zn|g=?0ЀLBҀ @pd+(~5=7.E5` %DƗN$؀` ,B;ue:koǏCisZTJe_ʳJeD竾M+hMRcd p0{3 `M34ky.=W .MNy߈% '9a3嵡5X\Zpu։2?-"|~JidV {$ })ӆ@UµC*x{2} ~u%XECͳ=O3 zWzhO8gW RC&/xon`~m2/]]mmww녥]$mD>0}}yb> Nv+זe +EfÑIG&ٿ3z! ,!%w*7%׾GF~NJNJ#ݻ`ѯhyk^)ٟ]ѻd1_TG/>PS%w'{نØ%> |d6@wy58wBɈiw.uch=?x`ȣI^K0+ #v~IHfK?R > ]" *쾎~&Q+!:r ~`>%< < j/*$OXx$J'n]W C6 Ϸ_ivXo?v+_C/\V@#.FרK2XND!dF'#'[Ȉ}{ =٣}Ƴ3up WLK׾^nt\q_y7O# Ņs0ܟ N,"eT;o~gi_m]VGJBAW Ru 厯ĕ ) o*% k~!yglKlpGڝc!0$f(/Y+J)%ɳg#޶a@kQ"98[?.IQ.ߧ~fԶ%)9% >}|)#7 |!ED~Y 0p Xs 52;R{ߧ;3uu{ ga(ECy|Ǡ>7;B"݇x|%yW`WJlSP-2E||r,P_ƣhR0O>T>fU7)dp!*[\[d|Q-m߷~&ٲ©?C}?9 C^Gڀ7q=sF9[g󅾗 "6w"Ne|nB'5+/M|n^++S e˹pj$*7x_4<i/.+eמ>Mi3b7e\!I M.<o0d_|k.nϚد/쟍ŗz; pKk_|0]F>66ZWa ĵ_xFkʑH\|+1_9MeRrP|1eCkkqT6.m|G"USf$g^ȧf1~CbemnޢL1l\<f{W{0(d\̡fb6˕Bׁ邪vwf`oN ~984|9WAaZRʅ~S[5;pjJ !2Rk`eǪ'ceU%"u7W1ܢLUǣɆf ~⫞}I=,8d&y;^EoC&__k:Gaj|\_|د6_>`/u7k (^o7Y_B\) eگn6h F|#qBI_Jj1[kXr|Q/~i?/X{:M#&dxC:xo/o:,=vP=$Z?[B+o] tZvk>poj!7j>3C׵ :_/oH{?;邈7򅎢 ⿁M * oB⿊7o3I_V(8\|_3`2n|SCכQ{>Iz c5b2>!1g_5+mZb/dxl⻧_*ו>B%"+zo ` [Exo7Pz7gaW^Pԫ5tw4lM-f3c {|ۯo“o"hsWoo a-__7zRuׅ^Rul;~_B/I@.Y;~|֕'Ie5 ;068[dק^"fgU}\l"$;g5V?b}GDk|I2$;>pg生6ɾ|]ߗ G֕HdCbT Գsfϰ*9;u]mqWh5oQV;.yí;>`E^eW{ o,4Lcp[ؓ6eXao~>XzPl8|m]O/F7)PHS|Mm04'h߼oDaE6޹?lucsJQ߽^[Wlh·ArYN K5_.%Iq#_h6}t䂯lgux1%HWO_ۚZo2C܀.a_~k.΂u|h.n#f yl䜲F$Ə15I-|Y0oׁpyQ֬@OcUOt5BL=q!jp-0*|k: ~%Ht։Ϸ3ojyOcuךM$z_lFM|ǽد$Zo_N_yoo/Tcn7Kw^0~δ%ܹ}cwE]k1wop2>%=?kNRmi)_ؕm|T*s*$؊/~G%tm_ۼ~72Qt.7eגm5G[Ho{]?AW?~~ Mi3j=^틎 )?(s]>dO A>bŷE~WojTm)e_W|ۯ_.hWFxF|r4eYD;ޭ(W`M\Q[%"QUԷZogo'o/VߖuU`y_|Q|}'دŒN[ϺkwLbLd~ !/  $Oʓ٤T{Mf_bױJ]wL0L97?4<\k>J)|tEøۋ?;ވpn)_ʄ/:sO׏mio+b]|$lȩwtS"IT j,Y9|!*[w̗t%`j^&j73_oP3mg-|_W|y|_+ڛ q̷W|O_Vr'_S {Yԭ0sG;nͿ)qj0,!sƗʿ'4KЃL\`I|7?)_??|eGq.?_AeJo$Y_*?pr7rboono%w^7TM!lwhķF lJ6Z{|[Wȿȿɓķ W|O5_r}jP|EϗS|E͡oʌ4ȿKCstso_u #_7mo K戯[7h_l_̿ oMo?'V/z|jf+jJ_]vo;olFW6 ߐ?&Nn_|[7!8['s`7M0o1[sq[VZoNr 'cokȿ9y[H߭Mo15 FуҌO/ο:Mؾ7&rkoϿW_W οxF"Sټ_9+/:9YZȷ.=z=t3kh!_ʙ.j o )_sj7 !6s—"p| ο$W|_ߚQaYu=߅ ~[hkZ2+_[o_oŢz=E}TzQ$^)?T5W|#-[8Xn\;ˈ/bJ[(E򍶞o6z|_8 0ۯ0xvӶv7I4{Uos蕯o*kW;f/^g(-[j*>͑?p.4ߢg2y*(/F-?H]3C AUr]R;fZYp~c/o7C҉6K]jשk6[t(x|[lV冀IDAT?c)=ʟMogC&-+#WȲʷZRUpz\C'U s%`_|izNcc2%C><|_8 x|)~̥W/[x̟uoo9o/=@Z<v3@/!s@xϜ}BA:3|)tRNS@fbKGDH pHYs  IDATh PEQ #Q Y.=t7BuCF_p2B%CWd5'Cq*eWq}BUa@aR,c4jqB >y آ+])f&+~{-UXf\MlbP3*íEz+NvBEC꤭Y򷨒=5f-Z3r3`nP^7}Cbkи242г >b^7<9;V!)ʊk ^ J^Yy wbӽTAQx*gIZKUN]Zc4*b@j1n A*BiaP+*[`Ph5Zp)񂴻R Z;N< I,w0;V8?'Z(*M|Xe?=IENDB`logisim-2.7.1/doc/pt/html/guide/bundles/probe.png0000644000175000017500000001417311541757140021577 0ustar vincentvincentPNG  IHDR_ sRGBPLTEEo$71E9`V6(RVk)=2D..,R*#? Fa CR<7X32. WHID{B/XKUdA,'^U{USL@u5t|`JomjTrD~Ϝ2oX~vj75?X`ۀ#~GuNYЌ\򞠝]gҝ^)_sՠɰLȒu̪XT^܊ևセRboչִ姾վޫٌ<5tRNS@fbKGDH pHYs  wIDATx݋Cp],o}4d bN4'1ANg+ptrmec~~>Ƥ)"QC8XvZvG٩|ۻh*2~'|y*uܜPUAg*U ⻲ܱZWWȋ,D$":Ni1aV weMgq)1):O/};1QJR06hkx/T  9'Db'70x}᯿[ JKՇT_tߵT. SkSlV>8&jƍH2n{i{w[}t<Ƿp C;ܞ(Y6&q6oC磑 [9k;r|wF(|_ޮxO # }%ٻ5|1AoȂu޶Ao-J'O1i gTރ0oHԌ8]1oFk};3kv_tË|_{<LWM{*ɾXw jqZ8h\?胻xmgrn o;S'8 3Ŧo}سm_'7mi x۶N72I29-3X\; o |G3"lqv4_5Zfֺ<鉡vQ׾Kҵ7\³\x*PGQ Z L5}SZh3Ɔ66fsBIw _m5o-x KhQ/fG]ҕƾ 2/^u<)f_!#0urY}LZh '9/0xvO;!nèw}gߑr[Z.7W,%f0hawd2X;R;I` o[avՙԇMG8bP㦰k >( ?_pÉ;Bb0IB0iĦx]oFRmcWaft䛄!!(&ʮdBihm=|6wqr#k)7Y 7'K}7=HtLF|F` lz&nOݼnH55B#]qFߍk#;#3':Ʋ7Ձ/R#vЋ?d[> )壍/ބmaAXsKk~uu^iu%>{ e1ĶkV#;kq;ZWBnD7\[Fݍ);N]dKtƸaiYbv໳T jv7>g?j´|?Xvl&VGO/ϳ=n2Q0yQi6khE3˶p{`Ɗ? C\Wk8To0X|m^9`z#fl "l&:|P!Qs h]c^o9J+Ja[_pu8j(A!M668T6Ʃxp}]dMklOW2 K|P}d(#hҤGQ+'šor[1E/Hw#N/+ooIx%,5.8dxVߓvօ m2y 6^ ;iXPƿ7k7Ma7qbC)鮬ة.}>Z ^?>/@,߿wy= m@ :d߱'e',l fƺx-֧8k)z965ee'I3>y}8%P0iF7i. usqAaZ̓~=}e}'{~~pcݴʨ=Pơ/c% fE0=TmIr}֍u/ԏ.[n ^`8nů YK2t?H?'աo3gO=`)f@ d1˅|t dp,7h2g U{Atatu_ sW?JQA<9n]l^C28=X_|]W /[etgi#oQM.닄!YO)}7y|" W4  |ѽk%׭{"߲H[A"zGLJS>ΛKZn+-PX8h.PI[b:I {L~ǹ-0B=B=?G%*J;V'0 ͻ6} [zG=* OĜ K1T+_J7H&u_|}5)h><ۣb{HMʌ.;~_4|}h:` |#=Lz|K#oI[#nV_6S}I+JC,Z}Iӟ@wLY>| >֬>hDnj=>צ :! ۷aT [Dp|I+$(Z|촆[}!uE oõ޿ 7=&J`v\ob_[ګtvؿ)ߙ+֍_罔 ?ybWWe 70K2K~QzB/fe|dxVҗOJ}ɅB} SSamY 泥|KglTGݓ璘_~8fA:_ 'uY_W '_q| B^َ.oJK׸2ѳ]cx쿱/ 6Zi xF- g7h8){=ذ/*}=-u뷥4yͤ7e|́,m>GǛޭnlNXZ^&I8n txRt_fݥaNF}YEE9‹}wwԷג0yH}mn^ʨy[v:7Ox6sֱ1aM.<}/li~CzvkÕnw_ Js_z>s[bW|<`}_хm;\A!|A#ߛ_[G2(> |oG0<ߨQc}7aztWde` jJut[ej^ʪ ,R߈}~[a{|աr0,Ufk["}MᲾ7N  ltJy:_߀+_N |&a:<%_E@}}.Q}JK˞L73^E_wk=%sxa8p})˴ 8SӞ_|ݥ ֗X1p__yN}O nE ,DO^)}7 EFo?S՞?iA[w/;Vu~L.+~Ro\Bp k=%P;9}V}+? ,G˜I|cX|Wo9_oCoپ;ȼ 1l? zpk!nL_O}a}OLRח*W"`7CyNN6\J*2-&؛d/wq F|s_;9y}+:~_-_~{|]c|Cz_3e _b>&qo/3-[u**|C kN.JnUuou?Cg׃6勞ѷk0z￉~*"~lC_}}VO T·Dp}M>;F|ק{6Sw߱}|.W;&}ݔPwnHH|cb@~Wߪ}-?h< }}PwAJ_+}ϥ(+~+}Wnd}WwT{wT{W+}J__}J_|{WyYLzK_HL__}O?#}m9}B]=ec{zúA_7g\b1s{˅bvx򲡖\n֭[/b.ũ%'œD1?WptsяߋGåe5a*|>P4^X(N+/``bJطX}WN+ar W|og׿A^?$߉/*lsׇJ}eoߞB} /^E=+)c/;<\C_!N};;EU->. sjWࡿnl 嘷㛪nʑonkؾA[}Ff|w+\\v+סp<B lˌ/v+h?<]Ͼs/ob^YS2kf쿥5km-*/Ǣr3Jb-ۿ^8ķLJ[#2 72]Q bt\uc5 kJ'Qk#9bߡiDuG~tcqĭ;zF|ܮ(:JGSSGr3W!]! 8˵+MC#@x^"šUIENDB`logisim-2.7.1/doc/pt/html/guide/bundles/index.html0000644000175000017500000000136111541757140021752 0ustar vincentvincent Cabos

    Cabos

    Em circuitos simples do Logisim, a maioria das conexões têm um único bit; mas também lhe será permitido criar cabos que enfeixem fios empacotando múltiplos bits. O número de bits que viajam ao longo de um cabo será especificado pela sua largura em bits.

    Para criar cabos
    Distribuidores (Splitters)
    Cores das conexões

    Próximo: Para criar cabos.

    logisim-2.7.1/doc/pt/html/guide/bundles/error.png0000644000175000017500000001606411541757140021622 0ustar vincentvincentPNG  IHDR_ sRGBPLTE;e7+_;@UW6(lcd#(: -B.., 2R*#<1% Fav2;8"GWT7_6GIGVG:LUc.]D6MHTo5eTc^6sw|\HSromje"Iќ~sF3s`7ȸyuX`DĆ>{uN ݍ6WYΞ^gԻQ)סhԟsخu̪܊ևҼaؿZݍ̼չ҉ڏ~ܪ秾ٌq;tRNS@fbKGDH pHYs  0IDATx흉CH ",-H-D)r Tۊ]x͟{H2L$Q0_I'tɓg̤26QLV߄u{R}G&5Ȯ~w <2iޑHtuI׵5"JRb8vzq)gTqt)._Hʬ=2NX﵄NM-OMQΑ7n؜o ٽ]&|U =z}~cS{ۚlO[;E쌰Ɇn͝vRzCe7/4]|gtzoXUzIp`kweeuİE_ ߕ_ ȗŐ M;U%B RSZDlLX5`;#T KYɓ'5w?+|0S9 UQe Yj0,.=C 8eQ\ WwTj; -=Xx,b}; "Pn'9-$l%|m|_Ǖ++ez ^#H:lw9R’x3 Eby2ъ/9\B?;xp`KTE+ݥK`}Vldoѹot6{?-ߖJgJ^1xXW\͝"2g@E\l K&1Xߍ]J!òoܩ— cπ/.<0NhbTzgJ+V|Haf_|hq_J a9Λ}Z\NWų{Ri;-˄"zUt|YƟh/Ђo)P)%SCGX"|n~z**G258פzgG?ORxlջ h(G"yL`ʧ譍h_dvW^=䡣54:CEO+-aBǠ|O%W+̷ל_{ݑ~{VٯJ֍E)+BƙThNY"[<ǝes0}2i —PСyuzcGiym)_1`{t$Y ^urϞX̚IW+f-_gƔ=}ҤHkk|`]5'Hr_w~7덳!l=Sd+SR+3m+#=eWM qKq `|]tN:dJqJ:#Leo~(L{Bt, a- 輤!rWx;PP6A FF2SPv r[ixA=(]1$p{˭ٷ1o GC~6m(S-^r0L2LB p48™r]2@V1!172hz·G/}5ZMC ɗ|1-B|؋r>XݞYS?n}: a<_%(djE7;˹ NF=M}ŷ/9.S3 $rAhzȏFw(|Wi4Ϙޓ |sd5nh g^=_7?P@4wx?tU=!r0ȷNRFO6!|=_0>I2-+u۲$ϙPҮXElpesg[/xEDMI6!&,IaEX1J.Ex$3/U9{B6w]2β7@}$*`o3%e _ٜoH;<_\6S4#_I\CBW,jG [0-Bz$_u|wG/NSWqҕB0/EXE|:݉/.m7|(فqY&)u ~vc5ȀWǑ5`6\RZ?6d؂X̷*|/]ؾsihxMQ-sp?4e4aV?[d6H" H^+VÅGJؕᄺ8'$yxi3piT|eyis~w~߷sP %JV?bᖡ[zy_~nvFk/E}IݔƟ;-R RGd-YKK:-yCvkN~້.-U|a:_DƧI\j;Y|fi_RWb4q2'$仉<w,(ǝ3ߕO|sɩ'$⻉ߗd{ûύj:|m\7<|4ztT=Vvk+V+e|NsN]$.jGɻruMPY Ɓ/⻾n_|~9̍1|SVTm4uSԼ;K[xy{60_72_x=ؼ[vcj`&'*k?U*Q+JG3|w&bcg,_gpp /zk_{ L_ q̈́jnWR hx+w /9 |,헖Lc|Nm엜wY=|ݺX_%b)k!|~R㛐k0ZxopaokRπ|SB|z$8YPMjٯO{^~m>/7(_囥M.Y=_`YKLdAB;zD4 v̙?M" " 'Nv/H/젏;K\5p&0eHpDq.v|G=ϜINJ!!_+~$Xin=8dX:XWzDØr<_7J <qZ+~ڹ͝fYV^G?T*u`;h׳њ 2 U[br#wnJ}F弎|?NeM/p,ߴ 4MP^!r#,H,Q⥀n<~~_ G\qXww_m{N_4+W(_o{ht1rXxy(]z6o}sssuo2_RunL&u|;6 l:i[I uӪ@\3̗0?8kbew/{-j 5!yWi0$bP|poUblfFAAw|hǙ}jn~=m؈]L/31{ y';6a \Mp#MLg|I}aw⫌-uV} ln~wF}%A5M}~͂k>\QCj^C=G i5Ovz'5hEp-wQ ;-YH0e(0_yzo39ؼӇnj߸ ~%SX\LP<&q>*TV|jPOr|>Z9$@|}?7_>7`l1 k\Dͫ4=_:dW6tc"}ykš'U} }[M+wq¤,e/NS:nsG+kD0+k>BU^jtn{Ki&ɗߘbi . t+6/rflůlr,{Kg|v5:}-ė-؛5i}+kӼǑӢCSN4w72_ZBiF|O*x=|c'-xU8_>G|0}_qiHoo+acM]+~?ɱ_=ߛf~ջ\z?:Y|'zkn"le ߚc-;|:i2{;#yy ZI/GR)̈́FԯS_9Mi?M,w ڞTS)4?USݽtmuʵ;Mh?C `&vj mMMm''ohB[o/4O$mj|B$ՆCgfgNFIENDB`logisim-2.7.1/doc/pt/html/guide/bundles/creating.html0000644000175000017500000000526011541757140022441 0ustar vincentvincent Para criar cabos

    Para criar cabos

    Cada entrada e saída em cada componente de um circuito tem uma largura de bits associada a ela. Na maioria das vezes a largura do bit será 1, e não haverá como mudar isso, mas muitos dos componentes predefinidos do Logisim incluem atributos cujas as larguras de bits de suas entradas e saídas poderão ser escolhidas.

    A tela abaixo apresenta um circuito simples onde se encontra uma operação AND de duas entradas de três bits cada. Observe que os três bits da saída resultam dessas entradas. Todos os componentes tiveram seus atributos Bits de Dados alterados para lidar com três bits, na tela, como exemplo, alguns dos atributos da porta AND também são mostrados, e dentre eles atributo dos bits de dados (Data Bits) igual a 3.

    (Figura do original em inglês)

    Todos os componentes no Logisim possuem uma largura definida para cada bit de entrada e saída. Por outro lado, a largura em bits de uma conexão é indefinida. Ela se adaptará aos componentes a que estiver ligada. Se um fio conectar dois componentes que exijam larguras diferentes, o Logisim irá reclamar que são "larguras incompatíveis" e indicará onde com indicações em cor laranja. Abaixo, o atributo de bits de dados (Data Bits) do pino de saída foi alterado para 1, e por isso o Logisim reclama que não pode conectar um valor de três bits com outro de um bit apenas.

    (Figura do original em inglês)

    Conexões entre elementos incompatíveis (desenhadas em cor laranja) não transportarão sinais.

    Para conexões de um único bit, é possível ver logo o que o fio transporta através das cores verde-claro ou verde-escuro do Logisim, dependendo do valor. Ele não apresentará valores para as conexões multi-bit: elas ficarão simplesmente em preto. Você poderá, no entanto, examinar a conexão, clicando com a ferramenta Testar (Poke) ().

    (Figura do original em inglês)

    Esse recurso para sondagem é útil para depuração de circuitos usando cabos.

    Próximo: Distribuidores (Splitters).

    logisim-2.7.1/doc/pt/html/guide/bundles/create.png0000644000175000017500000001547211541757140021736 0ustar vincentvincentPNG  IHDR_ sRGBPLTEAtA1)8,cW6(jZ\)=2D2//-R*#? Fa CR2=m=7]530 WHIEyB/XKUd@$$`zTRVL@Pyu5qz|`JTromkD~"œoX~tr:75{pX`Ӏ&D́QnNYΞ^^gҝ^)sՠѯPu̪XT܊ևセRbh̎չۏվ܃ޫٌпNtRNS@fbKGDH pHYs  6IDATx흋C]PWqrRصU{XXV`ŮlTˁΞ;$3$M4ҤI:;LZZZZv\u>H]L*vj1'NZ_|uk~mƤEWѵUV/k+E0oH5>uQT'/ /e__kt͸%Rrp`%SV;{o \1Y MWl D`k)lN[4A (̻l.9ϖn#솯AУӞuW4EQzb] |_\. z\5y{)p`{wmm} ı)ߵ5/o7U~1Z;~m=8up I˓3;l=Rt^{ꆟ[<렜iq"j07m,\,7M)p:\\ > Xs^>9DOH]Ib; ԭ6m-|miDkFޭ-\_[{gc$ˡK<0N p ؎S>=#zsO_.>UC;/U|eMV;@[d 8t\I"dU~a[ 5+/X2Gx})^)(vX|Uf|)46S|97^ط›\C0.;20%j8H$|߂P&x{4zoJI,h|1!|>?yCmV;J';X97ZL3t?7>c{Bt P ~$ ±2lN.RpPlnk>3LG d!Y,7\+oVZ7ؐ'h`+ό/Ǝ:ҙ|\bCگؚ~a C_+Q8yۯ1zHՏA ޏ1ķ` JtPoCy $h9**KVQg7A |`wޙ%[!5aI?^Mٙo/LNbq+}PqۯbՍMh gQcj'ggnAwٜ# *i6K>~zކZlv)W⛥x-r3N.߳-B3U0mUeI7|0.24/Yf2!쀯33+SPB/3 :;)O&lW =T-J&ǩ9)嚲5(Waw<( |Z6W eq*j'Up愰7;O/iuOuXUB&>J!|B |C' ߯!l=jG \xsta&k@ S`4BF04 DôvQա'?okB aZ+f~ ut60_wvv>]!V4[0"{ggZl4VnvFDw>ߚ>vwr]|g< ?5t;w|S>KGãBO$ֳ+> njXzvJ_:P+ʼn ;jprrA?;Fħki8ir;Aي!@GQoC#;bc_ Qko$ToO\v\9?AW !;Q7:0:þ>=zv=@S <}rNӼωk|dAv|4Nu @;+?w`a_ ? v|gx*~fC/B=9? |ON/=ةoPa_?7c++Wj})%E}>|J$|;zt1`0{t?peȿ/=̓qzj?A._2z;}-}ru~?[5x=uBQ:w"2UB<6-S]:, 6_wC7\!ߪ=5rS?C#/j=z||X=V|?+ۚ/+gd;e뙯|-u,eII;be֐+9_)1-z՞/V?S$`AIbEµ_|937@kOWy^I /b€T++]fxd@J6wdscb߶fO)†on K5r|c(:`Yv[}ˀW_EF X.2/)|R/OqXT|Oa|,z,~cdS:ۉv 6׉bHp5bb2%%#KJrn#|/ְ|Av$|t;nkA/b_| y#o$qi.6|Ur%9_{" }'bݾ3VjLe"ltWb|CJ{' >'s1|}o(|1VH(?e|鸺 O "##q-'$迀t1p=!#EY]rtt # /|wo鐯s_| <&h/rHp ~ъFY㻝'f|vuxn!>Ѓ!'muSwگs_ _0bo[ZY<ޕo}=]4߈-_oE/,x狉C=9H'$ x?boߖ嫺Fcf˝GҦ$o; 48ow|b!YhBRy$|T;M✍uaYF26w|5 *߷!_~Y%|ISw?j3ט+LB~5 VBnbc?%gcaLv5c%ʱn itppPl5>߅~nx@i}:dC ;<8Ofݠ|/U}L"nl)ߺ_te9){PUFj`͞@ܫp#o*emU\{asus,Ga7Ld*Dž9:ۯgaZC%npu;m#_$0/|˿F.l+_4`/nrP%-)jJدvV@Cf)Zk4~ _Rʿ~Vh:_ Z.֣T>K$|S[ҽIo\㫮kWr[9_g?_*L|S_[˕,盒U!gƵV T9Ґ`?*uW_C7*w[%NfXKGX|"S /!߱S1yH1g2?Tɀak- v˗:ޅR|!m\^qWB&W➎h|Ze{`5ōemi_]w9%ڵ@WnևgsK^N m?](`_hKQ-GUS% 6cuyw@|%Ǩ-_nNeovQ@%/ANi49?[+u\M LɴBw{Ԟ]ilu:v8 dgqM+ 8 |ٝm5v]>˖/u~9ߠh'M|85kQ?|R|ZMw05L˕) wP:(.|N2ې|Ms![9_Bgo=J|uF7n#qC&i m?#yfwx$# F!_+j+lF;hJ ':T &_hۑ6Y'wŕO{ߟ$O}H.`'ZC22O+ަWv7v՝f  FH/|[hqL+n}ߎX=YM}j;Rg6ۍQܽgF60Q.ٹWvBYx/+oj<|۹o\4QN{6r7k %oȷ>'|; |j|ph}VÐofZ|7,rٯ8c"ݶa3|o8Mw^9~>N?}Q`Km搩[B͕qOƗt17#>-ðk>~|ѽ{v:~<ք| OWIZ!|ܴ|Ow~LcDJ|' TWmt{F&KQ`P4; 'vto} _H,e[{5%(O:88pHQtԛ.F2 u·dͷT1tWF["#`o//Kik|K^&k|kyjW$ON)@^Rb5K/o$_ @^.8XMǷ,w,_HC|kwcn֚_!-\.g`QUnxX6+ׄsȷgDo/LN[}r·C&Ca+[TR(?R~J"U=t~CVWnSk:~}O&kl .\n1"ـĀ&0;5厖)w+[3B`K[@^+@\q9ΡVgj~IENDB`logisim-2.7.1/doc/pt/html/guide/bundles/colors.png0000644000175000017500000000312111541757140021760 0ustar vincentvincentPNG  IHDRR8sRGBPLTE%*B231-$S|1]75dbGHFQSP#z%DDQv}h[[RRqspfkk`~}Y[tz߃6m쳲nmĊԸx1bKGDH pHYs  IDATxS8l= '`c>B 6IA 4]41-3khW=F'SGc(]A3h͠4f % K%3dtN{h clf=MB4fE_:D1\d0d m!Zeʫ F({l#^T8r+w̻o,͠4Cu Cores das conexões

    Cores das conexões

    Estamos agora em condições de resumir a variedade de cores que as conexões do Logisim poderão assumir. O pequeno circuito que se segue ilustra todos elas de uma só vez.

    (Figura do original em inglês)
    • Cinza: A largura em bits das conexões é desconhecida. Isso ocorre porque o fio não está conectado às entradas ou às saídas de qualquer componente. (Todas as entradas e as saídas têm uma largura de bits definida.)

    • Azul: O fio serve para transportar um bit, mas o valor que ele está carregando no momento não é conhecido. A entrada é mostrada como um pino tri-state, de modo que ele possa emitir esse sinal como flutuante.

    • Verde escuro: O fio está carregando um bit igual a 0.

    • Verde brilhante: O fio está carregando um bit igual a 1.

    • Preto: O fio é portador de um valor multi-bit. Alguns ou mesmo todos os bits poderão não estar especificados.

    • Vermelho: O fio está carregando um valor com erro. Isso geralmente acontece porque uma porta não pode determinar a saída correta, talvez porque não tenha entradas. Também poderá surgir porque dois componentes estão tentando enviar valores diferentes para o fio; isso acontece no exemplo acima, onde um pino de entrada tenta colocar 0 enquanto outro tenta colocar 1 no mesmo fio, causando um conflito. Conexões multi-bit ficarão vermelhas quando qualquer um dos bits transportadas estiver com erro.

    • Laranja: Os componentes ligados ao fio não concordam com a mesma largura de bits. Uma conexão laranja é efetivamente "quebrada": não transportará sinais entre os componentes. Aqui, conectamos um componente de dois bits a outro de um bit, de modo a serem incompatíveis.

    Próximo: Guia do usuário.

    logisim-2.7.1/doc/pt/html/guide/attrlib/0000755000175000017500000000000011541757140017761 5ustar vincentvincentlogisim-2.7.1/doc/pt/html/guide/attrlib/tool.html0000644000175000017500000000562011541757140021627 0ustar vincentvincent Atributos de Ferramenta

    Atributos de Ferramenta

    Toda ferramenta para a adição de componentes a um circuito também possui um conjunto de atributos, que serão transmitidos aos componentes criados pela ferramenta, embora os atributos dos componentes possam ser alterados sem afetar os atributos da ferramenta. Quando você selecionar uma ferramenta, o Logisim vai mudar a tabela de atributos para mostrar aqueles próprios dela.

    Por exemplo, suponha que se queira criar portas AND pequenas. No momento, cada vez que selecionar a ferramenta, uma porta AND grande será criada. Mas, se editar o atributo de tamanho da porta, logo após selecionar a ferramenta (antes de colocar a porta AND no circuito), irá mudar os atributos para a ferramenta, de modo que futuras portas AND acrescentadas pela ferramenta serão pequenas.

    (Figura do original em inglês)

    Agora, as duas ANDs já existentes poderão ser excluídas e duas novas adicionadas em seu lugar. Desta vez, eles serão pequenas. (Se você optar por reduzir o número de entradas para 3, a porta AND não terá extensão vertical no lado esquerdo. Mas você também terá que religar ao circuito as conexões que cheguem à porta AND daquele lado.)

    (Figura do original em inglês)

    Para algumas ferramentas, os ícones que as representam refletem alguns dos valores de seus atributos. Um exemplo disso é a ferramenta Pino, cujo ícone mostra a mesma informação que o seu atributo de direção (Facing).

    Os itens na barra de ferramentas possuem um conjunto separado de atributos correspondentes àquelas no painel Explorador. Assim, mesmo que o item na barra de ferramentas crie portas AND pequenas, o da biblioteca Portas (Gates) ainda criará portas AND grandes, a menos você altere seus atributos também.

    Na verdade, os pinos de entradas e de saídas padrões na barra de ferramentas são duas instâncias do mesmo item na biblioteca Base, mas os conjuntos de atributos são diferentes. O ícone para a ferramenta Pino é traçado como um círculo ou um quadrado, dependendo do valor do seu atributo "Saída?".

    O Logisim oferece um atalho útil para se alterar o atributo Direção que controla aquela em que muitos componentes se orientam: bastar apertar a tecla da seta, enquanto que a ferramenta for selecionada e automaticamente alterará a direção do componente.

    Próximo: Guia do usuário.

    logisim-2.7.1/doc/pt/html/guide/attrlib/pin-attrib.png0000644000175000017500000002210311541757136022543 0ustar vincentvincentPNG  IHDRsRGBPLTE/B:~b:;?W6(f7dd(:-A*+) 2T*"1%BP Fat4<8!GX]5HIGHLUc dOUHFC5T5e~WUvUD9rw|Sqomke D~0ѝ2pY~trR89zpZ˃JDkʊ@LҔ݌3YΞ^hҝ^c(ԠɰLƐ}u̪XTׇԼߺb캎ȬƅގmڎܪھٌﺵmTtRNS@fbKGDH pHYs  tIME!G tEXtCommentCreated with GIMPW IDATx흋CǾ ZJ[Z=\@PL +)r  B @MoO؝ٝ&0_c+7o;:::._"ҥ)Ǖ;. .Rud ~{ыO;KV.81453iҪEX܌8I}H;WiV:J/^=pZf9o+ln켼 a^d')wda4Pf2BqnF:@,sf-'/ݵZDM`ɚf7MG ML4,EӃT:Md .JLrŎ;H̋NӎrJ8Rg''M3LR  BY,y4m0—t+^kXlڂ✵֗^HxLD2 ,ɂ_F 0kY5Y][yCxuX'0ii:thWw?vgB,wn,ui+:dkzu%Xt})CEd==\4 ӗ00E0M3(L !Vϕ?{7*By%̣ "Y,Oj7nڂ okܳ"" w~!VHf28 g4j6qF񌕫E e|?Y,yb%4LNĹWpzxҘ}OIKSw~P:Vy[DsRsʇeXN ϲR!'YQV0)a QV!Ml0X>cXN Y~3uä,$434Y,+T6ta#HC_qtzxoܽ\ W} Kp'h3Z s{ӗ,I(,u'kf,32%0)2eȷ2 "<QMnPkHXV+cj Yn,@4^X318=[g>M݅&eK7ϐ1"+%v;|/\{nrU2(9Ld&afÜĄ ,J #nE7{6RO2R,7/א=sqe d ߺo%;Y9o`y7Xf$Z 3m͊L`ihQ`cICLv,b9R])XB$>v,a - M94,hRX(e,ib/KaY?Dg ѵ%!2a{}n!/nReR@*K࠵AЁK4X)!AGҘoKh;;x5}c-v{:qXk'AR4 pSt$~\-^-裶!wCN鯋kVea]VFW*5'A=n-lVqf>`y" 'dKIJuw{'lt>s'7ݝ/aoΝKdx_[bv }[g'9nKѫGy$KCʨxMpϟ yeF ҄6`f1Mjоq,WHa+hT<䋗aH].cAQ:,M?kgT~qNZZ@15|.G&ur3|矤#f ʒKv :q+K" ̨(,c:LZufT3L/@a)H$Ұ)* "t0XwizJ%zK: ÖVMb^l3f,[AI:dYA47HUģe2d3yqs&:ɒ dΉr!),8.!3m<'%Kebnlsvb"vxp QԀb,`eVMeuRSeҢ.+l_T5egyI5u*dyܫ,E9;| z&/y{g@._h,N?K;3tY|")T:x;',p0ȳCd!~C,W [Voߞv(])mxYLj;R9,W1SU(-S*l,*l,5VRK *IR)bYXa,YU WŲYRD2[XZbZ,= f xMeS%,{#2'1Lg%rKY0e },|AXxz0 1Lm M E}`X{ Xރ%ig9 gȔ)KM,L]L,%tY+!D,?YKd$,Rl<6τ5X&,=KMP\m8+%k5@sA X^eJDf L;Kh%,,9V:Sc)Z%zrĂc&;P ëͩ1~;nJJʞo,]){) X; 9qf3?S,Ġ(98A_,'wˤ?99ٖD9<9ң+w۰IJܾ2 @?w- [W,}&K=<~Dz;}f|ޅ?\e7UYҸ? oT}m²ʳleB##>z@v.[YD,K挿P,!˧^XUg,|+^x!KXSbOu'4m~Hg+Y<]Y>ϲL w&39kTh dwƋXFS%!7Vy[=XW p/d`95epی dY3qܠI,QOۍeڻxKouqRXRj'{P/˰ V㍌o>WF4m~ȟULYh cim6Y`X30#R_Z~WB֗]YJU `S?eLխ<R` ۱#bGs9,AȌV۱W{+Mz̙bR*LK>߬|h@e?p]B]ُ<6;eRKnOcXIPk͈ OkGGJ\(/AcKn iGfQf&b I3K[;֨//ݿ-Xr<[ͨ=c,}K0!)fYreiQ[ͳvz:U_7ˁTvPw/٢wAɸ?- , ,Oba6E_dMKuq;V}=v)/1+g9;ie}n _݌eqg) 0g.I|,Yn>Xzc rSxcY z,$XI"5/7iL1Yrl KhƤ'K3$q

    v6ZjaH6K nJbbb*;Xp4YǮ_˙ɹi*n/>ָ?%;,};βv߷$tx{e^:+rt`@ԁ\)jY3,aIvz@v1#(Ƒ ο1_5?uYÒ>gŞҖ'QvÊ<ڥ>EW|1#-rxk> ^njD' Pz0C%,+*~_>rcQ zN'#YXcDXm)Y bE2掎͘kdvX*0a"02sփIZXc'KN,K[3R'r,RPsee2t36o_.2 e&qviXrӶM}ð vXBcg,>[v ۥf2cii9՗&.0KB.4%_?+XyXNq}&Ifh1<ɸOvP(l V'=wXjɅ?,,)Rc3+}ܖe  9+rYCRqK/,Q,M,aI0ñD>k8ީ`^X>V,hYzF^8q$e>ki K8}z޷MvAA,I>av4uD]XNM>I܂XnP@CL׉%zT>^xhmOiY S:K|D6q,}t!{2MXBSI7ش3k<ݳ|bervآbq_cDz%d2K-DsO@|'>Mfy^>򈄼&aDLӘ>&$%w5v VIZ%ɒ_nÈ$-cہe9GeAC>Y[as;^v`y,W';ƒ r-z;'bi$pc93c%y=9wjZMs,IAێ|lkȒT,ñ$Y%6o'=lm|6ϣjt Ӝq"-#<ɑ0ϱ~AK,y5yaP .?΍&JPpa'{-+=]1y^À;G4,#hHѵoF$x/>Qdf*y2D G<> 8,@FqIO#̈ sI~J:Cm.2OV d^+,5͑eviRA']fDYHDgsybe T_z)ELcX6}G|g,{k '0%TM%ߪhMlc9v,DhegɞC!9*Zqxa:]2nbVE kjнkTw>쒟VE+e$<Xei ֿb%Try`xg>jY&.CTX/3Rg}=Ȁ]C%ccɦs(f1q_ӽ, wT,xjжEt0(Hñ>R3IFэo~Fl&+Kdm4FB\Ae,98Ɓ@!ݱND.;ɺ(KrXp,ۥ H>{eI!хp\q5e܇g֗/2ɷpΟX%!y9~rU}m¤,ӻe|g=!ߧmRc4vmׁDXFƲa>Cj' =2qmbX*_*m6Vx%,ijjǶ]*e,De4, j$z/@jXg@k&Z} ],(lz*_ҙ%[X؜>Yt"(/EL̒r}#Q9rxjǺ%SXם>{>|14YjOⱾdj" }36kϖǍz,hhRX؜Ʌ[.KKM$`{Hl Bk'Xbi-pR,L ,!0ke0I8N[rjβdU*!ZY2XVl*YZNJXX޾}\ZXpzL6ׯ,MWmN[TGjpNY|wX;]so%{B,Oc;B S9W\'i̲V2ULGqt _e ˷WO.@C1Kd%d)Z|,SDayra~| Xb%/]_lIDATU%e*UOK2oך^YfQRy* J`<ƕ$ gZէh@ck= Sy*rPD%Z'-'XI)2.k3,oz}eac{#,4lߊv,kxT^&Ry3.f9vqXӿąr7y%eX24V@)Jm޿taYo3򋭬B۲t]UrRQ ˗?^VjU,7˅)L5Qiu`r!#Ů8hʻ[[vW:=ƺChCД}3i\"O8X8D SrwY0 ODr/LƳzlSϗ..-9r2 K!LO5# HLr?t0X̯_^xu٦zL<^zqelu3̙_eŋ?.K,Fqˋ_*."d]xWٲ%IENDB`logisim-2.7.1/doc/pt/html/guide/attrlib/nand-select.png0000644000175000017500000002265311541757136022701 0ustar vincentvincentPNG  IHDRsRGBPLTE5e:~:b<@X6(7gcd(:-A)*( 2T*"1%P FaD<8EGECR`G cC5LHSRXvUD~]kIq|omk$|Ý 2pY~Nwn8pb7Ճ+DW[LҔ͎EYBnhԞb'՛]orìO|ϤuXT߼bXͿ̧০~֩׸ܐݬ؋/WtRNS@fbKGDH pHYs  tIME+rtEXtCommentCreated with GIMPW IDATx흋C*TP >JET@ Rlkh T%%l=@W{fɹsu]DEdgIwۥ 6!}MֺZ\0//zl~!9+͒G 4ŵ񇖍<alm lxhyy6nJO 6|;c?Ql.2z9$gؼeB{phJ9),6@!Y̋y7x!~PsMQfd4L&%M!u{lo`Qނn L{x_(e>FY&M/p(Kf(ĒcdCS &KG=a: ˅o]2Y.*M~fnGOed  iZŒ_" 3Paa ١n=C T*=z =dJ-|نYκXbU'?=%ǖv 6+Ok67m77_\F&:?~8U(=1G~ͿևY1~O㳬>D,> 'ȨP,wG+EXC,MF@9Ĕ` `((s*LòT"ŒQa{rb9Z!@(S,V?\.JKB@}X8, v2*i1EHn G?[ f;b0x kzKMerh(PC#a - Y,1OD$ѢHL2VTJ%rd Q>Һ !Dr(c p-5d \AW Tx] l]Z,!ߖHHDhcܻp5Zfat=K|h`ؾ(=xc VJ%%'|\ʐ-@b 7%=.bٺZBƀQE̐e9!2,?#?RΓ fy,Y&a2e<&,3[PK6FoeD *>AJXW.a"b Bvp 6H đTfBX(Ba7#>'u.XwG3ФX0iYs~'s1|7]${qEKa,3neIyw+",T1#,P!( RVEgrr@v~aM7zs~aϮi9[pl_N":"c/g.6LU 9TzgIZ_ҬI*%7en=p˟ B~<'Revɰ(S4M Ɲը# ec&(gX*=%kAn8 kQY-g`QX,jlv e/2~_;?t,I ̆51́x`N)XX.P!jY8N2;5Y"XnUfh~,G r"="{hl6&jsPƉti9ެN—"T#<xhO6.̬`{LvNu QzOm7o` ^~~nOCǙiW\Wm_?&XQD43 hyr|t W v ҝFk>u;OMޱOj..`͗O{ɱ8zțMOod?IYӎbʲA,ZYOKYT,ӛҤvc!˙Ԛ( Ze5f5rdlv.RMM²tlv;]ŔaQL"KXY=>L%LmXPM@@P&"[-~';䌜Ȼ:p,`z EH>cۻKm=#4%,tQ0|jr[Km|kp#/ |:*|ab)K?~0vKH [KФ>!Q˃36Ē[~bWW&;Ŝ 1LuA D}`R%܃UXBn1I\(4n, 13 -O=bL,昦@X}WyIR΂@P^u9؍}t{ݪ ke4Y޴XibvhL1 8+%K*sAsXV&HLvF$6c7K%H9²[̲+(o",W1,o P<6i Dܱu1*%*+ͧvKF>m{6KQM|WUH,eLM%B7r?ey*X;9NY61}e\NY6.12fy?fc7K.J߄{*'r8Q۶9]jJU%s{B.˒3rd@1@*JOy8e:!O.ae/%/ ʔexn{],f}2,Q,sqDQʲ Xuiu)h>{ێx]rXAG*k]rƈ9!֕e}K]n%+% +GucYkMj)Kgi_,)cE ; *kݹ|~)_s}ϒdfpκߠ%9q.Q,g5b~Ձ,'ѭXVKpҟe plx wIA>׫:ϯ]nKu@oNe#B%80?64ˣp[˽CArY6@ 8T,+*5I;NHDB m[&Ȳ3K @ha,Œ:W/Kb.}^B~_!:M}, e(G'K^} K܁yzp/QWj,;;))/]DĸԁrKF,KM;0!O\+3v&EɺT> [ލ Ae/SG@?7NzFTII oY 7B*K "nKD%0eI9@>U!jV$*|۬KQ+mX&2ǰdXv*lxp)iH.SSXn-qɚ&Kko,4&CTtkZucq5g }2.kHcRCKzd2ee>)p,mSatl. 3dyvuھtlhJ]v׏dD1qwLQ>tW 2eu]r0C(Bp GKX1*(de2YJᦹ};<P8l`S{ċetiX4f34طp!)|>2'/y,)c9IbR 'Q|lߒRn|$%oAeɨ@5tƌ#ts_cy5#X2XEZ_r奻;utM# xa9V6 BA$stAɝyei޾o` 䖡1cGB2XA֦O''Y>IIcL?Z>뱱pTgS"Nᑑ'eSqsarY;x3HTøutXQ,O.baZC8|&өKUJs@BISrg}l/Rˎ!`tX e\&4bbmOuiW,/awVIY*'QWcUuɏ١4`;Dv<,aE醩RfL>jCSZȼKY}>v]̘|җ)|AlBu@y"n\.'l˜'nO.;5RAE9',.Ey~`Xik"E`ZbeU,9@U~8tߺXb )k3^M3f2l$dMF$Y>Iu>mN 5/z&@k:`XɾcMhWKk1-vYre."˰"`g̵`]X62>Ȓ8 yC bxF5L;ɪ+7.&d"^o79/w$MZ6.ea^n`ZC|Kf"dX'T>K p:,>䱔쥺ԬK KfҺ 4xyIʔ]Uui-TA֏%PaeRV&Gu2 ՛2K*5+p,J0&,Ia,QgGFxcx3"\R^tݱa62^hغ VIvX{&T\8XO !3!D^aZ,_&j=šȺ|N6aNtXQX MxyK;S,"cѵ94gI캏(q-,r~xC ɜˡh0._dLaXJ:m*0)%?Ț.').d ;䔗.3,s0gh'dٌ ,X&g.-Rr)X<= qs\,#4ś@se7~A>꽕QK!H^4% H吘'J@Bx(3-'R_~aDRF-O4/:\j%u.C1PJs=LYI q$u\jfKym)%00d!K}, aQ%]水#J=,s2R㠡@tYX+jUz.4k&f&(]\2ue#sRҒccXB㱔 M2G|(\6)ˤ|e.+HYecxl K\Oaa7l}^gd}DH"elSKaK:uy6Ah;%O qxhz^p<4̔_|F K`rv2@˳2hz<%l0t =2e)ɒHQY KQqXp??xe(0owvXieyN$]96rq32~}a ?x4 R,uL`3U_af_DfO=Kj6tZ];MW}l21>fh2?xlleLB/Ut_YbvӴeŀ1j\,]d= }.i ˏrXT…\T .#˸K?k:s+d}PA|lVbx3)!3If)KM!'ՉaVp6ɪa|VIgqXQɗe$2Ϋ䲤b`<~,;9wmq|Wu `UI4}! |WݪCl}aɈs>oT'VKϷߣưdž)`*׸ŠD3N-BEXzdSKo#Ԡcqh0E OҨgXۗrKOD%JyəMǞDK#*K+ο&cO"MDWXq`q5ܪn4.XXY%9eu/ }rϗewRKtkg]R5 Z2Ҍ mo06lˇe.ORXf.'(Jy|scS̲{f#e,^%iKw#KDpY]n ۆ/ˉO&}Y `D+ז6e#X:6Rub9gYoNi ٦,uF,7w+?)z/j)K],i):e G}9}R cF{>TF)˔eL,k)p, &KD9P0S`RX Z{`-e%(iW񌂠/obXǎלiy%.T[fIDAT]óZ4GBab˽h!}l2%CK,B<βuOp؆>)tIe%:TX{.c,/ BxGbh:K|4V}62t}2d&w]ru&'@u;du7Vj]2txY`."n8,ݳUX|g^f2<5,_$܃DRtX&:Srm6CG2X`rO𲬥DzZo,W<&hIPБ(XjLo Ibyu%~&h਄Q7WOm 0KxDy #ɦm>98G7qRퟫ>5YVY$o4BO `Y)c~'%|6Y&J 1"N³No/Gנ%,YR-!FxO>:ƒKMYJ 1›|*жOXouXǪ%oҩ4BxK d}-М&XA2LB&J#<,2tԯ D˰~k_ 1›|*oD걪q~@!!F-J#-m6s2%u~Xb4N3Ko2ք Le$&hO-Jj:dHjb8ڕZZfbXN-iuB`1UmK-6"o9<ڀtssθLJ"0:aYs("z̪]ȏo]8;Sp9tja<]q^6.̆y ]ߜvbfԚ٠(ϝoRkf\U$B*IENDB`logisim-2.7.1/doc/pt/html/guide/attrlib/index.html0000644000175000017500000000141311541757136021762 0ustar vincentvincent Bibliotecas e atributos

    Bibliotecas e atributos

    Nesta seção, examinaremos como usar duas outras grandes regiões da janela do Logisim, o Painel do Explorador e a Tabela de Atributos.

    O Painel Explorador
    A Tabela de Atributos
    Atributos de ferramentas e componentes

    Próximo: O Painel do Explorador.

    logisim-2.7.1/doc/pt/html/guide/attrlib/explore.html0000644000175000017500000001066711541757136022344 0ustar vincentvincent O painel Explorador (Explorer)

    O painel Explorador (Explorer)

    O Logisim organiza ferramentas em bibliotecas. Elas são exibidas como pastas no painel Explorador. Para acessar os componentes de uma biblioteca, você só terá que dar um duplo clique na pasta correspondente. Abaixo, a biblioteca Portas (Gates) foi aberta e selecionada a ferramenta NAND. Você poderá ver que o Logisim agora estará pronto para adicionar portas NAND ao circuito.

    (Figura do original em inglês)

    Se você consultar as opções na biblioteca Gates, você notará que não há necessidade em desenvolver um circuito XOR: ele já existe no Logisim.

    Quando você criar um projeto, ele automaticamente incluirá várias bibliotecas:

    • Conexão (Wiring): Componentes que interagem diretamente com os fios.
    • Portas (Gates): Componentes que executam funções lógicas simples.
    • Plexers: Combinações mais complexas de componentes, como multiplexadores e decodificadores.
    • Aritmética: componentes que executam operações aritméticas.
    • Memória: Componentes que guardam dados, como flip-flops, registradores e RAM.
    • Entrada/Saída: Componentes que têm a finalidade de interagir com o usuário.
    • Base: As ferramentas que são essenciais para se usar o Logisim embora seja muito provável que você não irá trabalhar com ela frequentemente.

    O Logisim permite adicionar mais bibliotecas, usando o submenu Carregar Biblioteca (Load Library) do menu Projeto. Você poderá ver que o Logisim tem três categorias de bibliotecas:

    • Bibliotecas predefinidas são aquelas distribuídas com Logisim. Elas estão documentadas em Referências para Bibliotecas.

    • Bibliotecas do Logisim são projetos construídos dentro Logisim e salvos em disco. Você poderá desenvolver um conjunto de circuitos como um único projeto (como descrito em subcircuitos deste guia) e usá-lo como uma biblioteca para outros projetos.

    • Bibliotecas JAR são bibliotecas desenvolvidas em Java, mas não distribuídas com o Logisim. Você poderá baixar as bibliotecas JAR feitas por outros, ou poderá até mesmo escrever a sua própria como descrito na seção Bibliotecas JAR deste guia. Desenvolver uma biblioteca JAR é muito mais difícil do que desenvolvimento de uma biblioteca Logisim, mas os componentes poderão ser muito interessantes, incluir coisas como atributos e interação com o usuário. As bibliotecas predefinidas (exceto Base) foram escritas usando a mesma API que as bibliotecas JAR podem usar, e demonstram apropriadamente a gama de funcionalidades que as bibliotecas JAR poderão oferecer.

      Algumas bibliotecas JAR são distribuídas sem qualquer informação sobre qual a classe Java deverão iniciar. Ao carregar tal tipo, o Logisim solicitará que você digite um nome da classe. Esse nome de classe deverá ser previsto por quem distribuir o arquivo JAR.

    Para remover uma biblioteca, escolha Descarregar Biblioteca ... no menu Projeto. O Logisim irá impedi-lo de descarregar bibliotecas que contenham componentes utilizados em um circuito, que apareçam na barra de ferramentas, ou que estejam mapeados para um botão do mouse.

    Aliás, uma biblioteca tecnicamente contém ferramentas, não componentes. Assim, na biblioteca Base poderão ser encontrados a ferramenta Testar (Poke) (), a ferramenta Editar (), e outras ferramentas que não correspondam diretamente a componentes individuais. A maioria das bibliotecas, no entanto, contém apenas ferramentas para adicionar componentes individuais, todas as outras bibliotecas são assim, exceto a Base.

    Próximo: A tabela de atributos.

    logisim-2.7.1/doc/pt/html/guide/attrlib/attr.html0000644000175000017500000000506611541757136021635 0ustar vincentvincent A tabela de atributos

    A tabela de atributos

    Muitos componentes têm atributos, que são propriedades para configurar como ele se comportará ou aparecerá. A tabela de atributos serve para exibir valores dos atributos do componentes.

    Para selecionar quais atributos do componente deseja visualizar, clique no componente usando a ferramenta Editar (). (Você também poderá clicar com o botão direito (ou control-click) no componente e escolher Mostrar Atributos (Show Attributes) no menu pop-up. Além disso, poderá manipular um componente através da ferramenta Testar (Poke) () ou da ferramenta Texto () que irá mostrar os atributos do componente.)

    A tela abaixo demonstra o que as coisas irá aparecer depois que selecionar a entrada superior do circuito XOR e rolar para baixo até ver o atributo Fonte do Rótulo (Label Font).

    (Figura do original em inglês)

    Para modificar um valor de atributo, clique sobre o valor. A interface para modificar o atributo vai depender de qual atributo quiser mudar, no caso de ser a Fonte do Rótulo do atributo, uma caixa de diálogo aparecerá para selecionar a nova fonte; mas alguns atributos (como Rótulo/Label) permitirão que você edite o valor em um campo de texto, enquanto outros (como a Direção do Rótulo) serão exibidos em um menu drop-down a partir do qual poderá escolher o valor.

    Cada tipo de componente tem um conjunto diferente de atributos. Para saber o que significam, vá para a documentação pertinente em Referências para Bibliotecas.

    Se você selecionar vários componentes usando a ferramenta Editar, em seguida, a tabela exibirá aqueles atributos compartilhados por todos os selecionados (excluindo quaisquer conexões). Se os componentes selecionados não tiverem todos o mesmo valor para o atributo, então o valor exibido ficará em branco. Você poderá alterar os valores de todos os atributos dos componentes selecionados de uma vez também usando a tabela.

    Próximo: Atributos de ferramenta.

    logisim-2.7.1/doc/pt/html/guide/attrlib/and-replace.png0000644000175000017500000002115611541757136022654 0ustar vincentvincentPNG  IHDRsRGBPLTEK':~:a;?W6(e7cd(:-A)*( 2T*"1%P FaEt4<8!GX_6GIGLUcI cOUHGC5S5e~VVvUD|Nrnmj D~0ѝ2pY~trR89zpԁ(ZD̽nʊ@ЇSLҔYΟ^hҝ^c(ԠɰL}u̪XTׇԼb캎Ȭƅݎmَܪٌ{tRNS@fbKGDH pHYs  tIME,5C tEXtCommentCreated with GIMPW IDATx흋CtUXziKUSE?Q*(,R,͟-L2[6)X$_wfL&gOfu tAX 'Z*sL%SR0w6WZ_*sjzzJ8Q`q 2#FQ1!ѡEBg)> BޭHVY}o VvW6/@g$% YyGKl+92̎p 2`NφʪI_y;墻Q2}YM&CS1̀,' M,9hi*M9ԩS;H-,-iG9re)򳣣&d&]bc,uj6 raێӔNRcr,6mu`^Hr$Z&"洔 F'x`Ʋ$f߿F0bd?`I&UC_':›.%;|(20YQw Yf,S+}/V}RCZ N'G#X=\I'k5狽q7/e8Ya`:fP6 @_[K vZdk߹ W*By]|G[&Ф\xuO?\pӇs+8x Y'ѕ5zŬ$ oidjXs]fYg'cH) \XSW(}듞׮]+ʒ[k~NX,766Kg_'^"أ[x|>Kl$0&">,sZwTʭTCp-0YDνw/ ?FV(\zKT.,G=N3Xf6eJ`:u V!˗ OD`:E2ՉDZ.,C4_X v1=D98,[-hr0-]D^w=C"+%va_nrA2(9Ld1Caf9ma %A6&Y󜒤W]Mo+ X"˓eu*`|a Wђ]8W\ c@X^3$ ,a]pw0<n,XZ3cـҦ'5X%2걇rjlr,5ta q Kh%44RDIicD3l6 ?HRd{[Am;l+V)Ȳ\D*&K)Tuڠ t%R//up6H8>5a zcoưgX}=Yz )LI8QD:?K`.]H7DAԮ~܋ wX[,A;JA,Ryj+^V)lVpf`z荊dϫA(&Uo:f L [;ak.%r߼[{f`].RZl,΋Rtz؇^w[s 0ƕ5/!?A]&R&̌3iR i 7ZPJ}bC\$vh4Lgu 2I7υ*BJaB^t@`ΜewI:ni,ycNY_= ^S tiPFљmМ`z: ˯5aF^ұGg  efi;4D>yBoVPN4Y$Ⴔa5Nĉ,wvv>Bd*< ѓyЩ6W?mBJ;hW'>xn`ͣ%{6;p& ?y٣!ޏ9(\UD$,|zqvv1Q[@m^)v=7&ӕg8Σ! H܁=(.?q2yK #K%N@r%zS#%8 ZߥϤ,,@K>ض,,ôtt)pvo7x(wtaHRNԉ3>x<;K^%mg_-,Ka&['aD@;٭qfgҽ$uvP o/PЃ2s+ D#3t>$Kd Ona ?c)6S,tu5ڝBv e\u9RSJ,,w֔*,T*'IJX,-Wj.K0jXbve2`2~,wXk%aS /O+0'n_a HXU~e,iSyU#iR3 ̒iϭ^4ǫPDM h1ɰDC`´U)˭Ç[ "Q&yX.a2\+c i!mXj/ЪU&c3pX"*` / Ӛǽ'_Ι4-GcX)cS܆UX6$, vrMYPԴP, KM%l,%55b~X"垥DI׀ez/u񱟚c,+hD5mKM^P\u48.%k5`-`[b b&6.v$5I=6GXY63V>V-<%nj5Lv90X65WQ1}űk}G \Փ능+SI!,U%% "C>z@n&WW,=_g7;ݘ10S/,3|\P,KW KXRbO)˃61Dmwѿw%'BK"kGُot'ȉe _`_@;}+^UzbY\oz7zPsb,' o3Hq YYNmaI ci^Y: dY b"I,,0pcI*;7%zcXz.p s@fQDβȿ%КZmV:bɜQ{ ' K.A,DzT|'0CfiJ .~"Oa :fX4 dL {\ ja\ɇ]⇕/h@gCUy*aF.ʸiY@KvI/) x>&~eY~%lGb>3a,K3K1ebD$KP,mX4~E&\o[G g: Va*?іD(+/}ynX_\_Q!fXv9n%.([P;1$viB=0X⛬պmK( KksRԾL@^rzou|w3dz3R@1Pv))/m,P_IG5` W"XN{j_'Qb t2| s}}ل 4:>bb=isy٤ÅCYNLИ]>I? I8yc;%YԉCrdr/bUӅ,bY87ew,g%,*\e bԫf reU('!r8YuęH(W\YVvʤŚbY%Rg)8i ?w+U,#b 6إ I)4r ,c3Ks][bC,b\`z!8inە%9r_%>hFL,K,J!K>;Ȳ%qqy+,w\XNLR^]5hPğ ˢ˙Z;}brCؾ@ NZ+RۗdijR KvXFscIr܍eP MI3ےew gn}1di Ըm|KjaKŅ%Rٌb}JP᳜XV8BK(6qR9#yƾ?Oq5k',ca^,IR".GK/(58L!QV,%9hX!\aXN+}8B&+(e9=|6GSGDr8uѤ2$QrSJ çiȒXudPJ,IJ }S 4YN]ڿ76c'a|Qvi:i.s̀~̱)mˣ,(\M0ܦϭ3,bIR:;]6 2GY:a>X>:%yy}+l;}E.u&)mjD>Hz(QZ^X:ly(q$#YN9ce `K:D0,vdV@l^ [ifBe`r(%sR.)dHCtY \pg<70u|. !c+ Ue6vX'(N}{X5"3tc!Lcd@d*-,m>6U, kChºi>V%w(:K,.>Tv %V`8"nϽݙOGe1Vth6YZh]S,(^ KoFԈi6g Ȓ$O8,yqDt/8 >&IxehnQ3V,o@t)6MXj e.h|-X7ntMϷ>r]7CS&,pr=XX[,Nkm_a]Ԃ %"d#KX:d>?ܽ v_2Ad A 0D-uoXh"OYB]61ӜH=T,`  pa,I } S&45=K},߇> ^1a&&iJW1hAezֱ{>\݇=" ~&4X򠧏$>V1K`hAKX6GS*B:aG8%c6\ueړT^w1XX}qTHX &a MV/YVheYt@٥b 2deX {Yic 8e,'%Bc Y>+hk~2;Z5JPO}>e4 >vv< 8Neb KqM epwEYFͲ?Ka^^:B_@BLZ^8,\HWH1;u6tcܺmWbrYjFW}vN/#e 3K K2,}}x6@fJv+*U40\XZ5a1%!Kcٞ]@run\8'_,5[Xڗڗj踱QhyoGEO i׹IJԔ.:RT,K2.,bX*et,YRlbGy(l6 X*ebe}KվT,K2bbb>}T=}RT,KRT,cY'R,ϲ 5+m`\Qe[j=Q奊>8sꅺ$.IU=6,LR,ۛe,aYbT,I8ńeΪ`gYW^lzF+g&bYu*q[-7*csZO?8S7K.,KfꇵäV괐OG,)@S]2?Fvi1y*,j&|jC{Ded&gY ,Qp ?ȎPez!G%R>r >,_>%dKb̙vYF)b2ǎ%YKM,{{s%8U)V:BenTc˸ >VK0,Ke^[j\jԀM뱒Sr&,g?񷼼|e¶FYyX/%X.WQ@>`58˙8c}ı}Y,ZX2'+053Log jtV5gY[[J$ض,]EWe,(yr\;Tt+JZ %S_- 7-L,grA%&o=Lf$u݇Ў24547MH6:H”3l0,G]~W&eF D$G)4%tvhԞb'䰩n՛]Q|s o朰ϤXTԼ߼b캎̷ƅmَܪٌ@VjVtRNS@fbKGDH pHYs  tIME* ϕtEXtCommentCreated with GIMPW IDATx흋C*X !Ĵp(rEJQh CӿefwfoM6af~s|{Zz_!-%5ҢܪE /ehmٱl%\4ykфYN416wOD%jT|jUi,80oUm^ yMp Wq0G97or?߸X./o/C˼{k>dbxD ˬ%9&ES2M1˝ST,$l?OOO',Nbi^#zz=?i aC̾>K&bdA^&ZnpB}<MMfU'[1&Te9!92,PzjgeHõƒQ0t@4frKne]l °џ_$IRU4y9͊βk,rs%e&<+bj:;i\QJڵQ` dQB\z r#c}bnsp! ^({dXO*-slBs?Le^9$ <Qtu( XVfJYn,A4BD,%qVY"ĠO{k/bn@{͛]ZC"+%vVمYzXYZx0L,tzw<}{=ءaJ7&A,X^/,ōxA"|aqqc d ˸?1C/6/kg܉D=ngϗn؁Kµb?L,OpǞ,|,%Oc'M,JY &e(9bN3eY N"+27%2 Ge,f?Cy Z\1, "Y-X aXn|Cwp'>Wu*|9=3fФX0qR,s5[FO{<߰D7,N'id&) OcpF$h1%BP@Cr%b:7v^V=LP;܀Mw/PxE*_Z]&[' o0U\ޙM?PإJ1yѵ,\g*DU~npqR1 &rb2LSHQu`N\Pb[zYm:U//C*<˾EO LN9I|ܶx-Z]$masރ쒮*De Z]R0]Q\u[H$4ݬ r,wY^mXϪCϟ%QNO9Z Jז9&-t=Y.:d*q7~-t=VWZj$:K2n-7L[N7/VwbtQ`ZZ~@N\uZrs<o.u!"w `>eUhv|cAz#˶]7k? ,HW.UuRE\}2Rfeg֔ɗ/_b /xBa92Ak s'X}V"rL?Չ?cmݞ8U1iHvݸLˇ_Xo2- ><)8 ٕ‡Ckb.Ƴso1w&Ǩ 3#x4}X\ wW7X0O}go2<zݛL@tP>KveYVY8 $RAP:##pxS;l)@Jgbq]>Sxp$ꁪ8\xcaxA_RxAw.{*"_ O=l# XRq PcpBGwh6%}7o0ew8,a5Xt ,2bjQyנiRJX)K?,`vQOxpR :zFhR,.XL/d޽<_ٿwo_RV",Kbe m$b,0, 0˩H"4K5^5eRX[ej*-k,X@q! h@X:>gwZX6β EZj1fkKO<%L)r2W-w%g{%އ[@F&GNimε춯axK!,W,h7r=dzp>1u,'3vsYF,̹ML D,?-f@&4Kz' 8PRNul '~`PcbybX)ne)T8@dX*wѣ Qe/weܲc@iKsCIQ+JG7dR K"2UotHyA .AosX#,{]c5 :RO)4)S1vci76{KRj} ^28Jغ١M}Ir,|Sz ^2uxT^]F.me\C:cR{ XQfѫMYuh_2mԭ.Ky*/l>LD,wwe[v|n3kշz,O5zkò0LQv7~Z 5[cLb r\R Eܜ9ܺ)eyqfɯ7fIK%9Q}KwBo,AXι*_jOzDR>K$,ZX||ـ XI0,tejXڴ\ȩt#K Lo$A<*0rZc+H&XY2X"5]A5.٥r,Z]Lbf )09,wnA开bQ0l*N-%TNN'RT-+v"Yl(V'FjRy%RgfuҟğyrE̲;bK)eՁIr2uoYM%E.UVaL"ANetbVd弃6,S]jKSφe25X:Jf'<W[+,]ֈ4GSzazr2ϮJ;C$l3D˰ܵS>C>ڲLW!Jt<[emY =KC|V^W`x,'XVܕE:۶d) Kk3Ҕ=,>c2}줃mڑH2jm J dIJ%E02~|,RZ✒P}>AIkٙ~>dfdK.o<:ze9asK,;/Mm\3K 䳜PY!j\wH ԙS *,Q d,爏6@R;r,U7x ^'RzfIB4h[vwӴg9GX>v+~4bLέOj#a|m34pLRNMuxei?f! i S^E ==u:Q/$S:}tS{z>KKa;_y6!,ubrXVr{t҃K0ye|<}Hٞ}|f *E_o,6@ߓ챓,oرeڙ%:> _DvگO6ˀ :o,c.# 0h3sSG,[>ɪik,pTr,Pr2>8K >sv\er1dwu-`6KKz,>Œ|lKX*(v%]%c!.4^~ SW`&F\yW;>bz=Oۊe@ЋLwBQkRkvr&Kgq3-MЙU{ӡ#}NN)E h6/LQDuxc<ߑ? օ|,z)y]׳R~96gI#Zu1气"r[#̾rcɋ* vHռ#M,ȑos>/}l1$S6,,c+ꖚ^yh'sҽi(/u,''2 ?}$bݖq>V ܳtJQ@:S,'1V+h4K0yI[vRixYc"u0fHexҲ,+:C2 X*uW y V#e=0HhnXR*#I}Ә} Oׯ2!KnɘD,ן}P64^Y>/{C va<1߀c]2[NC,GL,3_@cйAb8,&9TeɢaX_֛;_ff ^첄'vIJ oⲄbX"b3:f>"KcΜYԕ{m%ev+{W@Rmr=bYˏ_w'(ڊ@aߋ]ؿU%<^X{>' i&bj9 ,LOl#R hs)>.epI%@dǪO>#ܰT՝SGfLl,s:J²X3@XOvKL9|K k,W,qw^뎇|R]oVen+52nӖ KvlY}t"ELeKu|>TWz.u4ex}❥˫+FN؁ћ.il_<Ǟ1/ʒ~M3(ele}Xj33٥% L6gX+r10K9% :r*.=ObbXl'iV婥)Y˗ʗJJ鬱TB*_s`)3,jYV xպHp,=pT"ˑXz /K## :=b)|^GG,f9K##!f) r|8rjuIDAT].4m-|)2,wQ>C>}A,azPb`1MP0+_%uvul YZ˗, 3,T&|fm[mѕH6V2}D"HĆrؖF>4Dmæ[ˍq\FŹ1V#/'̠No![0et9"X0rۍN0]e`-[~{_e# i^o;.^L?ʂۋFje]DIENDB`logisim-2.7.1/doc/pt/html/guide/analyze/0000755000175000017500000000000011541757136017770 5ustar vincentvincentlogisim-2.7.1/doc/pt/html/guide/analyze/table.html0000644000175000017500000000617611541757136021757 0ustar vincentvincent Editar a tabela-verdade

    Editar a tabela-verdade

    Ao abrir a janela da Análise Combinacional, você irá ver que é composto de cinco guias.

    (Figura do original em inglês)

    Esta página descreve as três primeiras guias: Entradas (Inputs), Saídas (Outputs) e Tabela (Table). A próxima página do manual descreverá as duas últimas guias: Expressão (Expression) e Minimizada (Minimized).

    As guias Entradas e Saídas

    A guia Entradas permitirá visualizar e editar a lista de entradas. Para adicionar novas entradas, digite-as no campo apropriado na parte inferior do painel, e clique em Adicionar. Se você quiser mudar o nome de uma entrada existente, selecione-a na lista que aparecer na parte superior do painel à esquerda, em seguida, digite o nome e clique em Renomear.

    Para remover uma entrada, selecione-a na lista e clique em Remover. Você também poderá reordenar as entradas (isso afetará a ordem das colunas na tabela-verdade e no circuito gerado), utilizando os botões para mover para cima (Move Up) ou para baixo (Move Down) sobre uma entrada selecionada.

    Todas as ações afetarão a tabela verdade imediatamente.

    A guia Saídas funciona exatamente da mesma maneira como a guia Entradas, exceto, claro, que funcionará com a lista de saídas.

    A guia Tabela

    O único item nessa guia é a tabela-verdade corrente, diagramado na ordem convencional, com as entradas nas colunas à esquerda e as saídas nas colunas à direita.

    Você poderá editar os valores atuais nas colunas de saída clicando sobre eles. Os valores irão variar de 0, 1, e x (que representará um "don't care"). Como veremos na próxima página, esses valores "don't care" permitirão calcular expressões minimizadas com alguma flexibilidade.

    Você também poderá navegar e editar a tabela-verdade usando o teclado. E poderá copiar e colar valores usando a área de transferência. A área de transferência poderá ser transferida para qualquer aplicação que suporte texto delimitado por tabulação (como em uma planilha).

    Se a tabela-verdade for baseada em um circuito existente, você poderá ver alguns quadrados róseos nas colunas das saídas marcados com "!!". Eles corresponderão a erros que ocorrerem enquanto for feito o cálculo do valor para aquela linha - ou quando o circuito estiver oscilando, ou ainda quando resultar em erro (o que será retratado como uma conexão vermelha no circuito Logisim). Ao passar o mouse sobre a entrada isso deverá trazer uma dica descrevendo o tipo de erro gerado. Uma vez que você tenha clicado sobre uma entrada de erro, você entrará no ciclo 0-1-x; não haverá como voltar.

    Próximo: Criar expressões.

    logisim-2.7.1/doc/pt/html/guide/analyze/open.html0000644000175000017500000001074611541757136021627 0ustar vincentvincent Abrir Análise Combinacional

    Abrir Análise Combinacional

    A maior parte do módulo Análise Combinacional é acessível através de uma janela de mesmo nome, que lhe permitirá ver tabelas-verdade e expressões lógicas (booleanas). Essa janela poderá ser aberta de duas maneiras.

    Através do menu Janela

    Ao selecionar Análise Combinacional, a atual será exibida na janela. Se você não tiver usado a janela antes, ela estará vazia e não estará analisando qualquer circuito.

    Apenas uma janela Análise Combinacional existirá dentro do Logisim, não importa quantos projetos estiverem abertos. Não há como permitir que se tenham duas análises diferentes abertas ao mesmo tempo.

    Através do menu Projeto

    A partir de uma janela para edição de circuitos, você também poderá solicitar que o Logisim analise o circuito corrente, se selecionar a opção Analisar Circuito no menu Projeto. Antes de abrir a janela, o Logisim irá calcular as expressões lógicas (booleanas) e montará uma tabela-verdade correspondente ao circuito.

    Para que a análise seja bem sucedida, cada entrada ou saída deverá ser conectada a cada um de seus respectivos pinos de entrada ou saída. O Logisim só analisará circuitos com no máximo oito de cada tipo, e todos deverão ser pinos com largura de um bit apenas. Caso contrário, você irá ver uma mensagem de erro e a janela não será aberta.

    Ao construir as expressões lógicas (booleanas) correspondentes a um circuito, o Logisim irá tentar, primeiro, construir expressões que correspondam exatamente às portas do circuito. Mas, se o circuito utilizar componentes que não sejam portas (como um multiplexador), ou se o circuito tiver mais de 100 níveis de profundidade (pouco provável), então aparecerá uma caixa de diálogo informando que foi impossível montar a expressão; e alternativamente, o Logisim tentará derivar as expressões baseando-se na tabela-verdade, que será determinada para cada combinação de entradas e pelas leituras das saídas resultantes.

    Depois de analisar um circuito, não haverá uma relação de continuidade entre o circuito e a janela de Análise Combinacional. Ou seja, mudanças no circuito não serão refletidas na janela, nem mudanças nas expressões lógicas (booleanas) e/ou na tabela-verdade serão refletidas no circuito. Você sempre terá liberdade para analisar o circuito novamente e, como veremos mais adiante, ou poderá substituir aquele que estiver na janela da Análise Combinacional.

    Limitações

    O Logisim não tentará detectar circuitos sequenciais: se você disser para analisar um circuito sequencial, ele tentará criar uma tabela-verdade e as correspondentes expressões lógicas (booleanas), ainda que essas possam não indicar precisamente o comportamento do circuito. (Na verdade, detectar circuitos sequenciais é comprovadamente impossível, de mesma monta como seria resolver o Problema da Parada. Claro, você poderia esperar que o Logisim fizesse, pelo menos, algumas tentativas - talvez procurar flip-flops ou ciclos nas conexões, mas ele não fará). Como resultado, o sistema de Análise Combinacional não deverá ser usado indiscriminadamente: use-o somente quando você tiver certeza de que o circuito que quiser analisar for realmente combinacional!

    O Logisim fará uma mudança no circuito original, que é talvez seja inesperada: o sistema de Análise Combinacional exige que cada entrada e saída possua um nome exclusivo em conformidade com as regras de identificadores Java. (De forma resumida, cada identificador deverá ter letras ou algarismos, e começar por letra. Espaços em branco não serão permitidos!) Ele tentará usar os rótulos dos pinos existentes, antes de usar uma lista de nomes padronizados, caso não haja rótulo. Se as regras não forem seguidas, o Logisim tentará extrair um válido a partir dos nomes nos rótulos, se possível.

    Aliás, a ordem das entradas na tabela-verdade combinará com seus pares em ordem decrescente no circuito original, seguindo da esquerda para a direita. (O mesmo vale para ordenar as saídas.)

    Próximo: Editar a tabela-verdade.

    logisim-2.7.1/doc/pt/html/guide/analyze/index.html0000644000175000017500000000340211541757136021764 0ustar vincentvincent Análise Combinacional

    Análise combinacional

    (Figura do original em inglês)

    Todos os circuitos podem ser separados em duas categorias bem conhecidas: a dos circuitos combinacionais, onde todas as saídas são combinações estritas das entradas correntes; ou a dos circuitos sequenciais, onde algumas saídas podem depender de entradas anteriores (a sequência de entradas ao longo do tempo).

    A categoria de circuitos combinacionais é a mais simples das duas. Seus usuários costumam usar três técnicas principais para resumir o comportamento de tais circuitos:

    • circuitos lógicos,
    • expressões lógicas (booleanas), que permitem uma representação algébrica de como o circuito funciona,
    • tabelas-verdade, que listam todas as combinações possíveis das entradas e das saídas correspondentes.
    O módulo Análise Combinacional do Logisim permite converter entre essas três representações, em qualquer sentido. É uma maneira particularmente útil para se criar e entender circuitos a partir de algumas entradas e saídas de um bit cada.

    Abrir Análise Combinacional
    Editar a tabela-verdade
    Criar expressões
    Gerar um circuito

    Próximo: Abrir Análise Combinacional.

    logisim-2.7.1/doc/pt/html/guide/analyze/gen.html0000644000175000017500000000411211541757136021425 0ustar vincentvincent Gerar um circuito

    Gerar um circuito

    O botão Gerar Circuito (Build Circuit) irá construir um circuito cujas portas corresponderão às expressões correntes escolhidas para cada saída. As entradas e saídas do circuito serão exibidas em ordem de cima para baixo correspondente à forma como elas aparecem sob as guias Entradas (Inputs) e Saídas (Outputs). De modo geral, o circuito será construído de forma bem clara; na verdade, uma aplicação do módulo de Análise Combinacional do Logisim é posicionar bem circuitos mesmo que mal desenhados. Ainda assim, como acontece com qualquer formatação automática, não irá expressar os detalhes estruturais como um circuito desenhado por um humano faria.

    Quando você clicar no botão Gerar Circuito (Build Circuit), uma caixa de diálogo irá aparecer solicitando que você escolha em qual projeto desejará colocar o circuito e que nome quer lhe dar. Se você digitar o nome de um circuito já existente, então esse circuito será substituído (após o Logisim perguntar se você realmente quer fazer isso).

    A caixa de diálogo Gerar Circuito (Build Circuit) inclui duas opções. A opção para Usar Portas Com Apenas Duas Entradas especifica que você deseja que todas as portas usadas a partir de então tenham duas entradas. (As portas NOT, é claro, constituem uma exceção a essa regra.) A opção Usar Apenas Portas NAND especifica que você gostaria que o circuito fosse traduzido usando apenas essas portas. Você poderá selecionar ambas as opções, se quiser usar apenas portas NAND de duas entradas.

    O Logisim não poderá construir um circuito somente com portas NAND para uma expressão contendo operadores XOR. Essa opção, portanto, será desativada se qualquer das expressões de saídas contiver XOR's.

    Próximo: Guia do usuário.

    logisim-2.7.1/doc/pt/html/guide/analyze/expr.html0000644000175000017500000001220511541757136021634 0ustar vincentvincent Criar expressões

    Criar expressões

    Para cada variável de saída, a janela Análise Combinacional manterá duas estruturas - uma coluna correspondente na tabela-verdade, e uma expressão lógica - que especificará a forma como cada entrada se relacionará com a sua saída. Você poderá editar tanto a tabela-verdade ou a expressão, que isso mudará a outra automaticamente, conforme necessário, para mantê-las coerentes.

    Como veremos a seguir, as expressões lógicas (ou booleanas) são particularmente úteis, pois a janela Análise Combinacional as usará quando for construir um circuito que corresponda ao estado atual.

    Você poderá visualizar e editar as expressões usando as duas últimas guias da janela: a Expressão (Expression) e a Minimizada (Minimized).

    A guia Expressão (Expression)

    (Figura do original em inglês)

    A guia Expression permite visualizar e editar as expressões correntes associadas a cada variável de saída. Você poderá selecionar a expressão de saída que desejar visualizar e editá-la usando o seletor rotulado como "Saída:" ("Output:") na parte superior do painel.

    Logo abaixo do seletor aparecerá a expressão formatada em uma notação particularmente comum, onde uma porta OR será representada como adição, uma porta AND será representada como multiplicação, e porta NOT é denotada com uma barra acima da parte afetada pela negação.

    O painel de texto embaixo mostra a mesma informação em formato ASCII. Aqui, uma porta NOT será representada por um til ('~').

    Você poderá editar a expressão no painel de texto e clicar no botão Entrar (Enter) para torná-la efetiva; isso também irá atualizar a tabela-verdade para mantê-la coerente. O botão Limpar (Clear) apagará o painel de texto, e botão Restaurar (Revert) fará o painel voltar a representar a expressão atual.

    Observar que as expressões editadas serão perdidas se você editar a tabela-verdade.

    Além dos sinais de multiplicação e adição em lugar das portas AND e OR, uma expressão poderá conter qualquer tipo de operadores lógicos em C/Java, bem como as próprias palavras (AND, OR, NOT).

    maior precedência:~ ! NOT
    (nada) & && AND
    ^ XOR
    menor precedência:+ | || OR

    Os exemplos a seguir são representações válidas de uma mesma expressão. Você também poderá misturar os operadores.

    ~a (b + c)
    !a && (b || c)
    NOT a AND (b OR c)

    Em geral, os parênteses sobre uma sequência de ANDs (ou ORs ou XORs) não importam. (Em particular, se criar um circuito correspondente no Logisim, ele irá ignorá-los.)

    A guia Minimizada (Minimized)

    (Figura do original em inglês)

    A última guia exibe uma soma de produtos minimizada correspondente a uma coluna da tabela-verdade. Você poderá selecionar qual a expressão minimizada de saída deverá ser exibida usando o seletor na parte superior.

    Se houver quatro entradas ou menos, um mapa de Karnaugh correspondente à variável irá aparecer abaixo do seletor. Você poderá clicar no mapa de Karnaugh para alterar os valores na tabela-verdade. O mapa de Karnaugh também apresentará os termos selecionados para a expressão minimizada por meio de retângulos arredondados, sólidos, semitransparentes.

    Embaixo estará a expressão minimizada, formatada como mostrado na guia Expressão (Expression). Se houver mais de quatro entradas, o mapa de Karnaugh não aparecerá, mas a expressão minimizada ainda será calculada. (O Logisim usa o algoritmo de Quine-McCluskey para calcular a expressão minimizada. Isso é equivalente a um mapa de Karnaugh, mas se aplica a qualquer número de variáveis de entrada.)

    O botão Definir Como Expressão (Set As Expression) permitirá selecionar a expressão minimizada como aquela correspondente à variável. Isso geralmente não será necessário, já que editar a tabela-verdade resultará no uso da expressão minimizada para a coluna alterada, mas se você digitar uma expressão através da guia apropriada, esta também poderá ser uma maneira conveniente para se alterar a expressão minimizada correspondente.

    Próximo: Gerar um circuito.

    logisim-2.7.1/doc/pt/html/guide/analyze/combvar.png0000644000175000017500000001777111541757136022144 0ustar vincentvincentPNG  IHDRGR3`PLTE-Nǧ"FD^Qjz123ҙ1Crr>>?`妦gΆ{O pHYs*b@?IDATx흋 @{XFZ!hf_8ff)Q>@\8ahnȊ,k8ǵ,(/N].跒,I"ӫK}Nʽ_\Iɲ$βH'wQ&wd{w>p0:{}>yspI"Vi04请먒űo #d;]Skɬ&=*I,(:&er<mY 4|Swk*zJ8iqk'F d9ׄ:nP 6Yq?{VU0vGmYWB]ӅqG!|KT~.ʘ88MN*/e⺋x cqv*yWE_u-gvfSEXW(߭4[&Mq)]HTZoR{Sv4R皯:?\˖`{f[w+}1)9*+:eQD?ai_Q/n}сbZRQ')#)Tvm%C},{e  WO/xl Î_J]Gͭm:80Y,Y^EhXXibT֬-:k.|~d&B8x+Ծ@}LV,.X9=8|c9'hϐAy^+]}Mzz)۫V_5\4ֱ`.#5+cJctS* \@JV FR(.nv0I7)'R/(*&KqX}W^N<*e#>grp˾wb͇aGBrjzM]u5uX[0QPҒ\.R"X_&|K|3l+E& NwDa"\XBU8'K M-P8J]$-iQE;l$э5P''q"n,s_ևMImYrdZw)~wY@-oN|vH닓bIt$-*{+ /[]t)J¤ ?47oWz: ĕmon6 ~֢S{ҨJtc<:z=A/}c,ԫ]ꔱjEzD{3+?iIEUUU_YZ3iS3Dmo: ΀r^A :Q+U*+Sgҡ}"{NV'vKg.Pf/g.6(3EsDse0 œTb\T(3 fY JL!r1Ơr˼~z93~3H{&;lIUkT֖$Kݕpqr&O톘kab1@2Z0I߄ A+ep>X0hUr ˘ޮfY r1e)eMN3evYSq0SMZMjnz"*ZpyJ$JiT I*V/H0(2S'3_jh279Cf%U <Y[Ta9ӞIϬ뗶k"0LFmKVMf]#&YgFێKSΔarϤ&ɚS9Vz`FFr&cHݴvنWvJs-hھSz&`D%:l^Yj$r*cmZ .t&J)D=? 3"6LB[gg$.- SvQ 0cHS&0H zڈ#1c3*[Yۓi)L &<(W'hWRberSWeyA8RQ Y\D$ J5eM 0Nն3dl/7J jQPXgH ̚#E V-e6ಈgr\ B P1TR+1(VW$G[jru6u.#Qq'Hڽo꩕H2yY=2z"pDT3 LĂehEmUuTks (ji!`ʂu]T2D,zqݬf]['4y9&RB[3/ H|IWGHg[IU?:nhZ%ڗtIP[mC@I6Mpyg "ԮVq׆#i"=lUѥԢ2+ooNӫ'~؁ɳE2sY0`2SQpa~@mFUt[wX!WN9 uFmV4S-8:q0)zy&Vag^97A\$DRb@1f==ssNHD+%7UjICs&; gy&U YNRlb*X.-vofITGK"\L@QY"o8eja"sl8▙!EUQa#ߦG{˂oMg_A lz~v0%C3"dNr\M 泂Z@ӞVA8{Q*'Ee zoep:b&Ces+Y aygMJF@Cs&RL &M̈́*9eׁq5qa =P UfD>W&q; x>,Wae fWMK,CPXfpKӹ/>!W\b3{]]L84qg;u lHT${*=)SZOȫt,;9t"إ( _X57;SS$'+Sf&ZV=n=mfOYV3k_lfϙH4(U+:3@m7$ÜCqЁ mBPhe6nh9vb׭M5ѩf}D^;ˡG7{lf7{:<v1:'?3˲ULN%f3)GsC0UVPVGԇfu1zozW_?x &ffBr:%fc?H)0.]F͢U/FĀ{O<^7?zϤ(s<3AϜfً>0B?4%̬ffmd!,ie^y{$5i$ӱ04Yh3[ \R1 Sn4as0Le8&6lC<19svݛm~6ޛup9fI;6"z70?3Q/3?oOכfffى=Ğ0ab3,{`f=;@E^03K{5#ajρVY}L~L|{ *fgV>gNݛT+l@aY }9̶ZR>9g_m5섿gxY)7eO!Lۛ}A؈ˆ(?3w̾J7A,z,alf s~ov07"LlfQ&&U Kìh)Yf?IiD39`f9a ,At`VJ+n6x07 {'am0ͻY],ܥ% kc03?fn+cY0u/#Ϊ=3!IܔZY_3˫TbxSCʱbL.F/Y%R|A@&9XJذ96sgVgN/tN0 )l<| G9М$"YN+G*ë =JQ3Z'ƨJ1xVbF F¤J"[h~΍\.X[m{> 3p`ٞRc#E x04#aMդ4K`Xff{`DovgS/Sܗ[sf e&3Bdo>?ϣώ`~?Bڄ# pHYs*b@[IDATx] ,؞̊WA-}xvlÀa$]-8q, Hy`K˙NGN9U rlAfSj\7ЯYec i}KYYWUح=E[&tƼD.{o:EqlyłI dVXѣ}|=tؗ*vne/%Xt N rugJ0^Ղʲc]r,~-t8두rs;CK}ط2i ^J J݁ Iكx;QVǿV.ˮ:B躩U6^ovr6MWW%;]+ٶ:m^r V:d^$.('<F[ijLū+uRu09sqS֖ҮvVDD+Z$BU )8NB/#c_+Yxz9QcAWvuشdlޮ=Y} BEN#ձѾZU" !Xs&ՇoGg9.U`; v%V-9¥!8i0}%.~b-.M~6Fա<{&1_% ^.a>ts}.Bd>yy"DYZvHG &H6ӎQrwxltǦtEߖKo[3?%(Y$W% 1nXERDZrQk5o(V$hD0ޫcpj1!cEV֧ͩ]ڜyeSҽm^cov ) mD$l.'҂7-`P#[Yvu<0%ʃ|)6=/3Nr'%yXJn\՛e޴C+>-2tdr۪CαW>m7@zҚ- `.RS.wjy=5j'ǂ۹%eV+6ofl*&RD18ђpڔKO+ܫ8_x4\gHeWmN?ئh4썐Tؒ[xM= x=Pnrxk[\mNVo 9.wDʉ:1 o%E &4t#n)q<[oް8^Zvko;Zۉ:ߎl Xbn7f in^6.y+;6@X` 6 .E.+ Y[jxC|oDXqAry \v!"OXM~hr-SeYSޚ+?Y[$z]k,΅5˦Qv١`1gstov[Kt9isLCMI23v/`$NjVdA{(v@D2D:/kXdW.tTUVvsl~W,M9w>aŖٴ*lYsvĊ]&zMiXw O{ZS\o$F=f׎iܢl,Wi["(^4xцv6W:]>` Cn~F ޝ4H 03gAt%uez;"Ǐn7|  vBzוIF-E2Yqd"sbcL۞J!"9ZduϕīංGln f d5d(; ~Qd*M ɁyfCf`bUK3zZ,$S DP(J0 ze*B5!"ֻ TVPȗ9e/My8!aYF.U):]CD(ORwKYIU0`{m͌ns*0r~~Z=޷e̘037՜/Whu/᠝`PfpY4]^ؔ!j_46Kq*oQ WF3}.ݓUe!TQ!#I).:%_4ɜ V./cj9 &4S6fPc`MKu=I d8 03\odxs0/L ACxy u$&ryQ'urzqЀ"IIfLf(~0,2?_Ϋ?\pRj, |&3]~eקWlfE/*=)a3g.|Q啟<@Pf7i&~f%2LF}0aQ;:]Ovffaޝc6ᩅYcO3%8>0;oVL3*0L.ǩgB(&Zjw``l6n?3q0f fLZ3ff3ό7;b3A3L 6O&CC@7hwz^f3?՛`oAF/4 C)ܙOj4S;Ido~& hޯsCV%~LOqMPM3?ӛ*gz3Zhf_g~yΰ@3_`3?ԛua.z}>nZZ^L7`z^;L|7g`i8'W~66?3)uCzTW3MYTm̎Z/%BČh/J U TTfRL_J .~i-5(ո;΂c jˬƏ;*J1z7뤟Y'c-jJ?W|>=vbd{DO ;YX͌8k5r6%lIUP=!q3ƲF1;;=ɴZʖVL歙38߰6`J?S|ZQx}8;1BĞj _kZt|/6$-/ !f%eZZE-ūhÅD;gL@qL(s5uXer@J%f=hͼK3 hAVJ tݢg|--ʰ,03J+:$7߰f͔Jf2]f=/_5C2D|ɑ53zRJ5%# - 5822fV{z5uVjSC)e1*I0DkbԟCb%tU2>6@+=B< 7 4S}l f8*[||Lr:1,t;U>,&0Lk3Eؗs7K LoDfq몷 \zPz( 4sV|Q^ȦZ)v/ {Ѭ[ O066 ΋w[-I Wo}ffFf3Πlf[`Tkө$53Y0o)v̤m&JY3i&f#0b7dGHw>R]43gk3qL/W)f})LR?fFix6 FgP;ެC4`& tOI a3ǒyⱙS 3&oNhf\sL7fl&0f?sVDܓ264GM&IfI\#3Yb֤dfffNRsͼLf&gE lJcĴߘzc~ ]9023NFdf[2ڴv,:Z$Fm37[6EgF;T"G)#:n3mf iI0S34jJ̧4hL=@/x34b1o("syx:@āf.tr(@s(pCXnkTgL_3 &3gfgQ\=LyPoZg>LsuM #@?4\#4癣Q$ﵜ3?96wlvjf, skg53*?׫?k3'9=?I{53Hlm07K3ެ8M?s`4kʊ/R.#~Mk4kʒOY l&f~M"oJ3g)<|@3d07+fQ)630ɸf=-`*W0xtf#y8yysެr1Əj&O%dT3xLiEp1.\[ ~[=h`*8c3irU̸ĺfv5`3g;ٙ%gP3_S>F?3z: f.fu^ nϛ42*g.͖ ϛZ;y= +!G/EMY]W5XJ}w^ ~ :0i*C3̈́$| lfJ̈́f6Q?zЛMf·R&gBo6)?lf2~&4gτ,@`3k35IϜ$f\`-gHa\f\#@Pv!?CskQ|6L3d^ˉ &F #I噭PL|͌7K׍K*#2Flvv㳙f{PԨEr>Vi鈄XNGjY:*q d.d8*xDL GXP%/HI2LT>hH8:?3JB(~ JUٖ fl IK!i|ff-rű5BˈA.,$TFF_`lյZ&L#.L"de`3߬dX2FFhERFֵ!FF˳FjwLS`ze''0Y 8<ϣ]u!0r0uL6WG&y:L fq:q0,\&v5h!w +Yj~WX_`*"0?T$KU۫^5:E>3&0Wu<G#» 9&0Qf[7Vfcl3Q(4{($hqn%9=!0&h&МF430f^bKdr0rZ仗V(f~3Mfo;f%ϐ{.jZ e+P72>?ާ`~g pHYs*b@&IDATx] mJJYDpi0ÀMEN2,$\d24| *.qRY1U'e5_OxG9\V"[P"-f3&B97rX]!ywl^fKQf6 (~b}2yYcEYe9$&-v6)@82zEP?EE䠿\P)aE }&x$*U8v-U<}lVes^ZYVVY+dJ+u2 L85֬Q7`DXr0lN:_@·8cE KԭV3c[ 6eMc6?Fi:3lM/dju\"/?ϴ9. )'$ׇRH&n~2o#XHh9z)v׳O}8b 0/%yr\Z) cƊ[lSBMV:`斍W̳}!.r]9bjd&SGV2U/UY6ܲAlha y ^Vj$[HE1jj+hH$b_^Fl؊\W!\ެ蚊;{z4tO^6y'v?~G~O:5q~%yK%2aG;k*{ϥzۗ*Aղi9!XfN$#%d)ɨ\̑L'yDYR) Q&W6(1AtDjɤkjDO3 DQ4iFY0F#P..Ǿ̈#3L&Ȼޘ 7 gl"p-q&f[&*-ꔎɚi.$/j#tcp;بW&`|nq㈮U!JRdᐵLaضh:@z6|#eRA;RKW^JHҵ1`Q`FLd(,QMHH ptSi5/ES4s+O +ܯ倛^]JLQn5ٸ$ۘ_)F22YW'& K\xEwaK fM &3+wk⼞0fTP/yP5b)Z· _UXJ[cۂr$XUt0EvGŬTn Hb1aZ{kܖc klW}'W5nBlx+4UE`Xtqll VnnWu iYiourvc-TSra MDU4RD (1ݜO.3 50u)̤PьUm o鬑E Wz&j'.)쩫h&(nɂ ]J0TT8S-fuUx5K_0wBYlȦUYqc2P0-sT뜶S̖󢬇asǝXUlƒܯpUU[YapEى_Rw xIXѴ뜪SOS`~)298fz /Fn/}* c mA$#LA2r1`n+eˆ_LF`~W3]0WoG%K*W3}1se|Cͬ{ 0Y'+l;wx߉43Wj5ӬqU-k7Nƾ f{y/Jk[r&w 3IdIKm.u4]0sXZy}fKIZՂ]C`_]0-jP.Φt0ӾvVv>3ޥs{^Cm`6yk<6}f+.-1ӭe_\#w3f~=3o0nL7;@`1> CtGG>̼޴^e63-`vjGxL=*Xz3Xo߾k%̹[h$:άC,Viܴ_|uU8Z `}0PznO0z3%8sLfG ? }f~6foe7>fFf73+Q2O|x<Ǟ|<)|QKȿi㩀eft\[+a׉RށU8>Bx[|f&#λ>'-XN5JLO|LBq4,1gzߩLbfXV̾ge& M6iY} 70gufR3f^2u^`̾آf %qbf`+9}h3{X,1EMf?0.3o$YO2릁Xt>r,d^UMj-&3Mw~rP veuW`>2\f^~ԬY;@J@{%U5.j`;9g5혩i>@-g3jh'ոD| ̡1(nc5&t~cQNlǶã`Nd ̬F794f]v3u̿LDӝ13ScEhl#gz$(L=B$.f3L͒3?Z71:3I7KB$!fLb& 1IB$fR3Yw}a9vʾ6YIzw 1sϟS"[dcb0 4D f@ $ (J 1s(Vfc[l1 dzk1>jHiJA. bfXJZdsvmIs+~^5Eq&4}53)y-<ղmoogr+ԛ Li>0͆D.%s:qb9›#`&5%KP;X LѬĸbgLa'|}40noVyL2 ܟ%f}01 P+&oͶſ](B<CFi) I]R ј3t:>-z#`f0DDٳlnf-A0 ̞Z۪sT 1ss6( J́v}+>&ٖX'fmTdka~&[ &=9RVNL=퉘9}K}&s(w|A%p#F͛l`oM#f~;LɈ=1|l9MfdLe2S>ۼ iYonث,Ov6V>I~rVF_]Nwv(oVR緭d*EfRfn^7%;3yU݃Y]YiV3'/"y7zFZqyr{4)oGJ^$kn6e;ՎK4zY Zn~3R0!+cMFf 1NJ`݉}o^z3fѹ>״N6 "kvu56r7sKg3{D5+g>UV$sn+~'0gFߏs%oW#VD /FYYQAB^dk^| M><熃eE2;@+| ]?[ⷂi Ye*VŢqvJ^d?):VoV-;~:3%ZC󎢙,|UךG>^|ٮ檵q5Vw0s;ygKfV7| L ol;Z};;\KWoo;z'lG4{~Lqܛ%1y9n0g]0L 枘I$!IB$!f~Lb&1|& 3Ig3gϤ$f3Iԛ%f8|& Lb&1I$&39e̤fvx`q&1sx`wgLL_LL|&I`>5gfLJi9f|}&ILg8$9z0_v3(/3bB?_϶_϶/b&I>s~ϟ-sH`"B{= &ڣ*Q5z2҄cͮ-zoXE=/ako׃IFf33g$!IBL$3Ig8$I>|& 3Ig3g8|& L$4$!IB>$IL$3Ig8|&L$3IhI>|& Lg$IB>ƙ$3 L3I?sL>s`.i$,53g,g8ƙ$4$q_3Jg%]oŷIg%ԋ;q}1 ;w.38vqI1~0_-̤f|Y!+e`d|=9sCמ٫v7MTrӸtgAg⌲#fL9I%a3 ,Ӕ|fL_eY*I>_f6gg޾^ʰ M+ljb}&zqiX9#pVhM-S%Eb8PAk8&_<qJ"qԬhyB0J\T lP0!0!ppCEbLӋgVٳ E,L01d3'-̞05y1rhc k`haϳ@|f̜8PuZ wYgfkQLzxG0F.\fԠcU`T`ifgm:M񻆆1|>"ٗG~`f1yR P#j]l`^vzN*hؽ+u`)! ' ^=`]$4&0wqziߟfX Nsu܁q`Or -zpB(@,0)1KF?ް2pIENDB`logisim-2.7.1/doc/pt/html/guide/about/0000755000175000017500000000000011541757136017437 5ustar vincentvincentlogisim-2.7.1/doc/pt/html/guide/about/mail.png0000644000175000017500000000125711541757136021074 0ustar vincentvincentPNG  IHDR$sRGBPLTE++RSpqгK`bKGDH pHYs  #IDAT8˭Ao0dnkҖkrm5BW&~g AѦY"`?y!Co]~5O慄f3SǩDa>43G(c!+,7]{_/ mu@Gl1#ڬRp]{ЋMqZyR *-ݜ,Q =L-CKZ[>cI-~ޜi9K0yOk9D!RsS)q%(v@YK4 C|1{ToLee#aH9GD7@S ӛSe@F]\lu*a҈*B`z$@ *OLo.L1 TLZg3\'sBGflI#S>ueXY}CI%YD5(׹7I7=阔SƙyIZZ~rmYuBmdJ1mף̈6De+ZԬj6E[ɑ_YgC8D5o}ƅ0_wܞ3{;?]'TmIENDB`logisim-2.7.1/doc/pt/html/guide/about/index.html0000644000175000017500000001204311541757136021434 0ustar vincentvincent Sobre o programa

    Sobre o programa

    O Logisim é um programa de código aberto. O código-fonte está incluído na pasta src contida no arquivo JAR.

    Se você considerar o Logisim útil, por favor me avise. Principalmente se você estiver ligado a uma instituição de ensino, pois suas informações poderão me ajudar na obtenção de maior apoio para manter esse trabalho.

    Agradeço o envio de emails sobre Logisim, que incluam relatórios de bugs, sugestões, e correções. Quando você me enviar algum, por favor, esteja ciente de que tenho trabalhado duro para manter o Logisim sem qualquer ônus da sua parte. Se você quiser ter o direito de reclamar sobre o programa, então sugiro direcionar seu orçamento para programas concorrentes do Logisim. (Não conheço outro com código aberto que seja tão rico em recursos como o Logisim). No entanto, mantenho meu interesse em continuar a melhorar o Logisim e suas sugestões serão muito bem-vindas.

    Comunicação de direitos autorais

    Copyright (c) 2005, Carl Burch.

    O Logisim é um programa gratuito; poderá ser redistribuído e/ou modificado sob os termos da GNU General Public License como publicada pela Free Software Foundation; quer seja na versão 2 dessa licença, ou qualquer outra posterior.

    O Logisim é distribuído na intenção de que possa ser útil, mas SEM QUALQUER GARANTIAS; nem mesmo aquela implícita para COMERCIALIZAÇÃO ou ADEQUAÇÃO PARA UM DETERMINADO PROPÓSITO. Favor consultar a GNU General Public License para maiores detalhes.

    Agradecimentos

    O código fonte do Logisim é basicamente trabalho meu, devo agradecer meus empregadores por financiar minhas atividades como professor, dentre elas o desenvolvimento desse programa: o qual iniciei, na Saint John's University (Collegeville, Minnesota, EUA) em 2000-2004, e tenho mantido no Hendrix College (Conway, Arkansas, EUA) desde 2004 até o presente. Sou muito grato a essas instituições por me conceder tempo e recursos para trabalhar nesse projeto. Tomara todas as faculdades e universidades pudessem agir em conjunto e serem tão zelosas com o ensino quanto essas excelentes instituições o fazem!

    Algumas outras pessoas têm sido particularmente úteis:

    • Ilia Lilov, Pablo Leal Ramos, e Uwe Zimmermann, que contribuíram com as traduções que acompanham o Logisim. Mais informações sobre as traduções podem ser encontrados em International Preferences.
    • A turma CS61C da Primavera de 2005 na Universidade da Califórnia, Berkeley, que experimentou as versões beta do Logisim 2.0. Esses alunos tiveram que lidar com muitos erros, e eu estou muito grato pela sua paciência e por suas sugestões!
    • As turmas CSCI 150 da Primavera de 2001 no College of Saint Benedict e na Saint John's University, que usaram as versões mais rudimentares de Logisim enquanto ainda estava sendo desenvolvido.

    Diversas partes do Logisim têm origem em outros programas; e várias dessas partes são distribuídas como parte do mesmo:

    Java API da Sun (obviamente)
    Sun projeto JavaHelp
    Fornece o sistema integrado no menu Ajuda.
    MRJAdapter, de Steve Roy
    Fornece a integração com a plataforma Macintosh OS X.
    launch4j, de Grzegorz Kowalt
    Permite a distribuição de Logisim como um executável do Windows.
    GIFEncoder, desde Adão Doppelt
    Salva imagens como arquivos GIF. Isso foi feito com base no código C escrito por Sverre H. Huseby.
    ColorPicker, de Jeremy Wood
    Fornece a caixa de diálogo que aparece quando da configuração de cores (como acontece com o componente LED).
    JFontChooser, de Christos Bohoris
    Fornece a fonte da caixa de diálogo que aparece ao selecionar os atributos de fonte (como o "Label Font" dos rótulos de muitos componentes).
    TableSorter, atribuído a Philip Milne, McLean Brendon, Dan van Enckevort, Parwinder Sekhon e ouroborus@ouroborus.org
    Oferece a capacidade de ordenar a tabela no diálogo Obter Estatísticas do Circuito ao clicar o cabeçalho de cada colunas.

    E finalmente, quero agradecer a todos os usuários que entraram em contato comigo - quer seja pelo envio de relatórios de bugs, sugestões, ou apenas para me dizer como estão usando o Logisim em suas aulas. Devo deixar essas contribuições anônimas, já que não tenho permissão para mencioná-las aqui, mas de qualquer forma: obrigado!

    logisim-2.7.1/doc/pt/html/guide/about/gpl.html0000644000175000017500000003646711541757136021127 0ustar vincentvincent Sobre o programa
    		    GNU GENERAL PUBLIC LICENSE
    		       Version 2, June 1991
    
     Copyright (C) 1989, 1991 Free Software Foundation, Inc.
     51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
     Everyone is permitted to copy and distribute verbatim copies
     of this license document, but changing it is not allowed.
    
    			    Preamble
    
      The licenses for most software are designed to take away your
    freedom to share and change it.  By contrast, the GNU General Public
    License is intended to guarantee your freedom to share and change free
    software--to make sure the software is free for all its users.  This
    General Public License applies to most of the Free Software
    Foundation's software and to any other program whose authors commit to
    using it.  (Some other Free Software Foundation software is covered by
    the GNU Library General Public License instead.)  You can apply it to
    your programs, too.
    
      When we speak of free software, we are referring to freedom, not
    price.  Our General Public Licenses are designed to make sure that you
    have the freedom to distribute copies of free software (and charge for
    this service if you wish), that you receive source code or can get it
    if you want it, that you can change the software or use pieces of it
    in new free programs; and that you know you can do these things.
    
      To protect your rights, we need to make restrictions that forbid
    anyone to deny you these rights or to ask you to surrender the rights.
    These restrictions translate to certain responsibilities for you if you
    distribute copies of the software, or if you modify it.
    
      For example, if you distribute copies of such a program, whether
    gratis or for a fee, you must give the recipients all the rights that
    you have.  You must make sure that they, too, receive or can get the
    source code.  And you must show them these terms so they know their
    rights.
    
      We protect your rights with two steps: (1) copyright the software, and
    (2) offer you this license which gives you legal permission to copy,
    distribute and/or modify the software.
    
      Also, for each author's protection and ours, we want to make certain
    that everyone understands that there is no warranty for this free
    software.  If the software is modified by someone else and passed on, we
    want its recipients to know that what they have is not the original, so
    that any problems introduced by others will not reflect on the original
    authors' reputations.
    
      Finally, any free program is threatened constantly by software
    patents.  We wish to avoid the danger that redistributors of a free
    program will individually obtain patent licenses, in effect making the
    program proprietary.  To prevent this, we have made it clear that any
    patent must be licensed for everyone's free use or not licensed at all.
    
      The precise terms and conditions for copying, distribution and
    modification follow.
    
    		    GNU GENERAL PUBLIC LICENSE
       TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
    
      0. This License applies to any program or other work which contains
    a notice placed by the copyright holder saying it may be distributed
    under the terms of this General Public License.  The "Program", below,
    refers to any such program or work, and a "work based on the Program"
    means either the Program or any derivative work under copyright law:
    that is to say, a work containing the Program or a portion of it,
    either verbatim or with modifications and/or translated into another
    language.  (Hereinafter, translation is included without limitation in
    the term "modification".)  Each licensee is addressed as "you".
    
    Activities other than copying, distribution and modification are not
    covered by this License; they are outside its scope.  The act of
    running the Program is not restricted, and the output from the Program
    is covered only if its contents constitute a work based on the
    Program (independent of having been made by running the Program).
    Whether that is true depends on what the Program does.
    
      1. You may copy and distribute verbatim copies of the Program's
    source code as you receive it, in any medium, provided that you
    conspicuously and appropriately publish on each copy an appropriate
    copyright notice and disclaimer of warranty; keep intact all the
    notices that refer to this License and to the absence of any warranty;
    and give any other recipients of the Program a copy of this License
    along with the Program.
    
    You may charge a fee for the physical act of transferring a copy, and
    you may at your option offer warranty protection in exchange for a fee.
    
      2. You may modify your copy or copies of the Program or any portion
    of it, thus forming a work based on the Program, and copy and
    distribute such modifications or work under the terms of Section 1
    above, provided that you also meet all of these conditions:
    
        a) You must cause the modified files to carry prominent notices
        stating that you changed the files and the date of any change.
    
        b) You must cause any work that you distribute or publish, that in
        whole or in part contains or is derived from the Program or any
        part thereof, to be licensed as a whole at no charge to all third
        parties under the terms of this License.
    
        c) If the modified program normally reads commands interactively
        when run, you must cause it, when started running for such
        interactive use in the most ordinary way, to print or display an
        announcement including an appropriate copyright notice and a
        notice that there is no warranty (or else, saying that you provide
        a warranty) and that users may redistribute the program under
        these conditions, and telling the user how to view a copy of this
        License.  (Exception: if the Program itself is interactive but
        does not normally print such an announcement, your work based on
        the Program is not required to print an announcement.)
    
    These requirements apply to the modified work as a whole.  If
    identifiable sections of that work are not derived from the Program,
    and can be reasonably considered independent and separate works in
    themselves, then this License, and its terms, do not apply to those
    sections when you distribute them as separate works.  But when you
    distribute the same sections as part of a whole which is a work based
    on the Program, the distribution of the whole must be on the terms of
    this License, whose permissions for other licensees extend to the
    entire whole, and thus to each and every part regardless of who wrote it.
    
    Thus, it is not the intent of this section to claim rights or contest
    your rights to work written entirely by you; rather, the intent is to
    exercise the right to control the distribution of derivative or
    collective works based on the Program.
    
    In addition, mere aggregation of another work not based on the Program
    with the Program (or with a work based on the Program) on a volume of
    a storage or distribution medium does not bring the other work under
    the scope of this License.
    
      3. You may copy and distribute the Program (or a work based on it,
    under Section 2) in object code or executable form under the terms of
    Sections 1 and 2 above provided that you also do one of the following:
    
        a) Accompany it with the complete corresponding machine-readable
        source code, which must be distributed under the terms of Sections
        1 and 2 above on a medium customarily used for software interchange; or,
    
        b) Accompany it with a written offer, valid for at least three
        years, to give any third party, for a charge no more than your
        cost of physically performing source distribution, a complete
        machine-readable copy of the corresponding source code, to be
        distributed under the terms of Sections 1 and 2 above on a medium
        customarily used for software interchange; or,
    
        c) Accompany it with the information you received as to the offer
        to distribute corresponding source code.  (This alternative is
        allowed only for noncommercial distribution and only if you
        received the program in object code or executable form with such
        an offer, in accord with Subsection b above.)
    
    The source code for a work means the preferred form of the work for
    making modifications to it.  For an executable work, complete source
    code means all the source code for all modules it contains, plus any
    associated interface definition files, plus the scripts used to
    control compilation and installation of the executable.  However, as a
    special exception, the source code distributed need not include
    anything that is normally distributed (in either source or binary
    form) with the major components (compiler, kernel, and so on) of the
    operating system on which the executable runs, unless that component
    itself accompanies the executable.
    
    If distribution of executable or object code is made by offering
    access to copy from a designated place, then offering equivalent
    access to copy the source code from the same place counts as
    distribution of the source code, even though third parties are not
    compelled to copy the source along with the object code.
    
      4. You may not copy, modify, sublicense, or distribute the Program
    except as expressly provided under this License.  Any attempt
    otherwise to copy, modify, sublicense or distribute the Program is
    void, and will automatically terminate your rights under this License.
    However, parties who have received copies, or rights, from you under
    this License will not have their licenses terminated so long as such
    parties remain in full compliance.
    
      5. You are not required to accept this License, since you have not
    signed it.  However, nothing else grants you permission to modify or
    distribute the Program or its derivative works.  These actions are
    prohibited by law if you do not accept this License.  Therefore, by
    modifying or distributing the Program (or any work based on the
    Program), you indicate your acceptance of this License to do so, and
    all its terms and conditions for copying, distributing or modifying
    the Program or works based on it.
    
      6. Each time you redistribute the Program (or any work based on the
    Program), the recipient automatically receives a license from the
    original licensor to copy, distribute or modify the Program subject to
    these terms and conditions.  You may not impose any further
    restrictions on the recipients' exercise of the rights granted herein.
    You are not responsible for enforcing compliance by third parties to
    this License.
    
      7. If, as a consequence of a court judgment or allegation of patent
    infringement or for any other reason (not limited to patent issues),
    conditions are imposed on you (whether by court order, agreement or
    otherwise) that contradict the conditions of this License, they do not
    excuse you from the conditions of this License.  If you cannot
    distribute so as to satisfy simultaneously your obligations under this
    License and any other pertinent obligations, then as a consequence you
    may not distribute the Program at all.  For example, if a patent
    license would not permit royalty-free redistribution of the Program by
    all those who receive copies directly or indirectly through you, then
    the only way you could satisfy both it and this License would be to
    refrain entirely from distribution of the Program.
    
    If any portion of this section is held invalid or unenforceable under
    any particular circumstance, the balance of the section is intended to
    apply and the section as a whole is intended to apply in other
    circumstances.
    
    It is not the purpose of this section to induce you to infringe any
    patents or other property right claims or to contest validity of any
    such claims; this section has the sole purpose of protecting the
    integrity of the free software distribution system, which is
    implemented by public license practices.  Many people have made
    generous contributions to the wide range of software distributed
    through that system in reliance on consistent application of that
    system; it is up to the author/donor to decide if he or she is willing
    to distribute software through any other system and a licensee cannot
    impose that choice.
    
    This section is intended to make thoroughly clear what is believed to
    be a consequence of the rest of this License.
    
      8. If the distribution and/or use of the Program is restricted in
    certain countries either by patents or by copyrighted interfaces, the
    original copyright holder who places the Program under this License
    may add an explicit geographical distribution limitation excluding
    those countries, so that distribution is permitted only in or among
    countries not thus excluded.  In such case, this License incorporates
    the limitation as if written in the body of this License.
    
      9. The Free Software Foundation may publish revised and/or new versions
    of the General Public License from time to time.  Such new versions will
    be similar in spirit to the present version, but may differ in detail to
    address new problems or concerns.
    
    Each version is given a distinguishing version number.  If the Program
    specifies a version number of this License which applies to it and "any
    later version", you have the option of following the terms and conditions
    either of that version or of any later version published by the Free
    Software Foundation.  If the Program does not specify a version number of
    this License, you may choose any version ever published by the Free Software
    Foundation.
    
      10. If you wish to incorporate parts of the Program into other free
    programs whose distribution conditions are different, write to the author
    to ask for permission.  For software which is copyrighted by the Free
    Software Foundation, write to the Free Software Foundation; we sometimes
    make exceptions for this.  Our decision will be guided by the two goals
    of preserving the free status of all derivatives of our free software and
    of promoting the sharing and reuse of software generally.
    
    			    NO WARRANTY
    
      11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
    FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
    OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
    PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
    OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
    MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
    TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
    PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
    REPAIR OR CORRECTION.
    
      12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
    WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
    REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
    INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
    OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
    TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
    YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
    PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
    POSSIBILITY OF SUCH DAMAGES.
    
    		     END OF TERMS AND CONDITIONS
    
    (Nota do tradutor: Preservado o texto original na íntegra por razões legais.) logisim-2.7.1/doc/pt/html/contents.html0000644000175000017500000001645611541757136017767 0ustar vincentvincent

    Referências do Logisim

    Guia para se tornar usuário do Logisim

  • Propagação de sinal
  • Bibliotecas JAR
  • Sobre o programa
  • Referências para bibliotecas

    logisim-2.7.1/doc/pt/contents.xml0000644000175000017500000002255411541757152016651 0ustar vincentvincent logisim-2.7.1/doc/map_ru.jhm0000644000175000017500000003032411541757154015626 0ustar vincentvincent logisim-2.7.1/doc/map_pt.jhm0000644000175000017500000003032411541757154015623 0ustar vincentvincent logisim-2.7.1/doc/map_es.jhm0000644000175000017500000003032411541757152015605 0ustar vincentvincent logisim-2.7.1/doc/map_en.jhm0000644000175000017500000003032411541757152015600 0ustar vincentvincent logisim-2.7.1/doc/map_el.jhm0000644000175000017500000003032411541757152015576 0ustar vincentvincent logisim-2.7.1/doc/map_de.jhm0000644000175000017500000003032411541757152015566 0ustar vincentvincent logisim-2.7.1/doc/es/0000755000175000017500000000000011541757152014246 5ustar vincentvincentlogisim-2.7.1/doc/es/img-libs/0000755000175000017500000000000011541757132015747 5ustar vincentvincentlogisim-2.7.1/doc/es/img-guide/0000755000175000017500000000000011541757132016113 5ustar vincentvincentlogisim-2.7.1/doc/es/icons/0000755000175000017500000000000011541757132015357 5ustar vincentvincentlogisim-2.7.1/doc/es/html/0000755000175000017500000000000011541757132015210 5ustar vincentvincentlogisim-2.7.1/doc/es/html/libs/0000755000175000017500000000000011541757134016143 5ustar vincentvincentlogisim-2.7.1/doc/es/html/libs/wiring/0000755000175000017500000000000011541757134017442 5ustar vincentvincentlogisim-2.7.1/doc/es/html/libs/wiring/tunnel.html0000644000175000017500000000545311541757134021644 0ustar vincentvincent Tunnel

    Tunnel

    Library: Wiring
    Introduced: 2.5.0 (in Base library, moved to Wiring in 2.7.0)
    Appearance:

    Behavior

    A tunnel acts like a wire in that it binds points together, but unlike a wire the connection is not explicitly drawn. This is helpful when you need to connect points far apart in the circuit and a network of wires would make the circuit much more ugly. The below illustration illustrates how this works.

    Here, all three tunnels have the same label, a, and so the three points to which the tunnels point are connected. (If one of the tunnels were labeled something else, like b, then it would be part of a different set of tunnels.) The controlled buffer at top emits a floating output since its lower input is 0. This normally leads the wire coming from the controlled buffer to be blue; but here it is dark green because the floating output combines through the tunnel with the 0 from the pin at bottom. If the control input into the buffer changes to 1, then the controlled buffer would feed 1 into the tunnel, which would combine with 0 from the pin at bottom to result in an error value; thus, we would then see red wires feeding through all three tunnels.

    Pins

    A tunnel has only one pin, whose bit width matches the tunnel's Data Bits attribute. This pin is neither an input nor an output — the matching tunnels are simply connected transparently.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute and the arrow keys alter its Facing attribute.

    Facing
    The direction toward which the tunnel points.
    Data Bits
    The number of bits for the tunnel.
    Label
    The text within the label associated with the tunnel. This tunnel is connected to all other tunnels with exactly the same label.
    Label Font
    The font with which to render the label.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    Allows the label associated with the tunnel to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/wiring/transmis.html0000644000175000017500000001152411541757134022173 0ustar vincentvincent Transmission Gate

    Transmission Gate

    Library: Wiring
    Introduced: 2.7.0
    Appearance:

    Behavior

    A transmission gate has three inputs, called source, n-gate, and p-gate; and it has one output, called drain. When diagrammed, the source input and drain output are drawn connected by two plates; Logisim draws an arrowhead to indicate the direction of flow from input to output. The two gate inputs are drawn as lines connected to plates parallel to each of the plates connecting source to drain. The p-gate input's line has a circle, while the n-gate input's line does not.

    p-gate
    source drain
    n-gate

    The transmission gate is simply the combination of two complementary transistors. Indeed, the same behavior can be achieved in Logisim by using just one transistor. However, designers sometimes prefer to use matched pairs of transistors due to electrical issues with draining voltage that is more complex than Logisim attempts to simulate.

    The values at n-gate and p-gate are expected to be opposite to each other. If p-gate is 0 while n-gate is 1, then the value found at source is transmitted to drain. If p-gate is 1 while p-gate is 0, then the connection is broken, so the value at drain is left floating. In all other cases, drain receives an error output — unless source is floating, in which case drain is floating as well. This behavior is summarized by the following table.

    p-gaten-gatedrain
    00X*
    01source
    10Z
    11X*
    X/ZanyX*
    anyX/ZX*

    * If source is Z, drain is Z; otherwise drain is X.

    If the Data Bits attribute is more than 1, each gate input is still a single bit, but the gate values are applied simultaneously to each of the source input's bits.

    Pins (assuming component faces east, gate line top/left)

    West edge (input, bit width matches Data Bits attribute)
    The component's source input that will transmit to the output if triggered by the p-gate and n-gate inputs.
    North edge (input, bit width 1)
    The component's p-gate input.
    South edge (input, bit width 1)
    The component's n-gate input.
    East edge (output, bit width matches Data Bits attribute)
    The component's output, which will match the source input if p-gate is 0 and n-gate is 1, or it will be floating if p-gate is 1 and n-gate is 0. For all other values on p-gate and n-gate, the output is an error value.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute and the arrow keys alter its Facing attribute.

    Facing
    The direction of the component (its output relative to its input).
    Gate Location
    The location of the gate input.
    Data Bits
    The bit width of the component's inputs and outputs.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/wiring/transist.html0000644000175000017500000001572311541757134022207 0ustar vincentvincent Transistor

    Transistor

    Library: Wiring
    Introduced: 2.7.0
    Appearance:

    Behavior

    A transistor has two inputs, called gate and source, and one output, called drain. When diagrammed, the source input and drain output are drawn connected by a plate; Logisim draws an arrowhead to indicate the direction of flow from input to output. The gate input is drawn connected to a plate that is parallel to the plate connecting source to drain. Logisim supports two types of transistors, with slightly different behaviors described below; the P-type transistor is indicated by a circle connecting the gate input to its plate, while the N-type transistor has no such circle.

    Depending on the value found at gate, the value at source may be transmitted to drain; or there may be no connection from source, so drain is left floating. The determination of transmitting or disconnecting depends on the type of transistor: A P-type transistor (indicated by a circle on the gate line) transmits when gate is 0, while an N-type transistor (which has no such circle) transmits when gate is 1. The behavior is summarized by the following tables.

    P-type
    gate
    01X/Z
    0 0ZX
    source1 1ZX
    Z ZZZ
    X XZX
       
    N-type
    gate
    01X/Z
    0 Z0X
    source1 Z1X
    Z ZZZ
    X ZXX

    Or in summarized form:

    P-type
    gatedrain
    0source
    1Z
    X/ZX*
       
    N-type
    gatedrain
    0Z
    1source
    X/ZX*

    * If source is Z, drain is Z; otherwise drain is X.

    If the Data Bits attribute is more than 1, the gate input is still a single bit, but its value is applied simultaneously to each of the source input's bits.

    An N-type transistor behaves very similarly to a Controlled Buffer. The primary difference is that a transistor is meant for more basic circuit designs.

    Pins (assuming component faces east, gate line top/left)

    West edge (input, bit width matches Data Bits attribute)
    The component's source input that will transmit to the output if triggered by the gate input.
    North edge (input, bit width 1)
    The component's gate input. For P-type transistors, the transistor will transmit if the gate value is 0; for N-type transistors, this will trigger the transistor if the gate value is 1.
    East edge (output, bit width matches Data Bits attribute)
    The component's output, which will match the source input if indicated by the gate input, or will be floating if the gate input is the negation of what indicates negation. If gate is floating or an error value, then the output will be an error value.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute and the arrow keys alter its Facing attribute.

    Type
    Determines whether the transistor is P-type or N-type.
    Facing
    The direction of the component (its output relative to its input).
    Gate Location
    The location of the gate input.
    Data Bits
    The bit width of the component's inputs and outputs.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/wiring/splitter.html0000644000175000017500000001152011541757134022175 0ustar vincentvincent Splitter

    Splitter

    Library: Wiring
    Introduced: 2.0 Beta 1 (in Base library, moved to Wiring in 2.7.0)
    Appearance:

    Behavior

    The splitter creates a correspondence between a multi-bit value and several separate subsets of those bits. Despite its name, it can either split a multi-bit value into component parts, or it can combine component parts into a multi-bit value - or indeed it can do both at once. A more complete description of splitters is found in the `Splitters' section of the User's Guide.

    Logisim treats splitters specially when propagating values within a circuit: Whereas all other components have a computed delay for purposes of simulating their behavior, values propagate through splitters (as well as wires) instantaneously.

    Note: The term splitter is a non-standard term, which is unique to Logisim as far as I know. I am unaware of any standard term for such a concept; the only term I have heard used is bus ripper, but this term is unnecessarily violent for my tastes.

    Pins

    To distinguish the several connecting points for a splitter, we refer to the single connecting point one side as its combined end, and we refer to the multiple connecting points on the other side as its split ends.

    Combined end (input/output bit width matches Bit Width In attribute)
    A value holding all of the bits traveling through the splitter.
    Split ends (input/output, bit width computed based on Bit x attributes)
    The number of split ends is specified in the Fan Out attribute, and each split end has an index that is at least 0 and less than the Fan Out attribute. For each split end, all bits for which Bit x refers to its index travels through that split end; the order of these bits is the same as their order within the combined end.

    Attributes

    When the component is selected or being added, the digits '0' through '9' alter its Fan Out attribute, Alt-0 through Alt-9 alter both the Fan Out and Bit Width In attributes, and the arrow keys alter its Facing attribute.

    Facing

    The location of the split ends relative to the combined end.

    Fan Out

    The number of split ends.

    Bit Width In

    The bit width of the combined end.

    Appearance

    Supports different ways of depicting the splitter in the circuit. The Left-handed option (the default) draws a spine going left from the combined end, with a labeled line coming from the spine for each split end. The Right-handed option is the same except the spine goes right (if you're facing according to the Facing attribute). The Centered option centers the spine so it goes in roughly equal directions left and right. And the Legacy option draws diagonal lines to each split end, without labels; this option is primarily for compatibility with versions older than 2.7.0, when this was the only option for splitter appearance.

    Bit x

    The index of the split end to which bit x of the combined end corresponds. The split ends are indexed starting from 0 at the top (for a splitter facing east or west) or from 0 at the left/west (for a splitter facing north or south). A bit can be specified to correspond to none of the split ends. There is no way for a bit to correspond to multiple split ends.

    Sometimes you can avoid twiddling each individual Bit x attribute by bringing up the pop-up menu for a splitter (usually by right-clicking or control-clicking it). The pop-up menu includes options labeled Distribute Ascending and Distribute Descending. The Distribute Ascending option distributes the bits so that each split end receives the same number of bits, starting from end 0. (If the number of split ends doesn't divide exactly into the number of bits, then the bits are distributed as evenly as possible.) Distribute Descending does the same but starts from the highest-numbered end.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/wiring/pull.html0000644000175000017500000000407011541757134021305 0ustar vincentvincent Pull Resistor

    Pull Resistor

    Library: Wiring
    Introduced: 2.5.0 (in Base library, moved to Wiring in 2.7.0)
    Appearance:
    Shaped:
    Rectangular:

    Behavior

    When connected to a point, this component has an effect only when the value at that point is the floating value (Z). In this case, the resistor pulls the wire to which it is connected toward the value indicated in its Pull Direction attribute.

    If it is connected to a multiple-bit value, then each bit in the value that is floating is pulled in the direction specified, while the bits that are not floating are left unchanged.

    Pins

    The resistor has just one pin, which is an output and has a bit width that is derived from whichever component it is connected.

    Attributes

    When the component is selected or being added, the arrow keys alter its Facing attribute.

    Facing
    The direction in which the component's pin lies from component's center.
    Pull Direction
    Specifies the value to which a floating value should be pulled. This could be 0, 1, or the error value.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/wiring/probe.html0000644000175000017500000000454311541757134021445 0ustar vincentvincent Probe

    Probe

    Library: Wiring
    Introduced: 2.0.3 (in Base library, moved to Wiring in 2.7.0)
    Appearance:

    Behavior

    A probe is an element that simply displays the value at a given point in a circuit. It does not itself interact with other components.

    In most respects, the probe component duplicates the functionality found in a Pin component configured as an output pin. The primary difference is that if the circuit is used as a subcircuit component, then an output pin will be a part of that interface, whereas a probe is not. They also are different in that the probe does not have a Data Bits attribute to be configured: The bit width is inferred from whatever value it happens to see on its input. Graphically, they are similar but have slightly different borders: A pin has a thick, black border, whereas a probe has a thin, gray border.

    Pins

    A probe component has only one pin, which will acts as an input to the probe. The width that this pin accepts is adaptive: The probe will adapt to inputs of any width.

    Attributes

    When the component is selected or being added, the arrow keys alter its Facing attribute.

    Facing
    The side of the component where its input pin should be.
    Label
    The text within the label associated with the component.
    Label Location
    The location of the label relative to the component.
    Label Font
    The font with which to render the label.
    Radix
    The base (for example, binary, decimal, or hexadecimal) in which a value is displayed.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    Allows the label associated with the component to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/wiring/pin.html0000644000175000017500000001151311541757134021117 0ustar vincentvincent Pin

    Pin

    Library: Wiring
    Introduced: 2.0 Beta 1 (in Base library, moved to Wiring in 2.7.0)
    Appearance:

    Behavior

    A pin is an output or an input to a circuit, depending on the value of its Output? attribute. In drawing a pin, Logisim represents output pins using a circle or rounded rectangle, and input pins are represented using squares or rectangles. In either case, the individual bits of the value being sent or received is displayed within the component (except within printer view, when the component only says how many bits wide the pin is).

    A pin is a convenient component for interacting with a circuit, and beginning Logisim users need not use them in any other way. But a user building a circuit using several subcircuits (as described in the `Subcircuits' section of the User's Guide) will use pins also to specify the interface between a circuit and a subcircuit. In particular, a circuit layout's pin components define the pins that appear on the subcircuit component when the layout is used within another circuit. In such a circuit, the values sent and received to those locations on the subcircuit component are tied to the pins within the subcircuit layout.

    Pins

    A pin component has only one pin, which will be an input to the component if the pin is an output pin, and it will be an output to the component if the pin is an input pin. In either case, its bit width matches the Data Bits attribute, and its location is specified by the Facing attribute.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute, the arrow keys alter its Facing attribute, and Alt with an arrow key alters its Label Location attribute.

    Facing
    The side of the component where its input/output pin should be.
    Output?
    Specifies whether the component is an output pin or an input pin. (Note that if the pin component is an input pin, then the pin that acts as its interface within the circuit will be an output, and vice versa.)
    Data Bits
    The number of bits for the value that the pin handles.
    Three-state?
    For an input pin, this configures whether the user can instruct the pin to emit unspecified (i.e., floating) values. The attribute deals with the user interface only; it does not have any effect on how the pin behaves when the circuit layout is used as a subcircuit. For an output pin, the attribute has no effect.
    Pull Behavior
    For an input pin, the attribute specifies how floating values should be treated when received as an input, perhaps from a circuit using the layout as a subcircuit. With "unchanged," the floating values are sent into the layout as floating values; with "pull up," they are converted into 1 values before being sent into the circuit layout; and with "pull down," they are converted into 0 values before being sent into the circuit layout.
    Label
    The text within the label associated with the component.
    Label Location
    The location of the label relative to the component.
    Label Font
    The font with which to render the label.

    Poke Tool Behavior

    Clicking an output pin has no effect, although the pin's attributes will be displayed.

    Clicking an input pin will toggle the bit that is clicked. If it is a three-state pin, then the corresponding bit will rotate between the three states.

    If, however, the user is viewing the state of a subcircuit as described in the `Debugging Subcircuits' of the User's Guide, then the pin's value is pinned to whatever value the subcircuit is receiving from the containing circuit. The user cannot change the value without breaking this link between the subcircuit's state and the containing circuit's state, and Logisim will prompt the user to verify that breaking this link is actually desired.

    Text Tool Behavior

    Allows the label associated with the component to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/wiring/index.html0000644000175000017500000000536511541757134021450 0ustar vincentvincent Wiring Library

    Wiring library

    The Wiring library includes components that relate primarily to wires and to basic electrical concepts.

    Splitter
    Pin
    Probe
    Tunnel
    Pull Resistor
    Clock
    Constant
    Power/Ground
    Transistor
    Transmission Gate
    Bit Extender

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/wiring/extender.html0000644000175000017500000000510511541757134022147 0ustar vincentvincent Bit Extender

    Bit Extender

    Library: Wiring
    Introduced: 2.5.0 (in Base library, moved to Wiring in 2.7.0)
    Appearance:

    Behavior

    The bit extender transforms a value into a value of another bit width. If it's being transformed into a smaller bit width, it is simply truncated to keep the lowest-order bits. If it's being transformed into a large bit width, the lowest-order bits are the same, and you have a choice about what the additional high-order bits will be: They can all be 0, all be 1, all match the input's sign bit (its highest-order bit), or the component can have an additional one-bit input that determines the identity of these other bits.

    Pins

    West edge (input, bit width from Bit Width In attribute)

    The multi-bit input whose value is to be transformed.

    East edge (output, bit width from Bit Width Out attribute)

    The computed output.

    North edge (input, bit width 1)

    Specifies what the additional bits in the output should be. This pin is available only when the Extension Type attribute is Input.

    Attributes

    When the component is selected or being added, the digits 0 through 9 alter the Bit Width In attribute and Alt-0 through Alt-9 alter its Bit Width Out attribute.

    Bit Width In
    The input's bit width.
    Bit Width Out
    The output's bit width.
    Extension Type
    Assuming the output bit width exceeds the input bit width, this attribute configures what the additional output bits should be. If Zero or One, the additional bits are 0 or 1 accordingly. If Sign, the additional bits are taken to match the highest-order bit in the input. And if Input, the component has a second input on its north side whose one-bit value is used for the additional bits.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/wiring/constant.html0000644000175000017500000000341711541757134022166 0ustar vincentvincent Constant

    Constant

    Library: Wiring
    Introduced: 2.0 Beta 1 (in Gates library, moved to Wiring in 2.7.0)
    Appearance:

    Behavior

    Emits the value specified in its Value attribute.

    Pins

    There is only one pin, an output whose bit width matches the Data Bits attribute. The location of this pin is specified in the Facing attribute. The component constantly outputs on this pin whatever value specified in the Value attribute.

    Attributes

    When the component is selected or being added, the hexademical digits '0' through '9' and 'a' through 'f' alter its Value attribute, Alt-0 through Alt-9 alter its Data Bits attribute, and the arrow keys alter its Facing attribute.

    Facing
    The direction in which the pin is located relative to where the value is drawn.
    Data Bits
    The bit width of the value placed onto the wire.
    Value
    The value, written in hexademical, that is emitted by the component. The number of bits used to specify the value cannot exceed the component's bit width.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/wiring/const01.html0000644000175000017500000000415611541757134021625 0ustar vincentvincent Power/Ground

    Power/Ground

    Library: Wiring
    Introduced: 2.7.0
    Appearance:

    Behavior

    Emits a single value onto a wire. For a power element, indicated by a triangle, this value will be one (or, if the Data Bits attribute is more than 1, an all-ones value). For a ground element, indicated by an arrow of three shortening parallel lines, this value will be zero (or, if the Data Bits attribute is more than 1, an all-zero value).

    The same functionality can be achieved using the more versatile Constant component. The only reason to prefer ground and power is that they are standard electronic symbols.

    Pins

    There is only one pin, an output whose bit width matches the Data Bits attribute. The component constantly outputs the same value on this pin: for a ground component, the output is an all-zero value, and for a power component, the output is an all-one value.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute and the arrow keys alter its Facing attribute.

    Facing
    The direction in which the arrow will point from the location of its pin.
    Data Bits
    The bit width of the value placed onto the wire.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/wiring/clock.html0000644000175000017500000000513311541757134021425 0ustar vincentvincent Clock

    Clock

    Library: Wiring
    Introduced: 2.0 Beta 13 (in Base library, moved to Wiring in 2.7.0)
    Appearance:

    Behavior

    The clock toggles its output value on a regular schedule as long as ticks are enabled via the Simulate menu. (Ticks are disabled by default.) A "tick" is Logisim's unit of time; the speed at which ticks occur can be selected from the Simulate menu's Tick Frequency submenu.

    The clock's cycle can be configured using its High Duration and Low Duration attributes.

    Note that Logisim's simulation of clocks is quite unrealistic: In real circuits, multiple clocks will drift from one another and will never move in lockstep. But in Logisim, all clocks experience ticks at the same rate.

    Pins

    A clock has only one pin, an output with a bit width of 1, whose value will represent the current value of the clock. The location of this pin is specified in the Facing attribute. The clock's value will toggle on its schedule whenever ticks are enabled, and it will toggle whenever it is clicked using the Poke Tool.

    Attributes

    When the component is selected or being added, the arrow keys alter its Facing attribute.

    Facing
    The side of the component where its output pin should be.
    High Duration
    The length of time within each cycle that the clock's output should be 1.
    Low Duration
    The length of time within each cycle that the clock's output should be 0.
    Label
    The text within the label associated with the clock component.
    Label Location
    The location of the label relative to the component.
    Label Font
    The font with which to render the label.

    Poke Tool Behavior

    Clicking a clock component will toggle its current output value immediately.

    Text Tool Behavior

    Allows the label associated with the component to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/plexers/0000755000175000017500000000000011541757134017625 5ustar vincentvincentlogisim-2.7.1/doc/es/html/libs/plexers/selector.html0000644000175000017500000000462611541757134022343 0ustar vincentvincent Bit Selector

    Bit Selector

    Library: Plexers
    Introduced: 2.0.5
    Appearance:

    Behavior

    Given an input of several bits, this will divide it into several equal-sized groups (starting from the lowest-order bit) and output the group selected by the select input.

    For example, if we have an eight-bit input 01010101, and we are to have a three-bit output, then group 0 will be the lowest-order three bits 101, group 1 will be the next three bits, 010, and group 2 will be the next three bits 001. (Any bits beyond the top are filled in with 0.) The select input will be a two-bit number that selects which of these three groups to output; if the select input is 3, then 000 will be the output.

    Pins (assuming component faces east)

    West edge (input, bit width matches Data Bits attribute)
    Data value from which bits should be selected for the output.
    East edge (output, bit width matches Output Bits attribute)
    A group of bits from the data value, as selected by the select input.
    South edge (input, bit width is quotient of Data Bits and Output Bits, rounded up)
    Select input: Determines which of the bit groups should be routed to the output.

    Attributes

    When the component is selected or being added, the digits '0' through '9' alter its Output Bits attribute, Alt-0 through Alt-9 alter its Data Bits attribute, and the arrow keys alter its Facing attribute.

    Facing
    The direction of the component (its output relative to its input).
    Data Bits
    The bit width of the component's data input.
    Output Bits
    The bit width of the component's output.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/plexers/priencod.html0000644000175000017500000000770111541757134022323 0ustar vincentvincent Priority Encoder

    Priority Encoder

    Library: Plexers
    Introduced: 2.3.0
    Appearance:

    Behavior

    The component has a number of inputs on its west edge, with the first labeled 0 and the other numbered from there. The component determines the indices of the inputs whose values are 1, and it emits the highest index. For example, if inputs 0, 2, 5, and 6 are all 1, then the priority encoder emits a value of 110. If no inputs are 1, or if the component is disabled, then the output of the priority encoder is floating.

    The priority encoder is designed so that a number of encoders can be daisy-chained to accommodate additional inputs. In particular, the component includes an enable input and an enable output. Whenever the enable input is 0, the component is disabled, and the output will be all floating bits. The enable output is 1 whenever the component is enabled and none of the indexed inputs are 1. Thus, you can take two priority encoders and connect the enable output of the first to the enable input of the second: If any of the indexed inputs to the first are 1, then the second will be disabled and so its output will be all floating. But if none of the first's indexed inputs are 1, then its output will be all-floating bits, and the second priority encoder will be enabled and it will identify the highest-priority input with a 1.

    An additional output of the priority encoder is 1 whenever the priority encoder is enabled and finds a 1 on one of the indexed inputs. When chaining priority encoders together, this output can be used to identify which of the encoders was triggered.

    Pins (assuming component faces east)

    West edge, variable number (inputs, bit width 1)
    Input values, indexed from 0 at the top/west end of the edge.
    East edge, upper pin (output, bit width matches Select Bits attribute)
    Output: the highest index among those inputs whose value is 1 - or all floating bits if no inputs are 1 or if the component is disabled via the Enable In input.
    East edge, lower pin (output, bit width 1)
    Group Signal: 1 if the component is enabled and at least one indexed input has a value of 1; otherwise this output is 0.
    South edge (input, bit width 1)
    Enable In: if 0, the component is disabled; otherwise the component is enabled.
    North edge (output, bit width 1)
    Enable Out: 1 if this component is enabled and none of the indexed inputs are 1; otherwise the output is 0.

    Attributes

    When the component is selected or being added, the digits '1' through '4' alter its Select Bits attribute and the arrow keys alter its Facing attribute.

    Facing
    The direction of the component (its output relative to its input).
    Select Bits
    The bit width of the component's primary output. The number of indexed inputs to the priority encoder will be 2selectBits.
    Disabled Output
    Specifies what each bit of the output should be when the component is disabled (i.e., when the enable pin is 0). Options include zero and floating; in the latter case, the output is effectively disconnected from any other ports.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    -logisim-2.7.1/doc/es/html/libs/plexers/mux.html0000644000175000017500000000675411541757134021340 0ustar vincentvincent Multiplexer

    Multiplexer

    Library: Plexers
    Introduced: 2.0 Beta 11
    Appearance:

    Behavior

    Copies an input on the west edge onto the output on the east edge; which of the inputs to copy is specified via the current value received through the input on the south edge. I find it useful to think of a multiplexer as analogous to a railroad switch, controlled by the select input.

    (Incidentally, some authorities spell this multiplexor, but multiplexer is the predominant spelling.)

    Pins (assuming component faces east, select is bottom/left)

    West edge, variable number (inputs, bit width matches Data Bits attribute)
    Data values, one of which is to be routed to the output. Each input data value is numbered, starting with 0 on the north.
    East edge (output, bit width matches Data Bits attribute)
    The output value will match the input values on the west edge whose number is the same as the value currently received through the select input on the south. If the select input contains any unspecified (i.e., floating) bits, then the output is completely floating.
    South edge, left side indicated by gray circle (input, bit width matches Select Bits attribute)
    Select input: The value of this input determines which input on the west edge to route to the output on the east edge.
    South edge, right side (input, bit width 1)
    Enable: When 0, the multiplexer's output consists of all floating bits, regardless of the data and select inputs.

    Attributes

    When the component is selected or being added, the digits '1' through '4' alter its Select Bits attribute, Alt-0 through Alt-9 alter its Data Bits attribute, and the arrow keys alter its Facing attribute.

    Facing
    The direction of the component (its output relative to its input).
    Select Location
    The location of the select and enable lines relative to the component.
    Select Bits
    The bit width of the component's select input on its south edge. The number of inputs to the multiplexer will be 2selectBits.
    Data Bits
    The bit width of the data being routed through the multiplexer.
    Disabled Output
    Specifies what each bit of the output should be when the component is disabled (i.e., when the enable pin is 0). Options include zero and floating; in the latter case, the output is effectively disconnected from any other ports.
    Include Enable?
    The component has an enable input when this attribute is yes. The attribute is primarily for supporting circuits built using older versions of Logisim that did not provide an enable input.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/plexers/index.html0000644000175000017500000000252411541757134021625 0ustar vincentvincent Plexers Library

    Plexers library

    The Plexers library includes control components. Like the components of the Gates library, all are combinational, but their purpose is generally for routing values.

    Multiplexer
    Demultiplexer
    Decoder
    Priority Encoder
    Bit Selector

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/plexers/demux.html0000644000175000017500000000727511541757134021650 0ustar vincentvincent Demultiplexer

    Demultiplexer

    Library: Plexers
    Introduced: 2.0 Beta 11
    Appearance:

    Behavior

    Copies the input on the west edge onto exactly one of the outputs on the east edge; which of these outputs is specified via the current value received through the input on the south edge. I find it useful to think of a demultiplexer as analogous to a railroad switch, controlled by the select input.

    (Incidentally, some authorities spell this demultiplexor, but demultiplexer is the predominant spelling.)

    Pins (assuming component faces east, select is bottom/left)

    West edge (input, bit width matches Data Bits attribute)
    The value to be routed to one of the outputs on the east edge.
    East edge, variable number (outputs, bit width matches Data Bits attribute)
    The outputs are numbered starting with 0 on the north. An output will match the west input if its number matches the value currently received through the select input on the south; otherwise, its value will be either all-zeroes or all-floating, depending on the value of the Three-State? attribute. If the select input contains any unspecified bits, then all outputs are floating.
    South edge, left side (input, bit width 1)
    Enable: When 0, all outputs consist of all floating bits, regardless of the data and select inputs.
    South edge, right side indicated by gray circle (input, bit width matches Select Bits attribute)
    Select input: The value of this input determines to which output on the east edge to route the value received on the west edge.

    Attributes

    When the component is selected or being added, the digits '1' through '4' alter its Select Bits attribute, Alt-0 through Alt-9 alter its Data Bits attribute, and the arrow keys alter its Facing attribute.

    Facing
    The direction of the component (specifying which side has the outputs).
    Select Location
    The location of the select and enable lines relative to the component.
    Select Bits
    The bit width of the component's select input on its south edge. The number of outputs for the demultiplexer will be 2selectBits.
    Data Bits
    The bit width of the data being routed through the demultiplexer.
    Three-state?
    Specifies whether the unselected outputs should be floating (Yes) or zero (No).
    Disabled Output
    Specifies what each bit of the outputs should be when the component is disabled (i.e., when the enable pin is 0). Options include zero and floating; in the latter case, the outputs are effectively disconnected from any other ports.
    Include Enable?
    The component has an enable input when this attribute is yes. The attribute is primarily for supporting circuits built using older versions of Logisim that did not provide an enable input.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/plexers/decoder.html0000644000175000017500000000566611541757134022135 0ustar vincentvincent Decoder

    Decoder

    Library: Plexers
    Introduced: 2.0 Beta 11
    Appearance:

    Behavior

    Emits 1 on exactly one output; which output is 1 depends on the current value received through the input on the south edge.

    Pins (assuming component faces east, select is bottom/left)

    East edge, variable number (outputs, bit width 1)
    The outputs are numbered starting with 0 on the north. Each output will be 1 if its number matches the value currently received through the select input on the south; otherwise, its value will be either zero or floating, depending on the value of the Three-State? attribute. If the select input contains any unspecified bits, then all outputs are floating.
    South edge, left side (input, bit width 1)
    Enable: When 0, all outputs consist of all floating bits (or zeros), regardless of the select input.
    South edge, right side indicated by gray circle (input, bit width matches Select Bits attribute)
    Select input: The value of this input determines which of the outputs is 1.

    Attributes

    When the component is selected or being added, the digits '1' through '4' alter its Select Bits attribute and the arrow keys alter its Facing attribute.

    Facing
    The direction of the component (specifying which side has the outputs).
    Select Location
    The location of the select and enable lines relative to the component.
    Select Bits
    The bit width of the component's select input on its south edge. The number of outputs for the decoder will be 2selectBits.
    Three-state?
    Specifies whether the unselected outputs should be floating (Yes) or zero (No).
    Disabled Output
    Specifies what each bit of the outputs should be when the component is disabled (i.e., when the enable pin is 0). Options include zero and floating; in the latter case, the outputs are effectively disconnected from any other ports.
    Include Enable?
    The component has an enable input when this attribute is yes. The attribute is primarily for supporting circuits built using older versions of Logisim that did not provide an enable input.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/mem/0000755000175000017500000000000011541757134016721 5ustar vincentvincentlogisim-2.7.1/doc/es/html/libs/mem/shiftreg.html0000644000175000017500000001051411541757134021423 0ustar vincentvincent Shift Register

    Shift Register

    Library: Memory
    Introduced: 2.3.0
    Appearance:

    Behavior

    This register consists of several stages, where each clock may lead to each stage receiving the value in the previous stage, while a new value is loaded into the first stage. The component optionally also supports parallel loads and stores to all stages' values.

    The clear input resets all stages to 0 (all zeroes) asynchronously; that is, as long as the clear input is 1, all values are pinned to 0, regardless of the clock input.

    Pins

    * An asterisk marks pins that exist only when the Parallel Load attribute is enabled.

    West edge, top pin (input, bit width 1)
    Shift: When 1 or disconnected, all stages advance with the clock trigger; but if it is 0, no advance takes place. This input is ignored if the Load input is 1.
    West edge, middle pin (input, bit width matches Data Bits attribute)
    Data: When advancing the stages, the value found at this input is loaded into the first stage.
    West edge, bottom pin marked with triangle (input, bit width 1)
    Clock: At the instant that this is triggered as specified by the Trigger attribute, the component may advance the stages or load new values.
    *North edge, left pin (input, bit width 1)
    Load: When this 1, the values found on the other north-edge pins are loaded into all stages at the next clock trigger. When 0 or disconnected, no load occurs.
    *North edge, other pins (input, bit width matches Data Bits attribute)
    Data: These values are loaded into all stages when the clock is triggered while the load input is 1. The leftmost input corresponds to the youngest stage.
    South edge, left pin (input, bit width 1)
    Clear: When this is 1, all stages are asynchronously reset to 0, and all other inputs are ignored.
    *South edge, other pins (output, bit width matches Data Bits attribute)
    Output: Emits the value stored in each stage, with the youngest stage reflected on the leftmost of the pins (next to the clear input).
    East edge (output, bit width matches Data Bits attribute)
    Output: Emits the value stored in the final (oldest) stage.

    Attributes

    When the component is selected or being added, the digits '0' through '9' alter its Number of Stages attribute and Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the value stored in each stage.
    Number of Stages
    The number of stages included in the component.
    Parallel Load
    If yes, then the component includes inputs and outputs facilitating parallel access to all the stages' values.
    Trigger
    Configures how the clock input is interpreted. The value rising edge indicates that the register should update its value at the instant when the clock rises from 0 to 1. The falling edge value indicates that it should update at the instant the clock falls from 1 to 0.
    Label
    The text within the label associated with the component.
    Label Font
    The font with which to render the label.

    Poke Tool Behavior

    If the Parallel Load attribute is no, or if the Data Bits attribute is more than 4, then poking the register has no effect. Otherwise, clicking the component will bring keyboard focus to the clicked stage (indicated by a red rectangle), and typing a hexadecimal digit will change the value stored in that stage.

    Text Tool Behavior

    Allows the label associated with the component to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/mem/rom.html0000644000175000017500000000642211541757134020410 0ustar vincentvincent ROM

    ROM

    Library: Memory
    Introduced: 2.1.0
    Appearance:

    Behavior

    The ROM component stores up to 16,777,216 values (specified in the Address Bit Width attribute), each of which can include up to to 32 bits (specified in the Data Bit Width attribute). A circuit can access the current values in ROM, but it cannot change them. The user can modify individual values interactively via the Poke Tool, or the user can modify the entire contents via the Menu Tool.

    Unlike the RAM component, the ROM component's current contents are stored as an attribute of the component. Thus, if a circuit containing a ROM component is used twice, then both ROM components will hold the same values. Also because of this behavior, the current ROM contents are stored in files created by Logisim.

    Current values are displayed in the component. Addresses displayed are listed in gray to the left of the display area. Inside, each value is listed using hexadecimal. The value at the currently selected address will be displayed in inverse text (white on black).

    Pins

    A on west edge (input, bit width matches Address Bit Width attribute)
    Selects which of the values are currently being accessed by the circuit.
    D on east edge (input/output, bit width matches Data Bit Width attribute)
    Outputs the value at the currently selected address at the D pin if sel is 1 or floating. If sel is 0, then D will be floating.
    sel on south edge (input, bit width 1)
    If you have just one ROM module, ignore this input. If you have multiple ROM modules in parallel, you can use this input to enable or disable the entire ROM module, based on whether the value is 1 or 0. In other words, when this is 0, no value is emitted on the D output.

    Attributes

    When the component is selected or being added, the digits '0' through '9' alter its Address Bit Width attribute and Alt-0 through Alt-9 alter its Data Bit Width attribute.

    Address Bit Width
    The bit width of the address bits. The number of values stored in ROM is 2addrBitWidth.
    Data Bit Width
    The bit width of each individual value in memory.
    Contents
    Stores the contents of memory.

    Poke Tool Behavior

    See poking memory in the User's Guide.

    Text Tool Behavior

    None.

    Menu Tool Behavior

    See pop-up menus and files in the User's Guide.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/mem/register.html0000644000175000017500000000734711541757134021446 0ustar vincentvincent Register

    Register

    Library: Memory
    Introduced: 2.0 Beta 1
    Appearance:

    Behavior

    A register stores a single multi-bit value, which is displayed in hexadecimal within its rectangle, and is emitted on its Q output. When the clock input (indicated by a triangle on the south edge) indicates so, the value stored in the register changes to the value of the D input at that instant. Exactly when the clock input indicates for this to happen is configured via the Trigger attribute.

    The reset input resets the register's value to 0 (all zeroes) asynchronously; that is, as long as reset is 1, the value is pinned to 0, regardless of the clock input.

    Pins

    East edge, labeled Q (output, bit width matches Data Bits attribute)
    Outputs the value currently stored by the register.
    West edge, labeled D (input, bit width matches Data Bits attribute)
    Data input: At the instant that the clock value rises from 0 to 1, the register's value changes to the value of the D input at that instant.
    West edge, labeled en (input, bit width 1)
    Enable: When this is 0, clock triggers are ignored. The current value continues to appear on the output. The clock triggers are enabled when this input is 1 or undefined.
    South edge, indicated with a triangle (input, bit width 1)
    Clock input: At the instant that this input value rises from 0 to 1 (the rising edge), the register's value will be updated to the value of the D input.
    South edge, labeled 0 (input, bit width 1)
    Asynchronous reset: When 0 or undefined, this input has no effect. As long as it is 1, the register's value is pinned to 0. This occurs asynchronously - that is, without regard to the current clock input value. As long as this is 1, the other inputs have no effect.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the value stored in the register.
    Trigger
    Configures how the clock input is interpreted. The value rising edge indicates that the register should update its value at the instant when the clock rises from 0 to 1. The falling edge value indicates that it should update at the instant the clock falls from 1 to 0. The high level value indicates that the register should update continuously whenever the clock input is 1. And the low level value indicates that it should update continuously when the clock input is 0.
    Label
    The text within the label associated with the register.
    Label Font
    The font with which to render the label.

    Poke Tool Behavior

    Clicking the register brings keyboard focus to the register (indicated by a red rectangle), and typing hexadecimal digits will change the value stored in the register.

    Text Tool Behavior

    Allows the label associated with the component to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/mem/random.html0000644000175000017500000001001211541757134021061 0ustar vincentvincent Random

    Random

    Library: Memory
    Introduced: 2.3.0
    Appearance:

    Behavior

    This component iterates through a pseudorandom sequence of numbers, which steps forward to the following number in the sequence each time the clock is triggered while the component is enabled. Technically speaking, the algorithm used to compute the pseudorandom sequence is a linear congruential generator: Starting from a seed r0, the following number r1 is the number

    r1 = (25,214,903,917 r0 + 11) mod 248

    The next value r2 is computed from r1 using the same computation, and so forth. This sequence is of 48-bit numbers; the value seen from the component is the low-order bits as configured by its Data Bits attribute, after first throwing out the lower 12 bits of the current seed.

    Besides the clock input, the component also includes an enable input, which leads the clock input to be ignored when enable is 0, and the reset input, which resets the component's value asynchronously to the initial seed r0.

    The initial seed is user-configurable. If it is configured at 0 (which is the default), then the seed is based on the current time; when instructed to reset through the reset input, the component computes a new seed based on the new current time.

    Pins

    East edge, labeled Q (output, bit width matches Data Bits attribute)
    Outputs the value currently stored by the component.
    West edge, top pin, labeled with a triangle (input, bit width 1)
    Clock: At the instant that this is triggered as specified by the Trigger attribute, the component steps to the following number in its sequence.
    West edge, bottom pin (input, bit width 1)
    Enable: The component is enabled when this input is disconnected or 1; but if it is 0, then the clock input is ignored.
    South edge (input, bit width 1)
    Reset: When this is 1, the pseudorandom sequence asynchronously resets to the initial seed. (If seed is 0, this new seed should be different from the initial seed used previously.)

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the value emitted by the component.
    Seed
    The starting value used for the pseudorandom sequence. If this is 0 (the default), then the starting value is based on the time that the random sequence began.
    Trigger
    Configures how the clock input is interpreted. The value rising edge indicates that the component should update its value at the instant when the clock rises from 0 to 1. The falling edge value indicates that it should update at the instant the clock falls from 1 to 0.
    Label
    The text within the label associated with the component.
    Label Font
    The font with which to render the label.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    Allows the label associated with the component to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/mem/ram.html0000644000175000017500000001452111541757134020371 0ustar vincentvincent RAM

    RAM

    Library: Memory
    Introduced: 2.0 Beta 1
    Appearance:

    Behavior

    The RAM component, easily the most complex component in Logisim's built-in libraries, stores up to 16,777,216 values (specified in the Address Bit Width attribute), each of which can include up to to 32 bits (specified in the Data Bit Width attribute). The circuit can load and store values in RAM. Also, the user can modify individual values interactively via the Poke Tool, or the user can modify the entire contents via the Menu Tool.

    Current values are displayed in the component. Addresses displayed are listed in gray to the left of the display area. Inside, each value is listed using hexadecimal. The value at the currently selected address will be displayed in inverse text (white on black).

    The RAM component supports three different interfaces, depending on the Data Interface attribute.

    One synchronous load/store port (default)

    The component includes a single port on its east side that serves for both loading and storing data. Which it performs depends on the input labeled ld: 1 (or floating) indicates to load the data at the address designated on the component's west side, and 0 indicates to store the data given on the port. To transmit data into and out of the component, you will need to use a Controlled Buffer component, as illustrated below.

    One asynchronous load/store port

    This is the same as above, except that there is no clock. The value found on the data bus is stored into memory whenever the ld input is 0. If, while the ld input is 0, the address or data changes, then an additional store occurs. This option is meant to more closely approximate the interface of many available random-access memories.

    Separate load and store ports

    Two data ports are provided - one on the west side for storing data, and another on the east side for loading data. This option removes the necessity of dealing with the Controlled Buffer and so it is easier to use.

    Pins

    A on west edge (input, bit width matches Address Bit Width attribute)
    Selects which of the values in memory is currently being accessed by the circuit.
    D on west edge (input, bit width matches Data Bit Width attribute)
    This input is present only if "separate load and store ports" is selected for the Data Interface attribute. When a store is requested (via the clock changing from 0 to 1 while sel and str are both 1 or floating), the value found at this port is stored into memory at the currently selected address.
    D on east edge (input/output or output, bit width matches Data Bit Width attribute)
    If sel and ld are 1 or floating, then the RAM component emits the value found at the currently selected address on this port. If there is a single load/store port, the value read from this port is stored whenever a store is requested.
    str on south edge (input, bit width 1)
    Store: This input is present only if "separate load and store ports" is selected for the Data Interface attribute. When it is 1 or floating, a clock pulse will result in storing the data found on the west edge into memory (provided the sel input is also 1 or floating).
    sel on south edge (input, bit width 1)
    Chip select: This input enables or disables the entire RAM module, based on whether the value is 1/floating or 0. The input is meant primarily for situations where you have multiple RAM units, only one of which would be enabled at any time.
    triangle on south edge (input, bit width 1)
    Clock input: This is absent when the Data Interface attribute's value is "One asynchronous load/store port." In other circumstances, when ld is 0, and this input rises from 0 to 1 (and sel is 1/undefined and clr is 0), then the value at the currently selected address changes to whatever value is at the D pin. As long as the clock input remains 0 or 1, though, the D value will not be stored into memory.
    ld on south edge (input, bit width 1)
    Load: Selects whether the RAM should emit (on D) the value at the current address (A). This output behavior is enabled if out is 1 or undefined; if out is 0, then no value is pushed onto D - but if there is a combined load/store port, stores will be enabled.
    clr on south edge (input, bit width 1)
    Clear: When this is 1, all values in memory are pinned to 0, no matter what the other inputs are.

    Attributes

    When the component is selected or being added, the digits '0' through '9' alter its Address Bit Width attribute and Alt-0 through Alt-9 alter its Data Bit Width attribute.

    Address Bit Width
    The bit width of the address bits. The number of values stored in RAM is 2addrBitWidth.
    Data Bit Width
    The bit width of each individual value in memory.
    Data Interface
    Configures which of the three interfaces are used for communicating data into and out of the component.

    Poke Tool Behavior

    See poking memory in the User's Guide.

    Text Tool Behavior

    None.

    Menu Tool Behavior

    See pop-up menus and files in the User's Guide.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/mem/index.html0000644000175000017500000000353711541757134020726 0ustar vincentvincent Memory Library

    Memory library

    The Memory library includes components that remember information.

    D/T/J-K/S-R Flip-Flop
    Register
    Counter
    Shift Register
    Random
    RAM
    ROM

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/mem/flipflops.html0000644000175000017500000001726511541757134021620 0ustar vincentvincent D/T/J-K/S-R Flip-Flop

    D/T/J-K/S-R Flip-Flop

    Library: Memory
    Introduced: 2.0 Beta 1
    Appearance:

    Behavior

    Each flip-flop stores a single bit of data, which is emitted through the Q output on the east side. Normally, the value can be controlled via the inputs to the west side. In particular, the value changes when the clock input, marked by a triangle on each flip-flop, rises from 0 to 1 (or otherwise as configured); on this rising edge, the value changes according to the table below.

    D Flip-Flop T Flip-Flop J-K Flip-Flop S-R Flip-Flop
    DQ
    00
    11
    TQ
    0Q
    1Q'
    JKQ
    00 Q
    01 0
    10 1
    11 Q'
    SRQ
    00 Q
    01 0
    10 1
    11 ??

    Another way of describing the different behavior of the flip-flops is in English text.

    • D Flip-Flop: When the clock triggers, the value remembered by the flip-flop becomes the value of the D input (Data) at that instant.

    • T Flip-Flop: When the clock triggers, the value remembered by the flip-flop either toggles or remains the same depending on whether the T input (Toggle) is 1 or 0.

    • J-K Flip-Flop: When the clock triggers, the value remembered by the flip-flop toggles if the J and K inputs are both 1 and the value remains the same if both are 0; if they are different, then the value becomes 1 if the J (Jump) input is 1 and 0 if the K (Kill) input is 1.

    • S-R Flip-Flop: When the clock triggers, the value remembered by the flip-flop remains unchanged if R and S are both 0, becomes 0 if the R input (Reset) is 1, and becomes 1 if the S input (Set) is 1. The behavior in unspecified if both inputs are 1. (In Logisim, the value in the flip-flop remains unchanged.)

    By default, the clock triggers on a rising edge — that is, when the clock input changes from 0 to 1. However, the Trigger attribute allows this to change to a falling edge (when the clock input changes from 1 to 0), a high level (for the duration that the clock input is 1), or a low level (for the duration that the clock input is 0). The level-trigger options are unavailable for the T and J-K flip-flops, because a flip-flop behaves unpredictably when told to toggle for an indeterminate amount of time.

    Pins

    West edge, marked by triangle (input, bit width 1)
    Clock input: At the instant that this input value switches from 0 to 1 (the rising edge), the value will be updated according to the other inputs on the west edge. As long as this remains 0 or 1, the other inputs on the west edge have no effect.
    West edge, other labeled pin(s) (input(s), bit width 1)
    These inputs control how the flip-flop's value changes during the rising edge of the clock. Their exact behavior depends on the flip-flop; the above tables summarize their behavior.
    East edge, labeled Q, north end (output, bit width 1)
    Outputs the value currently stored by the flip-flop.
    East edge, south end (output, bit width 1)
    Outputs the complement of the value currently stored by the flip-flop.
    South edge, east end (input, bit width 1)
    Asynchronous reset: When 0 or undefined, this input has no effect. As long as it is 1, the flip-flop's value is pinned to 0. This occurs asynchronously - that is, without regard to the current clock input value. As long as this is 1, the other inputs have no effect.
    South edge, center end (input, bit width 1)
    Enable: When this is 0, clock triggers are ignored. The current bit continues to appear on the output. The clock triggers are enabled when this input is 1 or undefined.
    South edge, west end (input, bit width 1)
    Asynchronous set: When 1 or undefined, this input has no effect. When 1, the flip-flop's value is pinned to 1. This occurs asynchronously - that is, without regard to the current clock input value. As long as this input is 1, the other inputs have no effect, except for the asynchronous reset input, which has priority.

    Attributes

    Trigger
    Configures how the clock input is interpreted. The value rising edge indicates that the flip-flop should update its value at the instant when the clock rises from 0 to 1. The falling edge value indicates that it should update at the instant the clock falls from 1 to 0. The high level value indicates that the flip-flop should update continuously whenever the clock input is 1. And the low level value indicates that it should update continuously when the clock input is 0. Note that the latter two options are unavailable for T and J-K flip-flops.
    Label
    The text within the label associated with the flip-flop.
    Label Font
    The font with which to render the label.

    Poke Tool Behavior

    Clicking a flip-flop using the Poke Tool toggles the bit stored in the flip-flop, unless the asynchronous set/reset inputs currently pin the flip-flop's value.

    Text Tool Behavior

    Allows the label associated with the component to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/mem/counter.html0000644000175000017500000001423511541757134021273 0ustar vincentvincent Counter

    Counter

    Library: Memory
    Introduced: 2.3.0
    Appearance:

    Behavior

    The counter holds a single value, whose value is emitted on the output Q. Each time the clock input (diagrammed with a triangle on the component's south edge) triggers according to its Trigger attribute, the value in the counter may update based on the two inputs on the component's west edge: The upper input is called load and the lower is called count, and they are interpreted as follows.

    loadcounttrigger action
    0 or z0 The counter remains unchanged.
    0 or z1 or z The counter increments.
    10 The counter loads the value found at the D input.
    11 or z The counter decrements.

    The range of counting can be configured using the Maximum Value attribute. When the counter reaches this value, the next increment wraps the counter back to 0; and if it is at 0, then a decrement will wrap the counter around back to its maximum value.

    In addition to the output Q, the component also includes a single-bit output carry. This is 1 whenever the counter is at its maximum and the load and count inputs indicate that the component should increment on the next step - or when the counter is at 0 and the load and count inputs indicate to decrement at the next step.

    The clear input resets the counter's value to 0 (all zeroes) asynchronously; that is, as long as the clr input is 1, the value is pinned to 0, regardless of the clock input.

    Pins

    East edge, labeled Q (output, bit width matches Data Bits attribute)
    Outputs the value currently stored by the counter.
    East edge, lower pin (output, bit width 1)
    Carry: When load and count indicate to increment, this output is 1 whenever the counter is at its maximum. When load and count indicate to decrement, this output is 1 whenever the counter is at 0. At all other times, this output is 0.
    West edge, top pin (input, bit width 1)
    Load: When this is 1 while the count input is 0, the counter will load the value found at the data input at the next clock trigger - or, if the count input happens to be 1, the counter's value will decrement.
    West edge, middle pin labeled D (input, bit with matches Data Bits attribute)
    Data: When the clock triggers while load is 1 and count is 0, the counter's value changes to the value found at this input.
    West edge, lower pin labeled ct (input, bit width 1)
    Count: When this is 1 or unconnected, the value in the counter increments whenever the clock input is triggered - or it decrements if the load input happens to also be 1.
    South edge, indicated with a triangle (input, bit width 1)
    Clock: At the instant that this is triggered as specified by the Trigger attribute, the counter updates as indicated by the load and count inputs.
    South edge, labeled 0 (input, bit width 1)
    Clear: When 0 or undefined, this input has no effect. As long as it is 1, the counter's value is asynchronously pinned to 0. This occurs asynchronously - that is, without regard to the current clock input value. As long as this is 1, the other inputs have no effect.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the value emitted by the component.
    Maximum Value
    The maximum value, at which point the counter will set its carry output.
    Action On Overflow
    The behavior when the counter attempts to increment beyond the maximum value or decrement beyond 0. Four possible actions are supported:
    Wrap around
    The next value is 0 (if incrementing - the maximum value if decrementing)
    Stay at value
    The counter's value remains at the maximum (or 0 if decrementing)
    Continue counting
    The counter continues incrementing/decrementing, keeping the number of bits as provided by the Data Bits attribute
    Load next value
    The next value is loaded from the D input.
    Trigger
    Configures how the clock input is interpreted. The value rising edge indicates that the counter should update its value at the instant when the clock rises from 0 to 1. The falling edge value indicates that it should update at the instant the clock falls from 1 to 0.
    Label
    The text within the label associated with the component.
    Label Font
    The font with which to render the label.

    Poke Tool Behavior

    Clicking the counter brings keyboard focus to the component (indicated by a red rectangle), and typing hexadecimal digits will change the value stored in the counter.

    Text Tool Behavior

    Allows the label associated with the component to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/io/0000755000175000017500000000000011541757134016552 5ustar vincentvincentlogisim-2.7.1/doc/es/html/libs/io/tty.html0000644000175000017500000000546111541757134020266 0ustar vincentvincent TTY

    TTY

    Library: Input/Output
    Introduced: 2.2.0
    Appearance:

    Behavior

    This component implements a very simple dumb terminal. It receives a sequence of ASCII codes and displays each printable character. When the current row becomes full, the cursor moves to the following line, possibly scrolling all current rows up if the cursor was already in the bottom row. The only supported control sequences are: backspace (ASCII 8), which deletes the last character in the final row, unless the final row is already empty; newline (ASCII 10), which moves the cursor to the beginning of the following line, scrolling if necessary; and form-feed (ASCII 12, typed as control-L), which clears the screen.

    Pins

    West edge, upper pin (input, bit width 7)
    Data - this is the ASCII value of the next character to be entered into the terminal.
    West edge, lower pin marked by triangle (input, bit width 1)
    Clock - when triggered while the write-enable pin isn't 0, the current ASCII value on the Data input is processed by the terminal.
    South edge, leftmost pin (input, bit width 1)
    Write Enable - when 1 (or floating or error), a clock edge will result in processing a new character from the data input. The clock and data inputs are ignored when Write Enable is 0.
    South edge, second pin from left (input, bit width 1)
    Clear - when 1, the terminal is cleared of all data, and all other inputs are ignored.

    Attributes

    Rows
    The number of rows displayed in the terminal.
    Columns
    The maximum number of characters displayed in each row of terminal.
    Trigger
    If the value is Rising Edge, then when the clock input changes from 0 to 1, the data input is processed (when enabled by the write-enable and clear inputs). If it is Falling Edge,, then this happens when the clock input changes from 1 to 0.
    Color
    The color with which to draw the text appearing in the terminal.
    Background
    The color with which to draw the terminal's background.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/io/led.html0000644000175000017500000000404511541757134020207 0ustar vincentvincent LED

    LED

    Library: Input/Output
    Introduced: 2.1.3
    Appearance:

    Behavior

    Displays the value of its input by coloring the LED (as specified by its Color attribute) or not depending on whether the input is 1 or 0.

    (The LED component is basically redundant with an output pin, except for a somewhat different appearance. Some users, though, thought it would be nice to include.)

    Pins

    A LED has only one pin, a 1-bit input which is used to determine whether to display the LED colored (when the input is 1) or darkened (when the input is anything else).

    Attributes

    When the component is selected or being added, the arrow keys alter its Facing attribute.

    Facing
    The location of the input pin relative to the component.
    Color
    The color to display when the input value is 1.
    Active On High?
    If yes, then the LED is colored when the input is 1. If no, it is colored when the input is 0.
    Label
    The text within the label associated with the component.
    Label Location
    The location of the label relative to the component.
    Label Font
    The font with which to render the label.
    Label Color
    The color with which to draw the label.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    Allows the label associated with the component to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/io/keyboard.html0000644000175000017500000000743711541757134021253 0ustar vincentvincent Keyboard

    Keyboard

    Library: Input/Output
    Introduced: 2.2.0
    Appearance:

    Behavior

    This component allows the circuit to read keys typed from the keyboard - as long as the keys are representable in the 7-bit ASCII code. After clicking the component using the poke tool, the user can type characters, which accumulate in a buffer. At all times, the ASCII value for the leftmost character in the buffer is sent out the rightmost output. When the clock input is triggered, the leftmost character disappears from the buffer and the new leftmost character is sent on the rightmost output.

    The supported characters for the buffer include all the printable ASCII characters, as well as space, newline, backspace, and control-L. In addition, the left-arrow and right-arrow keys move the cursor within the buffer, and the delete key deletes the character to the right of the cursor (if any).

    The component is asynchronous in the sense that when the buffer is empty and the user types a character, that character is sent immediately as an output, without any wait for a clock pulse.

    Pins

    West edge, marked by a triangle (input, bit width 1)
    Clock - when triggered while the read-enable pin isn't 0, the leftmost character from the buffer is deleted, and the outputs are updated to reflect the buffer's new status.
    South edge, leftmost pin (input, bit width 1)
    Read Enable - when 1 (or floating or error), a clock edge will consume the leftmost character from the buffer. The clock input is ignored when Read Enable is 0.
    South edge, second pin from left (input, bit width 1)
    Clear - when 1, the buffer is emptied and does not accept further characters.
    South edge, second pin from right (output, bit width 1)
    Available - this is 1 when the buffer contains at least one character and 0 when the buffer is empty.
    South edge, rightmost pin (output, bit width 7)
    Data - the 7-bit ASCII code for the leftmost character in the buffer, or 0 if the buffer is empty.

    Attributes

    Buffer Length
    The number of characters that the buffer can hold at once.
    Trigger
    If the value is Rising Edge, then when the clock input changes from 0 to 1, the leftmost character is consumed (when enabled by the Read Enable input). If it is Falling Edge,, then this happens when the clock input changes from 1 to 0.

    Poke Tool Behavior

    Pressing the mouse button into the component gives keyboard focus to the component, and a vertical-bar cursor will be displayed.

    Each character typed will then be inserted into the buffer, as long as the buffer hasn't reached its capacity and the character is one of those that the component supports: the printable characters within the 7-bit ASCII code, as well as space, backspace, newline, and control-L. Additionally, the user may type the left-arrow and right-arrow keys to change the location of the cursor within the buffer, and the user may type the delete key to delete the buffer character (if any) just to the right of the cursor.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/io/joystick.html0000644000175000017500000000457011541757134021305 0ustar vincentvincent Joystick

    Joystick

    Library: Input/Output
    Introduced: 2.2.0
    Appearance:

    Behavior

    The user can drag the red knob within the rounded-square area, and the outputs update to indicate the knob's current x- and y-coordinates. This is meant to emulate the joysticks known from the days of classical arcade games.

    Pins

    West edge, north pin (output, bit width matches Bit Width attribute)
    Indicates knob's x-coordinate, to be interpreted as an unsigned integer whose value will never be 0. Thus, a value of 1 represents the far left, and the maximum value for the bit width indicates the far right. When the knob is at rest (in the center), the value has the bit pattern 10...00.
    West edge, south pin (output, bit width matches Bit Width attribute)
    Indicates knob's y-coordinate, whose value ranges as with the x-coordinate pin. When the knob is pulled to the top, this output's value is 1, and when the knob is pulled to the bottom, the output is the maximum value for the bit width selected.

    Attributes

    When the component is selected or being added, Alt-2 through Alt-5 alter its Bit Width attribute.

    Bit Width
    The number of bits used to indicate each of the knob's coordinates.
    Color
    The knob's color as it is drawn on the screen.

    Poke Tool Behavior

    Pressing the mouse button while within the joystick area moves the knob to that location and updates the outputs. Dragging the mouse continues to move the knob and update the outputs, keeping the knob within the joystick's area. Releasing the mouse button reverts the knob back to its rest position.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/io/index.html0000644000175000017500000000350611541757134020553 0ustar vincentvincent Input/Output Library

    Input/Output library

    The Input/Output library includes components that are meant to correspond to typical components found in electronics for interfacing with a user.

    Button
    Joystick
    Keyboard
    LED
    7-Segment Display
    Hex Digit Display
    LED Matrix
    TTY

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/io/hexdig.html0000644000175000017500000000352711541757134020717 0ustar vincentvincent Hex Digit Display

    Hex Digit Display

    Library: Input/Output
    Introduced: 2.2.0
    Appearance:

    Behavior

    Using a seven-segment display, shows the hexadecimal digit corresponding to the four-bit input. If any of the inputs are not 0/1 (either floating or error), then the display shows a dash ('-'). A separate one-bit input controls the display of the decimal point.

    Pins

    South edge, first from left (input, bit width 4)
    This input is interpreted as an unsigned four-bit number, and the corresponding hexadecimal digit is displayed. If any of the bits are floating or error, then a dash ('-') is displayed.
    South edge, second from left (input, bit width 1)
    Controls the decimal point. If this is left unconnected, the decimal point remains off.

    Attributes

    On Color
    The color with which to draw the display segments and decimal point when they are on.
    Off Color
    The color with which to draw the display segments and decimal point when they are off.
    Background
    The color with which to draw the display's background (transparent by default).

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/io/dotmat.html0000644000175000017500000001017511541757134020734 0ustar vincentvincent LED Matrix

    LED Matrix

    Library: Input/Output
    Introduced: 2.2.0
    Appearance:

    Behavior

    Displays a small grid of pixels, whose values are determined by the current inputs. The grid can have up to 32 rows and 32 columns.

    Pins

    The interface to the component varies depending on the value of the Input Format attribute. It has three possible values.

    Columns
    The inputs are lined along the component's south edge, with one multibit input for each column of the matrix. Each input has as many bits as there are rows in the matrix, with the low-order bit corresponding to the southmost pixel in the column. A 1 indicates to light the corresponding pixel, while a 0 indicates to keep the pixel dim. If any of the bits for a column are either floating or error values, then all pixels in the column are lit.
    Rows
    The inputs are lined along the component's west edge, with one multibit input for each row of the matrix. Each input has as many bits as there are columns in the matrix, with the low-order bit corresponding to the rightmost pixel in the row. As with the Columns format, a 1 indicates to light the corresponding pixel, and a 0 indicates to keep the pixel dim. If any bits for a row are floating or error values, then all pixels in the row are lit.
    Select Rows/Columns
    There are two inputs on the component's west edge. The upper multibit input has as many bits as there are columns in the matrix, with the low-order bit corresponding to the rightmost column. The lower multibit input has as many bits as there are rows in the matrix, with the low-order bit corresponding to the bottom row. If any bits in either input are floating or error values, all pixels in the matrix are lit. Normally, though, a pixel at a particular row-column location is lit if the corresponding column bit in the upper input is 1 and the corresponding row bit in the lower input is 1. For example, for a 5x7 matrix, if the first input is 01010 and the second is 0111010, then the second and fourth columns are lit for the second, third, fourth, and sixth rows; the result appears to be a pair of exclamation points. (This input format may seem unintuitive, but LED matrixes are sold commercially with exactly this interface. Lite-On sells such components, for example.)

    Attributes

    Input Format (read-only after component is created)
    Selects how the pins correspond to pixels, as outlined above.
    Matrix Columns
    Selects how many columns are in the matrix, which may range from 1 up to 32.
    Matrix Rows
    Selects how many rows are in the matrix, which may range from 1 up to 32.
    On Color
    Selects the color of a pixel when it is lit.
    Off Color
    Selects the color of a pixel when it is dim.
    Light Persistence
    When this is other than 0, a pixel that is lit remains lit for the given number of clock ticks after the component's inputs indicate that the pixel should become dim.
    Dot Shape
    The square option means that each pixel is drawn as a 10x10 square, filling the component with no gaps between pixels. The circle option means that each pixel is drawn as a diameter-8 circle, with gaps between each circle. The circle option is more difficult to interpret, but it more closely approximates the off-the-shelf LED matrix components.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/io/button.html0000644000175000017500000000343711541757134020762 0ustar vincentvincent Button

    Button

    Library: Input/Output
    Introduced: 2.1.3
    Appearance:

    Behavior

    Outputs 0 normally; but when the user is pressing the the button using the Poke Tool, the output is 1.

    Pins

    A button has only one pin, a 1-bit output, which is 0 except when the user is pressing the button using the Poke Tool, when it is 1.

    Attributes

    When the component is selected or being added, the arrow keys alter its Facing attribute.

    Facing
    The location of the output pin relative to the component.
    Color
    The color with which to display the button.
    Label
    The text within the label associated with the component.
    Label Location
    The location of the label relative to the component.
    Label Font
    The font with which to render the label.
    Label Color
    The color with which to draw the label.

    Poke Tool Behavior

    When the mouse button is pressed, the component's output will be 1. Upon releasing the mouse button, the output reverts back to 0.

    Text Tool Behavior

    Allows the label associated with the component to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/io/7seg.html0000644000175000017500000000505011541757134020305 0ustar vincentvincent 7-Segment Display

    7-Segment Display

    Library: Input/Output
    Introduced: 2.1.3
    Appearance:

    Behavior

    Displays the values of its eight one-bit inputs. Segments are either colored or light gray depending on the inputs. The correspondence is as follows.

    (Manufacturers vary as to how they map inputs to segments; the correspondence used here is based on Texas Instruments' TIL321.)

    Pins

    North edge, first from left (input, bit width 1)
    Controls the middle horizontal segment.
    North edge, second from left (input, bit width 1)
    Controls the upper vertical segment on the left side.
    North edge, third from left (input, bit width 1)
    Controls the upper horizontal segment.
    North edge, fourth from left (input, bit width 1)
    Controls the upper vertical segment on the right side.
    South edge, first from left (input, bit width 1)
    Controls the lower vertical segment on the left side.
    South edge, second from left (input, bit width 1)
    Controls the bottom horizontal segment.
    South edge, third from left (input, bit width 1)
    Controls the lower vertical segment on the right side.
    South edge, fourth from left (input, bit width 1)
    Controls the decimal point.

    Attributes

    On Color
    The color with which to draw the display segments and decimal point when they are on.
    Off Color
    The color with which to draw the display segments and decimal point when they are off.
    Background
    The color with which to draw the display's background (transparent by default).
    Active On High?
    If yes, then the segments light when the corresponding input is 1. If no, they light when the corresponding input is 0.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/index.html0000644000175000017500000003265211541757134020150 0ustar vincentvincent Library Reference

    Library Reference

    A Logisim library holds a set of tools that allow you to interact with a circuit via clicking and dragging the mouse in the canvas area. Most often, a tool is intended for adding components of a particular type into a circuit; but some of the most important tools, such as the Poke Tool and the Select Tool, allow you to interact with components in other ways.

    All of the tools included in Logisim's built-in libraries are documented in this reference material.

    Wiring library
    Splitter
    Pin
    Probe
    Tunnel
    Pull Resistor
    Clock
    Constant
    Power/Ground
    Transistor
    Transmission Gate
    Bit Extender

    Gates library

    NOT Gate
    Buffer

    AND/OR/NAND/NOR Gate

    XOR/XNOR/Odd Parity/Even Parity Gate
    Controlled Buffer/Inverter

    Plexers library
    Multiplexer
    Demultiplexer
    Decoder
    Priority Encoder
    Bit Selector

    Arithmetic library
    Adder
    Subtractor
    Multiplier
    Divider
    Negator
    Comparator
    Shifter
    Bit Adder
    Bit Finder

    Memory library
    D/T/J-K/S-R Flip-Flop
    Register
    Counter
    Shift Register
    Random
    RAM
    ROM

    Input/Output library
    Button
    Joystick
    Keyboard
    LED
    7-Segment Display
    Hex Digit Display
    LED Matrix
    TTY

    Base library
    Poke Tool
    Edit Tool
    Select Tool
    Wiring Tool
    Text Tool
    Menu Tool
    Label
    logisim-2.7.1/doc/es/html/libs/gates/0000755000175000017500000000000011541757134017246 5ustar vincentvincentlogisim-2.7.1/doc/es/html/libs/gates/xor.html0000644000175000017500000001760211541757134020752 0ustar vincentvincent XOR/XNOR/Odd Parity/Even Parity Gate

    XOR/XNOR/Odd Parity/Even Parity Gate

    Library: Gates
    Introduced: 2.0 Beta 1 for XOR/Odd/Even; 2.0 Beta 6 for XNOR
    Appearance:
    XOR XNOR Odd
    Parity
    Even
    Parity
    Shaped:
    Rectangular:

    Behavior

    The XOR, XNOR, Even Parity, and Odd Parity gates each compute the respective function of the inputs, and emit the result on the output.

    By default, any inputs that are left unconnected are ignored — that's if the input truly has nothing attached to it, not even a wire. In this way, you can insert a 5-input gate but only attach two inputs, and it will work as a 2-input gate; this relieves you from having to worry about configuring the number of inputs every time you create a gate. (If all inputs are unconnected, the output is the error value X.) Some users, though, prefer that Logisim insist that all inputs be connected, since this is what corresponds to real-world gates. You can enable this behavior by going to the Project > Options… menu item, selecting the Simulation tab, and selecting Error for undefined inputs for Gate Output When Undefined.

    The two-input truth table for the gates is the following.

    xyXOR XNOROddEven
    00 01 01
    01 10 10
    10 10 10
    11 01 01

    As you can see, the Odd Parity gate and the XOR gate behave identically with two inputs; similarly, the even parity gate and the XNOR gate behave identically. But if there are more than two specified inputs, the XOR gate will emit 1 only when there is exactly one 1 input, whereas the Odd Parity gate will emit 1 if there are an odd number of 1 inputs. The XNOR gate will emit 1 only when there is not exactly one 1 input, while the Even Parity gate will emit 1 if there are an even number of 1 inputs. The XOR and XNOR gates include an attribute titled Multiple-Input Behavior that allow them to be configured to use the Odd Parity and Even Parity behavior.

    If any of the inputs are the error value (e.g., if conflicting values are coming into the same wire) or floating, then the output will be the error value.

    The multi-bit versions of each gate will perform its one-bit transformation bitwise on its inputs.

    Note: Many authorities contend that the shaped XOR gate's behavior should correspond to the odd parity gate, but there is not agreement on this point. Logisim's default behavior for XOR gates is based on the IEEE 91 standard. It is also consistent with the intuitive meaning underlying the term exclusive or: A waiter asking whether you want a side dish of mashed potatoes, carrots, peas, or cole slaw will only accept one choice, not three, whatever some authorities may tell you. (I must admit, though, that I have not subjected this statement to a rigorous test.) You can configure the XOR and XNOR gates to use parity by changing its Multiple-Input Behavior attribute.

    Pins (assuming component faces east)

    West edge (inputs, bit width according to Data Bits attribute)

    The inputs into the component. There will be as many of these as specified in the Number of Inputs attribute.

    Note that if you are using shaped gates, the west side of XOR and XNOR gates will be curved. Nonetheless, the input pins are in a line. Logisim will draw short stubs illustrating this; and if you overshoot a stub, it will silently assume that you did not mean to overshoot it. In "printer view", these stubs will not be drawn unless they are connected to wires.

    East edge (output, bit width according to Data Bits attribute)

    The gate's output, whose value is computed based on the current inputs as described above.

    Attributes

    When the component is selected or being added, the digits '0' through '9' alter its Number of Inputs attribute, Alt-0 through Alt-9 alter its Data Bits attribute, and the arrow keys alter its Facing attribute.

    Facing
    The direction of the component (its output relative to its inputs).
    Data Bits
    The bit width of the component's inputs and outputs.
    Gate Size
    Determines whether to draw a wider or narrower version of the component. This does not affect the number of inputs, which is specified by the Number of Inputs attribute; however, if the number of inputs exceeds 3 (for a narrow component) or 5 (for a wide component), then the gate will be drawn with "wings" to be able to accommodate the number of inputs requested.
    Number of Inputs
    Determines how many pins to have for the component on its west side.
    Output Value
    Indicates how false and true results should be translated into output values. By default, false is indicated by a low voltage (0) and true by a high voltage (1), but one or the other can be replaced by a high-impedance (floating) value instead. This allows wired-or and wired-and connections, as illustrated in the AND/OR/NAND/NOR Gate documentation.
    Label
    The text within the label associated with the gate.
    Label Font
    The font with which to render the label.
    Multiple-Input Behavior (XOR and XNOR only)
    When three or more inputs are provided, the XOR/XNOR gate's output will either be based on whether exactly one input is 1 (the default) or an odd number of inputs are 1.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    Allows the label associated with the gate to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/gates/not.html0000644000175000017500000000600311541757134020733 0ustar vincentvincent NOT Gate

    NOT Gate

    Library: Gates
    Introduced: 2.0 Beta 1
    Appearance:
    Shaped:
    Rectangular:

    Behavior

    The NOT Gate emits the complement of whatever input it receives. The truth table for a NOT gate is the following.

    xout
    01
    10

    If the input is unspecified (i.e., floating), then the output will also be unspecified - unless the "Gate Output When Undefined" option is "Error for undefined inputs," in which case the output is an error. If the input is an error value, then the output will also be.

    A multi-bit NOT gate will perform the above transformation bitwise on its input.

    Pins (assuming component faces east)

    West edge (input, bit width according to Data Bits attribute)
    The component's input.
    East edge (output, bit width according to Data Bits attribute)
    The output, whose value is the complement of the input value.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute and the arrow keys alter its Facing attribute.

    Facing
    The direction of the component (its output relative to its input).
    Data Bits
    The bit width of the component's input and output.
    Gate Size
    Determines whether to draw a larger or a smaller version of the component.
    Output Value
    Indicates how false and true results should be translated into output values. By default, false is indicated by a low voltage (0) and true by a high voltage (1), but one or the other can be replaced by a high-impedance (floating) value instead. This allows wired-or and wired-and connections, as illustrated in the AND/OR/NAND/NOR Gate documentation.
    Label
    The text within the label associated with the gate.
    Label Font
    The font with which to render the label.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    Allows the label associated with the gate to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/gates/index.html0000644000175000017500000000545411541757134021253 0ustar vincentvincent Gates Library

    Gates library

    The Gates library includes a variety of simple components, all of which have a single output whose value is dictated entirely by the current inputs.


    NOT Gate
    Buffer

    AND/OR/NAND/NOR Gate

    XOR/XNOR/Odd Parity/Even Parity Gate
    Controlled Buffer/Inverter

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/gates/controlled.html0000644000175000017500000000676611541757134022320 0ustar vincentvincent Controlled Buffer/Inverter

    Controlled Buffer/Inverter

    Library: Gates
    Introduced: 2.0 Beta 1
    Appearance:

    Behavior

    The controlled buffer and inverter, often called three-state buffers/inverters, each have a one-bit "control" input pin on the south side. The value at this control pin affects how the component behaves:

    • When the value on this pin is 1, then the component behaves just like the respective component (a buffer or a inverter (NOT gate)).
    • When the value is 0 or unknown (i.e., floating), then the component's output is also floating.
    • When the value is an error value (such as would occur when two conflicting values are being fed into the input), then the output is an error value.

    Controlled buffers can be useful when you have a wire (often called a bus) whose value should match the output of one of several components. By placing a controlled buffer between each component output and the bus, you can control whether that component's output is fed onto the bus or not.

    Pins (assuming component faces east, control line right-handed)

    West edge (input, bit width matches Data Bits attribute)
    The component input that will be used to compute the output if the control input is 1.
    South edge (input, bit width 1)
    The component's control input.
    East edge (output, bit width matches Data Bits attribute)
    The component's output, which will be floating if the control input is 0 or floating, the error value if the control input is the error value, and will be computed based on the west-side input if the control input is 1.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute and the arrow keys alter its Facing attribute.

    Facing
    The direction of the component (its output relative to its input).
    Data Bits
    The bit width of the component's inputs and outputs.
    Gate Size
    (Controlled inverter only) Determines whether to draw a larger or a smaller version of the component.
    Control Line Location
    The location of the control line, imagining we are facing the output from the input: If the component faces east and is right-handed, the control line is to the south; but if it is left-handed, the control line is to the north.
    Label
    The text within the label associated with the gate.
    Label Font
    The font with which to render the label.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    Allows the label associated with the gate to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/gates/buffer.html0000644000175000017500000000601511541757134021407 0ustar vincentvincent Buffer

    Buffer

    Library: Gates
    Introduced: 2.0 Beta 1
    Appearance:

    Behavior

    The buffer simply passes through to its right output whatever input it receives on the left side. The truth table for a one-bit buffer is the following.

    xout
    00
    11

    If the input is unspecified (i.e., floating), then the output will also be unspecified - unless the "Gate Output When Undefined" option is "Error for undefined inputs," in which case the output is an error. If the input is an error value, then the output will also be.

    Buffers are the most useless of the gate components provided in Logisim; its presence in the Gates library is just as much a matter of completeness (a component for each possible one-input truth table) as it is a matter of providing useful functionality. Still, it can be occasionally useful to ensure that values propagate in only one direction along a wire.

    Pins (assuming component faces east)

    West edge (input, bit width according to Data Bits attribute)
    The input into the component.
    East edge (output, bit width according to Data Bits attribute)
    The output, which always matches the input into the left side.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute and the arrow keys alter its Facing attribute.

    Facing
    The direction of the component (its output relative to its input).
    Data Bits
    The bit width of the component's inputs and outputs.
    Output Value
    Indicates how false and true results should be translated into output values. By default, false is indicated by a low voltage (0) and true by a high voltage (1), but one or the other can be replaced by a high-impedance (floating) value instead. This allows wired-or and wired-and connections, as illustrated in the AND/OR/NAND/NOR Gate documentation.
    Label
    The text within the label associated with the gate.
    Label Font
    The font with which to render the label.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    Allows the label associated with the gate to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/gates/basic.html0000644000175000017500000002065211541757134021222 0ustar vincentvincent AND/OR/NAND/NOR Gate

    AND/OR/NAND/NOR Gate

    Library: Gates
    Introduced: 2.0 Beta 1
    Appearance:
    AND OR NAND NOR
    Shaped:
    Rectangular:
    DIN 40700:

    Behavior

    The AND, OR, NAND, and NOT gates each compute the respective function of the inputs, and emit the result on the output.

    By default, any inputs that are left unconnected are ignored — that's if the input truly has nothing attached to it, not even a wire. In this way, you can insert a 5-input gate but only attach two inputs, and it will work as a 2-input gate; this relieves you from having to worry about configuring the number of inputs every time you create a gate. (If all inputs are unconnected, the output is the error value X.) Some users, though, prefer that Logisim insist that all inputs be connected, since this is what corresponds to real-world gates. You can enable this behavior by going to the Project > Options… menu item, selecting the Simulation tab, and selecting Error for undefined inputs for Gate Output When Undefined.

    The two-input truth table for the gates is the following. (The letter X represents the error value, and the letter Z represents the floating value.)

    AND
    01X/Z
    0000
    101X
    X/Z0XX
       
    OR
    01X/Z
    001X
    1111
    X/ZX1X
    NAND
    01X/Z
    0111
    110X
    X/Z1XX
       
    NOR
    01X/Z
    010X
    1000
    X/ZX0X

    In short, these components work as expected as long as all inputs are either 0 or 1. If an input is neither 0 nor 1 (it is floating or it is the error value) then the component treats it as both 0 and 1: If the output would be the same both ways (as when an AND gate has one input that is definitely 0 and a questionable second input), that will be the output value; but if the output changes depending on whether it is 0 or 1, the output is the error value.

    The multi-bit versions of each gate will perform its one-bit transformation bitwise on its inputs.

    Pins (assuming component faces east)

    West edge (inputs, bit width according to Data Bits attribute)

    The inputs into the component. There will be as many of these as specified in the Number of Inputs attribute.

    Note that if you are using shaped gates, the west side of OR and NOR gates will be curved. Nonetheless, the input pins are in a line. Logisim will draw short stubs illustrating this; and if you overshoot a stub, it will silently assume that you did not mean to overshoot it. In "printer view", these stubs will not be drawn unless they are connected to wires.

    East edge (output, bit width according to Data Bits attribute)

    The gate's output, whose value is computed based on the current inputs as described above.

    Attributes

    When the component is selected or being added, the digits '0' through '9' alter its Number of Inputs attribute, Alt-0 through Alt-9 alter its Data Bits attribute, and the arrow keys alter its Facing attribute.

    Facing
    The direction of the component (its output relative to its inputs).
    Data Bits
    The bit width of the component's inputs and outputs.
    Gate Size
    Determines whether to draw a wider or narrower version of the component. This does not affect the number of inputs, which is specified by the Number of Inputs attribute. However, if shaped gates are selected, then the gate will be drawn with wings to accommodate additional inputs beyond what the shape naturally accommodates.
    Number of Inputs
    Determines how many pins to have for the component on its west side.
    Output Value
    Indicates how false and true results should be translated into output values. By default, false is indicated by a low voltage (0) and true by a high voltage (1), but one or the other can be replaced by a high-impedance (floating) value instead. This allows wired-or and wired-and connections, as illustrated below: At left, the buffers' Output Value attribute is floating/1 and the resistor pulls to 0, giving wired-or behavior; at right, the buffers' Output Value attribute is 0/floating and the resistor pulls to 1, giving wired-and behavior.
    Label
    The text within the label associated with the gate.
    Label Font
    The font with which to render the label.
    Negate x
    If yes, the input is negated before it is fed into the gate. The inputs are counted top-down if the facing is east or west, and they are counted left-to-right if the facing is north or south.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    Allows the label associated with the gate to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/base/0000755000175000017500000000000011541757134017055 5ustar vincentvincentlogisim-2.7.1/doc/es/html/libs/base/wiring.html0000644000175000017500000000667311541757134021256 0ustar vincentvincent Wiring Tool

    Wiring Tool

    Library: Base
    Introduced: 2.0 Beta 1

    Behavior

    The wiring tool is the tool for creating wire segments that carry values from one endpoint to another. The bit width of these values can be anything; exactly which bit width is automatically inferred from the components to which the wires are ultimately attached. If it is not attached to any components, the wire will be drawn gray to indicate that its bit width is unknown; if the components at the locations that the wire helps to connect disagree on the bit width, then the wire will be drawn orange to indicate the conflict, and the wire will in fact refuse to carry any values at all until the user resolves the conflict.

    A single drag of the mouse can create multiple wire segments. The precise process is a little confusing in its description; but it works quite intuitively in practice: If you request a particular wire segment using the Wiring Tool, that segment will be split apart wherever it hits a pin for an existing component, or wherever it hits the endpoint of an existing wire segment. Also, if an endpoint of any of the new wire segments hit somewhere in the middle of an existing wire, then that wire will be split into multiple segments itself.

    For some components that draw short stubs to which wires can connect (such as an OR gate or a controlled buffer), Logisim will silently correct attempts to create wires that slightly overshoot the stub's end.

    You can also shorten an existing wire segment using the Wiring Tool, using a drag that starts or ends at a terminus of the segment, and that overlaps the existing segment.

    All wires in Logisim are either horizontal or vertical.

    Wires are also non-directional; that is, they carry values from either endpoint to the other. Indeed, a wire can carry values in both directions simultaneously; the center wire in the below example is doing this.

    Attributes

    The wiring tool does not itself have attributes, but the wires that it creates do.

    Direction
    Indicates whether the wire is horizontal or vertical. The value of this attribute cannot be changed.
    Length
    Indicates how many pixels long the wire is. The value of this attribute cannot be changed.

    Poke Tool Behavior

    When you click an existing wire segment using the Poke Tool, Logisim displays the current value traveling through that wire. The behavior is particularly useful for multi-bit wires, whose black color provide no visual feedback about what value the wire is carrying.

    For multi-bit values, you can configure exactly how the value is displayed (in binary, decimal, or hexadecimal, for example) using the Layout pane of the Logisim Preferences dialog box.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/base/text.html0000644000175000017500000000467211541757134020740 0ustar vincentvincent Text Tool

    Text Tool

    Library: Base
    Introduced: 2.0 Beta 1

    Behavior

    The text tool allows you to create and edit labels associated with components. Which components support labels are indicated in the 'Text Tool Behavior' section of their documentation. As of the current release, the following components in the built-in libraries support labels.

    Base library Pin
    Clock
    Label
    Probe
    Memory library D/T/JK/SR Flip-Flop
    Register
    Counter
    Shift Register
    Random
    Input/Output library Button
    LED

    For components that can take a label but have none assigned to it currently, you can click anywhere within the component to add a label. If there is already a label, you need to click within the label. If you click at a point where there is not currently a label to be edited, Logisim will initiate the addition of a new Label component.

    In the current version of Logisim, text editing features are still fairly primitive. Selections of a region of text within a label is impossible. There is no way to insert a line break into a label.

    Attributes

    The attributes for the tool are the same as for the label component. These attributes have no effect when editing the label on an existing component, but they are imparted to any labels created using the text tool.

    Clicking on a component supporting the Text Tool will display that component's attributes.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/base/select.html0000644000175000017500000001026711541757134021230 0ustar vincentvincent Select Tool

    Select Tool

    Library: Base
    Introduced: 2.0 Beta 1

    Behavior

    Allows individual components to be placed into the current selection. There are a number of actions possible with this tool.

    • Pressing the mouse button while it is within a currently selected component begins a drag moving all components of the selection.

      By default, Logisim will compute a way to add new wires so that no existing connections are lost during the move. (Sometimes it will delete or shorten existing wires.) If you're performing a move where you do not want these changes to be made, you can press the shift key during the move. If you want to disable this behavior entirely, go to Project > Options, select the Canvas tab, and uncheck the Keep Connections When Moving box; in this case, the connections are computed only when the shift key is down.

      Dragging a selection can lead to unexpected behavior from wires: If you drag a selection including some wires on top of some other wires, all wires are merged, and the merged wires are placed into the selection. As a result, if you drag the selection a second time, the wires previously at the location will not be left behind. This behavior is necessary to keep with the expected behavior of wires in Logisim. And it does not normally constitute a major problem: Logisim will draw the full selection in the midst of dropping, and you should not drop it until you are sure it is in the correct location.

    • Otherwise, clicking the mouse within a component drops all components from the current selection and selects instead the component(s) containing the clicked location.

    • Shift-clicking the mouse within a component toggles that component's presence within the selection. If multiple components include the same location, all components' presence will be toggled. None of this will happen, though, if shift-clicking is mapped to another tool instead (via the project options window's Mouse tab).

    • Dragging the mouse starting at a location not contained within any components drops all components from the current selection and initiates a rectangular selection. All component(s) contained by the rectangle will be placed into the selection.

    • Shift-dragging the mouse starting at a location not contained within any components initiates a rectangular selection. The presence in the selection of all component(s) contained by the rectangle will be toggled. This will not happen, though, if shift-clicking is mapped to another tool instead.

    After selecting the desired items in the selection, you can of course cut/copy/paste/delete all the items via the Edit menu.

    Logisim's behavior when pasting the clipboard into a circuit is somewhat peculiar: It will not immediately place the components into the circuit; instead, the selection will be a collection of "ghosts," which will be dropped into the circuit as soon as they are either dragged to another location or removed from the selection. (This peculiar behavior is necessary because pasting will otherwise merge the wires of the selection into the current circuit at once, and the wires there previously will be dragged with the pasted clipboard if the user wants to move the pasted components somewhere else.)

    Attributes

    None. Selecting a component, though, will display its attributes. With multiple components selected, attributes shared by all are shown, blank if they have different values and otherwise with the value they all have in common. (Wires are ignored if there are any non-wires in the selection.) Changes to the attribute value affect all selected components.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/base/poke.html0000644000175000017500000000356411541757134020711 0ustar vincentvincent Poke Tool

    Poke Tool

    Library: Base
    Introduced: 2.0 Beta 1

    Behavior

    The Poke Tool is for manipulating the current values associated with components. The precise behavior of the Poke Tool varies depending on which component is clicked; this behavior is documented in the `Poke Tool Behavior' section of each individual component. The following components all have support for the Poke Tool.

    Base library Pin
    Clock
    Memory library D/T/J-K/S-R Flip-Flop
    Register
    Counter
    Shift Register
    RAM
    ROM
    Input/Output library Button
    Joystick
    Keyboard

    Also, clicking a wire segment using the Poke tool displays the value currently carried by the wire, as described on the Wiring Tool's page.

    Attributes

    None. Clicking on a component supporting the Poke Tool, though, will display that component's attributes.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/base/menu.html0000644000175000017500000000376311541757134020720 0ustar vincentvincent Menu Tool

    Menu Tool

    Library: Base
    Introduced: 2.0 Beta 1

    Behavior

    The menu tool permits the user to pull up a pop-up menu for components that already exist. By default, right-clicking or control-clicking a component will bring up this pop-up menu; however, the Mouse tab of the project options allows a user to configure the mouse buttons to work differently.

    The pop-up menu for most components has two items.

    • Delete: Removes the component from the circuit.
    • Show Attributes: Places the component's attributes into the window's attribute table, so that the attribute values can be viewed and changed.

    For some components, however, the menu has additional items. Subcircuits (that is, instances of using one circuit as a "black box" within another) are one example of this: In addition to the above two items, the pop-up menu includes another item.

    • View XXX: Changes the circuit layout being viewed and edited to be the subcircuit's layout instead. The values seen in the layout will be part of the same hierarchy as those of the supercircuit. (See the `Debugging subcircuits' section of the User's Guide.)

    Other components may extend the pop-up menu also. In the built-in libraries of the current version of Logisim, the only such components are RAM and ROM.

    Attributes

    None.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/base/label.html0000644000175000017500000000523011541757134021022 0ustar vincentvincent Label

    Label

    Library: Base
    Introduced: 2.0 Beta 1
    Appearance:

    Behavior

    This is a simple text label that can be placed anywhere in the circuit. It does not interact with values traveling through the circuit in any way, except inasmuch as it will be visible when the circuit is drawn.

    In contrast to all other components in the current built-in libraries, label components can be placed anywhere on the canvas; they do not snap to the grid.

    Pins

    None.

    Attributes

    Text
    The text appearing in the label. This value can be edited in the attribute table or, using the text tool, on the canvas.
    Font
    The font to use when drawing the label.
    Horizontal Alignment
    The horizontal positioning technique for the text relative to the label's official location (where the mouse was clicked in creating the label). "Left" means that the text should be drawn so that its left edge is at the location; "right" means that the text should be drawn so that its right edge is at the location; and "center" means that the text should be drawn so that its center (horizontally) is at the location.
    Vertical Alignment

    The vertical positioning technique for the text relative to the label's official location (where the mouse was clicked in creating the label). "Base" means that the baseline should intersect the location; "Top" means that the text's top should intersect the location; "Bottom" means that the text's bottom should intersect the location; and "Center" means that the text should be centered (vertically) at the location.

    The text's top and bottom is computed based on the font's standard ascent and descent values; thus, even if the actual text contains no tall letters (such as b) or descending letters (such as g), it is assumed to contain such letters for the purposes of vertical positioning.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    Allows the text appearing within the label to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/base/index.html0000644000175000017500000000277411541757134021064 0ustar vincentvincent Base Library

    Base library

    The Base library includes general-purpose tools.

    Poke Tool
    Edit Tool
    Select Tool
    Wiring Tool
    Text Tool
    Menu Tool
    Label

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/base/edit.html0000644000175000017500000001703511541757134020676 0ustar vincentvincent Edit Tool

    Edit Tool

    Library: Base
    Introduced: 2.3.0

    Behavior

    The Edit tool allows the user to rearrange existing components and to add wires. Exactly what the tool does depends on where the user presses the mouse on the canvas.

    • When the mouse is over a wiring point for an existing component, or if it is atop a current wire, the Edit Tool will display a small green circle around the mouse's location. Pressing the button there initiates the addition of a new wire. But if the user doesn't drag the mouse far enough to initiate a wire before releasing the button, the press is treated as a mouse click, and so the wire is simply added into the current selection.

      The bit width of an added wire is inferred from the components to which it is connected. If it is not attached to any components, the wire will be drawn gray to indicate that its bit width is unknown; if the components at the locations that the wire helps to connect disagree on the bit width, then the wire will be drawn orange to indicate the conflict, and the wire will in fact refuse to carry any values at all until the user resolves the conflict.

      All wires in Logisim are either horizontal or vertical, never diagonal.

      Wires are non-directional; that is, they carry values from either endpoint to the other. Indeed, a wire can carry values in both directions simultaneously: In the below example, a bit flows from the upper input at left through the center wire, then it circles back through the center wire, and then it circles forward again through the center wire before reaching the output at lower right.

      A single drag of the mouse can create multiple wire segments. The precise process is a little confusing in its description; but it works quite intuitively in practice: If you request a particular wire segment using the Wiring Tool, that segment will be split apart wherever it hits a pin for an existing component, or wherever it hits the endpoint of an existing wire segment. Also, if an endpoint of any of the new wire segments hit somewhere in the middle of an existing wire, then that wire will be split into multiple segments itself.

      You can also shorten or delete an existing wire segment by initiating a drag at the terminus of the segment and then drawing backwards across the segment. During the drag, the shortening is indicated by drawing a white line over of the portion of the wire that will be removed.

      Some components draw short stubs to which wires can connect, such as the OR gate and controlled buffer. Logisim will silently correct attempts to create wires that slightly overshoot the stub's end.

    • If, however, the user presses the Alt key at a point in the middle of the wire, then the green circle will disappear. A mouse press selects the wire, and a mouse drag moves it.

    • Pressing the mouse button while it is within a currently selected component begins a drag moving all elements of the selection.

      By default, Logisim will compute a way to add new wires so that no existing connections are lost during the move. (Sometimes it will delete or shorten existing wires.) If you're performing a move where you do not want these changes to be made, you can press the shift key during the move. If you want to disable this behavior entirely, go to Project > Options, select the Canvas tab, and uncheck the Keep Connections When Moving box; in this case, the connections are computed only when the shift key is down.

      Dragging a selection can lead to unexpected behavior from wires: If you drag a selection including some wires on top of some other wires, all wires are merged, and the merged wires are placed into the selection. As a result, if you drag the selection a second time, the wires previously at the location will not be left behind. This behavior is necessary to keep with the intuitive behavior of wires in Logisim, where wires never overlap. And it does not normally constitute a major problem: Logisim will draw the full selection in the midst of dropping, and you should not drop it until you are sure it is in the correct location.

    • Pressing the mouse within an unselected component (but not at one of the component's wiring points) drops all components from the current selection and selects instead the component(s) containing the clicked location.

    • Shift-clicking the mouse within a component toggles that component's presence within the selection. If multiple components include the same location, all components' presence will be toggled.

    • Dragging the mouse starting at a location not contained within any components drops all components from the current selection and initiates a rectangular selection. All component(s) contained by the rectangle will be placed into the selection.

    • Shift-dragging the mouse starting at a location not contained within any components initiates a rectangular selection. The presence in the selection of all component(s) contained by the rectangle will be toggled.

    • However, if the Alt key is pressed at a location not contained within any components, this initiates the addition of a new wire. A small green circle is drawn in such a circumstance to indicate this.

    After selecting the desired items in the selection, you can of course cut/copy/paste/delete/duplicate all the items via the Edit menu.

    Some keys have an effect with the Edit Tool.

    • The arrow keys change the Facing attribute for all components in the selection that have such an attribute.

    • The Delete and Backspace keys will delete everything in the selection from the circuit.

    • The Insert and MenuKey-D keys will create a duplicate of the currently selected components.

    Logisim's behavior when duplicating a selection or pasting the clipboard into a circuit is somewhat peculiar: It will not immediately place the components into the circuit; instead, the selection will be a collection of "ghosts," which will be dropped into the circuit as soon as they are either dragged to another location or removed from the selection. (This peculiar behavior is necessary because pasting will otherwise merge the wires of the selection into the current circuit at once, and the wires there previously will be dragged with the pasted clipboard if the user wants to move the pasted components somewhere else.)

    Attributes

    None. Selecting a component, though, will display its attributes. With multiple components selected, attributes shared by all are shown, blank if they have different values and otherwise with the value they all have in common. (Wires are ignored if there are any non-wires in the selection.) Changes to the attribute value affect all selected components.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/arith/0000755000175000017500000000000011541757134017252 5ustar vincentvincentlogisim-2.7.1/doc/es/html/libs/arith/subtractor.html0000644000175000017500000000623011541757134022331 0ustar vincentvincent Subtractor

    Subtractor

    Library: Arithmetic
    Introduced: 2.0 Beta 11
    Appearance:

    Behavior

    This component subtracts values coming in via the west inputs (the upper minus the lower) and outputs the difference on the east output. The component is designed so that it can be cascaded with other subtractors to provide subtract more bits than is possible with a single subtractor: The borrow-in input provides a one-bit value to be borrowed out of the difference (if the borrow-in input is specified), and a borrow-out output indicates whether the component needs to borrow an upper-order bit to complete the subtraction without underflow (assuming unsigned subtraction).

    Internally, the subtractor simply performs a bitwise NOT on the subtrahend, and add this to the minuend along with the NOT of the borrow-in input. (The minuend is the first operand (upper input) to the subtraction, and the subtrahend is the second (lower input). I happen to like the antiquated terms.)

    If either of the operands contains some floating bits or some error bits, then the component will perform a partial subtraction. That is, it will compute as many low-order bits as possible. But above the floating or error bit, the result will have floating or error bits.

    Pins

    West edge, north end (input, bit width matches Data Bits attribute)
    The minuend of the subtraction; that is, the number from which to subtract.
    West edge, south end (input, bit width matches Data Bits attribute)
    The subtrahend of the subtraction; that is, the number to subtract from the minuend.
    North edge, labeled b in (input, bit width 1)
    If 1, then 1 is borrowed out of the difference. If the value is unknown (i.e., floating), then it is assumed to be 0.
    East edge (output, bit width matches Data Bits attribute)
    The lower dataBits bits of the difference of the two values coming in the west edge, minus the bin bit.
    South edge, labeled b out (output, bit width 1)
    The borrow bit computed for the difference. If the values subtracted as unsigned values yield a negative value, then this bit will be 1; otherwise, it will be 0.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the values to be subtracted and of the result.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/arith/shifter.html0000644000175000017500000000707211541757134021612 0ustar vincentvincent Shifter

    Shifter

    Library: Arithmetic
    Introduced: 2.3.0
    Appearance:

    Behavior

    This component includes two inputs, data and dist, and it has one output, which is the result of shifting data by dist places. Both data and output have the same number of bits in them. The component supports the following shift types:

    • Logical Left: All bits in data are shifted up dist places, with the bottom dist places filled with 0's. For example, 11001011 logically shifted left twice is 00101100. (The top two ones are lost.)
    • Logical Right: All bits in data are shifted down dist places, with the upper dist places filled with 0's. For example, 11001011 logically shifted right twice is 00110010. (The bottom two ones are lost.)
    • Arithmetic Right: All bits in data are shifted down dist places, with the upper dist places filled with repetitions of whatever the uppermost bit in data. For example, 11001011 arithmetically shifted right twice is 11110010.
    • Rotate Left: All bits in data are shifted up dist places, with the top dist places wrapped around into the bottom. For example, 11001011 rotated left twice is 00101111.
    • Rotate Right: All bits in data are shifted down dist places, with the bottom dist places wrapped around into the top. For example, 11001011 rotated right twice is 11110010.

    Note that if dist contains any floating or error inputs, then the output is composed entirely of error values, since there is no way to guess how far to shift the input.

    Pins

    West edge, north end (input, bit width matches the Data Bits attribute)
    The value to be shifted.
    West edge, south end (input, bit width is computed as below)
    The number of bits by which to shift the data input. This input should have as many bits as is the minimum number to indicate any shift distance from 0 up to one less than Data Bits; that is, it should be the ceiling of the base-2 logarithm of Data Bits. For example, if Data Bits were 8, this input would require 3 bits; but if it were 9, it would require 4 bits.
    East edge (output, bit width matches the Data Bits attribute)
    The result of shifting the input value by the input distance.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the data input and of the output.
    Shift Type
    One of the five possible shift types as outlined above (Logical Left, Logical Right, Arithmetic Right, Rotate Left, Rotate Right).

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/arith/negator.html0000644000175000017500000000333311541757134021601 0ustar vincentvincent Negator

    Negator

    Library: Arithmetic
    Introduced: 2.0 Beta 22
    Appearance:

    Behavior

    Computes the two's-complement negation of the input. This negation is performed by maintaining all the lower-order bits up to the lowest-order 1, and complementing all bits above that.

    If the value to be negated happens to be the least negative value, then its negation (which cannot be represented in two's-complement form), is still the least negative value.

    Pins

    West edge (input, bit width matches Data Bits attribute)
    The value to negate.
    East edge, labeled -x (output, bit width matches Data Bits attribute)
    The negation of the input. If the input happens to be the least negative value representable in dataBits bits, however, then the output matches the input.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the component's input and output.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/arith/multiplier.html0000644000175000017500000000544011541757134022331 0ustar vincentvincent Multiplier

    Multiplier

    Library: Arithmetic
    Introduced: 2.0 Beta 20
    Appearance:

    Behavior

    This component multiplies two values coming in via the west inputs and outputs the product on the east output. The component is designed so that it can be cascaded with other multipliers to multiply a multiplicand with more bits than is possible with a single multiplier: The carry-in input provides a multi-bit value to be added into the product (if it is specified), and a carry-out output provides the upper half of the product result, which can be fed into another multiplier.

    If the multiplicand, the multiplier, or the carry-in input contain some floating bits or some error bits, then the component will perform a partial multiplication. That is, it will compute as many low-order bits as possible. But above the floating or error bit, the result will have floating or error bits. Note that if the carry-in input is completely floating, then it will be assumed to be all-zeroes.

    Pins

    West edge, north end (input, bit width matches Data Bits attribute)
    The multiplicand (that is, the first of the two numbers to multiply).
    West edge, south end (input, bit width matches Data Bits attribute)
    The multiplier (that is, the second of the two numbers to multiply).
    North edge, labeled c in (input, bit width matches Data Bits attribute)
    A carry value to add into the product. If all bits of the value are unknown (i.e., floating), then they are assumed to be 0.
    East edge (output, bit width matches Data Bits attribute)
    The lower dataBits bits of the product of the two values coming in the west edge, plus the cin value.
    South edge, labeled c out (output, bit width matches Data Bits attribute)
    The upper dataBits bits of the product.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the values to be multiplied and of the result.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/arith/index.html0000644000175000017500000000405411541757134021252 0ustar vincentvincent Arithmetic Library

    Arithmetic library

    The Arithmetic library includes combinational components that perform arithmetic operations on unsigned and two's-complement values.

    Adder
    Subtractor
    Multiplier
    Divider
    Negator
    Comparator
    Shifter
    Bit Adder
    Bit Finder

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/arith/divider.html0000644000175000017500000000617211541757134021574 0ustar vincentvincent Divider

    Divider

    Library: Arithmetic
    Introduced: 2.0 Beta 22
    Appearance:

    Behavior

    This component divides two values coming in via the west inputs and outputs the quotient on the east output. The component is designed so that it can be cascaded with other dividers to provide support a dividend with more bits than is possible with a single divider: The upper input provides the upper dataBits bits of the dividend (if it is specified at all), and the rem bits provide the remainder, which can be fed as the upper input into another divider.

    If the divisor is 0, then no division is performed (i.e., the divisor is assumed to be 1).

    The divider essentially performs unsigned division. That is, the remainder will always be between 0 and divisor-1. The quotient will always be an integer so that

    quotient * divisor + remainder = dividend .
    If, however, the quotient does not fit into dataBits bits, then only the lower dataBits bits will be reported. The component does not provide any method for accessing the upper dataBits bits.

    If either of the operands contains some floating bits or some error bits, then the component's outputs will be either entirely floating or entirely error values.

    Pins

    West edge, north end (input, bit width matches Data Bits attribute)
    The lower dataBits bits of the dividend (that is, the first operand for the division).
    West edge, south end (input, bit width matches Data Bits attribute)
    The divisor (that is, the second operand for the division)
    North edge, labeled upper (input, bit width matches Data Bits attribute)
    The upper dataBits bits of the dividend (that is, the first operand for the division).
    East edge (output, bit width matches Data Bits attribute)
    The lower dataBits bits of the quotient, as specified above.
    South edge, labeled rem (output, bit width matches Data Bits attribute)
    The remainder of the division. This value will always be between 0 and divisor-1.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the values to be divided and of the result.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/arith/comparator.html0000644000175000017500000000444211541757134022313 0ustar vincentvincent Comparator

    Comparator

    Library: Arithmetic
    Introduced: 2.0 Beta 22
    Appearance:

    Behavior

    Compares two values, either as unsigned values or as two's-complement values, depending on the Numeric Type attribute. Normally, one of the outputs will be 1, and the other two outputs will be 0.

    The comparison is performed starting at the most significant bits in each number and descending downward in parallel until a location is found where the two values disagree. If, however, an error value or a floating value is encountered during this descent, then all outputs will match that error or floating value.

    Pins

    West edge, north end (input, bit width matches Data Bits attribute)
    The first of the two values to be compared.
    West edge, south end (input, bit width matches Data Bits attribute)
    The second of the two values to be compared.
    East edge, labeled > (output, bit width 1)
    1 if the first input is greater than the second input, 0 if the first input is less than or equal the second input.
    East edge, labeled = (output, bit width 1)
    1 if the first input equals the second input, 0 if the first input is not equal the second input.
    East edge, labeled < (output, bit width 1)
    1 if the first input is less than the second input, 0 if the first input is greater than or equal the second input.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the component's inputs.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/arith/bitfinder.html0000644000175000017500000000735611541757134022121 0ustar vincentvincent Bit Finder

    Bit Finder

    Library: Arithmetic
    Introduced: 2.6.1
    Appearance:

    Behavior

    The component takes a multi-bit input and determines the the index of a bit, where the index is computed by counting from 0 as the lowest-order bit. Exactly which index it computes depends on the Type attribute, as illustrated by the examples in the below table for the 8-bit sample input 11010100.

    TypeOutput for 11010100
    Lowest-order 12
    Highest-order 17
    Lowest-order 00
    Highest-order 05

    For the lowest-order 1, the output is 2 because if you index the bits starting from 0 for the lowest-order bit, the first 1 you will find is at index 2. (The bits at indices 0 and 1 are both 0.) For the highest-order 1, the output is 7 because the topmost 1 bit is at index 7 (again counting from the lowest-order bit as 0).

    The component's output on the south edge indicates whether the desired bit was found at all. In the above examples involving the input 11010100, the south output is 1 in all cases. But if the input were 00000000 and the component is to find the lowest-order 1, then the south output would be 0 — and the output on the east edge would be 0 as well.

    If while searching for the desired value, a value that is neither 0 or 1 is found (the bit could be floating or an error value), then both outputs will consist entirely of error bits. Note that this occurs only if the problematic bit is encountered before finding the desired bit: For the input x1010100, the output would still be 2 if the lowest-order 1 is desired; but we would get error values if the component's type indicates to search for the highest-order 1 or the highest-order 0, since there is an erroneous bit in a higher-order bit than either the highest-order 0 or the highest-order 1.

    Pins

    West edge (input, bit width matches Data Bits attribute)
    The multibit input that is to be searched for the desired bit.
    East edge (output, bit width computed as described below)
    The index of the desired bit, counting from 0 for the lowest-order bit. The bit width is the minimum number of bits to store the maximum possible index, which is one less than the value of the Data Bits attribute.
    South edge (output, bit width 1)
    1 if the desired bit is found, 0 if all input bits are the inverse of the desired bit, and the error value if a non-0, non-1 value is found before the desired bit.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the input.
    Type
    Indicates which bit to search for — the lowest-order 0, the highest-order 0, the lowest-order 1, or the highest-order 1.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/arith/bitadder.html0000644000175000017500000000504011541757134021715 0ustar vincentvincent Bit Adder

    Bit Adder

    Library: Arithmetic
    Introduced: 2.6.0
    Appearance:

    Behavior

    The component determines how many 1 bits are in its input(s) and emits the total number of 1 bits on its output. For example, given the 8-bit input 10011101, the output would be 5, since there are five 1-bits in the input (the first, the last, and a string of three bits in the middle).

    If any of the input bits are floating or error values, then the output will contain error bits in the output corresponding to the range of possible outputs depending on whether those floating/error values are counted as zeroes or ones. For instance, if the 14-bit input is 111x10110x1101, then the output must be at least 9 (if the x's are interpreted as zeroes) and at most 11 (if they are interpreted as ones). Thus, the output will be 10EE: The upper two bits will be 1 and 0 since all integers between 9 and 11 have 1 and 0 as their top two bits, but the lower two bits are EE since integers between 9 and 11 vary within these bits.

    Pins

    West edge (inputs, bit width matches Data Bits attribute)
    The inputs whose 1 bits are to be counted. The number of inputs is based on the Number of Inputs attribute.
    East edge (output, bit width computed as described below)
    The number of input bits which are 1. The bit width of the output is the minimum number of bits to store the maximum possible value (which would be the product of the Data Bits attribute and the Number of Inputs attribute).

    Attributes

    When the component is selected or being added, the digits '0' through '9' alter its Number of Inputs attribute and Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the input(s).
    Number of Inputs
    The number of input values.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/libs/arith/adder.html0000644000175000017500000000506511541757134021225 0ustar vincentvincent Adder

    Adder

    Library: Arithmetic
    Introduced: 2.0 Beta 11
    Appearance:

    Behavior

    This component adds two values coming in via the west inputs and outputs the sum on the east output. The component is designed so that it can be cascaded with other adders to provide add more bits than is possible with a single adder: The carry-in input provides a one-bit value to be added into the sum also (if it is specified), and a carry-out output provides a one-bit overflow value that can be fed to another adder.

    If either of the addends contains some floating bits or some error bits, then the component will perform a partial addition. That is, it will compute as many low-order bits as possible. But above the floating or error bit, the result will have floating or error bits.

    Pins

    West edge, north end (input, bit width matches Data Bits attribute)
    One of the two values to add.
    West edge, south end (input, bit width matches Data Bits attribute)
    The other of the two values to add.
    North edge, labeled c in (input, bit width 1)
    A carry value to add into the sum. If the value is unknown (i.e., floating), then it is assumed to be 0.
    East edge (output, bit width matches Data Bits attribute)
    The lower dataBits bits of the sum of the two values coming in the west edge, plus the cin bit.
    South edge, labeled c out (output, bit width 1)
    The carry bit computed for the sum. If the values added together as unsigned values yield a result that fits into dataBits bits, then this bit will be 0; otherwise, it will be 1.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the values to be added and of the result.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/es/html/index.html0000644000175000017500000000054211541757132017206 0ustar vincentvincent Welcome to Logisim!

    Welcome to Logisim!

    Units in the Logisim help system include:

    Guide to Being a Logisim User
    Library Reference

    logisim-2.7.1/doc/es/html/guide/0000755000175000017500000000000011541757132016305 5ustar vincentvincentlogisim-2.7.1/doc/es/html/guide/verify/0000755000175000017500000000000011541757134017613 5ustar vincentvincentlogisim-2.7.1/doc/es/html/guide/verify/sub.html0000644000175000017500000000632611541757134021301 0ustar vincentvincent Substituting libraries

    Substituting libraries

    Now suppose we have two Logisim circuits that are supposed to do the same thing. As an instructor, you might have had students complete an assignment: You have one file containing your solution, but you have several student files containing their work. Maybe the assignment was to build a two-bit adder.

    I'll imagine that we have two files, named adder-master.circ and adder-query.circ. Each file contains a circuit named 2-bit adder (it's important that the circuit to test be named exactly the same), whose appearance is the following.

    adder-master.circ adder-query.circ

    As you can see, the master circuit uses Logisim's built-in adder, while the query circuit uses two subcircuits representing a half adder and a full adder (which themselves are built up of simple gates). For the purpose of our example, the query circuit has a stupid error: The carry from the half adder is not connected into the full adder.

    We build our testing circuit into a different file. There, we load adder-master.circ as a Logisim Library (Project > Load Library > Logisim Library…), and we insert its 2-bit adder as a subcircuit. We could execute this circuit directly to get the desired output for a perfect solution.

    java -jar logisim-filename.jar adder-test.circ -tty table

    But we want to execute the circuit using adder-query.circ rather than adder-master.circ as the loaded library. The naive approach would be to open Logisim and load that library instead; or you might simply remove the adder-master.circ file and rename adder-query.circ to be named adder-master.circ instead. But Logisim includes a handy -sub option that temporarily replace one file by another during that session — without making any changes on disk.

    java -jar logisim-filename.jar adder-test.circ -tty table -sub adder-master.circ adder-query.circ

    The output you would see from this is shown below; it is of course different from what we saw in the previous section since now it is executing using the erroneous adder-query.circ.

    00      00      0E0
    01      00      0E1
    10      00      EE0
    11      00      EE1
    00      01      0E1
    01      01      0E0
    10      01      EE1
    11      01      EE0
    00      10      EE0
    01      10      EE1
    10      10      1E0
    11      10      1E1
    00      11      EE1
    01      11      EE0
    10      11      1E1
    11      11      1E0

    Next: Other verification options.

    logisim-2.7.1/doc/es/html/guide/verify/other.html0000644000175000017500000001025411541757134021624 0ustar vincentvincent Other verification options

    Other verification options

    There are a some additional options related to command-line execution.

    The -load command-line parameter

    A more complex circuit might include a RAM component that needs to be loaded with a program in order for the circuit to have anything to do. You can specify a memory image file at the command line, which will be loaded into any RAM component in the circuit before simulation begins. (This does not work when loading the GUI - it is only for command-line execution.)

    java -jar logisim-filename.jar cpu.circ -tty table -load mem-image.txt

    The order of the parameters is not important (except the table parameter must be immediately after -tty, and the memory image's filename must be immediately after -load). The memory image file should be in Logisim's memory image format.

    Logisim searches for RAM recursively, so this will still work if RAM is nested within a subcircuit. There is no way, though, to distinguish different RAM components: Logisim will attempt to load the same file into every RAM that it can find.

    Options for the -tty parameter

    In our examples thus far, we've always used -tty table to indicate that a table of output values should be displayed. You can customize the behavior in other ways by listing one or more options, separated by commas. For instance, you might write -tty table,halt,speed, and the program will perform all three behaviors listed below. (The order in which they are listed does not matter.)

    halt

    After the simulation ends, a one-line message is displayed explaining why the simulation ended. Error conditions - such as a detected oscillation - are displayed in any case.

    speed

    If you use speed in conjunction with -tty, then after completing the simulation Logisim will display a summary of how quickly the circuit was simulated, such as:

    714 Hz (509 ticks in 712 milliseconds)

    Note that displaying information during the simulation makes the simulation go much slower. As just one comparison, the same circuit and image ran at 714 Hz above with just the speed option but 490 Hz with the table option as well.

    stats

    Shows a tab-delimited table containing statistics about components used by the top-level main circuit in the project. The table includes four columns:

    • Unique: The number of times that component appears in the circuit's hierarchy, where each subcircuit within the hierarchy is counted only once.
    • Recursive: The number of times that component appears in the circuit's hierarchy, where we count each subcircuit as many times as it appears in the hierarchy.
    • Component: The name of the component.
    • Library: The name of the library from which the component came.

    The distinction between Unique and Recursive is explained further under Project menu section. If the file uses circuits from a loaded Logisim library, those components are considered to be black boxes: The contents of the library's circuits are not included in the unique and recursive counts.

    (This feature can be useful for instructors who assign students to build projects using a subset of Logisim's libraries.)

    table

    (as already discussed)

    tty

    Any TTY components send their output to the display (standard output), and any information typed at the keyboard is sent to all Keyboard components in the circuit. These components are included even if they are nested deeply in the subcircuit hierarchy.

    Next: Testing multiple files.

    logisim-2.7.1/doc/es/html/guide/verify/multi.html0000644000175000017500000000564611541757134021646 0ustar vincentvincent Testing multiple files

    Testing multiple files

    In the classroom example, you will have many files that you wish to test for their equivalence, and you won't want to read the output for each of the student's solutions.

    Building comparison into the circuit

    One approach is to build a test circuit that does the comparison directly. Here, we create an additional circuit within the testing file that contains our solution circuit. In our overall testing circuit, we include both the subcircuit from adder-master.circ and the subcircuit from the solution circuit located directly into the nested circuit. We wire it so that there is just one output, which is 1 as long as the two subcircuits agree.

    Now we can simply run Logisim substituting each query file. For any correct solution, the only output will be 1.

    Using redirection and shell scripts

    If you're quite comfortable with the command line, you can build your own shell script to accomplish this. Here, we'll use redirection (the > operator) to save the output of each circuit into a file. For instance, we might issue the following two commands to collect the output of the master circuit and the query circuit.

    java -jar logisim-filename.jar adder-test.circ -tty table > output-master.txt
    java -jar logisim-filename.jar adder-test.circ -tty table -sub adder-master.circ adder-query.circ > output-query.txt

    Now we've created two different files. We can then compare the two output files using a program built for that purpose. Under Linux or MacOS X, you might want to use the cmp or diff command-line utilities. Under Windows, you might want to use WinMerge.

    To process several query files, you would like want to build a simple program such as a shell script to iterate through each and comparing the output. Here is how I would do it under Linux's bash:

    RUN_TEST="java -jar logisim-filename.jar adder-test.circ -tty table"
    ${RUN_TEST} > output-master.txt
    for QUERY_FILE in adder-query*.circ
    do
      if ${RUN_TEST} -sub adder-master.circ ${QUERY_FILE} | cmp -s output-master.txt
      then
        echo "${QUERY_FILE} OK"
      else
        echo "${QUERY_FILE} different"
      fi
    done

    Next: User's Guide.

    logisim-2.7.1/doc/es/html/guide/verify/index.html0000644000175000017500000000535111541757134021614 0ustar vincentvincent Command-line verification

    Command-line verification

    Subsections:
    Substituting libraries
    Other verification options
    Testing multiple files

    Logisim includes basic support for executing circuits from the command-line. This is intended both to help with scripted verification of circuit designs and to help instructors perform automated testing of students' solutions.

    We'll start by seeing how to execute a circuit from the command line. For our example, we'll suppose we've built the below circuit in a file named adder-test.circ. It uses a two-bit adder as a subcircuit and iterates using a counter through all 16 possible inputs to it.

    After this circuit has been built, we then execute Logisim from the command line, providing the filename of the project and the -tty option with the table parameter.

    java -jar logisim-filename.jar adder-test.circ -tty table

    Without bringing up any windows, Logisim loads the circuit and begins to execute it, ticking any clocks as fast as it can while completing the propagation between each tick. After each propagation is completed, Logisim loads the current values of the output pins; if any have changed from the previous propagation, then all values are displayed in tab-delimited format. If there is an output pin labeled with the special word halt, its output is not displayed — but once the pin's value reaches 1 after a propagation is completed, Logisim ends the simulation.

    For our example, Logisim displays the table below. Because we have two output pins corresponding to the two inputs a and b into the two-bit adder, these outputs are included as the first two columns of the output. And there is another output pin corresponding to the two-bit adder's output, so it is the third column. The columns are ordered left-to-right according to the top-down ordering within the circuit.

    00      00      000
    01      00      001
    10      00      010
    11      00      011
    00      01      001
    01      01      010
    10      01      011
    11      01      100
    00      10      010
    01      10      011
    10      10      100
    11      10      101
    00      11      011
    01      11      100
    10      11      101
    11      11      110
    

    Next: Substituting libraries.

    logisim-2.7.1/doc/es/html/guide/tutorial/0000755000175000017500000000000011541757134020152 5ustar vincentvincentlogisim-2.7.1/doc/es/html/guide/tutorial/tutor-wires.html0000644000175000017500000000447411541757134023355 0ustar vincentvincent Tutorial: Adding wires

    Next: Step 3: Adding text

    Step 2: Adding wires

    After you have all the components blocked out on the canvas, you're ready to start adding wires. Select the Edit Tool (). When the cursor is over a point that receives a wire, a small green circle will be drawn around it. Press the mouse button there and drag as far as you want the wire to go.

    Logisim is rather intelligent when adding wires: Whenever a wire ends at another wire, Logisim automatically connects them. You can also "extend" or "shorten" a wire by dragging one of its endpoints using the edit tool.

    Wires in Logisim must be horizontal or vertical. To connect the upper input to the NOT gate and the AND gate, then, I added three different wires.

    Logisim automatically connects wires to the gates and to each other. This includes automatically drawing the circle at a T intersection as above, indicating that the wires are connected.

    As you draw wires, you may see some blue or gray wires. Blue in Logisim indicates that the value at that point is "unknown," and gray indicates that the wire is not connected to anything. This is not a big deal as you're in the process of building a circuit. But by the time you finish it, none of your wires should be blue or gray. (The unconnected legs of the OR gate will still be blue: That's fine.)

    If you do have a blue or a gray wire after you think everything ought to be connected, then something is going wrong. It's important that you connect wires to the right places. Logisim draws little dots on the components to indicate where wires ought to connect. As you proceed, you'll see the dots turn from blue to light or dark green.

    Once you have all the wires connected, all of the wires you inserted will themselves be light or dark green.

    Next: Step 3: Adding text

    logisim-2.7.1/doc/es/html/guide/tutorial/tutor-text.html0000644000175000017500000000206411541757134023201 0ustar vincentvincent Tutorial: Adding text

    Next: Step 4: Testing your circuit

    Step 3: Adding text

    Adding text to the circuit isn't necessary to make it work; but if you want to show your circuit to somebody (like a teacher), then some labels help to communicate the purpose of the different pieces of your circuit.

    Select the text tool (). You can click on an input pin and start typing to give it a label. (It's better to click directly on the input pin than to click where you want the text to go, because then the label will move with the pin.) You can do the same for the output pin. Or you could just click any old place and start typing to put a label anywhere else.

    Next: Step 4: Testing your circuit

    logisim-2.7.1/doc/es/html/guide/tutorial/tutor-test.html0000644000175000017500000000450611541757134023177 0ustar vincentvincent Tutorial: Testing your circuit

    Next: User's Guide

    Step 4: Testing your circuit

    Our final step is to test our circuit to ensure that it really does what we intended. Logisim is already simulating the circuit. Let's look again at where we were.

    Note that the input pins both contain 0s; and so does the output pin. This already tells us that the circuit already computes a 0 when both inputs are 0.

    Now to try another combination of inputs. Select the poke tool () and start poking the inputs by clicking on them. Each time you poke an input, its value will toggle. For example, we might first poke the bottom input.

    When you change the input value, Logisim will show you what values travel down the wires by drawing them light green to indicate a 1 value or dark green (almost black) to indicate a 0 value. You can also see that the output value has changed to 1.

    So far, we have tested the first two rows of our truth table, and the outputs (0 and 1) match the desired outputs.

    By poking the switches through different combinations, we can verify the other two rows. If they all match, then we're done: The circuit works!



    To archive your completed work, you might want to save or print your circuit. The File menu allows this, and of course it also allows you to exit Logisim. But why quit now?

    Now that you are finished with tutorial, you can experiment with Logisim by building your own circuits. If you want to build circuits with more sophisticated features, then you should navigate through the rest of the help system to see what else you can do. Logisim is a powerful program, allowing you to build up and test huge circuits; this step-by-step process just scratches the surface.

    Next: User's Guide

    logisim-2.7.1/doc/es/html/guide/tutorial/tutor-orient.html0000644000175000017500000000236711541757134023523 0ustar vincentvincent Tutorial: Orienting yourself

    Next: Step 1: Adding gates

    Step 0: Orienting yourself

    When you start Logisim, you'll see a window similar to the following. Some of the details may be slightly different since you're likely using a different system than mine.

    All Logisim is divided into three parts, called the explorer pane, the attribute table, and the canvas. Above these parts are the menu bar and the toolbar.

    We can quickly dispose of the explorer pane and the attribute table: We won't be examining them in this tutorial, and you can just ignore them. Also, the menu bar is self-explanatory.

    That leaves the toolbar and the canvas. The canvas is where you'll draw your circuit; and the toolbar contains the tools that you'll use to accomplish this.

    Next: Step 1: Adding gates

    logisim-2.7.1/doc/es/html/guide/tutorial/tutor-gates.html0000644000175000017500000000657511541757134023333 0ustar vincentvincent Tutorial: Adding gates

    Next: Step 2: Adding wires

    Step 1: Adding gates

    Recall that we're trying to build the following circuit in Logisim.

    I suggest building a circuit by inserting the gates first as a sort of skeleton and then connecting them with wires later. The first thing we'll do is to add the two AND gates. Click on the AND tool in the toolbar (, the next-to-last tool listed). Then click in the editing area where you want the first AND gate to go. Be sure to leave plenty of room for stuff on the left. Then click the AND tool again and place the second AND gate below it.

    Notice the five dots on the left side of the AND gate. These are spots where wires can be attached. It happens that we'll just use two of them for our XOR circuit; but for other circuits, you may find that having more than two wires going to an AND gate is useful.

    Now add the other gates. First click on the OR tool (); then click where you want it. And place the two NOT gates into the canvas using the NOT tool ().

    I left a little space between the NOT gates and the AND gates; if you want to, though, you can put them up against each other and save yourself the effort of connecting them with a wire later.

    Now we want to add the two inputs x and y into the diagram. Select the Input tool (), and place the pins down. You should also place an output pin next to the OR gate's output using the Output tool (). (Again, I'm leaving a bit of space between the OR gate and the output pin, but you might choose to place them right next to each other.)

    If you decide you don't like where you placed something, then you can select it using the Edit tool () and drag it to the desired spot. Or you can delete it altogether by selecting Delete from the Edit menu or pressing the Delete key.

    As you place each component of the circuit, you'll notice that as soon as the component is placed, Logisim reverts to the Edit tool so that you can move the recently-placed component or (as we'll see soon) connect the component to others by creating wires. If you want to add a copy of the recently placed component, a shortcut is to press Control-D to duplicate the selection. (Some computers use another keys for menus, such as the Command key on Macintoshes. You would press that key with the D key.)

    Next: Step 2: Adding wires

    logisim-2.7.1/doc/es/html/guide/tutorial/index.html0000644000175000017500000000302211541757134022144 0ustar vincentvincent Beginner's tutorial

    Beginner's tutorial

    Next: Step 0: Orienting yourself

    Welcome to Logisim!

    Logisim allows you to design and simulate digital circuits. It is intended as an educational tool, to help you learn how circuits work.

    To practice using Logisim, let's build a XOR circuit - that is, a circuit that takes two inputs (which we'll call x and y) and outputs 0 if the inputs are the same and 1 if they are different. The following truth table illustrates.

    We might design such a circuit on paper.
    But just because it's on paper doesn't mean it's right. To verify our work, we'll draw it in Logisim and test it. As an added bonus, we'll get a circuit that's looks nicer than what you probably would draw by hand.

    Step 0: Orienting yourself
    Step 1: Adding gates
    Step 2: Adding wires
    Step 3: Adding text
    Step 4: Testing your circuit

    Enjoy your circuit-building!

    Next: Step 0: Orienting yourself

    logisim-2.7.1/doc/es/html/guide/subcirc/0000755000175000017500000000000011541757134017741 5ustar vincentvincentlogisim-2.7.1/doc/es/html/guide/subcirc/using.html0000644000175000017500000000726311541757134021764 0ustar vincentvincent Using subcircuits

    Using subcircuits

    Now suppose we want to build a 4-to-1 multiplexer using instances of our 2-to-1 multiplexer. Of course, we would first create a new circuit, which we'll call "4:1 MUX." To add 2-to-1 multiplexers into our circuit, we click the 2:1 MUX circuit once in the explorer pane to select it as a tool, and then we can add copies of it, represented as boxes, by clicking within the canvas.

    If you were to double-click the 2:1 MUX circuit in the explorer pane, then the window would switch to editing the 2:1 MUX circuit instead.

    After building up the circuit, we end up with the following.

    Our circuit for a 4-to-1 multiplexer uses three copies of the 2-to-1 multiplexer, each drawn as a box with pins along the side. The pins on this box correspond to the input and output pins in the 2:1 MUX circuit. The two pins on the west side of the box correspond to the two pins that face east in the 2:1 MUX circuit; the pin on the box's east side corresponds to the 2:1 MUX's west-facing pin (which happens to be an output pin); and the pin on the box's south side corresponds to the 2:1 MUX's north-facing pin. The order of the two pins on the box's west side correspond to the same top-down ordering from the subcircuit's design. (If there were several pins on the box's north or south side, they would correspond to the same left-right order in the subcircuit.)

    If the pins in the subcircuit's layout have labels associated with them, then Logisim will display that label in a tip (that is, a temporary text box) when the user hovers the mouse over the corresponding location of the subcircuit component. (If you find these tips irritating, you can disable them via the Preferences window's Layout tab.)

    Several other components will display these tips, too: For some of the pins of a built-in flip-flop, for example, hovering over it explains what that pin does.

    Incidentally, every pin to a circuit must be either an input or an output. Many manufactured chips have pins that behave as an input in some situations and as an output in others; you cannot construct such chips within Logisim (at least, in the current version).

    Logisim will maintain different state information for all subcircuits appearing in a circuit. For example, if a circuit contains a flip-flop, and that circuit is used as a subcircuit several times, then each subcircuit's flip-flop will have its own value when simulating the larger circuit.

    Now that we have the 4-to-1 multiplexer defined, we can now use it in other circuits. Logisim has no limits on how deeply circuits can be nested - though it will object to nesting circuits within themselves!

    Note: There's nothing wrong with editing a circuit that is being used as a subcircuit; in fact, this is quite common. Be aware, though, that any changes to a circuit's pins (adding, deleting, or moving them) will rearrange them also in the containing circuit. Thus, if you change any pins in a circuit, you will also need to edit any circuits using it as a subcircuit.

    Next: Editing subcircuit appearance.

    logisim-2.7.1/doc/es/html/guide/subcirc/library.html0000644000175000017500000000314111541757134022272 0ustar vincentvincent Logisim libraries

    Logisim libraries

    Every Logisim project is automatically a library that can be loaded into other Logisim projects: Just save it into a file and then load the library within another project. All of the circuits defined in the first project will then be available as subcircuits for the second. This feature allows you to reuse common components across projects and to share favorite components with your friends (or students).

    Each project has a designated "main circuit," which can be changed to refer to the current circuit via the Set As Main Circuit option in the Project menu. The only significance of this is that the main circuit is the one that is displayed when you first open the project. The default name of the circuit in a newly created file ("main") has no significance at all, and you can feel free to delete or rename that circuit.

    With a loaded Logisim library, you are allowed to view circuits and manipulate their states, but Logisim will prevent you from altering the circuits' design and other data stored within the file.

    If you want to alter a circuit in a loaded Logisim library, then you need to open it separately within Logisim. As soon as you save it, the other project should automatically load the modified version immediately; but if it does not, you can right-click the library folder in the explorer pane and select Reload Library.

    Next: User's Guide.

    logisim-2.7.1/doc/es/html/guide/subcirc/index.html0000644000175000017500000000233311541757134021737 0ustar vincentvincent Subcircuits

    Subcircuits

    As you build circuits that are more and more sophisticated, you will want to build smaller circuits that you can use multiple times as a module nested within larger circuits. In Logisim, such a smaller circuit that is used in a larger circuit is called a subcircuit.

    If you're familiar with computer programming, you're familiar with the subprogram concept, whether it's called a subroutine, function, method, or procedure in your favored language. The subcircuit concept is analogous to this, and it serves the same purpose: To break a large job into bite-sized pieces, to save the effort of defining the same concept multiple times, and to facilitate debugging.

    Creating circuits
    Using subcircuits
    Editing subcircuit appearance
    Debugging subcircuits
    Logisim libraries

    Next: Creating circuits.

    logisim-2.7.1/doc/es/html/guide/subcirc/debug.html0000644000175000017500000000531011541757134021714 0ustar vincentvincent Debugging subcircuits

    Debugging subcircuits

    As you test larger circuits, you will likely find bugs. To nail down what's going wrong, exploring what's going on in the subcircuits while running the overall circuit can help. To enter the subcircuit's state, you can use any of three different techniques. The most straightforward is probably to view the simulation hierarchy by clicking the second icon in the explorer pane's upper toolbar (), or by selecting "View Simulation Tree" from the Project menu. This switches the explorer pane so that it shows the hierarchy of subcircuits being simulated.

    Double-clicking an element in this hierarchy will display what is happening inside that subcircuit.

    The second way you can enter a subcircuit is to bring up its popup menu by right-clicking or control-clicking it, and then choosing the View option.

    And the third way is to first ensure the Poke Tool is selected and then click the subcircuit you want to enter; a magnifying glass will appear over the subcircuit's center, and double-clicking the magnifying glass will enter the subcircuit's state.

    In any case, once you enter the subcircuit, you'll see that the pins' values in the subcircuit match the values being sent through them from the containing circuit.

    While in the subcircuit, you are allowed to alter the circuit. If the changes affect any of the subcircuit's outputs, they are propagated into the containing circuit. One exception: The subcircuit inputs are determined based on the values coming into the circuit from the supercircuit, so it doesn't make sense to toggle those values. If you attempt to poke a subcircuit's input, a dialog will pop up asking, The pin is tied to the supercircuit state. Create a new circuit state? Clicking No will cancel the toggle request, while clicking Yes will create a copy of the viewed state, divorced from the outer circuit, with the input pin toggled.

    Once you have completed viewing and/or editing, you can return to the parent circuit either by double-clicking the parent circuit in the explorer pane, or via the Go Out To State submenu of the Simulate menu.

    Next: Logisim libraries.

    logisim-2.7.1/doc/es/html/guide/subcirc/creating.html0000644000175000017500000000230111541757134022417 0ustar vincentvincent Creating circuits

    Creating circuits

    Every Logisim project is actually a library of circuits. In its simplest form, each project has only one circuit (called "main" by default), but it is easy to add more: Select Add Circuit... from the Project menu, and type any name you like for the new circuit you want to create.

    Suppose we want to build a 2-to-1 multiplexer named "2:1 MUX." After adding the circuit, Logisim will look like this.

    In the explorer pane, you can now see that the project now contains two circuits, "main", and "2:1 MUX." Logisim draws a magnifying glass over the icon of the circuit currently being viewed; the current circuit name also appears in the window's title bar.

    After editing the circuit to appear like a 2:1 multiplexer, we might end up with the following circuit.

    Next: Using subcircuits.

    logisim-2.7.1/doc/es/html/guide/subcirc/appear.html0000644000175000017500000001655611541757134022114 0ustar vincentvincent Editing subcircuit appearance

    Editing subcircuit appearance

    Default appearance

    By default, when a subcircuit is placed within a larger circuit, it is drawn as a rectangle with a notch indicating the north end of the subcircuit's layout. Pins will be placed on the rectangle's border based on their facing: Pins that face east in the layout (and typically appear on the west side of the layout) will be placed on the rectangle's west side, according to their top-down ordering in the layout. Pins that face south in the layout (typically toward the north side of the layout) will be placed on the rectangle's north side, according to the left-to-right ordering in the layout.

    The default rectangle can optionally include some letters that will appear in the middle of the rectangle. To specify this, select the selection tool () and click the background of the circuit's layout. This will show the circuit attributes in the attribute table, including the Shared Label, Shared Label Facing, and Shared Label Font attributes. The value of the Shared Label attribute will be drawn in the rectangle's center; the Shared Label Facing attribute customizes which direction the text is drawn, and of course the Shared Label Font attribute customizes the font used.

    Customized appearance

    The default appearance is very usable, and indeed Logisim existed for many years with no other option. If, however, you prefer that the subcircuit be drawn differently, you can select Edit Circuit Appearance from the Project menu, and Logisim's interface will switch from its regular layout-editing interface to an interface for drawing the circuit's appearance. (You can also click the far-right icon () in the explorer pane's upper toolbar.) Below, we are editing the 2:1 multiplexer's appearance so that it is drawn with the usual trapezoid rather than a rectangle.

    With the appearance for the 2:1 multiplexer drawn as above, the layout for the 4:1 multiplexer would then appear as the following.

    The appearance editor is like a traditional drawing program, but there are a few special symbols for indicating how the drawing works when placed into a circuit's layout. These special symbols cannot be removed.

    • The green circle with a line coming out of it, which we'll call the anchor. There is exactly one anchor in each subcircuit appearance. Each component in a circuit has a single point identifying its location; a user sees this when creating a new component: The mouse click identifies just a single location, and the component is placed relative to that (usually with the primary output at the mouse's location) The anchor identifies the mouse's location relative to the overall drawing when the subcircuit is created.

      The anchor also identifies the appearance's facing, as indicated by the direction the anchor's line points from its circle. When placing the subcircuit into a layout, the user can change the subcircuit's facing; the anchor's facing indicates in which direction the appearance is oriented. In our example, the anchor is facing east, and each instance of the subcircuit in the 4:1 multiplexer is also facing east, so they are all drawn in the same orientation as the 2:1 multiplexer's appearance.

    • The blue circles and squares with dots in them are the subcircuit's ports. There are exactly as many ports as there are input and output pins in the circuit. Ports corresponding to inputs are drawn as squares, while ports corresponding to outputs are drawn as circles. Each port indicates how a wire connecting into the circuit will correspond to an input or output pin within the layout.

      When you select a port, Logisim will indicate the corresponding pin by popping up a miniature diagram of the layout in the window's bottom right corner, with the corresponding pin(s) drawn in blue. This does not happen when all ports are selected.

    The toolbar contains tools for adding additional shapes, as listed below with descriptions of how the shift and alt key modifies the tool behavior. In addition, clicking or dragging the mouse with the control key pressed regularly snaps the mouse position to the nearest grid point.

    Select, move, copy, and paste shapes.
    Add or edit text.
    Create a line segment. Shift-drag keeps the line's angle at a multiple of 45°.
    Create a quadratic Bezier curve. For the first drag, where you specify the curve's endpoints, shift-drag keeps the endpoints at an angle that is a multiple of 45°. Then you click to indicate the control point's location; shift-click ensures the curve is symmetric, while alt-click draws the curve through the control point.
    Create a sequence of connected lines, whose vertices are indicated by a succession of clicks. Shift-clicking ensures that the angle between the previous vertex and the current one is a multiple of 45°. Double-click or press the Enter key to complete the shape.
    Create a rectangle through dragging from one corner to the opposite corner. Shift-drag to create a square, and alt-drag to create the rectangle starting from the center.
    Create a rectangle with rounded corners through dragging from one corner to the opposite corner. Shift-drag to create a square, and alt-drag to create the rectangle starting from the center.
    Create an oval through dragging from one corner of its bounding box to the opposite corner. Shift-drag to create a circle, and alt-drag to create the oval starting from the center.
    Create an arbitrary polygon, whose vertices are indicated by a succession of clicks. Shift-clicking ensures that the vertex is at a 45° angle from the previous one. Double-click, press the Enter key, or click the starting vertex to complete the shape.

    Next: Debugging subcircuits.

    logisim-2.7.1/doc/es/html/guide/prop/0000755000175000017500000000000011541757134017267 5ustar vincentvincentlogisim-2.7.1/doc/es/html/guide/prop/shortcome.html0000644000175000017500000000405211541757134022161 0ustar vincentvincent Shortcomings

    Shortcomings

    Logisim's propagation algorithm is more than sophisticated enough for almost all educational purposes; but it is not sophisticated enough for industrial circuit design. In order from most damning to least damning, the shortcomings of Logisim's propagation technique include:

    • Except for the issue of gate delays, Logisim does not particularly concern itself with timing issues. It is very idealized, so that a pair of NOR gates in an S-R latch configuration will toggle in lockstep infinitely, rather than the circuit eventually settle into a stable state.

    • Logisim cannot simulate subcircuits whose pins sometimes behave as inputs and sometimes behave as outputs. Components built using Java can have such pins, though: Within the built-in libraries, the Memory library's RAM circuit contains a D pin that can act both as an input and as an output.

    • Logisim cuts off its simulation after a fixed number of iterations assuming that there is an oscillation error. Conceivably, a large circuit that does not oscillate could lead to trouble.

    • Logisim does nothing with respect to discriminating between voltage levels: A bit can be only on, off, unspecified, or error.

    • There are additional shortcomings, too, that I have omitted because they are so obscure that if you were aware of them, it would be obvious that Logisim comes nowhere close to that level. As an extreme example, I have a friend who works for a major chip manufacturer, and his job is to worry about "bubbles" in chips' nanometer-wide wires growing and leading to random disconnection.

    • Even beyond this, I am not a circuit design specialist; thus, there may well be errors in the propagation technique of which I am not aware. I welcome corrections from experts.

    Next: User's Guide.

    logisim-2.7.1/doc/es/html/guide/prop/oscillate.html0000644000175000017500000000430011541757134022131 0ustar vincentvincent Oscillation errors

    Oscillation errors

    The propagation algorithm, which normally works silently without any problems, will become very visible when you create a circuit that oscillates.

    This circuit is currently in a stable condition. But if you change the input to 1, the circuit will effectively enter an infinite loop. After a while, Logisim will simply give up and show an "Oscillation apparent" message telling you that it believes that the circuit is oscillating.

    It will display the values it has at the time it gives up. These values will look wrong - in this screen shot, the AND gate is emitting 1 although one of its inputs is 0, but it could be that the NOT gate has a 1 input and a 1 output.

    Logisim helpfully circles in red each location that seems to be involved in the oscillation. If an involved point lies within a subcircuit, Logisim will draw that subcircuit's outline in red.

    When Logisim detects oscillation, it shuts down all further simulation. You can re-enable simulation using the Simulate menu's Simulation Enabled option.

    Logisim detects oscillation using a fairly simple technique: If the circuit simulation seems to many iterations, then it will simply give up and report oscillation. (The points it identifies as being involved are those that were touched in the last 25% of the iterations.) Thus, it could erroneously report oscillation, particularly if you are working with an exceptionally large circuit; but it would be one that is larger than any I have built using Logisim. In any case, if you are confident that the reporting is in error, you can configure the number of iterations completed before oscillation occurs via the Project Options window's Simulation tab.

    Next: Shortcomings.

    logisim-2.7.1/doc/es/html/guide/prop/index.html0000644000175000017500000000137211541757134021267 0ustar vincentvincent Value propagation

    Value propagation

    Logisim's algorithm for simulating the propagation of values through circuits is not something that you normally need to worry about. Suffice it to say that the algorithm is sophisticated enough to account for gate delays, but not realistic enough to account for more difficult phenomena like varying voltages or race conditions.

    Do you still want to know more?

    Gate delays
    Oscillation errors
    Shortcomings

    Next: Gate delays.

    logisim-2.7.1/doc/es/html/guide/prop/delays.html0000644000175000017500000000442511541757134021443 0ustar vincentvincent Gate delays

    Gate delays

    As an example of the level of sophistication of Logisim's algorithm, consider the following circuit.

    This "obviously" always outputs 0. But NOT gates don't react instantaneously to their inputs in reality, and neither do they in Logisim. As a result, when this circuit's input changes from 0 to 1, the AND gate will briefly see two 1 inputs, and it will emit a 1 briefly. You won't see it on the screen. But the effect is observable when we use the AND gate's output as an input into the clock of a D flip-flop.

    Poking the 0 input to become 1 leads to an instantaneous 1 going into the D flip-flop, and thus the flip-flop's value will toggle every time the circuit input goes from 0 to 1.

    Every component has a delay associated with it. More sophisticated components built into Logisim tend to have larger delays, but these delays are somewhat arbitrary and may not reflect reality.

    From a technical point of view, it is relatively easy to deal with this level of sophistication in a single circuit. Dealing with gate delays well across subcircuits, though, is a bit more complex; Logisim does attempt to address this correctly by placing all primitive component's propagation values into a single schedule regardless of the subcircuit in which the component lies.

    (Via the Project Options window's Simulation tab, you can configure Logisim to add a random, occasional delay to a component's propagation. This is intended to simulate the unevenness of real circuits. In particular, an R-S latch built using two NOR gates will oscillate without this randomness, as both gates will process their inputs in lockstep. This randomness is disabled by default.)

    Note that I'm stopping short of saying that Logisim always addresses gate delays well. But at least it tries.

    Next: Oscillation errors.

    logisim-2.7.1/doc/es/html/guide/prefs/0000755000175000017500000000000011541757134017426 5ustar vincentvincentlogisim-2.7.1/doc/es/html/guide/prefs/window.html0000644000175000017500000000266611541757134021635 0ustar vincentvincent The Window tab

    The Window tab

    This tab includes preferences affecting the appearance of the main window used for Logisim.

    • Show tick rate: If checked, then when ticks are enabled, Logisim displays a measurement of the rate at which it has been able to complete ticks. The tick rate is measured by averaging over the previous 1,000 ticks. (Disabling ticks or changing the maximum tick rate will clear its history.)

      This actual tick rate may be much less than the selected tick rate, because Logisim cannot simulate larger circuits at a very fast rate. For example, Logisim's maximum speed for a reasonably large circuit might be 16 Hz; you can select a faster tick rate, but the actual speed will not exceed 16 Hz.

    • Toolbar location: This drop-down menu configures the location of the toolbar within the overall window. The toolbar may be placed on any of the window's four borders, described as north, south, east, and west. It may also be hidden, or it can be placed "down the middle" - that is, to the left of the canvas but to the right of the explorer pane and attribute table.

    Next: The Layout tab.

    logisim-2.7.1/doc/es/html/guide/prefs/template.html0000644000175000017500000000277711541757134022144 0ustar vincentvincent The Template tab

    The Template tab

    A template is a Logisim file that is used as a starting point whenever Logisim creates a new project. Also, if you have an existing Logisim file with a strangely configured environment, you can "reset" the environment using the Revert All To Template button in the window for editing Project Options.

    Although templates are useful in other situations also, they are particularly suited for classroom use, where an instructor might want to distribute a template for students to start from. This is particularly likely if the class uses Logisim heavily, including many of the more advanced features, in which case the simple default configuration may prove too simple. Templates can also be useful in the classroom setting when the instructor opens a file submitted by a student who has configured the environment significantly.

    By default, the "Plain template" option will be selected, using the default template shipped with Logisim. If you want a bare-bones configuration, you might choose "Empty template." But if you want to designate another file to use as the template, select a template via the Select... button, and then choose the "Custom template" option.

    Next: The International tab.

    logisim-2.7.1/doc/es/html/guide/prefs/layout.html0000644000175000017500000000663511541757134021643 0ustar vincentvincent The Layout tab

    The Layout tab

    This tab includes preferences affecting the behavior of the circuit layout editor.

    • Printer view: Specifies whether to display the circuit on the screen in the same way it is displayed through the printer. Normally this is off, and Logisim displays the on-screen circuit with indications of the current circuit state, and it displays some hints about component interface (most notably, it draws legs on OR gates to indicate where they would connect). The printer view, though, omits indications of state, and it omits such interface hints.

    • Show attribute halo: Specifies whether to draw the pale teal oval around the component or tool whose attributes are currently displayed in the attribute table.

    • Show component tips: Specifies whether to display the "tool tips" that will temporarily appear when the mouse hovers over components supporting them. For example, if you hover over a subcircuit component's pin, it will display the label of the corresponding pin within the subcircuit. Hovering over one of the ends of a splitter will tell you the bits to which that end corresponds. In addition, all components in the Plexers, Arithmetic, and Memory libraries will provide information about their inputs and outputs via tips.

    • Keep connections while moving: Indicates whether Logisim should add new wires when components are moved to preserve their connections. By default this is on — though it can be turned off temporarily by pressing the shift key while moving the components. If this box is unchecked, then the default will be not to add wires during a move — though you can turn it on temporarily by pressing the shift key during the move.

    • Show Ghosts while adding: When checked, and when a tool for adding a new component is selected, a light-gray outline of a component to be added is drawn as the mouse moves across the canvas. For example, if you select the AND gate tool and move the mouse into the window (without pressing the mouse's button), a gray outline of an AND gate will display where the AND gate will appear when the mouse is clicked.

    • After adding component: By default, after adding each individual component, Logisim switches back to the Edit Tool to allow you to move components around and to add wires. The drop-down box allows you to change this behavior so that Logisim stays at the same tool for adding more of the same component, until you yourself opt to choose the Edit Tool. (This was Logisim's default behavior prior to Logisim 2.3.0. While more intuitive, this behavior requires more mouse movement to switch between tools.)

    • First radix when wire poked: Configures how values are displayed when a wire is clicked using the Poke Tool. Clicking a wire displays temporarily the value, staying until the user clicks elsewhere in the circuit.

    • Second radix when wire poked: Configures the second part of how wire values are displayed.

    Next: The Experimental tab.

    logisim-2.7.1/doc/es/html/guide/prefs/intl.html0000644000175000017500000000764511541757134021276 0ustar vincentvincent The International tab

    The International tab

    This tab allows configuration of Logisim according to regional preferences.

    • Gate shape: Logisim supports three standards for drawing gates: shaped gates, rectangular gates, and DIN 40700 gates. The following table illustrates the distinction.

      Shaped Rectangular DIN 40700
      AND
      OR

      Because the shaped style tends to be more popular in the U.S., while the rectangular style tends to be more popular in Europe, some people refer to these styles according to these regions; but the region-neutral terms shaped and rectangular are preferred. The DIN 40700 standard was a standard for drafting digital and analog electronic components adopted by DIN, a German standards organization. DIN adopted the rectangular standard for digital components in 1976, but some engineers continue to use the older style; they appear to be increasingly rare.

      Logisim does not follow any standard exactly; it steers a middle ground to allow switching between them. In particular, the shaped gates are more square than the dimensions defined by the relevant IEEE standard. And, although XOR and XNOR gates really ought to be the same width as OR and NOR gates with the rectangular style, they are not because of difficulties compressing the shaped-XOR gate.

    • Language: Change between languages. The current version is supplied with English, Spanish, Russian, and German translations.

      • The German translation was introduced with Logisim 2.6.1 and remains current. It is by Uwe Zimmermann, a faculty member at Uppsala University in Sweden.
      • The Greek translation was introduced with Logisim 2.7.0 and remains current. It is by Thanos Kakarountas, a faculty member at Technological Educational Institute of Ionian Islands in Greece.
      • The Portuguese translation was introduced with Logisim 2.6.2 and remains current. It is by Theldo Cruz Franqueira, a faculty member at Pontifícia Universidade Católica de Minas Gerais in Brazil.
      • The Russian translation was introduced with Logisim 2.4.0 and remains current. It is by Ilia Lilov, from Russia.
      • The Spanish translation was complete as of Logisim 2.1.0, but subsequent Logisim versions have added new options that remain untranslated. It was contributed by Pablo Leal Ramos, from Spain.

      Translations of Logisim into other languages are welcome! If you are interested, contact me, Carl Burch. This will not be a commitment: I will be happy to hear of your interest, and I will tell you whether I know of somebody who is working on it already, prepare a version for you to work with, and send you instructions. The translation process does not require an understanding of Java.

    • Replace accented characters: Some platforms have poor support for characters (such as ñ or ö) that do not appear in the 7-bit ASCII character set. When this is checked, Logisim will replace all instances of the characters with the appropriate equivalent 7-bit ASCII characters. The checkbox is disabled when the current language does not have any equivalents available (as with English).

    Next: The Window tab.

    logisim-2.7.1/doc/es/html/guide/prefs/index.html0000644000175000017500000000233611541757134021427 0ustar vincentvincent Application Preferences

    Application Preferences

    Logisim supports two categories of configuration options: application preferences and project options. The application preferences address preferences that span all open projects, whereas project options are specific to that one project. This section discusses application preferences; project options are described in another section.

    You can view and edit application preferences via the Preferences... option from the File menu (or, under Mac OS, the Logisim menu), a window will appear with several tabs. We will discuss these tabs separately, and then we will see how preferences can be configured from the command line.

    The Template tab
    The International tab
    The Window tab
    The Layout tab
    The Experimental tab
    The command line

    Next: The Template tab.

    logisim-2.7.1/doc/es/html/guide/prefs/exp.html0000644000175000017500000000161411541757134021112 0ustar vincentvincent The Experimental tab

    The Experimental tab

    These preferences enable features that are considered experimental, inserted to garner user feedback.

    • Graphics acceleration: One Logisim user observed that adding -Dsun.java2d.d3d=True to the command line seemed to improve Logisim's graphics performance by telling it to use hardware graphics acceleration. This drop-down box attempts to configure Logisim to set this up; reports about whether this drop-down box has any effect on performance would be welcome. It won't have any effect until Logisim is restarted.

    Next: Command line options.

    logisim-2.7.1/doc/es/html/guide/prefs/cmdline.html0000644000175000017500000000530511541757134021732 0ustar vincentvincent Command-line options

    Command-line options

    You can configure many of Logisim's application preferences via command line options. This can be particularly useful in a laboratory of single-student computers where you want Logisim to start up the same for students every time, regardless of how previous students may have configured the program.

    The overall command-line syntax is as follows.

    java -jar jarFileName [options] [filenames]
    

    The optional additional files named on the command line will be opened as separate windows within Logisim.

    The following example starts Logisim in its basic configuration.

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

    Supported options include the following.

    -plain
    -empty
    -template templateFile

    Configures the template for Logisim to use.

    -gates [shaped|rectangular]

    Configures which type of gate to use.

    -locale localeIdentifier

    Configures which translation to use. As of this writing, the supported locales include:

    deGerman
    enEnglish
    esSpanish
    ruRussian
    elGreek
    -accents [yes|no]

    This is only relevant for languages that use characters outside the 7-bit ASCII character set; this would include languages using accented characters, and it would not include English. If no, characters outside the 7-bit ASCII character set are replaced with equivalents appropriate to the language; this would be useful for Java/OS combinations where such characters are not supported well.

    -clearprops

    Clear all application preferences at startup, so Logisim will act as if it were being executed on the host system for the first time.

    -nosplash

    Hides the initial Logisim splash screen.

    -help

    Displays a summary of the command line options.

    -version

    Displays the Logisim version number.

    Next: User's Guide.

    logisim-2.7.1/doc/es/html/guide/opts/0000755000175000017500000000000011541757134017274 5ustar vincentvincentlogisim-2.7.1/doc/es/html/guide/opts/toolbar.html0000644000175000017500000000260211541757134021624 0ustar vincentvincent The Toolbar tab

    The Toolbar tab

    The Toolbar tab allows you to configure what tools appear in the toolbar.

    The left side is an explorer listing all the tools available, and the list on the right side displays the current contents of the toolbar. (Three dashes "---" indicate a separator, which is drawn as a gray line.) Between the explorer and the list are five buttons and a combo box:

    • Add Tool adds the currently selected tool in the explorer at left to the end of the toolbar.

    • Add Separator adds a separator to the end of the toolbar.

    • Move Up moves the currently selected item of the toolbar up/left one spot.

    • Move Down moves the currently selected item of the toolbar down/right one spot.

    • Remove removes the currently selected item from the toolbar.

    The attributes associated with the tools are not displayed in this window; instead, you can view and edit them within the main drawing window.

    Next: The Mouse tab.

    logisim-2.7.1/doc/es/html/guide/opts/simulate.html0000644000175000017500000000500611541757134022006 0ustar vincentvincent The Simulation tab

    The Simulation tab

    The Simulation tab allows configuration of the algorithm used for simulating circuits. These parameters apply to all circuits being simulated in the same window, even for circuits that exist in other libraries loaded within the project.

    • The Iterations Until Oscillation drop-down menu specifies how long to simulate a circuit before deciding that it is oscillating. The number represents the number of clicks of the internal hidden clock (a simple gate takes just one click). The default of 1,000 is good enough for almost all purposes, even for large circuits. But you may want to increase the number of iterations if you are working with a circuit where Logisim reports false oscillations. This is unlikely to be a problem in practice, but one such a circumstance is a circuit that incorporates many of the below latch circuits with random noise enabled. You may want to decrease the number of iterations if you are working with a circuit that is prone to oscillating and you are using an unusually slow processor.

    • The Gate Output When Undefined drop-down menu configures how the built-in logic gates behave when some inputs are unconnected or are floating. By default, Logisim ignores such inputs, allowing a gate to work over fewer inputs than it was designed for. However, in real life, a gate will behave unpredictably in such a situation, and so this drop-down menu allows one to change the gates so that they treat such disconnected inputs as errors.

    • The Add Noise To Component Delays checkbox allows you to enable or disable the random noise that is added to the delays of components. The internal simulation uses a hidden clock for its simulation, and to provide a somewhat realistic simulation, each component (excluding wires and splitters) has a delay between when it receives an input and when it emits an output. If this option is enabled, Logisim will occassionally (about once every 16 component reactions) make a component take one click longer than normal.

      I recommend keeping this option off, as this technique does introduce rare errors with normal circuits.

    Next: The Toolbar tab.

    logisim-2.7.1/doc/es/html/guide/opts/mouse.html0000644000175000017500000000424611541757134021320 0ustar vincentvincent The Mouse tab

    The Mouse tab

    By default, when you click the mouse in Logisim's drawing area, the currently selected tool will be used. If you right-click or control-click, it will display a pop-up menu for the current component below the mouse.

    Logisim allows you to modify this behavior, relieving you of the need to go to the toolbar and/or the explorer all the time. (This may also be handy if you are left-handed.) Each combination of a mouse button and a modifier key (any subset of shift, control, and alt) can be mapped to a different tool. The Mouse tab allows you to configure these mappings.

    • On the left side is an explorer where you can choose the tool you want to map.

    • On the right top side is a rectangle in which you can click using the mouse combination you want to click. For example, if you want to create new wires by shift-dragging, then you would first select the Wiring Tool in the Explorer (under the Base library); and then you would shift-click where it says "Click Using Combination To Map Wiring Tool." If that combination is already being used, then the mapping would be replaced with the new tool.

    • Below this area is a list of current mappings. Note that any combinations that aren't listed simply use the currently selected tool.

    • Below is the Remove button, where you can delete the mapping that is currently selected in the table above the button. In the future, then, that mouse combination would map to whatever tool is currently selected in the toolbar or the explorer pane.

    • Below this is a list of attributes for the tool currently selected in the list of mappings. Each mouse-mapped tool has its own set of attributes, different from the attributes used in the explorer pane and in the toolbar. You can edit those attribute values here.

    Next: User's Guide.

    logisim-2.7.1/doc/es/html/guide/opts/index.html0000644000175000017500000000246211541757134021275 0ustar vincentvincent Project Options

    Project Options

    Logisim supports two categories of configuration options: application preferences and project options. The application preferences address preferences that span all open projects, whereas project options are specific to that one project. This section discusses project options; application preferences are described in another section.

    You can view and edit project options via the Options... option from the Project menu. It brings up the Options window with several tabs.

    We will discuss each of these tabs separately.

    The Simulation tab
    The Toolbar tab
    The Mouse tab

    At the bottom of the window is the Revert All To Template button. When clicked, all the options and tool attributes change to the settings in the current template (as selected under the application preferences).

    Next: The Simulation tab.

    logisim-2.7.1/doc/es/html/guide/menu/0000755000175000017500000000000011541757134017253 5ustar vincentvincentlogisim-2.7.1/doc/es/html/guide/menu/winhelp.html0000644000175000017500000000335711541757134021617 0ustar vincentvincent The Window and Help menus

    The Window menu

    Minimize

    Minimizes (iconifies) the current window.

    Maximize (Zoom on MacOS)

    Resizes the current window to its preferred size.

    Close

    Closes the current window.

    Combinational Analysis

    Shows the current Combinational Analysis window, without changing any of its contents.

    Preferences

    Shows the Application Preferences window.

    individual window titles

    Brings the respective window to the front.

    The Help menu

    Tutorial

    Opens the help system to the "Beginner's Tutorial" section of the Guide to Being a Logisim User.

    User's Guide

    Opens the help system to the Guide to Being a Logisim User.

    Library Reference

    Opens the help system to the Library Reference.

    About...

    Displays a window containing the version number, mixed among the splash screen graphics. (On MacOS, this menu item is under the Logisim menu.)

    Next: User's Guide.

    logisim-2.7.1/doc/es/html/guide/menu/simulate.html0000644000175000017500000000606311541757134021771 0ustar vincentvincent The Simulate menu

    The Simulate menu

    Simulation Enabled

    If checked, circuits viewed will be "live:" That is, the values propagating through the circuit will be updated with each poke or change to the circuit.

    The menu option will be automatically unchecked if circuit oscillation is detected.

    Reset Simulation

    Clears everything about the current circuit's state, so that it is as if you have just opened the file again. If you are viewing a subcircuit's state, the entire hierarchy is cleared.

    Step Simulation

    Advances the simulation one step forward. For example, a signal may end up entering a gate during one step, but the gate won't show a different signal until the next simulation step. To help identify which points in the overall circuit have changed, any points whose values change are indicated with a blue circle; if a subcircuit contains any points that have changed in it (or its subcircuits, recursively), then it will be drawn with a blue outline.

    Go Out To State

    When you delve into a subcircuit's state via its pop-up menu, the Go Out To State submenu lists the circuits above the currently viewed circuit's state. Selecting one displays the corresponding circuit.

    Go In To State

    If you have delved into a subcircuit's state and then moved back out, this submenu lists the subcircuits below the current circuit. Selecting one of the circuits displays the corresponding circuit.

    Tick Once

    Steps one tick forward into the simulation. This can be useful when you want to step the clocks manually, particularly when the clock is not in the same circuit that you are currently viewing.

    Ticks Enabled

    Starts automatically ticking the clock. This will have an effect only if the circuit contains any clock devices (in the Wiring library). The option is disabled by default.

    Tick Frequency

    Allows you to select how often ticks occur. For example, 8 Hz means that ticks will occur eight times a second. A tick is the base unit of measurement for the speed of clocks.

    Note that the clock cycle speed will be slower than the tick speed: The fastest possible clock will have a one-tick up cycle and a one-tick down cycle; such a clock would have up/down cycle rate of 4 Hz if the ticks occur at 8 Hz.

    Logging...

    Enters the logging module, which facilitates automatically noting and saving values in a circuit as a simulation progresses.

    Next: The Window and Help menus.

    logisim-2.7.1/doc/es/html/guide/menu/project.html0000644000175000017500000001250711541757134021614 0ustar vincentvincent The Project menu

    The Project menu

    Add Circuit...

    Adds a new circuit into the current project. Logisim will insist that you name the new circuit. The name must not match any existing circuits in the project.

    Load Library

    Loads a library into the project. You can load three types of libraries, as explained elsewhere in the User's Guide.

    Unload Libraries...

    Unloads current libraries from the project. Logisim will not permit you to unload any libraries currently being used, including libraries containing components appearing in any project circuits, as well as those with tools that appear in the toolbar or that are mapped to the mouse.

    Move Circuit Up

    Moves the currently displayed circuit one step up the list of circuits within the project, as displayed in the explorer pane.

    Move Circuit Down

    Moves the currently displayed circuit one step down the list of circuits within the project, as displayed in the explorer pane.

    Set As Main Circuit

    Sets the currently displayed circuit to be the project's main circuit. (This menu item will be grayed out if the current circuit is already the project's main circuit.) The only significance of the main circuit is that it is the circuit that first appears when a project file is opened.

    Revert To Default Appearance

    If you've edited the circuit's appearance, this menu item reverts the appearance back to the default rectangle-with-notch appearance. The menu item is enabled only when editing the circuit's appearance.

    View Toolbox

    Changes the explorer pane to displaying a list of the project's circuits and the libraries that have been loaded.

    View Simulation Tree

    Changes the explorer pane to displaying the hierarchy of subcircuits in the current simulation.

    Edit Circuit Layout

    Switches to allow you to edit the layout of components, which determines how the circuit works. This menu item is usually disabled since you will usually be editing the layout anyway.

    Edit Circuit Appearance

    Switches to allow you to edit how the circuit will be represented when it is used as a subcircuit within another circuit. By default, the circuit is represented as a rectangle with a gray notch on its north end, but this menu option allows you to draw a different appearance for the subcircuit.

    Remove Circuit

    Removes the currently displayed circuit from the project. Logisim will prevent you from removing circuits that are used as subcircuits, and it will prevent you from removing the final circuit in a project.

    Analyze Circuit

    Computes a truth table and Boolean expressions corresponding to the current circuit, displaying them in the Combinational Analysis window. The analysis process will only be valid for combinational circuits. A full description of the analysis process is described in the Combinational Analysis section.

    Get Circuit Statistics

    Shows a dialog containing statistics about components used by the currently viewed circuit. The dialog includes a table with five columns:

    • Component: The name of the component.
    • Library: The name of the library from which the component came.
    • Simple: The number of times that component appears directly within the viewed circuit.
    • Unique: The number of times that component appears in the circuit's hierarchy, where each subcircuit within the hierarchy is counted only once.
    • Recursive: The number of times that component appears in the circuit's hierarchy, where we count each subcircuit as many times as it appears in the hierarchy.

    The distinction between Unique and Recursive is easiest to explain by considering the 4:1 multiplexer built using three 2:1 multiplexers as in the Using subcircuits section. The 2:1 multiplexer contains two AND gates (and the 4:1 circuit includes none), so the Unique count of AND gates would be 2; but if you were to build the 4:1 multiplexer using this diagram, you would actually need 2 AND gates for each of the three 2:1 multiplexers, so the Recursive count is 6.

    If you are using circuits from a loaded Logisim library, those components are considered to be black boxes: The contents of the library's circuits are not included in the unique and recursive counts.

    Options...

    Opens the Project Options window.

    Next: The Simulate menu.

    logisim-2.7.1/doc/es/html/guide/menu/index.html0000644000175000017500000000163111541757134021251 0ustar vincentvincent Menu Reference

    Menu Reference

    This section explains the six menus that accompany every major Logisim window.

    The File menu
    The Edit menu
    The Project menu
    The Simulate menu
    The Window and Help menus
    Many menu items relate specifically to a currently opened project. But some Logisim windows (particularly the Combinational Analysis window and the Application Preferences window) are not associated with projects. For these windows, the project-specific menu items will be disabled.

    Next: The File menu.

    logisim-2.7.1/doc/es/html/guide/menu/file.html0000644000175000017500000001021011541757134021052 0ustar vincentvincent The File menu

    The File menu

    New

    Opens a new project in a new window. The project will initially be a copy of the currently selected template.

    Open...

    Opens an existing file as a project in a new window.

    Open Recent

    Opens a recently opened project in a new window without prompting the user to navigate through a file selection dialog.

    Close

    Closes all windows associated with the currently viewed project.

    Save

    Saves the currently viewed project, overwriting what was previously in the file.

    Save As...

    Saves the currently viewed project, prompting the user to save into a different file than before.

    Export Image...

    Creates image file(s) corresponding to circuits. The configuration dialog box is described below.

    Print...

    Sends circuit(s) to a printer. The configuration dialog box is described below.

    Preferences...

    Displays the application preferences window. (On Mac OS systems, this will appear in the Logisim menu.)

    Exit

    Closes all currently open projects and terminates Logisim. (On Mac OS systems, this will appear as Quit in the Logisim menu.)

    Configuring Export

    When you select Export Image..., Logisim displays a dialog box with four options.

    • Circuits: A list where you can select one or more circuits that should be exported into image files. (Empty circuits are not displayed as options.)
    • Image Format: You can create PNG, GIF, and JPEG files. I would recommend PNG files: The GIF format is quite dated, and the JPEG format will introduce artifacts into the image, as the JPEG format is really meant for photographic images.
    • Scale Factor: You can scale the images as they are dumped into image files using this slider.
    • Printer View: Whether to use "printer view" in exporting the circuits.

    After clicking OK, Logisim will display a file selection dialog box. If you have selected one circuit, select the file into which the image should be placed. If you have selected multiple circuits, select a directory where the files should be placed; Logisim will name the images based on the circuits' names (main.png, for example).

    Configuring Print

    When you choose Print..., Logisim displays a dialog box for configuring what is printed.

    • Circuits: A list where you can select one or more circuits to be printed. (Empty circuits are not displayed as options.) Logisim will print one circuit per page. If the circuit is too large for the page, the image will be scaled down to fit.
    • Header: Text that should appear centered at the top of each page. The following substitutions will be made into the text.
      %nName of circuit on page
      %pPage number
      %PTotal page count
      %%A single percent sign ('%')
    • Rotate To Fit: If checked, then Logisim will rotate each circuit by 90 degrees when the circuit is too large to fit onto the page and it does not need to be scaled as small when rotated 90 degrees.
    • Printer View: Whether to use "printer view" in printing the circuits.

    After clicking OK, Logisim will display the standard page setup dialog box before printing the circuits.

    Next: The Edit menu.

    logisim-2.7.1/doc/es/html/guide/menu/edit.html0000644000175000017500000001162511541757134021073 0ustar vincentvincent The Edit menu

    The Edit menu

    Undo XX

    Undoes the most recently completed action affecting how the circuit would be saved in a file. Note that this does not include changes to the circuit state (as with manipulations performed by the Poke Tool).

    Cut

    Removes the currently selected components from the circuit onto Logisim's clipboard.

    Note: Logisim's clipboard is maintained separately from the clipboard for the overall system; as a result, cut/copy/paste will not work across different applications, even including other running copies of Logisim. If, however, you have multiple projects open under the same Logisim process, then you should be able to cut/copy/paste between them.

    Copy

    Copies the currently selected components in the circuit onto Logisim's clipboard. (See the note under the Cut menu item.)

    Paste

    Pastes the components on Logisim's clipboard into the current selection. (See the note under the Cut menu item.)

    When you paste components, they will not immediately be dropped; instead, they will be drawn in light gray. They will not actually be ``dropped'' into the circuit until you either move the selection or change the selection so that the components are no longer in it.

    The reason for this odd behavior is this: To be consistent with its other behavior, Logisim must immediately merge any wires as soon as they are dropped into a circuit; this merging process changes existing wires in the circuit. When you paste wires from the clipboard, however, you may want them to appear in a different location, and the changing inherent in the merging process would be against your wishes.

    Delete

    Removes all components in the current selection from the circuit, without modifying the clipboard.

    Duplicate

    Creates a copy of all components in the current selection. This is like selecting Copy, then Paste, except that Duplicate doesn't modify or use the clipboard.

    Select All

    Selects all components in the current circuit.

    Raise Selection

    This menu item is available only when editing a circuit's appearance. It raises the currently selected object(s) so that it is drawn (or they are drawn) on top of an object that currently overlaps the selection. If the selection is overlapped by several objects, it is raised only to be above the lowest one; select the menu item repeatedly until it is in the order it should be.

    (Determining whether two arbitrary objects overlap is difficult. Logisim uses an algorithm of selecting several random points in each of the two objects and seeing if any point is also in the other object. Sometimes it will fail to detect an overlap if the overlap is small — say, less than 5% of either of the objects.)

    Lower Selection

    This menu item is available only when editing a circuit's appearance. It lowers the currently selected object(s) so that it is drawn (or they are drawn) below an object that the selection currently overlaps. If the selection overlaps several objects, it is lowered only to be below the highest one; select the menu item repeatedly until it is in the order it should be.

    Raise To Top

    Available only when editing a circuit's appearance, this menu item raises the currently selected object(s) to be drawn on top of all other objects. (The anchor and the ports are exceptions — they are always on top.)

    Lower To Bottom

    Available only when editing a circuit's appearance, this menu item lowers the currently selected object(s) so that all other objects are drawn on top of them.

    Add Vertex

    Available only when editing a circuit's appearance and a point has been selected on a line, polyline, or polygon, this menu item inserts a new vertex onto the shape. Previous to insertion, the selected point is drawn as a diamond.

    Remove Vertex

    Available only when editing a circuit's appearance and an existing vertex has been selected on a polyline or polygon, this menu item removes the selected vertex. Previous to deletion, the selected vertex is drawn as a diamond within the square representing the vertex. Logisim will not permit removing a vertex on a polygon with only three vertices or on a polyline with only two vertices.

    Next: The Project menu.

    logisim-2.7.1/doc/es/html/guide/mem/0000755000175000017500000000000011541757134017065 5ustar vincentvincentlogisim-2.7.1/doc/es/html/guide/mem/poke.html0000644000175000017500000000324311541757134020713 0ustar vincentvincent Poking memory

    Poking memory

    You can manipulate the contents of memory using the Poke Tool, but the interface for this is severely limited by space constraints: For more than the simplest editing, you will probably find the integrated hex editor far more convenient.

    Nonetheless, to view and edit values within the circuit, the Poke Tool has two modes of operation: You can edit the address displayed, and you can edit an individual value.

    To edit the address displayed, click outside the display rectangle. Logisim will draw a red rectangle around the top address.

    • Typing hexadecimal digits will change the top address accordingly.

    • Typing the Enter key will scroll down one line.

    • Typing the Backspace key will scroll up one line.

    • Typing the space bar will scroll down one page (four lines).

    To edit a particular value, click the value within the display rectangle. Logisim will draw a red rectangle around that address.

    • Typing hexadecimal digits will change the value at the address currently being edited.

    • Typing the Enter key will move to editing the value just below it in the display (down one line).

    • Typing the Backspace key will move to editing the value at the previous address.

    • Typing the space bar will move to editing the value at the following address.

    Next: Pop-up menus and files.

    logisim-2.7.1/doc/es/html/guide/mem/menu.html0000644000175000017500000000375111541757134020725 0ustar vincentvincent Pop-up menus and files

    Pop-up menus and files

    The pop-up menu for memory includes four options in addition to the options common to all components:

    • Edit Contents: Bring up a hex editor for editing the contents of memory.
    • Clear Contents: Resets all values in memory to 0.
    • Load Image...: Resets all values in memory based on the values found in a file using the format described below.
    • Save Image...: Stores all values in memory into a file using the format described below.

    The file format used for image files is intentionally simple; this permits you to write a program, such as an assembler, that generates memory images that can then be loaded into memory. As an example of this file format, if we had a 256-byte memory whose first five bytes were 2, 3, 0, 20, and -1, and all subsequent values were 0, then the image would be the following text file.

    v2.0 raw
    02
    03
    00
    14
    ff
    

    The first line identifies the file format used (currently, there is only one file format recognized). Subsequent values list the values in hexadecimal, starting from address 0; you can place several such values on the same line. If there are more memory locations than are identified in the file, Logisim will load 0 into the other memory locations.

    The image file can use run-length encoding; for example, rather than list the value 00 sixteen times in a row, the file can include 16*00. Notice than the number of repetitions is written in base 10. Files produced by Logisim will use run-length encoding for runs of at least four values.

    You can place comments into the file by using the '#' symbol: All characters in the line starting from the '#' symbol will be ignored by Logisim.

    Next: Hex editor.

    logisim-2.7.1/doc/es/html/guide/mem/index.html0000644000175000017500000000165611541757134021072 0ustar vincentvincent Memory components

    Memory components

    The RAM and ROM components are two of the more useful components in Logisim's built-in libraries. However, because of the volume of information they can store, they are also two of the most complex components.

    Documentation about how they work within a circuit can be found on the RAM and ROM pages of the Library Reference. This section of the User's Guide explains the interface allowing the user to view and edit memory contents.

    Poking memory
    Pop-up menus and files
    Logisim's integrated hex editor

    Next: Poking memory.

    logisim-2.7.1/doc/es/html/guide/mem/hex.html0000644000175000017500000000277011541757134020545 0ustar vincentvincent Hex editor

    Hex editor

    Logisim includes an integrated hex editor for viewing and editing the contents of memory. To access it, bring up a pop-up menu for the memory component and select Edit Contents.... For ROM components, which have the memory contents as part of the attribute value, you can alternatively access the hex editor by clicking the corresponding attribute value.

    The numbers in italics at left display memory addresses, written in hexadecimal. The other numbers display values starting from that memory address; the hex editor may display four, eight, or sixteen values per line, depending on what fits in the window. To help with counting, each group of four values has a larger space between.

    You can navigate through memory using the scroll bar or using the keyboard (the arrow keys, home, end, page up, and page down). Typing hexadecimal characters will alter the currently selected value.

    You can select a range of values by dragging the mouse, shift-clicking the mouse, or navigating through memory with the keyboard while depressing the shift key. Values may be copied and pasted using the Edit menu; the clipboard can also be transferred into other applications.

    Next: User's Guide.

    logisim-2.7.1/doc/es/html/guide/log/0000755000175000017500000000000011541757134017070 5ustar vincentvincentlogisim-2.7.1/doc/es/html/guide/log/table.html0000644000175000017500000000151411541757134021046 0ustar vincentvincent The Table tab

    The Table tab

    The Table tab displays the current log graphically.

    The table contains a column for each component in the selection. Each row in the table displays a snapshot of the simulation after a propagation of values has completed. Any duplicate rows are not added into the log. Note that only the most recent 400 rows are displayed. Some rows may have empty entries if the corresponding component was not in the selection at the time that the row was computed.

    The displayed table is for review only; it is not interactive.

    Next: The File tab.

    logisim-2.7.1/doc/es/html/guide/log/selection.html0000644000175000017500000000444211541757132021745 0ustar vincentvincent The Selection tab

    The Selection tab

    The Selection tab allows you to select which values should be included in the log. The window below corresponds to the following circuit.



    The tab is divided into three vertical areas. The first (leftmost) is a list of all components in the circuit whose values can be logged. Among the built-in libraries, the following types of components support logging.

    Wiring library: Pin, Probe, and Clock components
    I/O library: Button and LED components
    Memory library: All components except ROM
    For components which have labels associated with them, their names correspond to the labels; other components' names specify their type and their location within the circuit. Any subcircuits will also appear in the list; they cannot be selected for logging, but eligible components within them can be. Note that the RAM component requires you to choose which memory address(es) should be logged; it allows logging only for the first 256 addresses.

    The last (rightmost) vertical area lists those components that have been selected. Also, it indicates the radix (base) in which the component's multi-bit values will be logged; the radix does not have a significant effect on one-bit values.

    The middle column of buttons allows the manipulation of the items within the selection.

    • Add adds the currently selected item(s) on the left side into the selection.
    • Change Radix cycles the radix for the currently selected component in the selection between 2 (binary), 10 (decimal), and 16 (hexadecimal).
    • Move Up moves the currently selected component in the selection forward one spot.
    • Move Down moves the currently selected component in the selection back one spot.
    • Remove removes the currently selected component in the selection.

    Next: The Table tab.

    logisim-2.7.1/doc/es/html/guide/log/index.html0000644000175000017500000000313711541757132021067 0ustar vincentvincent Logging

    Logging

    In testing a large circuit, and for documenting a circuit's behavior, a log of past circuit behavior can be useful. This is the purpose for Logisim's logging module, which allows you to select components whose values should be logged; optionally, you can specify a file into which the log should be placed.

    You can enter the logging module via the Logging... option from the Simulate menu. It brings up a window with three tabs.

    We will discuss each of these tabs separately.

    The Selection tab
    The Table tab
    The File tab

    Each project has only one logging window; when you switch to viewing another circuit within the project, the logging window switches automatically to logging the other circuit instead. That is, it does this unless you are moving up or down within the same simulation, in which case the logging module does not change.

    Note that when the logging module switches to logging another simulation, it will cease any logging into a file. Should you switch back to the simulation again, it will remember the configuration for that simulation, but you will need to re-enable the file logging manually.

    Next: The Selection tab.

    logisim-2.7.1/doc/es/html/guide/log/file.html0000644000175000017500000000423011541757132020672 0ustar vincentvincent The File tab

    The File tab

    The File tab allows you to specify a file into which the log should be placed.

    At the top is an indicator of whether file logging is in progress and a button for enabling or disabling it. (Note that you cannot enable it until a file is selected below.) The button allows you to pause and restart file entry. When you switch in the project window to viewing another simulation, the file logging is automatically halted; if you return to the original one and want logging to continue, you will need to re-enable the file logging manually using the button at top.

    In the middle is an indicator of what file is being logged to. To change it, use the Select... button. On selecting a file, file logging will automatically start. If you select a pre-existing file, Logisim will ask whether you want to overwrite the file or append the new entries onto the end.

    At bottom you can control whether a header line should be placed into the file indicating which items are in the selection. If header lines are added, then a new header line will be placed into the file whenever the selection changes.

    File format

    Entries are placed into the file in tab-delimited format corresponding closely to what appears under the Table tab. (One difference is that any header lines will give the full path to components lying in subcircuits.) The format is intentionally simple so that you can feed it into another program for processing, such as a Python/Perl script or a spreadsheet program.

    So that a script can process the file at the same time as Logisim is running, Logisim will flush the new records onto the disk every 500 ms. Note that Logisim may also intermittently close and later re-open the file during the simulation, particularly if several seconds have elapsed without any new records being added.

    Next: User's Guide.

    logisim-2.7.1/doc/es/html/guide/jar/0000755000175000017500000000000011541757132017061 5ustar vincentvincentlogisim-2.7.1/doc/es/html/guide/jar/simpctr.html0000644000175000017500000001571111541757132021435 0ustar vincentvincent Simple Gray Code Counter

    Simple Gray Code Counter

    Often we want components that aren't exclusively combinational in nature - that is, we want the component to have some memory. There is an important subtlety in defining such components: You can't have the component itself store the state, because an individual component can appear many times in the same circuit. It can't appear directly within a circuit multiple times, but it can appear multiple times if it appears in a subcircuit that is used several times.

    The solution is to create a new class for representing the object's current state, and to associate instances of this with the component through the parent circuit's state. In this example, which implements an edge-triggered 4-bit Gray code counter, we define a CounterData class to represent the counter's state, in addition to the InstanceFactory subclass as illustrated previously. The CounterData object remembers both the counter's current value, as well as the last clock input seen (to detect rising edges).

    CounterData

    package com.cburch.gray;
    
    import com.cburch.logisim.data.BitWidth;
    import com.cburch.logisim.data.Value;
    import com.cburch.logisim.instance.InstanceData;
    import com.cburch.logisim.instance.InstanceState;
    
    /** Represents the state of a counter. */
    class CounterData implements InstanceData, Cloneable {
        /** Retrieves the state associated with this counter in the circuit state,
         * generating the state if necessary.
         */
        public static CounterData get(InstanceState state, BitWidth width) {
            CounterData ret = (CounterData) state.getData();
            if(ret == 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.
                ret = new CounterData(null, Value.createKnown(width, 0));
                state.setData(ret);
            } else if(!ret.value.getBitWidth().equals(width)) {
                ret.value = ret.value.extendWidth(width.getWidth(), Value.FALSE);
            }
            return ret;
        }
    
        /** 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 CounterData(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; }
        }
        
        /** Updates the last clock observed, returning true if triggered. */
        public boolean updateClock(Value value) {
            Value old = lastClock;
            lastClock = value;
            return old == Value.FALSE && value == Value.TRUE;
        }
        
        /** 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;
        }
    }
    

    SimpleCounter

    package com.cburch.gray;
    
    import com.cburch.logisim.data.BitWidth;
    import com.cburch.logisim.data.Bounds;
    import com.cburch.logisim.data.Direction;
    import com.cburch.logisim.instance.InstanceFactory;
    import com.cburch.logisim.instance.InstancePainter;
    import com.cburch.logisim.instance.InstanceState;
    import com.cburch.logisim.instance.Port;
    import com.cburch.logisim.util.GraphicsUtil;
    import com.cburch.logisim.util.StringUtil;
    
    /** Manufactures a simple counter that iterates over the 4-bit Gray Code. This
     * example illustrates how a component can maintain its own internal state. All
     * of the code relevant to state, though, appears in CounterData class. */
    class SimpleGrayCounter extends InstanceFactory {
        private static final BitWidth BIT_WIDTH = BitWidth.create(4);
        
        // Again, notice how we don't have any instance variables related to an
        // individual instance's state. We can't put that here, because only one
        // SimpleGrayCounter object is ever created, and its job is to manage all
        // instances that appear in any circuits.
        
        public SimpleGrayCounter() {
            super("Gray Counter (Simple)");
            setOffsetBounds(Bounds.create(-30, -15, 30, 30));
            setPorts(new Port[] {
                    new Port(-30, 0, Port.INPUT, 1),
                    new Port(  0, 0, Port.OUTPUT, BIT_WIDTH.getWidth()),
            });
        }
    
        public void propagate(InstanceState state) {
            // Here I retrieve the state associated with this component via a helper
            // method. In this case, the state is in a CounterData object, which is
            // also where the helper method is defined. This helper method will end
            // up creating a CounterData object if one doesn't already exist.
            CounterData cur = CounterData.get(state, BIT_WIDTH);
    
            boolean trigger = cur.updateClock(state.getPort(0));
            if(trigger) cur.setValue(GrayIncrementer.nextGray(cur.getValue()));
            state.setPort(1, cur.getValue(), 9);
            
            // (You might be tempted to determine the counter's current value
            // via state.getPort(1). This is erroneous, though, because another
            // component may be pushing a value onto the same point, which would
            // "corrupt" the value found there. We really do need to store the
            // current value in the instance.)
        }
    
        public void paintInstance(InstancePainter painter) {
            painter.drawBounds();
            painter.drawClock(0, Direction.EAST); // draw a triangle on port 0
            painter.drawPort(1); // draw port 1 as just a dot
            
            // Display the current counter value centered within the rectangle.
            // However, if the context says not to show state (as when generating
            // printer output), then skip this.
            if(painter.getShowState()) {
                CounterData state = CounterData.get(painter, BIT_WIDTH);
                Bounds bds = painter.getBounds();
                GraphicsUtil.drawCenteredText(painter.getGraphics(),
                        StringUtil.toHexString(BIT_WIDTH.getWidth(), state.getValue().toIntValue()),
                        bds.getX() + bds.getWidth() / 2,
                        bds.getY() + bds.getHeight() / 2);
            }
        }
    }
    

    Next: Gray Code Counter.

    logisim-2.7.1/doc/es/html/guide/jar/library.html0000644000175000017500000000375711541757132021427 0ustar vincentvincent Library Class

    Library Class

    The access point for the JAR library is a class that extends the Library class. The library's main job is to list the tools that are available through the library; most often, the tools are all tools to add the various components defined - that is, instances of the AddTool class working with different component factories.

    Components

    package com.cburch.gray;
    
    import java.util.Arrays;
    import java.util.List;
    
    import com.cburch.logisim.tools.AddTool;
    import com.cburch.logisim.tools.Library;
    
    /** 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 components; practically speaking, though, you'll most often want
         * to create AddTools for new components that can be added into the circuit.
         */
        private List<AddTool> 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 AddTool[] {
                    new AddTool(new GrayIncrementer()),
                    new AddTool(new SimpleGrayCounter()),
                    new AddTool(new GrayCounter()),
            });
        }
        
        /** Returns the name of the library that the user will see. */ 
        public String getDisplayName() {
            return "Gray Tools";
        }
        
        /** Returns a list of all the tools available in this library. */
        public List<AddTool> getTools() {
            return tools;
        }
    }
    

    Next: Simple Gray Code Counter.

    logisim-2.7.1/doc/es/html/guide/jar/index.html0000644000175000017500000001031611541757132021057 0ustar vincentvincent JAR Libraries

    JAR Libraries

    Using JAR libraries

    Logisim has two types of circuit components: those that are designed within Logisim as combinations of components, and those primitive components that are written in Java. Logisim circuits are easier to design, but they cannot support sophisticated user interaction, and they are relatively inefficient.

    Logisim contains a fairly thorough collection of built-in libraries of Java components, but it can also load additional libraries written by you or others. Once you have downloaded a library, you can import it into your project by right-clicking the project in the explorer pane (the top line) and choosing Load Library > JAR Library.... Then, Logisim will prompt you to select the JAR file. (In some circumstances, you may have to type the starting class name when prompted, which would be provided by the library developer. However, a developer typically configures the JAR library to avoid this (by including a manifest file in the JAR with a Library-Class attribute specifying the main class name).)

    Creating JAR libraries

    The remainder of this section is dedicated to a series of thoroughly commented examples illustrating how to develop Logisim libraries yourself. You should only attempt this if you're an experienced Java programmer. You will find the documentation beyond these examples fairly meager.

    You can download a JAR file that allows these examples to be imported into Logisim via the Logisim Web site's Links section. That JAR file also contains the source code contained in these examples.

    Gray Code Incrementer

    Illustrates the essential components of any component type using a simple example of a component that takes a multibit input and computes the next Gray code value following it.

    Library Class

    Illustrates how to define a library. This is the entry point for any JAR file - the class whose name the user enters when loading the JAR library.

    Simple Gray Code Counter

    Illustrates how to make a component that has internal state, in particular an 8-bit counter that iterates through Gray codes.

    Gray Code Counter

    Demonstrates a complete, fairly sophisticated component with which the user can interact. It implements a Gray code counter where the number of bits remembered is customizable, and where the user can edit the current value by clicking on it with the Poke Tool and typing a value.

    Guidelines
    General information for those developing third-party libraries.

    License

    The code in this example JAR library is released under the MIT license, a more permissive license than the GPL, under which the rest of Logisim is released.

    Copyright (c) 2009, Carl Burch.

    Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

    The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

    Next: Gray Code Incrementer.

    logisim-2.7.1/doc/es/html/guide/jar/incr.html0000644000175000017500000002201511541757132020702 0ustar vincentvincent Gray Code Incrementer

    Gray Code Incrementer

    Each component included in a library is defined by creating a subclass of InstanceFactory found in the com.cburch.logisim.instance package. This subclass has all the code involved

    (Here we're describing the API for the current version of Logisim. You may find some libraries developed for older versions of Logisim, in which components were developed by defining two classes, one extending Component and another extending ComponentFactory. Version 2.3.0 introduced the much simpler InstanceFactory API; the older technique is deprecated.)

    Three Logisim packages define most of the classes relevant to defining component libraries.

    com.cburch.logisim.instance

    Contains classes specifically related to defining components, including the InstanceFactory, InstanceState, InstancePainter, and Instance classes.

    com.cburch.logisim.data

    Contains classes related to data elements associated with components, such as the Bounds class for representing bounding rectangles or the Value class for representing values that can exist on a wire.

    com.cburch.logisim.tools

    Contains classes related to the library definition.

    About Gray codes

    Before we go on, let me briefly describe the Gray code on which these examples are based. It's not really important to understanding how these examples work, so you can safely skip to the code below if you wish - particularly if you already know Gray codes.

    Gray code is a technique (named after Frank Gray) for iterating through n-bit sequences with only one bit changed for each step. As an example, consider the 4-bit Gray code listed below.

    0000
    0001
    0011
    0010
           0110
    0111
    0101
    0100
           1100
    1101
    1111
    1110
           1010
    1011
    1001
    1000

    Each value has the bit underlined that will change for the next value in the sequence. For example, after 0000 comes 0001, in which the final bit has been toggled, so the final bit is underlined.

    Logisim's built-in components don't include anything working with Gray codes. But electronics designers find Gray codes useful sometimes. One particularly notable instance of Gray codes is along the axes in Karnaugh maps.

    GrayIncrementer

    This is a minimal example illustrating the essential elements to defining a component. This particular component is an incrementer, which takes an multibit input and produces the next Gray code following it in sequence.

    package com.cburch.gray;
    
    import com.cburch.logisim.data.Attribute;
    import com.cburch.logisim.data.BitWidth;
    import com.cburch.logisim.data.Bounds;
    import com.cburch.logisim.data.Value;
    import com.cburch.logisim.instance.InstanceFactory;
    import com.cburch.logisim.instance.InstancePainter;
    import com.cburch.logisim.instance.InstanceState;
    import com.cburch.logisim.instance.Port;
    import com.cburch.logisim.instance.StdAttr;
    
    /** This component takes a multibit input and outputs the value that follows it
     * in Gray Code. For instance, given input 0100 the output is 1100. */
    class GrayIncrementer extends InstanceFactory {
        /* Note that there are no instance variables. There is only one instance of
         * this class created, which manages all instances of the component. Any
         * information associated with individual instances should be handled
         * through attributes. For GrayIncrementer, each instance has a "bit width"
         * that it works with, and so we'll have an attribute. */
    
        /** The constructor configures the factory. */
        GrayIncrementer() {
            super("Gray Code Incrementer");
            
            /* This is how we can set up the attributes for GrayIncrementers. In
             * this case, there is just one attribute - the width - whose default
             * is 4. The StdAttr class defines several commonly occurring
             * attributes, including one for "bit width." It's best to use those
             * StdAttr attributes when appropriate: A user can then select several
             * components (even from differing factories) with the same attribute
             * and modify them all at once. */
            setAttributes(new Attribute[] { StdAttr.WIDTH },
                    new Object[] { BitWidth.create(4) });
            
            /* The "offset bounds" is the location of the bounding rectangle
             * relative to the mouse location. Here, we're choosing the component to
             * be 30x30, and we're anchoring it relative to its primary output
             * (as is typical for Logisim), which happens to be in the center of the
             * east edge. Thus, the top left corner of the bounding box is 30 pixels
             * west and 15 pixels north of the mouse location. */
            setOffsetBounds(Bounds.create(-30, -15, 30, 30));
            
            /* The ports are locations where wires can be connected to this
             * component. Each port object says where to find the port relative to
             * the component's anchor location, then whether the port is an
             * input/output/both, and finally the expected bit width for the port.
             * The bit width can be a constant (like 1) or an attribute (as here).
             */
            setPorts(new Port[] {
                    new Port(-30, 0, Port.INPUT, StdAttr.WIDTH),
                    new Port(0, 0, Port.OUTPUT, StdAttr.WIDTH),
                });
        }
    
        /** Computes the current output for this component. This method is invoked
         * any time any of the inputs change their values; it may also be invoked in
         * other circumstances, even if there is no reason to expect it to change
         * anything. */
        public void propagate(InstanceState state) {
            // First we retrieve the value being fed into the input. Note that in
            // the setPorts invocation above, the component's input was included at
            // index 0 in the parameter array, so we use 0 as the parameter below.
            Value in = state.getPort(0);
            
            // Now compute the output. We've farmed this out to a helper method,
            // since the same logic is needed for the library's other components.
            Value out = nextGray(in);
            
            // Finally we propagate the output into the circuit. The first parameter
            // is 1 because in our list of ports (configured by invocation of
            // setPorts above) the output is at index 1. The second parameter is the
            // value we want to send on that port. And the last parameter is its
            // "delay" - the number of steps it will take for the output to update
            // after its input.
            state.setPort(1, out, out.getWidth() + 1);
        }
    
        /** Says how an individual instance should appear on the canvas. */
        public void paintInstance(InstancePainter painter) {
            // As it happens, InstancePainter contains several convenience methods
            // for drawing, and we'll use those here. Frequently, you'd want to
            // retrieve its Graphics object (painter.getGraphics) so you can draw
            // directly onto the canvas.
            painter.drawRectangle(painter.getBounds(), "G+1");
            painter.drawPorts();
        }
        
        /** Computes the next gray value in the sequence after prev. This static
         * method just does some bit twiddling; it doesn't have much to do with
         * Logisim except that it manipulates Value and BitWidth objects. */
        static Value nextGray(Value prev) {
            BitWidth bits = prev.getBitWidth();
            if(!prev.isFullyDefined()) return Value.createError(bits);
            int x = prev.toIntValue();
            int ct = (x >> 16) ^ x; // compute parity of x
            ct = (ct >> 8) ^ ct;
            ct = (ct >> 4) ^ ct;
            ct = (ct >> 2) ^ ct;
            ct = (ct >> 1) ^ ct;
            if((ct & 1) == 0) { // if parity is even, flip 1's bit
                x = x ^ 1;
            } else { // else flip bit just above last 1
                int y = x ^ (x & (x - 1)); // first compute the last 1
                y = (y << 1) & bits.getMask();
                x = (y == 0 ? 0 : x ^ y);
            }
            return Value.createKnown(bits, x);
        }
    }
    

    This example by itself is not enough to create a working JAR file; you must also provide a Library class, as illustrated on the next page.

    Next: Library Class.

    logisim-2.7.1/doc/es/html/guide/jar/guide.html0000644000175000017500000000325711541757132021053 0ustar vincentvincent Guidelines

    Guidelines

    Learning more

    Beyond the sequence of examples provided here, the Logisim source code provides copious additional examples, though they do not always illustrate the same attention to readability and good design.

    For maximum portability to future versions, you should stick as much as possible to the classes in the ...instance, ...data, and ...tools packages. Of course, you may use other packages' APIs, but they are more vulnerable to changes in future versions of Logisim.

    I am generally willing to answer occasional requests for help. And bug reports and suggestions for improvements, of course, are always welcome.

    Distribution

    You are free to distribute any JARs you develop without restriction. The GPL restrictions do apply, however, if portions of your work are derived from portions of Logisim source code (released under the GPL). Deriving from the example code in this section of the User's Guide does not incur such restrictions; these examples are released under the MIT license.

    If you would like to share your library with other Logisim users, I will be happy to provide a link to a hosting Web page or the JAR file itself through the Logisim Web site. If you think your library should be built into the basic Logisim release, then I welcome your suggestion, and I'll be happy to acknowledge your contribution in Logisim releases including the work.

    Next: User's Guide.

    logisim-2.7.1/doc/es/html/guide/jar/counter.html0000644000175000017500000001741711541757132021440 0ustar vincentvincent Gray Code Counter

    Gray Code Counter

    This orientation to the Logisim libraries concludes with a fairly sophisticated Gray code counter that allows the user to alter its current value using the Poke Tool and to place a label on the component using the Text Tool. It also customizes the icon that appears in the explorer, associated with the tool.

    GrayCounter

    package com.cburch.gray;
    
    import java.net.URL;
    
    import javax.swing.ImageIcon;
    
    import com.cburch.logisim.data.Attribute;
    import com.cburch.logisim.data.BitWidth;
    import com.cburch.logisim.data.Bounds;
    import com.cburch.logisim.data.Direction;
    import com.cburch.logisim.instance.Instance;
    import com.cburch.logisim.instance.InstanceFactory;
    import com.cburch.logisim.instance.InstancePainter;
    import com.cburch.logisim.instance.InstanceState;
    import com.cburch.logisim.instance.Port;
    import com.cburch.logisim.instance.StdAttr;
    import com.cburch.logisim.util.GraphicsUtil;
    import com.cburch.logisim.util.StringUtil;
    
    /** Manufactures a counter that iterates over Gray codes. This demonstrates
     * several additional features beyond the SimpleGrayCounter class. */
    class GrayCounter extends InstanceFactory {
        public GrayCounter() {
            super("Gray Counter");
            setOffsetBounds(Bounds.create(-30, -15, 30, 30));
            setPorts(new Port[] {
                    new Port(-30, 0, Port.INPUT, 1),
                    new Port(  0, 0, Port.OUTPUT, StdAttr.WIDTH),
            });
            
            // We'll have width, label, and label font attributes. The latter two
            // attributes allow us to associate a label with the component (though
            // we'll also need configureNewInstance to configure the label's
            // location).
            setAttributes(
                    new Attribute[] { StdAttr.WIDTH, StdAttr.LABEL, StdAttr.LABEL_FONT },
                    new Object[] { BitWidth.create(4), "", StdAttr.DEFAULT_LABEL_FONT });
            
            // The following method invocation sets things up so that the instance's
            // state can be manipulated using the Poke Tool.
            setInstancePoker(CounterPoker.class);
            
            // These next two lines set it up so that the explorer window shows a
            // customized icon representing the component type. This should be a
            // 16x16 image.
            URL url = getClass().getClassLoader().getResource("com/cburch/gray/counter.gif");
            if(url != null) setIcon(new ImageIcon(url));
        }
        
        /** The configureNewInstance method is invoked every time a new instance
         * is created. In the superclass, the method doesn't do anything, since
         * the new instance is pretty thoroughly configured already by default. But
         * sometimes you need to do something particular to each instance, so you
         * would override the method. In this case, we need to set up the location
         * for its label. */
        protected void configureNewInstance(Instance instance) {
            Bounds bds = instance.getBounds();
            instance.setTextField(StdAttr.LABEL, StdAttr.LABEL_FONT,
                    bds.getX() + bds.getWidth() / 2, bds.getY() - 3,
                    GraphicsUtil.H_CENTER, GraphicsUtil.V_BASELINE);
        }
    
        public void propagate(InstanceState state) {
            // This is the same as with SimpleGrayCounter, except that we use the
            // StdAttr.WIDTH attribute to determine the bit width to work with.
            BitWidth width = state.getAttributeValue(StdAttr.WIDTH);
            CounterData cur = CounterData.get(state, width);
            boolean trigger = cur.updateClock(state.getPort(0));
            if(trigger) cur.setValue(GrayIncrementer.nextGray(cur.getValue()));
            state.setPort(1, cur.getValue(), 9);
        }
    
        public void paintInstance(InstancePainter painter) {
            // This is essentially the same as with SimpleGrayCounter, except for
            // the invocation of painter.drawLabel to make the label be drawn.
            painter.drawBounds();
            painter.drawClock(0, Direction.EAST);
            painter.drawPort(1);
            painter.drawLabel();
            
            if(painter.getShowState()) {
                BitWidth width = painter.getAttributeValue(StdAttr.WIDTH);
                CounterData state = CounterData.get(painter, width);
                Bounds bds = painter.getBounds();
                GraphicsUtil.drawCenteredText(painter.getGraphics(),
                        StringUtil.toHexString(width.getWidth(), state.getValue().toIntValue()),
                        bds.getX() + bds.getWidth() / 2,
                        bds.getY() + bds.getHeight() / 2);
            }
        }
    }
    

    CounterPoker

    package com.cburch.gray;
    
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.event.KeyEvent;
    import java.awt.event.MouseEvent;
    
    import com.cburch.logisim.data.BitWidth;
    import com.cburch.logisim.data.Bounds;
    import com.cburch.logisim.data.Value;
    import com.cburch.logisim.instance.InstancePainter;
    import com.cburch.logisim.instance.InstancePoker;
    import com.cburch.logisim.instance.InstanceState;
    import com.cburch.logisim.instance.StdAttr;
    
    /** When the user clicks a counter using the Poke Tool, a CounterPoker object
     * is created, and that object will handle all user events. Note that
     * CounterPoker is a class specific to GrayCounter, and that it must be a
     * subclass of InstancePoker in the com.cburch.logisim.instance package. */
    public class CounterPoker extends InstancePoker {
        public CounterPoker() { }
    
        /** Determines whether the location the mouse was pressed should result
         * in initiating a poke. 
         */
        public boolean init(InstanceState state, MouseEvent e) {
            return state.getInstance().getBounds().contains(e.getX(), e.getY());
                // Anywhere in the main rectangle initiates the poke. The user might
                // have clicked within a label, but that will be outside the bounds.
        }
    
        /** Draws an indicator that the caret is being selected. Here, we'll draw
         * a red rectangle around the value. */
        public void paint(InstancePainter painter) {
            Bounds bds = painter.getBounds();
            BitWidth width = painter.getAttributeValue(StdAttr.WIDTH);
            int len = (width.getWidth() + 3) / 4;
    
            Graphics g = painter.getGraphics();
            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(InstanceState state, KeyEvent e) {
            // convert it to a hex digit; if it isn't a hex digit, abort.
            int val = Character.digit(e.getKeyChar(), 16);
            BitWidth width = state.getAttributeValue(StdAttr.WIDTH);
            if(val < 0 || (val & width.getMask()) != val) return;
    
            // compute the next value
            CounterData cur = CounterData.get(state, width);
            int newVal = (cur.getValue().toIntValue() * 16 + val) & width.getMask();
            Value newValue = Value.createKnown(width, newVal);
            cur.setValue(newValue);
            state.fireInvalidated();
            
            // You might be tempted to propagate the value immediately here, using
            // state.setPort. However, the circuit may currently be propagating in
            // another thread, and invoking setPort directly could interfere with
            // that. Using fireInvalidated notifies the propagation thread to
            // invoke propagate on the counter at its next opportunity.
        }
    }
    

    Next: Guidelines.

    logisim-2.7.1/doc/es/html/guide/index.html0000644000175000017500000000453411541757132020310 0ustar vincentvincent The Guide to Being a Logisim User

    The Guide to Being a Logisim User

    Logisim is an educational tool for designing and simulating digital logic circuits. With its simple toolbar interface and simulation of circuits as they are built, it is simple enough to facilitate learning the most basic concepts related to logic circuits. With the capacity to build larger circuits from smaller subcircuits, and to draw bundles of wires with a single mouse drag, Logisim can be used (and is used) to design and simulate entire CPUs for educational purposes.

    Students at colleges and universities around the world use Logisim for a variety of purposes, including:

    • A module in general-education computer science surveys
    • A unit in sophomore-level computer organization courses
    • Over a full semester in upper-division computer architecture courses

    The Guide to Being a Logisim User, which you are reading now, is the official reference for Logisim's features. Its first part is a sequence of sections introducing the major parts of Logisim. These sections are written so that they can be read "cover to cover" to learn about all of the most important features of Logisim.

    Beginner's tutorial
    Libraries and attributes
    Subcircuits
    Wire bundles
    Combinational analysis

    The remaining sections are a motley bunch of reference materials and explanations of some of the lesser corners of Logisim.

    Menu reference
    Memory components
    Logging
    Command-line verification
    Application preferences
    Project options
    Value propagation
    JAR libraries
    About the program
    logisim-2.7.1/doc/es/html/guide/bundles/0000755000175000017500000000000011541757132017741 5ustar vincentvincentlogisim-2.7.1/doc/es/html/guide/bundles/splitting.html0000644000175000017500000000545311541757132022653 0ustar vincentvincent Splitters

    Splitters

    When you work with multi-bit values, you will often want to route different bits in different directions. The Wiring library's splitter tool () allows you to accomplish this.

    For example, suppose we want a circuit that computes the bitwise AND of the two nibbles of its eight-bit input (the upper four bits and the lower four bits). We will have an eight-bit value coming from the input pin, and we want to split that into two four-bit values. In the below circuit, we have used a splitter to accomplish this: The 8-bit input comes into the splitter, which divides the 8 bits into two 4-bit values, which are then fed into the AND gate and from there to the output.

    In this example, the splitter splits an incoming value into multiple outgoing values. But splitters can also work the other way: It can combine multiple values into a single value. In fact, they are non-directional: They can send values one way at one time and another way later, and they can even do both at the same time, as in the below example where a value travels eastward through the two splitters, then is routed back westward through them again, and then back eastward where it finally reaches its output.

    The key to understanding splitters is their attributes. In the following, the term split end refers to one of the multiple wires on one side, while the term combined end refers to the single wire on the other side.

    • The Facing attribute tells where the split ends should be relative to the combined end.
    • The Fan Out attribute specifies how many split ends there are.
    • The Bit Width In attribute specifies the bit width of the combined end.
    • The Bit x attribute says which split end corresponds to bit x of the combined end. If multiple bits correspond to the same split end, then their relative ordering will be the same as in the combined end. Logisim splitters cannot have a bit from the combined end correspond to multiple split ends.

    Note that any change to the Fan Out or Bit Width In attributes will reset all Bit x attributes so that they will distribute the bits of the combined value as evenly as possible among the split ends.

    Next: Wire colors.

    logisim-2.7.1/doc/es/html/guide/bundles/index.html0000644000175000017500000000113511541757132021736 0ustar vincentvincent Wire bundles

    Wire bundles

    In simple Logisim circuits, most wires carry only one bit; but Logisim also allows you to create wires that bundle together multiple bits. The number of bits traveling along a wire is that wire's bit width.

    Creating bundles
    Splitters
    Wire colors

    Next: Creating bundles.

    logisim-2.7.1/doc/es/html/guide/bundles/creating.html0000644000175000017500000000431511541757132022426 0ustar vincentvincent Creating bundles

    Creating bundles

    Every input and output on every component in the circuit has a bit width associated with it. Often the bit width is 1, and there is no way of changing that, but many of Logisim's built-in components include attributes allowing you to customize the bit widths of their inputs and outputs.

    The below screen shot illustrates a simple circuit for finding the bitwise AND of two three-bit inputs. Notice how the three-bit output is the bitwise AND of the two inputs. All components have been customized to deal with three-bit data via its Data Bits attribute; the screen shot shows the AND gate attributes, including the Data Bits attribute of 3.

    All components in Logisim define a bit width for each of input and output. In contrast, a wire's bit width is undefined: Instead, the wire's width adapts to the components to which it is attached. If a wire connects two components demanding different bit widths, Logisim will complain of "Incompatible widths" and indicate the offending locations in orange. In the below, the output pin's Data Bits attribute has been changed to 1, and so Logisim complains that the wire cannot connect a three-bit value to a one-bit value.

    Wires that connect incompatible locations (drawn in orange) do not carry values.

    For single-bit wires, you can see at a glance what value the wire carries because Logisim colors the wire light or dark green depending the value. It does not display values for multi-bit wires: They are simply black. You can, though, probe a wire by clicking it using the poke tool ().

    This probing feature is helpful for debugging circuits using wire bundles.

    Next: Splitters.

    logisim-2.7.1/doc/es/html/guide/bundles/colors.html0000644000175000017500000000414711541757132022136 0ustar vincentvincent Wire colors

    Wire colors

    We are now in a position to summarize the full rainbow of colors that Logisim wires can take on. The following little circuit illustrates all of them at once.

    • Gray: The wire's bit width is unknown. This occurs because the wire is not attached to any components' inputs and outputs. (All inputs and outputs have a defined bit width.)

    • Blue: The wire carries a one-bit value, but nothing is driving a specific value onto the wire. We call this a floating bit; some people call it a high-impedance value. In this example, the component placing a value onto the wire is a three-state pin, so it can emit this floating value.

    • Dark green: The wire is carrying a one-bit 0 value.

    • Bright green: The wire is carrying a one-bit 1 value.

    • Black: The wire is carrying a multi-bit value. Some or all of the bits may not be specified.

    • Red: The wire is carrying an error value. This often arises because a gate cannot determine the proper output, perhaps because it has no inputs. It could also arise because two components are trying to send different values onto the wire; this is what happens in the above example, where one input pin places 0 onto the wire while another places 1 onto the same wire, causing a conflict. Multi-bit wires will turn red when any of the bits carried are error values.

    • Orange: The components attached to the wire do not agree in bit width. An orange wire is effectively "broken": It does not carry values between components. Here, we've attached a two-bit component to a one-bit component, so they are incompatible.

    Next: User's Guide.

    logisim-2.7.1/doc/es/html/guide/attrlib/0000755000175000017500000000000011541757132017746 5ustar vincentvincentlogisim-2.7.1/doc/es/html/guide/attrlib/tool.html0000644000175000017500000000471111541757132021614 0ustar vincentvincent Tool Attributes

    Tool attributes

    Every tool for adding components to a circuit also has a set of attributes, which are imparted to the components created by the tool, although the components' attributes may be changed later without affecting the tool's attributes. When you select a tool, Logisim will change the attribute table to display that tool's attributes.

    For example, suppose we want to create smaller AND gates. Right now, each time we select the AND tool, it creates a large AND gate. But if we edit the Gate Size attribute just after selecting the tool (before placing its AND gate into the circuit), we'll be changing the attributes for the tool, so that future AND gates added using the tool would be narrow instead.

    Now, we can delete the two existing AND gates and add two new AND gates in their place. This time, they will be narrow. (If you chose to reduce the number of inputs to 3, the AND gate would not have vertical extension on the left side. But you'd also have to rewire the circuit so that the wires hit the AND gate's left side.)

    With some tools, the tool's icon reflects some of the attributes' values. One example of this is the Pin tool, whose icon faces the same way as its Facing attribute says.

    The tools in the toolbar each have a separate attribute set from the corresponding tools in the explorer pane. Thus, even though we changed the toolbar's AND tool to create narrow AND gates, the AND tool in the Gates library will still create wide AND gates unless you change its attributes too.

    In fact, the input pin and output pin tools in the default toolbar are both instances of the Wiring library's Pin tool, but the attribute sets are different. The icon for the Pin tool is drawn as a circle or a square depending on the value of its "Output?" attribute.

    Logisim provides a handy shortcut for changing the Facing attribute that controls the direction in which many components face: Typing an arrow key while that tool is selected automatically changes the direction of the component.

    Next: User's Guide.

    logisim-2.7.1/doc/es/html/guide/attrlib/index.html0000644000175000017500000000126011541757132021742 0ustar vincentvincent Libraries and Attributes

    Libraries and Attributes

    In this section, we'll examine how to use the other two major regions of the Logisim window, the explorer pane and the attribute table.

    The explorer pane
    The attribute table
    Tool and component attributes

    Next: The explorer pane.

    logisim-2.7.1/doc/es/html/guide/attrlib/explore.html0000644000175000017500000000754011541757132022320 0ustar vincentvincent The explorer pane

    The explorer pane

    Logisim organizes tools into libraries. They are displayed as folders in the explorer pane; to access a library's components, you have only to double-click the corresponding folder. Below, I have opened the Gates library and selected the NAND tool from it. You can see that Logisim now stands ready to add NAND gates into the circuit.

    If you look through the choices in the Gates library, you'll notice that there was no need for us to develop a XOR circuit earlier: It's built into Logisim.

    When you create a project, it automatically includes several libraries:

    • Wiring: Components that interact directly with wires.
    • Gates: Components that perform simple logic functions.
    • Plexers: More complex combinational components, like multiplexers and decoders.
    • Arithmetic: Components that perform arithmetic.
    • Memory: Components that remember data, like flip-flops, registers, and RAM.
    • I/O: Components that exist for the purpose of interacting with the user.
    • Base: Tools that are integral to using Logisim, though you probably won't need to dig into this library very often.

    Logisim allows you to add more libraries, too, using the Load Library submenu of the Project menu. You can see that Logisim has three categories of libraries.

    • Built-in libraries are libraries that are distributed with Logisim. These are documented in the Library Reference.

    • Logisim libraries are projects built within Logisim and saved to the disk as a Logisim project. You can develop a set of circuits in a single project (as described in the Subcircuits section of this guide) and then use that set of circuits as a library for other projects.

    • JAR libraries are libraries that are developed in Java but not distributed with Logisim. You can download JAR libraries that others have written, or you can write your own as described in the JAR Libraries section of this guide. Developing a JAR library is much more difficult than developing a Logisim library, but the components can be much fancier, including things like attributes and interaction with the user. The built-in libraries (other than Base) were written using the same API as JAR libraries can use, so they aptly demonstrate the range of functionality that the JAR libraries can support.

      Some JAR libraries are distributed without any information about which Java class to start with. When loading such a JAR, Logisim will prompt you to type a class name. This class name should be provided by whoever distributed the JAR file to you.

    To remove a library, choose Unload Library... from the Project menu. Logisim will prevent you from unloading libraries that contain components used in a circuit, that appear in the toolbar, or that are mapped to a mouse button.

    Incidentally, a library technically contains tools, not components. Thus, in the Base library you'll find the Poke Tool (), the Edit Tool (), and other tools that don't correspond directly to individual components. Most libraries, though, contain only tools for adding individual components; all built-in libraries other than the Base library are like this.

    Next: The attribute table.

    logisim-2.7.1/doc/es/html/guide/attrlib/attr.html0000644000175000017500000000436711541757132021620 0ustar vincentvincent The attribute table

    The attribute table

    Many components have attributes, which are properties for configuring how the component behaves or appears. The attribute table is for viewing and displaying a component's attribute values.

    To select which component's attributes you wish to view, click the component using the Edit tool (). (You can also right-click (or control-click) the component and choose Show Attributes from the popup menu. Also, manipulating a component via the Poke tool () or the Text tool () will display that component's attributes.)

    The below screen shot demonstrates what things look like after selecting the upper input of our XOR circuit and scrolling down to view the Label Font attribute.

    To modify an attribute value, click on the value. The interface for modifying the attribute will depend on which attribute you are changing; in the case of the Label Font attribute, a dialog box will appear for selecting the new font; but some attributes (like Label) will allow you to edit the value as a text field, while others (like Label Location) will display a drop-down menu from which to select the value.

    Each component type has a different set of attributes; to learn what they mean, go to the relevant documentation in the Library Reference.

    If you've selected multiple components using the Edit tool, then the attribute table will display attributes that are shared among all the selected components (excluding any wires). If the selected components don't all have the same value for the attribute, then the displayed value will be blank. You can change the value for all selected components' attribute at once by using the attribute table.

    Next: Tool attributes.

    logisim-2.7.1/doc/es/html/guide/analyze/0000755000175000017500000000000011541757132017750 5ustar vincentvincentlogisim-2.7.1/doc/es/html/guide/analyze/table.html0000644000175000017500000000523611541757132021733 0ustar vincentvincent Editing the truth table

    Editing the truth table

    On opening the Combinational Analysis window, you will see that it consists of five tabs.

    This page describes the first three tabs, Inputs, Outputs, and Table. The next page of the guide describes the last two tabs, Expression and Minimized.

    The Inputs and Outputs tabs

    The Inputs tab allows you to view and edit the list of inputs. To add new inputs, type it in the field at the pane's bottom, and click Add. If you want to rename an existing input, select it in the list in the pane's upper left region; then type the name and click Rename.

    To remove an input, select it from the list and click Remove. You can also reorder the inputs (which affects the order of columns in the truth table and in the generated circuit) using the Move Up or Move Down buttons on an input.

    All actions affect the truth table immediately.

    The Outputs tab works in exactly the same way as the Inputs tab, except of course it works with the list of outputs instead.

    The Table tab

    The only item under the Table tab is the current truth table, diagrammed in the conventional order, with inputs constituting the columns on the left and outputs constituting the columns on the right.

    You can edit the current values appearing in the output columns by clicking on the value of interest. The values will cycle through 0, 1, and x (representing a "don't care"). As we'll see on the next page, any don't-care values allow the computation of minimized expressions some flexibility.

    You can also navigate and edit the truth table using the keyboard. And you can copy and paste values using the clipboard. The clipboard can be transferred to any application supporting tab-delimited text (such as a spreadsheet).

    If the truth table is based on an existing circuit, you may see some pink squares in the output columns with "!!" in them. These correspond to errors that occurred while calculating the value for that row - either the circuit seemed to be oscillating, or the output value was an error value (which would be pictured as a red wire in the Logisim circuit). Hovering your mouse over the entry should bring up a tool tip describing which type of error it was. Once you click on the error entry, you will be in the 0-1-x cycle; there is no way to go back.

    Next: Creating expressions.

    logisim-2.7.1/doc/es/html/guide/analyze/open.html0000644000175000017500000001017011541757132021576 0ustar vincentvincent Opening Combinational Analysis

    Opening Combinational Analysis

    The bulk of the Combinational Analysis module is accessed through a single window of that name allowing you to view truth tables and Boolean expressions. This window can be opened in two ways.

    Via the Window menu

    Select Combinational Analysis, and the current Combinational Analysis window will appear. If you haven't viewed the window before, the opened window will represent no circuit at all.

    Only one Combinational Analysis window exists within Logisim, no matter how many projects are open. There is no way to have two different analysis windows open at once.

    Via the Project menu

    From a window for editing circuits, you can also request that Logisim analyze the current circuit by selecting the Analyze Circuit option from the Project menu. Before Logisim opens the window, it will compute Boolean expressions and a truth table corresponding to the circuit and place them there for you to view.

    For the analysis to be successful, each input must be attached to an input pin, and each output must be attached to an output pin. Logisim will only analyze circuits with at most eight of each type, and all should be single-bit pins. Otherwise, you will see an error message and the window will not open.

    In constructing Boolean expressions corresponding to a circuit, Logisim will first attempt to construct a Boolean expressions corresponding exactly to the gates in the circuit. But if the circuit uses some non-gate components (such as a multiplexer), or if the circuit is more than 100 levels deep (unlikely), then it will pop up a dialog box telling you that deriving Boolean expressions was impossible, and Logisim will instead derive the expressions based on the truth table, which will be derived by quietly trying each combination of inputs and reading the resulting outputs.

    After analyzing a circuit, there is no continuing relationship between the circuit and the Combinational Analysis window. That is, changes to the circuit will not be reflected in the window, nor will changes to the Boolean expressions and/or truth table in the window be reflected in the circuit. Of course, you are always free to analyze a circuit again; and, as we will see later, you can replace the circuit with a circuit corresponding to what appears in the Combinational Analysis window.

    Limitations

    Logisim will not attempt to detect sequential circuits: If you tell it to analyze a sequential circuit, it will still create a truth table and corresponding Boolean expressions, although these will not accurately summarize the circuit behavior. (In fact, detecting sequential circuits is provably impossible, as it would amount to solving the Halting Problem. Of course, you might hope that Logisim would make at least some attempt - perhaps look for flip-flops or cycles in the wires - but it does not.) As a result, the Combinational Analysis system should not be used indiscriminately: Only use it when you are indeed sure that the circuit you are analyzing is indeed combinational!

    Logisim will make a change to the original circuit that is perhaps unexpected: The Combinational Analysis system requires that each input and output have a unique name that conforming to the rules for Java identifiers. (Roughly, each character must either a letter or a digit, and the first character must be a letter. No spaces allowed!) It attempts to use the pins' existing labels, and to use a list of defaults if no label exists. If an existing label doesn't follow the Java-identifier rule, then Logisim will attempt to extract a valid name from the label if at all possible.

    Incidentally, the ordering of the inputs in the truth table will match their top-down ordering in the original circuit, with ties being broken in left-right order. (The same applies to the ordering of outputs.)

    Next: Editing the truth table.

    logisim-2.7.1/doc/es/html/guide/analyze/index.html0000644000175000017500000000300511541757132021743 0ustar vincentvincent Combinational analysis

    Combinational analysis

    All circuits fall into one of two well-known categories: In a combinational circuit, all circuit outputs are a strict combination of the current circuit inputs, whereas in a sequential circuit, some outputs may depend on past inputs (the sequence of inputs over time).

    The category of combinational circuits is the simpler of the two. Practitioners use three major techniques for summarizing the behavior of such circuits.

    • logic circuits
    • Boolean expressions, which allow an algebraic representation of how the circuit works
    • truth tables, which list all possible input combinations and the corresponding outputs
    The Combinational Analysis module of Logisim allows you to convert between these three representations in all directions. It is a particularly handy way of creating and understanding circuits with a handful of one-bit inputs and outputs.

    Opening Combinational Analysis
    Editing the truth table
    Creating expressions
    Generating a circuit

    Next: Opening Combinational Analysis.

    logisim-2.7.1/doc/es/html/guide/analyze/gen.html0000644000175000017500000000363611541757132021417 0ustar vincentvincent Generating a circuit

    Generating a circuit

    The Build Circuit button will construct a circuit whose gates correspond to the currently chosen expressions for each output. The circuit's inputs and outputs will be displayed in top-down order corresponding to how they appear under the Inputs and Outputs tabs. Generally speaking, the constructed circuit will be attractive; and, indeed, one application of Logisim's Combinational Analysis module is to beautify poorly drawn circuits. Still, as with any automatic formatting, it will not express the structural details that a human-drawn circuit would.

    When you click the Build Circuit button, a dialog box will appear prompting you to choose which project where you want the circuit and the name you wish to give it.

    If you type the name of an existing circuit, then that circuit will be replaced (after Logisim prompts you to confirm that you really want to do this).

    The Build Circuit dialog includes two options. The Use Two-Input Gates Only option specifies that you want all gates constructed to have two inputs. (NOT gates, of course, constitute an exception to this rule.) The Use NAND Gates Only option specifies that you would like it to translate the circuit into one using only NAND gates. You can select both options if you want to use only two-input NAND gates.

    Logisim cannot construct a NAND-only circuit for an expression containing any XOR operators. This option will therefore be disabled if any outputs' expressions contain XORs.

    Next: User's Guide.

    logisim-2.7.1/doc/es/html/guide/analyze/expr.html0000644000175000017500000001117511541757132021621 0ustar vincentvincent Creating expressions

    Creating expressions

    For each output variable, the Combinational Analysis window maintains two structures - the relevant column of the truth table, and a Boolean expression - specifying how each output relates to its input. You can edit either the truth table or the expression; the other will automatically change as necessary to keep them consistent.

    As we will see on the next page, the Boolean expressions are particularly useful because the Combinational Analysis window will use these when told to build a circuit corresponding to the current state.

    You can view and edit the expressions using the window's last two tabs, the Expression tab and the Minimized tab.

    The Expression tab

    The Expression tab allows you to view and edit the current expression associated with each output variable. You can select the output expression you want to view and edit using the selector labeled "Output:" at the pane's top.

    Just below the selector will appear the expression formatted in a particularly common notation, where an OR is represented as addition, an AND is represented as multiplication, and a NOT is denoted with a bar above the portion affected by the NOT.

    The text pane below this displays the same information in ASCII form. Here, a NOT is represented with a tilde ('~').

    You can edit the expression in the text pane and click the Enter button to make it take effect; doing this will also update the truth table to make it correspond. The Clear button clears the text pane, and the Revert button changes the pane back to representing the current expression.

    Note that your edited expression will be lost if you edit the truth table.

    In addition to multiplication and addition standing for AND and OR, an expression you type may contain any of C/Java logical operators, as well as simply the words themselves.

    highest precedence~ ! ' NOT
    (none) & && AND
    ^ XOR
    lowest precedence+ | || OR

    The following examples are all valid representations of the same expression. You could also mix the operators.

    a' (b + c)
    !a && (b || c)
    NOT a AND (b OR c)

    In general, parentheses within a sequence of ANDs (or ORs or XORs) do not matter. (In particular, when Logisim creates a corresponding circuit, it will ignore such parentheses.)

    The Minimized tab

    The final tab displays a minimized expression corresponding to a column of the truth table. You can select which output's minimized expression you want to view using the selector at top, and you can indicate whether you want to derive a sum-of-products expression or a product-of-sums expression using the selector below.

    If there are four or fewer inputs, a Karnaugh map corresponding to the variable will appear below the selector. You can click the Karnaugh map to change the corresponding truth table values. The Karnaugh map will also display the currently selected terms for the minimized expression as solid semitransparent rounded rectangles.

    Below this is the minimized expression itself, formatted as in the Expression tab's display. If there are more than four inputs, the Karnaugh map will not appear; but the minimized expression will still be computed. (Logisim uses the Quine-McCluskey algorithm to compute the minimized expression. This is equivalent to a Karnaugh map, but it applies to any number of input variables.)

    The Set As Expression button allows you to select the minimized expression as the expression corresponding to the variable. This will generally not be necessary, as edits to the truth table result in using the minimized expression for the changed column; but if you enter an expression through the Expression tab, this can be a convenient way to switch to the corresponding minimized expression.

    Next: Generating a circuit.

    logisim-2.7.1/doc/es/html/guide/about/0000755000175000017500000000000011541757132017417 5ustar vincentvincentlogisim-2.7.1/doc/es/html/guide/about/index.html0000644000175000017500000001165111541757132021420 0ustar vincentvincent About the program

    About the program

    Logisim is open-source software. The source code is included in the src subdirectory of the distributed JAR file.

    If you find Logisim useful, please let me know. Especially do this if you are an educational institution; the information will help me in gaining support for the work.

    I welcome e-mails about Logisim, including bug reports, suggestions, and fixes. When you e-mail me, please remember that I have worked hard to produce Logisim without receiving any payment from you. If you want a right to complain about the software, then I would suggest shelling out the money for a competing program to Logisim. (I know of no open-source competitors that approach Logisim's feature set.) Nonetheless, I remain interested in continuing to improve Logisim, and your suggestions will be most welcome.

    Copyright notice

    Copyright (c) 2005, Carl Burch.

    Logisim is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

    Logisim is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

    Acknowledgements

    The source code to Logisim is primarily my own work; I must acknowledge my employers who fund my work as a professor, including this program: I started the program at Saint John's University (Collegeville, Minnesota, USA) in 2000-2004, and I have continued it at Hendrix College (Conway, Arkansas, USA) from 2004 to present. I am very grateful to these colleges for giving me the time and resources to work on this project. If only all colleges and universities had their act as together and cared as much about excellent teaching as these colleges do!

    Some other people who have been particularly helpful:

    • Theldo Cruz Franqueira, Thanos Kakarountas, Ilia Lilov, Pablo Leal Ramos, and Uwe Zimmermann, who have contributed to translations packaged with Logisim. More information about the translations can be found on International Preferences page.
    • The Spring 2005 CS61C class at the University of California, Berkeley, which endured the beta versions of Logisim 2.0. These students put up with many bugs, and I am very appreciative for their patience and for their suggestions!
    • The Spring 2001 CSCI 150 classes at the College of Saint Benedict and Saint John's University, which used the most rudimentary versions of Logisim as it was being developed.

    Several pieces of Logisim come from others' packages that Logisim uses; several of these pieces are distributed as part of Logisim.

    Sun's Java API (obviously)
    Sun's JavaHelp project
    Provides the integrated help system from the Help menu.
    MRJAdapter, from Steve Roy
    Integration with the Macintosh OS X platform.
    launch4j, from Grzegorz Kowalt
    Allows distribution of Logisim as a Windows executable.
    GIFEncoder, from Adam Doppelt
    Saves images as GIF files. This was itself based on C code written by Sverre H. Huseby.
    ColorPicker, from Jeremy Wood
    Provides the color dialog box that pops up when configuring colors (as with the LED component).
    JFontChooser, from Christos Bohoris
    Provides the font selection dialog box that pops up when selecting font attributes (such as with the Label Font attribute of many components).
    TableSorter, ascribed to Philip Milne, Brendon McLean, Dan van Enckevort, Parwinder Sekhon, and ouroborus@ouroborus.org
    Provides the ability to sort the table in the Get Circuit Statistics dialog through clicking column headers.
    Farm-Fresh Web Icons, http://www.fatcow.com/free-icons
    Provides the icons for controlling simulation that appear under the simulation tree. These icons are released under the Creative Commons Attribution 3.0 License, and they cannot be redistributed under the terms of the GPL.

    And finally, I want to thank all the users who have contacted me - whether with bug reports, with suggestions, or just to let me know that they're using Logisim in their classes. I have to leave these suggesters anonymous, because I don't have their permission to mention them here, but: Thank you!

    logisim-2.7.1/doc/es/html/guide/about/gpl.html0000644000175000017500000003626711541757132021105 0ustar vincentvincent About This Program
    		    GNU GENERAL PUBLIC LICENSE
    		       Version 2, June 1991
    
     Copyright (C) 1989, 1991 Free Software Foundation, Inc.
                           51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
     Everyone is permitted to copy and distribute verbatim copies
     of this license document, but changing it is not allowed.
    
    			    Preamble
    
      The licenses for most software are designed to take away your
    freedom to share and change it.  By contrast, the GNU General Public
    License is intended to guarantee your freedom to share and change free
    software--to make sure the software is free for all its users.  This
    General Public License applies to most of the Free Software
    Foundation's software and to any other program whose authors commit to
    using it.  (Some other Free Software Foundation software is covered by
    the GNU Library General Public License instead.)  You can apply it to
    your programs, too.
    
      When we speak of free software, we are referring to freedom, not
    price.  Our General Public Licenses are designed to make sure that you
    have the freedom to distribute copies of free software (and charge for
    this service if you wish), that you receive source code or can get it
    if you want it, that you can change the software or use pieces of it
    in new free programs; and that you know you can do these things.
    
      To protect your rights, we need to make restrictions that forbid
    anyone to deny you these rights or to ask you to surrender the rights.
    These restrictions translate to certain responsibilities for you if you
    distribute copies of the software, or if you modify it.
    
      For example, if you distribute copies of such a program, whether
    gratis or for a fee, you must give the recipients all the rights that
    you have.  You must make sure that they, too, receive or can get the
    source code.  And you must show them these terms so they know their
    rights.
    
      We protect your rights with two steps: (1) copyright the software, and
    (2) offer you this license which gives you legal permission to copy,
    distribute and/or modify the software.
    
      Also, for each author's protection and ours, we want to make certain
    that everyone understands that there is no warranty for this free
    software.  If the software is modified by someone else and passed on, we
    want its recipients to know that what they have is not the original, so
    that any problems introduced by others will not reflect on the original
    authors' reputations.
    
      Finally, any free program is threatened constantly by software
    patents.  We wish to avoid the danger that redistributors of a free
    program will individually obtain patent licenses, in effect making the
    program proprietary.  To prevent this, we have made it clear that any
    patent must be licensed for everyone's free use or not licensed at all.
    
      The precise terms and conditions for copying, distribution and
    modification follow.
    
    		    GNU GENERAL PUBLIC LICENSE
       TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
    
      0. This License applies to any program or other work which contains
    a notice placed by the copyright holder saying it may be distributed
    under the terms of this General Public License.  The "Program", below,
    refers to any such program or work, and a "work based on the Program"
    means either the Program or any derivative work under copyright law:
    that is to say, a work containing the Program or a portion of it,
    either verbatim or with modifications and/or translated into another
    language.  (Hereinafter, translation is included without limitation in
    the term "modification".)  Each licensee is addressed as "you".
    
    Activities other than copying, distribution and modification are not
    covered by this License; they are outside its scope.  The act of
    running the Program is not restricted, and the output from the Program
    is covered only if its contents constitute a work based on the
    Program (independent of having been made by running the Program).
    Whether that is true depends on what the Program does.
    
      1. You may copy and distribute verbatim copies of the Program's
    source code as you receive it, in any medium, provided that you
    conspicuously and appropriately publish on each copy an appropriate
    copyright notice and disclaimer of warranty; keep intact all the
    notices that refer to this License and to the absence of any warranty;
    and give any other recipients of the Program a copy of this License
    along with the Program.
    
    You may charge a fee for the physical act of transferring a copy, and
    you may at your option offer warranty protection in exchange for a fee.
    
      2. You may modify your copy or copies of the Program or any portion
    of it, thus forming a work based on the Program, and copy and
    distribute such modifications or work under the terms of Section 1
    above, provided that you also meet all of these conditions:
    
        a) You must cause the modified files to carry prominent notices
        stating that you changed the files and the date of any change.
    
        b) You must cause any work that you distribute or publish, that in
        whole or in part contains or is derived from the Program or any
        part thereof, to be licensed as a whole at no charge to all third
        parties under the terms of this License.
    
        c) If the modified program normally reads commands interactively
        when run, you must cause it, when started running for such
        interactive use in the most ordinary way, to print or display an
        announcement including an appropriate copyright notice and a
        notice that there is no warranty (or else, saying that you provide
        a warranty) and that users may redistribute the program under
        these conditions, and telling the user how to view a copy of this
        License.  (Exception: if the Program itself is interactive but
        does not normally print such an announcement, your work based on
        the Program is not required to print an announcement.)
    
    These requirements apply to the modified work as a whole.  If
    identifiable sections of that work are not derived from the Program,
    and can be reasonably considered independent and separate works in
    themselves, then this License, and its terms, do not apply to those
    sections when you distribute them as separate works.  But when you
    distribute the same sections as part of a whole which is a work based
    on the Program, the distribution of the whole must be on the terms of
    this License, whose permissions for other licensees extend to the
    entire whole, and thus to each and every part regardless of who wrote it.
    
    Thus, it is not the intent of this section to claim rights or contest
    your rights to work written entirely by you; rather, the intent is to
    exercise the right to control the distribution of derivative or
    collective works based on the Program.
    
    In addition, mere aggregation of another work not based on the Program
    with the Program (or with a work based on the Program) on a volume of
    a storage or distribution medium does not bring the other work under
    the scope of this License.
    
      3. You may copy and distribute the Program (or a work based on it,
    under Section 2) in object code or executable form under the terms of
    Sections 1 and 2 above provided that you also do one of the following:
    
        a) Accompany it with the complete corresponding machine-readable
        source code, which must be distributed under the terms of Sections
        1 and 2 above on a medium customarily used for software interchange; or,
    
        b) Accompany it with a written offer, valid for at least three
        years, to give any third party, for a charge no more than your
        cost of physically performing source distribution, a complete
        machine-readable copy of the corresponding source code, to be
        distributed under the terms of Sections 1 and 2 above on a medium
        customarily used for software interchange; or,
    
        c) Accompany it with the information you received as to the offer
        to distribute corresponding source code.  (This alternative is
        allowed only for noncommercial distribution and only if you
        received the program in object code or executable form with such
        an offer, in accord with Subsection b above.)
    
    The source code for a work means the preferred form of the work for
    making modifications to it.  For an executable work, complete source
    code means all the source code for all modules it contains, plus any
    associated interface definition files, plus the scripts used to
    control compilation and installation of the executable.  However, as a
    special exception, the source code distributed need not include
    anything that is normally distributed (in either source or binary
    form) with the major components (compiler, kernel, and so on) of the
    operating system on which the executable runs, unless that component
    itself accompanies the executable.
    
    If distribution of executable or object code is made by offering
    access to copy from a designated place, then offering equivalent
    access to copy the source code from the same place counts as
    distribution of the source code, even though third parties are not
    compelled to copy the source along with the object code.
    
      4. You may not copy, modify, sublicense, or distribute the Program
    except as expressly provided under this License.  Any attempt
    otherwise to copy, modify, sublicense or distribute the Program is
    void, and will automatically terminate your rights under this License.
    However, parties who have received copies, or rights, from you under
    this License will not have their licenses terminated so long as such
    parties remain in full compliance.
    
      5. You are not required to accept this License, since you have not
    signed it.  However, nothing else grants you permission to modify or
    distribute the Program or its derivative works.  These actions are
    prohibited by law if you do not accept this License.  Therefore, by
    modifying or distributing the Program (or any work based on the
    Program), you indicate your acceptance of this License to do so, and
    all its terms and conditions for copying, distributing or modifying
    the Program or works based on it.
    
      6. Each time you redistribute the Program (or any work based on the
    Program), the recipient automatically receives a license from the
    original licensor to copy, distribute or modify the Program subject to
    these terms and conditions.  You may not impose any further
    restrictions on the recipients' exercise of the rights granted herein.
    You are not responsible for enforcing compliance by third parties to
    this License.
    
      7. If, as a consequence of a court judgment or allegation of patent
    infringement or for any other reason (not limited to patent issues),
    conditions are imposed on you (whether by court order, agreement or
    otherwise) that contradict the conditions of this License, they do not
    excuse you from the conditions of this License.  If you cannot
    distribute so as to satisfy simultaneously your obligations under this
    License and any other pertinent obligations, then as a consequence you
    may not distribute the Program at all.  For example, if a patent
    license would not permit royalty-free redistribution of the Program by
    all those who receive copies directly or indirectly through you, then
    the only way you could satisfy both it and this License would be to
    refrain entirely from distribution of the Program.
    
    If any portion of this section is held invalid or unenforceable under
    any particular circumstance, the balance of the section is intended to
    apply and the section as a whole is intended to apply in other
    circumstances.
    
    It is not the purpose of this section to induce you to infringe any
    patents or other property right claims or to contest validity of any
    such claims; this section has the sole purpose of protecting the
    integrity of the free software distribution system, which is
    implemented by public license practices.  Many people have made
    generous contributions to the wide range of software distributed
    through that system in reliance on consistent application of that
    system; it is up to the author/donor to decide if he or she is willing
    to distribute software through any other system and a licensee cannot
    impose that choice.
    
    This section is intended to make thoroughly clear what is believed to
    be a consequence of the rest of this License.
    
      8. If the distribution and/or use of the Program is restricted in
    certain countries either by patents or by copyrighted interfaces, the
    original copyright holder who places the Program under this License
    may add an explicit geographical distribution limitation excluding
    those countries, so that distribution is permitted only in or among
    countries not thus excluded.  In such case, this License incorporates
    the limitation as if written in the body of this License.
    
      9. The Free Software Foundation may publish revised and/or new versions
    of the General Public License from time to time.  Such new versions will
    be similar in spirit to the present version, but may differ in detail to
    address new problems or concerns.
    
    Each version is given a distinguishing version number.  If the Program
    specifies a version number of this License which applies to it and "any
    later version", you have the option of following the terms and conditions
    either of that version or of any later version published by the Free
    Software Foundation.  If the Program does not specify a version number of
    this License, you may choose any version ever published by the Free Software
    Foundation.
    
      10. If you wish to incorporate parts of the Program into other free
    programs whose distribution conditions are different, write to the author
    to ask for permission.  For software which is copyrighted by the Free
    Software Foundation, write to the Free Software Foundation; we sometimes
    make exceptions for this.  Our decision will be guided by the two goals
    of preserving the free status of all derivatives of our free software and
    of promoting the sharing and reuse of software generally.
    
    			    NO WARRANTY
    
      11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
    FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
    OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
    PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
    OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
    MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
    TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
    PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
    REPAIR OR CORRECTION.
    
      12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
    WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
    REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
    INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
    OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
    TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
    YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
    PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
    POSSIBILITY OF SUCH DAMAGES.
    
    		     END OF TERMS AND CONDITIONS
    
    logisim-2.7.1/doc/es/html/contents.html0000644000175000017500000001550411541757132017740 0ustar vincentvincent

    Logisim References

    Guide to Being a Logisim User

  • Value propagation
  • JAR libraries
  • About the program
  • Library Reference

    logisim-2.7.1/doc/es/contents.xml0000644000175000017500000002166011541757152016632 0ustar vincentvincent logisim-2.7.1/doc/en/0000755000175000017500000000000011541757152014241 5ustar vincentvincentlogisim-2.7.1/doc/en/img-libs/0000755000175000017500000000000011541757132015742 5ustar vincentvincentlogisim-2.7.1/doc/en/img-libs/xor.png0000644000175000017500000000273511541757132017267 0ustar vincentvincentPNG  IHDR'qex,sRGBPLTE++>\\y**LbKGDH pHYs(`?8QIDATxs6eXܫ;,tB$d2!Wga+ĖΙ=~eؒГ^'`< އI) +Ok@N4ĉkꊃj@W@N$ L/cV19N7R" XNF,O %$˅w9dLO$ZY,WÿȉUFWAb ϷUEՈ5J"3 `jbm5މz5 T$lG,oicU;r*6Eqw|-k4,E}P]| -,QgogDa%oJu$,E|凧jp1]T.U7]{:k#)ʏӍKT颸1\,w(g*͓SLE9j\1NeNbr ` Gq]3Q0ʶk 8zi^&`Gd43f:A.&FO8ݮaQoGX.L"Z\n.rAD.7w`0Ɨ?tsD#ˈ2;R_QWDDQGlDGwqX̃4\^BEo*Hէ] (D:ziiMߕҫ݃=#U}yЮ0tt8W'{95-Gkp&*}KQ'OFT*[+uϫRXPa.eY,qUX'GF94oKYEw>2ktM.eg,r`5B+*%.8.M}r9V_onKYZ&DTqm?X^ "޶h;<# m qk%- +sw \GowXw}\ Giy@$gB0'0NxX.L !S0 !9{IE$2>y_wI7j'z ϐyA j?JWb9@}us$IQK,?97hXDrўQ5r ^(oGlOjQx?mS12bLNh?p{,*##Cdgv{q8)$uF}9bD\KS69v(9>B'?HK`+^N X#ڻvt}+\sP mD1nDԎ$yVODZݴFjHfdqѿ`q'(,Ԩ[()}SҞʉ7yf5LîP5 j5}p!ѯE򼯏'=/u .hg*6*o-S0nu]Jcj@յ!6U#=^08MZqme$!8W޾(g$!8WCDŽuSס7{ 8C/T(˨'¶E۸iIN4eq^EtFkÔH=Kfʬv@AÖl"t sE VYY@+jpҕM@I)bɴt,]DHuq͌X8wP8˛ZӕMġbUلl!EGa?}hبcE]s%ٴ+cqN*!j-'B$L,J#;[wq7,̒[k`S9nxP;TjtgMV\;9).ڝv'TPbNfOч0IENDB`logisim-2.7.1/doc/en/img-libs/tunnel-demo.png0000644000175000017500000000233511541757132020702 0ustar vincentvincentPNG  IHDRVqdsRGB0PLTE4131JEFDgkmj`bzz%NabKGDH pHYs  tIME,`$tEXtCommentCreated with GIMPWIDAThMhA1kA*5 @A&4੐ɥCNКCॄ =UPa9H=X7n:lvRBvgov͛7CK]*З lI 饪0`)NI_fV4+raN9Isy0{. $ɉ)^ H ֲ3< :b$'E!/}=䁉Ӗ e[B #wq `$ 7=ـ+L^#t`<OuU 4&%E=ǡn(9JVK$U]ӳpI(@wgLdkƸC181%Ɯ BIqc`>kYS-qa<֚&0\0?f]b31'`hj9zbb7u ؓ}0Y<˔7#]ՙ5!{cHn͒KpT ^QGJȿ$|1rL/0jLZ!a, ٟyb04[hcrŰRtL͛ʉFqLOPȸl{ѲAh:̊`z\\3ˊwLc["oVEÊt809phJNi2Λr\lo%iX7ɠ:_!ɽnEĴ|=BLS㶛EAӢ.c1e b)i8`Tj"Gh;$>.1v.2&WŔSFџ@ ]cVWvI+4zAy<̉tmVt>|āiI 9:&1sn臨|Ԝ%_7f!^vM+'WK RԂ cͼ0N1&tCd%3>absCH]̮vg+=1X PA Gġޝ3='1  J iI;vF_JQ}>}¤ʾp~>e|]ZUm{~&@ޚ('072a(>m#ot+x-x85C qr<29_ fJeQZ*yo7/aO6æE2 cȡ,͗q\L׳L0zF!ogoD9GQ`Zꑵl1-ۤ îWSژRXb7348Z@6uԣ!fiSV[뇘ȍH.[v<7ȥ?o.r3U]9r%m`iz[ܘ5B FUYzC6|8uuGVoڞuAvp_8WߴIENDB`logisim-2.7.1/doc/en/img-libs/transmis.png0000644000175000017500000000034111541757132020306 0ustar vincentvincentPNG  IHDR,+~*sRGB PLTEd$IMbKGDH pHYs  dIDAT(cX `lLjiags0L|L|X " Hak! UV-`U+ ldqd#kU(dħ"١ >IENDB`logisim-2.7.1/doc/en/img-libs/trans1.png0000644000175000017500000000031311541757132017655 0ustar vincentvincentPNG  IHDR, WEsRGB PLTE((dQ|bKGDH pHYs  KIDATcW$ Eb_;aa@"?؟1_ZV2w}IIG%IIENDB`logisim-2.7.1/doc/en/img-libs/trans0.png0000644000175000017500000000032511541757132017657 0ustar vincentvincentPNG  IHDR, WEsRGB PLTE((dQ|bKGDH pHYs  UIDATc$\~Eٜլ00? 0y$g$${ 񫡡` sCA6X? qז_IENDB`logisim-2.7.1/doc/en/img-libs/subtractor.png0000644000175000017500000000060611541757132020642 0ustar vincentvincentPNG  IHDR,-'sRGBPLTE9=T<>ÿQbKGDH pHYs*b@tIME"IIDAT8˵M 0F#] @5jHVqI4&v%}$J92Wi:ǘtmw8vzRb__bfC{CȄ͵TM1ᄘCe1WnbPô{X {n jQd&!! f[l,{vbޡQҔ٣w[;"x%fNbҷ & ؅'0`f.|ws0?Va>08 cU}D.AEb\rK| 8(IENDB`logisim-2.7.1/doc/en/img-libs/selector.png0000644000175000017500000000061211541757132020267 0ustar vincentvincentPNG  IHDR"!Nd_sRGBPLTE.0-4-VXUŗbKGDH pHYsutIME=IDAT(]0VZwa{n1W˖} 6̼1։H>gtG౑BLXoIhE_9 D%EBB!˭ YN|ŝad7O{$]C#-Ҟ\aݛj1Jȓջ>`C$-jQxʪI\{8TE>ԫ́ohp30CǺXcIENDB`logisim-2.7.1/doc/en/img-libs/rom.png0000644000175000017500000000125411541757132017247 0ustar vincentvincentPNG  IHDRTpsRGB0PLTEx=241&'THJGjli zJEѯx pHYs  tIME Um.IDATXj1=m PX(TBxۀȾV(P^z+=5ٝQ{lTc'&FD=:09$xq)A))lH1 +n[$ G eFvPȑ9H4 +RHQȕ-iBG!k +D@pdǻZN$oW*h*;-rduR2`\ HNd)h5 \%pd$]DZ*RQ #K%‘YR5HEO mWɤ(\7CwD zWqAL8Jkפ`٭j>[Tsji=3-WԠ󓫜HeU*$<[eَE >nN%O$PW'E2 笲 ̽bQN*'>W$3iBY2a!uA<#u3Bi>]UykF(ryqFȋnߛ3xs}a$ }=JPIENDB`logisim-2.7.1/doc/en/img-libs/register.png0000644000175000017500000000066411541757132020302 0ustar vincentvincentPNG  IHDR#+,sRGB0PLTEx=241&'THJGjli zJEѯx pHYs  tIME]` IDAT(Ͻn0 -:'u oӡ:䶋ԁWaxwOp E1P֪clT\RG?S ]VQgh RPtmXgQl٤G!Ǫ<9RI zBx.)g/XHJ1U?A-.UDwhGKw>QN ]U"Uoٓ٦K޲M0 !#k W[7դr;*G([8 ~nnį ss~r_H))SIENDB`logisim-2.7.1/doc/en/img-libs/random.png0000644000175000017500000000061411541757132017731 0ustar vincentvincentPNG  IHDR",cwsRGB0PLTEb;+-*%#Q"[]ZKBI*} pHYs  tIME IDAT(ϭ0O UӼf AցE){L#%mrkW0 ٯ//9xJ!1T#$P3]!Z5ӈB4vI~zoaHPɹ&'imj !ΰJkn!UQN>'&ۆIBrNvhG:Kt?;%LJyYr϶uD;KA~]7'=i}dIENDB`logisim-2.7.1/doc/en/img-libs/ramdemo.png0000644000175000017500000000535411541757132020103 0ustar vincentvincentPNG  IHDRvsRGB0PLTE.0-BP3,<>;HJGbda9w:{{bKGDH pHYs   HIDATxAhFѳm.Ƃ䲧n\|X =eK !=0l!!bPjB@nY%捳00f$-+~H#Qy3C@6Rm!U-TdfX ÷tVI"UVB>BZHO@L2ʪ (WSM~(S,.3keM?Md@>I[}|y ?ÊL_}eĔ|S䏠MakDNa(w YT0\\ٟV%',CT[wJ !q peB~3 Fi<4"J} CʄܑLD|9`XL {lͲYOR61Xwk}(25#(c5Xir82 J|ћ>I\A "#Jwv- HNݴSYx5L4DqX_5vd.-s{8+^uWD[* 0r(=/:rOY8P 8Q֏J(pܼF=qM&]G{%(G[܏B/u@NsW(x\D D`c">`^nrfc%b'K6B(^]dvF(8ʍ~@MsQhhZ: |Eo̞zl[E˴ C M"?"%`2qPOYvBliM Mc2!f Fo"~%ci[0m@.yNɒcUDbmXprs~ D0LpRIա S uwh@K2@PsRmjPsi HsO Hϕ9[Ԯm՛.=rn`m\3_z!46}9 !)PWބS n 8@+ѸL'ǯ>PC&Pfйrͭ:%2CI/;:/NAܖP #\;uvYs+wŢ]D rw`- pv]Y8i[N+>NoI@{bjȢxsk(^8j6hW3ύrXCMh PNL6K/fB qb/@1aX$QڨlÄ2.V 8~Ή='^9j߉o$i@w~7ˍXhZ;=H`063h'6L5mK "a0ĺ7giܘ`8ftU.lIY;5؃&(Zh' b@Հmg ؆` =O6 e]:=л&Tۀ0h,/=ZQzm-vkSR30sWRyߍӇ~fgwp_#_.|MYvra/>|kt@e fB>@ 43@SvtJ>|p `SH9 ;9>3mJNgElg̫*5e}N{җ"&@yډbTܓOw'0#c\& `JMkrr9PF0Kr Rzqos-I7 %Z!Ƥge'V@Q`ˍ:IlD/} =EXob@b&W|̛*]"W15]sJ`BwD<3u POu‰@[8q;kz Q>m rB?P!Dtd-:ͨ eN /a`BFmMv{,}{JBcܦuoJqF#pp$ w_?G&n݁mMիq5@[#i8@!g=u=|O4c~QL!)>+,l-xuHT\ה[3U<0;X(h"=2E1Sf&:NۂfK55f lq1A'+7t gpR3y^'>[Jyi3xD\v'+55fggI>Ke xT=p,dHf^N_`mPWhLJ( ?٤j)rj*+43ml4飝kB gHWh%|I}AvAu^߮XHUʼ=+4v\6oYg鰢Ye^ٽCo9>YdIЪFRȽ HՃc\Tm*[:_`? 򂌍 q;xqEJ MmQVZJ͉CV5; -+M.G`1ɏ=<+{>!~iΕjj|'`V IENDB`logisim-2.7.1/doc/en/img-libs/pull-rect.png0000644000175000017500000000044711541757132020364 0ustar vincentvincentPNG  IHDR(dysRGBPLTEE?A?"h"~}A6GbKGDH pHYs  tIME$3̓tEXtCommentCreated with GIMPWcIDATc(///G `2 2 \! y ea 3QQ 1UQ, 2Ý 1|q'6R\\I~PIENDB`logisim-2.7.1/doc/en/img-libs/probe.png0000644000175000017500000000064311541757132017562 0ustar vincentvincentPNG  IHDR'4<3sRGBPLTEVbKGDH pHYs*b@tIME!?mIDAT8͒=k0/pDA{:t5{tmWEut?''ˁrWVjGS {~6C"Xu;)ndoԛ)!au6%t* 5ZpxǿJXrF K^Uw: k;NA8yV52`%@Z^iuvwW&+IENDB`logisim-2.7.1/doc/en/img-libs/priencod.png0000644000175000017500000000063111541757132020253 0ustar vincentvincentPNG  IHDR,_a8]sRGB0PLTEb;+-*%#Q"[]ZKBI*} pHYs  tIMEWIDATHc# ` kɏ$ Eܐ@{¡؅aC8H}Mxk(VPO"H8KT0/9//pr;0O 3_0Ldxa{/%}<ӒZ Hу<Ŏh_nDGfqPU*{FÙ{`|_IENDB`logisim-2.7.1/doc/en/img-libs/power.png0000644000175000017500000000025411541757132017605 0ustar vincentvincentPNG  IHDRsRGBPLTEVbKGDH pHYs  2IDATe nf4(Fpt'KYȪ2.mH]RBn"AƤCIENDB`logisim-2.7.1/doc/en/img-libs/pin.png0000644000175000017500000000052311541757132017236 0ustar vincentvincentPNG  IHDRe3. PLTEP pHYs*b@IDATxA 1YG(9Ŵ'0/J pHYs)aC$IDAT]10tm##+N`Mm]~~w 񏼀sP j}Q yMG(2h誸V 24=lkMRzdS/#O%U\nwM I ~KXV^KCIENDB`logisim-2.7.1/doc/en/img-libs/not-rect.png0000644000175000017500000000042011541757132020177 0ustar vincentvincentPNG  IHDR"!sRGBPLTE,,YVV_rrrơD> pHYs)aC$IDATu=0Mɿʄ+ +C>G‡õ}4{44#rNQTR% +g'F4q J‹ "JL eI9,ҮD>p(@ڗ6Iuz4 wsDwF IENDB`logisim-2.7.1/doc/en/img-libs/negator.png0000644000175000017500000000037711541757132020116 0ustar vincentvincentPNG  IHDR,+wsRGBPLTE<iIDAT(cpRT&L @a 0*LoaFLaFga ՊN* f agf.140&, Sx4.qi%\ Po78IENDB`logisim-2.7.1/doc/en/img-libs/mux.png0000644000175000017500000000055511541757132017266 0ustar vincentvincentPNG  IHDR,?i7sRGBPLTE((]bKGDH pHYs  IDAT8 0 `@$&A ?SHz('8ZF3rj;paٍ ?ə~<wuv~xl08yxbwΫG J O&~{zs}{>"[ok.|rYܻd1ostYKS~O^}*`USԳh27YV#љA'8rVa:50ţi 9V IENDB`logisim-2.7.1/doc/en/img-libs/multiplier.png0000644000175000017500000000066211541757132020642 0ustar vincentvincentPNG  IHDR,-'sRGBPLTE< R~JcJ+P$]Q-8M'EO&ޟ%ߟfaȑ6|T i9yޜasnUEnܝ  @ RM%y63 yv Wr9IENDB`logisim-2.7.1/doc/en/img-libs/legacy-flipflops.png0000644000175000017500000000070511541757132021712 0ustar vincentvincentPNG  IHDRT!sRGBPLTE B3J?:<CAW8bKGDH pHYs*b@tIME& ~ &IDAT8ˍQj E #BV_S*dI_KsaFp\P$@Q^w=5,juUx+lijTb)TZlϏC]|L9x ۑf@L@ZV{wŪPh RU%-dyxX %DTxT;4+}N<ꋪU+'T)V-}kS @]SnYQ!*6K-e%KSLXYf/qDYIENDB`logisim-2.7.1/doc/en/img-libs/led.png0000644000175000017500000000051511541757132017215 0ustar vincentvincentPNG  IHDReksRGBPLTE<GI6~ k\KbKGDH pHYs&a tIME'/Q~PtEXtCommentCreated with The GIMPd%nIDATU 0 ߕѫ=î*yvK[[#Mª1FM06LXIƪ5{0jl˩P{zn|H;\'PIo;W^P6IENDB`logisim-2.7.1/doc/en/img-libs/label.png0000644000175000017500000000045611541757132017534 0ustar vincentvincentPNG  IHDR; -;sRGBPLTE<`FIENDB`logisim-2.7.1/doc/en/img-libs/keyboard.png0000644000175000017500000000053711541757132020255 0ustar vincentvincentPNG  IHDRfSsRGB3PLTE ^7342O<>;;7higdtRNS@fbKGDH pHYs  tIMEV:IDATX׽0 v̏va(OJ"ى ae@D厺 DSGuԣQUThCP]DŽr8%!QX[hCD96s%"gUv[etP_PWV`,\+poXbIENDB`logisim-2.7.1/doc/en/img-libs/joystick.png0000644000175000017500000000046311541757132020312 0ustar vincentvincentPNG  IHDR!sRGBPLTE .*&VWUq>tRNS@fbKGDH pHYs  tIME %q"IDAT(c`h6V$`aDQFBAB>"E LW9"..("*..("." 5栙\&QApZar|cMD& &YIENDB`logisim-2.7.1/doc/en/img-libs/io-segs.png0000644000175000017500000000050311541757132020014 0ustar vincentvincentPNG  IHDRRp} PLTEaaa pHYs  tIME wIDATHA PoЫ9t٣>G7qU6Aҩi( "~|8+bVJԇiGՁw cAk}^ WAe6}`9"픁Pd&(&241/$;,DA?LH35GIqsp~}}̗]ro pHYs  tIME  ;1)utEXtCommentCreated with GIMPWIDATxz8դbD6PGrmlH0!W4^5rT/GơIl*Im5eL0Uڦ0;Ol, æ`k p& uvkO߱l`6Ml?tBp6QXTo_)AA5ԀBaSM6VUwMg:Ѵð&^69h\tTT6J{I"aXTEz P }ٽW?q0U˦)MP,@*M#[.ߧHEinxe0æ>*t(ǦA﹏[MQǦa쓴DZ)K;o}톛{]T*񘼪q M88LEMѪ֛wwE<LF`2,(*M}MQ,(*Mm8$QȂdC͛G(RqmCb&P'\z\"C4|`TƧ"=J/x)O?޼k_i*ޖzڟwsWYmjTR)DgOJ_1Sx_KNyUc-jzn?ÙDez7)0Y6pw&o/@iZ'+h@X,57*չU4JkN}+zكrMSs bpcS綨/aXT`9ڃaSR~!yH C ˗3sV~93EŲ`q5XpTe SBcQ wm^GEEE##,@*M `ۙ( 5GKTw/bNVXT%w[J:LEJnP,TkK1,`*B Or6VUy *{79ġ@l2{aP3o"o}`rf[)9P,X,<XT%Zl&Il&Il&IIl&Ild,,Ԥ՛mRyE*XM-`N6V[`6=@N"\ߴټդK7C@W&u] LMp#Ѷ7XTCJ|*\cmK 躮eU3JX[BeRm2m'jȂԙީ2:B,XMt*\/ʂ!7oTlGF* ȂJpcg3ϸwOI4,pD 'դ֓HDTzIl<0`~zwbӛ:һw'§7Cqsz<`T&*/t޽&w]=v zB]"i|ޝIw'6 7oj\ XK)n7kdr0U|̯Ta[`ā"^&:-Tz ,R V/aQ-bI*Xm*n|DKmb Չ)뤆+饶*=~^vRDS^rk Pi^jRw*>&)Ġkz77zG켋QK,{ #MgNz1s: VOR8mPJMmEO/? > ~h-]LK%Tz[jJ')6qj*Rmjun7TRTz*uT./22U,`*Oor%Nm2p1 T)|,̻`tU%DjR}zc;ȘzTz/t,I酎X5`d$6Mb_{tT7IENDB`logisim-2.7.1/doc/en/img-libs/flipflops.png0000644000175000017500000000154711541757132020455 0ustar vincentvincentPNG  IHDR+|sRGB0PLTEx=241&'THJGjli zJEѯx pHYs  tIME 7]IDATX1k@\/:t/urMk M)@-SP,=*E'ݓZATzNOҽ{Yζ V>"/^]*rcrD?cd.Ջh&7a,cZK ۤ5c* ;.Mm?[aSnf9>JF^!cپ*qcL 1Cw/24ʫ)?9$f {-LQlAIY XYG~KhZ 1AXJ9gV7;Ư̄S꯮o/ YwB3d-@SOޘ3F 3RޛsTg"T66֘OWMgQG=VTbi8#q}QCTJOig[Ui8<ѮQ:="*]r9bC5>{*CKB].Ո I9ͯJ? BKv%NmKT2ƀp|%#_8Ićƨ/IjCɉ;U\Zz 46λ[ΨR'<QGEQ00=bpgR *$u03«9aq;tvsF@bKGDH pHYs  tIME)|DtEXtCommentCreated with GIMPWIDAT(œn0ρ+,/T+"2x5^?GCU XY ŠW= aCJa{ HX5 lE@+Fk -J*J(!h?jJJq;{3%j" ;Ku&$~H k?nkRrNӝ3%IPݜCoN{@* 9P߲u_l]%OERғUg(`p/g 98IENDB`logisim-2.7.1/doc/en/img-libs/dotmat.png0000644000175000017500000000042111541757132017735 0ustar vincentvincentPNG  IHDR4IsRGBPLTE%F1DD7A?A>Y[X+x- 6ktRNS@fbKGDH pHYs  tIME'FbIDAT8c IA*\QYP) hqKJD)h"Fƨ{9Y%å )%A!%%%AAto (J@ @VIENDB`logisim-2.7.1/doc/en/img-libs/divider.png0000644000175000017500000000063111541757132020076 0ustar vincentvincentPNG  IHDR,-'sRGBPLTE9=T\_ÿlYbKGDH pHYs*b@tIME3xjIDAT8œ]0 G|#x]@=&{%)]o˜Qa嗮#UTxgՠګa{xgkXccƚ5[ɣ@p&\Q ʵe'+vc+X^h.qj*3ق Q"\*o!ΐ Rx?#B$+By/>UlyW=,r FsWjwqw7ucw*aMK\ꤳ+IENDB`logisim-2.7.1/doc/en/img-libs/demux.png0000644000175000017500000000056211541757132017575 0ustar vincentvincentPNG  IHDR,>sRGBPLTE((]bKGDH pHYs  IDAT8 PHd36kUr{~L &A+RL0VlƦWdӷ>+{uP5Ι!4¦imqQ+o꼫|tV쿱!n|~E%M}\mIJm24֜+;אՄG'A?&~ ?jsU#Wl\}^DKegJZ=='N@hsRGBPLTE((]bKGDH pHYs  IDAT8˽ 0P:A h3رmMr"#ȥ*L cpQj;~;gn;d-{S@P8hDn%;c&,enoSg;t.4D hI@OGu =K~bu?s^恛cg~/uN6t`09mta͌C3dWGѝrI2 IENDB`logisim-2.7.1/doc/en/img-libs/counter.png0000644000175000017500000000073211541757132020131 0ustar vincentvincentPNG  IHDR",cwsRGB0PLTEb;+-*%#Q"[]ZKBI*} pHYs  tIME* \b0IDAT(ϭn! :pÉs^&C;ebX)ϑ!czC䧸%ÉG(nUb.$*ղ0|2׶!\#kSPo2m YU IQAVsf,:]_J?2blK>8g'T:}Ŝ NCץVܒAep V\ bBԃi*H#ȧxB3?~ ~'jVymIENDB`logisim-2.7.1/doc/en/img-libs/controlled.png0000644000175000017500000000056111541757132020617 0ustar vincentvincentPNG  IHDRJzsRGBPLTE B9=T)22bKGDH pHYs*b@tIME(IDAT(ϵ0Lځ4h̆A ^K:BPM,؂3K1@ fWXbNJl})BKl,18sRb6a u,>FfdoxG+1qqM,qO3zt#6ʆNkU 42Gԃ6r `3K1P4Ҡ6e}eM,&kgIENDB`logisim-2.7.1/doc/en/img-libs/constant.png0000644000175000017500000000030211541757132020274 0ustar vincentvincentPNG  IHDRwsRGB PLTEBBNTbKGDH pHYs*b@tIME!8\/IDATcXJ09L@0ɀ`,`X$ fi ǔ1Y1IENDB`logisim-2.7.1/doc/en/img-libs/comparator.png0000644000175000017500000000046611541757132020625 0ustar vincentvincentPNG  IHDR,+wsRGBPLTE B+9=T\_k֋bKGDH pHYs*b@tIME)<IDAT(͓!0 E,#b,f> T ^^Ja'05J. QdcK=Ȝ>Cox;;]_N=Jb{p[`n% 2I;f,[2I 1di%+--Spy78{Qpi.BmrgIENDB`logisim-2.7.1/doc/en/img-libs/clock.png0000644000175000017500000000036211541757132017544 0ustar vincentvincentPNG  IHDRɓsRGBPLTE BNB~BbKGDH pHYs*b@tIME6:VIDATcpA$%@4 8G P$18N$+)92ii =``-qP8ŧa:'IuNIENDB`logisim-2.7.1/doc/en/img-libs/button.png0000644000175000017500000000042511541757132017764 0ustar vincentvincentPNG  IHDR_hsRGBPLTE 1%ٵc}bKGDH pHYs&a tIME'귆tEXtCommentCreated with The GIMPd%nMIDATc`r(`E#qّ8pđ8AJ 1,S '4 Rf')c/qRz IENDB`logisim-2.7.1/doc/en/img-libs/buffer.png0000644000175000017500000000041411541757132017720 0ustar vincentvincentPNG  IHDR5VqsRGBPLTEi+ABJe\bKGDH pHYs*b@tIME_5zmIDATM EbGh DL@Pj=[`pp=Tځҥ7l;.R@MZ5V)u`7%f9{Ftk+rIENDB`logisim-2.7.1/doc/en/img-libs/bitfindr.png0000644000175000017500000000054111541757132020251 0ustar vincentvincentPNG  IHDR,+wsRGBPLTE''*%}kmj {}zub|tRNS@fbKGDH pHYs  IDAT(Ͻӻ0:[B F;]abm8D6_;Y@Vz[V6m3|ccv+@ÿqE}bKGDH pHYs*b@tIMElW8IDAT8˭0 gKT?x=o+# rI}7pFnc  UI†ͪK'Xe<~:3wuJ-Hw{oRFX#5m&> zJZtJSBU\i[ 6[K̦ftyIENDB`logisim-2.7.1/doc/en/img-libs/7seg.png0000644000175000017500000000047211541757132017320 0ustar vincentvincentPNG  IHDR*@TsRGB0PLTE(Qm?@~CA}ӿ_nbKGDH pHYs&a tIME&G"IDAT8ce4 !c emR`bD߽C~q' gTB}4{ oS\ⱈcp(y%E$`, $6Q"BȄި+RIENDB`logisim-2.7.1/doc/en/img-guide/0000755000175000017500000000000011541757132016106 5ustar vincentvincentlogisim-2.7.1/doc/en/img-guide/verify-adder-test2.png0000644000175000017500000000211211541757132022230 0ustar vincentvincentPNG  IHDR\P<'sRGBPLTE((db pHYs  IDATh͒ `j<}+UIxWYm5;/qJ@65 zcHD ;H^׻HpΗh749-R!但|I+H`.7Pty x  PIh` %J%fJiS0 !wph_:IRIPO2J}M߬D|;#SpI<]Y7I!X::ѩ@KK"I԰(P QŨI>s\י; JgmLbIo$ǦHAf{Wm+$Z3Lbռ%x$d$xsNsAc/vVEg*7ĤC&f'l=ƮztLO(KxLKp6$bL&= EY+fYI> ԊLw .ct\LmGp-Cmuh@Ib,닇,&MBŲ .ۏtwBfs l:RJl(AkƱ($H40cEۏ$e^2eD~Q%|$ѪRI:+J ɤ/JXY oif+$zTZHH.^bC~V6RIYP3}0_F7xX+!Z~#|ŴhUهNЬ/ikuxmu"-AF*}dz p3"аJLЖ`;Ǽ`|h[n7-),A JeW5M?˖hil" ЬN4'UeD+8mo[?i[z>B65WRoz )4ɻʒ iyP뉜;N3ZKѶ|)te2hk5Bތ]&[tfƀ&ZD)L;金w:PmPM+m8VR\m3=!p#kxZڨhC\2ҨJoDQ )G{ƈvl8Gܚ.) 7Àj㱂v'<#fh6!֠7j~4:[6oJ<\{)B9 rޭ-z@eTq21rIeVhnkimധёE4іtؓܗ|04m_JkhkD(;,IENDB`logisim-2.7.1/doc/en/img-guide/verify-adder-query.png0000644000175000017500000000135111541757132022340 0ustar vincentvincentPNG  IHDRp?sRGBPLTE((d, pHYs  mIDATh]N0 ` Bg^Ƴ?u_66bѨ4h4I]W߰Xq]sy~ۂmv=Кm)Xu6v=`O5)[vI3 EY $, n&\UEK2NOxpv, ;), Gӈ U 6<6\7&83Y]jXfeȆ@~ ja>g O6z,4Mmn,ó2&*t^V2BD QFpʀϗ@UQ#6Zr_RFա}}e>R:-~-M r~TG5~ԲԲ2lм鰍 8>,[* )VPL}Jr5M֠oL\ q'PyaX⠨ذNͲC3,|g3ek+LX7u,QiK6_ɿhѦo}4K7ƕT`ɆtY +*,+|aqM5XbSe&`YQf쭲sqZñ3r$\{qovp*8VzhBk{h>y!^5_wMNމc'>dL'ZP1;(,-}?k=0\.㑃@zbGi#xuH'>O|?K2,ddIENDB`logisim-2.7.1/doc/en/img-guide/tutorial-xor-table.png0000644000175000017500000000203711541757132022354 0ustar vincentvincentPNG  IHDRsRGBPLTE222>>>aaa2bKGDH pHYs  ~tIME#YIDAThS0qmY;+WrEkg+ksy&"" 3v-&$P{m?r kp;#$vqooGo16 zc24"{v$HoLG ? AgZ8dr |߈=4?\[T1 ΥZz!.^OtgSqw3&oD d?| &iOpq w/F'tR⊖g3zd/HbKd򻙗Bfhe.xB-\H5/6$i6nE|X&Co`xwpY͙C 0o 0I9Rԇ۬XlĴ_^r7((nHFj~5NѩbHkac#6|kّw2Wd@2\H"'Ndb5)=OddAZLfc SR|+~$<%#Sd/dodQɰll8ϝOi= lP?N \Fq( u Kq\䶸]32 !Q '֬X.!lMّFIM(vqH5)S-mjTSZ*Rq]Rq]R _ ژx v$L'd+E(DlYI]Ȏ|CrK5igyZ\q5 +D2zR"z\oT-K_H?#ZqܣVSwB0%z#Wi;#%u P,|6ƘLKpR=_=|>MvI7hFR6m"MZ~ %JB gvuu=Ɩ)ϿngLvxkwJW!KiCm@hڌ: (xPVș"m."S_o=JWu}b3ۏ0;j˗sAN#/|Auo1U1u%W@ #Dt҆ ޴Xr䧆#Cҝ)6jѝ3_!GJ yoKlNڹ]$U3VK`$_[Bƈfsub}J O3EFSDf0nleSaآcRZǠN6o5BC "WN1j )FgpwVth1iv軄PU+j؏..*mWEpU1tn΁H9k" Y[ĂcClGPuh̪_V.V_u2l-!ҪӳU+"eW"z3b?) 6IRq" |g׌_'9}$$`5 0/ydX}-w[ϕ~粃A !bf쨉p#Kb:`uzgf求sUN!N8\ZD|?#ZG:|$M&q- qZQ1tJ.JhEBOkY4ԉTBDT=Ӕ7TAX7dcd U-)-0.5S)$;401%37Q 9q5=7^69,Ed6JtX9NOS\=6VX4xNDXJHf}TU8nrgb|Ncno+i`J_mZl&|FDuwtvfvhzúw"qWnh8~otz}~΂nڟe?Nܛ͢ǭPu즰XTؽRɰb׾ָgȅ׌ܫ܃ٌq» pHYs   IDATx흍Cȶ"XUt+U HvnAPHQ|Um7g&dLҤM9b&sfљ8+-$Htvv"LRTJ,TAvUEe!Lu&҇ťG?,OʌU&r+w20ۤ$=ĜW=ǀE 1d}\tiȕOXgKc$+-^J$PҌ~MJI2(""o /q低C`~ߋ/A*"U\=@gE*O{T ع9{{CA|e. }= |8c9 w #i $F>1t(7<|ԛa-TѮz~Qyyi+ed1i產(1iQl,J>hY 6*<"ԹE^zqwE,YtuZ wj';C"8ChzwxdFP!ǜc']m.YbԬ%qC*cHߝceB'9oݷ[M,17bE#?'YSڍ?Շ:qÇ,rzA, 2k3lEu YܷdRO7xk;_̋PF1G;f~Ge{ej0E.-in φPzȭ^ UzEփJOgh/­Q>Vu[~` 8pv~܅p!NCy**YmI9!anF>֕fs@\Xk\@{Qoy(c/0rl `ڭe;v>|[ +1HBy"#W!o^ϔź\K]w=9X6҅FLi}ͿP"6ErLh/=uێB"o컞y a+8 _gpNyKp]2tgCo`1RS)nXO7OySzIv.bր69EԷI= #C'oBWti(<ouͲ6nąȜ"K*r\)SM rE~-0.}QR|׽H6~+cҠ(^,fڄ B7|ypwAܯcw;F>;;f&fg|%EK3%S\A^z9^sAJLM+e@=Z~S+i!fnsA=w*٠ۑ[߾~Ki7Ϋ~fG~kY7N\|Y9- dz.\v4TvPUk sXJZ/J5PZ/=9bFm2(+I@pQUubء5.Z[-h% /u/e:ޚ,<[G u@\#nG^kMv^7C|2V%FAbtՋR؜qKtŗ'NKOoZyu3A5b:eF|9K¤9DmTz3SG׺@ mXϺB aemrһ߄L>/P'NDo<]=ƶ6D^㈭D+[N'm#<qQ=f>id9#s$87+Fo6 ר(f>Pt''C@>7 wc0Q/;!2$]o*r[}ez7jb~ۘf>2ׄa6joqO\C6zFF\ G0Έ_޷WOeu -ݾ2Vn2|CL֖նMO,*_KwDÁk ˺g2(u仄若\֐g{|_ W3imQl[|D.~rjG~xxxԃxݽqtn,dW)l;MM`!s5n}z -/|#9=c ]3/S>;_M{2o'&?isD]-t͔3dfwkn,:BӶڑJ%H'-x`/%6L;Q@qw}τvߢJ,Iz `n{)pz?%zuYZ6C >{Ј/x~f=ݩۤLSމ]HWqw'_lysMM ]v5z5rz?xW>9;ek, fԋRy\Ə~?Pt ݅kY#N>4u)eSj|ogyPrsz?E__E]7\Ċ|ݎDNXp9! ľ'?˕>r6`˻99v؂uE)O 'B7O.=A }G-O%'S9=b} rbXl7 }f( fyqF?=i|KS/Z/ oGNOFp?m(_\f1|݊SX F=!>Xܨ}$E"ȳRZ\yEJ$>(r(I6rb$rհÊ'HM|7biKRgح(5丨Iͩ_"w+F)Z _[u^E}Ig䪛aw J+iY9BX+Gsq?eOR"A27?d;<((I.^}yV g[!Wî]jTW$sWdHM4BiW)_d֬@ 9z YItE>g!N%D+f| r$%'-4 ^U"G(4C^z9-ڝ@w4쒸 A+M~/MӵHu 899s#y2^!2AqYs;r H&IKW#3_-M-ilIZW0  Kfg'/I:7K,g9B(l/o1]$$r\"{=w%EsJ 5CXO!ȗY~vk>[=*`rVr+R/KBAbFh  iyx Mfdm_Vv䊒%y̐li9U"ȱc;;f䃘Dc_`ЄL؇wv*DUX7WGvXFNy]0ZE";j#/iiH~a;YאQ% & ?#_1l>e , Dpd*=?]uEX|Zp"Nm7Jg fAb5?|4rwT\|S%$#7J/͕[U8Y&-r/aPYS!oQ D)b޷Fj`0ԝ;4!'0 !q>F!߰s!Q1AV)N ;KfyW^KZUd3Er 8;Hg1A~|OVa 3U|c3DcC~džYHhV䃂%vNWy0^ЫۅyC |-o䃌RcB[!A|W JU!oiAAbZ9׫/V}ǼO+ּհ7!(\UZ'ESཱུ!sGC>Zȃߘ"X<^1r 7[AHB\qaC~3'[W,9:zyLZRo7ss5Vٷ6m3@\:9j.lwaa;ɲqmAȹ--Gnٶ6l&PV<-ǴF\WrAx'r$!z|Cw݈ }]|{߄]]1-WGkB^g-+r  yð}r<8rHD^䱪K9y$rGLWsm= y6Hy~9y7׵xu I-o-*iyyy7]HR<q 0F}X؇4Owяl#g\p_LD=h/z ^"ȏ#D-reTݑȏ0GG|5$rm*8G:rSW?j㮌D9ocȗu {НMZ~|kky-b¡An^w}+\bE-rW^Jl(W}ߜ?ڏըG}#?&ȱwվao;/7"ZM9 #c7# 6#W^;4yym_a.FՋȵlوF^{tA:sUuh`|_"ycjg.miEvR>Ӵy nS-\H_ sYхrE7[3C[#s/+ <0R֦~E"D N)ka|`xhǯ_J %\D4K];9i 9kA."ȹ#"i5<94|3wtnmIkD~^\XBY6 lIR UҠ:K䑹,hY&jAVTh\y5FT -<(s9/Lq8ydE{ y2e / W5 5jC^>hC1lPXT}:6 `#YCjnt K,Z Y/o Ϭ\ߌ5&䶫1"7*+"wXLpܗ˵\nH< }Sjhyl0 [7emRߠZ!10F N-i7fyyZ[{)JZ.8w Bf?CezfWbF}m(Z" ]_E oɑc>_uOΰxjB5S](7Ÿ*/{B.HE˥jf^)LI ror`kpG^w#@h3Ur.\i[zT?ªDds2!PވA'놜}w|drZ>Es{ejTGoq z%:W(b? ^NK`-c("-l]G;yݵVqJL%C^N]125^!oSZm޷yw^p:L{pC H䘹Dn$r\"ouKy["Q[L=^WF,KD.X^>ȷ - tZ'UKr~Z90fkC> l/ۢ^nD.% rg7u~D ȡ$ぜ]gK!!;qEݯ)e%PGI5-2BbCњH)[)Fe\1<>F\뢶: tB,arMɫ}FmSi7vWfB,bx\*r(%v2ϡbtXLe 3$fD7ju)tB,(|Oߛ5&̒țUČk_WWmbct#/KDXVODm Ց<y#=1\"o:}@oR˥KVD.j$=/C <}ߨRА4bEMnWe^. #fT#r @n #n"IOWrϧ3Ya}߈aNq<RoluHuDn}b}!RgIwzHmY$ y!" yD^n cPe`G^&#y4R`o|*+lV~`i^C2_i-((E~m9bx竧|`)><M;?Rज़SF /r@2Lx%yɦ++ŠTNi7}#OyGaC>?x"gѰ_֑WpΒBLw;UlةcfqrYCˣPIJ%fBN]y2hiH ] +_jkk?t{İM76VIsp ;W [-|s?rCDoXVi!.VHݵ^^L ۬q;B9zFqIW/w(oF,[6 +7as`0jYي^Oosor{y֒lp86zU?sm1Yyvؗ߂:BI)u@p{)-.4K’?y7;Pjsxt1ׇ*nHI@>C>0.{ka+aȃ2o rš3(q63)Ȝii7VznQe.IٳCHim̙FޙH9{FJ[D"0lw:IENDB`logisim-2.7.1/doc/en/img-guide/tutorial-shot-wire1.png0000644000175000017500000002260311541757132022462 0ustar vincentvincentPNG  IHDR.B`sRGBPLTE9 # c{9R6;>W6c7cd U*+)) -4T("u%+5O;401%8=7_6,EHHEe6JuXD9NMRa92C=CYLKfZjOc^7wniUm^H[l&|aotvtHGfvƞyhzøv7ҾqW~oiouz}~oe;Mܛ΢ƭQu즰XTսRȰb׾ڊgʆ֋ܫ܃ٌeh pHYs   IDATx흋CƧ"뮬"7"UWEZ.bQUlonIfI2I6m4;)P"7XtA3N~* =Pԓ@2{HXw%0Q?>q=]æFG 1b/-ݻe𝂯EJ>;lmsGxwXKW' q`Q!$=d鳒J@0OG1#9A"UwoqT;o'>(Q:x2F>엹 sgCD財Gd5¯MW+!:x ̽q+HZoßc9cd;;w|Eҍ2~lf͗ɆkE_4Uj1u|.s $M\`͒í)౮'ɓRISЩ"~֟D9.Ŝs|~Η;l7Cm66!prP'N-Jm*f$=3xR܄%л:D.olwuN60źJ嫿RgӚ6 AӞUEuĜyNwIvr6t t5s Zs%xyo2ڈ"A+pI\ } @8 elJ[]^AyNµY`&ト߯_bţ vl_Bӄ9%"nf r&2zB>JL$pq#Of s)(q\ڝQ^LE $%w9C|܎v2Gȗ0bZY).wg9zJ$NY sy_Nݥr+b]C6 ݺ2oWֆ2R8 ub;?fKpin[ F7~"$>;yt-@ǽJ-NFֆܺ 9z>I$6yȗ^<\{fs E~֫g=1s!ya)vW7r <} v}$ٵ#hEi}(>y"G)0 ABn3LY "G"Zwfi#'V7xvrae !%(;WּG$ qcwdA u29Z*B{WКX@p`!idh/bņ<$9C%KK6P俺 (s}ugԱg,ȡ'7:h92"ׅs('9}s"ɰmܡ/]/r'JH誏]ءF1y"r9\Z'O2Nb6C7yr!Eop]PYsv큙x- ?Ж4/=aiւ)^IC=2.K΢, 7".Enݱ7)ueݤb%YKz욃t69O-#nzN܎l!SwB͜i@, }vHp%-+$nEd!ns+H]XC 1{kF8ejNe\jw%jk#wb!gP>d$74G[R?UscϹEy!t~ [=no ]jA.ͩnmؑJ%xK+Z_ѧlB+ͯ+mG:=@d`G~g=ɫJ,@W^}C{Nȗdjb/(V3lrEO7{֝ݞJ9c:Nl=:m` yDEk>t{?&1mtr?0{ G|)43=_5T^ Rr\.[B^_'. zײ"F>u/dz 27xB,r(u' 9dr4 #G=J!WVw;nтBȭ(u䰨(M|ێܼ܊L[1O)&r47-:- rzgn ˢ4J9Xw=P,d8^ʾKitr4,sv@zѴ+T"7ۑCD%vӷb*#8גƚϖp@&sڐȿGH5m3 9Z\4^bH( y"_\ r FS.V2|i[ Pj!9Z(7GJ>=~R.ܯn6jITc-4!r5zUȭH_! e$' uhr>uz<"Dq *WڑkZ)1C~)p!-佻p!GkL ؑoma+ hܮBUזͮGtXNyycܱB^w՞O)9ǎ^g_^GE VSX&r;wr!7y'"_ӉW8 w+rȢo}ȫt.aV]+V>0pG[;r"+_khf dZqudb_7:6y@ܻ31b͆< +&dy:Ԛ9Bb# X #<;Eny\rͨYr2ȭu,?=/5?r7rq c܇߹ÅV^AVm2@\:9h.lwv}eMAȅ--÷ܦ@܎WnsH6H(ƀyM1]+sCu#.+qBlQ>J@\~ZGfX11DloAVfP_n Clk[yluEaÙ+/B#.]W+u+]bXbW"1JZ o+\iXM!m7ej yM7%B^3roCGZdnG"F>/~V!yݑC-b䇚!DF!8ft,CCw;BV!fC~h < pcufrE#F>&B7o { V?_%7X.^ {4N'HjʍI}Χ#g# #!jcƱo};/7g${+BQ91;!r=9|c3ruulu,339/mK8Y ?=z}3ym" 4YմQv\:<[?܌1F˜ڙ!G嶗^d3ݚQ҂.ʙIO VymF8!g.88?m%]B|;C!HQ#:#D \ ,0|!0^-$V A0j+䑅,9EG`F+*j\y7F -<(GFr9oE*nMTj& /HWu 7rBM_|W^>`C1ӹ|>F3ߑ11 ]G ˩f8q^{x+76jgV9L# ۘJic󎽽Jffɴ5y{$Ͼ^No'?]{$< }Fd<6CF[6;1D9Ʈe<6Cc%@$ȝZ<|oP+͐\#yimfZӴ0\rypyfՂ|v;Y 燜^2)5|-|3OC!OR3t< r~Wm>ryC OVZCεگ2Z!;r2d):B^Ih`"O%.!|YNc#Bۭ:/r<(-d $n"rsmgtg֙ d5:k9kn9B4q1a#O2-Caf.1eoc?"mwwwu9SZ!֙Uܟ͔w !x."-5r٨Zt&ȭrC B#!pG+!ǐq:,y*19c͐#OC`Mc3ɬfނ c^bC@c<.-<;Ϟ5{kh)e[j9c7{c<]{{9֕zbMў!SGnUȣs]FѧC<5گ_[!6zrrv1;hkFߴFxvرCgF ]Yy +w Ƚq)Z&g?S<Ў|B18#;5h/ _yvGւ?<۴?bnR-3O_/ȋI?;tR =7/ DAAqV)l`&< A!#Oh/'l*m2Gj6בWg AJ1F~:=PRܰhL F{DJűYŊ|@O͗9Л(FH+i6i\ t s|io4S c|yݑGac%Yy|Lܣ5rKX@<{9m$a]!WGCivi|;$) u2iBA^UCG^ut`|"J5W{ y0z4\ <طǎJa'W{zRRǎoY L  >̴oJ54?R|#4|:ڋoVPLaTb 8QCRr\!Wr7SM} #6gU*䡭[!r /P(-_>~-[nY!W4@ɓɩmgML_Ng&) E) _eUl$G=ծ —9 ŗ ?mE!n[^ gy\uϒg̏F\EB!G=μ2n_ 9glXZȿ6H!oneowG,sn7.wg_Wα+m JZ]NC9CsYCgjCJq(6/7ȴ^Vϧ3Yr0О2x  cIDAT矹o7&+d\ѧ rG -YrHF;Y8IRt<&ͬEg ?ΒoЌh%M!o;&@IJkFW7Rƫy"OP"5|Uގ&#M+8=R˳-Bk2;>[ ,1&@>ynZȿpmO|6۷M~_K&WI [.ꭤB>xF2kc]d|OOĩ̽<*dCsEg2'NSs]d@;k^}!sDt%NG  +8qR[T"r / pIENDB`logisim-2.7.1/doc/en/img-guide/tutorial-shot-test.png0000644000175000017500000002307711541757132022420 0ustar vincentvincentPNG  IHDR.B`sRGBPLTE9 #{dR:26;>X7ecd U-)-/.3S)$;401%27P 9=7_6d96Is-FX9NOS\=6VX4xMCXJHf}TUT88pthb|Ocno+Ygi^m&|ZouuwtHGevƶshzmhqW7~otz}~΅ʓnڟfݘI:ۚ͢ǭPuXTܮ׼RȰb׾ָgȆ֋ܫ܃ٌ?? pHYs   IDATx흋C'HKR"h V([Ap6"R)HR"{>fvgvg_&#&}朙9sfttt+i IRT:U;SȬhÍ :SO/ftyA%<Wr.ㆌ2!F76W<{k2Fq3؞?/npdm5ZZ(uy&kO.R u 뚄/aPpB⇿d9\ܕ|Do| 3W!3噙'S|~"Ȯ.ő l v.sq;E'r9GMw̧"x![)7L4,t e?Oσؐ'D¤f,:an#.<,~!5saӚ6Mcᒄ"KV ԧuRG)NPs@w""_忎[e98 ןc?[rn<0B#'N#9GR"{F :Y|O.xjxJU=]{bWqUe/UJW, ol#B~f:i oZY!|#!%\$#˼ΜBXݐs7r뢓#')~ ߀۠8Vs_[D6E D/ 57GPRBE>b^d5$jc9&0! R%|s8Wr S.u>6(ܶ9| ~}/:^lݸw9 V;胶Խ/Nҷvm=EAp/6$C5wCۨ1 mSlz_bE{Jp1507G!SHsRGъB{]GR$ C0Q4/;J]H瑖EKBP;yòcdЇ~3ta^BG uSM9۴E-!.WF5ن;$ԕ ſ760jryfP1~Dnjy477̥*kcnz.P'\7-JA>emT79rh .hݐ,~lr@rzT_7_! VTwE.gkn-~*s"+H܋8?A!--7lѱaV['m;F#7r9\=v7^y5-=7¬RO',dD1$[;Hτ u ~GQAoT8P +\9;Cq=ʝ#l8^i+Oч+kފ>3UW-g#oqhsbWyNf4+O͗sW|(zdZι#I㬸3gew^ͽ!imgnnGKs6ID|5ny-A.dfa!^M/5jˊ+r􅐛Fډ\7 @K9nsB )B1wC:B\ 9|qKD5-,> Jw Wx9HCd @L;F^?r /h9rðaWu-GbhL!@\P5&{e<׷ʬZ.B^5s3ϬɪT%D%Ys'r\5GN'Ur(9Z`Dw \(pVgU9! _7W#^HIUfjr gj+9`Xr\IBJUc GY*Y!W[91`WuPj}4|t+)N~ z3Yy8K}r{Ux$;9Z8+iZS}#A|NJ^A} oD1M37v_k5'rM?00 yBdC%\B X||QZ. |Q뎼H91?Ӗ@EWv*/WNgjvNr) rv Sdgk7 U; w;rGؼoܶzIn3n8k< ZcY-}eYsAn ?ټZ y,ƚ)\k9kgrHnĥbӪF9XsWݽqI\(E|C}s,]/fMPYzD5eͦcKVqMװ=a匇,fb߇hB9-hy(u"]@9m%;EN|ð}fG9Cܼ;(dې˗؝E@5,@xAzyҵ@YbKn%a^>29=0[^ؚ;qr J"0E.`_}A\-<6ؘB[E:r"5 n.7;fFܯ/B^)>? 9$~텎o޼ +}g-!bl^uG~}Koi.p|^HkWI}b p{xȏ1r 򮂶wFNBrkDDk9"@ph4.~9J:v:ةI sY@俽7OF^_F.]D]o& VuȤž!gF$M0{"B Qɢе!\Ƿ?Z%ZsD6v.p1>|##DˇtD~jALl)w>Va7)ͱ|h$rLj!G x:2%]6׃Q9( rLjIB4 c!;|FruHZw Q}T86G'T^NC4I<暟 dUrcHk9'_ ZԺў7ry,U '_ZȻWR+AeelOWcs٘51sZnhيW#?ϰ2ȃ27k!w\M?_#׽[<2[j+{@ sAsZ͗JMy8Ա-]:'D.}wjZi'Q{2ͧ:[Ͱ5q5RXao'i7'DC7ҰG^ny*5`}j'^ Oi98ca/qGQg㐎NWABnr3{ºBOA]gH!}9D`I_ߚ W->^/|eTS}b..>OqҲCy* FDp#}r)ow[qDDZ&}t9o2-d| .3mrZ˙7•T"'Ec#Of{y!0Nް3ȿI|{y"9 E\CM1.sݚP[ΰ ;ܻ;ߎo)4Ȱېa]924{1Nw'CrrDVFѯ#<4 ?Ix3a"^23s@=24{OVD$iTư{cnt-9:W9j-mfw{9n;ջُ{3"d^߼AZ=q%m胳簉jnuD.B.'fv>r\׷^lvI<0WY^}B@˛\ X˛\\!ky 7*( @A1AqV oYșӨ`ǜ@^n%3lºd:ln ֪.5yMAЄM֛ 7aټ_:+i@-*)[܁< gg!1T %7ТrsZ@ZZ`7(/"匄@FԮyh&Ĭ[UnzJeGƫXFo$j.~QhrګyR)\@A4$S={UjQ@5@A.V53첱o %r :v:"X&7 B gݑ1FQO3 U9\3&(%>ȳ&> d⛪E+N'YBȯyjH yv\!Wof-)m+[XB>d1O[dV孮9z- y =B@߿B7T->rUI%/'3bo;mbq-{]SSA^C9hY߭+E}G5EgB~Q}v(h;uk+oyRHL,8+O[h9`Bn})b`Z͕r{։5|_A+ C߯oaeޭ=  }vEÓ!MkGNLIDAT'<!G*5 T+F!Wțy(H B+ BoQz$';Mir\!WҊUgvC^K#Ϊ!H3l~YiyTJaȏ~8yoT^. !{]rc| ȋpEN}+A| gBAT #P><#n7ߊrLkŷRP> Iʨ  {j]C59;IzߨPH<=c7p#?r^Zn Mp5pIRt+WboC@+aܲq?ȩgqsX2ZnȝrUhp7[Kߟ$6zUҜ]ʷ,G?=C$Hy y? Z;r yYH465/<@KCrZ&~_M!۵\O7ƼC2 m@e nlqH=f@U }z!k>=}'cܹ i&)_bҹL??6 ;;Ss)i 9J4f[IENDB`logisim-2.7.1/doc/en/img-guide/tutorial-shot-labeled.png0000644000175000017500000003021111541757132023015 0ustar vincentvincentPNG  IHDR.B`sRGBPLTEAh $86biONV6~DU )-.,.8,5P>7)<"$.I2N lF:!aMKDScBd 蕵X`[A! 93I>huL2oΙ3putgHGG9\/LZB=0TRzsd6WO= 垏I[zz_T!גy3zbNZ TThݕk|8)R $}jݥ0 :ʘ[Ћ#.1D/^}@+]!X=+7ȋw5ESk~8W4ӈW1z'"_jl#-/+.6/QǸ{: _@Nn4b`#H& i'" 9G$JEƚwX}١:e0Eת*uBv+"wɃԬÞxFNdfၼ~ri*zwa˝WN!U A.Aw^qE/|{i#Oّ=>͡|< } aP8JbeK\\+'{ags3!~z+WM\|8Ǽ~zEy =?W XFL셅!*b!w+EoFJg94?`pű#S_RĴ _1~]E6%{sAN~L0GF^*3l&.&јY4+ r/Q9/Q=?% r$yAC6qÿFnrH|"ݜn~s ]bÝ`7NX|Ý۰ܜ 9\& S&=k?>rL5(s!QG^:pE, MވM+TM͹E4ꇳ-8LxubnG9 :QQ{P1D>hqm"#23"efB~( X[,T|LQF-#g"@B \ѷQ])ArIPx˝XaG|(>J+[A߽WyB,Td؋"N xr9t_I֡/,iI?S԰7N*kkAbR Uoo:ѰEl'|Bx-=BPC ߜ<) PVaUb؉W,_xa+ʈ_k};7r2ѹ:]IkpQ 7 %FW˲#nCKtm^9Hom~u8-1 tWz: ͹qπe;\1ly1*]m' ߿y*P6O?@~Bn7حoOy"w6Nm}{_+oQ.^{eZg7w${\-cKr|q2vxN;穗7U3@o o ~cՊUu\D[݈sw7Zrcd]uv}IX߿FyoCzG `}ʳgZbn {v6  A,~c=]u7g(>>WGyc]gixf+6 Z!?%'gD 'XgV غμ(r:2@K%BJ cnrvIY:~J;3J;Cc61ԱjEptWdE^{zVBo^C\Je7Gd!`=~a){} .''w^ \. ]L~.˰¸{Jixg(HUJpYs׵~rc%]O ϠTّ@0 ;/GrnNEo !w<ec_2o~%^4R\M~akg1nI)y8-n"8Y5NU^[h}oDN (qb!_oZ<M!qr> E 4Z=NO~;h*K".kTr9lωDNq j 4Wi@YM B6> KĢk4-!W%wpCCTJŐ7cRYC dkp/,t,[,C}<;!V1ɗBLq;7~ȠD8>>>ZX;>*϶lԺxvB#M> l{Cn ~ S|IX?韇o "J\D~|~$j C+a@-l^9OAu/GqL/ wLf6ވi~3,t;0)>UlcfzF3t;=bd^rI=? /ZB*U|A cQɀ9_*(]~}wwrP^Oڼq$S9l1ɝ{ R"cҗmY1QxM ϶3Px:[醶q$n;h%{hA |r1:iT0 ߕ'`rr3rT'^Ȑ[ȱ,9̤4(Q/Dcړ1(ǂ1hZ MX8Kʁĸ~ uK:Q~8&kgObCOSO\ȝ,G NO,)Lpap-00;y~w1EqykɅ= )C-Gn%r {v M|~vr|<Ѡ䊲H=6-?C{o-B{ ܛ ֯"?kDof]I~< 8-tv1D70>)0[[wjݍ=" d͡ŢC|Yr_`:-r hmC]AcO$)nIuxҺG;4фAWNǓ>Eߣɫ`]~L?*<İ)~w$upޝf.lϹoI{{=˃{kuևAf!ȅ}~@9.(ˏz[[!;=_ NV} ,g´|uS%4ǚI\}<äqRw=g-i6QqIxUI$-݌fd #g+ "RK_ G)Hd a[90? rAbwrGTZãV@ -/^EՖ-AC.,y^2u68 v;Epj!o5܀^NA <0#轌!?c\}Ť<BWaq:z! 6I1$'E!MFD^FEG "7T>1!$h* P/K!2]%R3rΖbq ueQ 9ad YXqC k!'kS# !ŋӟQqn 9bkE̷p&"E얈&(w#y#Hh/+&d| 5oa a/l@ae,cǠ׊\1q&b!3 U4Kі+&!|]NzaǙE9#5'n/j+8Ai2Ǒ:($lUqri6LfyC |F1ի/XE܄w 'ȉO4z,ukp qn9N/+zbT3h*3 uusO$'VVR[œ Cΐ3-|e,rMRM)qƥqp ADFQGj*HElEӒE/Ra *Enh;AIČ=GBR"kElh;*{<)?^[HKwAgu)׍ʓ#\ z, |5ӒG.I1@4uyBhcq^{ʐ|(|]7r rRN"9@G>eI%)+Mf<*4[\=LdP&."}_.^8٘ex:) DZ/VyA$%!3% i< 猅-(qy}c䎑M%w!# Kz*.}ˣd_G bDk_ \6a"WNZ츄-TRW8M1KD-ʋG8=%d @O&fo'rU}8Lް1dDIgIlwq6ƈC֌!o#D'.gػᜎ"1mrTy8 )&oψf@r i8] V [" jk &|_1]p6jbna Mӌ`ؕ~QB#7cXc CG,ļ+h:W#aMZ=C@q죹9_M3H ZU!qxDka7F%1f+@.n/]6VIk8Ϻ@r8 مi-)$hYTD0vKg!U r_S8MIka眞=Q,2^7$|GyI u80*+MK/3rݞQgw#'b!'^l`cW",Շ[H6@u%EI[kğF8]Mj橃\yGz@0E_ W[xzȿ% '8n#%n#[hqoE@b"$EĚXXRuf2kYE$ŤF&!N D*hyAA,l#K刑sr]&tIQҚ'"HP X&iPUĜ{` 9G}n.D'< <A6u E9IXo:{ELX @mZLZ@YR486LrTm Qӓ\9V[-wjhJzn(ss+uA貔txHaEIp<3ZVE0I\"f 7IX@/.KaXKj2:xNX{E{O\PDSֳvY24 IRV+pV*ۃ4G"v3-(H& 7I*1bh2,t-kYt,u4+sĬII= ?.D..G4GX xR'I1RL1ZF`1^0ˆHb8=`f ԈHI [B:Q*qjw!dC]i9k#?*|n.o ?Tȷ3(%&gݷ*٘*rbKɚa(xI,K)vDUU߅pݽf|9ÞA9szT7MݐRRE!o*{rW_OwNW,:: Xv1I7ȫVAQG#dVq>AOZԠMoYY٨ðoq[%Z.5sĴ \9bț|$'BWː׎\ |dt:r!FW懝@g!?J#߹~fy_tBϐ#~(Ћ!w3ߍ7.B~pwd{ulz 9k}W-<;w='. xaZ~iy Bi/'3q>D~C^ ?>OYvdWL) yݑ ?e4'-;?[44zeDb!oEe'F4q=!go?  Jc\y yCKJ^UVyp߹J[׳҉)Ȑy>Wm׳dliy&NGCX-Q"ě:}Ij913- /|+yo)}|f?͛ױa790uB[\C7ƻwCݠӟΐ ^r;W#?ɤYY^weU_G~pq7  S yHYkr[IOY2gȋY2gIZ~CL9G2liyCZd93M-256M*rΐn ybJ"w Gg goնwwȧBr~pĜڼn4/w{Grn>07ߍ~s5BCh)-~rsgҎoi y=r_N qϔssgpgp{{8䉙)GS!_E~ttt\Z7 7y49(`;o_)P_0]l0䭎qZM;C^yAyqy7h2-吗r'ǝ;a[yrwES[ߊ"[d9j+-_ΐ+-_ΐP/ghؽZ* y]|MqۣoZ*C I;B^,JuchKO6xev}hn?D^ nIDAT8 Х/kgol}s#/_N =nBgZ(-/_NN8Y}硹?'夒'g->NL C6D^Vy9C޾ۥ!oNYWM[եP˛=iy;q2C /_0刜 A.$ss' 6'ȯ Liy7 r|rV?9}9mA ;?RC^3 O/߱KwܵPPeё!QdP*_no0b '7ih& q8tQ[*oətXK/w?:\zC%__15!i&h"JTBT`H:K=Gk};}뛃DN?nY_Iz<ljyD~U&}XA Lx;y^x6R(ڑrC*CnxD 8χK_%rpZ!rM !Ŷa~ZY! պ2"piK1ȓfF)~U"_WF %Tjn@,؂ G^kTyIF s!9q䑈a!}8=giqU䣠* VQ#!p$çR*k,$G*]FZjh}" @u>䅱GCe GfZ^h֏"AkU p6ھS Vv8xo$ #p_1Oal}]rsC^+r,#e!8/ ̂a=%c!`=+am؀ٯp'H.W(̐7 !c"m_"W辡 +QPip:ˣmn1-C\a[*c37sDs v<~ȡx!䖦;.Uy)t9Cȣ:-a4W\vp#64[ud]7 y+#[*lVFo:e FFU@[RCu)@W-r!omIK)rPԒn`Mâ\=Xl#9(5ac{Lĭe1]3 y!OZL!@jQ<#:"X!c~гK|(e]S ;=ztbD=r yk!vj*,Fщ籋2FDY#u X"NR<+!go`C$"weZ^N6֒)Ƌ(i"Cΐ3aș0 9CΐK% ?~pytyE1F.ty XZn!_cg'f=ȍd,$sAhqN.pu-yp봢itBOʶII,efW:"-~<-䖖m\_l{./DbCj܈װ<}Nx(/m+@~ꀍ ӣQEgBɠG5/r8KH/(WG)L`Yzbld2: pgIDb! :F~7aG~A袑{g]eyKj4Ha#7ւ44?yid"V:qߖ-Lx-eAN!4Pw)rhǭ3m#hS`awxLd`Ő6>Ɛ7rdk9n:ZGu Mf!ooqDn{pZhs2Ia|̆ǐ3r>(s:sԤ-*Wy9ː9rpNM'F\M0f0-g G2RPXUuĮS#!% eP HPdoh}ñoJMtX !r6p=؁eL$Ks .0-?+-UaD [."7DN3^_䡮Kx.F3B!r/?<[II0bm\>a*AzK I;Z%3uB.;͛y Vωw:;Vuv^wsf@viި`h iak7B-'7ߑW0}!I(caNЗg*OWkpeo5K0;0B,\f#gZ^45 ,1X<ė ~A# wb's/b[yoԅK}szNbcK"rF!o;~o@bȓ2 9Cc e9k}-طu^fr{Gː3-*) ;Hlɏq7[e!V]9h(gNc #!P (}yz ?Z!JfR@byc~?c@Wibh?r=7^MAvQ+(6vF?Ojܻ ]ӚZrCzyrC{u/O0 K7гboNѤ]7kO%\К5v-7 !Pxؒ0J M.+{%`]HBBK.LT${Bg|g0)ۘq+) Ac [+^ua.4QcyXO3u@ՅBWWWR鮮 =XAcʮ I- tN)5 y=Siu(C^+Vw1#oo͐ȗF ?j!#~Z͢Y[on̶(sL˫r3B~p'vOr:~{f, $Ak&ȏrrĐyhA$ۯ9-naȻWŏdi ;Ur@[9= yaSCoIS` fe"r:qV%x a3JDG%OI3Oޯ^E*pV"8t,2ͶCǰO G ־V.dD$y:'~ZFET ˽I ŤBViJx%a2 f /lAx ~BXV,Ls _A䷟YYlI}x*l]둾Juw_9t_)uwU[JfKwE "v=3ݮ̋?ۋ7:Ώ?]ȼ%yZH||`Լ?k4탋y7 `:OL~9&uIENDB`logisim-2.7.1/doc/en/img-guide/tutorial-shot-gates.png0000644000175000017500000002240011541757132022531 0ustar vincentvincentPNG  IHDR.B`sRGBPLTE9 #{7Re6;>bW6cd U) -40/-S(#*5O;1%8=7_6,EHHE6Ju>Xl9NMRa92?8VX4PMeCYJIT8WfZ6opOcajj[lao,}FDuwthyğz6оqWx!~oiouz}~odN>ܛƭP΢u즰XTռRȰb׾gʆӤ׌ܫ܃ٌy( pHYs   IDATx흋C (Q~W+,xQ,-,]hTXT>z_}[DB,v+B>xoDʯOյsJ\9\Sf~z >?U˸+t5ޘ3 # EpuzzmDU1_(@.˜+Q2O&}#י[e.RtoRh@G;F>]9N Qs ̀ uTܛ] IlSB'W quӨWEr,MN/gOWn8Ǽ%za ·#1꘹Q˽?OD sq|Wׅ75Zi1c#"*pn͓M:K*,<1sO ۘI/: ?g7w7 fOD#F2Fi}M5}1sAuiOs|v#^= ?erf^98worW^7dD ecѬ%[m<3qؚ;ft{ K{@5Auqn.dn5ϼznvlXyF1jr?PUWw,eΈo`oYR_[i>Kkɝ7=jZ69?ⷻiG8/fȎkȉX [SӮ0:&+b#/\&P߄[h<VAֱ5x9`Fݡp8Fkȷ51!д8އ_5(3r1jZn]Ryй|[٭=(e+@ >>~ .s+nA6G>pr\`sflfy,/-!o8 gs[׮QR׮9#WУG_VU խ @"̐4pؤox)ʐ zp(yx/q#_zssDܾΜ>s@`Wl2y a{W@bTT=r`K "Z>AkL y+,J+ g kB.0fϝd!3W<,>Cw^Y_ (pC^,A5! N5{X+8_"ጞ5c"ɠuq;7חEdm[ i"2ڃ>7]fj3b`ۉVr5/WyqΰCڐW?>NxQ:ZCNL ٛ/U|&,۔~`47y #Fy>џY,vqIaM ;`8z?K `zI9 zz[P.ρe?g@!M- 䡬*ޑZGFk޼+o'cFo΁x˙ kkڬohgmQ дq0l ʄ5\j sE9YwRoEMȲ8<`ԦT74仄R:\nnIe{?R:\NWLL:[NQ"ȿ~Պ~ԋOBvک2aٙ0l2 B}X/D_d<$O;ЎFbzꦙ]={z;&`S{g'ݷVwh+[ٻ+g_&H /wgn\}}m>mqNvZWUx$tWA}/6tx~ a'9^(_x=oԋ >O^t]鮵Q/:UB9k9ɰ2 g֟ߝI 4sN#8'ztʬ^g_bWKn`w"WW.s/Ћ®AfEP><Vti_ F;@D^Ko8a>}0B_rifjf;( ][5ݵv3}OO-o䄕Gr%;pH>wrP&$$`%r.//ÑWBr)m<'ł\湼&#ي|CD q2|~H@fgӎr"w;r3J9ȑDwя922"wr#aZGC~G;FG=boݞ:iQt"(`6!wdP#&=2ڜȷ!;i9:F~!s090 9.vex8 r$q{Î h*rfFQ D4&n˱'~D6y@˩v<"ar< /'jN!W,]vAAҬ 񱫧y=rRr GT iuYH"_̭AǎqJť*&#b<#DIg$- ڢpNIp WiyB_}XeQ ++"\0D.!HK ]~~g*g.yGF<ڶo^k߸:ԾYf5װk&<]DxNDH?\l#!\?J ]j߼B:O*c{CNe֦M6cXfxHnq iM<4G.eD A{|ݣYYs޵eD8!o4C! ۜX H\#F? K -+~Ҽ2"i\k ~[<7 GQ^YA(QVa#7N4 8pZ~ݥӑ, Z<]"J"Zr-+jȿRӾ1d.D>>-/gYsfNI4=* bM ?`R9`^P3BPbyfzAn)35GZ)M38^. {i {f}fJ@ rոBik {wyoJȗDZȼ=/.!wjC47/Z.歛-B2<:v/Z.10@(ȃyt9oyk(sF/w:,NNg0fZU<ۮ[U?9O/3䕤xHK97PPH{aoeb[^mbTIr/g,d;6Waz*t|#}CV>ĆJzkye6:6!"Zpm7l zV# y4 j UAyڪ7VS yr jy|Tcmп<MWQ =Nr/NW䭟1&A"wF.Z|LC.|CbWh{B>,lk]\H y m@C(Hpي(ʺ!4` [~0!rE"ʋDY7NB<)fxҰ+veo@/樶 rJ7G4؎ }5 {ihG$8mZ5qirj|ށKC9YkG" _``2K5fZfJM]@^ u$v<@V [j 2lO M c$F<$Ke u;{;=AKij@9E%Z>:rrnTH[w2euլ Z!7kSOoK'@SZR$Ϧ$g(!/gռ豗iCx>JH-C,S2G 22yF|< 9Un9@'(2&+l lo&qh!$Ǧh}ȪbJiYM'U4yWhHD.KD|Ka[־Q6g1/`9J-t-t7H䝏KHK]|3ǹoD. iR@N y >tF1ؽ0$X#aF&SCCD})Q'. icw,j<("lFyMgb|gD:xrn@)l(e WEZM\Õ?nE!(Z \SoVȭrV "y<^SBgnr NED@y5SLFNKp"_'ǯ,LwGx*KU˷ R%%y Z𣢖RF>pI2ZZdnL&WGĉiR y2ȝLjbħNٴD#blPcfډU_͞;@'F' c78v☔DDqbp#IENDB`logisim-2.7.1/doc/en/img-guide/tutorial-shot-comps.png0000644000175000017500000002253311541757132022556 0ustar vincentvincentPNG  IHDR.B`sRGBPLTE9 # c{7R6;>bW6cd U) -40/,S(#+5O;401%8=7_6,EHHE6Juf@X9NMRa92?8VX4IJCYfUWT8Y6pqOcajj[l&|aouwtHGfvƞyhzøv7ҾqW~oiouz}~oe;MܛZ΢ʰIu즰XTսRȰb׾ڊgʆ֋ܫ܃ٌzb pHYs   IDATx흋C"(굲'uʪWEZn]EEJ߼$g6mP4Iߜ33g^/vBJWH,)u :pVF^@_,_Z|/Ѯ{LX@L" 2I✜ E4$^LNLj2ns=-),. Łayi)'Wb veE!,yg {Fr] O2w)t_ I6R~`eD Ȕ7o&`)-k4Bg:sqWE'̭MMYtcGGO33n'./19.Oenm 5oV4_!}EQ+Ҡb`E߲@.7ƀEbfo^ݽ5>^"e:<W3ȩa= qSd%KkNz|Pg^podF&"/LxrĮ2אmũU5VW n+fwJ䟪P"#)5N\Kʼnn%H|nhv$saM;EF2:=wo1U(-BɎ* p#gWӮP*&R VJ4B;oƄh\[ُUd ACOkȇ56smCאW51!7д*C Ug Srtfҥ{eoć~*- "s-з57w(tr2^>:6z.,%L:!o8S;bMMT%]v΀4q_z=r< _:o~ uQޘJmýыE0N}"Ga(7o9כFZtiʣ-Ci< օ5g,IE8EZ^Hr*-v%MĜ}FDq!-\ОD!/a$y zQ1~$|y@u~[P@癗GW "8(e+ȡeO#)rh  ;HK(]"ϠΰOǃq;9;7W-?[1DhO{Ⱦ--#WjSbжc-Q/hZ^D!b>#/?v6L_\ o%8wrdg,i|tkagbQJkҜO ϡ4Z._]}=N3SՍ4JbQV ).|#R2U5baeI֗^Y=fVa|5۷Kpo 3в_\WrJ܌wF 8gլؔ(5܊9@}Cv}U SUnNlSΎ7$=!|&o[x㛽 7i-T6k?{잱]i kµ~ lfJχ]՚+r Ѯњ#a6''x6, sUk8Ao s+3h#k榍Cau'nk* p6iyo!VKȪ~c-jBa_[MmuMC<#暊;Kgrd@w٢[v.D㛔f'Ciu0qgmuJvcvvn=d;}=wd};}_ߦO3?X-.nF6mC}@_̗Ξ{x ~~={ka {dߌ\.WBh^^kSA7WД_=<zQ)3M^,LJSԏ| ^~~ЙIt}2eSkt܅/r`w4"; <Yz{6i<:zHF{>{3Yb[ n`{*_ɵuyM,PbaMRJ_ YRp 9kE W*Si- BU\a.Co ז O=SJɾfBYDN+ BbӕF-["S[? W0.C+mF-hE3B ~a7  ApΞlCnZ^12u+oذ^l7Af9*9\QY_a #HHy"_Yi r)QAdz.lZ.w |u[vPhmT) )Eh?Ij[%تWww"Gm\fFNȽ/G Wy ЈW>48&iDyA#9XIz%?yĐ0rk99r|kG>yWyCr^gZc|k k9|llLf2U<"nC%_Mi -bܲDtO!9Î;^]ҫȱPegr<2#u#dy^Gq{!'I+yˑFsu[*] 4nDnMX#oy}$Au:ѰZn%4=>BB:s./=ozZ.y Q!M%i9A~WX.#G yZofq6-'R!wAݺHj9XF9&w[|w.D"(wrJ65lY&.rjҚ_BkZngi`D ݃b@ަeSt#`\ppUV{!5ߘO-o7ah9UqZ%EGk?6C-,>rݤKˣ"GuiS3q~Gy WBr\Q#G&vc${w9*ׯ{p6e+k*,Hv/3k.͗ڲECmyW퐛 m| ie;!b752i94Mn\.D~ۄ(ĥU4n}s}c|x𾙐߆̍ȵ HN]vͶwd7DZDSoC"o7 zerbDKa֥{䪖Ozαt-̱K^OjZH!rܳONzG.pϴ&{r*p Gy˙!/۰ZE"[_.g[Dްa۷<{ߘvsQI-V-Ȼ5-o!I%+49T"&6].g-ɉ !C$o%}9@Q޼=H!{ߴfaqw"txp`|]HKޑTu4䘧nhy!IoJ"\1d"{&V5u*.k\zso>]@p?N/rmDh{ھTQzH7bo޼cطNNI#ʊ|X}zڌK]9\ 9z&ؙI7%ȧ?}?#r5Yo.rvDh#o,^%OSEE&(ڝtr8;<܈F@ƙCme3UPƍ,i g嚨̈EH7 0Bm]"ͥg``.B>ikrZ:7T7:_澑ONKiRE\,I(N@~u\ O< C&jy2y;LzA'+aL]+fr9Us4>˥aoSCPuwa+7]BnS(m-rްwWM!W;E75i-drܗ iͽ+ Vʜ~oO-LsP!w !!n}n<2]#`]P[դ9^Z.-w2icz\S eNGAJ#Iހrs:)y{4op7m8q|g]NWfn/-wZ`[2㚖#|saQu)RgK-']C?DrH!6.J6uxsTԓZ_g]]b2X%| _uw@䤾\I$OmvBf!_0-\3NPY18|www3Znrե#`ix`:7"Mȫ(ב|R:UȽ)Y ) JDCnr!8k [[ ҫ[h$#rc[BB=Bn&F| <9OQXԔ&#g}r=O}Ӏ3+-L.16(Gٳ/a{p4*a=|}y" ,Tחw/by-J}y"g5 n qVq=7fkuvxH"8s[n@n__u%+!SdhlV<<\_u!|W~޹t6Drr6?Dokz"2X_ ڵ[ TR}iÕE\_Nir48}rx(.;֗BKny;!o\"ZrDfvBˣ\_ Aomߚ}srq}yrK+rx"vaw߁"Q_`ߵh6ĆGrr ShL sVɜPFuBژBSC]r4T/hgZV~jaUS-I&3yӜ*o":-o ȇFi=9)eG<Tudf<9ycc s ͪƜ/S䥸:(rfC8Vkb6]ɁGc4[bTq*^29JOi9tVVY#BG9Lʇ@qFjRe622!U׫e毼1(wF>PP i&I|ϣW#trVyߨ+4<D#C˵i%}iytT!Ar}IHw@>l={9 95*m(sy\-"7"A( 0D^k3 &vqVhB> 5 9ބӵK0NbEH>M)szL"aG# ݝEf1tj[hH荆=D <9v4wb$ lR%6"Osٷn c+I./tu>5Ҫkɼ>r "SbDRDi6Lˏsi9ʥy ǹrD$IsGheȱK]D.D{"RZ0޷ HHn'`8lh-+F"Dޅ9v\";>ICbl“A` sA^Gg]Ho\|wi:?$84qR5Da/$  {{PbqD)$x"hy}``ނY:훪Z_qvCGQqu48\]jy}Ϡ!_Giy}$A%@>SÎo*GNEfz7) g PMzɾBN1xMҚ)$+O.+;$\"%r\"C%)oAx,u4^A&mZZ_~D% ?@"xK]|=d2y\ҤBNf&b;ub۵OM"yvklYE>SQ"6SEE$G-nEzGRl+y(U5"szJTDb*M`&@.=m}㐣L^u 9f4R}hXdO\>[7YCO"'þ `sIE#RRY:<#7OoYw)oeˡ#'c93O4zG nk>rNZnq4hIDATH -Cd6UKq3H+\A#\O YC4MmUF|D;ny 71^[Қ-lI 7uRӚVHD"o A.rj1ȇ {O !H#Yəץ؉yHBu7CHnyU. {p˷}_rH˙_H eoo/v%VYp6&7Rh#mRF^qP@¿ޮg.[o/j}q /0rY4W&5)Hf'Q#.[}Noqh؉CXh9]çPK'_&dn|%zɾ-E>0 a^2?e :"G°]׊\1S<| dǮ Gh#oP $4c(r7>a䳨r-a%G0'/*[9!F|6CӺns-r7+)W*aؒ\Qos2,6r4%%hU:?s30wr&R\yKJG1 :zFJ˝ B>t xňI(oeᶊ|v\!"Þdh(?_g{^6?}[oAGN6QZ+̭1;z0iz['e2r{bn(T wr:9&f1vl՗S@_ĉt{رD;qLJWȉX,ԭO_l!BIENDB`logisim-2.7.1/doc/en/img-guide/tutorial-shot-blank.png0000644000175000017500000001761411541757132022530 0ustar vincentvincentPNG  IHDR.B`sRGBPLTEBg % !?16;=8dW6hed U+).., 6`R("8+5P3>7&=206GrGHD*G?l6M9$NQacBV{RRHXIC0dPyX8mp`ijLa`Jil`m[l&|θe apFDvwuvfvhz8ѾqW~oiouƹ~(z}~Αێ7oڟe@ܛªZ΢ʰI^u짯XT䬴Rb׾ª̵gȅ׌ܫ܃ٌ pHYs  IDATx݋CX[\٩+utXQ*"ТSd0G(Q 7׿sy'm&%mM4-ܛkkD:(Z$"Hkt\J~E5IJۈI+uYcZX UXs[pq 1"kn-.x4>_cZL11mO=cnK|Ic^1>=5=S v/"▊poIH='Qmf&"^yF`>f2wC?2sN~ݕ&0wO.i@'7^Q壙^ ˚yyʣuA]\fyz庙ѻvt;yIs]8Fz?_7͗Ĉɴ9qKђ?!z ȿuq[:ǭkC5GV*puD"+-=mur/p7oKn)rl$#&G ܝKk#“3r*.* ebaՅr_Sܘ{k17@oWAV*şpxu}/h:<7^ťɻ2J/EEYdLq[*Aĵiܩ7ZoqOt z+祕pg\Pgj~c'ou$`z,2!סmo糧wū x3E*L 32kÒ]qV_s ؅0TS~nA|<1oz-:ckFj׻ jHr?p~p$_R|gH,SM\]|r/b}nV,w>ZP;VnnC/QM6>#nR0X-8\4GK tWw0j4U! za@GsnFw7d_͊~]#i!eFhYOU$/M0O |>պD&ah͕؛+Wl2Q]m`mY[[W5ěcardߊDwnḑ*~ q*w/`}BJ| gsW+?M!yJ7Gr=~Imju$_7+x$5EamW?"_J+V6jعA5A>e&QygܭWi.wl]|FMGS<@l eaΛ+yz׊ Jc q:bf6'q1~Ln(+˗3;f`cˈgw+ Lr^C. JpAyY.I._:qC/qK.;7;\;iy`y;9Ϋߢ s$RɮKB -z52Toob_~GSNa܌wwUﯪpDn@wCyuIlccLGh6qkܽlZ)ϝ>b^l31=.)0{s%SkK5{Un\o5ք!&&a>&}2i`>Ns}I=AkeKª9O@iu!y]k|^s$g^aA%$/X/+M{ڠ+-/!նtsfv|"F5~-e";~J3h8+L; $&?őȉWovbx}ۙ=1[4C?fa [)X' _Ǖ9nlq&mp&?Rɑm!~~{SmdiYy;ϰl[{<-wĐi |a6's}{{Nyf:QyX$ӎͫ8%fn?5`>cOSUd}W`|zs>?r?'O^|S_Kg-E,l1#6g|Q̺{;Ѧd{8 r# |芾d{bO+}=矓G|)ݻo/I)ˑP("{Wֈ>|?ξ+$0zU6P g G~)s˯~$ E[뛍[UH.^X  aڜI߭Dn;rg;#DDJЂV;|Zȟ25#&/Tv`|qG|i~lق\LXWV%j!븩fX^J}bqj^7+$nP4D ϊ/-*&mW_pMLK36_>2skFo%rö3E!q @h+M@~oa[~L*%gAK[O*h_1bqvq[JCU49# ߳kw393WFZ'K@߹Fn6,yEl /Ww{Mil/pEֵ+Of$כhG;W8mCI_ƎmxFs9.Ou"gC8rWqcJN_Ӝ^ Vr\a\Q9R\ ƲK+DHw!%BL`Je:QArtD'O35Ke9u$1r04'쩈" Y@yɂwTrmWJYƜ^<Ã]c.r,S!y S ˯rrRJ~lj\qjPV;;|فi=kFrN 8q;.zz3OM1_zҌi'-ejpNɯj#W͝O'?ޭ'jrD( 7C!DN HUr]p O5@y=:AV Gcw5{-O05P%CFrh@r:{[<8Nn%-Gmz"gyLh|/N`NYOYyQ'OəS| vrED2FzKJȹw|wL> ޹+Mp cv]fQ%爼A#ge-O,w=O/='xi,Ur2 r"77qrLJ7 &rIi#L A[Goˊvvr3.~l-GGo:o_ ^nn4=myMY.o:4IeDJvrq[.oVFY,!UcW򛕶yHɵU3;`iSSOu|6:O[h!i"o-iF;ܑZռ",'"&r"'r"'f&yԴ*;rG"o$rc껶ӜH Nnux/)hG"oprk5wrЮ8WC>c#(bܞQߔ|8U6VQ-nz-صo0YNU,πT݉שmy#Y>5nQȧ~y;4P[CJ5:4:6R{gԭBDޔD}k75' ([`'%oKbG-BL9~@~<a|$'䇊!&&'@4~wa"o13F=5Ty#O;װAw#ioF}08ajߟ~;dxd"V5ϭoY~_~m"oO(} ە{PPOO?ޯdܐJkדgk!믿f=CˋD#GNF~cVQV%t1zx2NoXoO*;<7(Fl|yM?]K>,_ys XWuW|:"f&uB<rIKZռ[(˛<ȅ>z?8\ƈ/9"*(wI\ȃrקu\.[&RSݖsoKj9!M5aOFXBYa,U'"D M'nGۼCe{\O'O,sr;Wޫ+h[^=Ԕ#m[.7_/Zwfyoz{!D^slGmR,'I(9yn}s#4g^Va9썒J\r#;۶冞%7Xz%=iiN{qT)s9/&FUOLLMrN/e<܉S3N_O-SΕ;YFLَ~]ϟOԓzD^# or)1H(wT;OǍht{PPv:sؘd힘%wy\SEVXo@oDö|lNn/vBr0G5X |̉S[\MS) B_N侒_r"Bw ~!Dk_+x)uy@y߉K˺\d1qiNu$wDq|u/r\9 CnGkf U7[ߌeyZnaAeyrw*O-NjK/)GY"oL|'mɋxۥy#D5sv"Q 1,r/o,0S/o,w/yu/w8^&!/_DLˑ_Awv|x9y2Ln/K;?@Vvyju,)k%z/' )̃A'rˋ[m$7\(((tu[mU^qsܬ]xq`T}|xXyZFn lXmn'}:<Нcj}͉!/,#ˇWwi9H>l&7EA5e{-a$?n ȇȷͬ]s첧OD!V:%ȏFXCI>V 9hrIbԪVEF>V&d8>3Yb6C xoIMM V>)|?/VŪAY^Sy'9=@r#M}~,W"o(n6r\~w:"? 7yBK7/5ri roY·DX~ #K(>v$m19ΕD=D9^C'WW&)A.'%˩NڊI㉋qb^OCas<'5Krr""'r"'r"'r"'r&&O'qdZ<9/9"^*,o, ;ܹ\:L-B si"or/9SL nc|mTTK$2&bO_~8V'r_ωNq~<`~GHVQHvSM/O/~rq7!YΏ~SVo'{0vbgw&s}7K'Ǟ50|~v|"nUm[]oE'﷞0dEL?`zm|]+jtZ!O G7"'r"ȉ[[_ !ɩUs뛕<ǾQT97;y?y({ 旉W&|h~>,cxGZQ5\M+إ8Bo ?NҶGr}oI1*Gշ vuFgO'e1Vw)*q k4xq'9CMiR{m}3ԪV}[X DPDˉwPm r@( a!xῲT?UJQno1p0B1+Zj{%o4sGrL a؂y5w\Gnsץ-XL==mE{w=:`¢}I"G::chRLGE"3g(?3IENDB`logisim-2.7.1/doc/en/img-guide/tutorial-shot-ands.png0000644000175000017500000002061511541757132022361 0ustar vincentvincentPNG  IHDR.B`sRGBPLTE8 #{7Re6;>bW6cd U)/., -5S(#66)5N;1%8=7_6HGD,E>5KvXl9NMRa92?8VX4PMeCYJIT8WfZ6opOcajj[le ao,}FDvxufvhzß{6оqW~oiou+z}~ϑod🡞@NܛZ΢ʰIu짯XT䬴Rb׾¬̶gʆ׌ܫ܃ٌ@ pHYs  IDATx흉C;.$'|~W #5zֽk~yK :7K70 r{>㕹qȷmt絬8pѤx|iRu|="?5kfY^M Se5E?Cn01?wKgJ[|G.\|oU1ΝV>?>zUˢ\$zڦb&Q<\'2u`.Լ1ģ65NL5C䛛Lf6qxyuh`)::\{ g JӚ]sz@j^on4Qz\wVt t*\- _w j_e{'@&cqKrjrlp V4~d} H0c?ɩՃk]f"Qm;p;1/DyiW|O/"9E ķ_ k:4̵Hڑ>H972Fds/~iwf gقxFEłH܆0o׎-1r dPR5a4V3ʦH ɾ`*uy]߶"/bBn9j8 J\bH<#JpcgD bpؕ.+xacruom_5wb;W31Gs n -7;ᱱ*^,{@\ Q둟™g>oxKtmp_p;r=zJ^7~ɗV#UQ*NNjcg96(;9K)!QA񓆼{+ݕ@F_Dǭ>hkZ7"_gFw.Ug>呹ȗC&el/b%^b; |q'V*oAX=SҨy.8jXX9kth}:SDV|",sB WO'w㗞9"[=1Bn9XЊjm~a7!|ֈ!}ByO#, VV sbTLȹa=glqxb .xaB6*F}!U4]>W_+Z[ O7K^:?ܜt4/)sgJc?r]^ݑcv OXK$m.|./?$isA"gBo2Lȁ9!(ة#GUBNmdavА!tf rpݑ3B;V췻932&"ws#B!! Uٽbj~gn9 ٜ4Gё3VVdGeN4%:9rr=s8C 퐳IZO#ǩT{93;/$%!=9nhZ.NFX$F 7 Z1+rkĄTL&bS=vKG{OZ~BäSSTP[x$VjSj[ KuAfC^0" !'5%ao}ԾwNC7$)!?2ri* |jAGryarjr/P !oo $z_NA?|wq; !FW:*`Pȳ]qB|3vƫNU-?Z.blύW౿K5c]ȗ?wX$/ J˩7[-?_ze@ޕ?u|;/'BڨyffƊW#rX3rLL}``$y9 .3~WY7BKaA#SEȹ&? \[KG>*# 1hG7;@22r!} oȅ,ؤ֏W7K brKµlNibq_8^AIxb]qnqλIZ tepnZξ0ͩr]? b,q`/̑@jMXx˹ۍ/tB/<\$>i5 ߜBuNM]!3HHw_i1Xa(=O7'9q!7w9| /e&.@vF˿ Q[AvE.7YP-TyG0#7u9$BXB9mrr~m-4ҽ틼-fCt@^-^AY*-s#/]Z[gI 71yAț۱i8Z)+yL H6h-yh9IV.O!F~Oߑ_j!crrYn+Nּokc02[bl̀rOڌTc- y+nlKc+n@H6!৛~E_BND>NTvڷIDNM$:ʰO">`wku;vBNÎ|wN 9!o{raU4:]D%#A^@#Eg]H XBF6v8DZ{jy# {6v0@Go 'lL'R-iElhWGٰsڑx""C[#71+IϲZ7QH㷓Q7*&NB~XEC;BkD 9!'䄜-%W "վ޲Ad8b1W\!-o-o N;Pq N;9 ygoM9BN48HB9A:Gp v4D'!4r u%+m$!Oo2%B05%)*-;QT9 yWR0^j,ar \iEg}5ڷվ AmfY[zuD6~/j"mENz[  o>z Z*..!!}D۷~9ݍv*^se~>`R< BMiԌcz{WOǑKkMBȏ|fPD MwdC:C<ߘPMy#i~KlD|#4qGTmI͛r#-h|2,t}d돼}r88\,lq#?,jrH<"-3ep/p䰖 {G[Ov(\+7y4v\gynWC7pr!{T6ȗ%xƕ+:o0Ծ ;ժ^Tr9!;@ :% #[C(bB<~暂|,s܄?0 7 [Y _dHȨ/FO.Sկz˳\~T%2NQ{zkc@2w~'3ǏHo|~R+hCs%eݽg4G4yF=iVq̱CVXwG"ztF"M9{܎IENDB`logisim-2.7.1/doc/en/img-guide/tutorial-shot-all.png0000644000175000017500000002367511541757132022215 0ustar vincentvincentPNG  IHDR.B`sRGBPLTE9 #{R:2e6;>X7ecd U-)-/.3S)$401%27PC 9=7^6d96Is-F8MOS\=6VX4xMIGCXf}TUT88puhb|Ocno+iYg^mZo/~͝uuwtIHgyrzt mhqW6~otĀz}wςΔnڟeޙJ:ۚ͢ǭPuXTܮ׼Rb׾ɳָgʆӤ׌ܫ܃ٌse pHYs   IDATx흍CǶ'Hji{Eb+K U$\ mR"ٝٝJ61g=gfΜ9RtR._.Q;SȜhõ\RO2; <~塧ru'dq]Ɛfd`x!}\ &)؋2f8-w{JG*ZRT'yo޼Vyx9˟Y$u~% O'>1 L&siB[uZk-nLTBc^ʿ7*=spW>\x`7#"I9@{褣X),,s>_zϞroz4 3{d^KsY=Vt)/o!anCo-> jgs8D_p ܛG =ƃp3K~sBCSĴz.@b]tuI6(ܬa5G15|#ZȋZ, Ob4/RG"Gc^w KYC2;6ؑcsY/A䛣 ;ZWTpl}oq.eF[ς^x=poc6d7\El_`dd6^MxIX,5wCۨ,͇HZm cCӫX hHCn,\_<$C9ZQ_?Ar~;߯!yd >@u]EH瑖ɢet!]9Rsl1hqY=Ѕe37#Wg~W6 Yȷ;J#yxmTlm4RW6Nާ\[F,vrİmȡ'ȗB?ₜe=kP` y_+>ܧ'Ν?o,-9i{,SےY}vhubжבe:.d(mņWGaY -7GofFXTҫo ro?>k~/^m ?W͞4wyꂅ_yHCrY.R|[DE,j-$" j {?lnD-.Bg*Bq kh] ?+ZopC./@Kxlvm!'| Hhe_\[}4e L.>wI/K\ӭ( bUOvOe/UbrX-+v/쏿Z D]={X~ 9K=nI3!SwA?t4FC3IS{tgC7nA~ЧB>?1%=a>q(#>bI< ܓl~ͶI9D>u]{Ǡ|gcT?yx_AѝjTP4)^8||s8nFg8>i+OO$9&>&2&G2|IٌfebZ㩸>5r#5L"6bζƁxf~zǹУb>5°%J)H^˗6!bsZk0x@L;?/(is璁;7.† I{@Crg%m-_?}t |ӳ~t~+xS/_{86U=h)'we-.KYX6s]^ȏ[r7>L/GOo9IC'w Xk<{Nn۝;>Bv|fG^T-!hA[3lB+ͯP9oXN ;i\נ8 +p׏x @ﯾG̡S!կ;n1.:Y@ GZ lrF&-}=-L͌2Mí;h{2iW/њoK`rY'l_`gǷ??/eɱY|}ERzrgPR/ wH-w=xK+C{MкOĞ?x߻{4_՞z+l_`-e''_~w>}k{ybGDYI"'l "ph3ww{]}.D W{An| DZi'rhALE<46O=d#%|L3rѽtfrωL_?L 96YvIdvͣOa)Xu=u^X}K~h.gcqEÂ;*&>(ȣXN1^+JD DWgJ:ǥJr%ICq!ה\@g@r* 0 z%MCH*1#Qw[!W\<.ȁBޚZ~g's`i,r"^QYɜ9s{UEb些aw i9U;S7ACnxf.;!8.eUAg?Qv̭[y#Q!i:?_ҜM|-fc 7A9,hrsy yuK\{6nnn \/+ѝEȹ*A27w3\ _z~P8}) >rpV{ g{e2C%6█kZ: Y|r q- 4f  2 BL;F^Ha?AYriaHîrx5~m@[(Nk9ʼC^3s390HF9Z[̝ȡk;*t:)rH#Y@\Ϊ9p@T"D{y-8<>iqʜBA|!״ Wr+ yBY+*ܱ# WA Bphƀ5@ K{-D07ِ?ș[Y îC&FwbE!_Fbo^APr> z7O"&n$_*NV yҐ0r`!ׁ ZW,A{_!O0hoR!Mhp"VBa_!''b .*2,7J˅/ 7`񁼞Q&~g ;z?7rr,SeBky:z:ۑq"_bܽKAd"Bv#]әLAfG]rnGۧ$ N9+ ~-Y<|[=+!̺ rxn.,ŖrwRm}9M so-4ѓ@sm7,F߳!liJ_hgYp^#&h9A~."GZ y^O/I]P9C. r޷fj`0Ł <[ȩ)pGrc" q>f!$߰sYRUp-7 7GTnߞ ;MayW^OZUSer8![3ZB שs݆BOLL,r)ơ B{U(xea61n872䈺+ yHv䃒5vIG} tB fօطs9j4A{ pQ-D wB^MC([eV wY tyͦ'׿ft0hvvxÇ9;D1ȣr]}j9]'FB||ESŝ[Y.}L%9DC[<-^5֎t̨I!xvlr2prg,r.y#;uB~.Z%\YM6]\_E9cf]XXu~m6 9yNV-8VZ bCY M^[ y~u\RWmcv<-F\:*\|glE9XsWݽqy 'Q9~U# #.X@8į9TΤ3Lx9$gxYcKV Lװ=a匇-fb߇B9-hy( "3VZYD7< ;/7,or5F9Cܼ;(dOؐ؝U&lΨFr l D˛SQt J5v&Vcccs3M5yXRwG> w:\9UYPF5s WȽacVyӑ ~vq2#?8>:rG)RTmԩ"4Fzl^!gn<5X71!g:{5,EM_?ms-woZw_0 ruF~} k?p@^OwςԺ_AcH 0 >'q5NDF~CUg-j+a~sW{.˭rZYȁPIU(9zꮒ SI\Kdg3J{t9nJd<zcI\{.s$?0LG5vȤͥ!g2&9K&@<'Cmbύ*;<*nU\H\來0rK!6BjG zl>v ko y`7C>f!߼qX!'=0j|xdx!o~@`-CK\9a9Y9Cx߂ IpBȹmv09Iyszi"8]ߓDHyey;?GfRBeCh9Jeۜ.82& yЂO$u $rH65Hp@6 ι* qȼݑ4Icn9 F.KywFV nǍ<w~!oKWpJOWcs٘Lr@^TԹ\bڷyP:r^hr(|َ]:Mot\C $07(jȔsZ+-y8Ա-]a y庚[!aFʰ x˛do7(׸7,;F5J5UcD>h*f0ˍ\n轭!oZX'f93(usIȽ}n 9Oa0 y^O|-O̐;\@ֳDjD#D+K< y.<3QȗervnϺvM޷hDjsF}{6262bG>CΏ9JbP;\-WtWm34b|Ȇr[~yV򸟼j!K!\|kY{C}.!Z)|tXk8*(CzA 99B/Gz 槻իz9WL,rʗaB1C_Okl uAYT-mԝǜ@_'2JJtW庠5 bOp8r6Dȴ y }rcG U'^6 {Ly]!HC,TB?G:;4T~8&'#+NKxnPZ:'O5u<#*!H8-YF V}^*5G, ꥬy=Ϻ7|x|Jڰl"x^kWsy=ԕa 9$>8LUk$z&W@(Q A'RO+PW:r|%aG--}S F'AhFNd%4!F r&#q\5ҢFDJVb: 4%B5k3 Bw<%m} }Cg,>nqUVZZ҆_ӫwr21(!rPr%-|IOIDATYWȣ*ˍrJtNNm5uc6.CL\! nA@M8sV뽪nq \}CB]⠴0o(J}x>-dQ[6٪T=Hƅp ,P²Ba]vʰOCtE?x;ip+7jf~D_ U˲9FV[lYٸNxW/J=^ird{֩F}F-l53s ÉU#w~DI#L[֘N moYk->r|ĩ QQoa$vXWSކFc\!Wr\!Wr\!o(risI Ovr BƝFS)u -dreQ!94 Wt/(S@V*v]PrnC߮ ~9 9IVVI| gB1r#s=NgJ<_ˏ6#8ڌz; \TQ(}#ibHϋ[ɒ +(7r٧s.(* Zv{QfxGnF\0Qnȕ"{i(C~|舆5pȲ HvmQntBVQ(D^PfM{4}<=rɬQn'Ggi( W3(urEM9- \D^W&#yȓ4V4C Һȇ| /K//vвoݺe!_[R:WRFR;; LG?֎z$뛮? r#<-~4%L["+D^b_WB-cmKjbZBGT*_97|#O'y XjCb]GNа_3%W"ϴo+а%Yh9KP˕r-sVBNUq.< \-~msRmW \\1Ke 9Oʇ\-~ FTߠJ\Qo]ny>-/9,p]cH7ϰeX5vf򡼅?l/[ZwP)O|y+v@ґSc܇NCl{ 7{B|` ^4.L#F>h!J$<|`FjPJ|| -,ܺւL^'mtSnҰP}}K>jXܮ-}K7syH䶵cy,>tz3w Bzz.{O3@׹=v~1)}o3)Е:wn(% :s&wRgΝQr.J?d˟|MIENDB`logisim-2.7.1/doc/en/img-guide/subcirc-hierarchy.png0000644000175000017500000002124311541757132022224 0ustar vincentvincentPNG  IHDRksRGBPLTECo #67<B8caY7ge$ U+)./,S*$88[1,5QP":?7x3r Vt: j k T(32ddcO4Յ7[ۃsS{fȊO{^K]1cg$Iv w^Qx՝3=\zOvӞ7@~4$~mK'QeH$5D&Iɺұ lr.cHT:T'1ɐ:(*kmVd,y'N? *BIʓeJz."aP(LH c!b+ 0T&=gvED`.MeGYTbIՠBx`B'+n$~Zv"ssBm*VﳉGIP:w:2~wEd ǓX:d?O4w*jvքp%a wu$ 0aOlxD-21A!#>֑&ڢ 癴 =TH PK$Mk-Vы[$Pb"J 0 7 '"Mi"5R+;aթFV@A'.Pp$2;=ҷ{FQUPܿ6rWw5ƶ s_XmH,X`4b6v(rF"Hu|P'p3m \CMu/+)h],uul$hNQ%ń iis_u;NRnj$I<-E7ITzc=PnkؙQt&aS+BgJ̫.=DVh>JPV0n\ĴKYQqloϟxwcoᅶȇNϽi:kd#b]?bՅY;VsL 9Fbج=}o)gXE'AN&&ޏPX7v2ß5H7=imX,™wxLYԄQAշSkrEq?3yFW4@g73=tOF;冀bhDV$ `" $QiG?7V|uƮ- ^2+ 4Pɻ𒘵xۓ7PԽ~w# uO>3<ȑQ!= =řDqfR*UԴ> %Q`g-ʐe,G"pjÂ%PaҒ$} pL $O,7[fO0`H(BRaCHBM/ؐ:X6;:4d ՞DQ #alj \P$^AlHH[/XM^wo$HH""aӤH #v\ ?|N76JAh(FIooXZvi١1 4ÓˀL_lz;*KaOBC!&QDz/^\ `aok8EYx"73 @D'qe#QH#h$Ш:莂I$l!^'HH EIr1#,H^rh8=UsB\9sRKEߤ_3 eu /$ǃW嵛J˨31fH;H`qN)W$T5_H0HGGg ֝Z?qBեIP&IA!x`a%a~0m'y /p =ˢ"a JBM {'UBB{!aw0$ZeHX VEnO$XDXzɷfPx a%H763 M?!C"U=? C$JbH4nR.UR<:/ .gutK@9;ɤ 5_$JyU#  ԓ5;T.U&QY`yl-f7{p~$ П$Rj'{fS mcE@⾅2"QE$_yv sU-=pi]6N4.}ĝ%\u2HT4DRA"կZeED#;ӈD:_-Cj>MN~+$Jo\s@M,1;`D>UF?bNhK2^՛vf9HIIDNUj9;ȴjvf ,W0lG -Obrz(S_Sۑ/rx,B+F汵AGlUDMtPzDbLA*f@вϓ  kP" 1Y$yN9YsҒؚIJYF6۶KB(kԽ$ŸfEviO <v!y!)Rk .gVԲvnmQra""` Rj E>$&&''twNBԞkc* Ryљ'cH\vUHxokĴ&(Od 9?qGIL H(`A$$VwAJLB]&Z޳wA&$&&ty"V *V;~_I3 :@c{hz(iJؘF?jB8p4jk5zl3Hl+@4l$^BB*N8k=$h*5磓8A?>E$CblL$xD}y([Afp$==AB᪱USet! l$nm # ڞi1y"nz'R~'"{_lkc%Qwvy6(lcHLit S}=}F[L9gʍIJb#mBB6MmfIH"O$FGE6auJ06a|p6q̳@lBHl,j'wg/<  WK1mH؏yR6Zt :X-{ΏK# < 1&)NT?'Wco {l6*v0=v- 1Cl4*_nvOY~Vw&2˫zDv%0YhmB|I*eATL6aӬXb%H(&?[Мsʂ%{|fI0ˆ;oqᘲ`H=X5DC=u~' [N/,8A"t[D0c6 S( ;dRkE}ݩMlbbfUQо=QsPILLHD]N6(6v/;vs,$6Jٰ qCI7>1N+.XdpW<$o㤳^m"PY OeVNaOXb6c(7``/ ܲnyl;I+.$8u%/ $3g&j;5+?q[~ ֭;ID3nJ"Fc5ccv6K~u'\I+u' 1Vs{{~DkDbL#w~/OxwrH4g/!߿'B@'2 gO-;80P+4'B;0?Qo[^%mA 6'&Tp~~‡]BA1 6ј'QgDXu'ZDHHŶ* _I\$>haHxnLm+"pĕ+MRf]kHH+QwF0U#!a֨l{7mBªN-;X *=@$D|m@BDNMG:$+ve-w_ԑY̩K[&WI( "Z)H6 6DSQeÚ$#=6$j&8$N돪/{ tgRew"q#*R S%`n4gÎ6LTtOC4J<5HbJB;>ajc/&k؄a %D*j-8"nWBHpn#H("UItУ$'dyfמP_[Q:\QbZw2v6bj뒈D$M8¶Iv|;61ο>KjF͊N&Q4G?MN ~p-KrD4A AD]c}#d;UK;呃JhlRK}T*lݘmB{[}EٝD3EYݶ/A >X3'ݓh MWI\(Km$` -$T1c:(%XU]$HAd` ;>ڐPWBDZf# )fpMh?e;}s w`mS&A0 Qnw)h}9 e&F9҆D#۵%h9)faFsgTp2lMH$|mB7>&qwap8_JF$'1~}2n[!NM-G"D$w$#:N D)"O;s81D("'G$&10@݅o t5zHD\HD™):  $ 8:Ik9;x[U_W$^ƎB֓ -! {TGީ5}QcDY$0$/H_E$>XAf{ڡ|efQ7^RD!gW5x~4.PkM ld:.g5^Qn?֝ p ):h6D@-;rB?v،? J{`qD"0&D%"4+؜D$̓,gv@ا`Nl[Hl&xHh)_țe%%/:mIXO>UX(qEt'5N6N6B`4)%H' tGef/a&1 *$*!RWaG,dHBr<0# )%wT.uOWoCAp{N$/663J60UiV|&);BDo/(L#jki6숇y9t}%;AXbH !ph$noZ,;9'*d $u0r$`N_IyS6u'&#i7ꀒ$;ymc[vL{0sc${ z;!%amO;98.AHHEeUI5:MuX1JMQaDP<2C8FAQgG[TeTL3utfTfcj\k_o.~tvsIHizƾoWv#t}8~trl{~~cވrןbONך寯rШXT⮵׼RֽɰſbɆu؍ܫ؋ӧC pHYs   IDATx흋C+X~ZJ}R[ayt.@A"pE;3L2y6iR4s̜%XBDXd"Sf^HN %ڳ'H .j1pU'nE@EL AԟJaa$fGoU_u|ގg*zxAxi*Zc&&`&!1 ki w썢z&DPeLLlzAY@oFϞ0^ fCfq**%"z@4?@7I=^OBH=Kz9K@2 BMR#sVŇ)9O &1t DDAUHXְP "4A❺SQT.we`A7QW/@krˬ{$~gI[(waLjmϦ1" !J2@1( ("F$ Ȋ%tL<&q€-# $>ǎʼ 96{\zIT=AJbG&pX2%8C %EAItwk(R>gY۪$n;^V B`HHH9SA#,(wVd`(=JA Bu l!2mC)V(/^ݵ A#vIs5lkx'\FjBHTGк'rh$*,&%E -;{PU.TA k%$yRJ/δ lĠf1^<&hX&j[A~c?^YבQK75O\8 ŕ SAe¡X Ev0ͧK>Ax7\ ę6T)i:)(C)=_< VZ t)JW/+^ $1$Բ: 傿mSշyH":Uqv\n{U'zZki$`MZEM Pi ,X_O-oġP9;eitn](> 7ϼ0(tJ(~Tn(Y܍#RkrFXtin̂kHNt 4K/-*J|`ZMf텛VmV%b+ddm ]r]_̿] ݌ж܈':mIQT%nx载Bnޒ':mrhAxmJl/7E覞ħ?%6`4cBٽ?Qd Mj'X]? \x,>N=C 'St$$5U vx{ve3;a=ޞNgD3Og@+=@ϟyTII~)l*$GrU#)L6o3^a&zmQH(Nw{Hn9@Kӕd z2x"Kb$x[9^ %L\xw+K$>^W`rxǞh߇ˤSb#țNIoG&'@%R>t_ xN۾v2\\rd?70bjbkdH⛎>6owd|}yݨS 'ؽI8Ih r =;8K!o$AOFKz#߄$O>GR8["5I$"`ZcXbOb&pĘ=%1#L%֤$p7DӐ.?$~$FGcm[D$NBaI$ӧHL(FKª@ED?DB3$ ]fթ o):GiOBP dIV)lTyT, W&k$v^ON@}$P)&8$z}v$v&HHM ʦLBYsIIp' $^S_OwfN꛰C&2iļJz5< >cҒĤ&:>T.#9HH$$pq l2 GI  +Ջ\ r$MP[HڐP; H!$TDBGlgC;‚DM "AJH%K^I ڝ$Q yLFfm~߆ŲF-6֎TvA$TB߽0i8U;$$I8 8S ҷbS++HBf_L%< O0lo$|!LF!#b<~i{ff;& 0rY%hd'v茱 Ӵ\LB%H!m̼ȟ &Yw "'b$>7 e x1[ +1 SɾԨ5MDMO 'a\ױ:v_vX.uqBH4ScqXDl.#˦ѱFIl*EX,'w —b'8D?OHwP,&( OwlI!f$`%Y;Ip $;mwIMƂ0x'Qk-6nD*qYҤ}I  Ej_A#(pZ_:!:62F0l"L-nE‐mukk{kS!QspRqLMģSG"|'D;!ð#QjVTܑssTk։p^0FgP! $6W?GH u 7Ah3g;du//@(P;! xÆ+&B 625~UDaX#1_1+$zAul$YD#ϑwLX[6'qG%]cIuP5mBJ H὎1F!Ա5hjc9b#ID'q[c쬶pHTE"<~!ձcMqB DT8$At^wGj7MlH;$`kױ%qg8A7 zQ!QlB&q,yޖ`HJ$>\QB_meC)&جwrǖZ!K"NI$p$fծs;+N$mB) AWu$aC"f 8I  \`b줍bᙄ-е; ÚDZ!=&- %dCŢ$ķ1N ÊD:x8>!Iwe\誟;;uM=0bKo ʽñNXMwp5;a#ᱎmN>pD⽁D3;caC@bЂěC]{}q}!"1#$HRJ< {; G}@gOm3]n$+t< *?!$}[U~.gV:cYbdETj"_!ka\ @=Q,].CeaM&1̮] apڻѿ5 KuD]Q,"GVC$z{ÊQ,Z&SB'kM^AK=hV* Բ/)51 A/wmlՌJNj"L~1&VI8؄<?(^I$ S@²bB"-H\ 5Kqnd/$)`HXd$NG+wJ0bD*rUvbEmN>϶![l՟H2iulw$R)+'Th{0m@;ڄqY0NT`N$N nbBq9u6TLSoDC_hh$$q[{t~9 NL'Nzudlj@[;| -Vq\QORb Il5Swދ#-WMJc1-\s.]: |Y_ec;cwyl\'VgiGM"WlH2ryझ|_6vwy}b 6$SI_q9gwrϐ$A*y7 #saGn" -N+g{~[8/&-w$91|Fbq$ݑaUYtY@0OwQ/[֊Dg&N/qIQ G= a<߂#lcpAA}+OHY2``#@"t7z>7k@E.F)u;F7NZ8 -I5"&:$"W{[>8OB-8{ylӑM*n &tb/Lҥ؄W^ q$dt)qONz~B%0hlI?~I輓>A|S $\+T$.]dmā)'I䔱 Oۼ6)O) 1 6q =$^k$ ('\Ngk6,F!$ -gӓ<:6" 9L|K7`tF'NMʼnk:QO'L8KqXDSN¤>LS8y 4T`hyf A?ѰklJ U ;L:$El=LbJٝ! z Dy8$H𣽞nH?<)D9L< R4H𣽞 rt\'et']%ᱎt~BDg,0 +)nة$U]=4l2J'C4s36{%eT!e: wmZmEӂ(j2J" җ D%"KJ ]!XGlv|{XWRfb䱽nL?hZvJBNt4@Wܟߍ)⑶̞|5f܎(r@_I8$tc0$zSc8u$ c0$Ҁ"ĩ#a%-?qHVsXtghNȐ_ɞĐ9($Q;ΐXVI$Ԇ, ^L†D뙬X5Ь(+tb4G8I=MMbVI Ѽ9+Ykz0`H7{TlB9#>Z5DpjC]'>ZrYc$;xs䩎m5scCdѲf$ex SvbIЧi^)rT M4ukˈRR@ZRhL#ܣu齇rL"&I$N' }K}ŭfC\rD?1ձcc )C34CҨmɢ6DMHW);ѷJ^pn+|7&% 60>)"рGKA'mٱn#$397LI/~I sM!r$5ԾNƒ8 Nߑ!:@pQϰ&e$~s]}_`$CC\FB/5&Ij} 򞀺G2KF9$H|w׿_#C_ $X1NpYDΐb$HB⑵I ^Ll_fh-r$(vHpJ")$K}|"+t[nHȍ v$R * ;A*k$Hbs9Z8$;q{V.Œe}VTm l <,[~%&!]-O,MdH}9+S0HckvL}?cg{}$Kt1U4; c}†D 7H{:+AUI5LJH3J5L<2CSECOPG\i_fSefDuqcl]nuvt1HGs!izn}r~~rjv>{~xσub🡞ݚNO9ך䁻Шv콱⪵ݮRֽbΥ̸ƽڔƅu׌ܫ؋r pHYs  IDATx C)ª *-Vr="EEJ]Qr} եZ(Z>ܷo3$MS#It~LyF$ ډ {ROAd:#$k1cYn<Pnw;3a qǀFܼ9Ə;0R'7Jjn|)q7u=u00WoamQ MR0MPX%r%~w/Kss#R'GhsJ=0&:E< ؝1G9.8x2S8)Hm>>@먑8Eaa %P4UB9Zzw0s@ |?dCdƨTBK =ŷ&_ rbVgB}No_HQy"[&vK`&G0I$fQy!p7r22ES%E#X,OGaaH}qSxJ $TLC 4NLS6blaKQ-70iph_/iQ8ph)( t i@ Pj~KYdZ;i7Qv9VZHbz~7,PAݶ?___0K.tG~ۗ'K(Mb}ŸQ1 o=x!bO5T ?OJL "~$+ ,̽Ib&\|w*#32R,[DDPB/ uKP fBa^P] DL=Ke )CLX` ?#FnF$ o 'bH=p%y7U! 8S0ʂ(&[nݢ00ĐAAe%DJgdf]XgvwW)wgУdqd8rHaZ hw0-) 훅+DO.pG0;(|8Pe#RY4%-Qc-xH$ %FV.%0?OIo¯1HbNp*Du XxJĄ<+Duk$avnr7*rwoyG$fqd)(]Om}CzZO(5 (^ZMB'o|$I4EOuѩ>4$`sZ= .,tX;o.dP}Ipוx8'o򑫀{N:IAJ4eא!닿ހLMg +۰(X$| T|T:ŭT e?Id x=y{%ݘpx2\cgQ exve0FIh-;mnM;f6&O񣆚ٸjաuX¦b.K^oc},av<~L:yNxo?y T}(-q#nRoFYFāR ,::gN!kj?OlS:?9\A: Cᶄj޾l),sf*ݍP Z~:F~V5$l-fyf :Ok IZc SxXB5HA?_K2YwzŰh %pZ&p);P%_Mhw\%^Pi0SY;ܣnEb|4ܣӞN~)Xj[7~t Rt3U"kC9' eu7Cٷ5?V% 1~EF8$I"•eW & EI($rW"sGb8@ͣKlY&\23L2/A2mr#ur}Ӌ<} E ,1;k8aL!%Гtwbt~:V@RҫY=RibqTJ+G_ٯBՆ=жmp=4,fϗ~mۆKLXA{ҟ/7yȤayhUi./n(%)7Qw#WiJ| \$All2?ʅL)f38ݳ-Ec徔mp}г Se'QI_0?_{$MשCZJivaDԍQ.Jy`ڣ"bd@ws'\,ёxKK80өtz=g}//i 3D綵ĵ OLx\R:i'吾& l%`u%s8f)>%* LrqB:BN-?X: X|&Pô,nEĶZm{țVT%=l10af|B  75*Gf3 Ia 4+^XLn@)U*# Z:M+.dedm8 K̙$ S2,]c{+#%6O|ꈼH !:$LRB%!QRGOep*lCV@05)!I)!%TbNXI 1$KD[[Lvg H ЈD U麓3 5apWag$%1g),7E6Ohoos񭷦*?ZWцfuEVckgMj]Fj~_,.X0$*\ œѪDb#_٨S~A{%Vu]Na跓Zl4*Qs%~%qJgLY*9KO~PƮ~<)NWb 蓝69_H:%JCT8RVjD'F̘g%>@C)<`qUVÇbPJ@'Rȯq7 5ONQWyTDQndUUOHh&F+8UYL(,{RV"?0,CTl$](ZbooOJHO.gT:1G <ӞK۷5y[?i]"G$ڞۯ% f'$rX]mHL S5VJRI 'Ĕ6K0)NR҉N^_@B/pHJH%9@JH$K Q$K Q$K Q$K %~ )(IOp%鐠\d $ħ>rq I=&MbXز=J+<'QxI '/.;|pSOXߥS=H0u')'D* c 'x<6ǥSG)|+ ]"Hݞtj SHP!zY:y^5-`4vMÌ ]LxY:H'*|2S"&O^OxS)MPK]GQR6>!ڂ5$!O0!zDk֐0!J`U~F$pNX%㥄"H404AJ % jE *`H  EJ,>)iqDpz[J)SNw %`Co7H%HKP%# )Rs( %f=Q.)x)!@oÐr+r/6h XӋJ%\MRBJH )!%DH)!%RBJH )!%Z^"!%d89(3HuJL[2O_:dy&%'֪R"lmHzBLZSϴuZ$B s0SÚB"ٓ02,53S֚'@ Ӟ}f(%|NbKO[ YݡHp@wDP'l)J>BXTO|CQ7It'sO]1 ]0c]ąwf0Tom3dn)KTFT$U'n$:-DTi t:wf;S5:^.aO&ZaHy |tK'%vynRy]V'_d8yZM.%(L2墛؟\({&1D5.P> ^ˎW:U("/z& * Scj=lO=(.?wILC'3+qweUgj}y""ky%;Ńoያhўw=X 0$) XpF6+xD +%OK^Z{%Q\[)XHZqqFO\9$l⊌pbpNXGx[64q :]6p{i}=7kc"$ghkXp~Hܜ<"g~ko/Fh0AnfΝ{gf(.33"3rP^kܹDΝ?'#8DNIENDB`logisim-2.7.1/doc/en/img-guide/subcirc-4-tip.png0000644000175000017500000002106311541757132021203 0ustar vincentvincentPNG  IHDRksRGBPLTE8 #^77=EVY6gcd U)//-4V% .'/P6-P :G>7}8*@HHEeUI52JBLyMQaBP<2C8FAPfG[RdUMe?roWh`lduut1KIi{ſnXn}~sFu7tn{~i~΂ψ6U׵zb񟡞@ձY9ؚ䯯Ϩv콱^RLץǪcٿ`يכ}؍ܫ؋g pHYs   IDATx흏CH"jZp8ע`-w'a"HZy731LI6)I_M'yy J$z@})D](cK89F6W_6nwh_bl;9Șhli$2ok$vomQ0C2z6׷Pe@,ⱤHxbBδ‘EU@H>K:i`3hʼn?ΐxx&tQ8*4y( Qb$|pctu9=_)HA`%.p#Cfof PQh$ڇbW'aݱ${= wOL° DD%aX߰D(%GF* ''Ŀ:V#sP1M߀=CQZcטu`I+;(tKY1ِqQui,HTŗY%Fc + )ll V."cP@ : Dʎ"U8(  "ELŕ+V?)1 ((:]$ڼ93F/Oz^ r+ Ɠ0ĒdBѝ!&APH`AI4t0m3g" & " NLB$/#4[/靫7zaMΏ_zykJdFɧ#Up9,-eHT`ŻAہ6#evEĈDKe(4;~uY%ƕ+xdB;P,Cb.0'b >S~+-8GT`(IZdJIgLfyTN?M^z %1IDCGQUo}>N Y?FV$T`5uSu2Y?'TYfW:#+g^$M5YH {'R~;,įȽn+$$_~1ẠyǬw۠i#vd\fW Sɫ-U N 'V CGǖ* UsqRRʃF-k&=-B]/1*#Q8`/{ad-| ʽw…*Xӈ IyB/%ANb[0ۚc&XkpEY;w-Y#{ n{>@hD ¡Xϱי)a7)fp%TNtrfsPR,9zq4N> "[EK*AI|eHPwgEA [-\va+ٴ-Dcߤ IRN,ZF1Sۻ/HY$0Z;HӣGɤAR nIĨX=Po:QWo%,[·طLu$6ym6ޕl7\S jf:@B-zdϩ.Ker)Mm. :Ndݻ9kS;DʋYHz(ÏC )Q[ u?k^#}miw}p;-'Dת`!顼c\I]׊H?cC)+7#ŝV32n 5. XȔ*6e)QU_HbճH(NBDbqGpz?$"Kk,aȡ*ߞ88 T"Kg6`ʼ+$\-_gc=v K$~׮w%kPnuo{>}輛ڛ/->i#HbV}36,!x9:$XL6Il}-"mER$9 Q]@b ĐY""pal(fu:O`L4< XWs$xfּE{JȈfhD"Db,kx!: V/CCdǤ#YCL #(CCk! i4 l* GI  Ea,$\v$E`.$4ԈH(∭P\Ht6bPA$$ ؊XH'KHt)r ڝQ uLFf뎚Xv#DmQxlm[kGs[; 6$tBhW `Ҿp$ʾH('@b$R3EXIO^.;B"7kkkzL"\ULU{c$x,~9!G«ioh.5 6$v1jHN$ zLžĮD Yqm ĘiF#]~ C䴏̭ؔ `P@$y*6Ob041@H&ې6 XXh$Ij6$$6+F4.NlciCBu7D Q%Q364DT`q <즒H&4_HT $Dیn94\XHFrGF"9+$-$65M36$"sYulgm &J9< =[XXNw>* D읆o ':d5{X(Թhr޼I'LbbԊFYhHX$ \i/v&N~4 Uy#8- ki&,&( Owl$$HG$ m:vmb; ҂#84psؕbIp ,$n˶;u0$ #+p^H{';Z;DmjzxA၄"$H g 8QkGfKf*c扄V#4NW|vH[TIC#xKs,t x@bqvW?GH E%j/XvD$"ң"PN'H sz&a;|j;]Neg.$,6Yx؄/ưy4ID!N 9 v6c1I(zR ⮀ z;$D u@H(:qHpbosTn2yG[ dB7Ams@/f?>Ч$ъ%~.$nJ~ q '\HL8 (D6ZP{X I;$&T8Fb--gE c{1aj<# q z'A5j'O6oHc Dĉvy'wxbNu F" eay(8~{cM"2 qۖ d=Nf CcI."amEщv'k[ktc;@]C"J-# ZQ %$B?qw2׋ L@$~Ѿ9\%`9%eu;~KAD6=X_o$` ~v>(A F@bu Z3&12>BH*?Xg6U5MbD7(A?U$F4xxHH)nX%;R[DbC`554bC"ul籝lbƙH7%A MH@Vmc;z!1NJ=F@IA@ml7>HI( z1JJĆ溂c fZx0;X%mY=KIB(($) ĈMllBo.ו́@$$v#C=NYS${"Re3@v/,p+;b6{pvٯu쌜MwмӑLfe(t::v+IfU@ODF%NëOԥ$<Qv>$:* ;OcG"dx'yༀM=Nطv2cGWFd۝̼䱣r6MrϞ,g).ЎYN |7{)uֱEyl}y&pNLZ''VK&Hv=%/$O啢L;BA@cA&?qlN@%r k[,?;Ϸ畩:3+R L{-;$R锃MZGjYULl\GW2HԢΉyk !YI$"WiIyl>F0kkۖDGſMHJ0YĹsѱcMܹ.G90+;$OԖDLsm}ł8SZcFksւW*l&h1?fDv(7b*/?G&.۔D1ߙDP$<(:6'6A; :?j]|[:Nak O{M$O)uEHO)0 +)^3gioC`1HdQل(ok iD$Ҷ$,@PVy5Ą_I\L*Đh$/BأK*MQJ6 oX-6z~KnͅHPԱ=b !$ K`KnM؎WR;gZxd$Fll+)x1 O??aGKomw~U6c}{vdmI؍y&9"Z7D8tڎy&5"iȐ{w*(N o43gÎ$$$Lc)g`*N2lNrmDU`A؄JkI~ e]G䝴u''I>ZƙU=݀"]Cb7 'y? 9y'1lN5$åˇ6JHW )>3X;!4=m~NR*:a@A'K@b[]ejRbTs$duwrmw$9"Z$v<ޘ(b6\:I~ T"fTbhGȵ: NlKh.D%nm1 Y?'fxGA$F˒-IL6_6"M Km.NHf3BX-M"i$>j;NI(G\,wwG K_DL"&B"cCj <a󔠛_V'Kz)d{!Kt,C^O1 ! &DZph?S@ELBHtAd>j0x91Hh#񻖿+SF/u3/OZ^fKR$"dJDH$c}H&bQ +$'1[/xID;%QAbM$b]C"c6DLœ ֖EH-&a)#Hh[E$$2F&Eg #OT=4i1&a=YլZ2< PyDP$2< :y 7h P kHO ̢eyvHq⠿D^M7>)"сGKA' E*䑓JËDĨ f.ȑuA1"saTe΋5txDOt ZN6/[%q؍h0EkA$A*5YuxhҴ'l$8lAbgB6!G"Wte'D˯$2D Gb3YP\3 S؛9XH`.Qcna Ds$ Mp'OTr$:*V^Bp58H[==vb([gc GFg0,X$n>^\\(^L`ӣ'ob(~ASs%%:Aw X􉾾 +2 7-^R*P$x8p"蛾3 3 -Uhx@IDATD߅?IE;_H#៼k$;=DO;sq/==ĉ)}lH9IENDB`logisim-2.7.1/doc/en/img-guide/subcirc-4-done.png0000644000175000017500000002124511541757132021336 0ustar vincentvincentPNG  IHDRksRGBPLTE= %z7_7=EVW6gcdU) -//-'.O4V%,8bP!898>}8.AHHEeUI5X;Mv1JMQaDP<2C8FAfQG[RdUMSbe3vtTh\kck_otus1KIi{Żt!oWn}~rlu7{~i~΂tb񟡞N9Oؚ䯯ϨvXT㮵׼Rֽb®يʆu׌ֵܫٌԧNC? pHYs   IDATx흋CJO颢Rujq[EEˮ"R\A>voL3$iB%IzΙLP"h%TikkK$p(ISldn#EVZYD~e~\L?-]M244\z5C$M^T2VJe,"?)ֹTl=ܭh*uZ_uikh_4`?ɸ#[&F7n[$VIlX#`LK::Pla"i0vb3. c¢pFA1Bax8C!`#u$&W8%0$# ;2J$D`tKTL0nna2#25&lHJ-O<'Lkr 2q0( DPl$L5P%sp9ۿB 8߷|q DD%aX߰D(%GF4JS DQ9N+U2Sߤx$@rά{@S ?6QDx$0L"'*DHD*WdT2y O<+w`èf F$ԵޖFE*4aEy{55Z%2}|8젓._;ہErxۀ |:fPn ;l^5 )EJNV_* 0]T]snHs׷g /@I-B$xOI_YHۑ,K JܓTF2MӞ 2Q>7y$Drn'~DzxB : ur]<@bCd@&f2*,^iV19ʩVok(b;$fH%5"3 jTCQT..~VHBj@ t=vxwC;Iw۠i#vd\f2s|02 N i<1I4:te`bZ3 'KYjByu4b/{&m T ]'$*-ݫ1z'DeAj#N0v= Wp <إOeg)qsjDxtn݊X~bI…w&S Z-v <W&q(i91Ae¡Xc3YZiOf 72Hq IgYMCEjI7YՌ95C=Xx΃ \ΐ LZ񯻽7i_ƾN. R'$ y2iw41*}Ѭ ,lo04{i5I[zN'؇:vyv>pv @BENI%!= 2WT w2'DJXŸIԗ~@67' {m=qŰsC1>.BBb`HDǩEުu*f% D`fax|%vRլ?})gU84AD1)EbwY<!Uݫ}UsU|VgC*8Xr|%1A#rmTfIJ$Tů$X‘+-LrX‘3 %I(H+9c%{,aO+UȽ?zpjuHNm*, "  c=v K$i%f).q{7?}λY?|:6$S/D]5t"GPxwoO}_L+7O+H[= D@HlG? #˿r-Otyj{]@B+^'$vwwtJ8ˈdqWNdzdrNDf^)9qL\2k~n>, .]##VM$vA_6]7AvAA5LO,{p˓0 Azvvw/J*py#-==?pv#)-GJ$$`؍ID&bI>XDU͞XHb G@k2@ⴘDː!D+(bm$ZY t9@1 $H{QXK©@ |w!HQ40& Jz{uj[D|+%@], e)R,T>3Yw)!r{9:$XLIlz)"ͩMERliaqXI0($HlNP^M/M ˓_< O@i9xII|9em=%o kTQ:39 C6$t^ȎIGS@bGBQPlH($"HSx &=$te&$PD(bn$5Mm˖lB҅D$qV+(}.$PA8D$H_@$q-N/$H龜N8Fd2*-hUM.$/5 } Mpo$^LBG!$?F&{k(q~$B5Jb)&xfōHU6! _ᑓ3, 1ù~߽guH8;6s#m=-!2^f-^1SE^`Hkx0XI(,y$<ɓP9Ȑ f77ya{;& aWHI  NM%O;Ba  *aJƂx'Qo/I=[3(<0Y Dl |нF"jlLa_2F0l7#LbMXHBH|v8ID!N 9?E$KbeI(zR Jj=y!1$D m@H(6Q@$8?BbȉaF! P/rv[6JpL%c|.Vj$FI(Frb CwkW;ڑ vHH 6Q`l"8!ҡlK% ;P 1N&TZwHD Wc:A"2 q$$qR-H`B&}8HX{;FX;dckNyCA"J=`|9xA67D{QY>NbP6mh$>{ x0cf_;I@"8]ad4?`o޸BF0$Q,4NLNԪ,dU$~hS;oԚ o?c5 $zZukc&ocޏ $:x!$LEl-I=&@I|A@풕o W$}{f&D_v$ae5%t< *&TSH{eDsض$,Nk7=?QMu,\u?K a7 mNc5D `f.5ef,LuD]Q,cp,DooXq2+ %H؎y %˓0%&v.=, Զ/)~']I8y A/wN..嬞[h"/VıaHs6a؄=?j~˕.$*tSг'VINcRD:$i{݉-ow ~lƶ#ޞнS'BN&z TXmz̪j0^D*=шSH$DݩIDSPo#!ǎ Dm!!$R68a!c܏q\HDNNYf^N)Ilڄ -wBN~m7zaf{s2 6(-{?1d{T:'BMz N[%+Sdgj_wjV&?qlNMXb|muĪb2SuJu2yr$Zđ87.(jmU\ޯ8 $Ab@t{O({cXn [Đ؞0@0wutT^{; ]]&p;Qy'G;. \)MBJuκne#$b zcHSH|_l=6$DMy]d=}蒳wZ|]R6PoLV6ե8{6:6qI=ۂq08 Fzu# Ip6qMX"ufԗI п 'u'LBh6@O4DIK.% kN~"(w!aOXm{vt~6,+6M(Zd`tG&l%puD`j`MSSQ -?!BiU6t<ҞhQ`(1 /q$ IL"h#)bP&HH7GB QH4LylDMH>"zDDYjlK MӛL:d ]DMk3$GRB1cS%e1&#){9e9GuJlj;{EL#r$?BY})_:i;|ELDK'q i~H e'hOC`1H{A3៱ #) P|,*6QD$z$̏@\U95Ą_IDoo%ǒ>m#m3x &D'TZ&Qh ʺ+;]A [A'~*{zPYago7m>aːxޱ  '9? 9y'1lN2$/cjEBB]|b>AxĦoI][E'l8L|_HlX;Llbh u|DnNN$GDdN5ƎOĪ02N=.;?W!!K9>=_{BII'W IHWȳIIWǠE2\/eG>j0x91Hh#-g-Rf;Xcb%A4Df,I0)߿&G"pPid/&.BL"|}crw#6K$bI$ZDƎm"9?N;=t-85ZL6SGFв$| 5rv0Y@m_є#K*NҤw`Ƙ}f喳j4;yl1qeb~ 3E](T?\r uLoVY0$z]Q됱  r:Ĺ,E(O~" 8]#ىs@"?'rXGJ$ڎu%4?e#[SIENDB`logisim-2.7.1/doc/en/img-guide/subcirc-4-delve.png0000644000175000017500000002224411541757132021510 0ustar vincentvincentPNG  IHDRksRGBPLTEM)m7!a<C:VZ7fSbd ./,U' .4;4-5Q4/7eP88&?|7HGEe{=>>KsXUN46MDMNRa91B4D@dRQeI\+qpehBgWjaSfmbpfqsusMLiz=t}qX~ois~ã|tz}+͔Hs76`񟡞ٔџy뫰^ɫWֽkbņ̩׍؅ܫٌӬ pHYs   IDATx흉_IkX<d3AF3 ʱ"ܵ}UGUwN_oUWƺD+uy͏3KዜՈ.=-ȄنS1w5WFGh2*u'ch+dD,FQwү@|dQ`捝Ullx#3̬_ٜ[\Ap$+3fdHHFEG'#־LA/2'sO/]AoV bpIeJHfDH Ά [リ ^sæ$FGn]B?ep \%&шFT 36VX A rs2!15$X(f-䥥X!sfKQ, 0#AXf$vH&6 ay3&h'&3MM H,9 oG%Y<"X9|!sP1M0?95eLb%1Eaoqjֆx`AbE3UKΪBsjk*w`vMe[?tg Yl늭)ޯ{I.nZ4Mkt~۹92QeuMuo.1&2D)TQ(t$x" 17esVa)&@vó _}&_ BYbd2l18^Ÿ[3*OLb5~7]{ӝa*[mc DU(PI0*BG7= a$ADQLQ;\0Yu%{Mo2o@pnԿJ{h$&O˵hCbuV|m a3B(r)DU2'6'4US,;a70$TR ɛ$.mPʫ$V7'76ݮ gJl$&oZX"&q 6l!&_`ݔ(.?)6ab(gQ8#< qܑ}̆!ՊiT?,9ze1$bcBF1:|+١N*$$^i5;Z3ֱg2W-jJ('acn*U,o$zZkǨ!jW-Mz:MmZ`ɣQ-y6&Qͺ=G8pLmjzq\GݘV]ꥏVيGl(> azmҵĨ% đn9S4BoedE)W'_>:2bZ۶4 sA!"i4qg*oG$vsw=ŊQ/J0%![6N Z]E(w(=(L1Xz56-#^ȦYj)*#Uk5*oZD{X5gJ?.Y[C=\ױ{lz`SphC(1?V!-v hk`NC 'S4W#*8P˟.or3٬l~0Xxug7#!*|}}2ITT^]sw鱷q/MmU4#)O##"]Eht轇o㡂zYn(0.`g6tf2 _B'DO\7O-h\7z\39hՌTIo3%ޫses]@B f;$2锘qfy~NNdH=29x'm"Jfw}c_ԌW6k*Ct?ז f W\w Ɖo:ok {>CF>jX`&x'ȯ?ӳh>{,=N}`H$ɔP_}ө$FT_c)-_ n?!cO$j!i&hEmwVTTI$ZH SI 1 1"0#!`IdFBbPز9]B3$&Q UqDr]l:-D,~ܒB!$KQ&[ ǸKQ-qAE[Ş֫|Ֆꑶ-IR$M=aQs5;$LQUzHllHHWM &LBYM P= \Aڒ+Jի~MsJT߄Cb sv* M3LHQ,I5сČ$EdBB2'Q( `,+"$P P$$U<#"8! j m6$ﴗx'$*$HT)J p#vQ)V $AJiT1P$XXdNAh8Fȳ5X4X00Z;*礵P{hADP-m-5kE¶m<<H$Dس$$hLHKH=MB"Lb33_XNN*U~{qes>NDBwη iR'Di"0'X*5? ߧ:IHh$5NHߊMI,,# I!Ց98!A0lm$zvBxoDx2"6핶gfHp$$֊Z4,NlciJ!&aX.xǬRHM [mm=* L2i( kO?ftˑb@"/F81DV!A) *zMHE(= C2ֺX`ֱ{3z2 $d"WPSocqXDH6.efYy.bkJV+ ++;-|8qBuN 6$R,&pI5@"H`%w) '(ءD{DY7$G(;|wN۝B%K=,V'$ GP+PzsJ;Z;Dm!_ˠpABw; !8h^{Q8#Vq/-q36sEV#T9 D3E!eQ&EGBrCb8Iq˱&A:2 by&ZV\c(R88(btY#leŴJ"͑H:&amHPHw LUΎA7&0 ;P,Vl@B+cM&A 8DlvF DB'Z"!AQH j;$D ul_HH:vHp$?5 | ­zLD-GCB1 N.Hm CK>WaFUtتH '@ӸHz"Ղ)ggS;A@4!1@I+$jAǮY :حwRTm@Ā?$ _ℨ1%1y'a8$q(;/4'P$=(;:6 ck0c{GN< rDZEylE* )VrQeUtIbjrkJOG$'afE@k 6~$2EW`2It* +g誄m-.H|B.H".WĉD_ 0.TRP$TI)ZpI"O EH)Z:)! Q}¬ rk2 DJ,I?AAQ茏$ 67rESJUh;1$O$v;+I8͞"M dVHY;,Y+ $~i " g'# GϞ sw@?@NKYP{t|esIgy%qBIϑh(H+)Z+N]d t${p$0e'f ㄰#f$6O! %dCc$>Đr$RwO)Ktsz(k;i$J ʽñNXMw5;:vy%}ԱM5:M2K S NM`4b/&2힆5AHH=_ Qjyl1 >JH,.m *Y*T($L, yl$摜55!}{nSE[t$D[D^;D6;tK+sINXh{XrvD~n@8W& ZOnZ&j0bኄYjΝCh- 0̷e*9< C LXp!=AS>Dq8 v}ŽPUI @:J9_J#d>ў M&Ԃݨ^%ᕄX_~E$NÝC߬\ґ{I)$ 9IB o[i.JZņGF#6֨ьx'h4IDt'B2\z2lBgbj8njDO:Mk1"Q&V1P Õ cT+f܃5jOR;%1:NY^TI60$ݳsNl(WM)C¾>zOD;̞鮹APb(;'-l"P$EBݘg$ףcLB ׯGix'qH񏳠eP̨^@#q'z0o'7#qxW @8`9; ZF1%ziB(f$ώ##q|.N6l~B!bkcI oC9$LӔ+m)J2ِ)pKRD#-c%a❦\ʼnH#}%iS&=rNg*$?6$?MF띦'^m*I-qDeQ Ǟ)VAK82%1|cSɸIf|9E9[JxN #E6ãCL pJﵔȚr/x|K_G/%$M'$IuN3_9THB~\q+$>WR*?2߽`0!)NN;ܝ_NW%%Ṏ~lIb V)J%) y+YKP[h)Ud%e e'8$(B$;Y+a.sH;gkNqF[, ew9!$b `H($ڑ;q`m~$3hǐ|3$3’lM3Bj:MgqeI0$d^Qf[6eX9;1 v̳CkD/G49HɽN?zLBȑ7<6<MAIv3=G $ ^ %MV6&6PDOQi쉝M\@խfD$#aNXjT%óILFBy暑M'"#q~vlU "hT#A;biāP&.?{ؓ0ܿQaDND$Ccv6)W\*-? |'cJFP~00 eʁ:|{Kv$x8!o >g|~"(u\$֮_8qYeOOTK4$ ?F6 c'jI}"H5jWPm 7q:&x& hl"WRF┗_Ip$b>ԱC&Q+)&^ۋ$(P+_b*0]9&1ΐ_I?B$)A)\.H#BzV\H+2S2m戞NJ!J )9{@uRFwRE1 F'BC#,0 +)n֝Sm4jFuم) ̯ل( ҳeT!eU; ^I^I$etր^I'&!R֎Y q &٥K+{Ig ݶ;k}+)VR^K5}qT -z X~ԫcx%ES$e??0@ ," CSЯg86Dk~"WRT|#!F"PO@WQDvIRjB۳FD$FSI@^&D N,GREbM+$O$k%2$A?s 0ijL Q 8$Kt,CkFP_ x5 .6Ad8%#kLj zLX$5}V~6'5x' V&DB!krt:V?gI2]Ѽo$31l=Q(_"ӯ'I ^Ll_f.Iq A}!)6PBB9NENL1 VI GbNEND ph4nR,);Y'*"C/mO,k~qbq`˯$2D k}"8"1I)u[\c~X댋Oؑ`.YkbefI6$*ŵ ndU+3ەbWQkm|1ɞ^8ёu%h(Gt*hdt@!1;p-~z@MaٟP|m`(j.KOt|$(xt< kE(xzRjkt\"[?]CuW.])ҕh`IENDB`logisim-2.7.1/doc/en/img-guide/subcirc-4-add.png0000644000175000017500000001716511541757132021147 0ustar vincentvincentPNG  IHDRksRGBPLTE8 #5a17PGMW6m U ) .5'/P01/S("R :>7G*@{:HGEUI5@2J>MxMQaBP>6x<2FAO`fG[TL^fAsqWh`l$|DCuvti{ƿnX~s@rn{(~G7~\u̓?і[`ղڕPJⓩPm׫ BUmnrq(> [@ 7}z"ކ:ZW^;o"Hٖ$P>kôI׆NhZ¥z. !aQ 1KݏWehH6  (IL솁,4U+  N3z XPiZh*9Tc1*f\cD/$$6U E^%Q _yWHD_R#W HD/y#r{~$|K)퐯f>}:^+۟BRt6aJ 6e;VO_u:{8.&AS-lI}:q]?~Ἓڑi6an:և$>W6TU-lI9).t/l|ɿ_&$j$]{I!䁸Sʗ;%dJ;fqv@gg|p8Sd_:οŵ=S'fJ0KZ1 ~Tq6$~lxݣΔb6)}{K%zR`@q<R/TqVk R<bE5PLx<뎔nmKQ!ť(hzvjvJ8)=GMM)O+gJHX(FHJL@1WM[7?ς rx$JdMOIS%; x<2=x'm*čtSZxΜ[ɐ8(JڱJ~ؗfCSّ)S7b&@~zܩ,y\LHaav<0%MqIOB;/7(fx$ˎ_ZL*0?/$'P)Rt|H,I~ #Y$|aR$O")=(S)$/ϐޝ&IHg$qmgϞ=$|O룠|Z"I4yE8 $- ]y"w&"fD;ZmW2E@GieD5 'Ih5K+dKS=cyKɷJE\.>kE `nBױ-[ewE m?0$#Z٢QT9o˜DIO04 \ȂS.<5=%C;Qؑ#6$,Q P!W$@ 4#Q ^ q ~'$w&8 RH $baHD$AP#Q1[$q(Fb}}g-I<"aS*$1Ć2ц#u습oRId)6E[ bdi#,K.v>jv@b b hiEkGyv76H(#Ѫ} b| &Uƽ# #Qp )$.cܧ1$4ĎN؊Hz$*$H5(;Y$87$(]pt$I4w4ӈ. =wV#I=bцNN$b'vL n9IŠDіDn'|`HtW *48!IBFH ?.Ht ZD&da@ Ъ$ btk"QSj$~O$׮]sH}C'w}M aN^ !Աܴ:_IHI8!IH$IG$6$m'$|4Gul[kɴp^mB]t96xz懷Z&}H $"6avV PM짽#f3ID;__~n+!N*m@SAq`g_pS&`7\H@kq┣h2v3@ke'I5$mD;yiag8_WtzVޗ_Kk)U/nH YǮ; $6a'Ro/D 8_?&G#f@#y1mpAGbuqbůg/(Fb3^V%:^NRN.hPHA'm=_N_onD{MH6@b.HIuD0Xc@h$~=E q$ We'IQ %ڄU}7\S F$ W$Djvē`DcyG"hIom9 yQ[Obپ- &ֶjׯ/l0-H-"qbMvH7 IBgׯ;Bt ƕ;OQ=_b봂HnHu r&bW&X#A8OTR&#a*;3O5k g?QI\yLI½M"DD=EnZ l8ѰM蟟0{Ft$uت}aKH pCwy'S- w>͍xIWUHfl'0I6ix$jB#$8I3$c-%$-.l寤$Hu$ZJ YIl+)M4'f9~vΖtwV4i\gȓWR`Z((Iªە%*[ :S{et'!I4B"LBJZ'g)62. Iaγ }3YA+ĩ$L7 M_I]*LW$&Px\<::(BەP` 1Q/@lQQG" +)?X?bbɜXOJhXrGc⑈͸5b7t6q"-'a3Y_I!#Đ8~%$aOH$Di}$&Z?!IOE>I$|CbױM_"]% /Il0N$f %GY^4rh1~ehqz@C&Q`dKWVqNZH*Ft LI5)ۓ(4_[)_C1k4!/HNz%sNB[y$-&KOK8٥ӏth:f@B/66YMj6Zciɕ=$F $B!ЍBxrKO_"H$-N8ڽ-6jv bN#MH El/Ҳc}\{Fb1G?;-!D8!)JMamU);HPoёX,{@:uNOVEeJWO$j֎~7$ޑ0'ϱmkW+Ś3N~#=EGLD0/NDU)$Hed7Yjx1$1?|CDEY w-A75H]כ,dRwE5 f)T^x}UQrR =?=D +hQ=3) 7磖ɅQ?k/S@ DkOuu/Iit8C.IENDB`logisim-2.7.1/doc/en/img-guide/subcirc-2-done.png0000644000175000017500000002070411541757132021333 0ustar vincentvincentPNG  IHDRksRGBPLTE= %^77VIOW6gU+)//,'.O4V%6-,8b6F=7'>}8_6dHHE*G8KuUI57LMQax<2C8FAPG[/fThUMe3vtWhbltvsGF1i{žoWn}v#~6rku{~i~΂t׹Rb񟡞*$+u(2Uݮgvm0 Wx-?$8fI`C[[`Wѥ8 $o{fpXḍ|17zf@rd?V|̰A%!Ӹܐ*.Hl˓\zg+lb!%HÚE"&/j$^-ޟe &< 螺X WE$ɦ\)xޏFQHBJ͛7eM$&I!1AӴ xx/elU J i<_O⬞EitlɏbJ5 'RP=aAF[*Ƴq❨"$*w5d$ʃAC7`jmMNPkX4biHZ~8JD]PE[C=jv7~ZrhAOan^l^=PZOŶ(_N~[e/YF ^T`/n}gJt\  r2K'qU \~Ad؄ʹ|5ףl~p t {ѫ`V3b6DeoV DEU?\ۺǦq/ś l5_5b/Ż&6Ehtx^=w tukD_tP-s\9@K߯2KAduc ؖ㚑t$ $ ?Cꙸ@1/LI`uo H(kDV×IČ5FM5;7;i;Yx+SnjrqLz`el\Z.ƲV.F^]#F_t$j`i7ְE75pX0=g&Ɠ΋ȕj8j{,=NfHIГR\Op䋡%Z XD?"E-"$"~KG4U9{I{@I{ d*&}$"!U(0? eME$\ر GbGa$6ZV%~8$8B8&i # Bzsu*[lDS(mǒP dIV)lTyu* +u{@H*Sc{ 6 ¢SI0($HoM 7I&,+71 AƓ $8OÓPpd,I~!sJT߄j$6)@ $U;Xs C&$T^Ɏ G$@hbFBQLHH$X^$` &dғ@(E("v$v.pAeJB6Am!ğwrC⾈$re؆Dk#vAD$J"bݑ$`%@v'ITv!2U!~H˶ئvCAPQI|NY- z'$)O4!,TLQ[I" QrZA";0(!HQ/E$@jQö/3N.$zxetppރ *JHtz'} _` wG$IIAx 5XiFN# x! b>ҷbS$-Kx2'$]ư̙!#]b&DpIx8шNyI!̲sF;O5&ъl-wNPul 9kt pAqN:UhKvOA"8-V5dGBaaG@ﴓ@u$9EhnYΎ; jE`jHFbkgY}sZPc]'\#X^Ǯ; dk'l{N$7  e!M܉H"(Xx$GVẅD; } QH&RtQV }MInhcM@;U6k;R5"AV0GaXdݞju{lЀh%V! 1H)$$ihj~~08$>ڒؿz/η_us}uĄ fUxAcIZζ|H!a Œʃ)$ ZjNK.W8NI.;m|`I:Px[WduKx} yl31$ęo}u!ycI08yu v{}yDB`NI& $,b < Q,wj{@%/o$ f@L٩U$>$ίKR!-k|?U_ `Gp< O֬*J}Bj6T~PMIP O$$+~b5ʱDf,$eÓRNI ymc[>mKBH;݉!1"PHfZ$4M!mJ! ̎DBXBFL)BbD&!/Z(nH4yl>ellȗ^8F+Γ2eZBc[E=9E^Ia"ZlqԺDj‰MI63a &aϳ=pbj6b ȊDc &j0byl${(75v (ձhviъGBoCM T@k]_s]ND =b믻_i54bLMhLlBmvwJyD#G6!jwd/$\(b{مSLbQ0|QqHde~<6q`rhDfX,7 6a)f#l2N ո+,'t4hi[lSw2%jw "D2N0NMv.$Gqb28_ZH: |_h7X HD!dRhN|kr!nwjHJ"wV}-ڐm IqG&lŋ&6!"lC>E$XQDӇ|HXx'&&.$rCٔyJWzwuDX ~'F D$#$_J义خmHx#q ~'={$M(OOc=E$|"s0$ӘōhC-$5sglB7k'<&  O8P$֥׉ 1K8[kF/FQ>nȧ )$]D9 ݩC>E$DӇ|rH˜ґXm"( D$ ;ЁM%?q:I9?!jP"$=pOH  M\$nDmIyI`xE~ToD$/;Uɸ ZQd( ^:ܗbR +) +^Eׯ|m A {;O`cK?Q~ߧᙄX@"8?A2#O,<{VxI X0'H<'$En"^>DglW0k0''| $iM1|be gH>I Hz6Ej.w'a8ʾSHY _e48]oy=4%ynmI5"#aHQ4M!D#GAC$dk3n3l’8V"j%ڤp8! Y\pH´蒢vI: R>EҀ$>ɋrfwvIn@96Ez%G$ZGtĉP؄UIꔲH3E߶ A2E*?$@Kx ]=s:unw {I9q c1W&d? K""F y8%2(Xip#_, AǗ`r薱{?HX?mVs Hx60>)"тGKO{z9(O[68$tPk8wH ODb-R`$XCz.-O x! ˄D usF<|KdߔD-$o%w !2 VLJe_u$IwLa 'j/&6׾لg\oL&$]-H$0܈9S$>˞) 1 ^ aCTx'%퐐6!1&"6 vFv^.Œe}^j2)L=e'DU˯$`D S%lߞ4'1ߞ:f'>1.UہOؑ`.Ykv9, dKI6$ؑlEI$[*nW5^^q)4RnZKIf:[lH$==u(1w.DUH1OW\r$d/ g(t2"3H&=KcI/vgI|>p"ҖD" MLA]=C1>ӃI\NǽYRzz&9GϜBXWי3M9tu?N5F1IENDB`logisim-2.7.1/doc/en/img-guide/subcirc-2-delve.png0000644000175000017500000001756111541757132021514 0ustar vincentvincentPNG  IHDRksRGBPLTE= %6_7TGMW6h  U+)0/-T(",5Q,8d7P>=7(=y8`6HGD)Gg9MuXUN48MNRa91A3LDBBXiUMM`]eTcgDtqWjem(|aquvtHGgxžpWs~~oio?vǡ}y|~*i}̇ʔIs76a🡞ؓ5☤џv즱^ؾUֽȰbmӌܫۃ،d5 pHYs  IDATx흋C* Rk^pA\Q˽\ڥiogfIfM6Y#&ټvrΙ33IPCCC]X_)M"Ӳ 454N +iq.O+\My(*L^"D:הK'q|#-vnPa^fvV6nKO8dFܨ,P (FL#B.(*%o0vF`2a䋐E°$\P,F,M)OHo;PWLyJ@LBDB4X]M<#Î7!(,ĆPYnn$X=8 "Ղ $Ir,LQ< vnHH_~4>L _I/16  + ,o@0PtF!C1P[KB; sP1M0F~aJo cXi4iab}aBjAYP: _ʍE$ >vT$~fd6060 D,pXsXd>C̓m[]^$suLx}eH7-޿'̡v8׽Ħ € @0{(QKX}2:t'O0>]j~ȏ E'a|'RoQ`򝙍 2700|3jXPL;ܴk] Hw6XיY\?/ Ʀ&."(R j*a$;Qď? HPQ\BP}h|#8G 7:9+ bkY}qܰ. +@1n#AXH5F±ڄcB3Lx*&K@"ߟ*C$ς~jb  rahBH2Ht|)?.l*O^ze[%E-p*޹HnT $ lDT\en\Y 7eضcS6QH[ɝ,|x,$֎?Cliho mvq%yWIK$h `l[M=>Q"@ϖqO]I t`̢۵gtO8} c7TY=E ykgQ{0 $}GE:  RѵSj㴣!FQ*/t 2eC6 R=#zGAbY_(OEn>iLֵ'S{ ݚ}E9(Fh`]i t$]8u?*`vn'` axM&m'ZY%6iH")?8}p0snf=tcY~n N8I@I/G ̮% |7^A.X'ԉvWƌ/YG wa׏d@Ӎզ١_گ][_:9 J33f]] ~ʕLR=7Y'9fMx4v0CTt`T_?gc/M3cR4ѿvMM 2Cwmv]ʆXi g[x_em-}`.:@/U}?(wH4|pz\ F@H*#2X=&Y$b5:MIČ7]NɾG&'d@dnOJ+qL\FáuQc}cR'6ؠZ {ܱCF>je&'a7B$:<{KӿNdV˓,$@ 0E k"D؄EI+GӧOS%ȵSDII< @IEiKX$oBB"5 <$&&=IT$NB ."E"Tc$&Q 4Q]n H""% l\-ܒpC!$K,E#*n؉j'賲I8ii$В`ܴ%] _VS$zW)H?b&&qt Ip6)DG'Hr]"R" &MğۻZ%QyHi[DQ@%12XYB"%HmHSCH.9HZG vh]wG,R ?Nw `&:Oyt# 1(( mN@%XIR.q: $~7ZclI8ThRw#cl}n61044I~￯n‘p*  UC(*lb8ӴwHp T*0 WY$δw{ؿ_^J"½9EQ2I6!&Al?ZL|$I [_-#alⴳV$p# Yxe^%$F(ށ^_@N뿱$~}i'Bn~ݯGuLQ{6ͬCc!Oq5Y@nӭxE۹\m,[p<Ţ$cFhw8b!',AB#q3#䊣}GNu@V5v_cB/fYˠ7VA(~I;/& [[,Cţ):_Hp$ZDamR =2-m--'"@l! ZsE&j?qITBo?HTl *P$Dwoowqbx6A&&cAGxy!&OO\tOয়!'.`&$I8'6N"8!' "nP]mB;%&T[lRl"RQ$XׯKm"WR(.$XOAsl#d鏋 Zȱ M|%ElY(7/ ~]'Gm$S|!;kc*6vgH?J (>H|o#B{2N {ӝh3GH^<+)_'NӝwQT9h  +)ӫ{W4ކNDBsE4=l"Y_y;Z$ޡu.I8^IuS[kجwLK+5vHH_5T~Jey%'bmZlj7C%9vWRL"䧓A\qڄ)WR[ElMDJ "!'!!{y'"qrlMD?Q kDMD?o$"Z"'rFۏ-&qNBB;R;6H("H(!@ E3:Cd< o͸%e˱]2.Y[k>Ǯ!路o vIʼnGl qKd;irHl+񓰽FIoQ$b[hqHcRP6HFCH EBP$dP$EEP6H$̱M$&ZĐPO8H$M(N"H(*V9vRm}"wbAH'gP*4DBH;"T v5񤭋@mLb7 Em<s96 JGO&QD trصQ '2?đ#%,QVN!q$FGG-.})} )O{XCuIt֌ s7I| r`TIFSMk?[ԧk˄D %9R"A`OD=>>hu#MzFp{L0I"NPI_z$$qִGvw&$x.e!뫔ʑ|j$R$HKTe SS9?Yv$s N56D;AfHlⶄD/T}\Yq;bI5(&؞Γb $R8$B(_IeS I݉bា('1O)h-|8dWq.'SDZ"'{:.AHGD>8KuUI5X1JMQaCP>6x<2FAfQdG[TKSb^fCtpTh[jck_ovwuHGawj|žoW9~x%trk{~yςłΑtbUZl͝]#kr<2@W+&+'qaa9(wL Ib0ieH[$nqt-gV{zXrAaޟ\dzl+JbqF+b, .Hp:CfT_R-'qKo)MpS@-$RIyb<sL Hp|T[?N (NLZ""Jz@-s;A10@qW'(+xʥX:$  Q nje)gq1fp'勁WCB)LϤ3D4pDiTu4 Ķ!pcEō7pwK۔%1HɓcFI\o%t Z7W'+nZ`;X\!@wu$|{c `X4 M4C Mq7 Tw[bN$4Bb T 1Hb $le4|WIqs$bvO·M܎y䃳ث 1ݓD3A(8HI`8x>kx"mbͨfG}4ֱpb]ًeH1"T !&HB?YH$@w2H@I" /a֝t,3Ve!1+#Sbk˧8G]S3lH&1\EȿPSVl$9QylAxJ9x-(-EaeJF^ebޞ8n @\ m P:[d'up*:hb{3,᜚,d&.BFF.[WHȞml{kz;ѐvG#Xq:o6Uuv>Zc/EY?W;dM\G{OӜbGPko 5,Ƽf_C])MS* Pzcgutƫ{U>q{h9HQHE1ڄz<)*yƟdvwI; CE3BEF`1[c;oZ6ힼszr3m0PFB;X+*v'ḳRsM(ky(OPD~n(;ʏ9DWph. PKkIG$Jʋ?;xBuo^"%rJk5x0P& vY3E\mk1jd|I5,BnV'Q &zIZ#39 B$:(F:ih696 %#Y}VWNbF 77lv૒|&lXe)oJ' _kxRO][n'آܦE~l%aש[ |,SqTb:}l;l;^~X|wH_ %bɲ~pw꯼^_,\-~,wؖ>؄ SD uGW$ޝ1 `ɢysU~_~%xYM'>Z?-p?y>E{ӿ4f$f$x0*O}wBO0_]s ** =UU<*/N[GRشH̗ ̘z}se$=Ǔg[x}*\g;b*hz:>Wv#>=^~&iwPI(" FDq ÅƑ,6\^zp8ف2' 4@{(Jpb8^RD &Kw3 ,By)q! VԃO%s_|ė鑸 iHe%4oB/#V+M[а8Td%aȥ (ՒO~i ?' q0Qi_Nq5R[Ŗ&'D l%"6AR K./VWe;Y$MzHZ#Ց`Bl EH|7$ HLMO®aTʓ`D$̝cSK\́G'囄Mn\!QUN}xێl mNb? fߌ%a,WSMҌ?^,z hUPQXex'V>FEqR=i=r7 + D qﮫ4-xDJ0l+ E;L%\=MI蛳CDyjkĊAbW5?A@%"ba MFYުpMQAPlA0|s!@\b+DbE'nj$\$4&d $# @x#$keHH fZl$pA%`.N[ cKnh! $[_jU6h;Ļ0PR;fBkwFX M(?PLQKIdD(h9A @$E˦MHDݍI$2q$ Vzxe4ӻr"i7[HmVDuIQk[kXطF:Ėb IBӖ" &  aygJ:`&Ր(=H𹒏uIbgۄ׵m"I& &a^qbGL$67ILJ'E'DHZHp H GvxU(; ehc$]6IqdNׯ?p8A6QMn-rQ5BQyc0QXNZsՑ6*M\Vxc+JBmlH DhcD-I 0Hl$$$f gDI\f%oKsA$fzװa%!dʶ6' 0DlbM< .7<SObMc]ii{ N'1XM߁/z(lo:` K"$$6qY cK!RumZI}"FB栗7]Y "Q3XL'؄&q|ID"ℑ8ɳuum"\wREm":  A^$*' 4IL.iMk&pUmlNHbpJ6$VK HDcNH"NmԘ|DTh?6Auf{piOpԔvTe/f&qcfwo//6J80Iq&HNK6IxBK%&| Uw WCӛ|RB1HY$DƎH M\f-$BbEMq@ I"ZOڄgYr$GbyHXtP\a>Byo7ٷxe.|l6'.",I(!?<+CўFjl  Ne+ FDCmB'D$DȟM`wS4DAlʄl6 IyDӇ|"yDӇ|"*s`6!Dd C>9D^;=IIwpvGi\zH$u'z  $.HX|ojO&l?7џD671'sXODA$\'C>iᙏg 6+ %Sl6IG}}l6w L! PD7l4aLLƒSI8|ck,@DuC>eTm T18c~tD? ߩC> 6!Oı ODIQ~q"$Q9?!5oH:gUO&oD uǮ0`a]JxE"a#O(VUo} DAy~r~t}W"XCWUOp>&DB%1h>g#?;N,>yW#>OZ8/Hp?4Dtrr9O6Q$O'&)Pԟ=8!IQ~-H<Njmz~HXHx "MB'?h~~H DLjm"$DQ{h&lbū*''1,Cp%;̵oYgܣgspnxD< ́]6C, |1M!D,粘e'cK/%| |ҭp+=)&4xpNIK!H GU9I?SIF $xAA c!9h!DҸ˒fñf G&qn#N,S ,$ qBUw:$x0>ԊY#Vq"+-%N1$A9vOuk1` q$NIXb֝z Xk ^XaG5lz; )LQy5k=~'"A$ Ց66![vw:MV5 w)|;1>K~RܝV[ }}Q"aoÎ ˙Jzj: |nH$G$˹$j{$\Ni"!IHe%f\IV5"מNPp\ WdݩƷ ZlJbuwƤ0jJfHV5"Aml"Aml_ml "A$p#1IL@D[$DX.]"q$v彍<18a͟i3 zMH[$tDkN$Mc+8Ni' 7h)H$"ObH7 SwJNhqD[5PRRPGFs B.RJPcNKHt\7I]ab`dd|7{7_eSjRnzf[[mopnhyJJ}|o]V|y%歀\LyuҌz`_Kʁ|胦{|Ǣ})0ů]ٳ[[پWĴȃu͖ӿӰ䰵Cg pHYs   IDATx Cֆ)fqWqJIS9,QP%nLP TJ A &B#+4a73Z,ɲ-od-i,/z|Ιyg_}500=K9S-Y-x%Q(1:0WુLqm˓ѶolóNls›-X)*AZxZym\i=9/ڣoEۏVcnxc_5}ˮ5Ynje}{_ x&F֍F'/lEX]Xf ,m>vZ4|rGP,nhpeE\o |랑}m-k-5-ǂo"ߚajqʸﯬTYd_R\{ F 4yI oUD!uQP* "Ea#lːs>0Ef(lܻD"1!46}%ʆ CLP]:nkB]nE:C!_kdɮ b(Ï/cr)ٸd&aPsL7BV7"S4~_MO {Nhw v_7 |,`7 _tfA)[K ޹:7~"6EZ'_0 =v'B)%as~zsdsnj@ +S^]'#Ɏm$Fޙ HGi` _3HMN qX:䨜2T($I~06{NEÈtR, JAa <޲ovyaӱIvm8pl+ ̆] NnnsHXN%\KQܱ^C_w: 1{Ml W*B661f6y(_xWPqkYM/nl.'ΥJ:̦73 %Lҫu)1HNgcL"O iKLI$FW7SSxjK&&7ďb*||a-ؕIm:jih-6ҩT3V{  Ha&&R%\%UM)6V7ܰUzt_C-mhztu&N;#U(!eۙ! !"{֤vu&nV[ c`~0f3IFS @h(t+8e"}-1CVZMG1̰ZٍvH0[;f,Ŀ菨LG\{Q([^wݸ#u·^-BB׮}n/dF(| =:Pb. n{\ ҾQ QW~jHwTEF CECjH{m[CɛwZglbo\VԷ*{ eXd'/Aro7-Y-R0\Qr{}W(V*orl1W},l^竗{ENrI}_:y/^8V~]@y o4JkV .Ӆ? gQ+_?n _ىLMJ&֝Ӕd(JJ(UV8. ^ƇMrbZ}қ;h%k7ݹwrSnE J{*K%j{7E/.o;kgk7KR ;hb.qx @Twup21o;*O/RY(2%9(l/][ Bibhl{bI$ا+l"Kd/+hlHbpx%.1(]gb H 9|pM* .>K+Ԇt@›ӱ}Zl"͊Wݫ_[wp?%.EQXاe+\e'&L<2|[;_$SfɎmЧ•W^ޞoǏY/R-OIj#צ?~ ύ\޽͝둭b#@~S|2_ oR\Hml`wտT6տč(N"{coqG /d1.F̒J;{gҙ9a䠰ݫ5N^Y+*8QxH\I W{FaJz۱-N^3=Hk)=3^ӷdarR=JC4_مkH,,=$Uvr3#(\M7۷^ /ӥ^KǭNy[Ӓ%=_z92O温c뙇6,+#ӛgsy3oә3iymNhaZaYIWVnzA_ Pؽ*n`,?!Xv fR'+RUq" e3@RBʗ%鋡{ GHG(yڥ {cDlbj+xV4烂_GjA àPjL3/@AEs<@j3L}|?|2(HDVI~V^._' C~ɀӷޣP=(P0 E]\Q(mj@we5!Q$}."R1H2 hOR< &*ݩ29 +ԡ@?_[o=D!Bx 2aI KgoQ 2@G~$D HPHʂgRePrDȡ /QWboo|(,̈1% 9 m*L:…+#E'ҤB(԰iBug?) >) =X놃* GA&( WR.2)_bbʕl/xl c. +Q?W #*X {᠊b~pAbOt BgΙ!FE_UɯKp`M`(H<$\  :w"@ȱ$ ɂ6Ҵ%kM}Y'YV= 05O/ ajP:5{Nj*:l_ol5 0yU_ 6M: S> Xz 6f@E|La0 jlՠ `z (*:%b[i=OJT ׃N M8ixNw`L'RBrjU(ӵP=5g1#_i?~p! թ6r@ a(fS~A}$uDAS !ZُB|dfRH;q`{7gZrQMIQmO*m-ڝ(#/@d#Bv>$ K2!Y`8EkD!CV,%UsAS v339#`>Hw~Ї£ (J)rTrrvE2X 1 }@QX(ޅWE:ȐW>6sP ڐXIQ01  KjST?Kslki#y& >4EJ@a i5`t_( TGm\*i_Zu.$w A‚d z^mWX YEz(wdP( v8LQpa~ zCaT2;YԐY1 *.JoxPS1eixh(j(څRUM(^؛rp'+UT[!F 4L.+d8? PhT3$(MۥgF=+&NU*rj~6R:R+d:no<9 X:PtjF=+D(ꅂӲɼj>Y>tF?@M2ľ LBUJci;@P%KBɉ/sG*BGi# "PPf/~1_ VIioaRPH #YwG6(`pw1O72JiT}_-uxr{^"Q(ml(P(n<]}QDQBڻ8r\9Na}oFa{fgg_;F".PNMT/l2PН_bWSS q {(#t W8:#1b;^ΰOhmƃ N&mM0CapIW%E) ]Lq/s(w6+Q  O%3zr 7E--PI@&*ώϖ+ݏe( 9 rC~$(ԸQW q8 PO+dpڈQ >}ZEa˹jt_ Ҿ/~4^!h{WL-"^/sA+o|_B&x/(ARzmaZR(OͼBim4K[v'oN6Txi#ch] ¨V2 XCjc3WA!&( ރHKJ@&.27 ¦E>suQA9⅋ V2 Y)la^!^gpu2RV{z'RCA+8V]tpe@pv Y@S`,$E,Q&3#~Kt ;>Qꐹ5rCH+` 0:Df7,it6 "]E6P8߯޽{iw_?C=(2p@f¾jmt|Wĸ PqP8G^;PG{pl}(HH^A ܫ4/< o5D#bhn |^-8WHgMWՀ05MS;[$C>SA «/z0 h-{3(%[Am A- {2XF!Q4[X53; `@Fd,l-(Q8۫_:!/ݞ>F;s hbFΥoZ О!+\HlphЮ}n%l;aV$yNx$M'sk(fAn*RWQ߷QxQFƵWMӹZ[8ʏgVј8yj%@Vnlh'q&݁cp^+?v( l8ZbVob<7јp-@"N_FiNQʆ\PpNuz<{xT"u6ȇ˾=DN E3鼜v}A`TE/ME@ 죡纅{]  >^ 9}$pxȿOA{s4܏`ϗF9>>U +YL_=\~a:`FE!zg~0bኡVB-L,p@tP(|(\ `R:mL:LfvìG{ɮҬF(@WѶCo:I ynaؽDO zO}I0~`yhf|nf:#Lƽ!:`^s(ꦇB\m?(pm\ *v&'ќ< (-Qz6Vi3;"k =<|;XOta|7A|B R I4(MBD֦ `rB}> ߆Q SN6I[n{zE(9^9N"EaE5+_u4|૳ӱ|M!v&7^mF(xikD*n2tadwg51B Ph]5tQ^ N@_vP 3>!Ldtwgk ntxP{w֟3/FFMF̓ ]IuPIT7aLW,~; $bDMpB.eS։ 2'Mv/9UEWT IDAT4 k*Y `4^Z kOKsϝ/ɳ㫋wМ8q {h赅Ԣ "׹nD\8x[(IS)kHb$:H(y0m|(IPP0 !@YMd] 4ii^'/^fyٗF!V֏-fs˫.  7A" !x]8@X P$aX) +Bj HIp 'SChM}3&cD@c[nJJ)˻E(Ė^nq'8G~dt2le @ ! 6Plڑ )wG1Ph`G 4G՗6CPxa xglc#,ƁՖk]sP׼q:M%m=pܝd#Ӈ Vx?J;#\ dz0@r(ȕe_: &NRDQܼz ;kW0N—Q(iv=|k4pok_,h1V qhEKnW"Bl#6(H`m)zBP[Bv"5ɍ80\U65'Ác>"8w] 8 H!X(NTB ٝJ6q3'yA unv(42B{rȔ;zԬ+E v;{Lє$͒Y"0̂m%j`P [A J !-\+i4bIpl>Qa$Q/|tBNyI-JtMܥ4{2ޣ(UpL r!HgUŅtV)uHT ǶdlJđ`<}|Q\- ;DD.W q N< "z((@&V3oiQj# %²,D|´HHQ"u`k'Ӄ"V=g"0N|:tb:(ڡdacgLP@US 51q˼%IbpX-\輻i4306}g Tg ĨW9SyVqY•FUM&&I@9DQIDHC+(4ģ LQP3!5 P@|!#]`cL`zk5+4@A  \A֙6<`rc = S  IlL 6ָmw|`r~I^<;u47ГKLN uQ@Bs vN"Ҭ(vkww"gpd D0 Xlx 5hwC ahxvӲ9WLESpMCU\ X$A}2 4wh/D3)yh6?Sy6S˹I43**`,=e B .Q-T2v vLjkU*ld~$>SO<} QhA$&NJ@Sr֝(H-R5(:(pqy"6Qq<"Sh(t]JÊv[ :i2w PuVh4<ծVxAޙ@>;#,m#S vl,t<5>KK&+R PhM]bWsP nEFŗ@Ci|Ȱ_#$Psʲ${#Gba汞x4% X+4lT8XHGn PyPPh[D) p." 8 X#%H Q(؛Ўa:hZHjYH$mq.UZN^cmPn;& Ö 0qT(i7Lr QNqa Aз(b򬌓kB!bBS񯕴QS4.s&*%)o>QGBRVhnuYi(I9~t(4LK#38.0.8cD dQ4RK'DDwQ)˨f VbPuBU/DO E`& {EvFRF$6o6E zsź(*ߑWB 1Q &~nnOJV7;E!AC5ދ@T` >w@vBPI,DZgۃ&;{j! LJwc@5XdEQG Bıxy H];TX͑Y2zb $8a]g[dZi$/`GI54 ppPɝޚBo#Yj NŻ;8]Wv kOFvSg@!br| M|6 C GeD;P;h" ^{}7nxٻ[p4㑭3ө˙μB- hV6^1pLqQ%-@ Wh&Ufs<+ZR éAQ3Hx]G,#f@Aa6 Hs&Hra ,Nx6pT :E!7 2 4_tU%\4dSRj-EEQE q?1PgCnp(`=DKD,XHEP7!bzή &4 $rU48H3tHɻeoJɖ;͚•eŢPմ!/h@|j(ek3TUSU5(9*A-DUk4Y6]|6H)כ㹎:y@&"Qp jB-j$vAd1P&kaO Hq "CzQ|%ўlRPu2 uA4qdYm_"%dAH6K rk̀h+@=e9TlxB֠%R7@(ui[`DP8]$P>jaZ={:ANژk+hD,4<صM1V6Y;!nhǃMLۿ{ A(XGX]Ԁ38|lZJGM{ R@ : ^".AMOq5P~QI2^P WA!*|u P_Y@n.O%v{۹;fzflE bШ ɖI[aV0spnwjwDxM A&9a9ߕsXAYҺDY{qXs[N!ZKőwɷs'I{3Un+P-0oAA 'B ( ]u -5U4AA@c[%#^,؛ӥPr0>~s_ÇkoqΦW(jxcߒwv$tj؏]D\uc-,%&ЎWiRMWvӆLJMϜ. x":?ھ y@B#$R׭A؋PwX@iN:l+x7SȟcEL;~Ԡ{2;.FEh-PGGV"7Gc K+5(&$NB ™ǙYܞAP)=EFVb`!h.=,2D̲+8dg$9zY1`unb,Nƭf^qH D1 rYC̮pTxMw:Ն..YNw M;fAxKR[FA@DL_DxtȚзMfd;9TU7COVEF Ι+Qͩ.|h.+x],/ v&\F2D2L;:v$ Vp -<6V-PԚƑd[SPX‡ D+|قhNF2D$ ђ|<4+9 Ac0To - o]!ƣQ(@ݙe7kR'FˣL~M&*C;#C( `e 7QSÅINNp8n8zA 5?mUOzvs%M Xޚw׼A 7SzAQ%clQCMy(xwqDjhh@7-|'n7ڌAZ bT(>Ь1n;۲=%ʎc#]'QX$ƞ8uBm0sw2YO@k$Qda6Ph2f쌝+?C(+A{@!d:fD1Aޫ;\bةxuIhX-оhO> &w. 8B!PDvTV5hTؙD/2|9KN_}вWz:zKyB] =L+F~4uC/z)oh-?7Nޜ)k?gӳ2ZUz¢Y47'''D5\E)4L*+aS#\+ U&O2~.EaA? A g'['O=TO~ae EEF a9`VI=9=Y~(ޕRC! #al6 'b$wR" V*=߯B6(^7rw 5F!L&*PHf$ \L$iBaPsVl(4 G'GGֳ'uXnRPтS:Fc  ׮9( 1" Q̲@""PjWA İ7ѡڵ@"P*&Gݏ#(BQQ@6X~~(|`id("hyPG#CaA4!^M.F+h\uF!>me:(Q$h?zYC? Cj1m 7)=  ms!(X2"u&D Q&( ڐaf\k!6-5׆zkykx \c 7u`+S竱sGhތκw\9IDAT3Pk!2PyЁk9{˴Ԩٿ?+-Fd荨>g lBK`a1Ȃeh z 6'KW{ί )0`LxX[_qQmzxى'RkMiO.Wh *8WC$P_!+ԩAs֤Ś6dwrqgte(t*QS=@ם]}x sdXn BB{租KSW/ 90HX> Buh|h܎YQ(EG;6NUv4;td> b">sǷ|p߇B9f;= }Z\\~|2< CG- ) bLB zu|z&RvQTHa..EoRi *mG HG!-*q 粋r {^`eaU_;.(@ PG S乽ެ܊: /+Ȫ[l `QAkWE#~\FqFKbh0BLJ?/Qx>[z3([q, 22`vp,Qcq*Ep id r{mZxuQ>(̏3IiqVq bHPF(;|"+@Dۮ3h o N{#oN4 9SKUUYULHҫ(D= L ?md ޑ=?@ $@HTVm6;*QfgV±Ǹmn@Ul !e tD8OhSHT )*(ء!PdH\B7&}:bz~ ̔2bTSh3F*ێW;4Y` +$xmXN $Xb?1gmڈߘ;72"E:ˊH ,PIk">-"uN?|S 5B/!OuVAo6i$yM܈^l'$4CV'IB(k6HJIkQO\AP{o-XkQvmaQ9ܮ66C_O>xd qٌOqP^&l(Xo/2l)ꥍvۆ?A|-j: نt"uSp?2.^} "^ods{1EcvQH$mS34Roi\=63 c)0N>hr\\>M"܂Hm " XO#iO ƕHj-SC`vrpx$u?xz&RGXfϱ6kGRxs5&3 8~*NH3`Y IfUZ : MP-ٴ!AQ G' ZIݚH0mi d9 Vt>  4҉k ePhi$uEjv]@,cfjGRig CYLNP .g>6H?BDjOiٮW_]f$uG^4, MwƵ(i I,vݣ\x$Ua{"5;0Pi B\?HIwL/@  CRO/(FDb{7V22;u ]-̈q}zu!> M~unWP{EjwMjwI9&钍شYh:YgrvgC";ZGD:|3` [C3dT5Zwn @D<5qW. F!H> qPXt&+NՇ0]HDAB=(G!~s"5Rr]Wh2:M(tB"5R䜜+EvmxxYY(|yőqEjHDj$J&uㅤ[ѝ댤~挤v <k-4ӝQkRSz(RCM h54GR {H tgԾHGB𥍽 GR55mȢ0sx"uxTe:BFFRC[73AJc~Pfi9=@MJ K3x/߳#^AHƖS AdWvQV&+hKz%[imlgf#Iǟ= f-P"Z 4@!{:V3˓ 鲢Y^@Ÿ(v8u掤>_m6v]g0a#/#<\em WSIY,GRNl6 Ԇ_ w( S4tԢ| ~0 GaIۿXhjbjc$u n{zʤi7km a|# ĶaB#z(R3X uBG(tw$uN=L=<{1 Ktx uQXf-F̢l>MREp6w3>jW#u]…_m|ԛ r5MZ{ Y{5Rw,mx=;y 9lT͗vYM0u D'"uwFR3šiQIua( G>Qh\!R55GRw3P-Á[9:^avxhph61EԹRdk#z12]=rqHꮡ04D!XCavhxiw|h6<pE7E{Bu=#䮴J?s|R/^\PzF0 g( -=,QhL\PvWC`YɥۣLA!Znmӹ\0!Aaл(.x.Eawxhxpw|x8X}4j[,(:fM)?>=B JנAңd!(|24j[DO;%Tnz2>JOߥ/(@>ELjgðPHgHVH=3="ëgҹˇ 2%WF.%Ӄe0Xݡg'}3::uDjM|,WA|;C7 U`ucv0ݸ(ϖɶDjBȽ ga`(p0|f.^.onpox! -j{w#mAn( +G"b EAwWm_wPpEjAHkN-vAvQh> q E^;W@?3x nWhTYe-:W& 4YFP񧫷ȬT\BP6VX" N:o_HMlowg=ݸ(jEܵ`#JVYHl+!DjԦ-RϤ\7DlH gaוzCl3ν%K$did*v2 if@$ 0!a$1, ˰?{2DGN?s7g߃*R!{'v{`w 3\zodTNP,EUTʹ`WD<^N% *-+J@֊*5h@7py1 ]C$K|"u&H=?*g;w;k!-<. sMqlg2WV}CALa"ѵ{Ȳ-IaNUIs]ͷobܖ$µHtUN<lz.FkOxqSLk/ȬΌ dIG z%hΚ-t%޺j 2:u4 `+>a´_Ej@`@f񃹭{ s\{LVRZ2w@'ٶW,6d& ЯE ށ.jy I:|(X '06z"'R㈡h`+ݹMêB6r9lV.vg$=aT xWuT,W4车Zvvad`50 (XݳJ(4]E7UΚtonef `ne M2̛=A2S2,5Xl(:>C 4PytĺXB;Q9HciD РY\wߢ(Hi%b|mYJBNQ>HT]YC}V*E\箣PٻDOS{3{3['K/Q/g &5A͕˼&9rE,C3 nxkmyjn-`Wqb~X֊-IU%GEA6EEQf $*;oǶIrl~ꥠL*j[BҴ2 (B6C%U[ET L3\@)e-b^fZWUUtaPM,d0 {ZESxʛ8W)BۂpmT(h=zPm` CvQ催Q >5. e?X2iƒdޮL"Ziex(hPZA:4cІUE]ia4ːv>Pתs`AyebA/zPVi"JcSZ ;j;a ݴA@S,e}0vl(@ʤժOf1`پul{ıW . `Apq@'ikY7suVġ^l!?)oN?Qi;uي`gL)Ԉ- ZL=5k rw:HWק%tQ_Vwa :oԪ9&B{:8G('D~P~Nk ~! ?J^t1IENDB`logisim-2.7.1/doc/en/img-guide/prop-using-const0.png0000644000175000017500000000137011541757132022124 0ustar vincentvincentPNG  IHDRDR?SsRGBPLTE((P* bKGDH pHYs*b@tIME!bɈbIDATXYn0i@J0L$|)4<c6u5&zlTr9:@Z 죅Ʈv-({Ǣ|Ǖr!XuߏUc1(@YfQ+Od dE9)W3QrLK kѨ"!H_?Qȡ tJtX 75$:pe$_kF80[@WyJɴ۷Uv%B$H4Y(zSS1$:!ءK( hdT@kr硨<%PFGAxd_wWulW2bTK`=edTQ^zhCUQ R,A|ߍʚ2"?MV1nUݘ#HOi%bϐMS5 dt :^?]2[k_H򁺢ՙyVEjTlx=ƯV| 3}N*hCyoDQ4\$ hA)=VHџ:PwؿfODѪD4tJge.%IENDB`logisim-2.7.1/doc/en/img-guide/prop-oscillate-error.png0000644000175000017500000001571111541757132022705 0ustar vincentvincentPNG  IHDROA7sRGBPLTE@K7 #x 4AG?L r Uk*)P& /0-+5P1 9Y"8>;?V)BHHE7G=MqoG7O9.=6SVdiCY*mL^OIac`Q`[\OdZh`k`Kmfnao[o u DFwxufvj{jcr|pWof~)Dtxˤ~wxv}ͯUi83Ԏu$㖢՟ݢӠ磢ӨݬǕ¸ȷϒf|n pHYs  IDATx݉C׺ ZټRD"E$<\SjlbM_;gϚ'&Y2g&jiinjUo Zn:9܌ZbP%s݂r֦f|&}T\!DfDF1 *cQ7i 1( LWowǢ2>~R/| !E76iߥI:"UL=s}}]IYO`xcRT~3,jt-VWHBq)d߇vQ:ut2ލ$ؓv|O ?yXϱKc9 x~|&T]2טۗީOq|[81:ϟ~=N?{!++:?C_pU?nH37Qˍ칥A}p>*=7Pe~?qx|oH&,zyzX 1s(ώX.88BĜ/A{ʕ,y1bbz~D=;4ݟ\}=d}{(IЛ6g R:ݻ9Of,oܸ!$x4CzBSof~8%~: ߢm̀W\nמ7EM1>U{'o li %%-t~Л6'*QcɔwfIֳxd N=^n~0$x.ş?=]ŋ4a ߒ4Ǐp~#^5: y~YtIfI RJ=g?'F-"7=<78׶1&2#0gչ$׊;#9P$@9W$=冮#}*mOyAs܀lǿ64\b,s]γSOR'`֊zGgJo՗:}ݻwpzbs ]ό==ڣ'Žpa9[hj%Ax>޳xMwrK?HteGsvqOʮ=xKU=[σDwg k̎'~-Hڗp O3Ox0KhaO@c ɳ5/gHg(ld7?wxmxPx9aמqhA')"eQŏ8]3Ŝz= ?=?ΉG͑}TTye<A9YOù B^ⓖH;ggF6 tvct$@Gբ*P{VK+sl===#stt$F8!$LE~4^2ςzTɨ#Apݼ^u'+@S0uU0qW1K&!Q zU} z7JWrs)#秐nF=. $?86Sݶr (kQ[9Pܧ;c̀Zc]ly% qwpq[`p5"N=,݈8V<4L✛%xh~۾|nDP'̆Aq|K~Ȕ[1"%5P<yNsRnڸ#2(ȪBϣ8G;܉$(6hx}PUcő âhϾ Slx@مt6Yc}x,m'ۯ"lio=7llȞq÷̏"2w62xߛ=b`ߵH|x2@IEi<9 y/!;g ]U,*<%}c~ʞvSy _?('=yz3b{ s_(v$s)J,: ]io*a1 )qJVImVSډ;tq'>,.~0iTб:AhUO<y&X[} :M;J]>mҨZէiM'!JY_rKg=qj*N^j[&8[ 4I K,-|FCmi r<=[W ]l={{{l,,# ?u??;&?CͳYYBϞ΀o& $a)SF{/t}39ZoWLUg1t@dP+9))x)mV➎i<OB'S OBh:'g3$z.r!">1Lz1ETH*=޵3!Y(AРS?+TyW ޾mT]to+iUs$~)F3#J>#=} 3Us7}Z/"Y񐿪 =N'v!{=z džpVWۣzL{d}R Y<&}M<ET9J;@>Ee6Xc{:k, (='&\{OJB/#o4I@z~=m8kG zwH$ģR<;BnW܃D"a%s |6m8OEAhw)ܨǺP|u|Ʋ89$y"{n@ϲS% a=(g\!\VRQ3%{)=-g= +ew`o $*&xz XO{LX=iW['2b|(S՞S,s{n{?{o?$ wRS(0,oO_O;3YQCw!ԟPl;)SP*!".[ ʥzi\ A/3':\Tv@1;i[d:}=V92"xuJQ Il$I:.tv -O'۵_a%b"审tP>1.Yl(._WcOvu<9BtLA14Ӂ<+=aaM8&q'>?&>A)a~ڏ=Cz'%VgٓR sb\!AϢYiH=k|U<-^=OUtpk왎TAO ӽb?/w;T-P8{SOװjdODZJS#' OMoNs~ \i?LD9':6<{v8X{?nJm=;!+XO3+d5=!<_!3F.ڋo*=">/E<SJ 1B}q@I)}(>T 0\>5C\#'ELҳFIwLc/i㰞3iO7{i*{Lc.iʻ<#娢?(W4/^ifϨM/] xL>=M߬'Դ+dxLMz.Di| JQOiHݟB1L4x1ލ? 1yJO(WȌ٨V>%yWȌ7||bCV)֮cmc 9bյ$c4곉+W㉋W!t?{D&ٳj{ ϑ=gQSTFA/#3ζ<>W̃?=Z[{qgPssәg?Z45?HPޅIENDB`logisim-2.7.1/doc/en/img-guide/prop-oscillate-before.png0000644000175000017500000001510611541757132023014 0ustar vincentvincentPNG  IHDROA7sRGBPLTE@K7 #x 4AG?W q  U*)P'!/0-+5P1 9Y"8>;?V)BdGHF7G=MqG7O=8;1xSVdiCY*mL^OIYZac`Q`Odnq Zh`k`Kfnmao[o u DFwxufvj{r|oW~of)Dtr~wxzv}ͯUi䍛Ԏu$㖢՟ӜӠ尯磢XTӨݬǕ¸ȷϒf|EoVQ pHYs  _IDATx݉CW[\nY *K~F1W_kfޛw̛#+昙\[[:pw(U~7uߵֶ3;Ǒ"R#%xGKK+hmKWErGRq 1$blt LךQ9/_+ #ϝx fGZ@ˏrMj(Ƃ4OqLG1 (iD{ ss:@G:/ӔC z2[L3́sDP+A)U{NA;O zH/_sM[ `V' Ie}PaQ.(LaA:l [8+yXK3I9%\{} - Y|\sʺp}X_O]^_902C֐Q!م'X̘Pzy0&fgݿڟȑv?~>t=}s>xz\yo}30= z-gWae Qڶsɔwf ʆ$YPY>ӓz>n@HlcO~~xz"fpچ~]%yaROqWBIkEX幫K#3)m2\cXa+X)J;I-?=R3>K;o qys7IdεhXL :&㏷4g^'㣬Є$2/JN %6e4,Q cpbϯs~j 5JP@#zDƛ;!>ndخ?OX!&/e{lyD~ڵ&iG5yt~,D7}gU4W!}0@ 67Hy oI%(==Aq<y(NN.H'_(AFS kPE^adhRJ%D =Gы(W;8gdv ivoDQ5m4aMá+cxs>Suܓ.P';ݦzotYYDŽ /B<}Ĵ2}& \x*aE3tz,CX)(6HI7(Mǥ8g|J^eRtXlw@(.(#1fBұuK\;0aV8i{~Ɯ]Y˳<]7#Lt]M0f<4?]_<$Iqx\AV[jgD֋Hh\! pHþq(.@飵{> L6 b~~>Ӱo|q } 5ryn:`i8=Ѵ((KtvƔA%!JoQ`UoXXram_`w/;UubvV=g]# O=ɶv /!+k ]UK<=m~ǹmOӕ |z'{/Og!TbJVcyn<9G/RQ7=L @O4;'[yx>w&")﨡w&P~..G س،0y. O/Otv3JE)߲iYOtTa3ynÎiAs={@ Lu=um&^':< 罛*O-h^WAWi}cJ@('՚2膹=tWKa*3d*v xAay^o~_[wtza>a>Vi(Gs.Y[=:Q=n &:4,̙q]ޯ_ן3T~r^S' M~i{Er#WixEuD'@ 詒?QIq'2OZ݁='iy8){OmQ<'r ]6ޔ//P彖u^ YdOJR.r"<< ]ϣ[yJިnG/rvwm{SY/ <ֆyN<(7o/+O =ԳG\>bڞcC"*ϨQ%YsF$>~0!={zPc;7dE;vK,T^EɠVsOS,y Rnn8*FT&pfKQ=xFo6ٞRD mhZJ8seqr۽/ {E瘕'6V8Х%LBz<ŹCiys$a'?Yb1xǸ[όd۳;2O`'@.G9l'Y,O؞Eg<2Fx*{Jx P7䧄\3QtIסg4O@vERO'R|F)Oe/6b>g1%IBmU#H<;ݴ1A}S4ɤFrnY=@}}}6yʇG*!Bó\8]rzx_krz7i{^g"8%[~GHcO>b?/Lg iT'ϫs5' -%զ XO7=MƳ>Oϧy/SGϚy^}3?#3 =/#nOXjߥoܟ=vz^kץ'0Of{4g)V{TNX%4EihuY'||T d?Lm<+{*{rFl_)9_ O"?t}'=b>L 3bO7M=w^zrO3djC{='4i *yLmN5 ʻ<娤?/)gԆpSwMA$_ixL=u'߬'T3djC{LLi"(֟Hޟ8C6tԇd?+0tލ? !jؐx>].]O,uyc6=[}m|x>9Q?ADb2?klW`Ͻ |6L òb,M,b0`.Zž:حR(3s)RpP+}R!OX.r>*؀ɚvbPXEf}p U\eEyI k]$n~r^AӗO[g۲\Q}F$DǪmN J^HɻhW0V':=cuxJw^AC'!thQ OQ!6/HySoSDb0=}``1u`z}`lnP;VR^K;d X͇GX|(q wmA:(\~ '-Lw"IENDB`logisim-2.7.1/doc/en/img-guide/prefs-window.png0000644000175000017500000001314711541757132021246 0ustar vincentvincentPNG  IHDRwA=|sRGBPLTEAc(O %  72@AM?8 kU*))R(#w$ 9Y15O"8:Aa*AYB?{;542.ID1M=Ko`NdXUXgj^lfjYmopnqp~aqs$ev;hzj_p~nqp;uƠKuzPjOn柡ْ͖3Ҙ~Τ۽甶ެɬ֪ޯ׼ǦƸˇ pHYs  IDATxݏ_f n:`W` tӞNJVJ"}y< -OX4IB>ߐ d1=z Hr"ĕ+〬=n4xd“'2˧̢)w0{37K)WYnkd,s"t Z^ɘWX?rHS}]UD>tg!=c@r+ KɊ1bM _$LxT(|QO>3k<ྸ}|?_-ؙr}#6{% 5XPjoP7s?c*e¨Y:x[o8o]Z^ۂڃ<+xU >mj\MWEc*7\~rػwfY]}E7r~l .*VԤCښ`1{O^w#Esr/ s~w.y7Ƴ8={Ӕl ڣ] kkB2X%ϗg4[g=|یͺ W}ʕ).<ÞX9}`iQfTh)a\h[_,oSz}L,w40>6s=~d71r/a;4#l~yv.mCm F{{PM>_ >f}ΰW?BfO_?];ՙchvnN)mp/{T/xlEy7~13?/puO7 /i,2v{}A4xӾOždk‹f?/lhCn\+Dob[[w jkN*Ws}L<=[w+BR-m=*|Ҿk0ɵ?/sP߽8fbGwiNK'%n`)~i#ze+Qs wU<s/W;mE 1!!/l\(oí#;^?& 6FoSz|^mS Kq."+=1:L& 0x lpjܽz_/UZu$;@A7h=͏}NLCo$3|:RI(tO&.xgw?50"w1q DJto ˷my_#VW)85g §wީgo~=ɕ.vBx{wi]nc=Yw?<5~$&vmU^ӯ.]^g+캒*ЯIֺppw\ e_Uջg3 zwx]zI^c~U\G4 =!tv"MóFѳ#Kra `R} 9M:W&DE'8{RtĮ4>T^y?oswn2 JWN`̼)udvT=.yNg"1*=)Qݾ_pڕŌw{ﳾB))iMS>Z\+Tj][޴.a|HA1)H*)]|e47>w4_cZCt͓,D[H5$ B"ZDŽLAv7/=I5"u#!KNxY=Q=*YO_;2l@diê%{',9W!*G"Yq>fS!Y1aj1yVLgϒW_=2;UT]/OO< MR@w>gBM53>1[g՜5Twj&}ߌ1Z}g XuO}߅qv/_;9WLS^7wg> AM6&ܳMgY{$wN}Έ&'w]3=ɝkC%Ό|*d_iHώ]m[sc#>w/blWq)7;%dtiwk{b9[^.u'83ݗ3eN?n6N wzfSՍV"ջ^N"s_fwv],ԝ^3 %!zkB{țV更Z֒fJ;YHR7=4h,wy"Z_g~>g\iOXgB{u;➰j(x܉g4~gp׀;Z~R-j(m ĺ]ky5׻X52Gux.wh^ oޕMOwa][i}D%}E܏wCC؍ ab9Z33]gxmU߇[Ĩ,fŸR<֌׌9ky;D/pw*D.!νH5캇uw]߯jޏȧ" ^39}Q $ܝ4~wܖ< ջz{"Q ԌqDηzj>UϬ@[wm]]k֓ɼeYCg-q>e@W2]SZ1 JNw{芶)WO5[4~hy-ӽ߻}u7Yx~wE˃1oEbsYs6qwH1-u77ݚ;Z.ϣ{<{n}OCw[[-t_!½P@wk[C;Aw[;Wn˝~m-uM{ݦ{o Fw[[uwmݚ;Fߠ{<^Vn͝~}'w=iy_Kw^b#ϋݒ{97N[m?T_+Dw{9UitN{,.neq3i{AwO=wпS=6r<C;n=c;g}zcpF8ܧݻ},3ӎ8۫i>6}ݭ{6[ogݲ{<>;S瞧EGGݞpEw{1%g#ϐ{cpO&ݞtvtށ}-0[tx^Fwݺ;;;ݻ={Cv}M Y#';9qFҝ>4dΎp' U–.E4ܝ0e]ݚǝ=cC.~Tsݮ;/vF6( v"t?;nq%㮷j@H|lӾZڞ(2]u뛢ۙX_pدjKG~!fj,tJt7;?c82i̇{"@wJn=H06띵3 ݖ;ZkHS_>tq <[qv?z޽$=XA;iowUEF/o<8 Ct߮îrOww}duEOHjǝ"!!Q'm{/a;R ~ _eobუZ?ޡ]4C{Δa= ;SӸrw8|0}wOvރDwtWw{~UsWy@w^dW HWGzq'2;av^G^YrOtuZ {#y];/.1/;?kIx/]Bx/E$Tݻ=ܷ莉}ݱAwtǠ{;{<tGwtǠ{wG{LǑg ٯyϠ;;cZ>0tGw ;AwtǠ;c1t~n}!t2ҾI>}9g+G\2注3 Ѳh LFZ,/O&u9l ˇdxQ۷Oo-}-M -[>ޞS~ 42{HooOϹX_@{:UIENDB`logisim-2.7.1/doc/en/img-guide/prefs-template.png0000644000175000017500000001420711541757132021550 0ustar vincentvincentPNG  IHDRwA=|sRGBPLTEA(P % 72KDO?r9 U+(%/P,S("%7M4!6!;6A]*=.*!CUB?0C|;55I3MF>O=990RVd@SiAX,dN[IaVbqVTTbRH_aRgAuai]j\meqopnufZhyp~nd!ǁqpp?w{ciYz΃jҹOVlُp#䚢ΗәĨЦࣟhջÍ骴୶װ㷾ֽȼŘxl pHYs  IDATx݉CFp-6sG,dhyڔĸ<Ý _Sq˳gks@Qh E_lƜYϜ ~B vȄ;=$vIo[]l/v Fiow?r5WSP+z*"ϚrR|Fq5]n[=^*Coٟ\d2俌Hȫ"V\;u.A~7x#jLu:^,C[ꗤ }-4 ]cmx3[N<5`Ƅ!Hx~2jkDs )~$t}>JsC۵r?-|gWuܟ̝XoC{L7:;%ޥ}؎+-̝w=j`iVk2Aqɏ5V}q4PaD7>ӷ{It"4fhϲ6 a,]~iFHvë\a6CW]Sbl{R~r ОLzdg3Zy bG?dzhD[3l?ܙ3lZŝ{^gfB ҂&pϊ| ̺d]gӑZ5f5jV>(ݷ\I&m}~߮nUm{(PgPN{PgV(NtcJW3ہ@^{9?#֞v+xZhxwE7ypFPAxם/GZ>^P-vmn(:ݝ+/~$ҕ@Wԏ/o} ť%!j x} C۴3 sv+!~lVx 5| D:3Yd,Eߟ~m,7NIaeox؊(.HH;RG\&>sSax*hƂm> r7 `F-kӁ;eef` /b☘~e 122(<8LkoKiGIY-^" 6(xPϟ}Vn[ca/gBڿ7QGq@xuP<̏FNLvȤR6|m[&k,qDH&3i~7PK!xyJC?rXz{HQ]2)S&X d!|v6G7k % oR]sy;=JDZ 羼<ha z:~4=-}RTލM`)ƃ ?6Dךhum,`Ӯ*Aq<\\1]q++{&cA[gμFu}zvزT;:Gf㼘xQvuzuLy#ݏđŐ[4!o-w44>o-w0N. ţ}7bR ET+$h'4DDx>/<;=ײ*KNjY1Ǩ䘆/GzUEGM昆/q,ƟsNl#r$C=O~r'pL-&TY<}R#*# #k3&N#ZVij؞[SxW1y0>qj,q"ϱ5io%Q]\l{jMYu9?lFNa]?A7+JtWTדr1g“siq# c҄rwAw/ݽZN/Zҗ^QxNWbϳL=ϫڲZ$Dcwnj4$gGݻ}G,SL#+8bϟ9y.r=!˔rwMϷp,eSgOG=LB:^-$b 7>܏gg;Tu'>kvޔNjӐI]^g.\Y%lz(_DDicH-wIUMKcCjwB|cT4&v̪P)뚶2x&õQWy]5; d]ف &]3hD~i(m ҆ ~jZ]rt1><\H ~ƴ:Ugjuu`B/Ǻq `x2]3 $3粦-kKF%#aRVZOՖIkU +XxW 2UDLJ3Hx1ZKǰ9s}avvUR㽳۝ѽlZu;ݝt'-si_%UWH@C]04uXRUD|дJTMn% )KY9 iY%qtrI=r7cu?wto>?Up?Mq|F31 "ݡEsbǁqG1wAwt=~uctdQ;|<=Ad܏=&c9᾵q d=F=螌+t5|(st>DUFݡcw|133wAwt,D;| w/{z?pwTtOНn-v:vU].q#۹v=&=3>1j螄8'>tGwy'4>spϡ{|;^̡{螌8'>{.76 {1tGKTg/{ݓi9o{|='GF=>tAxs}ݓrϢ{Yt}Lg=N1Nٳo=3螄{{lIghwRHMvud$pRJR9,xV5~ !N+/Es0 yP0EW_ˎ/ s&NݵR.nOoobw"H0BLΗ}3+){Z/VykwvCrhկYNSS}C+;1;rruwfP3UI wݳ}0خV6zi6*vYg*S%t a?Qx|dw)`}S ޠ;eqL o;'N{?>{i'N=NA?|> {螔{_3x,ڽO֫]AugvO;Ƹp쩵:B&R 9澧 \*橼uh=r/V6zK ,@h={a*{!wDx=G{JutUB* ^Qý'p[Ruf x=){YB㾠uV5 {ݚ;^{i'ӃIɸ{A;;cu%:>Ԥj-wtX>,K~ݧ-i50Ϛׂ=L˽ )7U7~׫D P=^b,%ݫΚ.Xg)9;Uo3;*bmh{T ڤVh Է6ݝh|bۏ䓔K> KxAA 0q1 ;;;/F?s߸xy/zs߿ ٨_ N{ި{3j){N=>wWC";{iguy]Db{o{)On*{cNTнyDc%yݡ#x ѽ{?7_>T>ar7]xM8AD'@S%tO]|Ǽ]E;゙: ;;c1{2ɽݓqGwtGw ;AwtGwtGwtǠ;c1tXg0p_Ki螈;S螄{G rAI;wtǠ;crǴ:NwLpK,w1}^+x~ Eݝѩ=4w~I@нD#~n׶_N9p'6{_tyN`/'P~wZ'uѽ~JY7w D fx+Fꩠ{F}C;Ѿ5슑/G:܅[kէCF0E";rS \8^je=Q^[oG/_MƽE` AwtǴ}ܗ1q$$ݷ}bi}:&$,|K4!;/K롿 EZ%HF ?8)X+w~֙~{=ᭌMJ[\v|ljctwޘA܅|C->zoOMRk_0q+mWS@;@ \MIENDB`logisim-2.7.1/doc/en/img-guide/prefs-layout.png0000644000175000017500000001572111541757132021254 0ustar vincentvincentPNG  IHDRwA=|sRGBPLTEA(O %  72@AM?8 kU*()R(# 9Y15O"8*A:EgYB?{;542.IA8Lo`:mNdXUXg[kjfj^mYmopnqp~aqsev;hzj_o~nqp;u]~Kzu͋PjOn柡ْ̖3Ҙͥۉ甶ީʬ֪޸֤ЦƸ+_@ pHYs  IDATx흍_G#=E[wP-Z*ŴR*zrj bZ)V0H"߼fgdl&;><2ޞ>>@:uEA_OOo/&\oQUi޲)WZ ʸ~U|}7JbjΤYgtMOONONNN(B>HbT5I4̈́8+I޼@6jK,T*vllS_&un>Y<=#yvp iuiuuhӒQl]퐼Oӡ{''/2w}S}з\a'V~k6o0#W<%?=遟_rrP_GY>sOy;DѭE>YK Kt_`<1xa (-UO>Gܖ<>~Wzs$dBȇ;0}u;|^%3^(O[{P}up,JW#Ɣ-}(kCä ~.?3M8u-ܱfbx/J&QwȏLa_Y^miεK,q2O$#2OB t>^$<H_cQ.ۈ+N]ڹ8sҟa|k *ȸx ZLz\K'}KGi~eo!_/0>c6#??/Јg|7-OqdKY{qpuI~CB1hFpGsB㎿|ח ("f?w}Bzq~};pw𳪯e&q+п3No %_FY:fr'__B`O{(L{؄'; =q9><Ooosr\_A󚠻e V5ҷDߘE3L#k2;{gĿ#ĩSG"N(Mȧ{oor?Cg:ytgyIeq֪V-<;w|W/-`3;9"5;b ĸEwXܤVtyfs ="xjGۦgelHw/ˍk~W_#-Owaovӷch:]r|%p5~vYgd9e_u p3v"-=^{0jiy+}QKkg0WG+^MzchկW*N= WU ]nH}vf)`7h~80mH7=<=X{kplW4S6|,ol5!tgr|YJ0-O_ s1">44c~2"xNe>|>'Xh`!5:͒iBb N29c3JbͫO=/=Oi35ҫҮ=}$\H?Aի׳yHU+~e.i>ImmWB[aWqڲbucy".ytΖG/qJC[.Nly딆Δ4o1irj g4%/M$"L1'Iac@?'l)I$ ZgBTV`*/Lu߅:~{L"!TR=B@: ! {u6+e".oLO9&%[P/Rbtq+V+^z3Vi҂}qG[K@}f)/KrJiWJ.|"P|H%BT[$?Wl h_PK=sW`kKW*~/!}ik-ҫ}C][N] K.'چ{ނ{{A^0s/!SCq s%r TYg1qԥ g빿LTm*h;ɽжێ4) iKgjNigۂe;9IqncdqoWCw2q%^a^'RG{4A;q_wnJXƕzEPcH]U;4;_CDwHIX趃ƒzA.w-M&Iރ7.DH{fAՐqsb"ޡ8km=n r5rGvA'|1N4eyio*_g@S+5`?WUjmMη*ŧ7 !gȦ J>_^bw޹1s읱kٛV2K;F1UpdsY>2[ *^1oqSo"`?fX@dV*ߴW+*f`(H؛Lɋ>y>%U:/l*( a#(cTmfR Tܗܡw1.&uښ7iWU?!d@RMGzL9+-c jy+ևd^U^KQO`+jmRCᾺJ_qWdyFױqU{9mϴ1ç:\X+D?ޮܗ]{S Usw1MBxT$'qwAE)][['_;irQH;9Eu q&{{Jw<}[pw.ᎇtSq;s)f_:iqbpqO{p#;iq?=u6rcqǸ7_P^:ݛQ}w3 Cᎇ$Nrg s^5JZ}pA 5up{zL2qnǧkjr?ĉWQ?Fk ܵ#tW ,.w ]|e^qzܑ>::qIU;JE|.~vTO H뮛q/ǹnEww:?Ϥ}rZdݏL{g'twǽ~qwwO8>ḧϽ}s'HD |_.Dɀ3=w"k)-z@'3ޮhwOPHkĽcWOM)I1R. p~Y!2wW6>Ѹ Pp=>>u;0nGMnWlE^Y޽ߪ! ×ܯXpv0>>>u w-& wNWlT8ɿ5x$yc)h9N Vܟ>;X{8s;Vuq)swg5q>GG?R{>A:-3{ǜػ{~fqoa==pt>AGG7+7a!ihpUq;{s`ZI_7q(-S]6 yUjY]&#w)8q̽Vh?Ӵ8FLGf3qV;_GgÜ"ws/ :rٻ;9}S>ืpl>A>00PGT!?p8 q>ɚ〆Kݚ!"/茚šmHt:)#1Q#ȝ]Cwc%5Lm ohq"Ԉ^d)&<:AWy.q3 _kkq n$gWԂV0?qjMyTV PpPFݡqz;{8nwG9\ Ll;5=縷6>8iqͪ{ qoww39Icd%"w"q07ƽ"~. wP9Q9$h5{/@{A¿uDjq0j?R.J~Ύ{w܋s!+~9o"os{shWlM|zɟ&tup_oĸj/)'p[i[۸W퀽Z6+vh~׵kޮy{w[gOy'Юm=%ٟs!\pilk㥺xx :{ :{ :{ڵ~qg2O9ܳO qwtl:=jvҭC hF5rO! % to}5"wh_{ |#kWjh@MҠb 2|/#HH( ^Zy< ⷀ7O`q\]O Q w- {>'{vmo k]F s;͎.@hu@ x/2PޮըB&۹Yid{F 2=xslvgG;.w{ZgwqOӿ(ܝ-SS>0 sw79{qpwݩ˸|L8fὺRp܍ޏ_9f~qow+6]!Kۖ>F|Lq?6M!ovh3m{Ȼo`NdXUXgj^lfjYmopnqp~aqsjwevƎthzCkco~mPʁ>uƾtuIрv7u?eɲNΊj柡qϾ|ٚϠǢݔފ欴˩ܬ֢ƿϝɽl- pHYs  IDATx흋_Wd#ڮm-eE(jב՗KUy Vlr_ssIIg&2!c 9['`;.F~bH%Pp⹡ x0]l)qUods 6w7879vF]oQt{Ė/3=ԕL_wq~j:>YlJyӯ>~9RO_^;i:̱or z_RCFlQvM:xŷ~>䮻q.?d":'I/)N'^f.\"½-rYF.q(xKw"?k"N$^)a.r/neθߪ}K+uօK'Sp2q_9} ]Kʣ.ψk]& ՐUpw}ԯ[Jw''4$ s-Irp׷:BK[?% PQ0$ $C =ʷ^6=,#Frx>77p y _S@Q,$IdΛD{?.o/VG#Eps?s05 7#e0ĺɁ(?:;!^.?1`8xY^Ϡd&`^z>Oܙ'L 1gG̭ɝϬi7 =LeS_Ɲ%S g(-6rwi[;gu^NX{AjxoSy)(%.zG !3wHJHDbMtnyY>#f##q)&6 >,NA;GIqԽjC D}gi 71Hv|Xp/||6(:V.fГ^V^w\/nxq%{\)#nMٹ ~ A>FrT`Fb.ٌ(-G*]|M~ek1Y\# 9igghބиHAr/6q0ym 5xyCѶ$M罺擰f22կhK䚩5qvL~?o/&i(=6Y>JMi6aN 6e1b}[SnX7 XwEM}a{nJt|=* X!L2c4},Db}"ULYfoRĕ s@=OBjF);1؏Q\_"mĬVr}vԌR`vb b>*'x6 b ; v+eܷ`[t7@L>y4!cQ“[dD.^\%7ml<Dlڋmcxv`6ϗO#{ABDQp0QD9T>#=̥g6s 7-B5rB\{N6{9ԑ- ?x89M5T{rʙ$9Ln[=~A#!28t=W 4衱(˕-?Nk@ xg$MNw% s!* 94dq>@!ro{r?^~8#M{-^$-ԞmIzOY#obD#Ɲ^nzT{b$_;NfUp8{zSk=wHٸX쾃ϿyV_2񆽃CF\r܉8']wG@yݷns{Kg+okP3wA'}Qr_3US9a1lVĊt"{bz+ ׫"qw_[&˙2 Rf\p'wL,dNe:wͯhgzjjbbU@Kbk,mRv^m!QU։  \{˺ܽݶq_l!j顽Y]8!K ƶkjUDU6jq_ZbH%jZe«RRܓ#sW^i_5{{aG`zk鈪OWww:C5mrϐ;},Ng{vvKp_e߬"oqD#wrantƝ>q3=;=%;;}rOŭ!w##5{jSCR >i rO;}l^Fir0iJ>ŭw(P-Ȇ{z-#D=Mʝf+CpܳwϜpw[q"w^F8$wy4u'^#mVoKm;4dw끌?qǚ~eA o0REcޗ/Vntm^U0gn0soSuç7~7umzrnrXc $w+;rtZkȽ9n {s;y\>S82>^xGqg{g{&~FY {6C{D}j }3>ܳ>33=U{BȽT}<w:NIԔ>N{disG)r'ι'{~&ܡ{:DnݥU*=E:'w5WU񽣲w{H׮Gܽq'|YR'튡u7/֍w/B]DG3y}e"/m5o^݋}ttt#M 5C w3ߐf{1$[wu]7bGb,PEs}|<1M6.nGJEIܽoE/aL؎TOe~bv{98kB#h=Ľ)L:{-࡙>>*Ͻ>Nw}83f =_3o;8>*g0@spn/.}ziƌg'rG;xC惻oO?}QC֫Zjvw#>3YpFsaJއ{j7{>+ug[=Kב{o䈻0z6af_rOpӮPxzm^GYpg=v@Uwa;<6B/9l8{!w{Fr/"Ji{aU>r 9_~cՎ楫mrOL 인g;y j^= u`֥mB2{WנFrwVUhZ%*qwB8MswԫV]{!9!+໱n!fw96rG?ܑ;rGwwGkCd3\v# Ĺr'ȽȺ4wQn=5GzA<<=ɢ t'z$<2S EQl@7( |E?UǸY]:#br]4u;Si.'@#+>`2{?o?c_YvOߞ |5oܳ߅i X~6/bV:.=BڟwKSx1bsW/ 뽾wD{_wP߿k ==}}KU:Ϭf}MV==7cg} gzޑ;rG#wܑ{qFpFpAA#w]HQ;#:oBԫxԣ홎Swp5!w޻;rGi.[R3nDG=u."wfM RV^"*{1;u;-)aم)ryB3N;?4b935K-ҴHySu,6[O|θ  gbKvU'SSz5pUY_z,/M&O wyTG~3A(Q;rG#wrG(QG~}gcC=[g{&Gi!;r!QٞaS>4sG;r9C#wTqi=\ 7vk w?vՑ;r?wha Is˝-%Tgsýfhv ; 1hH;P3qFvw:Η@NlBYJ7B3Q_9@Ɖh]Hԅܛ.z>*ԩ0 2r?d#j;rGZv_AƥxS$x_E!wB;&4}KNV;[ 2qNp;wРͧ^}ct&B m-:A!*r  lGLA߉[őV ~y9<;5s/Ӵ\y½oĥq2؉?Rҟ᳚_<IENDB`logisim-2.7.1/doc/en/img-guide/prefs-gates.png0000644000175000017500000000340711541757132021040 0ustar vincentvincentPNG  IHDRxHsRGB0PLTEmmm___QQQ???ʸ^bKGDH pHYs  cIDATxkh[e sIM# /ѵ(A'itumU wCt^`dA\cqrz'*lXڤ9ٛlONrYG";4,#q!.U4"DwH Ѵln DO#kTA/y^5C3z4,!q,,_T1?544yISLoC*պwCtމL\1vCNF,¨{I jV<`T1aq ̄U= x/O& M=kW&5!Q:b5(؎51؎*M;*5`8 M"ʦyB&,-d3N@\Drb[#9a2Ąx\4'*kOPNz97B)"%B0 xVS!O\/ƻ4b"z*νu0?*!O<?ȯ &GܧSW!~O,jeCT#VV"T {\B5Śky;bjT+1馧l8GQ YdS%`'y8RT G;o2kS`g.(dCCҔ#X~* /Ad b;74'zNň*}KnBD}0r;>ˇogN݄""7|ݲ>ԜR{ﶫ,HVahʁ*ͺt'D a 2RDƧga6D\@?,D}Y)i㿠0c")$ "p1{ ^Z 7 ćaIENDB`logisim-2.7.1/doc/en/img-guide/prefs-exp.png0000644000175000017500000001352711541757132020535 0ustar vincentvincentPNG  IHDRwA=|sRGBPLTEAc(O %  72@AM?8 kU*))R(#w$ 9Y15O"8:Aa*AYB?{;542.ID1M=Ko`NdXUXgj^lfjYmopnqp~aqs$ev;hzj_pnɀqp;uƠKuzPjOn柡ْ͖3Ҙ~Τ۽甶ެɬ֪ޯ׼ǦƸh pHYs  pIDATx흍_G*wS-bbr"P.*Ӳ";mkN+$/nؗw<;2]}DtG)ޮnwzuVz#By߼ ͰoS{erk^jwhjfY[33B0eh,Fʈ &U`{Ӥ_^j;ejW^mT*TGw/Br$,Q+=]b;DĴk)Q$* )$XqQ~y8 ۂ#7u <>?yd/.WŕJTY/tza9JXa9~5 /+-We$MǗ7E;ѭ6dE~x]P<3xe)[_m;Uǖþ c~2|ݻw,4-z$v`_ҙoVsCGGé saB`_wze&Yy$s 8'vv3h^!5S 5nA{oLju3fT)Qː%P?u37An~M[[O_"½5-rYW B_ӻpWg|McT] pa}p UoVo|J.'/}< $~Ǥ ޠKʭdNh߈kZ(MkE=`CnG!+{dq$|r_c!a%IA|m|%=N"UƝdN7`B"*^/Ah"/W_#Vq_!gf܇¸~5s-S9{%rD, 5FX8yh?]^V &je"LxOΓSt!aNu(yH˷h =9βv5p%kz X%{w[.m֮VoC (a2%<[h+9 N>e/0?s7։73:׹7 ^'?Gu6@Mѹ+_ r< ԟ.w"w2uҩ~ 5&~1Ŋm_&75(@{깷I4٠G_wqm鹡|>~]oI7*; KU?&zhm!v~^;0SA5CټZjBZѸ~A"{ D {ae(}EަFX{:! ~j7|sk=cbLDR|²[aČv 2g؛_hSY _G}KGPbC Dna9 n9]>o(Y6oZ?o}c{Q[{81׋^O+l\W{ `KgޅȐ52?WVo> ~[w.fGQsbsBܡ{ L ~eר;zvgicS;# 9f4҅)>7*4",=DZE |8N,&:˯9eύo sNͺ$Y̆L hG$rnܺsGM~d+E;Vn-i->G^Lu8ɉuyӀu}WdRwӨ44%JT:]F&)u;2_i4!!{Y{$ @ UYsw> %ZDo?B^s=W~unq\opY)+h;D#VR@; q;.5NU wH;4;;CNľh;k 4 q&leYk@> eZN'C'6{܉8:݂#^V@{G 4:w(H0Sn5'wr<K`*wu?]/*uq˦5Օ+ |2VH]n`@\u{r=f!V{_17U{*bE:(~6|kz;q0G^X!wM{wQ~81p'8L ,d//e:z- ͸Pߑ8;+@;ا!SlWuz;g>%'wh!GjYso~=U!,`kjH'W/3/ljVrjGz1?*vڹ>{x^=}eqߣs uD#g3mνʸ? < q h 3q{+ܟv ;ޏv//xS3~rX4{6vJq+=;Nr@irsǹՐ;rG(~\ AﺕJ=5gR g}}Gq?Gq+{=-[;!Gw"}k Ɲj(NW{Z_H/;@iq?[+{+;`}[qGs ԸS=;{6^Uk=5;DYpS ggU{Z[]}?F+#ow:6rO;q"f{ 䞉 䞮Kܳ3#wT2ܷtS[=S=}U:;rO>lW{&37rg*rOrώ;q@p@Yp@s@}3>䞞OLH#=vubsANl"Ls=i}X^mr{s=LD2h={?ܓN'` u4Dw !}(-HHj?֜%ĸ;'υ/]ԥTPr/wwn2bS53=Gef2ѹSõ/:-~(= ~ `WyXy\wUl@]MwЛڅVo:wcJ^A؟Zט|gͤ-<8ݟM>lw}Vg` *UnK S:'P g4|ǎYsܟqW rO>RsJu vjZ#V̚WLɫG5C4dGly5yw3GphLw,IRbրg&?} 6uu{i'iv%} {7zp_wGzK"LwGUV3_vO48>0>v_?pdTupapr EQ1`?tvi.scvU`zq>CtZj܍ W,O]s ,c}p|xz̈́L}/ GAPfkK+R~Gz~W7L{Hy- ݱ'gP;rG%ܑ;*i}}#wrG(Q;rG#wrG(Q;rG#wr?"4 l}g,rĿ=M>`pG%;*y3;Zc*"t}SrGܑ;=}<ݫMNuCN}S{ֿAnIb'{Dw[-:{_rЩ !B[!j??זA-EWu@D̠^A3ҵqv~ xT*%t#~&s]  6df2 E.w箯>k{cLQ R"d-@&޺{rGmiBȽ^Enyn8 WQ;rG!EFUɽDOlUJFKgR*{}次>s˥3N}"t6D I;QyQ=Z&{gG}!LN@ɅV y 9.jՅ/$i]){rꯨD̉.:q򯨔BLXIENDB`logisim-2.7.1/doc/en/img-guide/opts-toolbar.png0000644000175000017500000002111311541757132021237 0ustar vincentvincentPNG  IHDRxN`$sRGBPLTEA(O % 4@DL?k#U*)-.+S(!.3O 9YP"89A])@1,FGD2IC4O7-;5>PUXeBXfIDK\ p7jWWad`gOc^gf^K]l[mopnesevizľnW@ol~PotĐ]~?J7~̀Nͧqg5/bt׌㟡Ė՘Ρ܍¯ȸΡ¿ڥf|@ pHYs   IDATx흋_WʮZ/U fba]i6omV [^pvCW UDѴa_mΜ̙Kf&d~I&sw< zwHջXx;0008CLtP:R:uhQöaU3C< ;i=5:МMWu]$ƚ5JXh4z.t^_ѦZFm};hC=UdGOnos>[v-rg ZM /ܯ^"~U 117rch~hiP!ds S(B^C_G}$Ƹ6}*1' 4(OskXO;t7[gV5y \05y7dJ"YPg\!à)Z Hw1~b }݁CT;bP? Q֏3ۼnl~|k:~yy5A꫟~i^IWdӏ'gxfr|G)E":2zl*x:{n[g[myyN[cdïMw&'~^/ {5e>+.|/pTQ ^x a%˔5&o@ {>~f1cW+Vآ/.L9~O:PDcUjt4p7RUjZK.KT;ކ_̵N/mf#ظ{+_8\\kݩ;ؿOC|/ZsqE} c1 CE? \6} xB{ddDa5ws5c/چz^$SW>?{kQ;Ǟl:=q WbGkL{rw1xl/y&Kߩ>n}>)Z=Z˫# [[lꕫGI]BxםG<$4ɦ M6zoZpRdؠ#KSr26 q>k"ʫw#_o_Y0xsu._2jDWc,k2x2&fo| 8x4K]-jl^j>nf =':3r{ւ_yW)Vη5Iͤ<\rb!Z J '9N~Y&[ s>~n֗5W@*T/GKA;a- ΪO:2b&/Vb~quKZS4m AX@ciZfn_8Mƥ,澞K* g55Λ$GL J(!#JW:zO FGXE[ufMVV':Bª ^hUn<U"qR.NJ~ Ϭo\t? |Ť([)."4%OEt7u41n 8 = &>F_`oˠ6#LiˮHb35Ə?Uݾ[=dO0" .7:-$bS<t-`軸&{lu6oV铮[sKKA-%'F`A} O.ɰVI{Wk2? ߄=T+IM{zk|EFZbkOy mtK:CKO `W[$;LoA_7GM lZ: Nu`좫aOFUу ~/ NXhr/Jޫ4߫ClUVXC*>x dJ=*ea*x gTgs x<[ 4='W)]$5 wIxY?OĬ~]*@v 6GS;=7?BMɄO"陀?wL@ l6XS;,𔼑S;ȃ>!X6N2W<=|z4Hxg5Wh|S%oqx!lhL'E/hztߺE|*OoQϓ)x;ihߨ~(_ѓȋKG~_X&w10 UNy[_/.s]6ߘ|IŤi>쮶[! nn'rpl }6Yțw;"_>Tks5wxPໞ7 >[wa& <@(^!庫)V;t09xK ~I gAMݥ9o!wI~ I&#LnPXgK% x̛;)%^m ~<{{{)w;3 K(h`:zpH%1W *xĜ D@ § &GEI<-Teϙ)x̛=fJT FKm3'9 2W >*Z'^b_s ",޵spx|y%jߙ0H,>D7v]/'o0oMW>ۻ]ۖ]}$xiQŶz~>K>&r9[^}2Ǽ14?27[|NQwp,^9L͞XG_7Pe[x,|<;O|ꅠ2ߒ-ys (<ͪY,ޟBk]MT9>O=?'R<'<`h&r|h)z(#1x^f>jZ׻KbX)cO Y#W{q( <·\k:m5QQ{(eV3N ~>1Ïֱi`](x`KBV<QVn>!{JOk g]_XS@#I$UD_ =s1}<XGϛ@z-#%0 hQ xSV!oIR{io x:H|{  b(80XC=:XPcg ,UO;c'o2'i2;$+yN26wx|g,WSX< |w@!}m&}o3ACJ]r](9Y{ؐ5xOIk؍z rx^ jqGac:jtC12ٿ-]'xxbҚF.`LW:xp_~|<ˮ FZ>t\\A=\F@^0x+UAHU0xu?9z0I{9m$>| %&;<8$Dޮf]*Pvx%xx;੥5 @M~5rF./1=2rpW3_u2 c  ~ty9S$Z),>;j\jeG( "O#G%G(_SEw}wDbf^ jDpG݆ (> ﰻH 373hkwx 9 |wDZx=ޖZ+.OxGA-I{,|]5 <x[B{qZ|x\GP2&p #x##7C;umQ2###X47;:>B7Zj6k7;:5ʣs4,>qӤtukAX_\X|E ^hq 4@ 7]eY x$9x~,RЇiIa ,>t ؖo۶;l$!%xD=wGБ7XH/=mBZ<OJdw %~ 4m^x}xzއ^Y1J5ec#]`N x|;W=s2mI)s5>#gd')- d}ޑxk3ʀ_-=z(ܣ VKb9"øE7,cAi,>g 꾧ϫϵ?-~C-#(,-35 ^|\PZ:TOj?Hej{P0sͭ5b?VA4D Ou⃐YV*J5U6=_7-ޔOP>gX&hoT(nvZ|A7ޕJepT{ p_(w5\YpR(^t%|hXeZZEt(d R U̵wZ'U!Z$.cqGja'KY &5|֚ 並Ayddx5!/2rMr{|(x5Pf𲿩s5Dt] h#T=PI-W*PGϵ_NV_,^@Mn6j)V)-$/ȹu7qX) xbJuJbS7jt'&u>~_2)['{Tu9[|X{<MV|@^ԣ8?ud!rDi6!FOY|;SS,sĽw;M̽z&$ YX!FZ[Pd#S>G?5IwkZUxg컫 T]W4crd^ lr4Ք ;;;KBGNPWJ5OA)`x<ږ3ao,=Z"fS)K=a5{M\K~'K=aϜ79&y[6_F7x'7/=;z{"||}-|ƞHSkޞRd6s]U$Fߕjޞpb9,<.+ǫ=fCMI=2"~CK._}=aD|\#_2WPPW꺌+ ~R.W+*J%ߘ-9Qaݨ璢<>/gsIQp;"2OK$>,x@xY)%s]> < <9Ajj㢶޲]oX':ӂ?'g0[ΰu*x'#$3?vR?'' xc苾ISv2/iQ} )>졦V:z5|ZWB 2`ϳ9a3N/ϐ'%:)3ـG:)\vVsl>)/ n)gsIQpR4Ƿv.)^$}RفTWW+UKJhfkzNuIS:v&.Ts. ܫ)9!|ɲÔXIDAT|(CjUn3pDZSY9/߸?8044sJ w`pp`?WKB؇:wnj5xIENDB`logisim-2.7.1/doc/en/img-guide/opts-simulate.png0000644000175000017500000001410111541757132021417 0ustar vincentvincentPNG  IHDRxN`$sRGBPLTEA(O % 2 6@DL?8 kU*))S(".3O 9Yu/ "8B9A])@T@>{<8-H53CPRVcATDZfHBTSK\ p7j>o`]dOcXU^hjZhei^mnpmpn}Xo`ps$evhz>k`o~ponɀ3Y̴'eVɘIwM }MF\gy]]5Y$NȬ1b³+7ɯ'b{&g2J.?]O>~6bh!;WsBf{C12CWf4!y7@)]e^%>2;gI,E7̬=QM!ܩy&-|Nlux]~Uc7[e#n+/_.{r8weBwؓ%N!eo N7F_G~x#/*͙FAgOR -R[CEcJc[<| _P'&xwܗEʖ8>?=5%*y>DCl.LKƔyZVKR*YR_oʼn_{oOf}{_xx OΗIJL{vpAߧW(e?Q.?I|:݅|Z>&ĵkcصk{m3Y{~;'# ~D=JiƄθVbYb?} \܆OƔ/;2jRwt%(+8/K*/?#.ݯ8'b2gZ=L?/2Gh<#)]!ʅ?W0Jw ~FOSjw)| ogJ#^/F5ºNu߹Nr>.?G˂Sj@ixC^Ïz,óc[{i90A٠چO՗/~oSxK'cHyV󕱪~tɭj zH Oy +ʪ&OiH=38HSYk>4ʯNJ#E9˹89>"8ѺU5lc%ϫ?W֪'DjV;AjZլҪ>>x4IX_O(펔CBV^(H8&x&P:yUOJ ȞOYsÐG_ Lj'E["g?Sq[[ !zz!ʤv$Mѥ=_R/:fSl S,nA *_>LQb۳)}h[-7F1?m?t_90NN!Ӧ.GyCkP.]>)S[n7?QHk|ZЧִ=ЅS.OV^#^+S >is8!&i0Lxh[ c%<_0V+5 'ߚt, _j~?N"Nޡw0nPhu(hPc>t OZ3xRCho^ 0x_X{':<M pdhתZ<ww|z7³t9 3L BJ?Ȫ9UMx\At&x}w)X#oopb-doOW=t O%x,I2[6᩷?!| <$x lIUFkG?99WiAgG~*$V5HGe?#|oDDI(|1-!UqO~|r\,[wJ|.%*8'XⓁ"|"YO>Gx b FDX E Eg=s >vs |6IgƒE,'Zռ8P, un1_ݏM-ݘٯ"|cyKΆ?TC`8} 7C^WIu<݀XOR--P Zx*YmÃh/~o+S|h3.L/?8h;jawEU8^Cjڻg ~<^y< _-OgiQlPMCSJn3Lᓀd_bL&sJ5{bbW̷ީj.^ěnv+;͢_Dx? C|qhBc ~Gxy >u7}om"4_=@V&B΀o3( ;ݶ52> |e BFN;ws@yX-,-(͆Wck1|[_ nZ|,/mՆ(ѻv}Ix:w[5w Eb3i9/`u}ă B𵀖x_3`ithJw =*ֶWmj7zg W 4$ >Xbxc;~ !ACKJ 8}FMjxvwP-pU}:it5ρ|I?5 :~0><꼾Q&W*^"OFO6|ѭ_Y xWPS"?`lxR+_|hEւa[9|vG3ju=_,xOSZ;ԯ>,W{oh(ׂJ"юݓZxqMjEіNƆ@ ^U\k1OZxS?y5惫ePHxzJZ+$2Pq?&HNAVs>@a: x_WMA2h9 y x#yqKϠ,Iv"+h Yo74t+n]ʬ4"wNЗ  WV5{5' pPg" :ڝ_N.Jez9Ob) ~Ե(]pҷßoNU3ׂAA%"<]2aPއ<;gIxCm6: hfóMp_Ⱦ xg<^=N^gצc5zQ&R[1m&l_Gx_zT½Zne$ ??_iy+['aZM,mQ#w Ax @4c޺| g"{| yQcͭelGoww|wzXotwwu;|E{-PѳIENDB`logisim-2.7.1/doc/en/img-guide/opts-mouse.png0000644000175000017500000001673511541757132020743 0ustar vincentvincentPNG  IHDRxN`$sRGBPLTEA(O % 4@DL?8 kU*)0/-S(!.3O 9Y P"87M90:RUXeCX+p/HZJDi7jbda>o`;hYYNb^g^Kj^m[mopneevizľnW@ol~Potĵv{]~?L97~̀a?eg׌ԁ㟡Ĺ}՘Ρ܍㮲µbɽϒl|,! pHYs  IDATx흋_o_ohgA^Kj[O_PK_CEKV-s$\6ݝ߲7>3y2t}F?n}}}?齽x}(DwH{(jcJ߷ՙD+AYFi&eT#FMHҷ…>_։WuAuYx%?{Hʓ'm l}.Eɘ12Z-}$y}f&|ax(۟PC> }^yN7"P}F3։u6&aᲇi۟} 1I3sVSDN5dGu~D}p>I7A_kGM;Sg>X& ~*b.>ˇӾvb$|]iNDBSpsz%iqQ[|oXkRd:c˥R3I(\'SZ \itwS|Rʇ/^'K:o(L ޲ +oX|}.h *vĽ"/>~rd~1z!`˗&+q>4<?CtEPnj~6Kaq+Y޵1M#DCwW)BY1ZB~fjFu7k>>GGIla<M/mnw7S6N諂 } z\ 7\FӋs6,^%?eTY7_-Uj5WTI):i6 xd\U 40'7_$u5s0>.r'Wo/-s% oC%Tv~VD94zvbۿ`uyB* F(p>C̻#O"]Aj(xR WT QF2f~b2 Ú|Q;˂dI.$lEpE )\Qw-Y*<.#Cm#z}Rk|`q=<&)^me.\WpẸ+♋RmrT6x|-uX+bg9yt1iҧQR{_5({ҚcptR\d]%n _\lgu_l\1AGDgs—4FT%T%R7Yg@htr#}s$͘)y E)DphS;1lYvϟ?_SSy~$)|xHMEau>?|d}ޖLZG 1rL ؊tjҏ\|#FyAB[ybS.Q#t2vo^]#b[U/zN/Ot&xH t^0S=ZM@$Cr5j 5DUуVBo*6ߝࡲܫS):JQwJQJ!H,9|Ϫ[VuCw O݁w>0 +@0- k Dڽ b3Hx? ^A',@>ļq+Բ+ YYJ  (*?džROO_FAs<?7G>Ï Sϳ O݁xo:Uy֭*ށ6~|B겶*xܫOE] ~_Xpy;pVji _d v~ٔpٽ1o~ˁ/ ' o q[ @] !48SxA! d- <&Ͼwƌ}xqOux `CQqWt"|8{f7wR-Xg^t~wc| 9&l~=D>rʏo$omcGL/ <( +xL^n7h>ﱹ>G?{Z$xəK%_<C,x+pҰD{[? (x}1q/) T΁A)PTjy5?-Gxx~ *r^V#U[ j5]- x'մMwxPjQo@AI_N GK(ݶ|7'5)&ٻݞ܎S$W-?ϳ~hVD[w5;)pPVv][Ѕz5t7BWb5c,b.xHj;Q: n#b. ~[jg?:cwx}d5M<^R>3 M<>? &ϯi[Aw>|r<^s"|VxCW*q3GvoƇ[DǷ| !T^,\x>-Z׋U$x(|Vu_jToC* ?QZRxu_k :l#x(|xi+h bn>0 ū/T;elGG'F+.рIV-L-Z2x< jwoK |x1w5e--ަ}|&p|lzzz~_3ǃW ^+7f/_Hux<?d>^+-ߝWxjbH Jf!:vbȁ/|}xj"ުyW|4i>h>"9S MS7IqC"[w3JZ.M[AG"'A*: W7RVuσ O,B . s!Bt'-K=Ϋ5g~><}\ŗo1|{\@rG[ ^/;`!ݹq'sx@ٷ;PcwnphO$O$oGnB<ӑǦ JN"?~0 սǓxv& @kaa5/ٯ-^ش|;||<#}Õ/dv__w`<>U r-^;P{O+lx`I<,$Ov5zhŃ/Űoo1!OŁOa:y kM4I4}5|*WK6.Lc+TB/nG?s# e#,>>#λ&v5ao~}Ţ{.( Rjk5w\J>WWLs[ ;w%opZ'/K 7Cb"|Z{?Ɣ/ؘJ;w5Og.dxT^ХU;4kgs5G_L#:ye5pMs4prV\ZPog=56's-Ƽ5gIB#w>]GyxZ?\ X-78: 7YdW;0)7ֶ~~[i x<"VD)[:)1|SU/X※7xީ;s,G!;Nȁwx'ށw0jh#xo_5RH৛߈]ӥOW;"2]W|E- |9X>E)'S-$C$* l1z2:5'blhyD޴Dn3|ȑO) -a@'2|&%>/vBQV%Yi (NE!(6X툹h Q७C`Gcn)f! 14 &KL,֗MIv#({ 2Ojv_Gd&Il1`KĘg%׏襲:VRDre⫑} x~A޵yo>L8NJO@( :< gO6B{Sa* y6$-=ށxf%7ӥO{JF)i3"\(#;NWR4_'L+0_:1GupXSZ1N[V9Z rW|,5 RG>yܸq1Q:g7 SiB~@SY>Q)ˌ4IENDB`logisim-2.7.1/doc/en/img-guide/mem-hex.png0000644000175000017500000001271611541757132020163 0ustar vincentvincentPNG  IHDRA'sRGBPLTE@L(7 | % 5DCK>8 pU-+(,'/PvR("4.8R#9$<?*AT@>3C42,H;LqJLJ:I5NG?P:2RVd@TPPmGACZpJ\SPOcWgZhZhHwdcpnpmXoËiooapufufzm{k`nm{q~"ŀCpˀNx̻|̄БӅQXnʎo柡"tМϚלŨΤ弪ܰުݯص¿ջũԧƶ'S pHYs  IDATx흋CEO-\4@/P(Blnw/"j+Xȣ5DF@$k7Dv&޳93{fKo䩽Z[ۇVO|}4$X#*d4>c t ISPa2TY$2!1.*O 1g#ٯ/mZwz@g^ZXXyd㯄 |ƩFE<F:T}˜B(4>&>R6PCxG3;sg;tpCt|tZ$Bj:c:̇jO&OMh~gd't~gC1m0Q-GG/c b>e(x@@OFrd>7%CtCju5aųr OxhOu):F-'CIA:L|<^N%sPDx޽KQ2yF"<[t(,lyXsQ;}&:w p*]xnTqL mhNwzχt< 0{$<#[>8txߨݡd>tt4$~\Kt<AWϾVL_TYͯObS{=޲{6*y(*xxp(\`x*J e<|:,w'E3!5]! b|?@  5>7At&:=.!!>ayåv|L|㡀&ؿA.ʥдR*?xfչZ30̕@<<% ~:V|zfǃ\</ c3bY^^\`#> $:JdP@M pSеk "6._Lxۣwy\zu}!vD𠭈Zgxie(g~IcZM`ܫsM>G(|g O]OħFkJ_6ysg}FЮ6Ţǃ9+Qcya Wg7i{ g=<}8ÃnMzwwBpM5MU7' 07xIB]6q5w nPdC@tze1 S!ͻg~>7w ~xhp 8(D4ɗ۩gv.5>qrÒ;ˬ놞{P{ h6}ne=\ӎ55z2z +{[>}ЃPs[4o38:<8<<{iRrMM|#$>{_0br.6ze;{|yfVV HIlg{4i=fѡ6 c'ԁ(8ŽRLr/Ɠ:RmOӱsPmQs^˒fk(N ^ ijlSGK\eq &4<{R=F哭ON` ծ|T8ex,.#p4A0<[c9T_4<|Pe`X,ځ:rlE,z 2ZT*0'F#D4(BcaF0$C XtH^:^'⓵GYQZ /axS=lচ ރjӐ_ˢ&gs;QhL4 cy<=" X(0{;{! jx:?v9%HӄS up:INY=IgyyOdz|ěqMGEN%|M{Oa/Aރ{~AsL|P`|1?`Լ.D94I:񔑠̦x[a йn&GEx]>:&rOlS~6G)R_Լ0‰֡5Nh*|.>Y='.OyovK pXj7eO+|k `JlD!C4 k~Ru pryH:։o%r懂:LHUai=SR-)P M(99 gz{ ku Z֖hFPo? 8b&I ȘNxCUѠ@%,9*uܶ5CT2ob d2;ir*'c ϸ%'ax'x<<OI;I0tyORP^rJ&=< ?mlua*jͤ2×]_߰-:յܟOJ᏿RSiIl#:@Qo%O=ѧN\ӣج^7>R{&p73rIbhRlS0> >)*U->"'&I[|z}>ۗ۠sn19;)J['?{UfOl>=hjv['v^VUȀj7{ oV4%ڡ_&[N_:[Z 6K ծIENDB`logisim-2.7.1/doc/en/img-guide/log-table.png0000644000175000017500000001510411541757132020463 0ustar vincentvincentPNG  IHDRlaVsRGBPLTE@L(7 %{ 2 7BDJ?8 nU*)%.O*1R("31.39P 7>"?T@>2C9Io{<843-HC9K:M9Q:1TXfiHWCXHBlM^SbWTeNdXf[hcfSkmpm]muolatbu9hzďvk`o}~nPqp4vǀ1Lv͋d?el㟡ڔ՛Ϻҙ⥬ϥƕުޯشˢ¾ȼǻ-2J pHYs  ]IDATxݏ_zL[ &xD.dح։ Rן$9IB#m~O~ZrCAΞWß^6;NO_]9 $/Y 0%j9hkkӮBXhe֓iE&]#ex2MH,dhą;Y6;7 3Fώ>aY/K۪v~((;ŋgr~oJk\:Fڮ}6¢? ʈDQ v]v'\CTRڤL=P)eu-2 "}HT4=i6GpɃw}S妼D3Y/J :S2 16lZa_9O0'1䦿J/;Hg}=up/I LNNs Va2RPm!ZQNLHw&[ʔ(mjg֥^?~XO:G8ZpgC(PaDڦwhܴLdLo#beHܦҦ*[߂-[=~\H"jQ`lDjxjG)y <99^ZD-lNGPH7Cך2x HI#gJ?kkÜ \.۹Ɠ?}Ѧjwfkթ:$6M}[bSD \gr gqXgvK:|̓[ssLtz;]M˝9fb}/y@r<_LyNgZS^Zv7LMGOr_Kkha6ɵ-vI)[k}oc:GUhw-M -I 5BGz^n|X?Hn&{ B!sSuW4V4֖؄'W p'X>d#u֥+@=JJE*  ^g5Z*jӹi(SJiCMŪ5TG;TwSYt%&o'HA%!dT'?/koz?G]ȟ[. R߿lR2wU),?JwdνN)I7-k× 35Ød-bK׮'ܣ 8LC'0˳pۿwH߈@J{ tiA?`Bq]N6n g^b\^A ,_H'Nz/5# PZ{ wν[]+Sf;F 90|ū$w5 RVNE$]mRqsI_zH6UA8vMiZx{3~S:5t,dL7ݛV]+I7];1j:~Wͣ<ڐ6Az"Ӂq o7оs^˅yO*5t w/37t5l 9B#Mf6&iSG %ŭKÿoD\{/}߽y!ٳ?}TAZз5@6t=Qn? /7:)`>#}Yy C/m9aKm6rJm_x t/un=gOhvqwڇ7xcU0ӅK\ 3^`/Yf\er+\G \QRCG`J J^jS${&o_f7۞}REeRq@pc /7>{Q#y9:LN;!阦5 nz0fr9$TD:YU.l[~Gh#jq\k4˜ݻw']L SQ:EIS `ҠW Qp4uYGNzπ-ܷ}{b |:6{> ^+TiƪQ+p#4 j4QLyn,u MEQ*b{(;+uJOׯg7r17GlNDYF4S_ZLNnN2 : E6({[p"7߸q]/>0R!Mo&oTT]ANݨ0Riӵ3鏯SυHb[Q|ӷ: !}[}W"}W^DYNQYmFQNa:FMNko28nIȊϫgx֐:1VIQMyZ{'u"t{v_qRhq!uzHV's،4?q ?6{&F<ٶHws!=DzH XUi'QT)M x'kD{Lȃ[r'i@?{b0J @ľrCs]4RqIYuJC{{⟃(w!OG>Yz29BȮ+7hKoKy"ؕ@o1~w('@yZs{9 r?kHw4.ݻ@/ ;$4{w{>ܮٝ]b}#ݔI[wyEI=!{./ qx7ҹ=kLOniOa/JyyԤ/H={K &֯򢝥 ژ쵷.e5_~q!}O?v}Kl$ !5H*%!H*> ?jxGbؽwHhRJT%X#)A&VLJ_W]EG%E҆#6v"\S޻&]@R#=qHj1GNWQ='KU{MNO-!BIb %-QI7)n4~,.#)bARH>M4hD4"(I'BBJFZRmiFBvsoff'_?&U+ٳ834xpy)ҽ6f+N'_0,R՞KBYV]]Ջ:ͤtH;1T/ ֤JI@ʫm)IdRIo|MR"źZ0Re6IwoԽk5-^Bby){Uū)n\.Ǿ6CR3Hsi.z/9ɿERIl&%_Z.aǿ!,q=Ȝҙ')JE߼vHdI1H+􍒔~8@J%LOJ"I3EB"-BJJ"D3RINIZb*iI%-AR*F"yUfU.I M)&)DRsI?!A/!-%DHoNn#7FGG)i . RR$ERLI6SI3$th;c'ץ%qCTiC*n!)ׯ*JpËH[Ujn٤ :FUiˑ6N͖"%Kn& 37o&Hf0,FS$5 }Hji.HAoI= ڗk?F4T-F4&DRI7lkxMHZ7f@&IOd_S14ѢJ1HHji&fԼv"i /.DR6:x-3'c;hAڤjBR HҺvTi݆؎*LjhG$eUG$ŝ["&L't ")I1HAR ")AER4kѣXb1ެq43"uؾUкvTfIZ1J+QIlkQHHjNL Q&Ď*U)1n ӡI_jigBgbF ef^FRSHI1Hz䐓S/փ4ϙسkXΉHHHHHHh1'b4Ƒf%RՀ&HIx"L#(0jҕ2mxm OdeI'/z6SUt&mF:D6WIIIIIIbGȤ< mI1jAxuHIN bbŋĴGQE/j׻QuI+]-HZlIIWhn/UԜ*=UjҺz;ZAR6jIM!W*ڑbGpҊ5iIu%oԤ$h)u9t")I1HARaK%$=,W^Ar˷I4u_IM]|IBA҄_I&u'"z$=qRb_@Ő_I '[3?HLRb$k4Dd!CvAcf鮡(IOb]qkn[C1Q8 qHhPOoҴYh+ˀ5C)ۚLZsҷ͌ oZkJSI+HX,Rץ&3ĥk٫&ԳLS'H|]݉=MLڍƑv"Qn0ERHS@&LԨuitqF ?Hs0[X )ɚg˪Ʊ92cON Ҏ']^?Q۩Eeΐ?մ_"kr'NQNcTL*1H/vv_De:`i;;0>ig1HQOTQ]Lttq" BnMSuQJPS\=uu~ƀDJ?nU*1,)&.O*0T("G928OP>!8!?w>1,2C:Io,HLKH9Knqpt*ƀg1Mw7e捚:5ylzّq՘Ρ܌㶵ۘľѶڥ] n pHYs  1IDATxݏ_GNk%4XO-æUDZp('Ώݙٙ&$ag=qs(̷|Ɇĩ7-ƒMtd:Q]z@Ksjғǡ~Er;n|+&ŖQDR՚##AU@_@w)+%A&r2ҩ]ItF//H1oCpWuVhbԔi2Oa_5'ظʚ sA:]_0zES+ozh'Knu|̘ddyjj}#:ٟ%cR6'%s[a>0,?׿K/\I(e&G=!B$PT7TihiHQͻTq{>4 T0Y30n.~}igte{WWf4iplOah4ѯF{뉕O^Ռy:eE/(.c7yyb:%HSc>qӠ{UT}\Yt{KOW'h;W'1q(>}]pS^e +ɐR;yBin}BJz@tal!#e9v_.,׆5ڃKR/\G`tLqWɆ)&:ȓT 5w|Hg3tYS|ape~J~ۋ 3ꪜK855dSH #~h&SL1Tj752*yH=!677y)$)=!85\N[{V>S;zKgĝȏXn}6A?anZ1Ohj?Gh;TXȟPĆB*}&>aX}fvܳ取L==_ ~6c.0v|\#%OFFv'BU񉚦+)]K%ݝ25#p{FB|*}MY?WXʕ+LhjuT9c>}MΘMWdBHޠb(&%r7u0beqćot|"-;{n&+AK$U\q<QYlk*35AIv̟Ǚu#nLz4kYH?~p:,M>LkȔ}i[_.~aI̓ $Ua?#wI#]O1>;vZLˠ$Z^?#.DSώ]1ӇOb~y$Y؍nMJo6 lMѵ_+o_usŚHO\褕3[$"S+`aYFzr+|4灼D4K?[^wж薝 -CwE-ÙX#el~H@Q؊(GH!\$q;,`GxE4EHtJ0&lxlm`2Ah>_ EU$m. #ݤBIݣCv<{$!SSRIz!٣XRl_J9 )؄lNiIK:#{#V߷M%5#K JjY-:vf#KCR$mvUFF@Ҍ>@̐>IIl\6t7tJ<ٓ6!-M2JԥQtRiuS*e%;K쐆Y PHi+EiH='H[7RI#Hi^NT>Ly:\9_OHj/A4{`TH+/<(3k[د~'݋ C j*i{tt{0R*i"%K2H*;ڤTԟ=}=8q#JvjEw7Y*Iwbė\| Oչ-dDAI7cIIē7jIbSsE"enJZڻ=TRz؃e[MJ~VUX s[T}i=Q6oFJ%Q,Ji@T'{OqR4&_*OA^:i}{"RD'1jAL=Q3"-%ݯy\G!)o[ ,T]IH$&4]]#^ ED GrʯnRinXN! H{=7i GJG1xnnc/ttJFI|ME/kk{DQ_>Tx/w.ѐw$mgܜS4RvsI9zC >Q> 9N_#RWN5I=C)'#u;p x H'@mRiDRA H_ǯke܆f]*w Rfk~.֖%HjNuѰS!AY-䤏C}(>㙗# !H8AWyh#* ,}!g0]'L"iC5UbڈX)4z>*t~IK+9+Fk)թX+M o(ʠmPBALEnIÈIAT[j\dVM>iܑ|V^F=A+k*#1=ʷVRHy&/f}TC  GS)ѢOw*wd҆+mƇQHn5bIE ~\b:ՐJR,VĈ*$NJBjH(Bz%#!QtI:KhۆO΅{#>7Т;i}ѧy}(|uH[_DuHL ^br&Cfi>ip:A?Kii}Y%^ Oz'|l!yѐ,%ed,oIf)+ۅIGSOzQё}I=O׌,6#$3 @=m+%ŋ~*o"`k4Ao  ^ޢ1K=x4R_Nz,SS2ҧ{ԐJ|4ӾI%%!i*DŽdERʤ^ DŽa!JY64& BIWC҆Ƅ7ͤ OI1a}Ƒ>S7\I=0GGڶ>S8bci.Q:MZ,*YИ0Y&m ^ AL1aA_  m'- "KŲ{/=h3uݵa!34/0҂BK Al!HQM$zjOqwk6x$P0՞?KgU5x$0՞?K`U;i r_ͤdjOH: L\ iE6]-Ҝ\wXHJCҌ8I#}IϝsG%=weuR iHi^lx=¢,]v /ݗ8M˻C4i*IUz"\]3yZஒvg@+Wsgr5Y"]'Nu.:M;⧋iwOe\5֢OHϝs4 $s0&^!Tf4_5Hv5wQi AX5R,)V")>FE#ڣb=")")I1KIIIIIIIIIII$'HHm&!iHsHHHHHHHHM" ϐ4s!i^$L3$H~YR$ iI1KIIII")")y_Z( iƲI3HZ@R$ER7HIIn$\ɰNjHHHHHHHHHHHH1E$\4s oIIӾ/-")v4դ=BR$M=)vG#$ER$E#!FRR$ER$m i?6#_F <;/i?/p$ERWHER$ER$ER$ER$ER$ER$ER$ER$ER$ER$uHHm&-"i>I4XNHHHHHHHHHHHf#[IIIu;AR$Eԟj@uT") )")")")")")")")")")")ҷ_屏&iS}*FY79 Դ=ݗW'ߒwjhBFkFd!AR id{8HI45{m KRLpI1)a8HHH'-M2JNfiiRiuS*!icr`uq344i+E$IN#iZHY$-dHX l}i{J4op;HS~S&\|eH߀A0oكri *)8IZݖ hEre/2iU?1xթPIsyR$$oBz!qw5h+;?lay5[IL67\'͹HR}I o[ΓH-BAmNZ(;XհKjI.bQ#JCҬsH/h4$]ˣg0х\4\f(_5[cfҮ ,\o-qhz(?;Y^}[۲$'ԯǠkɄb$;Gi݈mHcwFA{)=4m&iwӴ;%3EήwnV6NKݝs;w8v:;N#q±c;p?vX=]_IENDB`logisim-2.7.1/doc/en/img-guide/log-file.png0000644000175000017500000001433511541757132020320 0ustar vincentvincentPNG  IHDRlaVsRGBPLTE@L(7 %{ 2 7BDJ?8 nU*)%.O*1R(#39P 7>"?T@>2C9Io{<843-HC9K:M9Q:1RVdiHWCXHBlM^Q`UdWTeNdXfcdSkgonpm]m`n;atduBhzk`o}:nqpvO1LvͶd?el埡ڔ5㛣Ԙϡ۷ƺߢ̪>غ_ՠ˿ټǻe? pHYs  IDATxݍ[W}RWVdՅ+P^XJt)ҭacT@P9_3gfN& 9703̧477Zʙ3hȗ׊xfYs鯞#IMϾ9';\n~G&4_ 65b~2)Y IK&¹33Jߡ3002p륇yxT/1S0׌ г_`(}_UȭHJ7m)l(Xycȯ~1ץ7 O7vB tVf>Yk2ITZ-JWXxJUVJT'41APߒ6J۱>~B_&'Ϝfsň?lI^:L|'*ThW%%HLk%Q4Zٴ*\9ԧ4+NjeD$9a=rĤPf c:R1ӱ1Xt͚7}ºƯs`JҥΰQQYj)5T[ⳑjrM7]USZ0h5V t4h:"-ڲzLRiEtk+5%gӧX]Ti+"y$YO5$%/'&FEˋ467 R)nH_/[S/d%] _fnH/7H/_RtI) }VWII{թ:v+F~ծ, iau\\O4wC ӟ0͛Ԕ]Oﮆ/W/W3͋Qج4</<9ٓyPiRMGw&Zŋ˃êx]BҰh֮z0ӚFnj(ɔ䄭-)M}EcDt0Ay #7I:k F @|yw>tT؏[5(Wt$)'юYHMզ5TG!TtKԛo >ɜ|ZEJ|(ÌRi."N6ϲc3oȫw R2 fOV_~*ԫ׸ixחHms[*ԶԜpHr$YOTwK%U$P?iB"/#^ /V*Na >c|hx#T9-jjZTܻmuE btk%}hx-TὟtQ:߇!U vRmOCSAiho:sJCCMZ.Y8WX8.a!UGhh=i& j6摓՟Ts^z/ΆHɹ0ëS5I $!Wä{H0ӻG(̞I7Z>Khί]zOsGUWbe˵Qҡ=};7$O4,uG3~nV7;y*T}ARҜw_07.DeFe;:+UINNyi0c~Zwjgtr[їk&&dlU kz2ofb"x+BRsELRb@Q4z oO۫]q\5~e*zmΝ;;|'`8f8iZYTo%ӑit4uUGI)Oڷw{V/W+ܹkeT`kE]*5CmN+]AMf:W?;!Vy^LެwS Q=~Pz\jdw6 *5i-ujjĴL'V 5n@JzX-ݲ7Sz+*=~Ǻ L&4p7 ojJI#7%nwHg [B7"T * ]ozF61+ ;kۮFglQC6ը$0YC/%T iMC%(G{C԰9pCRRSy@w,x:jTnWjICwH>d䑶| ~$9Ě.{#}/D#)&!)Bt$PUiG$ձT)ENCDoL/׿2%f!ÒaRKP؎7âs0"֥cgm{YYӞh*Y.;c磘<}K2kڳ%ݤML>RQxȾ9QslOGV35rq[/yzNDWcAsh޹Ck|{&Yysxex630_u~$H:I5,F+yYp*n<4oW9"ڄuctFQ؎(ih0?iAxF¤Nʪ#e9Fv"ۡW>nm03 7^ZN2fݞ8]4Ca_aRָw9LoKGH!EK44n\ );) /;N i'd#e6cM"KU"UAZs8@'쑆 c#/E_tŏ GGH޲>WDa*1*eeؖ֕= tO)X%苑bѥۚI# 6q utn6Stndj@j/XlTܩ85j=l#" mR'H%)b#%. R" E@cR.)> Et3@ R" L?`..=\Z[KH0H] )R8IH|n}| E6HO?YR@)A)A RI:@S ItA,iRH$H${U RtR7H77A) uK]ҏ uǥΐKE76FGGA~ի###D}AJU R" NIҁ.6F`+"˥DVS\LV-,Yi H;9*!) Mg ^K;)tF-Nz-դ#wF[kLڵ4,DH1H_=?x^9AC.>=nGE's<{v-lg6I{@)*:B] u zi>Ѥ]nn}'jgtvA0u4gEɀH ͂A,H!퐤:AڡTiH"HL'ԩ* uRHAi;H ]Ѥv2]CT ut]^p}T)mAEK@iږr%:@%AiAׅݣ)ԉm)^vi=v48A@9A K]#hk uǥ E@3).)RHAoN6:GR"-m#SFR"GOpL;-%}/$/dZ^y;{OqH}6l26);<)e =IRa`!e H1 Uze3pA8UHEʷ  â/r(4U =vR~OX*eF:nö7bdLb[z|aN$$E{蛮I3=j3퓅-Ij| r )2C~Ҷ*|- Uږ>ҭ׃CeT}vxzcaϹktf3REڛچֻ[鮡"]njeHږ*ҍOT{o3OW9۵$޶4n- "KZa]VmK{TH_{5zT+ijx kAG1=bݣ] `J)i"}ng~\٣io*I#As" )RH E@)Hd u )Ґ= u H" E@ RH" )R1H@ R1f;H? Rb@*E~ĀԵ Ep/R E@)R" E@)XITB7z!()H" E@8FY@zr)lԓ,K>oI)J =Һ>=H N(@Ȥ@ ?%*'NʼkYuI85]}1I5 t ҆ 2tɮx$oz& 3tqjxj8"Iw>kΗnҬ[x++Tέgs+rҷLJ,HA FߖfAiʷ[:@zxt+w5xmȑ{Aц;]IRH@iLAiHW@iNmKTC瑔g&wRY1t4Y=e) Eں+7$˶Ys#N[L[(N2d):t+q8$k hzqL+:LbMg~Ҵ-HL/ N۫S VButknn:}ߑoNnj6qPIENDB`logisim-2.7.1/doc/en/img-guide/log-counter.png0000644000175000017500000000212311541757132021050 0ustar vincentvincentPNG  IHDR8|sRGBPLTE((dbuk pHYs  IDATh=o0٢ȭ5]3e@NG#R);.a(dKNHņ^b(pFl;1˂V~~K@ {gƠ9pZ<طՠ?Aͻ@C U(m&iSol(5Hp@Om΁&bk t0P[n HBa\D6UffKA #@Pޚd? 0Ri˔,! g@gD'B_fA@zJ9lڞЌʼnʐTi(6*.bS] ւzbs!ɺr oB"1(muUh_D"ԩGZ[@ 5G, +֊B) jq=.qONΠHuŁP4L :m݄58@'d As.o,BWu,BRg{A7!@Pe\(Qh!V@O]f3I#? [C8c^"5Jc[?m'-'9aPUy}NN~x4 L@~`ZKzhd]IAD!eQJ͋&*5|AK֞ Ctc\2sMs:u/eYqEe!4;C(љ3:(i(MjC!Fmdat54^hM*P9|ULo)LS\^7|5 ,]mRC(JBi ϯ =ƕR]CRzU:^.S:sL$9=hz/P mAAxd#9 }(47-?1.GHD*F@;Mt6N9)NRaucAVIX|SSHBYULa8orbCjno+`Jim`m[m(|FDvxufvƤw hzÿnXs}:Ѐoqlz+uy}}ͅշoe2☣çRTҟv쯮ѧvXTֽb˱׽NJiȅ؍ܫٌթ| pHYs  $IDATxݍC+ BiauSAW0 8Ksyrܥ{ܣiO嚐X,#BZHK,~eSU_?Iۚ((bIZovI,>q>ǜ f$h1&4aC4CId'sLjn;:İ% o>dŰ#AfgB싙۽ߑF~|?aʱns}mAB P=E+`{B%?'gf֟$#Uwx/7HsmS&â{ K]^Evݖy1^~_bN'`ѵ'vp±lJu~k;s܌PXzb/ꥫ 4>)$ރ}C+vU}-05\b-/d}aa%kcϹs.y]V(;](I=dƓ_09[ cyvvBPtpoUgm ZLrzR*tمR5i;OV=[`CL4\cS3|Ba-u^zaaγo%ޛ)8%M)YoCx#^-+燸t>b_ rMg n{Zk=0ح߱|i˱O GDj[%kZb׺9I<,/g luޝ-f/쐘41![oA s荳dm;<[~$I˦{{71zXk'kLnF+̸24p- oٖ]7=mNk zz/}Ldw[9+6;5`o;nY!e/G0 Ǡ{\`;l ($uQvbx Ʀ{jks^ rF7nƐ}l:Wf1hqi?u{A=v\3nxZyX@c/& |CAʎ[ª=E;ܸ3[`_jŝ VKm^{9/{zDQzl?bmp'|sk u!fbg|$2fqʃz(eNJKV!o6WeW%WGq{nﲫvy;tìP[l9J"v,l߹KB>7u7nPV͖1l=x0C[FлkJxy`v oIYwGT:Ƃc۱ޠͳ Au_`d/),gM]llKФ_oRmNt,k,%Ʉڽ|sgbIϸC)Gy8#Z3-ds>{v.ڹ^=#Q﬍W}8]JO+']gyք6%O>;_:(^go=S^6Zq,ON|-'^| e5~-™7pog I ~l95H~~}v|߾$YVxv0 v55'y9`o:jS[|Ʊ{SX1?5D0ƛª:]<1HQ\} 6Ayq /@;K_f9[{J_I8O0>oZ3?hVةOvN_@ʞMa}(έW*Ӄ}ϔP j͏shv;Ƒ7[vXޞ;^]?}\dGcuDIqJs; y"ʸI^̘pnPQf`Ͽh y%DZjvO3N,6mEvu["wFSbOg)y[X?OD㣛]5 .ssc_zك>W#~}f:>gf;V;>;#ڝ `sTGg'ߖf$Lvwʌ:ˮ]%=xʎ";uى{/WR{OȾfj<[jND2Q Rؽai']$S~J<OݫR bϮvBaI?./HHaUgoHtb?31Ůt+ׯ#w\tQAϕӊt/v͎wnճnv;ӄLx:#j.eMRx>Ǟ#ʭBc'QKEQvL^(˱fsXvΛNwdDN: $/'u.e4{=<4u-%a_VZ?҅|&1NL2vŮ4c/®I˪٤ ZɎL\KX=kiowف~]wށ-;eGvw+Mw׍tLvx']G鮌zt➣45v]~Z>{mBZ^ku'y8IS;i qXk;^LdĎ=*x2dNXQV\xK-ZOXݼz<=3U>7ļ]Kq+u}vkP^lc_P2yx:u~^&u^]Ns5q(e^PX5{ t?|i_d GG=x2fߧ._zptɞ[16}verfruK}\ݮCɾjjo vVſr?aϙNwFDzw9Nn: WWb^lˮCɞ3y1lmw%J܁{TSV;٧\lJ]dig;:_3z邟ѭhOMQX .~C<;3S^U:geG}( ”]46Cy()obvVMp+vf/nJw {PNH',vsXͫOz!륛 5{ͳ)'#^INӹc!4s2s^rwM{򓓚=ZjwnX9¬wD$6ur=Y^.X2/ fbo*w;v˲^R*;iFP7ر^h}d-Ry+KWrZ~Y#U+Z[|XjVA{}JuBEUY_XwG!/#> QjKkXKQad_xa횽.5]v_ݝXimckϮk"\BC1v^ٛc]q,]S+>Qp /m}Lg{}llL,b_6%O|GP}bɛ7olAl=:rho?A[C?'[{05{ӳY' oi(o7Y͎ҡd2O,vjj!Äg[oDZl6Bpblks5š; !?gIHBnoZIl1tv+@ZViˮ\!g\wH#g ^= پ؏Dv+vkgג藱ZgnVue`W/{iٓ}~f02xߜ;4oxgg?'/dݦaOlٔm63cc9ڼkpwM,cvt7Սݺ' -{zHHu 25eOMɾeo=i+lcO3eg;])J`;4i[_[{U5;i6޽tc*8/%Nڸ]Qv|a]7eo/Gnos ;lǫAЭAey{"#Qף{5$WD«ngBf`QZ9J g$[%$i{tG|eernmma^=<˳v,3j0#vjxɾ׶I7]_.v_w@OLW:.xw}cHwbYu<^lXUat} hoohif {OOϲg|+Jn_=b٧:7]uPEu^lO5{O5{]=(?yum{͛tbh+t[ytNLt=*CC=C= eTIK_IW}YBH|Ӄh'k;v0^% %~+ p췓hI;cB0Go94Sz|3@⿵BW[qfo{tQcOOz9cn7gI{|!e'V܄4{3X+.v|z+sO,qRם͢"W--v|z]="ڽtu;Vu˄'{_/,m+ŰKՇ]ze(6^r@cis2h-=o-=P:f2Z'y>97s+ "7)o>NKYll-MxV8O=ټ&y/|rȖVU^:K=\t]kvͮ5f= lϭ.ٱ`_t(٣s@/[^lX%T?>5`X:z>ٔԤ[cUWcܯS ށ{^ձt&vq݌f{uB|suIWűt2]sPaOZKg{G1u쁯}5+wJgvc^wdyI^E Oģ{1%~{ţȾЗ{?ff{p.#%AA;wZ^ռORC {3py^ x4{:2nW`"Ӕ4gǩfoB~yH}zý·ׄf?9Oo? uF.egi #SE6WhU/х| M:;ke8ڒ5biPK,F/o^r/.DvnP,u[tdwB=;wޣYDn QVp w.@Y0ב}laX\#5+1lad_Cwl΋t^݈DJNYtݩK5NץR!#Rw<Ʌ>ɻWk~;cSlgŎ{%{OU܃l${:9o2^b!aG?\DX<>UGD?gc%" c^IENDB`logisim-2.7.1/doc/en/img-guide/bundles-error.png0000644000175000017500000001735111541757132021406 0ustar vincentvincentPNG  IHDRFsRGBPLTE8 a # {6R7<?YW6nbc U/,)) -4T(",5N<4051%v/ Q#;=7=>V]5+E@X6wNMfCYKIj`XOc8rvqfz_Jm[m(|bovwuHGfvhzn^s}9Ѐouxz.&y{΅7C+{2u ]F%CZ0#l]OwWN؉|ԝ&N{/hЈG6v<[1@+jQ;Aڶ̥"wDQtOx94?A tv=aqrkyT+}/ղ˦ĥ@H tY z;BO;;Ճe;,#\_[`{qvDct5ȪƳ6!l yvwuWwy;w)40;Ǟt翊qn-0hVfbΉ h|[Ɇal Pxp7%G/VλA~}d6^x4x[Б&,be_V֬4ybrڦu3tqs}cmy}%]'f m˧I.C/Tw=!͖/c`ceLPb\&bȵ]kvoWd]O2o L̽*U8ئ 0( gv.qżFݙ6=#מ6\-<tsXi ӽtRiKށ]P@C?؇[$eexU9 >LS؇tfؙLAͿfawm#żd_d>|c¯줐wcYO ,LPe6f ^uwny9'O n<ك=nm-yp Ԟ],PevOD Xj>\w? _9m߁ bZa7.YXYX t:F6fL8.Z;=[VR;$|:m,m %s*H:?-AgFkUﮑw*"{z!\ϙ^݁2%̴-GRhlU/;^L犸Sxgf+uiILڇJbZZusts /I^EG?ϔ#׬ysY^]bw4Kj|pn[;~atqu{PiFxp U! k϶n}50~jmEc?.ȓ0&0)a x`Ra$/;/_[n/8ا1!Z-Lne1~.waXgTkn t_å)MlFy\/p/~ΟW _Xs>!}!Om|M#l'8!3̼5K|L_,$|^:5^/Ɣ59.uT~xe~pR?}n?y}ѽ?{݉xyd,~'v>.΍W* w^8J7+Hs>PNPbG΅޲`>k!?eKuqyO̦p<"~pJҤ/&TٿXI!/֒SPߥl5OQN,6iEvu?o髋 0/VyM~ ْ'/Fy"_ NW}K=]%ͱ~}j*C;T{_RAD%0vCS0{g*"#Pd=Q/WvUdUvaB+v;#l}8;ّneڲ5-AE='vu'e_3^li~ܙuCdODI-`wd] ]"Y,s3^lо,UN8WDž<*~tq遌ŵ-.Y9ҙ< 6L esVbvtpeOaS"+?f]w&;|.Գ".P}+;O.ZW[y@I6 KՊɞC[r/ƎF'^w{؍AUpm} 2rٻ`` NM_nnADZ@J)7ήi+b;CNWD[H}ۙs?/B HnҎVV{sk0&DC#q8F=%={LIv:vBnjn< vZſ/*аgV[YnDz{9N9a(oz ߈u{+ Gގ7[DtZo>3ccՅloDvbpcw]Pv[/]=5>699Fu}!fot{S3^V:geGj}(4aʁy+il{}LgWjvξi>s^a ^74{wCK52)aOTV[BK7jg{C&sBa9Te Nاͻ{ӊ=Zݰ4s YobG`珴Ͼ}e?l %ۉ%y!f'VwYcW4ʎ}dz}}H 5Rd,]ɽoxu;yN?CÎ`uƮ{-{J*݉3"{`{&U,Ò퓓{BEvk^FoҙB3Db#d'O\F:+C>9 ®c$`Hkv[GY.,5wc].YߪOgBK'a?մwba/e~}wrzsqz+lˌqd?5؉'^tX6K'e?yEw^ Ym+l$۫?rtkgHdw|ڵA{x?@ܾX6/|իz5_S`^9ҹ2w`?iǦ~ ;]f83jm 8^tX;e9ҼswMhxief;C}}lLgﵱz*vğD8C]g}2]N™TĎPc Nv_~;TՀgӘuhKp3{Ƭgt y v]Ժ>^}t3:u{k{ Hܼy3~O,=^YkPD$PJNձ{p yٵF {[K>GsOc evan==~=OM95lWa`{zzl78dqȼ##Rv7Ǫ/?X߷퐣fWW},}DuM;~\lC$g+Kk .,ݑgpv>L|0l_l&+䙺b}յO^)*ϺunFE)^]~kAɻbi+f{P~}cOxv?yzN [+T[ytl "H$({b${b{'-TEEe KpZ3IJ™r^7wc;&Uk' :'Ryuhg ;!~!F3K錢%^_k[*;"𧗚 8MbG}-"LZ`&eR\e@8O~g `NvzEv;~U[z*8ל O+v^bW]+vŮ>rk+\{4}׳GGGos+=J쀎(T]E`, l_Sl-5;96n\ďK^O<]U #%?F]=K VO)Ww/sV񚿊tְn5 y+qm\b;q: Hg2d, YJ'C+>SR͕Z5a?m'͡tlzOJx{h؛i n:ǦHaOQt۸Ycd^+"_`(i% _dWxnR{'؃b>Yʘ.fPu-de72oL[u#%ثNf Uݠ omYi}O~Qckl5,+Zh&_4DK 9m7~^LyQtkfUnX*\v'*y!o50[5 zդI'ae5=R}6jIJRY--{X;pnkEn?󹗎}IKI*pyjI )<"W^$%7I=)l ЅU^pdb ;=faNINWyscW'"ZC]FJwޞY)R0Z|g *b"{P&;kVKSWMv@Wccٳav'R0Mrf)a? NߓsŽ;B^+ TɎP#{OOWnxɝ-R˺kT!(BNvYGZj'rIv-|~bol/NQ`UȲ]Koݾ߮ y_dPH6wލ'V6JEYe{7v_ߡ"qYgj"_ Rξ: ż.K,:D7n*Tt!{o읞;,nrP553",ž<;=-謃tN˾TB+ji{/s3;zpzz!ZbHk…fo.^Phbĕ[P7ÏIENDB`logisim-2.7.1/doc/en/img-guide/bundles-create.png0000644000175000017500000001730411541757132021516 0ustar vincentvincentPNG  IHDRFsRGBPLTECg % !77<?U9bW7gdd U+,)-)R("6^8,5Q2"7 Q!;>7-?1.FHC*F>9Ou9%6NNRabuAV{RRIXHBrdY9gULa8ptd`Jim`m[m(|FDvxufvƤyhz8оpWs}~piou|,y}}ͅoe:§RTҟvѧvXTRֽbʆҽv؍ܫٌթeM pHYs  IDATx݋CH|byV䖥@,_PXY݂ + xxf&L2-i;ڦI|34! &( HcCc&{SZp|!,ޚZyL6~(pi0!o? p%d]^tѺU'f}y ]vnǸ3}j֪A/"qwc{T/\]*=RkהuVWNo\uz}1 GEG-AW8Gx]Pt)PB ޛRAkطt9-0,czqJ`'4k6誋γoy*Z .zR+yRw%2ރ'+-и6@bUd 5 T}^^X[Jn(O^uɽMo w}6[puox`uq2MdpuMʚ&6/_/H啅{G-!}&Nodq4|d- U9/`x ݖm:co#xryOA}i5GkDht %gZ\=I<.BOt{G8;p:lA.ՅBy?bꨲQȴ.}Ⱦvskk7rdy4|tgf{ x/{,=1]7v&./Xt_bli0EXCb2{\lJ5 %3C7ΐ7-$Wk4|Js7hK`i5ʎM0.M` &.Ox=o_aǎV I" b>G7e.i1/ǞBL& Xe{ 演AM1徍 *BޛY =L ؝JvYM:zGewUA(u Q+ݹvuƲNvosP;s]ƞahca+g=\^߄Bn6L4`)ڒC(/]tq#ϯ]7❳蒏"=ڼ1Gq5<[û4YF}Eyͱgi5ͷIk87 MФ]IoR}o 'ٽXC[w({bzbƝ!ƣ)nw׸t$v ~w0dO]n:E;=%:mQt׸$ ;߷2 O~^)}w&x==3v"ޓummByt:9 b]E?C/P3zJ= dߗL]Y(wCrSvp~gG7;*T/C긙tS1%.][8qllk7Ya Rw]OO^zT'bO75!cTWz8wu=x=*]i*?WhGiLȚƆfVg8e滰ޓ]>~|wV=[LOL Q%Z*ktasrK xQ*觊MxNe4QDhF@ӱY-Ņ\ mz{gGW Ւg0⸺s'<8nF薰 ,l!U}D5}_Dą eaҰvd?jϾW !dt_堋Rt:[,!!oP/_ z[j]]s<_=k~ogw7S)|ԦۊaǾޟ{L8aSs)^̍ǮV`WK_ ʼnMP;7"y~>q >rC\QM~o"Vx3?v~~=5y7;·ttNc_gg?fҨ7gF~&iKIVG<Ԍ3Ybo'B!3X_U4؋ U_=촐˵(7!_ i͌>1%Mk9}]]\7='UnKkvgTʀH@/6Qe.~}l&>mg;ViϾ`B`,u¡: ;D4&a曈,;NC}r|ۆDtٽcf'=[);}f'LV=iIwj/-T_o@7_og-5z"LS0vɝxW#nwJ.ViW<ƥ^Î[Ew+mBai*vҍ Xi !ӝn}PeÈ\di&-3~vpEv]wIBAwǗlb`[*{>vr~ ."twySv:XcnuvKn]v<þsAyٝ8/;QVE>ԕtaxg}lo;$TTM!_n;"-R7&{wv}M:\V&1^vfMdB -gǜn^3~j*W7Ĭ[ct?SgثT[3 u*Hvt[x :g$j=P߼s?e-п9zvj|oϰG}-\F,vڵkža6vHLD`h۳Nvl LX4x uaJNu{WYذW {V?_a z/e#a^:5~-]u{=, -{{s[|*RKu{aC m@>1cեlgwodv[٥P?#2.n^g{PPxyʞIPvI~7l|+k+U#p>CI_snSGn*'n˽$q#a(UĪd>QhK;I=c~a zN]u(_Xeɗ]:;1v˰~{,~Bc *|>fFE>b}dduXþrNBE#~`ٱ%bwoϓ즻v\Bt=aE þӝ8{pN!?+cc _($ۗ3~sꆽ$읝}'~0ƮӇT2ɹ5L¾cnҞa`G'bD'CM:9 {ث+L[qt^::Aف{ {dg=}4a-x]=^>DB~jOOs rWԼ7|;<XWIӚw4elV=LƧ0sn$?!}rOOoq0M_tŰ'-哔ʿ)(oBuЗәbojkYrnU,74'%A$R^&Hr@S|@v$@׿!o {y,P#팝MdlRس~Td;}%mD.%zD}҉z_viKj𸝸?lYn/23xv|diҕ3؇K:Mb2znv>Dj]"<%~C^>~-ݼ%u^7k;OK^bGVP =Xӽ»`7ݰT/]avmA!)K׺avg$xF!NJE %fo5%v&{5 y<7v0_zKv7lv0M,Y!MqS&P Etn!:FM1Yޤ ZéRw-әa/9A 6*__z_nof R!:1u.\ٰ xE'ȩjk-M:zi_U_VOXT!᱘dAlpp84kHx^Nv<7?;@=)L߯[Z=#L8{nwAӱtlKGR`ngl7o/){,V%~{٣<\4J\װ^bLl`8_ݰW Yܱ8TGyJw6 s2#{:a.#P&H^^i#^>\ G {߹se'_sRU ;] {Spov^x(u8K0i~qаN!yyHo>pP򆰺g-^ʷq%;afټ, {xE%ZիkL!_+Rb5R|~{;O%OHJuɎWZ`/%f"0B혽tkd﷛B;jv*iY]6DQ!d{߹`μ;#+b"p}qݱ9/G?R"yԩ`oh8|D}?MEIENDB`logisim-2.7.1/doc/en/img-guide/bundles-colors.png0000644000175000017500000000312111541757132021544 0ustar vincentvincentPNG  IHDRR8sRGBPLTE%*B231-$S|1]75dbGHFQSP#z%DDQv}h[[RRqspfkk`~}Y[tz߃6m쳲nmĊԸx1bKGDH pHYs  IDATxS8l= '`c>B 6IA 4]41-3khW=F'SGc(]A3h͠4f % K%3dtN{h clf=MB4fE_:D1\d0d m!Zeʫ F({l#^T8r+w̻o,͠4Cu7 =.B`7eN-H8;I7OOS\VX4@9N eBWJJ}UUZ\xL`qf6osUdYgi_GWkc2~uvtGFi{žnW6ϱ{$~pktyHz~}˔XeF~1ܚ̢ɰLvRLץǪbٿ_}Ӥۏܫ،ӈn pHYs   IDATx흏CG'hA RH!jHr1 "D~X #wu؝ٝf#l6cϼ73o΀X,I|,ȟKR,dj=ŭkcc=Na uȜ'JRi,HƐR!524_T6ԴXt# m%9{ٹ%'-v+K|@^a+c+K$`(|3GkpKcI /B' /#LJ^s=%?j*!8e:.Y)/25ρKـO\g afDGFLLtzhȊ^ۢgJI : N?8=4(7?/5Ϟ=ˉ"3TfGI'EDE~MX/ fٙ:y${~@FNL~u`#rAS>qE YZO=OD {Dߚ=_K P y[Ɏ:KԐ@D8s<9( =w }j uc'U:wP`-{S|+?mB4Q5pc{RI﹭l{pg/:?  gƷj)[4~/Nl8ɛ~*<]0,&K{'Crȓ>F+} w?>)(<@2W܍ r^%׸=9C~AE2R7;Ws f dUWjys3^Uzy3|&g+foQ'3g #DkU,|3yb^&:J~kZ'j?]%zTCAz :d VHpO3ZMOLL@޴à yGf7B~;;$.gKY66~2(j?:y wsN<ߋ>Cm^vv y)%ҿO ytހBj=Rz:e+C?OUOE?iSD]0̐_zg rD9"íGkkbt}:Hё :q][cSEwrvqZu+:m9Z{m1O}@Bx І[=\ɣl?ېgk5=B?Z/z~m` lIv؜roonm oj2fM9!gɯ[%IõƱkwv \VÃcky׺q\{ص&AVsjCZZX|uI֝j1S["5]I|ԠPVbfl\[խXe%C8B E0HjfJ-l{GԤG˱|[ga{>}Wn[.y] |E~ō77.9 y\4{tQ3͓H@O`oQ?2B뽣7O,[05B}WyJܿ(y{o=^^諷!uIrVy[ZQc ;|Y}K\U'$1C&__AAޫ?߱ =&b/yr7쒱. CCr ¯޻T{oL ɛ7$61ZGDϖUH=z7ߝLuvei4]b<Ȃc#}Ͳyj?cm!WbJIv6!Ҙ!;w:Oށ'Z]n/ }}BgV'If "W^Y;!C,x!vЏP؇WTSX>B .~ې9+"!rAaSפtLmhQεt\1W=QL2vӚ$?SJ'ȹi/`Օ+']Yvea762%&]ڜ(ߜϵ;G)"&vg0"} Y@o^X{O'~5{r2?k8Ad%k'b+T-d;}0"0nK~Yx]+J<ꗈ[TxYǏ9?-7o[pveyv'L& y4Ϟ1o2le.C /ʝVOn80gȳ开`/@d ywNb]bCUwG?'cF":&ǁKu#yt=Nct(1}?IJĕo4ox?nAtS)(%R4^9W㝢?8Z_u{wOW5[lnZV뺽?Ӑ_oϻD\>,4%?홼,^[r) u ?=mxj&EcE|dY-?/ AOKA QA|qx.j)~Jqx7wK +#OՆo#-1?#:yBrVo8y^.ɟ*WP^K %G~6$$?ZI[G/ͬ$)򓓘9ӖΓkoV]lvd0j/&?:QkΉ5+U'!nnw!-n5<W3 Zuuw OP#o{}Y*!őVjy[}<\-XrWD*Sa/}E?;1VL~T#?:jhO~3jjW]*_U#Goa"oy'`qZ, <4i!>өCaij9_Uת#ঢ_4DA/?-XYe ضZuh(mtaD0xLȿ_ތmo⾚ 'Eވn3AHa1?bWɋFxvE~pp b΅Wǒϔ.LB}u:@N/X>ؕWUsr% jkw'yy=)T ȗvQa_~.}xos;/m qxw/qxH~@@ᕋnt޽ڻAҮ/O2_nu֓f07| Rlix9>]D/yߞ(K9fz:Gtۦu&ؑ8%Ȼ5^_$3NNGH &$L8昦;/Gn5%4=?Ecc}&8HSE/:<4t=?ۆy4`Ja =.$}\䷼_7/ EYL^]%nΣѵ #{}m_FFq?9&OAYɗ'kJA?5}C>`>7S|>_,@z\&LVU6 Qq]`u ybkϟps Z uը?p:ϑ'Jޑ[k# "6ӘYE9,/sJ+ۖ|殲;G |D/Лn/7|p־㼷->Gep־m/b.iJe^Ff4oF,d<[~oיz6=94т:N_?$@Y65I^;|9ɑ Hbn%MkZgg$V\oGGۄŌĂ욼}|]뤵y)uzr$!oE>OoyD~@H$/KHXOXI3%yI>;7v=y&w[54":0"u>:9q$H:mEozF> e@ZC@7 $Ri)CW"<#arj}f#iK]|mܪW c#v|ǐ_ϫ(|'c䃫EO ̇b:wF>qxyI^)乹$"ʹ(7=Ӽ|p,X!lf4󗍤oGފ"7wUyK/_^K:QlUIDATcea_'ڠxtLl!lI2(~tB7yi8<G;"kpLw(s|&}tɋ-:5-p]P&&\w:78<#yvjZ W?dYmfQ&/3Z{}jZvP<O3Ymo>Aqxd,>3(O~ UK}:o{A0($/KBOuO>RN^$'/t|x)LĝCH݂sB"fmۮۨB!u):/S#;'kL$ogqzH`&3I>6qxL8u=S$7p3sRkD$FJYof G6S0щoEkq$$6qxj 6n`B1BEěٙni:H2E󁓷jxDmCP ԘYhq$'N|+$_,罓gI[ON}x85YN+'[|&t)'[|*[uuL9y0䥗έPNw;G?O%֕3HB? IkEQ6.7Jc]]ՄN?;SWG|_J~{//0ygaq8Oe+YV zw8D!y^,tƌaqUF|Bɶ}\ڻ%CyQq*_Űq|*Oȭa?nob_X{XʯYH9ǯbH߷[J>Ss5<(U[uno۞VX!(PdVyEݞ#_ Ey-BW]{rqHKůXny槸ޮm+Dܞw _͗v%|ziZu_ϴ;cdFEJP-%ŧ\+\2Cg!"? K SIn_ԝF-7 !U:|2dQe җN:\],}}-+-yzCfKXwzv!Z/$-B6~ 4c7ֵ z@=I%򭞞XR%)$s~?l@&IENDB`logisim-2.7.1/doc/en/img-guide/attrlib-nand-select.png0000644000175000017500000002445511541757132022462 0ustar vincentvincentPNG  IHDRc sRGBPLTE9i #:2%[6U7TXe U*,0.+S)$4-2O"/;1% 9>7_7e-FN?;JNQZ7O<6VX4 dBWJJ{RSb]{L`td M W6.QF !D6X_Ϧx!'pFGij]5Xl窡ef֭ݕؼw>?>ko? π_'@ G?=o!?Cɘ݉UŚ '5ȻA^Vُڻ;3yf E[H?gOG-[]69|DO)y7m38WϼlU?I=;Qٷ2_D)w:u 6I(~܂N7HɆ[~@6`SyMb[Q.-gfUO}_&&ѻo͞鉲{]1ϕJ|.t׫k7U?PE^5o&eW̫+?(%ODޝ| |M|3jû3xg?  v nKKkkf".gT=mwfo܏2ǵ"!D3ɹ<6k< AOB"_F/j$."_J#(73x=-ͣ=]b?'A#yÆg7%`k?K`ί@ p۟AC'(11bm1NڟnvЭ'yNҍx_zG  L|E`Do~-!| u;ț6@ThXC:u=y36wv/ Wbp-$S%uc ;^[h[e5OORi Dh~Em,/#b ̫`H=Ut~7mX%"][f /ῧ҉“#Bж 847K>vRoݢr~j^;֡ݪN?3 )=-j<KМZu$zQWxkj.~ Ζ&8nh=m"RݐQ3B&w|bo '+fyj J!M١wo=&b a] aA<́|9|[nxX_yoǷ Y|w^w ;;meinfi>Uƈ_qCy# d?n!ڔY t[60$WUj^зMG9U"̈=A9Oς'# `}1V ! ~l+K+[*wsjaۚF~$-6GU7KKK]+eGt֔%yJgii/fGGGǝƅ GMetasðmp6L'mmS vmv߫wk2}ϱ{ot|<~7-ߔK^c4א%n|wln>vM;C7֔lB+o϶wpPOٽwWo@y ^ށڳ׳K~.F#qbN },7[YޟΨ9iM_[=6|o|hΫd_;)]0\}p{G(ܴ?_5 i'w0͍X}6:aH w1n@!Wz=G᷻?]g"'SNY!9$OO߰"3q T/,^^' ^Z_gBޱ[Y>мq#@{۬z{}l_?dq t Z@?VV/.]Skf ,/M6a7aBXfF+  g0?U|Ji$M&WY$yiI'(-fn%-f"_%yI>%yI>w;yyZ(X(?-䛚<0-yնDm 俿kE}Qt1+Yk4<%:J3y y;Br,y=$7 Zx7RA[%[F\|+"h[%+ؤT-ҡX yKzy mCI`x9 +D/&;ɣ =7!o> @і\g@_C<ַM"Wӱ y=ɗN,yv%oiH6gs' /yc\3?Fz?R9l:O?tËQ;,ͫg3V!4G<DӸ}L{B)yJ ?k,xEoEuuؐˠgX:I =X%|D~dD#?⚼ W [kΓaɛH0Sk$On#?’oyII>U$N v)bOԼԼ$j:x6|$y =Wrgt1 !&(o6C%?$?QC1$!gzYwM#?4ɿbcgX뙧3%IyQWΨy?gymrA?/$yϒ߾>@k?̦AwLOt OmgMW%ˏV OL/HGw1)\Y:69Z,|+ۯ~y5%YvBGfM2z ۘW ɫI~d3x^L~?(JxT}G~l^|X!'|BD/$!~Es8 jۑwù=DvdRAJ+N>B?siepp bV07*Wo$y3$c:ymD$0A㓅 f@ |sv;p-,?٨h2[e7yIڐ7'?k{ 'd;dz4>#+aߩ@:.4X<&lm%|EE/mDuOz~s?(+d6Cqh>Q޽|/xH\u5^+0h@ n>H4мV]mZ\I>"hggycdsM\{/ɻk *cs~<w{ BI:k"i/ǥy1< 1$ C֢ؕN==Bx)΃`ț~)J1e(O1J>0NyOqqyϗ59|bO3y븽]h>1]K y:ءӥ>佥GNQм.QZK;/mmr\>n䫴K%oRwaS9x|m695z|㋧rq|qRTyw֒|<ߥ^~Sap|ۉZ;O[%;M >, yK\:|ك2Wk絾QywaP'F.0.+ o;:JPÊB!#oR즲-~[iHo\6{;r$r!KܥGRxϯsxh؄kil.S9+VyW] ɋA^3NN#$A9yS y&/z yZG|# _reIOLz#/4ᎇ“,)]K^̥ܕ" ZFvn[od1_hOP| NZo\?@:V8uLwz@PDM4} ufV`{buqpڲ[jJ1C\?h]?YCwic!;C 6_ /Z7ՙ籷Wγ^j>tɛq%-:?CM)_ontI#/ǥv_~S/IMH_|1&+7yS /)C/?C|Y?Ȍ{X|b=u-{Ӽ*I569ll7~IK1T,i5UZS@=45 8O?%=C\kOg;$Z2QlC:?syÈBxFsUny|#c^ڸȯ 97x{;に2ǕcC0楍Ue/1w9U$ xռ gkiF 8# 0ep:ߍLYּ}g9'--{AWNޱeY&=I7z\sC"?4gy˥%=bQdɻ<:ѺѣHtwR?o&^dѫC?$GoD >ly2EMѓ-J`cx]jsH/I7m*-Յ> ۷Z$'JA˶Z$L|2nC[ytYeɫ-Z̓Rb[8Wb$z_<1"DlL1&(bxl!J1<y{,z^eaOqu>Љ擑tcGtt>Iy~o~{V'oly{Z}LP5<@͋=M惪|+J᭷i9j!ߺK󖥺2$#Lͼ$[:#5o+֍ަMNC7y/^NϧF~4j4gKɴϹE24w?eϷ?=e[]9aDOh)|ssH>/bm=0awM?~.gB!)]h^ASO6C^~Пp*Oҍb5ͧfD]γ9Mɪsb|!|w<|j."/g ,g&?WR?͙.5ѝx-Cѽ}i%(yOK_^P'#$w{{/䋋UO>/GFE]^Ջ/Jf!5O;S_U/Cc+I>2:o#L'}ߙז',bU9[mB^^ɼ}\O^voy 3Svd$'}mQ˗$o;*ǭ$&&30(2I^&K:h(ɷ2u:2R42\CT࡮AInWopK2"T fhY/ǝhJ}^;v>6pc. /'d5'""َ4xqk0yHx =}_˒|R#FM'ugD1@]Cmĩ;q'^*K %)%Wy 5L>O e3uI65s|ROSO5RC6GѧA2\ 3CV }}\J|S푈;I> ~!k y|:c|Xd6޾ˈI!2CVN|6c]K%yI^%yI>%M6|Lt:$y?Ûɛ,@EC~PL~K}} O-~IlK>gŹIsZ%S oۯHzIgٵ`ǏzaTԿJZA2$?wog;DT B~P@~&13yr3xJI"?h&ߗa\ɟP|^mO)_on"/'ϐICN:q$ y 2B$&ͻg%K$$yk:f!P 6Kkvo_7B.|,ZKajJur^ڰ>6)%_I~u0OWd_bxI&_1|P\k` 濙'dpvK3O&ac4=fnf!=<`^L3n?1H"ȣ0;ѐj^G^2iy7_Ӯ6fv'$<U\.uPB˘|nMl_"~0yIɳfOyӮGC>@w4^G"yH7 0i9zD &O֝)y7Ӯ6' ݓИ77q/}7=-G B1H>LKu8oo[`tgu'tgPfsXhEyIis¼}.1+wew=}ț 4izlM#'QG3iz|N'|-3y2:&G7Yk,i%޻$-6)A+Rlm)`K{Σ%ɻzűr=[\NחCLFz00rDpr@8:ɜ/͎3_K&%OE3=7()fңG@WiG_dΝ?'-Mv7 =.B`7eIIFN-H@;I7O91OTc dD>HMBXWZL`^QkVdXgi6yv_GWkc2~tvsGFi{žnW5~pktķ~(z}~L}˔We︡~9H̢ۚɰLvRL׸b¿ٿ_~Ӥڏܫ؋+̼ pHYs   IDATx흋C۶F)FW(+ ;B(iҔo #+o=lK8D`;~Ȏ:Gѱ%-%N$x\I䯔 KNj~eWʕDG"u"Uc2(S#2e (a?  2%$1Q&gK*9/:M=aW?E6W|aɰ^* O;LEJ'W{x \lK?F+}yS=ɏǤ}sɏr&x2n,1~,,zWogZϰOIȯ b?"qɋK?Fʹ+RyNDˤƞ t A?V _Zں]&ɜ'O7_`:|57y?r:;m:E,YgE=+uܷg}wUo,m߮Ie{)01@x ‘u޴hN=w:d)$Z#kpق짘yH?~Ew):ݽxc6|xl~3)wa҇;A#1-N=M亗 \˒pY"י$i9ɵyOЃ XI6x)} }ov,fEnX^'sL?XDa#o_rcq^ v$;g,wm`V4#-C^!OL@}?&wdݽBsŹHTy2/acvk= #|t̖{Ejj E+y ,@"5wHR3ȗ l<?.wyFc3Hzoo{{j~e۳,^J¶F&QЉ˽irmcӓ;o#;xU-NwsoI/À< n(V@3K1:׭x y:<ՙy -.x/1$!k|gq@QSлQ6ߩoDi"+,Vtl%ot#u~tcU/z?d/7S:}8w#a;|~umt9` 9Qp&ab!!|0#T8׍A^ Z? =Xޖ(y(j_ݧ>m!ƀepg򤸇<]$?E|< Y{'C`r#l6O-&6 L9=%'_.㢛ҰtTm/ߎJtT X'}N͹>l׍ |On2C韻?s$_|_"Ъߎ=]5IT,y[j1GP dqUp6pjPߒ$_qg+0Оπo[Y Ny٨c*O[CVϯ?&_YYǸqݞ6VUssݧ̏Z=>p爵κf?jm==]uN[[/ k蒰b?DzI{}7/Ӗ'lɩ: Q{#n+ś?}#l$GO{eJ_!-~~v]L}u/^/}}=S8v={yXڸ{+r'9Ecy3{7 p=^s *,^y2=\&HDقg~;;8v=ikpAjv׭GGGpg>XН#]&0GF827lAy~H|?dY:bl:\;G zIwK8XڸgZVNoz'|_,IRG wH.G|ґ<_~/!_^S{|x?56RJN^2Ǔyyy #쥒"o{ޞP*&>b9_ww'?A0:OŪ6\Aoҙu! MB~_l-ֻ`MYYLYZ֪䟉:σt$mqDyg둙HpOZ $yJ?^u~0yHTo aW"MnN'?őo̔YUBh6]`?/Kbaw |eKi2SF2yӷ(7 ~{[i`%]$lDUו_!#:keee%@G>yd'lvAk}7krmY}ŭn= /,8cL؍hZR&/4ʇw;z=߻꽕xjEc5|;7U"A"_E{Cv'|m|xKY?RN~]|"_r>mVE>4 ?Pm5O{^F~\rk rN9IO:?Aɟiڛg o7#?k_N~0ȟio޽$pB\ȶ0y/jNmy Ƈ'x=]ؑG!ˢL~';'A齨Λ#96GLeoBe}u~$7nf'4BٿGdzqЎ[LQou1.><9B-G#̇g_0'ђ !ђwp(O~q++7&/!'P ]nz୎>14ɏm϶ .R-o~QN~qJRLC99"=ADuIO]%+TZ8xΣ? U-%sJk>N trWʭFގG[ݾH? 8*B-5/z ߇Dë2O$o/ Kk7*&vx 7|7i#%o@dWzF8҂# sCrȇB^TF|ֈ|=([؇|)Ro(!0U9fFޛ 7PG(rb梉YN<Gg'l_@( gflE7/cE>{iM}h,XF L^gHORM,1 —#eܣt n2Sl/X5䓶i$ځ4Ip.<5Oq6O4A,у|W d)W O YgG@~-rg_S1dQ cb,:y80IU$cƹscRL.t7nhX0eHulb8dyR'r&;MHbfl{(4s.y J0]d*m%9m Ht$A3^eg=lPHd>M]t7gyrܼr'yjZEn/@g4)".qLt_(yOm w /%w%WN*iӺYyL6=Oң.f Ğ|]d]+% ?/HZ2oڇ5{iUdyp.~r+|"+"Ojm̃t"I.c (ǯ JȣKChaEU`ڋj/mo$ɚ%5^Bړ첑<))iU/2#Cr0/!S;z Kt:bn냐?` MvaUwz/͡> a r$!ORT-ly{i#|V#؃ZI h Qã:)W]Ó?5x/mcl$aQMY{)EI^k CO€6Ay K;f|̪s6s% x$+K]3yA QGJ~0ȈXHZo( "_q#?(b;YX*iqK9f푆(ux`?/(|.*;-yix]xBHWprߥM|xk&hϛM *E/"/<f#'p5yY`;y7EeybW[`;LHۭ=r-Jw̵geЌ@WՓӥ&ْйq*[6`+}ӪifUz.[OF ӱY:"4!Ek_E^+-GBS>`5WT= D]jxׂ0"_> , V-r$.^A|HVh cKهN_L=Hp|tc׏_W[<^o%RzQ[|!d|ːyEɷoS:t^W䕄#+"ȷ&yǢm&m=]o"_<.l*/ b1@I Ѣqx4-oIQ}>?!ݽIatCdV`\ H|IDATAa!VS 1ʇOF4ˆ@Iwu6<#yn{Ƀ1yb8<^I_MFE[}R_}W?dW{/iʹd&5XM^;2;ǬUgQ׸i |x ǫ+U7I ?,ףt%mwFk3YF#?}m +/OA9?S*_ZPY?x$OXz៺T9/_N),Z%/ػQt|cLȖuI&(r|/BM7`! rє3ry$Owg^'<9F+)?!sFGk?2e/׋y*C>ؒjgv#`yQtƌPN'_+TDK OJI*G>oX J>Gaalmb_ɑX{(&y< P=ʑON-bB dUGyG'BNXJʡX9xC^ _sS,|W/Żnԇ'pnU]dNRLy/Oq䘲T|*˹n}$>$^ZVW2W-C32XI@Hɢk<+i y5LӕzڊF&ǘϮ|"=_Tzz|Ѭs_w2`a8(2 ]EvDϮ\yl"$/bijD\WvAݟ%Wҳc5z)ڠobw!~ϤO\Nk J9i;`u狷::Ϯ|î#h-TIENDB`logisim-2.7.1/doc/en/img-guide/attrlib-and-narrow.png0000644000175000017500000002374611541757132022337 0ustar vincentvincentPNG  IHDR-<sRGBPLTE8i #:2&E6&]U7e\\U*-0/+S)$-2O4"/;1%28d 7n2>7 =.B`7e-HX8;I7OOS\KVX4@9gaBW{RSKJ\\xL`;opWgVhj_GuvtIHi{n\8~tĶ~(wyЀ(7V_ \>8۞^ߕכלRq垱ܲ`պȰmڎ؋ⱽC#c% pHYs   IDATx흋CHƧ肢_YBQTbPmY UrRC=%I2I&itJ}gD"MMW"-BH$nD"M͑wki]H֠W:ݔWlʥKZp_W[tKJ$~[5hֈb !#P/Ud[xoʎi C[<UF1TŞł|*/.A~%;^'[=f^u)ݣ'ᇃ2niYYp*L4}ͽ0'l:E z2z^_T`EއqzD~N_j ^c7?75gq&UG!x#0I.>\x|}|@c !ۉL&e(/'gu0㤕dN3i~y9ٜB,ũ]

    ⍅HZAnX?qBio2y8[OF|fe ]Dt|@I%OHBi]*9$(Y W"qF9|K&O47 ~ /2\䳭)s َ2I| &?cG.z v9$ Z}_'A#y;A`ˆsMl*y.D=,6-`u|U;+n?d_oY-@e| Z;y'eQ;Wޠ!vdk36זXkЃ4L@ʞ "L|2aN MG6ۭWDR8}/4{_&xA>G0gG\V#DW|*}_-+V/0˷,/?xkՙD*u/G %Yךt) 2K%QTa@O>)\ƒmg)o/onE%ylA6s\9]n{-<˲ސ˕+JJ1xآ&f+_Cku+ggHi &`l &'P1C dtY  .ePi}E1\O^npn7ͯ`y\WfC7ד n@? WSs/GY x%%/'|H`)H3wvz{{9=z|ֻo͏[vњm HOi[lHԾomnddWS-6Jc܋сy5|vtt|Ԫvn6Du' .w~WUl|wCh{{M g¯s;z&y]w,O*0J<*ط{5;cޑkrƓrVFO>3|]14QȣCs& !D^\FτA ߅Afg'ZsjX/(,Vh\|XM)y]vev6Lù;ʕ1]"mҭL׮|=^`ǫ?%'fn &;W U2[}1oz{{;[s=Kfn c3b yGk?OjW|C~WoߦOp *j;rizA ?p /֯}ځ/N>"9|ܻVOF9`qu̶y>f5끋kMmOD:Ӛ.Fk5k;r{hl0-М_>͂Yd[ݩ(\U<ۓ+5͵;aHx+0$eͮjp۳w!ىAU@>;Tv 3RЯ{vIjoz|w>NL=y/S{ +guCz{&y7.{<ٙ Z)w8Ъ.y!A^(B!K1DȏkKB',%ړ' r _GOB~lL)yt_ ߐ6ou` _?`Ey9I=cWKu x~LvES++Mw*[͏ZY 0Y_'oI&Ekk8cD> ~KOGKwш, JQ")mޱth&_Ru!oo-GK1'x ,y[rX*䟳[Tt́|%8I~#h8l_07׫ՕEHZ:L;Q/DaE$I6j^4zK-͈6{o}bn}$VyJ/y_%ȇ ߠhP84ۢu㐇F$gy$=qw _z!Q oȻ/j XLLvHG?vh.C̭Nݭ/ȇ|IOHEg<4q`| |AG[U dl&/IICL?VyCww{ }A>Uds|}vn bד}A>\yۂ<4BZHj`-"_9g |{F/ȇ|9gӲwţg(:$_7-ȇ|9όm%#g"<6፪SNSN842} '+Om#Y]}^==>ɇOfXn 6F/(U:B5V:||-03~'iVNy\DyB>''5<hi722q+-2sC@EOY:puY:ޠ*Gdu3C!p|jpUdeO1沝6hJog47uG<4; q<^bbx}\?6ol_ue{bW=-^3;](V!E|ݐ7GoZfDFH>4{}^U7 óM O'OؼyA>|>mVA7G-#K{>:"s%W|0{p?kGA䵞"?d'GG[wӫ)A5yАB~""ɯFf^\NC|aȳn Ojיy`M&'?Lx~Md~Pe{Ha+k_ L9+Y~u#9|eO?ɟ\KLxʩ-Q cx2[{p{rRlt:,|BxO㦺xz\ yX~>y̓Hr-r\+ׇ00鼟 l;QM\ *WMGʈ*6 }u߭[HIDJ}}Յ < ѽ{ r{3B^y9ɯ⶚A%<:\(]] _C,-6W2y\仺@&߅Md|"M ؝G?[]|~ nGt 𸶭M{s{,;L)3Y*΃Wk-O͜y1Z{sLKl^b|BTi6nuט5QAbuWɗ;'krА?C}^).#9lr'5OWT9x9+5'Uó Bj :+{Ex:] y4xܞ.l>6Cn?ƯdQؠ'7c.!ж:s[|'Ϗe+#1ů'4ya<$'y'ߩ+lZaۂ?e{_sic[PxWv>GD##sU0xNs tO9_qokBTꎜ#&G76W}w&&I^dꏐ/U\ZwړokkK=BcIj)\!QgZ2F^@ܫ;FySfA݂#9 Dl^ҍ m3yd` c zeW!OQ@N_M]|݈R%0 <䭑_pI~2b+:1vp'*w'b'x*X?9&C,*"AdʧۯNU +Kyd F"=ܓxȣC网|Ѡ઻W˰yL'/U]?PnOȶ>yb*Z"5;x_1E;{p6Zu3 m\|]e)#dwجy|TvGyF3*}\B\ڱl6[6p6oEό*+zk$ݛqoyAVyA^yA^yhk:6d@1H^ew|u9ryo/׆|%}r<VBGʀeȓOTJz"qvԼ^my)클g]{{ed+><&汁KCHU9y'337y\G[y]gdo0h歞H\yP16y7Ga^{&y\ |~6~"1oovx.m/ \'P}ƃDL( xKo[<3d0lB[MyP< F=nFb{M P8w_q>1"uޔ=ͫd3xNc!V9G'aږUσPgE]O6? ҃;yGM*ϥ<yhy ZUhFr< jT+^&.bxz` wy=Bftl0!G'*xmua/W|A! D>_::<]H C$ӂ|ÐgQ: H^o6~x|OE?%Ұ _W*_M۩ O l|ɿkdto^i@`9[Q[gG& &D ajn} ;E,Wdh E)ͩsߙHH/+2<֭`iՊK^D|QVm'37 R:߽ I^;E,QTH~їS|*}{l I"S7zIM3bqW|thX'ȺeS"8!*?Gl>GMz_:yQ6߮42C#eMvt4>M~%yܛ7\⛢asso)ʮړsW_Ss|ɷ+M`W{I?w&?utRAn} yCCO<=j O# {?M>ܥ%<|F+A>/w3K~rڣɕZ]JI V /"9 oaHG].,yӕF% E^;ys6/lޒ'y{ARlɗ4Vr)>SMX)6œYa'e|OoE> :GtWO u4\;Ix`> z-y=<*1y%W@@_Ju;nE+yC( ؼ._} ku|CM~L,ģQL%z7)K/`JfqH52e.҅q.ucw5 rTb|*^ΔJgSC"Zxyw(֫FpQ^6O@yj,( [ڑLߙMZYQ^>%kRL# @g8~uCw5%uoޏWOlnȳ=q|)(g$~-|OKI=߲Fr,lƤfAq(-|\;h^ZwqYK/g]/ƲߘW!(n|t_B X$̀LBgGr~P hk Dٍzcf6VDOxȗ҅oJzI>L2t07t*0M) {~K!y>|PchxO@ˈ×Aiaa^˳\M͏">Բ0dzjoUHW7.UF—~Zd^L_ji~9pv>oYu-yJUFKHKbt*V$^ulL6H@-776|iDDZZOjM_+ȥKB(IENDB`logisim-2.7.1/doc/en/img-guide/analyze-var.png0000644000175000017500000001600511541757132021047 0ustar vincentvincentPNG  IHDRALsRGBPLTEF\ y4623\UGIW6jU,*//,R(",5P+1{317^;5&={1[?CZt77z<%W(FWQKG6M8.eA;SWeBVKY5glTLah\h][Kn[lnpme7izƨ|VojrvƄ€37RӬTφ\옜ْѝu è]}܂ֺx}շxټ}§΅ϻչ⡳ܙٸ೧b pHYs  IDATxݍCYptM+j]Q>aғ% +B)=+ιw@0oü\f6(ISSSX/R!NuVͰh# _,h5aw}M}MmͦV湃3W e_ v+UjdP5')ÚkqJG co7lI$n+Ǟv jÕ㪱 рcQ*#FS#RML\Yhk=KiX'V*.,MmHKZmZtj@ɔw&=H:: NHu_Ï>l4PslX-QUdrM4!Lz*nԗ>A&rP( ̲kC2҅9 TƍV_Y*UZFcZB}u [Z\ MH:9RR hnp^W5XiB*6aCՑ.¼8f@ʛ]45HY>0H /\(*eV%YqLGFt4Fu*G귵;is+aRv ޾J1=G%IzT.9c>_ in(M`] kYZ6d_xެo*CFWSpW-S{;#ei(9vյ7HTi 酆4Mļ/oe5!֒LXD;̵PT!wATԩ߉i:Gjt_B)p~L8=pF`/L L5=V`EA=* ǃx4) ;#*7eeTiO ش_ojdR.Q"ɤ j"(N˘HU!-0Rф,;5mc-fג`DZEm6 ES86(kC}cnwL7 vj_`~Bh*):|Q,:zz'2ShxgfFGgrк`̨vH*dϒo1RIcd0z$ݽJ̅n:?mZI;vES`"iJ+mto Phqi_Kx-rc0iL3C0HU a&4TcId({ jV& xrfuN<fx>-K-u,T~((i:2dqZH_ ^YHxkxTGk0- t8uM5.5vU,SAktԀ80%4?2|bZɧe?.կaDk{RGU)ThL[WQ#s\wduGTt(St׵WD*ZNu'+޷hD-3ģD(R]eMok:SeZ RRCEbKGDz$5TꍤL!5n헽-O]E)E(je*|9-V#jz,JXB4 ,URGn£u[Bڊ)GIh@H 'ML]4xe46R<*$h4v :IRU$^R:F JDzy~~~Ў^tl\8ׇM0n?ԾvѓsÏτ3Sd({xPjQlֆϥὀ_wW!@{5VGΏg;4ƃ[HꙙcxLjcY%>I],{Qz6ʶ#{79ZlֆϹJ45+I8!N2rda8^cOgb*4 ̳ |'0k ')+H!/,ֻqGg0>x㋦in ۰^=)LN`G#md]uA\֏9- T)4l~e~ ?[ؑ,+O/+ӲXU=lBB}6Eðd.)~-.ƃH0Hg ݰ${痢})mM!3)pY2 ֮Ll@đzL ʓ'$Aڀy_C*?AP62ʚIo# Z=J~a b[ix!k6GaD )6SklNBVOcE64z3tb-Rs,H6l;A셐Խ[ͺu:G7sc]H?z3wJ~$ZXUBj.R<&c"c"}$+AiL8$PJ9y̭^ܛ84(ݙʼnHXGkdF#u`ݙſR^HwϔDt :w~nN E|Z~*726w*Nކ5iuF"#}>3܂5Zwt$ 3\TxI"A"gkl6 #`&zF^6r;7cUe"\\]RH)/l\`!T}Vg&V!p}}LLNǒ{'|6BZc h֠ ?gۚ5Xjs[&l :F'JqBZ((m߱c#oܿr{t"m72;N 6 iQxm WĮ߷GsР?X]cc#޶C0[? .*ޔ"H';Ӆ~IrV\)09?A{;v3 \ù,u M4 jVf{+dkRV'-.>l~˞߱$/$it1~wJhנ)|&9 lSe ʤm1DȤ zJR #;0 I?iޙX\^^&RU96ABzA"M)U)I($ҷoSKFۤ))ϲn W$ s_N.&үG:\gMX/!*/ g4VF:}! "m|R{bG׍xr$'U&<[E#fRHױG6Vޞ0-9i:'uoOwBGwVI۶Uv Ӱ;oYH뇴gTHHHCZdDJ"%w$ָӧJEU!q#HFZ+D9~"%RJHH)NODJiRH=EHo)RHBDJDJDJDJ!oTG!6U^K]%R(J 囕7HeH=@%R/扔HxuWRJORJ}HB")HIz4@# CL! X"%R"%R RBDJDJ!R RHH)DJ!R ))uTbGJv'#R")H)DJDZy+>.s]DZRYu)ˤ_rYR#RI+HU.?ѫK ."-h6w؋KWHDZ>)lg.=[ܯ4eJ~R֩Wp8a=cpMIKƒ_\H{L_NqV/.IW >?oq]WDu^Ko?+^_0@Sl/EZWY0% HC >'bbCMu{ͤB 1M&^H_DL.L| ^4G@-*UZl7G.lyqK~M z4@^ IsDꄴn?/%rI/+ppYr= i?:1uB5i6fH)DJ!R RHH)DJ!R ))H)DJ!R"%R/*]371a)~)86bޙX IDڈ. IgC(J 建\HAO ՉHDJՅ6R7bRJGHJiHc"}F)H)DJ!R'In'L_W4nrF55mߘDNꖛ*nivyUit)iHwZ}>_T]Ӓam/0#үMlxE'_GOrG'9s44i'i6]*Ų >}^APC"% }{WΕ5;^/Ui] L?ds.k4'14IM= Lx2Kpq|2fKiӆH4޹v]&@߃dEe2cKoff/xt^K.5!V 0?Ν2,ꡐ$ X7&]bmġ׸OrMYWA&9m't]cLx:6|2tH$h1&bNLDM_ ajRu%ejS*+OP \OM%{zXAt$c4]ԛ5G S jSyjZo׵@j+]3+Nǁfq6\[56[ X@Ic5LL@r"o Hj%U9i|HI0KC-qEM_[#N/'5ײBZ_N:5ʐ\(1QLE~5Q͉ԼtǛ)Vy՗JT(&L`3U׏F,vx4y,\HAC^+]7Su7d6k:ֈCZ._A s/ ݽ X:/Ä1!ʟ"H^Q GDf īž6#`U7=zjk:iZ3Q/&1n{A DJx_?+J(:4oҘ0UDAh3m Hr r uJ7[&-͈ikD^th:6j夷n2n2aҥ >޺^* ix#4R]*liH uoy{;<8ܜgH]"TinPL i:Ԋ<@* ZJj*XMR!ST3֕/nCЛ5YvPMHg<9ڐo(|f~2 ̫W0_a(*i5t;IN F9]E;=n Pk&!M%<Ư#L"^fɅH#)σ֯4j))q$foW\!`zWů y঒6VDuSڠiR|:L~2m! 4tMd 7g68i0#<U8 eә(jI_X%N'|3_/URsLxkU-5;nV7L sAA޼ࢪ`174mKkz܌Hki-ӱG3wk'jjv4Krhz8i(+ΥcEг7A eܾ*A,Q),M8Z?/XhY H7#+|w9]$=^S7U ׽V_H_d.6B9{d Ԋ?f^XHbUܵI~waE7pG FW o[x5]8n & a q4 (j3:&jHMZM/]l(~B~5*gR?{ Ģ(C(% 8m\W1ѾuQ\S[;Qǣ~=QC #4TM0Dätyi}M$C6]it sNFG#7Ц6ylSMM~1L]mIlR}`usB{3^;Ũct-yjzCMmtet̓aߧhsiwӬ)~t_cYsr3c[Sgӑlkt:oI|Lj6քǗ[ϴ8R:4QJ%'{3y:wHFH>oBE~Jf CԹoZsIqwfJ&~=LlOf,cOrk6Ο 1?Zi%j}Ib[`{g*ˏ>?jTbZw`.ay:`wwÙW<-1Tb~qvxwwWnZLzHڅj5ƇX 0 ^xI̲s&-$m<b~m˯v.}zW0،z3ej3) OtbF$X'3s=dSv-?%޻qxRayɚu̓z>~0m4Ŕ1>[xp.*dMya~=ʻ3sP4uX,[]/$+!&5qmZnq_"it-a>1,#?&i)=0>S"ffWy{zX φs_Y^n)Yj%TH*,ӑF )Sàv+WRs(3t()TfvRUP]w&IWXNZH_q RxT}=hsaLN*ލcJKBZĺPl1ѫb0@Zyz'V^}kE>mA1 GRk"l$T>U|W۶kKs{qS";Vԟ2^G"=i1R)q.Ria W5 =n:!H26[_E:IH3 fBy%4<Ѽ H Y:z}cOiK/ck?jUoV{-/։t;`Vxn>"=ҭZ~8:o,f={qu?r;p#̯&«z6|s3gpR c'=OkBZUq,{| ~.:p0R9r~e9h;~ 8۷H8Bgf)w&Ka)\($elYč:s(^t“aH{孾goD1@d0Tfyn#pbtY/ço^ޞmJԙCO5,;14Xuʃ8 erD,.Pt{k~6¬.jnnIIPo gGe{9EAfk%̡̳h|kʓ&g]l4Ǣ%y7@5m9e}Y*g6`XV"RmQק:+Jງ왗Vb|ᅵ\Hx(֔ -B繶u*vBٲ44\=+sksk _`4^'KSwޑ4Keˋ>>#.BgI}`F/@Cs;R|Aڼ@bDs@>/򎘱+G,q4V{Ǩ 쬥yHfN;)P)sIH;.꒎dcwƈT,%RٲHH)HJ$R HCr2YzGf$ m?թxe -W-۟Z&rVOb5tTz!\O )ĞTkx,g6<-HGێv8\Lw2k\nUVR~xەT]S@kZ7Lsn$]NB=l)CmʭK-`ck ~4ND*-ʳF&x'o͡h7+RoAE-R.wԉgs3'~kn{6˝j]^B[Q{7qN rM.I[Ps7HM\Z]7 ;4]|*͡-攻O}-Qj&n~Uv okgtMfO~q(utwJ}|{܂ʩ ow#iNBxHTVң(i-ĭHo9J DztlHGTұ1tT1A:BY* "tHH)HHcK4K;tH)K}STŠUk]HC2W)ZRadih$41&1we" uPj"1IHKg9V'JnLfƽߊMj=z'Mvi=/Ƥ 5.ui{ v#I9HGGJF CKD*WlYJDJADJADj&$RHT.Ԡ4L 9gZ/'UK22ǬHqҶ_q +M`;:CJtTRKTi[U1uKMZTÑA'}.'0)R)bĎ;I)KHH}BTJBD*ӧ5%R/Oe" R")WˌH2gA#\qs_1^u&m+S"%R))))I[vijr$R"%R"%R"%RIO"LD*EˈT*^{s+" 6%}/A`iq7&Q0G~\/>2%R"E"mM3}2RBʈ;;:\2RFmDJDJDJDJ]^S" qKq)SL) AOt6He "J!"%RvߖTmiH,$JGzH%$RYHC!JE[HG:HҐݣ̐,w&RtH%# |CD*)/I躝tLg\ԝtHFX|)R.@nс4D"]_\cqN:JHKq؁tHH)L'"caDH.L`v3Tyw*,K@1:GgDz< lk<<)\LDk<~wRkEy">G*{˃VVw)R)R)))R)E=Ҫ"zcrJd:eL*mK=T GKDkRǸǻ4D'4АHWN:։Xc]dnH[Wڷ&-C! I)JZH)|R=LJ{~"%R "~!", ㋅V~׈-[|tW^rW˓~%B>&=l"'%R?K[ß.t1WAFLxam~oRw!;+WHۍ4YRL }!go{]))XHۗ{6t޸­{ iw)W:+^itpP Ғ!~ߪ]UrbnIzT,-x پHBK1]!ci&s \НxI7PT)iH敍]@ d0]Yʋ+r0C*EouP~gJI+&$R"%v&TnhDY]#PjK>X˯=,/He#,,JG:Dr9 Z%tEXhx2.45H/\,!o_)4y=1꫋ x|,Ը)5I'h S8 FO-O=БyަI#O6|mFO[ ׽G60UoiE$7. 9sB/"6-IENDB`logisim-2.7.1/doc/en/img-guide/analyze-expr.png0000644000175000017500000001605211541757132021237 0ustar vincentvincentPNG  IHDRCsRGBPLTEBn #564_TDEW6jU,,-+)R(",5P+1{:9307^97 ;v77/A%W'E31PHC7f=OvE6MNQa8.eE?CX4fjNbg][OnhlZlnpmdpdvƧxlzi{ľv$oh:q˃ze~TչX`"ߛO֗⏴΢ܮw꺵tҪݣbƿ̃՜֚ܫصٌ pHYs  CIDATx݋Ceq!~؆.k榙D'-vJM7ˮf&y߹s2-a||ޙ|G+zFW999a7UR)w2q1-Z݀{J]=r3v47gR8ψ0K(b Z~r }sadL˸.NO]xq9u,foX~ͫ_̿NG$ylUSQ%hʤ&ՠjcWEg:=+>NäT!UPoggW{z'jiX>}jd6B&*֠*)3[-L7fmOS{һѨG=outvmWug-uE2p-t)-[dڦqM_85*#]WkQfyqDYZjoo#VS4trPk2W&W %J%M^; TZDWDMmtSbj 5ӦH7X7غ ww+=둛x3G'`?")Q$8*eV5Qo&`6M-4x'i3ˤRiTJ%:!ɚ '$.9Sh(~7]x=Hkw|V)zķj~޿(<pXD˴!kV[*j{Z{^]٭4GJ޳W?|D&UC٭~HTM/HB2-ӓZn-men)n~޿l}2H+D^iǩٚNZZ&G&mG{IP=Lu/+S4ef_zH-|Y 8( ;QfCeL* 6L6괹 R532iZBN(gBWU*V$,RѴ"|w-GnAg~4w݇]$4R|! a/%s7h/nO; fj$8]anq42c#ht G2zTqٝi=_ ™5(73ޙ{vD?{ctʜ<5H+ҿHA'˦(tXzH*%7X3p~8[`kY&́dn/1D#Q^ a*JBTآZM֩L-T?`&`Є|{ rp(kx4,ET֬L iR,K)əqc{?Λ(z҆],T4LC _$̀W?9DuRmT4oAٷ ,I#C$E^Iaҝ ]vwEڂFon|m*:]L_:=2gXKL<&h D9ǥx0G1k;87GF% (1̪ 6+x8 -;a~-Euz=x {SUx3-qz 2Qbt̩qwz]a&TyA}h;H=2>Qi%]MSiB/tE `6.{„^,֔HzƷl:R8쥜=\mH[#Zh&uV3>YTjџC9Sf g5oDht djtf'i5ZiORy^ʤ9yGhKE-T< 9@=.T?1{A!Ida)em}6@*>rSCGf|>/bG[͜žq>IA oC#@v~'HՑV$sՔ2:ONvcpq?.[b? \IWOan~;Sr>6Y$>Ye§-iwAKW{1RCzW&܆Q;JW"d~ _AUquXj~}/V5!BV[Q>^h)-Ƣx'/Ob1G?<lX3,j$ދEIq5r1Nbl$-Ha:'!Buc͖w/:63)pE$-]]~UoY'=HZün“Dz@,!Z*hh&F0zmvxIGkň0P .–s5ʿSZZu>g}RGsY6>^Kl6- ಂw6L_ AѢ-a=_u:Vm ͘jh%g"=oRRyҙg5x%ʕ )5pRVz" "$#{cCzLqID%f+"%RJ;n{D~"^H "iHHZ.;t\Lex&JSJDNFN3Ri<ɟ|*DoN%`jIk-7lt iӺTBz`cq=Rш{IM1*W:\GTHcǧqg%$crGG3GLV%-G-cr;]$U{IB] GՏiER u'K߳UK ]iETkxG)#ɂU$q"&)19&yܿԙBv2PXhx˅H |LN)x&(ALX=*H]crvoO̝Dz1}IZ`bX*J."eRɊ+߱T)0=byTS~AiJf ѿ$K:eҎ8QH="%R RBO%rHDzaKQi0ACkO:IU78VD͌/J'9iΕ~Z_c52[I]L*.:"C5hi|V/D(PvP+H)O:)RڔtH=G:2B%R")֑^#R[k"T)RB"%R"%R RBDJDJ!R RHHH)DJ!R"%R"%R")H)H)N&R";iH=G&R")H)DJDJ")HHHۅ+#+HBnN%CUzsj&U''e\%R%Rk;e"iH=FZ&R"%Ҷ?ѥ6i) SJCv )HHCDJ6' HBCF? uf\Z4QPLW~;n݃V:}Mҡ"*URR0NZJSsQ'G!G66UEa.+ͥ4 .q&"Rבf" i'$) 釹DINóG8u6# voV1ߧRaZHa?lTP'g4-dK1 n3;t!ٓ<,5W*XuN $?q"u ifz?qO KLw*}vT{.[g&)ٱY#6{ OPSH~[h2aY_+zm"-ywy 2Ȉkjmbs+=#Q&f )v.i! |/wvw62|̻9ݶ*2;"mc1۬ݎHH˩'yFCֽ?x>>#xxr?q~L ǻ51p<:xΫ<6zeSL'!@C$|U}~} ?J!Or~  BybοB+xOPx_>?=jx>y;=>|$HV܄QSٮS|k>;2Sw*U[?UͯO6v͹ˠS>;NzzK`7'M*/Wxm^I)yFR[?&'U[ys=iwiN)/1?ϢϽ;'m}?L}{zz~(iN2{/}3|RVP|?Īo/ϣ2 Xڮ+L`(\ls׈ze ;}ylRW2Qby=6S߼d}NFsT^HSy}ϋ <>'byzGxa}>NjUU^)|>J]~g#J+;7* 4hͯ=5_K*g˯l/WJ,aywjA_ 7ٽ8hRBy7{1>zyS-;o(纞QZe+1+ /8hZyȿʾNI92qHrL婺VF b|o,Or]~}5~^eCq?;m$7ݿxFc0~^`Ϲ7c LqGg]6+fjJ8O+5%g<}2'oU"Gr>Cp_,3DoɁ"G:ϐ迨<3xxz>;~Wbybyx?b.u_yqv>CJ|Qϣ+xzm=Onˍ,`*̓vDn_*_Wc_⩿2\5C$Sȏ憎_ `<\_'9ͫs2ʔD+SrKnb|_KOU>fW<{w^̭O-7>Ѧ1Rw#yҾ0}!(> ] yoËڿԪ %'#OSaOk2yq)RIXf[)j|LZ>gcJaevfY;k|P}s~]qtowpxˎ{ǿ}|^y~͇5GΒ֏f쇮uخѤܩ樵^ͨǺ̂½ϼ˂m֝ͅٺٌܧ;>g pHYs  IDATx݋C)]2!נS3֍,@K%j Ew3s#]aos昰!Ŗ" XY -/A,..1'O% $8&{y"KKL,#Bh$8ELjU߽ybkKz^ ՂsFM*ӬOT6 D3CkEK$8 tUYcPah &aH* A%?h`BHTiQT=UnIr* $k}&1C '3ryrO#7@hތ O"DʆOVb[%T?C d r9 JYB/!I ۗfP`]}~ ~6oIX[CAImZB*օJ  c (&oI$4f@+#d_v̓H$\͖`*Ap\.RօK+C3DAa? Wf]~Hr ug:'V;1, ,T7',!4Cd[Y"Ny̧͠z0QR.DćPN"x>JJ{&lOP'wb%%t->s[d aJ087 m*4%`…Z JP4 fbIL:1 Neh/TԨ]MUڒ҈e V֫ u.+M~~NWd5Dw)FN؇n#)*_ 1d>kK-M0=q}!FY~HՐBZ%~A<Rr40!v n[֖cIQ հ O##QnŽKId# Q vzM^[IFv 5xqtjOw)(x^GbѨ6 `E09R>,2{yIR,! @=9q? J '9UտR|L:AB`v_A5rF@AWPF;[Ҟ+~R#JW[?D'd#eV0o!i s| ÊDž#KCK"#xYD% 2v*Q`NAiJܹtVFQ j1lTc'ن!Zr)'*ZO;~U<l=(vSp\+@ (Rt,8z@O 7h,nI,nC%VfVjIhS!6jCȖ Sź]+U)NMea"*:wmpMr|@sxhvu6ߡÆ2٢i!}#1єٹ\uZ0P~$&A*.):W;u2gʖe vePE)mKJ#T7rOfy/WuQ#L٣.Kpf `Wd5pU1LQ 21-]@Dq[_G])_+?7Sԁ~yyWot^)Q@כl*]p>b"юVj6_wbz]u2j8OٝՂh ]] 73MqV; "NKג"X 4h3ȅ&h՟ AՇEédkW}/֛q>znwEfo%!@S 鷎Inh MDdF _5s HȏSՎP/݁qH#dp4'J#0dNfDN B+Q)"^/Ã>;H&F3,?),jcz*Z 4y۵dCj19dL׃*INMiIaR\qNfBdD$3"Un" TGCq 3<ɬ vdv2c" 3"fk$KJW $\ rAnq\-h,sA. o56`3D=4),+;xZAurŷ758l!,|'MՓGFDK6w"/ Y`XV0vOnh"UtDFC~yeѩx8G.[ r9 ?tJ,]/#d$]\sQEaZ^T-)TxON»$YRbI"``+D~?E#$`yI+?$t%Ah)$+"!]ٕEpDV$`Jw[6~kvjkuq~\ rA.[qyrA.hyA=y1KOg_GlüvJP״`Nq^5%kLXS\wr+n!~6k .X@l~p%3`Vle)nu^‚&f;=Cq5l˼\ HrwyMcď0y󗞭(؃;0Ͷ#0yrA^ hMp \ r D>nGf4$n Mt[ b`/a'yuąH>ۊ?~By<|-R?։utǏ mP NxgAQ_舠 rA.uǨm,,#؁yB ',0Wh\]jbho#9# : pA. \ׂwx4-mhboGؓbk!:X;4C U?Đ$IENDB`logisim-2.7.1/doc/en/img-guide/about-mail.png0000644000175000017500000000125711541757132020653 0ustar vincentvincentPNG  IHDR$sRGBPLTE++RSpqгK`bKGDH pHYs  #IDAT8˭Ao0dnkҖkrm5BW&~g AѦY"`?y!Co]~5O慄f3SǩDa>43G(c!+,7]{_/ mu@Gl1#ڬRp]{ЋMqZyR *-ݜ,Q =L-CKZ[>cI-~ޜi9K0yOk9D!RsS)q%(v@YK4 C|1{ToLee#aH9GD7@S ӛSe@F]\lu*a҈*B`z$@ *OLo.L1 TLZg3\'sBGflI#S>ueXY}CI%YD5(׹7I7=阔SƙyIZZ~rmYuBmdJ1mף̈6De+ZԬj6E[ɑ_YgC8D5o}ƅ0_wܞ3{;?]'TmIENDB`logisim-2.7.1/doc/en/icons/0000755000175000017500000000000011541757132015352 5ustar vincentvincentlogisim-2.7.1/doc/en/icons/xorGateRect.gif0000644000175000017500000000016511541757132020272 0ustar vincentvincentGIF89a!Created with The GIMP! ,-h"mYu]d:V)qi{un-;logisim-2.7.1/doc/en/icons/xorGate.gif0000644000175000017500000000161211541757132017452 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,g H?(@ۣС?HA7NH+""H+ B| LbD)NS ȍFhgǏ%>P&X;logisim-2.7.1/doc/en/icons/xnorGateRect.gif0000644000175000017500000000017211541757132020446 0ustar vincentvincentGIF89a!Created with The GIMP! ,2y#hNJ dm~yQX"LIJ0RO3H ;logisim-2.7.1/doc/en/icons/xnorGate.gif0000644000175000017500000000161511541757132017633 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,j H?(b B{ l(P+l)x$R {)> 2Ɓ+YfĎ&AXf\ޔX'gJ yD;56uQʄ 5qj0 ;logisim-2.7.1/doc/en/icons/wiring.gif0000644000175000017500000000012711541757132017340 0ustar vincentvincentGIF89a-o-P! ,( 3A)߆0^ImVh#sF;logisim-2.7.1/doc/en/icons/tunnel.gif0000644000175000017500000000017011541757132017344 0ustar vincentvincentGIF89a!Created with GIMP! ,(H0I. p`@`hbfaST[G(Y/+!327H" ;logisim-2.7.1/doc/en/icons/text.gif0000644000175000017500000000022111541757132017020 0ustar vincentvincentGIF89a )))777MMM\\\jjj~~~! ,>I؂\8d>$m$>i`) @@.2F9&4DU%#K u)(כEXH]r Oꪅ3g߶67Zn9 '(BBDXjŁ4ab1LLcJnnltlt4:HL꺮O9xs+)_pR 8fX[4@BJ}3x9s BdB|Z -f<9Wٶ}ƿTN:@?PL_CVŒ5RIENDB`logisim-2.7.1/doc/en/icons/simtstep.png0000644000175000017500000000152511541757132017733 0ustar vincentvincentPNG  IHDRasRGBbKGD pHYs  tIME"MIDAT8˝MhgGvv6ɢ Xkڭ$&PŃ`D dPᒍ WTo RC=,BWH6&33Q<|y`1NIO97,؎yrQ֖n|oo[!sG|hetS| m,ˢX,:s&z8l͛?r3؅’0"G ]سs{\Ww=:.xeA)m-W=4%p{RJvw`ޞG㮔A0?F("X؄"6&д ǩ.P,#Yr%{nqv(4GG~æT q{7/U6d0&D[pEJ@COݼ۵ƦmjiY0%F/Qp؋Xwg*-'07cGSuwK>^-~ɥlyjYWoIENDB`logisim-2.7.1/doc/en/icons/simtplay.png0000644000175000017500000000151411541757132017723 0ustar vincentvincentPNG  IHDRasRGBbKGD pHYs  tIME8y8eIDAT8˝KLT{wfxDIX h]+ DuA&1@iBBZyƸi]iJx al#h:Xt&P;sq!cFɗs~X֕^+:$F,ӊwNW˹V^VmxihwMSOD1l{Naضm-,F4#f,Qu=''xwʽD]>jj>58 3n{DU)/+e}||DS'֭F_ddxxƲ:O%|NQOd} }oܙ錎P[SCݑz>M,l\q?KWO-s1K)DN7~_*GU!mm?Hqn7x8=W9?k>Q(J5՞\H4+*0Me*ԓ LAlÛy78!s㈳-) CA<7 uA۷~'5% i qtAKԤk9srf#jP!LDbuƟ>GwdMhW"AzF&PCڼlM0EO PޒMG6g*",m;~>x`Gw H۔%ۼrKd=0XfIENDB`logisim-2.7.1/doc/en/icons/simstop.png0000644000175000017500000000144411541757132017561 0ustar vincentvincentPNG  IHDRasRGBbKGD pHYs  tIME#&6IDAT8eoG?3;tزᒆ HGZlҤKqBK.7jҀ r "R$g06u[v۝o X{y3v7?HP) o?TMz޵,7rŋ~>}1fn;#i7_Ay,OQ(޽vn4@YKKd1/0 0 d1KKeQ;n_}3<.'OxQQ ?~c5tf0z8|֭{mBgo֭ZTUu@~lyXk|xGeKFhAq T8gADBYcΜh{Ƒ1uQVԻ`fTe @9bN8 R FZ_|IQ1t\cd\(ߌFWv:?,epkbb]˗"=Sbyyׯq]*X,T*+BבR:?ff8Y()O?ӃXZ1NX]F>yZy52WFFF.;~o+)e8 s7 ͣ/$In Rm.?dx8dl&gxZA$$ eXZR <|#za.IЗx@RJ:䰲 qll+Fqr9:LMsJ>m.Len),|ߧRWaBplS.I~bX0 y_z: rjulRQ*6ֶ5 Tl͖\.`c֣(*=#"@J8ض,!ssψ8>>`>ۛxqsaHOR{(]_3Rv.ƋRt4F m`+/WIENDB`logisim-2.7.1/doc/en/icons/simplay.png0000644000175000017500000000150211541757132017534 0ustar vincentvincentPNG  IHDRasRGBbKGD pHYs  tIME ^CIDAT8e=luA1MPBTwCl,H1F!Kpu^R)RhftC!N"BО8qlNݽ Jgy_?h(D/RsEUNJe[˗YxOtFպ/NsEkv F3 &z0ۣZbf%5>%sc*{{ *$IOSz}2Jn 0WA+wIӔNT 뺄4M޾K+X__0LXZzy°Gt]=zH+%LGZ*H9w;xsoD˲/A5jIENDB`logisim-2.7.1/doc/en/icons/shiftreg.gif0000644000175000017500000000014111541757132017650 0ustar vincentvincentGIF89a! ,2}P؋q [oU7XBBvI~mse-H& ;logisim-2.7.1/doc/en/icons/shifter.gif0000644000175000017500000000014111541757132017501 0ustar vincentvincentGIF89a! ,2iTX AmZXŔy7>V%AH" ;logisim-2.7.1/doc/en/icons/select.gif0000644000175000017500000000013611541757132017320 0ustar vincentvincentGIF89a! ,/ɢ{ IY;e㖪(V^2Ri肇آ;logisim-2.7.1/doc/en/icons/rom.gif0000644000175000017500000000013711541757132016637 0ustar vincentvincentGIF89a! ,0)ςƊ5nMM$Yz` y9'<@ P;logisim-2.7.1/doc/en/icons/register.gif0000644000175000017500000000017611541757132017671 0ustar vincentvincentGIF89aUUU! ,CH 0J8zA C |VʒKX䇊4Sfk`1N%d_Cbeux ;logisim-2.7.1/doc/en/icons/random.gif0000644000175000017500000000036211541757132017322 0ustar vincentvincentGIF89a66;NOT]``ssu! ,o $diqd(L03y7 X4 C>49By=/aу@!(4KP eG/}  &Qr , }r,"$!;logisim-2.7.1/doc/en/icons/ram.gif0000644000175000017500000000013611541757132016620 0ustar vincentvincentGIF89arrr! ,/9ςƊ5nMM$Yz ʪyYσ;logisim-2.7.1/doc/en/icons/pullshap.gif0000644000175000017500000000010611541757132017666 0ustar vincentvincentGIF89a! , "mQo͚_^~3v紦+S;logisim-2.7.1/doc/en/icons/pullrect.gif0000644000175000017500000000012311541757132017667 0ustar vincentvincentGIF89a! ,$ -"M-QކedUN}S;logisim-2.7.1/doc/en/icons/projup.gif0000644000175000017500000000012311541757132017354 0ustar vincentvincentGIF89ajl! ,$PIkYQydgY^э#;logisim-2.7.1/doc/en/icons/projtool.gif0000644000175000017500000000013211541757132017705 0ustar vincentvincentGIF89a333DDDfff<<~ڥ! ,80IX=rGxlPbUS!P,6w }?XRr##X;logisim-2.7.1/doc/en/icons/priencod.gif0000644000175000017500000000013711541757132017645 0ustar vincentvincentGIF89a! ,0ˍUDqeyY)u(1\a5 BĢP;logisim-2.7.1/doc/en/icons/power.gif0000644000175000017500000000012711541757132017175 0ustar vincentvincentGIF89aDDD! ,(pH4Z҉JTʞT%p|̴`yJ;logisim-2.7.1/doc/en/icons/poke.gif0000644000175000017500000000022111541757132016772 0ustar vincentvincentGIF89aaKqV!"Created with The GIMP"! ,;1^a{WޝqGJ8P5cUqgx+DSOAC1Γ&%;logisim-2.7.1/doc/en/icons/pinOutputReversed.gif0000644000175000017500000000023011541757132021543 0ustar vincentvincentGIF89a@@@ڤUUT! ,EIX 2Al A U@PQq u;G#$B ?wkjNU˪HC&G;logisim-2.7.1/doc/en/icons/pinOutput.gif0000644000175000017500000000023011541757132020043 0ustar vincentvincentGIF89a@@@ڤUUT! ,EIX 2Al A U@PQ0ZaP1Ž&MCC {̣lw{OU HC.#";logisim-2.7.1/doc/en/icons/pinInput.gif0000644000175000017500000000022711541757132017650 0ustar vincentvincentGIF89aڤUU! ,DI5A( A BXN@tAu=Ӭg^#L3P*:"}:`x|;logisim-2.7.1/doc/en/icons/parityOddGate.gif0000644000175000017500000000166711541757132020613 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~!Created with The GIMP! ,{@Aǐq $PNcTEPqU2(1c C:°B䌬%4˨J?WV'Ѕ 4!ʣ Q@fʆ\ΪL2 fԧ;logisim-2.7.1/doc/en/icons/parityEvenGate.gif0000644000175000017500000000165011541757132020772 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~!Created with The GIMP! ,l@Aǐq $PNcTEPqU2(1c C:°B䌬%4˨J?WV'Ѕ 4TѦIB]rϛVN=z;logisim-2.7.1/doc/en/icons/orGateRect.gif0000644000175000017500000000025611541757132020103 0ustar vincentvincentGIF89arrrUUU!Created with The GIMP! ,B=@R}mm D!tlu'wUd ##F"&:]֫(Z);logisim-2.7.1/doc/en/icons/orGate.gif0000644000175000017500000000157711541757132017274 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,\ H?v1X{2 L<"D ]YxH#=30J U^jsS@3?22DF&iS;logisim-2.7.1/doc/en/icons/notGateRect.gif0000644000175000017500000000016311541757132020260 0ustar vincentvincentGIF89a!Created with The GIMP! ,+ˍ/؋Ay[Qvʖ)fw3 & ;logisim-2.7.1/doc/en/icons/notGate.gif0000644000175000017500000000155711541757132017452 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,L H <Br0?^87^_I$ʏ"11PΟ@;logisim-2.7.1/doc/en/icons/norGateRect.gif0000644000175000017500000000026311541757132020257 0ustar vincentvincentGIF89arrrUUU!Created with The GIMP! ,GI|X;Z&FD!%HrvUt"aUveS,ި6{r]ZےXΙ;logisim-2.7.1/doc/en/icons/norGate.gif0000644000175000017500000000160611541757132017443 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,c H?v1X{2 L<"D ]YxH#=3yAMu2}2iKd㾏 8G д*À;logisim-2.7.1/doc/en/icons/negator.gif0000644000175000017500000000156711541757132017511 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,T H@*TxÇhD*ZŌ7+ I#Ē#[bɐ#KQˎ7{\H;logisim-2.7.1/doc/en/icons/nandGateRect.gif0000644000175000017500000000027211541757132020401 0ustar vincentvincentGIF89aUUUrrr999!Created with The GIMP! ,NI|X;&  eV{rQ 6!ຄ@ rPcnoV|Xޙ;logisim-2.7.1/doc/en/icons/nandGate.gif0000644000175000017500000000160411541757132017563 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,a H*"JW,aA%; ƌu?H#LʕI4mfliQD$arcʗ>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~!Created with The GIMP! ,Y H@*TxÇhD$$㿋;n'R"E4#‘,=:"ȇ"W~r͏0QƬh$ј "4Ȕ`@;logisim-2.7.1/doc/en/icons/multiplexer.gif0000644000175000017500000000022511541757132020412 0ustar vincentvincentGIF89aP??? ! ,BIW0QgE: kw4k!Ɨyza4H J5Hme';logisim-2.7.1/doc/en/icons/menu.gif0000644000175000017500000000015711541757132017010 0ustar vincentvincentGIF89arrrTTT! ,4H0`*;`(uli tmpt5b<Ȍfd$;logisim-2.7.1/doc/en/icons/led.gif0000644000175000017500000000017611541757132016611 0ustar vincentvincentGIF89a ]fUJ1! ,Cx: 2[&d| l<*߬@g.**/'] ex! ;logisim-2.7.1/doc/en/icons/keyboard.gif0000644000175000017500000000035611541757132017645 0ustar vincentvincentGIF89ahjgopnꀂZבf騪۹! ,k $di,L*.8 Җ!3b1TA`. qlxe5!;( @WMka^w/E`vxC$WEl(WxP.9!;logisim-2.7.1/doc/en/icons/joystick.gif0000644000175000017500000000032611541757132017701 0ustar vincentvincentGIF89a |&'%443>?>FFFPPPY[XGGgifM5porr}|֍! ,S'diqE:PL=&>#@0!"m,Cb@(K"l c8Љr:BT>0!;logisim-2.7.1/doc/en/icons/jkFlipFlop.gif0000644000175000017500000000014511541757132020101 0ustar vincentvincentGIF89awww! ,6iTXuHFɁʦB@M?2z(&;logisim-2.7.1/doc/en/icons/hexdig.gif0000644000175000017500000000017211541757132017311 0ustar vincentvincentGIF89aCsCCC! ,?x 0J@Sf ߵ=EŨXff{u-,>^WIS";logisim-2.7.1/doc/en/icons/ground.gif0000644000175000017500000000010611541757132017334 0ustar vincentvincentGIF89a! ,۞ίfm١ya;logisim-2.7.1/doc/en/icons/extender.gif0000644000175000017500000000012511541757132017655 0ustar vincentvincentGIF89a! ,& 0Iۡׄu'&yflf]tԺU;logisim-2.7.1/doc/en/icons/drawrrct.gif0000644000175000017500000000023711541757132017673 0ustar vincentvincentGIF89a ak|s  ! ,LIw$rFM2gZ$,.iEAԏ[g%c=fЩCezi,Q 8f;D;logisim-2.7.1/doc/en/icons/drawrect.gif0000644000175000017500000000022111541757132017647 0ustar vincentvincentGIF89a ak|s  ! ,>I8k _  $rFQ,LFsC'}xHXfv#;logisim-2.7.1/doc/en/icons/drawpoly.gif0000644000175000017500000000022711541757132017703 0ustar vincentvincentGIF89a ` l|w   $ ! ,DI8S4D=BbV*IqӚ ȁB.CAA1(zӑx;logisim-2.7.1/doc/en/icons/drawplin.gif0000644000175000017500000000014711541757132017663 0ustar vincentvincentGIF89aa lw! ,,H02$Z"xQdհAמ< 1D7pI;logisim-2.7.1/doc/en/icons/drawpin.gif0000644000175000017500000000020211541757132017477 0ustar vincentvincentGIF89a r 98@>FEhhЀ! ,/)IJ4O5t J)"E;B KpO_P]r؊;logisim-2.7.1/doc/en/icons/drawoval.gif0000644000175000017500000000023311541757132017656 0ustar vincentvincentGIF89a a ku  ! ,HI8cz[0 q_ JBF!Ҫ˴ܮP $>`ngpBCl6a*  Q4 ֘hJ;logisim-2.7.1/doc/en/icons/drawline.gif0000644000175000017500000000007511541757132017650 0ustar vincentvincentGIF89ak! ,cڮŎ;logisim-2.7.1/doc/en/icons/drawcurv.gif0000644000175000017500000000011411541757132017672 0ustar vincentvincentGIF89aef! , xb&KoNa#u38J;logisim-2.7.1/doc/en/icons/drawarc.gif0000644000175000017500000000012711541757132017464 0ustar vincentvincentGIF89aa lw! ,80BA ;.^X~5iԮk;logisim-2.7.1/doc/en/icons/dotmat.gif0000644000175000017500000000017211541757132017331 0ustar vincentvincentGIF89aCC! ,?H 0J8:B}37,a'gs@ Eܙz!MelBrU ׈";logisim-2.7.1/doc/en/icons/divider.gif0000644000175000017500000000155711541757132017477 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,L H@*TxÇhD""HF3VQ!Mq$˒ EzlL._O@ ;logisim-2.7.1/doc/en/icons/dinXorGate.gif0000644000175000017500000000160211541757132020104 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,_ H,0h2a#&Xv':RȆ=Svȍ7|!K1H@Ś 'xLz&LARP ;logisim-2.7.1/doc/en/icons/dinXnorGate.gif0000644000175000017500000000157711541757132020275 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,\ H,0h2a#&XbƉ7ÓJ ȕ'r#Ɂ"tN%L'sHς >>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,V H,0h2a#&`Ɖ*>)#Cl8rǂ(@:)JJ>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,V H,0h2a#&h1D!yldB'r'v. rCz"{LAPH ;logisim-2.7.1/doc/en/icons/dinNorGate.gif0000644000175000017500000000157111541757132020077 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,V H,0h2a#&`Ɖ*>)#C?6cATdIҤ?:)͕J>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,W H,0h2a#&XbƉBɍ C(J%M9%HwQgAF,*5;logisim-2.7.1/doc/en/icons/dinAndGate.gif0000644000175000017500000000157211541757132020044 0ustar vincentvincentGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,W H,0h2a#&XbƉBIe$ |1(AI%\xQ'F*%;logisim-2.7.1/doc/en/icons/dFlipFlop.gif0000644000175000017500000000014211541757132017715 0ustar vincentvincentGIF89awww! ,3iTX`>uBQ ˥$ܚ+m~^ՂP(;logisim-2.7.1/doc/en/icons/dff.gif0000644000175000017500000000033611541757132016602 0ustar vincentvincentGIF89a./-;=:MOL]_\qspz{y~! ,[ $d)h㾰 ON hCS@Oa;logisim-2.7.1/doc/en/icons/comparator.gif0000644000175000017500000000156611541757132020220 0ustar vincentvincentGIF89a>  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,S H@*TxÇh&bD;^|B1ܨcʌ WtƒkdQ'ɗ-A.РQ;logisim-2.7.1/doc/en/icons/clock.gif0000644000175000017500000000016311541757132017134 0ustar vincentvincentGIF89aUUP! ,8xI%! A`B)|Bf'@dwz`a 2:ޱ88!#;logisim-2.7.1/doc/en/icons/button.gif0000644000175000017500000000022211541757132017350 0ustar vincentvincentGIF89a.*LMuswvvת! ,?I8<`x`'@\'-f>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~!Created with The GIMP! ,D H <Br0?^8ƍU""IB<#F#‡8s ;logisim-2.7.1/doc/en/icons/bitSelector.gif0000644000175000017500000000024711541757132020323 0ustar vincentvincentGIF89aP??? !Created with The GIMP! ,;08 EUc (\5D'U>R';logisim-2.7.1/doc/en/icons/bitfindr.gif0000644000175000017500000000022011541757132017634 0ustar vincentvincentGIF89a,-+YZX{}z! ,=I8k}tA ~ ܆ B$\6XeK;logisim-2.7.1/doc/en/icons/bitadder.gif0000644000175000017500000000014111541757132017613 0ustar vincentvincentGIF89a! ,2iThAW0\>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,Y H*"JW,aA%; ƌu?H#,eI.WJ)%I'iqƔ*3C B4ut`@;logisim-2.7.1/doc/en/icons/adder.gif0000644000175000017500000000043511541757132017122 0ustar vincentvincentGIF89an/xxggN# 'yPkk` {! ?,:pH, ȤRy 8P'N(RK}n,X.RY֒X77>;>>DA;logisim-2.7.1/doc/en/icons/7seg.gif0000644000175000017500000000017511541757132016711 0ustar vincentvincentGIF89aCsCCC! ,Bx `+h/E \b*kϟ6ls }AW--MOT%̤";logisim-2.7.1/doc/en/html/0000755000175000017500000000000011541757130015201 5ustar vincentvincentlogisim-2.7.1/doc/en/html/libs/0000755000175000017500000000000011541757130016132 5ustar vincentvincentlogisim-2.7.1/doc/en/html/libs/wiring/0000755000175000017500000000000011541757132017433 5ustar vincentvincentlogisim-2.7.1/doc/en/html/libs/wiring/tunnel.html0000644000175000017500000000543111541757132021631 0ustar vincentvincent Tunnel

    Tunnel

    Library: Wiring
    Introduced: 2.5.0 (in Base library, moved to Wiring in 2.7.0)
    Appearance:

    Behavior

    A tunnel acts like a wire in that it binds points together, but unlike a wire the connection is not explicitly drawn. This is helpful when you need to connect points far apart in the circuit and a network of wires would make the circuit much more ugly. The below illustration illustrates how this works.

    Here, all three tunnels have the same label, a, and so the three points to which the tunnels point are connected. (If one of the tunnels were labeled something else, like b, then it would be part of a different set of tunnels.) The controlled buffer at top emits a floating output since its lower input is 0. This normally leads the wire coming from the controlled buffer to be blue; but here it is dark green because the floating output combines through the tunnel with the 0 from the pin at bottom. If the control input into the buffer changes to 1, then the controlled buffer would feed 1 into the tunnel, which would combine with 0 from the pin at bottom to result in an error value; thus, we would then see red wires feeding through all three tunnels.

    Pins

    A tunnel has only one pin, whose bit width matches the tunnel's Data Bits attribute. This pin is neither an input nor an output — the matching tunnels are simply connected transparently.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute and the arrow keys alter its Facing attribute.

    Facing
    The direction toward which the tunnel points.
    Data Bits
    The number of bits for the tunnel.
    Label
    The text within the label associated with the tunnel. This tunnel is connected to all other tunnels with exactly the same label.
    Label Font
    The font with which to render the label.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    Allows the label associated with the tunnel to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/wiring/transmis.html0000644000175000017500000001150211541757132022160 0ustar vincentvincent Transmission Gate

    Transmission Gate

    Library: Wiring
    Introduced: 2.7.0
    Appearance:

    Behavior

    A transmission gate has three inputs, called source, n-gate, and p-gate; and it has one output, called drain. When diagrammed, the source input and drain output are drawn connected by two plates; Logisim draws an arrowhead to indicate the direction of flow from input to output. The two gate inputs are drawn as lines connected to plates parallel to each of the plates connecting source to drain. The p-gate input's line has a circle, while the n-gate input's line does not.

    p-gate
    source drain
    n-gate

    The transmission gate is simply the combination of two complementary transistors. Indeed, the same behavior can be achieved in Logisim by using just one transistor. However, designers sometimes prefer to use matched pairs of transistors due to electrical issues with draining voltage that is more complex than Logisim attempts to simulate.

    The values at n-gate and p-gate are expected to be opposite to each other. If p-gate is 0 while n-gate is 1, then the value found at source is transmitted to drain. If p-gate is 1 while p-gate is 0, then the connection is broken, so the value at drain is left floating. In all other cases, drain receives an error output — unless source is floating, in which case drain is floating as well. This behavior is summarized by the following table.

    p-gaten-gatedrain
    00X*
    01source
    10Z
    11X*
    X/ZanyX*
    anyX/ZX*

    * If source is Z, drain is Z; otherwise drain is X.

    If the Data Bits attribute is more than 1, each gate input is still a single bit, but the gate values are applied simultaneously to each of the source input's bits.

    Pins (assuming component faces east, gate line top/left)

    West edge (input, bit width matches Data Bits attribute)
    The component's source input that will transmit to the output if triggered by the p-gate and n-gate inputs.
    North edge (input, bit width 1)
    The component's p-gate input.
    South edge (input, bit width 1)
    The component's n-gate input.
    East edge (output, bit width matches Data Bits attribute)
    The component's output, which will match the source input if p-gate is 0 and n-gate is 1, or it will be floating if p-gate is 1 and n-gate is 0. For all other values on p-gate and n-gate, the output is an error value.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute and the arrow keys alter its Facing attribute.

    Facing
    The direction of the component (its output relative to its input).
    Gate Location
    The location of the gate input.
    Data Bits
    The bit width of the component's inputs and outputs.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/wiring/transist.html0000644000175000017500000001564311541757132022201 0ustar vincentvincent Transistor

    Transistor

    Library: Wiring
    Introduced: 2.7.0
    Appearance:

    Behavior

    A transistor has two inputs, called gate and source, and one output, called drain. When diagrammed, the source input and drain output are drawn connected by a plate; Logisim draws an arrowhead to indicate the direction of flow from input to output. The gate input is drawn connected to a plate that is parallel to the plate connecting source to drain. Logisim supports two types of transistors, with slightly different behaviors described below; the P-type transistor is indicated by a circle connecting the gate input to its plate, while the N-type transistor has no such circle.

    Depending on the value found at gate, the value at source may be transmitted to drain; or there may be no connection from source, so drain is left floating. The determination of transmitting or disconnecting depends on the type of transistor: A P-type transistor (indicated by a circle on the gate line) transmits when gate is 0, while an N-type transistor (which has no such circle) transmits when gate is 1. The behavior is summarized by the following tables.

    P-type
    gate
    01X/Z
    0 0ZX
    source1 1ZX
    Z ZZZ
    X XZX
       
    N-type
    gate
    01X/Z
    0 Z0X
    source1 Z1X
    Z ZZZ
    X ZXX

    Or in summarized form:

    P-type
    gatedrain
    0source
    1Z
    X/ZX*
       
    N-type
    gatedrain
    0Z
    1source
    X/ZX*

    * If source is Z, drain is Z; otherwise drain is X.

    If the Data Bits attribute is more than 1, the gate input is still a single bit, but its value is applied simultaneously to each of the source input's bits.

    An N-type transistor behaves very similarly to a Controlled Buffer. The primary difference is that a transistor is meant for more basic circuit designs.

    Pins (assuming component faces east, gate line top/left)

    West edge (input, bit width matches Data Bits attribute)
    The component's source input that will transmit to the output if triggered by the gate input.
    North edge (input, bit width 1)
    The component's gate input. For P-type transistors, the transistor will transmit if the gate value is 0; for N-type transistors, this will trigger the transistor if the gate value is 1.
    East edge (output, bit width matches Data Bits attribute)
    The component's output, which will match the source input if indicated by the gate input, or will be floating if the gate input is the negation of what indicates negation. If gate is floating or an error value, then the output will be an error value.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute and the arrow keys alter its Facing attribute.

    Type
    Determines whether the transistor is P-type or N-type.
    Facing
    The direction of the component (its output relative to its input).
    Gate Location
    The location of the gate input.
    Data Bits
    The bit width of the component's inputs and outputs.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/wiring/splitter.html0000644000175000017500000001150411541757132022170 0ustar vincentvincent Splitter

    Splitter

    Library: Wiring
    Introduced: 2.0 Beta 1 (in Base library, moved to Wiring in 2.7.0)
    Appearance:

    Behavior

    The splitter creates a correspondence between a multi-bit value and several separate subsets of those bits. Despite its name, it can either split a multi-bit value into component parts, or it can combine component parts into a multi-bit value - or indeed it can do both at once. A more complete description of splitters is found in the `Splitters' section of the User's Guide.

    Logisim treats splitters specially when propagating values within a circuit: Whereas all other components have a computed delay for purposes of simulating their behavior, values propagate through splitters (as well as wires) instantaneously.

    Note: The term splitter is a non-standard term, which is unique to Logisim as far as I know. I am unaware of any standard term for such a concept; the only term I have heard used is bus ripper, but this term is unnecessarily violent for my tastes.

    Pins

    To distinguish the several connecting points for a splitter, we refer to the single connecting point one side as its combined end, and we refer to the multiple connecting points on the other side as its split ends.

    Combined end (input/output bit width matches Bit Width In attribute)
    A value holding all of the bits traveling through the splitter.
    Split ends (input/output, bit width computed based on Bit x attributes)
    The number of split ends is specified in the Fan Out attribute, and each split end has an index that is at least 0 and less than the Fan Out attribute. For each split end, all bits for which Bit x refers to its index travels through that split end; the order of these bits is the same as their order within the combined end.

    Attributes

    When the component is selected or being added, the digits '0' through '9' alter its Fan Out attribute, Alt-0 through Alt-9 alter both the Fan Out and Bit Width In attributes, and the arrow keys alter its Facing attribute.

    Facing

    The location of the split ends relative to the combined end.

    Fan Out

    The number of split ends.

    Bit Width In

    The bit width of the combined end.

    Appearance

    Supports different ways of depicting the splitter in the circuit. The Left-handed option (the default) draws a spine going left from the combined end, with a labeled line coming from the spine for each split end. The Right-handed option is the same except the spine goes right (if you're facing according to the Facing attribute). The Centered option centers the spine so it goes in roughly equal directions left and right. And the Legacy option draws diagonal lines to each split end, without labels; this option is primarily for compatibility with versions older than 2.7.0, when this was the only option for splitter appearance.

    Bit x

    The index of the split end to which bit x of the combined end corresponds. The split ends are indexed starting from 0 at the top (for a splitter facing east or west) or from 0 at the left/west (for a splitter facing north or south). A bit can be specified to correspond to none of the split ends. There is no way for a bit to correspond to multiple split ends.

    Sometimes you can avoid twiddling each individual Bit x attribute by bringing up the pop-up menu for a splitter (usually by right-clicking or control-clicking it). The pop-up menu includes options labeled Distribute Ascending and Distribute Descending. The Distribute Ascending option distributes the bits so that each split end receives the same number of bits, starting from end 0. (If the number of split ends doesn't divide exactly into the number of bits, then the bits are distributed as evenly as possible.) Distribute Descending does the same but starts from the highest-numbered end.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/wiring/pull.html0000644000175000017500000000404011541757132021273 0ustar vincentvincent Pull Resistor

    Pull Resistor

    Library: Wiring
    Introduced: 2.5.0 (in Base library, moved to Wiring in 2.7.0)
    Appearance:
    Shaped:
    Rectangular:

    Behavior

    When connected to a point, this component has an effect only when the value at that point is the floating value (Z). In this case, the resistor pulls the wire to which it is connected toward the value indicated in its Pull Direction attribute.

    If it is connected to a multiple-bit value, then each bit in the value that is floating is pulled in the direction specified, while the bits that are not floating are left unchanged.

    Pins

    The resistor has just one pin, which is an output and has a bit width that is derived from whichever component it is connected.

    Attributes

    When the component is selected or being added, the arrow keys alter its Facing attribute.

    Facing
    The direction in which the component's pin lies from component's center.
    Pull Direction
    Specifies the value to which a floating value should be pulled. This could be 0, 1, or the error value.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/wiring/probe.html0000644000175000017500000000452711541757132021440 0ustar vincentvincent Probe

    Probe

    Library: Wiring
    Introduced: 2.0.3 (in Base library, moved to Wiring in 2.7.0)
    Appearance:

    Behavior

    A probe is an element that simply displays the value at a given point in a circuit. It does not itself interact with other components.

    In most respects, the probe component duplicates the functionality found in a Pin component configured as an output pin. The primary difference is that if the circuit is used as a subcircuit component, then an output pin will be a part of that interface, whereas a probe is not. They also are different in that the probe does not have a Data Bits attribute to be configured: The bit width is inferred from whatever value it happens to see on its input. Graphically, they are similar but have slightly different borders: A pin has a thick, black border, whereas a probe has a thin, gray border.

    Pins

    A probe component has only one pin, which will acts as an input to the probe. The width that this pin accepts is adaptive: The probe will adapt to inputs of any width.

    Attributes

    When the component is selected or being added, the arrow keys alter its Facing attribute.

    Facing
    The side of the component where its input pin should be.
    Label
    The text within the label associated with the component.
    Label Location
    The location of the label relative to the component.
    Label Font
    The font with which to render the label.
    Radix
    The base (for example, binary, decimal, or hexadecimal) in which a value is displayed.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    Allows the label associated with the component to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/wiring/pin.html0000644000175000017500000001147111541757132021113 0ustar vincentvincent Pin

    Pin

    Library: Wiring
    Introduced: 2.0 Beta 1 (in Base library, moved to Wiring in 2.7.0)
    Appearance:

    Behavior

    A pin is an output or an input to a circuit, depending on the value of its Output? attribute. In drawing a pin, Logisim represents output pins using a circle or rounded rectangle, and input pins are represented using squares or rectangles. In either case, the individual bits of the value being sent or received is displayed within the component (except within printer view, when the component only says how many bits wide the pin is).

    A pin is a convenient component for interacting with a circuit, and beginning Logisim users need not use them in any other way. But a user building a circuit using several subcircuits (as described in the `Subcircuits' section of the User's Guide) will use pins also to specify the interface between a circuit and a subcircuit. In particular, a circuit layout's pin components define the pins that appear on the subcircuit component when the layout is used within another circuit. In such a circuit, the values sent and received to those locations on the subcircuit component are tied to the pins within the subcircuit layout.

    Pins

    A pin component has only one pin, which will be an input to the component if the pin is an output pin, and it will be an output to the component if the pin is an input pin. In either case, its bit width matches the Data Bits attribute, and its location is specified by the Facing attribute.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute, the arrow keys alter its Facing attribute, and Alt with an arrow key alters its Label Location attribute.

    Facing
    The side of the component where its input/output pin should be.
    Output?
    Specifies whether the component is an output pin or an input pin. (Note that if the pin component is an input pin, then the pin that acts as its interface within the circuit will be an output, and vice versa.)
    Data Bits
    The number of bits for the value that the pin handles.
    Three-state?
    For an input pin, this configures whether the user can instruct the pin to emit unspecified (i.e., floating) values. The attribute deals with the user interface only; it does not have any effect on how the pin behaves when the circuit layout is used as a subcircuit. For an output pin, the attribute has no effect.
    Pull Behavior
    For an input pin, the attribute specifies how floating values should be treated when received as an input, perhaps from a circuit using the layout as a subcircuit. With "unchanged," the floating values are sent into the layout as floating values; with "pull up," they are converted into 1 values before being sent into the circuit layout; and with "pull down," they are converted into 0 values before being sent into the circuit layout.
    Label
    The text within the label associated with the component.
    Label Location
    The location of the label relative to the component.
    Label Font
    The font with which to render the label.

    Poke Tool Behavior

    Clicking an output pin has no effect, although the pin's attributes will be displayed.

    Clicking an input pin will toggle the bit that is clicked. If it is a three-state pin, then the corresponding bit will rotate between the three states.

    If, however, the user is viewing the state of a subcircuit as described in the `Debugging Subcircuits' of the User's Guide, then the pin's value is pinned to whatever value the subcircuit is receiving from the containing circuit. The user cannot change the value without breaking this link between the subcircuit's state and the containing circuit's state, and Logisim will prompt the user to verify that breaking this link is actually desired.

    Text Tool Behavior

    Allows the label associated with the component to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/wiring/index.html0000644000175000017500000000523311541757132021433 0ustar vincentvincent Wiring Library

    Wiring library

    The Wiring library includes components that relate primarily to wires and to basic electrical concepts.

    Splitter
    Pin
    Probe
    Tunnel
    Pull Resistor
    Clock
    Constant
    Power/Ground
    Transistor
    Transmission Gate
    Bit Extender

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/wiring/extender.html0000644000175000017500000000507111541757132022142 0ustar vincentvincent Bit Extender

    Bit Extender

    Library: Wiring
    Introduced: 2.5.0 (in Base library, moved to Wiring in 2.7.0)
    Appearance:

    Behavior

    The bit extender transforms a value into a value of another bit width. If it's being transformed into a smaller bit width, it is simply truncated to keep the lowest-order bits. If it's being transformed into a large bit width, the lowest-order bits are the same, and you have a choice about what the additional high-order bits will be: They can all be 0, all be 1, all match the input's sign bit (its highest-order bit), or the component can have an additional one-bit input that determines the identity of these other bits.

    Pins

    West edge (input, bit width from Bit Width In attribute)

    The multi-bit input whose value is to be transformed.

    East edge (output, bit width from Bit Width Out attribute)

    The computed output.

    North edge (input, bit width 1)

    Specifies what the additional bits in the output should be. This pin is available only when the Extension Type attribute is Input.

    Attributes

    When the component is selected or being added, the digits 0 through 9 alter the Bit Width In attribute and Alt-0 through Alt-9 alter its Bit Width Out attribute.

    Bit Width In
    The input's bit width.
    Bit Width Out
    The output's bit width.
    Extension Type
    Assuming the output bit width exceeds the input bit width, this attribute configures what the additional output bits should be. If Zero or One, the additional bits are 0 or 1 accordingly. If Sign, the additional bits are taken to match the highest-order bit in the input. And if Input, the component has a second input on its north side whose one-bit value is used for the additional bits.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/wiring/constant.html0000644000175000017500000000340311541757132022152 0ustar vincentvincent Constant

    Constant

    Library: Wiring
    Introduced: 2.0 Beta 1 (in Gates library, moved to Wiring in 2.7.0)
    Appearance:

    Behavior

    Emits the value specified in its Value attribute.

    Pins

    There is only one pin, an output whose bit width matches the Data Bits attribute. The location of this pin is specified in the Facing attribute. The component constantly outputs on this pin whatever value specified in the Value attribute.

    Attributes

    When the component is selected or being added, the hexademical digits '0' through '9' and 'a' through 'f' alter its Value attribute, Alt-0 through Alt-9 alter its Data Bits attribute, and the arrow keys alter its Facing attribute.

    Facing
    The direction in which the pin is located relative to where the value is drawn.
    Data Bits
    The bit width of the value placed onto the wire.
    Value
    The value, written in hexademical, that is emitted by the component. The number of bits used to specify the value cannot exceed the component's bit width.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/wiring/const01.html0000644000175000017500000000412611541757132021613 0ustar vincentvincent Power/Ground

    Power/Ground

    Library: Wiring
    Introduced: 2.7.0
    Appearance:

    Behavior

    Emits a single value onto a wire. For a power element, indicated by a triangle, this value will be one (or, if the Data Bits attribute is more than 1, an all-ones value). For a ground element, indicated by an arrow of three shortening parallel lines, this value will be zero (or, if the Data Bits attribute is more than 1, an all-zero value).

    The same functionality can be achieved using the more versatile Constant component. The only reason to prefer ground and power is that they are standard electronic symbols.

    Pins

    There is only one pin, an output whose bit width matches the Data Bits attribute. The component constantly outputs the same value on this pin: for a ground component, the output is an all-zero value, and for a power component, the output is an all-one value.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute and the arrow keys alter its Facing attribute.

    Facing
    The direction in which the arrow will point from the location of its pin.
    Data Bits
    The bit width of the value placed onto the wire.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/wiring/clock.html0000644000175000017500000000511711541757132021420 0ustar vincentvincent Clock

    Clock

    Library: Wiring
    Introduced: 2.0 Beta 13 (in Base library, moved to Wiring in 2.7.0)
    Appearance:

    Behavior

    The clock toggles its output value on a regular schedule as long as ticks are enabled via the Simulate menu. (Ticks are disabled by default.) A "tick" is Logisim's unit of time; the speed at which ticks occur can be selected from the Simulate menu's Tick Frequency submenu.

    The clock's cycle can be configured using its High Duration and Low Duration attributes.

    Note that Logisim's simulation of clocks is quite unrealistic: In real circuits, multiple clocks will drift from one another and will never move in lockstep. But in Logisim, all clocks experience ticks at the same rate.

    Pins

    A clock has only one pin, an output with a bit width of 1, whose value will represent the current value of the clock. The location of this pin is specified in the Facing attribute. The clock's value will toggle on its schedule whenever ticks are enabled, and it will toggle whenever it is clicked using the Poke Tool.

    Attributes

    When the component is selected or being added, the arrow keys alter its Facing attribute.

    Facing
    The side of the component where its output pin should be.
    High Duration
    The length of time within each cycle that the clock's output should be 1.
    Low Duration
    The length of time within each cycle that the clock's output should be 0.
    Label
    The text within the label associated with the clock component.
    Label Location
    The location of the label relative to the component.
    Label Font
    The font with which to render the label.

    Poke Tool Behavior

    Clicking a clock component will toggle its current output value immediately.

    Text Tool Behavior

    Allows the label associated with the component to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/plexers/0000755000175000017500000000000011541757132017616 5ustar vincentvincentlogisim-2.7.1/doc/en/html/libs/plexers/selector.html0000644000175000017500000000461211541757132022327 0ustar vincentvincent Bit Selector

    Bit Selector

    Library: Plexers
    Introduced: 2.0.5
    Appearance:

    Behavior

    Given an input of several bits, this will divide it into several equal-sized groups (starting from the lowest-order bit) and output the group selected by the select input.

    For example, if we have an eight-bit input 01010101, and we are to have a three-bit output, then group 0 will be the lowest-order three bits 101, group 1 will be the next three bits, 010, and group 2 will be the next three bits 001. (Any bits beyond the top are filled in with 0.) The select input will be a two-bit number that selects which of these three groups to output; if the select input is 3, then 000 will be the output.

    Pins (assuming component faces east)

    West edge (input, bit width matches Data Bits attribute)
    Data value from which bits should be selected for the output.
    East edge (output, bit width matches Output Bits attribute)
    A group of bits from the data value, as selected by the select input.
    South edge (input, bit width is quotient of Data Bits and Output Bits, rounded up)
    Select input: Determines which of the bit groups should be routed to the output.

    Attributes

    When the component is selected or being added, the digits '0' through '9' alter its Output Bits attribute, Alt-0 through Alt-9 alter its Data Bits attribute, and the arrow keys alter its Facing attribute.

    Facing
    The direction of the component (its output relative to its input).
    Data Bits
    The bit width of the component's data input.
    Output Bits
    The bit width of the component's output.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/plexers/priencod.html0000644000175000017500000000766511541757132022325 0ustar vincentvincent Priority Encoder

    Priority Encoder

    Library: Plexers
    Introduced: 2.3.0
    Appearance:

    Behavior

    The component has a number of inputs on its west edge, with the first labeled 0 and the other numbered from there. The component determines the indices of the inputs whose values are 1, and it emits the highest index. For example, if inputs 0, 2, 5, and 6 are all 1, then the priority encoder emits a value of 110. If no inputs are 1, or if the component is disabled, then the output of the priority encoder is floating.

    The priority encoder is designed so that a number of encoders can be daisy-chained to accommodate additional inputs. In particular, the component includes an enable input and an enable output. Whenever the enable input is 0, the component is disabled, and the output will be all floating bits. The enable output is 1 whenever the component is enabled and none of the indexed inputs are 1. Thus, you can take two priority encoders and connect the enable output of the first to the enable input of the second: If any of the indexed inputs to the first are 1, then the second will be disabled and so its output will be all floating. But if none of the first's indexed inputs are 1, then its output will be all-floating bits, and the second priority encoder will be enabled and it will identify the highest-priority input with a 1.

    An additional output of the priority encoder is 1 whenever the priority encoder is enabled and finds a 1 on one of the indexed inputs. When chaining priority encoders together, this output can be used to identify which of the encoders was triggered.

    Pins (assuming component faces east)

    West edge, variable number (inputs, bit width 1)
    Input values, indexed from 0 at the top/west end of the edge.
    East edge, upper pin (output, bit width matches Select Bits attribute)
    Output: the highest index among those inputs whose value is 1 - or all floating bits if no inputs are 1 or if the component is disabled via the Enable In input.
    East edge, lower pin (output, bit width 1)
    Group Signal: 1 if the component is enabled and at least one indexed input has a value of 1; otherwise this output is 0.
    South edge (input, bit width 1)
    Enable In: if 0, the component is disabled; otherwise the component is enabled.
    North edge (output, bit width 1)
    Enable Out: 1 if this component is enabled and none of the indexed inputs are 1; otherwise the output is 0.

    Attributes

    When the component is selected or being added, the digits '1' through '4' alter its Select Bits attribute and the arrow keys alter its Facing attribute.

    Facing
    The direction of the component (its output relative to its input).
    Select Bits
    The bit width of the component's primary output. The number of indexed inputs to the priority encoder will be 2selectBits.
    Disabled Output
    Specifies what each bit of the output should be when the component is disabled (i.e., when the enable pin is 0). Options include zero and floating; in the latter case, the output is effectively disconnected from any other ports.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    -logisim-2.7.1/doc/en/html/libs/plexers/mux.html0000644000175000017500000000674011541757132021324 0ustar vincentvincent Multiplexer

    Multiplexer

    Library: Plexers
    Introduced: 2.0 Beta 11
    Appearance:

    Behavior

    Copies an input on the west edge onto the output on the east edge; which of the inputs to copy is specified via the current value received through the input on the south edge. I find it useful to think of a multiplexer as analogous to a railroad switch, controlled by the select input.

    (Incidentally, some authorities spell this multiplexor, but multiplexer is the predominant spelling.)

    Pins (assuming component faces east, select is bottom/left)

    West edge, variable number (inputs, bit width matches Data Bits attribute)
    Data values, one of which is to be routed to the output. Each input data value is numbered, starting with 0 on the north.
    East edge (output, bit width matches Data Bits attribute)
    The output value will match the input values on the west edge whose number is the same as the value currently received through the select input on the south. If the select input contains any unspecified (i.e., floating) bits, then the output is completely floating.
    South edge, left side indicated by gray circle (input, bit width matches Select Bits attribute)
    Select input: The value of this input determines which input on the west edge to route to the output on the east edge.
    South edge, right side (input, bit width 1)
    Enable: When 0, the multiplexer's output consists of all floating bits, regardless of the data and select inputs.

    Attributes

    When the component is selected or being added, the digits '1' through '4' alter its Select Bits attribute, Alt-0 through Alt-9 alter its Data Bits attribute, and the arrow keys alter its Facing attribute.

    Facing
    The direction of the component (its output relative to its input).
    Select Location
    The location of the select and enable lines relative to the component.
    Select Bits
    The bit width of the component's select input on its south edge. The number of inputs to the multiplexer will be 2selectBits.
    Data Bits
    The bit width of the data being routed through the multiplexer.
    Disabled Output
    Specifies what each bit of the output should be when the component is disabled (i.e., when the enable pin is 0). Options include zero and floating; in the latter case, the output is effectively disconnected from any other ports.
    Include Enable?
    The component has an enable input when this attribute is yes. The attribute is primarily for supporting circuits built using older versions of Logisim that did not provide an enable input.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/plexers/index.html0000644000175000017500000000246611541757132021623 0ustar vincentvincent Plexers Library

    Plexers library

    The Plexers library includes control components. Like the components of the Gates library, all are combinational, but their purpose is generally for routing values.

    Multiplexer
    Demultiplexer
    Decoder
    Priority Encoder
    Bit Selector

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/plexers/demux.html0000644000175000017500000000726111541757132021634 0ustar vincentvincent Demultiplexer

    Demultiplexer

    Library: Plexers
    Introduced: 2.0 Beta 11
    Appearance:

    Behavior

    Copies the input on the west edge onto exactly one of the outputs on the east edge; which of these outputs is specified via the current value received through the input on the south edge. I find it useful to think of a demultiplexer as analogous to a railroad switch, controlled by the select input.

    (Incidentally, some authorities spell this demultiplexor, but demultiplexer is the predominant spelling.)

    Pins (assuming component faces east, select is bottom/left)

    West edge (input, bit width matches Data Bits attribute)
    The value to be routed to one of the outputs on the east edge.
    East edge, variable number (outputs, bit width matches Data Bits attribute)
    The outputs are numbered starting with 0 on the north. An output will match the west input if its number matches the value currently received through the select input on the south; otherwise, its value will be either all-zeroes or all-floating, depending on the value of the Three-State? attribute. If the select input contains any unspecified bits, then all outputs are floating.
    South edge, left side (input, bit width 1)
    Enable: When 0, all outputs consist of all floating bits, regardless of the data and select inputs.
    South edge, right side indicated by gray circle (input, bit width matches Select Bits attribute)
    Select input: The value of this input determines to which output on the east edge to route the value received on the west edge.

    Attributes

    When the component is selected or being added, the digits '1' through '4' alter its Select Bits attribute, Alt-0 through Alt-9 alter its Data Bits attribute, and the arrow keys alter its Facing attribute.

    Facing
    The direction of the component (specifying which side has the outputs).
    Select Location
    The location of the select and enable lines relative to the component.
    Select Bits
    The bit width of the component's select input on its south edge. The number of outputs for the demultiplexer will be 2selectBits.
    Data Bits
    The bit width of the data being routed through the demultiplexer.
    Three-state?
    Specifies whether the unselected outputs should be floating (Yes) or zero (No).
    Disabled Output
    Specifies what each bit of the outputs should be when the component is disabled (i.e., when the enable pin is 0). Options include zero and floating; in the latter case, the outputs are effectively disconnected from any other ports.
    Include Enable?
    The component has an enable input when this attribute is yes. The attribute is primarily for supporting circuits built using older versions of Logisim that did not provide an enable input.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/plexers/decoder.html0000644000175000017500000000565211541757132022121 0ustar vincentvincent Decoder

    Decoder

    Library: Plexers
    Introduced: 2.0 Beta 11
    Appearance:

    Behavior

    Emits 1 on exactly one output; which output is 1 depends on the current value received through the input on the south edge.

    Pins (assuming component faces east, select is bottom/left)

    East edge, variable number (outputs, bit width 1)
    The outputs are numbered starting with 0 on the north. Each output will be 1 if its number matches the value currently received through the select input on the south; otherwise, its value will be either zero or floating, depending on the value of the Three-State? attribute. If the select input contains any unspecified bits, then all outputs are floating.
    South edge, left side (input, bit width 1)
    Enable: When 0, all outputs consist of all floating bits (or zeros), regardless of the select input.
    South edge, right side indicated by gray circle (input, bit width matches Select Bits attribute)
    Select input: The value of this input determines which of the outputs is 1.

    Attributes

    When the component is selected or being added, the digits '1' through '4' alter its Select Bits attribute and the arrow keys alter its Facing attribute.

    Facing
    The direction of the component (specifying which side has the outputs).
    Select Location
    The location of the select and enable lines relative to the component.
    Select Bits
    The bit width of the component's select input on its south edge. The number of outputs for the decoder will be 2selectBits.
    Three-state?
    Specifies whether the unselected outputs should be floating (Yes) or zero (No).
    Disabled Output
    Specifies what each bit of the outputs should be when the component is disabled (i.e., when the enable pin is 0). Options include zero and floating; in the latter case, the outputs are effectively disconnected from any other ports.
    Include Enable?
    The component has an enable input when this attribute is yes. The attribute is primarily for supporting circuits built using older versions of Logisim that did not provide an enable input.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/mem/0000755000175000017500000000000011541757132016712 5ustar vincentvincentlogisim-2.7.1/doc/en/html/libs/mem/shiftreg.html0000644000175000017500000001050011541757132021407 0ustar vincentvincent Shift Register

    Shift Register

    Library: Memory
    Introduced: 2.3.0
    Appearance:

    Behavior

    This register consists of several stages, where each clock may lead to each stage receiving the value in the previous stage, while a new value is loaded into the first stage. The component optionally also supports parallel loads and stores to all stages' values.

    The clear input resets all stages to 0 (all zeroes) asynchronously; that is, as long as the clear input is 1, all values are pinned to 0, regardless of the clock input.

    Pins

    * An asterisk marks pins that exist only when the Parallel Load attribute is enabled.

    West edge, top pin (input, bit width 1)
    Shift: When 1 or disconnected, all stages advance with the clock trigger; but if it is 0, no advance takes place. This input is ignored if the Load input is 1.
    West edge, middle pin (input, bit width matches Data Bits attribute)
    Data: When advancing the stages, the value found at this input is loaded into the first stage.
    West edge, bottom pin marked with triangle (input, bit width 1)
    Clock: At the instant that this is triggered as specified by the Trigger attribute, the component may advance the stages or load new values.
    *North edge, left pin (input, bit width 1)
    Load: When this 1, the values found on the other north-edge pins are loaded into all stages at the next clock trigger. When 0 or disconnected, no load occurs.
    *North edge, other pins (input, bit width matches Data Bits attribute)
    Data: These values are loaded into all stages when the clock is triggered while the load input is 1. The leftmost input corresponds to the youngest stage.
    South edge, left pin (input, bit width 1)
    Clear: When this is 1, all stages are asynchronously reset to 0, and all other inputs are ignored.
    *South edge, other pins (output, bit width matches Data Bits attribute)
    Output: Emits the value stored in each stage, with the youngest stage reflected on the leftmost of the pins (next to the clear input).
    East edge (output, bit width matches Data Bits attribute)
    Output: Emits the value stored in the final (oldest) stage.

    Attributes

    When the component is selected or being added, the digits '0' through '9' alter its Number of Stages attribute and Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the value stored in each stage.
    Number of Stages
    The number of stages included in the component.
    Parallel Load
    If yes, then the component includes inputs and outputs facilitating parallel access to all the stages' values.
    Trigger
    Configures how the clock input is interpreted. The value rising edge indicates that the register should update its value at the instant when the clock rises from 0 to 1. The falling edge value indicates that it should update at the instant the clock falls from 1 to 0.
    Label
    The text within the label associated with the component.
    Label Font
    The font with which to render the label.

    Poke Tool Behavior

    If the Parallel Load attribute is no, or if the Data Bits attribute is more than 4, then poking the register has no effect. Otherwise, clicking the component will bring keyboard focus to the clicked stage (indicated by a red rectangle), and typing a hexadecimal digit will change the value stored in that stage.

    Text Tool Behavior

    Allows the label associated with the component to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/mem/rom.html0000644000175000017500000000640611541757132020403 0ustar vincentvincent ROM

    ROM

    Library: Memory
    Introduced: 2.1.0
    Appearance:

    Behavior

    The ROM component stores up to 16,777,216 values (specified in the Address Bit Width attribute), each of which can include up to to 32 bits (specified in the Data Bit Width attribute). A circuit can access the current values in ROM, but it cannot change them. The user can modify individual values interactively via the Poke Tool, or the user can modify the entire contents via the Menu Tool.

    Unlike the RAM component, the ROM component's current contents are stored as an attribute of the component. Thus, if a circuit containing a ROM component is used twice, then both ROM components will hold the same values. Also because of this behavior, the current ROM contents are stored in files created by Logisim.

    Current values are displayed in the component. Addresses displayed are listed in gray to the left of the display area. Inside, each value is listed using hexadecimal. The value at the currently selected address will be displayed in inverse text (white on black).

    Pins

    A on west edge (input, bit width matches Address Bit Width attribute)
    Selects which of the values are currently being accessed by the circuit.
    D on east edge (input/output, bit width matches Data Bit Width attribute)
    Outputs the value at the currently selected address at the D pin if sel is 1 or floating. If sel is 0, then D will be floating.
    sel on south edge (input, bit width 1)
    If you have just one ROM module, ignore this input. If you have multiple ROM modules in parallel, you can use this input to enable or disable the entire ROM module, based on whether the value is 1 or 0. In other words, when this is 0, no value is emitted on the D output.

    Attributes

    When the component is selected or being added, the digits '0' through '9' alter its Address Bit Width attribute and Alt-0 through Alt-9 alter its Data Bit Width attribute.

    Address Bit Width
    The bit width of the address bits. The number of values stored in ROM is 2addrBitWidth.
    Data Bit Width
    The bit width of each individual value in memory.
    Contents
    Stores the contents of memory.

    Poke Tool Behavior

    See poking memory in the User's Guide.

    Text Tool Behavior

    None.

    Menu Tool Behavior

    See pop-up menus and files in the User's Guide.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/mem/register.html0000644000175000017500000000733311541757132021432 0ustar vincentvincent Register

    Register

    Library: Memory
    Introduced: 2.0 Beta 1
    Appearance:

    Behavior

    A register stores a single multi-bit value, which is displayed in hexadecimal within its rectangle, and is emitted on its Q output. When the clock input (indicated by a triangle on the south edge) indicates so, the value stored in the register changes to the value of the D input at that instant. Exactly when the clock input indicates for this to happen is configured via the Trigger attribute.

    The reset input resets the register's value to 0 (all zeroes) asynchronously; that is, as long as reset is 1, the value is pinned to 0, regardless of the clock input.

    Pins

    East edge, labeled Q (output, bit width matches Data Bits attribute)
    Outputs the value currently stored by the register.
    West edge, labeled D (input, bit width matches Data Bits attribute)
    Data input: At the instant that the clock value rises from 0 to 1, the register's value changes to the value of the D input at that instant.
    West edge, labeled en (input, bit width 1)
    Enable: When this is 0, clock triggers are ignored. The current value continues to appear on the output. The clock triggers are enabled when this input is 1 or undefined.
    South edge, indicated with a triangle (input, bit width 1)
    Clock input: At the instant that this input value rises from 0 to 1 (the rising edge), the register's value will be updated to the value of the D input.
    South edge, labeled 0 (input, bit width 1)
    Asynchronous reset: When 0 or undefined, this input has no effect. As long as it is 1, the register's value is pinned to 0. This occurs asynchronously - that is, without regard to the current clock input value. As long as this is 1, the other inputs have no effect.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the value stored in the register.
    Trigger
    Configures how the clock input is interpreted. The value rising edge indicates that the register should update its value at the instant when the clock rises from 0 to 1. The falling edge value indicates that it should update at the instant the clock falls from 1 to 0. The high level value indicates that the register should update continuously whenever the clock input is 1. And the low level value indicates that it should update continuously when the clock input is 0.
    Label
    The text within the label associated with the register.
    Label Font
    The font with which to render the label.

    Poke Tool Behavior

    Clicking the register brings keyboard focus to the register (indicated by a red rectangle), and typing hexadecimal digits will change the value stored in the register.

    Text Tool Behavior

    Allows the label associated with the component to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/mem/random.html0000644000175000017500000000777611541757132021101 0ustar vincentvincent Random

    Random

    Library: Memory
    Introduced: 2.3.0
    Appearance:

    Behavior

    This component iterates through a pseudorandom sequence of numbers, which steps forward to the following number in the sequence each time the clock is triggered while the component is enabled. Technically speaking, the algorithm used to compute the pseudorandom sequence is a linear congruential generator: Starting from a seed r0, the following number r1 is the number

    r1 = (25,214,903,917 r0 + 11) mod 248

    The next value r2 is computed from r1 using the same computation, and so forth. This sequence is of 48-bit numbers; the value seen from the component is the low-order bits as configured by its Data Bits attribute, after first throwing out the lower 12 bits of the current seed.

    Besides the clock input, the component also includes an enable input, which leads the clock input to be ignored when enable is 0, and the reset input, which resets the component's value asynchronously to the initial seed r0.

    The initial seed is user-configurable. If it is configured at 0 (which is the default), then the seed is based on the current time; when instructed to reset through the reset input, the component computes a new seed based on the new current time.

    Pins

    East edge, labeled Q (output, bit width matches Data Bits attribute)
    Outputs the value currently stored by the component.
    West edge, top pin, labeled with a triangle (input, bit width 1)
    Clock: At the instant that this is triggered as specified by the Trigger attribute, the component steps to the following number in its sequence.
    West edge, bottom pin (input, bit width 1)
    Enable: The component is enabled when this input is disconnected or 1; but if it is 0, then the clock input is ignored.
    South edge (input, bit width 1)
    Reset: When this is 1, the pseudorandom sequence asynchronously resets to the initial seed. (If seed is 0, this new seed should be different from the initial seed used previously.)

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the value emitted by the component.
    Seed
    The starting value used for the pseudorandom sequence. If this is 0 (the default), then the starting value is based on the time that the random sequence began.
    Trigger
    Configures how the clock input is interpreted. The value rising edge indicates that the component should update its value at the instant when the clock rises from 0 to 1. The falling edge value indicates that it should update at the instant the clock falls from 1 to 0.
    Label
    The text within the label associated with the component.
    Label Font
    The font with which to render the label.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    Allows the label associated with the component to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/mem/ram.html0000644000175000017500000001447711541757132020374 0ustar vincentvincent RAM

    RAM

    Library: Memory
    Introduced: 2.0 Beta 1
    Appearance:

    Behavior

    The RAM component, easily the most complex component in Logisim's built-in libraries, stores up to 16,777,216 values (specified in the Address Bit Width attribute), each of which can include up to to 32 bits (specified in the Data Bit Width attribute). The circuit can load and store values in RAM. Also, the user can modify individual values interactively via the Poke Tool, or the user can modify the entire contents via the Menu Tool.

    Current values are displayed in the component. Addresses displayed are listed in gray to the left of the display area. Inside, each value is listed using hexadecimal. The value at the currently selected address will be displayed in inverse text (white on black).

    The RAM component supports three different interfaces, depending on the Data Interface attribute.

    One synchronous load/store port (default)

    The component includes a single port on its east side that serves for both loading and storing data. Which it performs depends on the input labeled ld: 1 (or floating) indicates to load the data at the address designated on the component's west side, and 0 indicates to store the data given on the port. To transmit data into and out of the component, you will need to use a Controlled Buffer component, as illustrated below.

    One asynchronous load/store port

    This is the same as above, except that there is no clock. The value found on the data bus is stored into memory whenever the ld input is 0. If, while the ld input is 0, the address or data changes, then an additional store occurs. This option is meant to more closely approximate the interface of many available random-access memories.

    Separate load and store ports

    Two data ports are provided - one on the west side for storing data, and another on the east side for loading data. This option removes the necessity of dealing with the Controlled Buffer and so it is easier to use.

    Pins

    A on west edge (input, bit width matches Address Bit Width attribute)
    Selects which of the values in memory is currently being accessed by the circuit.
    D on west edge (input, bit width matches Data Bit Width attribute)
    This input is present only if "separate load and store ports" is selected for the Data Interface attribute. When a store is requested (via the clock changing from 0 to 1 while sel and str are both 1 or floating), the value found at this port is stored into memory at the currently selected address.
    D on east edge (input/output or output, bit width matches Data Bit Width attribute)
    If sel and ld are 1 or floating, then the RAM component emits the value found at the currently selected address on this port. If there is a single load/store port, the value read from this port is stored whenever a store is requested.
    str on south edge (input, bit width 1)
    Store: This input is present only if "separate load and store ports" is selected for the Data Interface attribute. When it is 1 or floating, a clock pulse will result in storing the data found on the west edge into memory (provided the sel input is also 1 or floating).
    sel on south edge (input, bit width 1)
    Chip select: This input enables or disables the entire RAM module, based on whether the value is 1/floating or 0. The input is meant primarily for situations where you have multiple RAM units, only one of which would be enabled at any time.
    triangle on south edge (input, bit width 1)
    Clock input: This is absent when the Data Interface attribute's value is "One asynchronous load/store port." In other circumstances, when ld is 0, and this input rises from 0 to 1 (and sel is 1/undefined and clr is 0), then the value at the currently selected address changes to whatever value is at the D pin. As long as the clock input remains 0 or 1, though, the D value will not be stored into memory.
    ld on south edge (input, bit width 1)
    Load: Selects whether the RAM should emit (on D) the value at the current address (A). This output behavior is enabled if out is 1 or undefined; if out is 0, then no value is pushed onto D - but if there is a combined load/store port, stores will be enabled.
    clr on south edge (input, bit width 1)
    Clear: When this is 1, all values in memory are pinned to 0, no matter what the other inputs are.

    Attributes

    When the component is selected or being added, the digits '0' through '9' alter its Address Bit Width attribute and Alt-0 through Alt-9 alter its Data Bit Width attribute.

    Address Bit Width
    The bit width of the address bits. The number of values stored in RAM is 2addrBitWidth.
    Data Bit Width
    The bit width of each individual value in memory.
    Data Interface
    Configures which of the three interfaces are used for communicating data into and out of the component.

    Poke Tool Behavior

    See poking memory in the User's Guide.

    Text Tool Behavior

    None.

    Menu Tool Behavior

    See pop-up menus and files in the User's Guide.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/mem/index.html0000644000175000017500000000344311541757132020713 0ustar vincentvincent Memory Library

    Memory library

    The Memory library includes components that remember information.

    D/T/J-K/S-R Flip-Flop
    Register
    Counter
    Shift Register
    Random
    RAM
    ROM

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/mem/flipflops.html0000644000175000017500000001722711541757132021607 0ustar vincentvincent D/T/J-K/S-R Flip-Flop

    D/T/J-K/S-R Flip-Flop

    Library: Memory
    Introduced: 2.0 Beta 1
    Appearance:

    Behavior

    Each flip-flop stores a single bit of data, which is emitted through the Q output on the east side. Normally, the value can be controlled via the inputs to the west side. In particular, the value changes when the clock input, marked by a triangle on each flip-flop, rises from 0 to 1 (or otherwise as configured); on this rising edge, the value changes according to the table below.

    D Flip-Flop T Flip-Flop J-K Flip-Flop S-R Flip-Flop
    DQ
    00
    11
    TQ
    0Q
    1Q'
    JKQ
    00 Q
    01 0
    10 1
    11 Q'
    SRQ
    00 Q
    01 0
    10 1
    11 ??

    Another way of describing the different behavior of the flip-flops is in English text.

    • D Flip-Flop: When the clock triggers, the value remembered by the flip-flop becomes the value of the D input (Data) at that instant.

    • T Flip-Flop: When the clock triggers, the value remembered by the flip-flop either toggles or remains the same depending on whether the T input (Toggle) is 1 or 0.

    • J-K Flip-Flop: When the clock triggers, the value remembered by the flip-flop toggles if the J and K inputs are both 1 and the value remains the same if both are 0; if they are different, then the value becomes 1 if the J (Jump) input is 1 and 0 if the K (Kill) input is 1.

    • S-R Flip-Flop: When the clock triggers, the value remembered by the flip-flop remains unchanged if R and S are both 0, becomes 0 if the R input (Reset) is 1, and becomes 1 if the S input (Set) is 1. The behavior in unspecified if both inputs are 1. (In Logisim, the value in the flip-flop remains unchanged.)

    By default, the clock triggers on a rising edge — that is, when the clock input changes from 0 to 1. However, the Trigger attribute allows this to change to a falling edge (when the clock input changes from 1 to 0), a high level (for the duration that the clock input is 1), or a low level (for the duration that the clock input is 0). The level-trigger options are unavailable for the T and J-K flip-flops, because a flip-flop behaves unpredictably when told to toggle for an indeterminate amount of time.

    Pins

    West edge, marked by triangle (input, bit width 1)
    Clock input: At the instant that this input value switches from 0 to 1 (the rising edge), the value will be updated according to the other inputs on the west edge. As long as this remains 0 or 1, the other inputs on the west edge have no effect.
    West edge, other labeled pin(s) (input(s), bit width 1)
    These inputs control how the flip-flop's value changes during the rising edge of the clock. Their exact behavior depends on the flip-flop; the above tables summarize their behavior.
    East edge, labeled Q, north end (output, bit width 1)
    Outputs the value currently stored by the flip-flop.
    East edge, south end (output, bit width 1)
    Outputs the complement of the value currently stored by the flip-flop.
    South edge, east end (input, bit width 1)
    Asynchronous reset: When 0 or undefined, this input has no effect. As long as it is 1, the flip-flop's value is pinned to 0. This occurs asynchronously - that is, without regard to the current clock input value. As long as this is 1, the other inputs have no effect.
    South edge, center end (input, bit width 1)
    Enable: When this is 0, clock triggers are ignored. The current bit continues to appear on the output. The clock triggers are enabled when this input is 1 or undefined.
    South edge, west end (input, bit width 1)
    Asynchronous set: When 1 or undefined, this input has no effect. When 1, the flip-flop's value is pinned to 1. This occurs asynchronously - that is, without regard to the current clock input value. As long as this input is 1, the other inputs have no effect, except for the asynchronous reset input, which has priority.

    Attributes

    Trigger
    Configures how the clock input is interpreted. The value rising edge indicates that the flip-flop should update its value at the instant when the clock rises from 0 to 1. The falling edge value indicates that it should update at the instant the clock falls from 1 to 0. The high level value indicates that the flip-flop should update continuously whenever the clock input is 1. And the low level value indicates that it should update continuously when the clock input is 0. Note that the latter two options are unavailable for T and J-K flip-flops.
    Label
    The text within the label associated with the flip-flop.
    Label Font
    The font with which to render the label.

    Poke Tool Behavior

    Clicking a flip-flop using the Poke Tool toggles the bit stored in the flip-flop, unless the asynchronous set/reset inputs currently pin the flip-flop's value.

    Text Tool Behavior

    Allows the label associated with the component to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/mem/counter.html0000644000175000017500000001422111541757132021257 0ustar vincentvincent Counter

    Counter

    Library: Memory
    Introduced: 2.3.0
    Appearance:

    Behavior

    The counter holds a single value, whose value is emitted on the output Q. Each time the clock input (diagrammed with a triangle on the component's south edge) triggers according to its Trigger attribute, the value in the counter may update based on the two inputs on the component's west edge: The upper input is called load and the lower is called count, and they are interpreted as follows.

    loadcounttrigger action
    0 or z0 The counter remains unchanged.
    0 or z1 or z The counter increments.
    10 The counter loads the value found at the D input.
    11 or z The counter decrements.

    The range of counting can be configured using the Maximum Value attribute. When the counter reaches this value, the next increment wraps the counter back to 0; and if it is at 0, then a decrement will wrap the counter around back to its maximum value.

    In addition to the output Q, the component also includes a single-bit output carry. This is 1 whenever the counter is at its maximum and the load and count inputs indicate that the component should increment on the next step - or when the counter is at 0 and the load and count inputs indicate to decrement at the next step.

    The clear input resets the counter's value to 0 (all zeroes) asynchronously; that is, as long as the clr input is 1, the value is pinned to 0, regardless of the clock input.

    Pins

    East edge, labeled Q (output, bit width matches Data Bits attribute)
    Outputs the value currently stored by the counter.
    East edge, lower pin (output, bit width 1)
    Carry: When load and count indicate to increment, this output is 1 whenever the counter is at its maximum. When load and count indicate to decrement, this output is 1 whenever the counter is at 0. At all other times, this output is 0.
    West edge, top pin (input, bit width 1)
    Load: When this is 1 while the count input is 0, the counter will load the value found at the data input at the next clock trigger - or, if the count input happens to be 1, the counter's value will decrement.
    West edge, middle pin labeled D (input, bit with matches Data Bits attribute)
    Data: When the clock triggers while load is 1 and count is 0, the counter's value changes to the value found at this input.
    West edge, lower pin labeled ct (input, bit width 1)
    Count: When this is 1 or unconnected, the value in the counter increments whenever the clock input is triggered - or it decrements if the load input happens to also be 1.
    South edge, indicated with a triangle (input, bit width 1)
    Clock: At the instant that this is triggered as specified by the Trigger attribute, the counter updates as indicated by the load and count inputs.
    South edge, labeled 0 (input, bit width 1)
    Clear: When 0 or undefined, this input has no effect. As long as it is 1, the counter's value is asynchronously pinned to 0. This occurs asynchronously - that is, without regard to the current clock input value. As long as this is 1, the other inputs have no effect.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the value emitted by the component.
    Maximum Value
    The maximum value, at which point the counter will set its carry output.
    Action On Overflow
    The behavior when the counter attempts to increment beyond the maximum value or decrement beyond 0. Four possible actions are supported:
    Wrap around
    The next value is 0 (if incrementing - the maximum value if decrementing)
    Stay at value
    The counter's value remains at the maximum (or 0 if decrementing)
    Continue counting
    The counter continues incrementing/decrementing, keeping the number of bits as provided by the Data Bits attribute
    Load next value
    The next value is loaded from the D input.
    Trigger
    Configures how the clock input is interpreted. The value rising edge indicates that the counter should update its value at the instant when the clock rises from 0 to 1. The falling edge value indicates that it should update at the instant the clock falls from 1 to 0.
    Label
    The text within the label associated with the component.
    Label Font
    The font with which to render the label.

    Poke Tool Behavior

    Clicking the counter brings keyboard focus to the component (indicated by a red rectangle), and typing hexadecimal digits will change the value stored in the counter.

    Text Tool Behavior

    Allows the label associated with the component to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/io/0000755000175000017500000000000011541757132016543 5ustar vincentvincentlogisim-2.7.1/doc/en/html/libs/io/tty.html0000644000175000017500000000544511541757132020261 0ustar vincentvincent TTY

    TTY

    Library: Input/Output
    Introduced: 2.2.0
    Appearance:

    Behavior

    This component implements a very simple dumb terminal. It receives a sequence of ASCII codes and displays each printable character. When the current row becomes full, the cursor moves to the following line, possibly scrolling all current rows up if the cursor was already in the bottom row. The only supported control sequences are: backspace (ASCII 8), which deletes the last character in the final row, unless the final row is already empty; newline (ASCII 10), which moves the cursor to the beginning of the following line, scrolling if necessary; and form-feed (ASCII 12, typed as control-L), which clears the screen.

    Pins

    West edge, upper pin (input, bit width 7)
    Data - this is the ASCII value of the next character to be entered into the terminal.
    West edge, lower pin marked by triangle (input, bit width 1)
    Clock - when triggered while the write-enable pin isn't 0, the current ASCII value on the Data input is processed by the terminal.
    South edge, leftmost pin (input, bit width 1)
    Write Enable - when 1 (or floating or error), a clock edge will result in processing a new character from the data input. The clock and data inputs are ignored when Write Enable is 0.
    South edge, second pin from left (input, bit width 1)
    Clear - when 1, the terminal is cleared of all data, and all other inputs are ignored.

    Attributes

    Rows
    The number of rows displayed in the terminal.
    Columns
    The maximum number of characters displayed in each row of terminal.
    Trigger
    If the value is Rising Edge, then when the clock input changes from 0 to 1, the data input is processed (when enabled by the write-enable and clear inputs). If it is Falling Edge,, then this happens when the clock input changes from 1 to 0.
    Color
    The color with which to draw the text appearing in the terminal.
    Background
    The color with which to draw the terminal's background.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/io/led.html0000644000175000017500000000403111541757132020173 0ustar vincentvincent LED

    LED

    Library: Input/Output
    Introduced: 2.1.3
    Appearance:

    Behavior

    Displays the value of its input by coloring the LED (as specified by its Color attribute) or not depending on whether the input is 1 or 0.

    (The LED component is basically redundant with an output pin, except for a somewhat different appearance. Some users, though, thought it would be nice to include.)

    Pins

    A LED has only one pin, a 1-bit input which is used to determine whether to display the LED colored (when the input is 1) or darkened (when the input is anything else).

    Attributes

    When the component is selected or being added, the arrow keys alter its Facing attribute.

    Facing
    The location of the input pin relative to the component.
    Color
    The color to display when the input value is 1.
    Active On High?
    If yes, then the LED is colored when the input is 1. If no, it is colored when the input is 0.
    Label
    The text within the label associated with the component.
    Label Location
    The location of the label relative to the component.
    Label Font
    The font with which to render the label.
    Label Color
    The color with which to draw the label.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    Allows the label associated with the component to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/io/keyboard.html0000644000175000017500000000742311541757132021237 0ustar vincentvincent Keyboard

    Keyboard

    Library: Input/Output
    Introduced: 2.2.0
    Appearance:

    Behavior

    This component allows the circuit to read keys typed from the keyboard - as long as the keys are representable in the 7-bit ASCII code. After clicking the component using the poke tool, the user can type characters, which accumulate in a buffer. At all times, the ASCII value for the leftmost character in the buffer is sent out the rightmost output. When the clock input is triggered, the leftmost character disappears from the buffer and the new leftmost character is sent on the rightmost output.

    The supported characters for the buffer include all the printable ASCII characters, as well as space, newline, backspace, and control-L. In addition, the left-arrow and right-arrow keys move the cursor within the buffer, and the delete key deletes the character to the right of the cursor (if any).

    The component is asynchronous in the sense that when the buffer is empty and the user types a character, that character is sent immediately as an output, without any wait for a clock pulse.

    Pins

    West edge, marked by a triangle (input, bit width 1)
    Clock - when triggered while the read-enable pin isn't 0, the leftmost character from the buffer is deleted, and the outputs are updated to reflect the buffer's new status.
    South edge, leftmost pin (input, bit width 1)
    Read Enable - when 1 (or floating or error), a clock edge will consume the leftmost character from the buffer. The clock input is ignored when Read Enable is 0.
    South edge, second pin from left (input, bit width 1)
    Clear - when 1, the buffer is emptied and does not accept further characters.
    South edge, second pin from right (output, bit width 1)
    Available - this is 1 when the buffer contains at least one character and 0 when the buffer is empty.
    South edge, rightmost pin (output, bit width 7)
    Data - the 7-bit ASCII code for the leftmost character in the buffer, or 0 if the buffer is empty.

    Attributes

    Buffer Length
    The number of characters that the buffer can hold at once.
    Trigger
    If the value is Rising Edge, then when the clock input changes from 0 to 1, the leftmost character is consumed (when enabled by the Read Enable input). If it is Falling Edge,, then this happens when the clock input changes from 1 to 0.

    Poke Tool Behavior

    Pressing the mouse button into the component gives keyboard focus to the component, and a vertical-bar cursor will be displayed.

    Each character typed will then be inserted into the buffer, as long as the buffer hasn't reached its capacity and the character is one of those that the component supports: the printable characters within the 7-bit ASCII code, as well as space, backspace, newline, and control-L. Additionally, the user may type the left-arrow and right-arrow keys to change the location of the cursor within the buffer, and the user may type the delete key to delete the buffer character (if any) just to the right of the cursor.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/io/joystick.html0000644000175000017500000000455411541757132021300 0ustar vincentvincent Joystick

    Joystick

    Library: Input/Output
    Introduced: 2.2.0
    Appearance:

    Behavior

    The user can drag the red knob within the rounded-square area, and the outputs update to indicate the knob's current x- and y-coordinates. This is meant to emulate the joysticks known from the days of classical arcade games.

    Pins

    West edge, north pin (output, bit width matches Bit Width attribute)
    Indicates knob's x-coordinate, to be interpreted as an unsigned integer whose value will never be 0. Thus, a value of 1 represents the far left, and the maximum value for the bit width indicates the far right. When the knob is at rest (in the center), the value has the bit pattern 10...00.
    West edge, south pin (output, bit width matches Bit Width attribute)
    Indicates knob's y-coordinate, whose value ranges as with the x-coordinate pin. When the knob is pulled to the top, this output's value is 1, and when the knob is pulled to the bottom, the output is the maximum value for the bit width selected.

    Attributes

    When the component is selected or being added, Alt-2 through Alt-5 alter its Bit Width attribute.

    Bit Width
    The number of bits used to indicate each of the knob's coordinates.
    Color
    The knob's color as it is drawn on the screen.

    Poke Tool Behavior

    Pressing the mouse button while within the joystick area moves the knob to that location and updates the outputs. Dragging the mouse continues to move the knob and update the outputs, keeping the knob within the joystick's area. Releasing the mouse button reverts the knob back to its rest position.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/io/index.html0000644000175000017500000000342611541757132020545 0ustar vincentvincent Input/Output Library

    Input/Output library

    The Input/Output library includes components that are meant to correspond to typical components found in electronics for interfacing with a user.

    Button
    Joystick
    Keyboard
    LED
    7-Segment Display
    Hex Digit Display
    LED Matrix
    TTY

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/io/hexdig.html0000644000175000017500000000351311541757132020703 0ustar vincentvincent Hex Digit Display

    Hex Digit Display

    Library: Input/Output
    Introduced: 2.2.0
    Appearance:

    Behavior

    Using a seven-segment display, shows the hexadecimal digit corresponding to the four-bit input. If any of the inputs are not 0/1 (either floating or error), then the display shows a dash ('-'). A separate one-bit input controls the display of the decimal point.

    Pins

    South edge, first from left (input, bit width 4)
    This input is interpreted as an unsigned four-bit number, and the corresponding hexadecimal digit is displayed. If any of the bits are floating or error, then a dash ('-') is displayed.
    South edge, second from left (input, bit width 1)
    Controls the decimal point. If this is left unconnected, the decimal point remains off.

    Attributes

    On Color
    The color with which to draw the display segments and decimal point when they are on.
    Off Color
    The color with which to draw the display segments and decimal point when they are off.
    Background
    The color with which to draw the display's background (transparent by default).

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/io/dotmat.html0000644000175000017500000001016111541757132020720 0ustar vincentvincent LED Matrix

    LED Matrix

    Library: Input/Output
    Introduced: 2.2.0
    Appearance:

    Behavior

    Displays a small grid of pixels, whose values are determined by the current inputs. The grid can have up to 32 rows and 32 columns.

    Pins

    The interface to the component varies depending on the value of the Input Format attribute. It has three possible values.

    Columns
    The inputs are lined along the component's south edge, with one multibit input for each column of the matrix. Each input has as many bits as there are rows in the matrix, with the low-order bit corresponding to the southmost pixel in the column. A 1 indicates to light the corresponding pixel, while a 0 indicates to keep the pixel dim. If any of the bits for a column are either floating or error values, then all pixels in the column are lit.
    Rows
    The inputs are lined along the component's west edge, with one multibit input for each row of the matrix. Each input has as many bits as there are columns in the matrix, with the low-order bit corresponding to the rightmost pixel in the row. As with the Columns format, a 1 indicates to light the corresponding pixel, and a 0 indicates to keep the pixel dim. If any bits for a row are floating or error values, then all pixels in the row are lit.
    Select Rows/Columns
    There are two inputs on the component's west edge. The upper multibit input has as many bits as there are columns in the matrix, with the low-order bit corresponding to the rightmost column. The lower multibit input has as many bits as there are rows in the matrix, with the low-order bit corresponding to the bottom row. If any bits in either input are floating or error values, all pixels in the matrix are lit. Normally, though, a pixel at a particular row-column location is lit if the corresponding column bit in the upper input is 1 and the corresponding row bit in the lower input is 1. For example, for a 5x7 matrix, if the first input is 01010 and the second is 0111010, then the second and fourth columns are lit for the second, third, fourth, and sixth rows; the result appears to be a pair of exclamation points. (This input format may seem unintuitive, but LED matrixes are sold commercially with exactly this interface. Lite-On sells such components, for example.)

    Attributes

    Input Format (read-only after component is created)
    Selects how the pins correspond to pixels, as outlined above.
    Matrix Columns
    Selects how many columns are in the matrix, which may range from 1 up to 32.
    Matrix Rows
    Selects how many rows are in the matrix, which may range from 1 up to 32.
    On Color
    Selects the color of a pixel when it is lit.
    Off Color
    Selects the color of a pixel when it is dim.
    Light Persistence
    When this is other than 0, a pixel that is lit remains lit for the given number of clock ticks after the component's inputs indicate that the pixel should become dim.
    Dot Shape
    The square option means that each pixel is drawn as a 10x10 square, filling the component with no gaps between pixels. The circle option means that each pixel is drawn as a diameter-8 circle, with gaps between each circle. The circle option is more difficult to interpret, but it more closely approximates the off-the-shelf LED matrix components.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/io/button.html0000644000175000017500000000342311541757132020746 0ustar vincentvincent Button

    Button

    Library: Input/Output
    Introduced: 2.1.3
    Appearance:

    Behavior

    Outputs 0 normally; but when the user is pressing the the button using the Poke Tool, the output is 1.

    Pins

    A button has only one pin, a 1-bit output, which is 0 except when the user is pressing the button using the Poke Tool, when it is 1.

    Attributes

    When the component is selected or being added, the arrow keys alter its Facing attribute.

    Facing
    The location of the output pin relative to the component.
    Color
    The color with which to display the button.
    Label
    The text within the label associated with the component.
    Label Location
    The location of the label relative to the component.
    Label Font
    The font with which to render the label.
    Label Color
    The color with which to draw the label.

    Poke Tool Behavior

    When the mouse button is pressed, the component's output will be 1. Upon releasing the mouse button, the output reverts back to 0.

    Text Tool Behavior

    Allows the label associated with the component to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/io/7seg.html0000644000175000017500000000502611541757132020301 0ustar vincentvincent 7-Segment Display

    7-Segment Display

    Library: Input/Output
    Introduced: 2.1.3
    Appearance:

    Behavior

    Displays the values of its eight one-bit inputs. Segments are either colored or light gray depending on the inputs. The correspondence is as follows.

    (Manufacturers vary as to how they map inputs to segments; the correspondence used here is based on Texas Instruments' TIL321.)

    Pins

    North edge, first from left (input, bit width 1)
    Controls the middle horizontal segment.
    North edge, second from left (input, bit width 1)
    Controls the upper vertical segment on the left side.
    North edge, third from left (input, bit width 1)
    Controls the upper horizontal segment.
    North edge, fourth from left (input, bit width 1)
    Controls the upper vertical segment on the right side.
    South edge, first from left (input, bit width 1)
    Controls the lower vertical segment on the left side.
    South edge, second from left (input, bit width 1)
    Controls the bottom horizontal segment.
    South edge, third from left (input, bit width 1)
    Controls the lower vertical segment on the right side.
    South edge, fourth from left (input, bit width 1)
    Controls the decimal point.

    Attributes

    On Color
    The color with which to draw the display segments and decimal point when they are on.
    Off Color
    The color with which to draw the display segments and decimal point when they are off.
    Background
    The color with which to draw the display's background (transparent by default).
    Active On High?
    If yes, then the segments light when the corresponding input is 1. If no, they light when the corresponding input is 0.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/index.html0000644000175000017500000003175011541757130020135 0ustar vincentvincent Library Reference

    Library Reference

    A Logisim library holds a set of tools that allow you to interact with a circuit via clicking and dragging the mouse in the canvas area. Most often, a tool is intended for adding components of a particular type into a circuit; but some of the most important tools, such as the Poke Tool and the Select Tool, allow you to interact with components in other ways.

    All of the tools included in Logisim's built-in libraries are documented in this reference material.

    Wiring library
    Splitter
    Pin
    Probe
    Tunnel
    Pull Resistor
    Clock
    Constant
    Power/Ground
    Transistor
    Transmission Gate
    Bit Extender

    Gates library

    NOT Gate
    Buffer

    AND/OR/NAND/NOR Gate

    XOR/XNOR/Odd Parity/Even Parity Gate
    Controlled Buffer/Inverter

    Plexers library
    Multiplexer
    Demultiplexer
    Decoder
    Priority Encoder
    Bit Selector

    Arithmetic library
    Adder
    Subtractor
    Multiplier
    Divider
    Negator
    Comparator
    Shifter
    Bit Adder
    Bit Finder

    Memory library
    D/T/J-K/S-R Flip-Flop
    Register
    Counter
    Shift Register
    Random
    RAM
    ROM

    Input/Output library
    Button
    Joystick
    Keyboard
    LED
    7-Segment Display
    Hex Digit Display
    LED Matrix
    TTY

    Base library
    Poke Tool
    Edit Tool
    Select Tool
    Wiring Tool
    Text Tool
    Menu Tool
    Label
    logisim-2.7.1/doc/en/html/libs/gates/0000755000175000017500000000000011541757132017237 5ustar vincentvincentlogisim-2.7.1/doc/en/html/libs/gates/xor.html0000644000175000017500000001751411541757132020745 0ustar vincentvincent XOR/XNOR/Odd Parity/Even Parity Gate

    XOR/XNOR/Odd Parity/Even Parity Gate

    Library: Gates
    Introduced: 2.0 Beta 1 for XOR/Odd/Even; 2.0 Beta 6 for XNOR
    Appearance:
    XOR XNOR Odd
    Parity
    Even
    Parity
    Shaped:
    Rectangular:

    Behavior

    The XOR, XNOR, Even Parity, and Odd Parity gates each compute the respective function of the inputs, and emit the result on the output.

    By default, any inputs that are left unconnected are ignored — that's if the input truly has nothing attached to it, not even a wire. In this way, you can insert a 5-input gate but only attach two inputs, and it will work as a 2-input gate; this relieves you from having to worry about configuring the number of inputs every time you create a gate. (If all inputs are unconnected, the output is the error value X.) Some users, though, prefer that Logisim insist that all inputs be connected, since this is what corresponds to real-world gates. You can enable this behavior by going to the Project > Options… menu item, selecting the Simulation tab, and selecting Error for undefined inputs for Gate Output When Undefined.

    The two-input truth table for the gates is the following.

    xyXOR XNOROddEven
    00 01 01
    01 10 10
    10 10 10
    11 01 01

    As you can see, the Odd Parity gate and the XOR gate behave identically with two inputs; similarly, the even parity gate and the XNOR gate behave identically. But if there are more than two specified inputs, the XOR gate will emit 1 only when there is exactly one 1 input, whereas the Odd Parity gate will emit 1 if there are an odd number of 1 inputs. The XNOR gate will emit 1 only when there is not exactly one 1 input, while the Even Parity gate will emit 1 if there are an even number of 1 inputs. The XOR and XNOR gates include an attribute titled Multiple-Input Behavior that allow them to be configured to use the Odd Parity and Even Parity behavior.

    If any of the inputs are the error value (e.g., if conflicting values are coming into the same wire) or floating, then the output will be the error value.

    The multi-bit versions of each gate will perform its one-bit transformation bitwise on its inputs.

    Note: Many authorities contend that the shaped XOR gate's behavior should correspond to the odd parity gate, but there is not agreement on this point. Logisim's default behavior for XOR gates is based on the IEEE 91 standard. It is also consistent with the intuitive meaning underlying the term exclusive or: A waiter asking whether you want a side dish of mashed potatoes, carrots, peas, or cole slaw will only accept one choice, not three, whatever some authorities may tell you. (I must admit, though, that I have not subjected this statement to a rigorous test.) You can configure the XOR and XNOR gates to use parity by changing its Multiple-Input Behavior attribute.

    Pins (assuming component faces east)

    West edge (inputs, bit width according to Data Bits attribute)

    The inputs into the component. There will be as many of these as specified in the Number of Inputs attribute.

    Note that if you are using shaped gates, the west side of XOR and XNOR gates will be curved. Nonetheless, the input pins are in a line. Logisim will draw short stubs illustrating this; and if you overshoot a stub, it will silently assume that you did not mean to overshoot it. In "printer view", these stubs will not be drawn unless they are connected to wires.

    East edge (output, bit width according to Data Bits attribute)

    The gate's output, whose value is computed based on the current inputs as described above.

    Attributes

    When the component is selected or being added, the digits '0' through '9' alter its Number of Inputs attribute, Alt-0 through Alt-9 alter its Data Bits attribute, and the arrow keys alter its Facing attribute.

    Facing
    The direction of the component (its output relative to its inputs).
    Data Bits
    The bit width of the component's inputs and outputs.
    Gate Size
    Determines whether to draw a wider or narrower version of the component. This does not affect the number of inputs, which is specified by the Number of Inputs attribute; however, if the number of inputs exceeds 3 (for a narrow component) or 5 (for a wide component), then the gate will be drawn with "wings" to be able to accommodate the number of inputs requested.
    Number of Inputs
    Determines how many pins to have for the component on its west side.
    Output Value
    Indicates how false and true results should be translated into output values. By default, false is indicated by a low voltage (0) and true by a high voltage (1), but one or the other can be replaced by a high-impedance (floating) value instead. This allows wired-or and wired-and connections, as illustrated in the AND/OR/NAND/NOR Gate documentation.
    Label
    The text within the label associated with the gate.
    Label Font
    The font with which to render the label.
    Multiple-Input Behavior (XOR and XNOR only)
    When three or more inputs are provided, the XOR/XNOR gate's output will either be based on whether exactly one input is 1 (the default) or an odd number of inputs are 1.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    Allows the label associated with the gate to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/gates/not.html0000644000175000017500000000576111541757132020736 0ustar vincentvincent NOT Gate

    NOT Gate

    Library: Gates
    Introduced: 2.0 Beta 1
    Appearance:
    Shaped:
    Rectangular:

    Behavior

    The NOT Gate emits the complement of whatever input it receives. The truth table for a NOT gate is the following.

    xout
    01
    10

    If the input is unspecified (i.e., floating), then the output will also be unspecified - unless the "Gate Output When Undefined" option is "Error for undefined inputs," in which case the output is an error. If the input is an error value, then the output will also be.

    A multi-bit NOT gate will perform the above transformation bitwise on its input.

    Pins (assuming component faces east)

    West edge (input, bit width according to Data Bits attribute)
    The component's input.
    East edge (output, bit width according to Data Bits attribute)
    The output, whose value is the complement of the input value.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute and the arrow keys alter its Facing attribute.

    Facing
    The direction of the component (its output relative to its input).
    Data Bits
    The bit width of the component's input and output.
    Gate Size
    Determines whether to draw a larger or a smaller version of the component.
    Output Value
    Indicates how false and true results should be translated into output values. By default, false is indicated by a low voltage (0) and true by a high voltage (1), but one or the other can be replaced by a high-impedance (floating) value instead. This allows wired-or and wired-and connections, as illustrated in the AND/OR/NAND/NOR Gate documentation.
    Label
    The text within the label associated with the gate.
    Label Font
    The font with which to render the label.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    Allows the label associated with the gate to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/gates/index.html0000644000175000017500000000525611541757132021244 0ustar vincentvincent Gates Library

    Gates library

    The Gates library includes a variety of simple components, all of which have a single output whose value is dictated entirely by the current inputs.


    NOT Gate
    Buffer

    AND/OR/NAND/NOR Gate

    XOR/XNOR/Odd Parity/Even Parity Gate
    Controlled Buffer/Inverter

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/gates/controlled.html0000644000175000017500000000674411541757132022305 0ustar vincentvincent Controlled Buffer/Inverter

    Controlled Buffer/Inverter

    Library: Gates
    Introduced: 2.0 Beta 1
    Appearance:

    Behavior

    The controlled buffer and inverter, often called three-state buffers/inverters, each have a one-bit "control" input pin on the south side. The value at this control pin affects how the component behaves:

    • When the value on this pin is 1, then the component behaves just like the respective component (a buffer or a inverter (NOT gate)).
    • When the value is 0 or unknown (i.e., floating), then the component's output is also floating.
    • When the value is an error value (such as would occur when two conflicting values are being fed into the input), then the output is an error value.

    Controlled buffers can be useful when you have a wire (often called a bus) whose value should match the output of one of several components. By placing a controlled buffer between each component output and the bus, you can control whether that component's output is fed onto the bus or not.

    Pins (assuming component faces east, control line right-handed)

    West edge (input, bit width matches Data Bits attribute)
    The component input that will be used to compute the output if the control input is 1.
    South edge (input, bit width 1)
    The component's control input.
    East edge (output, bit width matches Data Bits attribute)
    The component's output, which will be floating if the control input is 0 or floating, the error value if the control input is the error value, and will be computed based on the west-side input if the control input is 1.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute and the arrow keys alter its Facing attribute.

    Facing
    The direction of the component (its output relative to its input).
    Data Bits
    The bit width of the component's inputs and outputs.
    Gate Size
    (Controlled inverter only) Determines whether to draw a larger or a smaller version of the component.
    Control Line Location
    The location of the control line, imagining we are facing the output from the input: If the component faces east and is right-handed, the control line is to the south; but if it is left-handed, the control line is to the north.
    Label
    The text within the label associated with the gate.
    Label Font
    The font with which to render the label.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    Allows the label associated with the gate to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/gates/buffer.html0000644000175000017500000000600111541757132021373 0ustar vincentvincent Buffer

    Buffer

    Library: Gates
    Introduced: 2.0 Beta 1
    Appearance:

    Behavior

    The buffer simply passes through to its right output whatever input it receives on the left side. The truth table for a one-bit buffer is the following.

    xout
    00
    11

    If the input is unspecified (i.e., floating), then the output will also be unspecified - unless the "Gate Output When Undefined" option is "Error for undefined inputs," in which case the output is an error. If the input is an error value, then the output will also be.

    Buffers are the most useless of the gate components provided in Logisim; its presence in the Gates library is just as much a matter of completeness (a component for each possible one-input truth table) as it is a matter of providing useful functionality. Still, it can be occasionally useful to ensure that values propagate in only one direction along a wire.

    Pins (assuming component faces east)

    West edge (input, bit width according to Data Bits attribute)
    The input into the component.
    East edge (output, bit width according to Data Bits attribute)
    The output, which always matches the input into the left side.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute and the arrow keys alter its Facing attribute.

    Facing
    The direction of the component (its output relative to its input).
    Data Bits
    The bit width of the component's inputs and outputs.
    Output Value
    Indicates how false and true results should be translated into output values. By default, false is indicated by a low voltage (0) and true by a high voltage (1), but one or the other can be replaced by a high-impedance (floating) value instead. This allows wired-or and wired-and connections, as illustrated in the AND/OR/NAND/NOR Gate documentation.
    Label
    The text within the label associated with the gate.
    Label Font
    The font with which to render the label.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    Allows the label associated with the gate to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/gates/basic.html0000644000175000017500000002055611541757132021216 0ustar vincentvincent AND/OR/NAND/NOR Gate

    AND/OR/NAND/NOR Gate

    Library: Gates
    Introduced: 2.0 Beta 1
    Appearance:
    AND OR NAND NOR
    Shaped:
    Rectangular:
    DIN 40700:

    Behavior

    The AND, OR, NAND, and NOT gates each compute the respective function of the inputs, and emit the result on the output.

    By default, any inputs that are left unconnected are ignored — that's if the input truly has nothing attached to it, not even a wire. In this way, you can insert a 5-input gate but only attach two inputs, and it will work as a 2-input gate; this relieves you from having to worry about configuring the number of inputs every time you create a gate. (If all inputs are unconnected, the output is the error value X.) Some users, though, prefer that Logisim insist that all inputs be connected, since this is what corresponds to real-world gates. You can enable this behavior by going to the Project > Options… menu item, selecting the Simulation tab, and selecting Error for undefined inputs for Gate Output When Undefined.

    The two-input truth table for the gates is the following. (The letter X represents the error value, and the letter Z represents the floating value.)

    AND
    01X/Z
    0000
    101X
    X/Z0XX
       
    OR
    01X/Z
    001X
    1111
    X/ZX1X
    NAND
    01X/Z
    0111
    110X
    X/Z1XX
       
    NOR
    01X/Z
    010X
    1000
    X/ZX0X

    In short, these components work as expected as long as all inputs are either 0 or 1. If an input is neither 0 nor 1 (it is floating or it is the error value) then the component treats it as both 0 and 1: If the output would be the same both ways (as when an AND gate has one input that is definitely 0 and a questionable second input), that will be the output value; but if the output changes depending on whether it is 0 or 1, the output is the error value.

    The multi-bit versions of each gate will perform its one-bit transformation bitwise on its inputs.

    Pins (assuming component faces east)

    West edge (inputs, bit width according to Data Bits attribute)

    The inputs into the component. There will be as many of these as specified in the Number of Inputs attribute.

    Note that if you are using shaped gates, the west side of OR and NOR gates will be curved. Nonetheless, the input pins are in a line. Logisim will draw short stubs illustrating this; and if you overshoot a stub, it will silently assume that you did not mean to overshoot it. In "printer view", these stubs will not be drawn unless they are connected to wires.

    East edge (output, bit width according to Data Bits attribute)

    The gate's output, whose value is computed based on the current inputs as described above.

    Attributes

    When the component is selected or being added, the digits '0' through '9' alter its Number of Inputs attribute, Alt-0 through Alt-9 alter its Data Bits attribute, and the arrow keys alter its Facing attribute.

    Facing
    The direction of the component (its output relative to its inputs).
    Data Bits
    The bit width of the component's inputs and outputs.
    Gate Size
    Determines whether to draw a wider or narrower version of the component. This does not affect the number of inputs, which is specified by the Number of Inputs attribute. However, if shaped gates are selected, then the gate will be drawn with wings to accommodate additional inputs beyond what the shape naturally accommodates.
    Number of Inputs
    Determines how many pins to have for the component on its west side.
    Output Value
    Indicates how false and true results should be translated into output values. By default, false is indicated by a low voltage (0) and true by a high voltage (1), but one or the other can be replaced by a high-impedance (floating) value instead. This allows wired-or and wired-and connections, as illustrated below: At left, the buffers' Output Value attribute is floating/1 and the resistor pulls to 0, giving wired-or behavior; at right, the buffers' Output Value attribute is 0/floating and the resistor pulls to 1, giving wired-and behavior.
    Label
    The text within the label associated with the gate.
    Label Font
    The font with which to render the label.
    Negate x
    If yes, the input is negated before it is fed into the gate. The inputs are counted top-down if the facing is east or west, and they are counted left-to-right if the facing is north or south.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    Allows the label associated with the gate to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/base/0000755000175000017500000000000011541757132017046 5ustar vincentvincentlogisim-2.7.1/doc/en/html/libs/base/wiring.html0000644000175000017500000000665711541757132021251 0ustar vincentvincent Wiring Tool

    Wiring Tool

    Library: Base
    Introduced: 2.0 Beta 1

    Behavior

    The wiring tool is the tool for creating wire segments that carry values from one endpoint to another. The bit width of these values can be anything; exactly which bit width is automatically inferred from the components to which the wires are ultimately attached. If it is not attached to any components, the wire will be drawn gray to indicate that its bit width is unknown; if the components at the locations that the wire helps to connect disagree on the bit width, then the wire will be drawn orange to indicate the conflict, and the wire will in fact refuse to carry any values at all until the user resolves the conflict.

    A single drag of the mouse can create multiple wire segments. The precise process is a little confusing in its description; but it works quite intuitively in practice: If you request a particular wire segment using the Wiring Tool, that segment will be split apart wherever it hits a pin for an existing component, or wherever it hits the endpoint of an existing wire segment. Also, if an endpoint of any of the new wire segments hit somewhere in the middle of an existing wire, then that wire will be split into multiple segments itself.

    For some components that draw short stubs to which wires can connect (such as an OR gate or a controlled buffer), Logisim will silently correct attempts to create wires that slightly overshoot the stub's end.

    You can also shorten an existing wire segment using the Wiring Tool, using a drag that starts or ends at a terminus of the segment, and that overlaps the existing segment.

    All wires in Logisim are either horizontal or vertical.

    Wires are also non-directional; that is, they carry values from either endpoint to the other. Indeed, a wire can carry values in both directions simultaneously; the center wire in the below example is doing this.

    Attributes

    The wiring tool does not itself have attributes, but the wires that it creates do.

    Direction
    Indicates whether the wire is horizontal or vertical. The value of this attribute cannot be changed.
    Length
    Indicates how many pixels long the wire is. The value of this attribute cannot be changed.

    Poke Tool Behavior

    When you click an existing wire segment using the Poke Tool, Logisim displays the current value traveling through that wire. The behavior is particularly useful for multi-bit wires, whose black color provide no visual feedback about what value the wire is carrying.

    For multi-bit values, you can configure exactly how the value is displayed (in binary, decimal, or hexadecimal, for example) using the Layout pane of the Logisim Preferences dialog box.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/base/text.html0000644000175000017500000000466411541757132020732 0ustar vincentvincent Text Tool

    Text Tool

    Library: Base
    Introduced: 2.0 Beta 1

    Behavior

    The text tool allows you to create and edit labels associated with components. Which components support labels are indicated in the 'Text Tool Behavior' section of their documentation. As of the current release, the following components in the built-in libraries support labels.

    Base library Pin
    Clock
    Label
    Probe
    Memory library D/T/JK/SR Flip-Flop
    Register
    Counter
    Shift Register
    Random
    Input/Output library Button
    LED

    For components that can take a label but have none assigned to it currently, you can click anywhere within the component to add a label. If there is already a label, you need to click within the label. If you click at a point where there is not currently a label to be edited, Logisim will initiate the addition of a new Label component.

    In the current version of Logisim, text editing features are still fairly primitive. Selections of a region of text within a label is impossible. There is no way to insert a line break into a label.

    Attributes

    The attributes for the tool are the same as for the label component. These attributes have no effect when editing the label on an existing component, but they are imparted to any labels created using the text tool.

    Clicking on a component supporting the Text Tool will display that component's attributes.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/base/select.html0000644000175000017500000001026111541757132021213 0ustar vincentvincent Select Tool

    Select Tool

    Library: Base
    Introduced: 2.0 Beta 1

    Behavior

    Allows individual components to be placed into the current selection. There are a number of actions possible with this tool.

    • Pressing the mouse button while it is within a currently selected component begins a drag moving all components of the selection.

      By default, Logisim will compute a way to add new wires so that no existing connections are lost during the move. (Sometimes it will delete or shorten existing wires.) If you're performing a move where you do not want these changes to be made, you can press the shift key during the move. If you want to disable this behavior entirely, go to Project > Options, select the Canvas tab, and uncheck the Keep Connections When Moving box; in this case, the connections are computed only when the shift key is down.

      Dragging a selection can lead to unexpected behavior from wires: If you drag a selection including some wires on top of some other wires, all wires are merged, and the merged wires are placed into the selection. As a result, if you drag the selection a second time, the wires previously at the location will not be left behind. This behavior is necessary to keep with the expected behavior of wires in Logisim. And it does not normally constitute a major problem: Logisim will draw the full selection in the midst of dropping, and you should not drop it until you are sure it is in the correct location.

    • Otherwise, clicking the mouse within a component drops all components from the current selection and selects instead the component(s) containing the clicked location.

    • Shift-clicking the mouse within a component toggles that component's presence within the selection. If multiple components include the same location, all components' presence will be toggled. None of this will happen, though, if shift-clicking is mapped to another tool instead (via the project options window's Mouse tab).

    • Dragging the mouse starting at a location not contained within any components drops all components from the current selection and initiates a rectangular selection. All component(s) contained by the rectangle will be placed into the selection.

    • Shift-dragging the mouse starting at a location not contained within any components initiates a rectangular selection. The presence in the selection of all component(s) contained by the rectangle will be toggled. This will not happen, though, if shift-clicking is mapped to another tool instead.

    After selecting the desired items in the selection, you can of course cut/copy/paste/delete all the items via the Edit menu.

    Logisim's behavior when pasting the clipboard into a circuit is somewhat peculiar: It will not immediately place the components into the circuit; instead, the selection will be a collection of "ghosts," which will be dropped into the circuit as soon as they are either dragged to another location or removed from the selection. (This peculiar behavior is necessary because pasting will otherwise merge the wires of the selection into the current circuit at once, and the wires there previously will be dragged with the pasted clipboard if the user wants to move the pasted components somewhere else.)

    Attributes

    None. Selecting a component, though, will display its attributes. With multiple components selected, attributes shared by all are shown, blank if they have different values and otherwise with the value they all have in common. (Wires are ignored if there are any non-wires in the selection.) Changes to the attribute value affect all selected components.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/base/poke.html0000644000175000017500000000355611541757132020703 0ustar vincentvincent Poke Tool

    Poke Tool

    Library: Base
    Introduced: 2.0 Beta 1

    Behavior

    The Poke Tool is for manipulating the current values associated with components. The precise behavior of the Poke Tool varies depending on which component is clicked; this behavior is documented in the `Poke Tool Behavior' section of each individual component. The following components all have support for the Poke Tool.

    Base library Pin
    Clock
    Memory library D/T/J-K/S-R Flip-Flop
    Register
    Counter
    Shift Register
    RAM
    ROM
    Input/Output library Button
    Joystick
    Keyboard

    Also, clicking a wire segment using the Poke tool displays the value currently carried by the wire, as described on the Wiring Tool's page.

    Attributes

    None. Clicking on a component supporting the Poke Tool, though, will display that component's attributes.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/base/menu.html0000644000175000017500000000375511541757132020712 0ustar vincentvincent Menu Tool

    Menu Tool

    Library: Base
    Introduced: 2.0 Beta 1

    Behavior

    The menu tool permits the user to pull up a pop-up menu for components that already exist. By default, right-clicking or control-clicking a component will bring up this pop-up menu; however, the Mouse tab of the project options allows a user to configure the mouse buttons to work differently.

    The pop-up menu for most components has two items.

    • Delete: Removes the component from the circuit.
    • Show Attributes: Places the component's attributes into the window's attribute table, so that the attribute values can be viewed and changed.

    For some components, however, the menu has additional items. Subcircuits (that is, instances of using one circuit as a "black box" within another) are one example of this: In addition to the above two items, the pop-up menu includes another item.

    • View XXX: Changes the circuit layout being viewed and edited to be the subcircuit's layout instead. The values seen in the layout will be part of the same hierarchy as those of the supercircuit. (See the `Debugging subcircuits' section of the User's Guide.)

    Other components may extend the pop-up menu also. In the built-in libraries of the current version of Logisim, the only such components are RAM and ROM.

    Attributes

    None.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/base/label.html0000644000175000017500000000521411541757132021015 0ustar vincentvincent Label

    Label

    Library: Base
    Introduced: 2.0 Beta 1
    Appearance:

    Behavior

    This is a simple text label that can be placed anywhere in the circuit. It does not interact with values traveling through the circuit in any way, except inasmuch as it will be visible when the circuit is drawn.

    In contrast to all other components in the current built-in libraries, label components can be placed anywhere on the canvas; they do not snap to the grid.

    Pins

    None.

    Attributes

    Text
    The text appearing in the label. This value can be edited in the attribute table or, using the text tool, on the canvas.
    Font
    The font to use when drawing the label.
    Horizontal Alignment
    The horizontal positioning technique for the text relative to the label's official location (where the mouse was clicked in creating the label). "Left" means that the text should be drawn so that its left edge is at the location; "right" means that the text should be drawn so that its right edge is at the location; and "center" means that the text should be drawn so that its center (horizontally) is at the location.
    Vertical Alignment

    The vertical positioning technique for the text relative to the label's official location (where the mouse was clicked in creating the label). "Base" means that the baseline should intersect the location; "Top" means that the text's top should intersect the location; "Bottom" means that the text's bottom should intersect the location; and "Center" means that the text should be centered (vertically) at the location.

    The text's top and bottom is computed based on the font's standard ascent and descent values; thus, even if the actual text contains no tall letters (such as b) or descending letters (such as g), it is assumed to contain such letters for the purposes of vertical positioning.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    Allows the text appearing within the label to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/base/index.html0000644000175000017500000000272211541757132021046 0ustar vincentvincent Base Library

    Base library

    The Base library includes general-purpose tools.

    Poke Tool
    Edit Tool
    Select Tool
    Wiring Tool
    Text Tool
    Menu Tool
    Label

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/base/edit.html0000644000175000017500000001702111541757132020662 0ustar vincentvincent Edit Tool

    Edit Tool

    Library: Base
    Introduced: 2.3.0

    Behavior

    The Edit tool allows the user to rearrange existing components and to add wires. Exactly what the tool does depends on where the user presses the mouse on the canvas.

    • When the mouse is over a wiring point for an existing component, or if it is atop a current wire, the Edit Tool will display a small green circle around the mouse's location. Pressing the button there initiates the addition of a new wire. But if the user doesn't drag the mouse far enough to initiate a wire before releasing the button, the press is treated as a mouse click, and so the wire is simply added into the current selection.

      The bit width of an added wire is inferred from the components to which it is connected. If it is not attached to any components, the wire will be drawn gray to indicate that its bit width is unknown; if the components at the locations that the wire helps to connect disagree on the bit width, then the wire will be drawn orange to indicate the conflict, and the wire will in fact refuse to carry any values at all until the user resolves the conflict.

      All wires in Logisim are either horizontal or vertical, never diagonal.

      Wires are non-directional; that is, they carry values from either endpoint to the other. Indeed, a wire can carry values in both directions simultaneously: In the below example, a bit flows from the upper input at left through the center wire, then it circles back through the center wire, and then it circles forward again through the center wire before reaching the output at lower right.

      A single drag of the mouse can create multiple wire segments. The precise process is a little confusing in its description; but it works quite intuitively in practice: If you request a particular wire segment using the Wiring Tool, that segment will be split apart wherever it hits a pin for an existing component, or wherever it hits the endpoint of an existing wire segment. Also, if an endpoint of any of the new wire segments hit somewhere in the middle of an existing wire, then that wire will be split into multiple segments itself.

      You can also shorten or delete an existing wire segment by initiating a drag at the terminus of the segment and then drawing backwards across the segment. During the drag, the shortening is indicated by drawing a white line over of the portion of the wire that will be removed.

      Some components draw short stubs to which wires can connect, such as the OR gate and controlled buffer. Logisim will silently correct attempts to create wires that slightly overshoot the stub's end.

    • If, however, the user presses the Alt key at a point in the middle of the wire, then the green circle will disappear. A mouse press selects the wire, and a mouse drag moves it.

    • Pressing the mouse button while it is within a currently selected component begins a drag moving all elements of the selection.

      By default, Logisim will compute a way to add new wires so that no existing connections are lost during the move. (Sometimes it will delete or shorten existing wires.) If you're performing a move where you do not want these changes to be made, you can press the shift key during the move. If you want to disable this behavior entirely, go to Project > Options, select the Canvas tab, and uncheck the Keep Connections When Moving box; in this case, the connections are computed only when the shift key is down.

      Dragging a selection can lead to unexpected behavior from wires: If you drag a selection including some wires on top of some other wires, all wires are merged, and the merged wires are placed into the selection. As a result, if you drag the selection a second time, the wires previously at the location will not be left behind. This behavior is necessary to keep with the intuitive behavior of wires in Logisim, where wires never overlap. And it does not normally constitute a major problem: Logisim will draw the full selection in the midst of dropping, and you should not drop it until you are sure it is in the correct location.

    • Pressing the mouse within an unselected component (but not at one of the component's wiring points) drops all components from the current selection and selects instead the component(s) containing the clicked location.

    • Shift-clicking the mouse within a component toggles that component's presence within the selection. If multiple components include the same location, all components' presence will be toggled.

    • Dragging the mouse starting at a location not contained within any components drops all components from the current selection and initiates a rectangular selection. All component(s) contained by the rectangle will be placed into the selection.

    • Shift-dragging the mouse starting at a location not contained within any components initiates a rectangular selection. The presence in the selection of all component(s) contained by the rectangle will be toggled.

    • However, if the Alt key is pressed at a location not contained within any components, this initiates the addition of a new wire. A small green circle is drawn in such a circumstance to indicate this.

    After selecting the desired items in the selection, you can of course cut/copy/paste/delete/duplicate all the items via the Edit menu.

    Some keys have an effect with the Edit Tool.

    • The arrow keys change the Facing attribute for all components in the selection that have such an attribute.

    • The Delete and Backspace keys will delete everything in the selection from the circuit.

    • The Insert and MenuKey-D keys will create a duplicate of the currently selected components.

    Logisim's behavior when duplicating a selection or pasting the clipboard into a circuit is somewhat peculiar: It will not immediately place the components into the circuit; instead, the selection will be a collection of "ghosts," which will be dropped into the circuit as soon as they are either dragged to another location or removed from the selection. (This peculiar behavior is necessary because pasting will otherwise merge the wires of the selection into the current circuit at once, and the wires there previously will be dragged with the pasted clipboard if the user wants to move the pasted components somewhere else.)

    Attributes

    None. Selecting a component, though, will display its attributes. With multiple components selected, attributes shared by all are shown, blank if they have different values and otherwise with the value they all have in common. (Wires are ignored if there are any non-wires in the selection.) Changes to the attribute value affect all selected components.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/arith/0000755000175000017500000000000011541757132017243 5ustar vincentvincentlogisim-2.7.1/doc/en/html/libs/arith/subtractor.html0000644000175000017500000000621411541757132022324 0ustar vincentvincent Subtractor

    Subtractor

    Library: Arithmetic
    Introduced: 2.0 Beta 11
    Appearance:

    Behavior

    This component subtracts values coming in via the west inputs (the upper minus the lower) and outputs the difference on the east output. The component is designed so that it can be cascaded with other subtractors to provide subtract more bits than is possible with a single subtractor: The borrow-in input provides a one-bit value to be borrowed out of the difference (if the borrow-in input is specified), and a borrow-out output indicates whether the component needs to borrow an upper-order bit to complete the subtraction without underflow (assuming unsigned subtraction).

    Internally, the subtractor simply performs a bitwise NOT on the subtrahend, and add this to the minuend along with the NOT of the borrow-in input. (The minuend is the first operand (upper input) to the subtraction, and the subtrahend is the second (lower input). I happen to like the antiquated terms.)

    If either of the operands contains some floating bits or some error bits, then the component will perform a partial subtraction. That is, it will compute as many low-order bits as possible. But above the floating or error bit, the result will have floating or error bits.

    Pins

    West edge, north end (input, bit width matches Data Bits attribute)
    The minuend of the subtraction; that is, the number from which to subtract.
    West edge, south end (input, bit width matches Data Bits attribute)
    The subtrahend of the subtraction; that is, the number to subtract from the minuend.
    North edge, labeled b in (input, bit width 1)
    If 1, then 1 is borrowed out of the difference. If the value is unknown (i.e., floating), then it is assumed to be 0.
    East edge (output, bit width matches Data Bits attribute)
    The lower dataBits bits of the difference of the two values coming in the west edge, minus the bin bit.
    South edge, labeled b out (output, bit width 1)
    The borrow bit computed for the difference. If the values subtracted as unsigned values yield a negative value, then this bit will be 1; otherwise, it will be 0.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the values to be subtracted and of the result.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/arith/shifter.html0000644000175000017500000000705611541757132021605 0ustar vincentvincent Shifter

    Shifter

    Library: Arithmetic
    Introduced: 2.3.0
    Appearance:

    Behavior

    This component includes two inputs, data and dist, and it has one output, which is the result of shifting data by dist places. Both data and output have the same number of bits in them. The component supports the following shift types:

    • Logical Left: All bits in data are shifted up dist places, with the bottom dist places filled with 0's. For example, 11001011 logically shifted left twice is 00101100. (The top two ones are lost.)
    • Logical Right: All bits in data are shifted down dist places, with the upper dist places filled with 0's. For example, 11001011 logically shifted right twice is 00110010. (The bottom two ones are lost.)
    • Arithmetic Right: All bits in data are shifted down dist places, with the upper dist places filled with repetitions of whatever the uppermost bit in data. For example, 11001011 arithmetically shifted right twice is 11110010.
    • Rotate Left: All bits in data are shifted up dist places, with the top dist places wrapped around into the bottom. For example, 11001011 rotated left twice is 00101111.
    • Rotate Right: All bits in data are shifted down dist places, with the bottom dist places wrapped around into the top. For example, 11001011 rotated right twice is 11110010.

    Note that if dist contains any floating or error inputs, then the output is composed entirely of error values, since there is no way to guess how far to shift the input.

    Pins

    West edge, north end (input, bit width matches the Data Bits attribute)
    The value to be shifted.
    West edge, south end (input, bit width is computed as below)
    The number of bits by which to shift the data input. This input should have as many bits as is the minimum number to indicate any shift distance from 0 up to one less than Data Bits; that is, it should be the ceiling of the base-2 logarithm of Data Bits. For example, if Data Bits were 8, this input would require 3 bits; but if it were 9, it would require 4 bits.
    East edge (output, bit width matches the Data Bits attribute)
    The result of shifting the input value by the input distance.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the data input and of the output.
    Shift Type
    One of the five possible shift types as outlined above (Logical Left, Logical Right, Arithmetic Right, Rotate Left, Rotate Right).

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/arith/negator.html0000644000175000017500000000331711541757132021574 0ustar vincentvincent Negator

    Negator

    Library: Arithmetic
    Introduced: 2.0 Beta 22
    Appearance:

    Behavior

    Computes the two's-complement negation of the input. This negation is performed by maintaining all the lower-order bits up to the lowest-order 1, and complementing all bits above that.

    If the value to be negated happens to be the least negative value, then its negation (which cannot be represented in two's-complement form), is still the least negative value.

    Pins

    West edge (input, bit width matches Data Bits attribute)
    The value to negate.
    East edge, labeled -x (output, bit width matches Data Bits attribute)
    The negation of the input. If the input happens to be the least negative value representable in dataBits bits, however, then the output matches the input.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the component's input and output.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/arith/multiplier.html0000644000175000017500000000542411541757132022324 0ustar vincentvincent Multiplier

    Multiplier

    Library: Arithmetic
    Introduced: 2.0 Beta 20
    Appearance:

    Behavior

    This component multiplies two values coming in via the west inputs and outputs the product on the east output. The component is designed so that it can be cascaded with other multipliers to multiply a multiplicand with more bits than is possible with a single multiplier: The carry-in input provides a multi-bit value to be added into the product (if it is specified), and a carry-out output provides the upper half of the product result, which can be fed into another multiplier.

    If the multiplicand, the multiplier, or the carry-in input contain some floating bits or some error bits, then the component will perform a partial multiplication. That is, it will compute as many low-order bits as possible. But above the floating or error bit, the result will have floating or error bits. Note that if the carry-in input is completely floating, then it will be assumed to be all-zeroes.

    Pins

    West edge, north end (input, bit width matches Data Bits attribute)
    The multiplicand (that is, the first of the two numbers to multiply).
    West edge, south end (input, bit width matches Data Bits attribute)
    The multiplier (that is, the second of the two numbers to multiply).
    North edge, labeled c in (input, bit width matches Data Bits attribute)
    A carry value to add into the product. If all bits of the value are unknown (i.e., floating), then they are assumed to be 0.
    East edge (output, bit width matches Data Bits attribute)
    The lower dataBits bits of the product of the two values coming in the west edge, plus the cin value.
    South edge, labeled c out (output, bit width matches Data Bits attribute)
    The upper dataBits bits of the product.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the values to be multiplied and of the result.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/arith/index.html0000644000175000017500000000376611541757132021254 0ustar vincentvincent Arithmetic Library

    Arithmetic library

    The Arithmetic library includes combinational components that perform arithmetic operations on unsigned and two's-complement values.

    Adder
    Subtractor
    Multiplier
    Divider
    Negator
    Comparator
    Shifter
    Bit Adder
    Bit Finder

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/arith/divider.html0000644000175000017500000000615611541757130021565 0ustar vincentvincent Divider

    Divider

    Library: Arithmetic
    Introduced: 2.0 Beta 22
    Appearance:

    Behavior

    This component divides two values coming in via the west inputs and outputs the quotient on the east output. The component is designed so that it can be cascaded with other dividers to provide support a dividend with more bits than is possible with a single divider: The upper input provides the upper dataBits bits of the dividend (if it is specified at all), and the rem bits provide the remainder, which can be fed as the upper input into another divider.

    If the divisor is 0, then no division is performed (i.e., the divisor is assumed to be 1).

    The divider essentially performs unsigned division. That is, the remainder will always be between 0 and divisor-1. The quotient will always be an integer so that

    quotient * divisor + remainder = dividend .
    If, however, the quotient does not fit into dataBits bits, then only the lower dataBits bits will be reported. The component does not provide any method for accessing the upper dataBits bits.

    If either of the operands contains some floating bits or some error bits, then the component's outputs will be either entirely floating or entirely error values.

    Pins

    West edge, north end (input, bit width matches Data Bits attribute)
    The lower dataBits bits of the dividend (that is, the first operand for the division).
    West edge, south end (input, bit width matches Data Bits attribute)
    The divisor (that is, the second operand for the division)
    North edge, labeled upper (input, bit width matches Data Bits attribute)
    The upper dataBits bits of the dividend (that is, the first operand for the division).
    East edge (output, bit width matches Data Bits attribute)
    The lower dataBits bits of the quotient, as specified above.
    South edge, labeled rem (output, bit width matches Data Bits attribute)
    The remainder of the division. This value will always be between 0 and divisor-1.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the values to be divided and of the result.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/arith/comparator.html0000644000175000017500000000442611541757130022304 0ustar vincentvincent Comparator

    Comparator

    Library: Arithmetic
    Introduced: 2.0 Beta 22
    Appearance:

    Behavior

    Compares two values, either as unsigned values or as two's-complement values, depending on the Numeric Type attribute. Normally, one of the outputs will be 1, and the other two outputs will be 0.

    The comparison is performed starting at the most significant bits in each number and descending downward in parallel until a location is found where the two values disagree. If, however, an error value or a floating value is encountered during this descent, then all outputs will match that error or floating value.

    Pins

    West edge, north end (input, bit width matches Data Bits attribute)
    The first of the two values to be compared.
    West edge, south end (input, bit width matches Data Bits attribute)
    The second of the two values to be compared.
    East edge, labeled > (output, bit width 1)
    1 if the first input is greater than the second input, 0 if the first input is less than or equal the second input.
    East edge, labeled = (output, bit width 1)
    1 if the first input equals the second input, 0 if the first input is not equal the second input.
    East edge, labeled < (output, bit width 1)
    1 if the first input is less than the second input, 0 if the first input is greater than or equal the second input.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the component's inputs.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/arith/bitfinder.html0000644000175000017500000000734211541757130022103 0ustar vincentvincent Bit Finder

    Bit Finder

    Library: Arithmetic
    Introduced: 2.6.1
    Appearance:

    Behavior

    The component takes a multi-bit input and determines the the index of a bit, where the index is computed by counting from 0 as the lowest-order bit. Exactly which index it computes depends on the Type attribute, as illustrated by the examples in the below table for the 8-bit sample input 11010100.

    TypeOutput for 11010100
    Lowest-order 12
    Highest-order 17
    Lowest-order 00
    Highest-order 05

    For the lowest-order 1, the output is 2 because if you index the bits starting from 0 for the lowest-order bit, the first 1 you will find is at index 2. (The bits at indices 0 and 1 are both 0.) For the highest-order 1, the output is 7 because the topmost 1 bit is at index 7 (again counting from the lowest-order bit as 0).

    The component's output on the south edge indicates whether the desired bit was found at all. In the above examples involving the input 11010100, the south output is 1 in all cases. But if the input were 00000000 and the component is to find the lowest-order 1, then the south output would be 0 — and the output on the east edge would be 0 as well.

    If while searching for the desired value, a value that is neither 0 or 1 is found (the bit could be floating or an error value), then both outputs will consist entirely of error bits. Note that this occurs only if the problematic bit is encountered before finding the desired bit: For the input x1010100, the output would still be 2 if the lowest-order 1 is desired; but we would get error values if the component's type indicates to search for the highest-order 1 or the highest-order 0, since there is an erroneous bit in a higher-order bit than either the highest-order 0 or the highest-order 1.

    Pins

    West edge (input, bit width matches Data Bits attribute)
    The multibit input that is to be searched for the desired bit.
    East edge (output, bit width computed as described below)
    The index of the desired bit, counting from 0 for the lowest-order bit. The bit width is the minimum number of bits to store the maximum possible index, which is one less than the value of the Data Bits attribute.
    South edge (output, bit width 1)
    1 if the desired bit is found, 0 if all input bits are the inverse of the desired bit, and the error value if a non-0, non-1 value is found before the desired bit.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the input.
    Type
    Indicates which bit to search for — the lowest-order 0, the highest-order 0, the lowest-order 1, or the highest-order 1.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/arith/bitadder.html0000644000175000017500000000502411541757130021706 0ustar vincentvincent Bit Adder

    Bit Adder

    Library: Arithmetic
    Introduced: 2.6.0
    Appearance:

    Behavior

    The component determines how many 1 bits are in its input(s) and emits the total number of 1 bits on its output. For example, given the 8-bit input 10011101, the output would be 5, since there are five 1-bits in the input (the first, the last, and a string of three bits in the middle).

    If any of the input bits are floating or error values, then the output will contain error bits in the output corresponding to the range of possible outputs depending on whether those floating/error values are counted as zeroes or ones. For instance, if the 14-bit input is 111x10110x1101, then the output must be at least 9 (if the x's are interpreted as zeroes) and at most 11 (if they are interpreted as ones). Thus, the output will be 10EE: The upper two bits will be 1 and 0 since all integers between 9 and 11 have 1 and 0 as their top two bits, but the lower two bits are EE since integers between 9 and 11 vary within these bits.

    Pins

    West edge (inputs, bit width matches Data Bits attribute)
    The inputs whose 1 bits are to be counted. The number of inputs is based on the Number of Inputs attribute.
    East edge (output, bit width computed as described below)
    The number of input bits which are 1. The bit width of the output is the minimum number of bits to store the maximum possible value (which would be the product of the Data Bits attribute and the Number of Inputs attribute).

    Attributes

    When the component is selected or being added, the digits '0' through '9' alter its Number of Inputs attribute and Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the input(s).
    Number of Inputs
    The number of input values.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/libs/arith/adder.html0000644000175000017500000000505111541757130021207 0ustar vincentvincent Adder

    Adder

    Library: Arithmetic
    Introduced: 2.0 Beta 11
    Appearance:

    Behavior

    This component adds two values coming in via the west inputs and outputs the sum on the east output. The component is designed so that it can be cascaded with other adders to provide add more bits than is possible with a single adder: The carry-in input provides a one-bit value to be added into the sum also (if it is specified), and a carry-out output provides a one-bit overflow value that can be fed to another adder.

    If either of the addends contains some floating bits or some error bits, then the component will perform a partial addition. That is, it will compute as many low-order bits as possible. But above the floating or error bit, the result will have floating or error bits.

    Pins

    West edge, north end (input, bit width matches Data Bits attribute)
    One of the two values to add.
    West edge, south end (input, bit width matches Data Bits attribute)
    The other of the two values to add.
    North edge, labeled c in (input, bit width 1)
    A carry value to add into the sum. If the value is unknown (i.e., floating), then it is assumed to be 0.
    East edge (output, bit width matches Data Bits attribute)
    The lower dataBits bits of the sum of the two values coming in the west edge, plus the cin bit.
    South edge, labeled c out (output, bit width 1)
    The carry bit computed for the sum. If the values added together as unsigned values yield a result that fits into dataBits bits, then this bit will be 0; otherwise, it will be 1.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the values to be added and of the result.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/en/html/index.html0000644000175000017500000000054211541757130017177 0ustar vincentvincent Welcome to Logisim!

    Welcome to Logisim!

    Units in the Logisim help system include:

    Guide to Being a Logisim User
    Library Reference

    logisim-2.7.1/doc/en/html/guide/0000755000175000017500000000000011541757130016276 5ustar vincentvincentlogisim-2.7.1/doc/en/html/guide/verify/0000755000175000017500000000000011541757130017602 5ustar vincentvincentlogisim-2.7.1/doc/en/html/guide/verify/sub.html0000644000175000017500000000631211541757130021263 0ustar vincentvincent Substituting libraries

    Substituting libraries

    Now suppose we have two Logisim circuits that are supposed to do the same thing. As an instructor, you might have had students complete an assignment: You have one file containing your solution, but you have several student files containing their work. Maybe the assignment was to build a two-bit adder.

    I'll imagine that we have two files, named adder-master.circ and adder-query.circ. Each file contains a circuit named 2-bit adder (it's important that the circuit to test be named exactly the same), whose appearance is the following.

    adder-master.circ adder-query.circ

    As you can see, the master circuit uses Logisim's built-in adder, while the query circuit uses two subcircuits representing a half adder and a full adder (which themselves are built up of simple gates). For the purpose of our example, the query circuit has a stupid error: The carry from the half adder is not connected into the full adder.

    We build our testing circuit into a different file. There, we load adder-master.circ as a Logisim Library (Project > Load Library > Logisim Library…), and we insert its 2-bit adder as a subcircuit. We could execute this circuit directly to get the desired output for a perfect solution.

    java -jar logisim-filename.jar adder-test.circ -tty table

    But we want to execute the circuit using adder-query.circ rather than adder-master.circ as the loaded library. The naive approach would be to open Logisim and load that library instead; or you might simply remove the adder-master.circ file and rename adder-query.circ to be named adder-master.circ instead. But Logisim includes a handy -sub option that temporarily replace one file by another during that session — without making any changes on disk.

    java -jar logisim-filename.jar adder-test.circ -tty table -sub adder-master.circ adder-query.circ

    The output you would see from this is shown below; it is of course different from what we saw in the previous section since now it is executing using the erroneous adder-query.circ.

    00      00      0E0
    01      00      0E1
    10      00      EE0
    11      00      EE1
    00      01      0E1
    01      01      0E0
    10      01      EE1
    11      01      EE0
    00      10      EE0
    01      10      EE1
    10      10      1E0
    11      10      1E1
    00      11      EE1
    01      11      EE0
    10      11      1E1
    11      11      1E0

    Next: Other verification options.

    logisim-2.7.1/doc/en/html/guide/verify/other.html0000644000175000017500000001025411541757130021613 0ustar vincentvincent Other verification options

    Other verification options

    There are a some additional options related to command-line execution.

    The -load command-line parameter

    A more complex circuit might include a RAM component that needs to be loaded with a program in order for the circuit to have anything to do. You can specify a memory image file at the command line, which will be loaded into any RAM component in the circuit before simulation begins. (This does not work when loading the GUI - it is only for command-line execution.)

    java -jar logisim-filename.jar cpu.circ -tty table -load mem-image.txt

    The order of the parameters is not important (except the table parameter must be immediately after -tty, and the memory image's filename must be immediately after -load). The memory image file should be in Logisim's memory image format.

    Logisim searches for RAM recursively, so this will still work if RAM is nested within a subcircuit. There is no way, though, to distinguish different RAM components: Logisim will attempt to load the same file into every RAM that it can find.

    Options for the -tty parameter

    In our examples thus far, we've always used -tty table to indicate that a table of output values should be displayed. You can customize the behavior in other ways by listing one or more options, separated by commas. For instance, you might write -tty table,halt,speed, and the program will perform all three behaviors listed below. (The order in which they are listed does not matter.)

    halt

    After the simulation ends, a one-line message is displayed explaining why the simulation ended. Error conditions - such as a detected oscillation - are displayed in any case.

    speed

    If you use speed in conjunction with -tty, then after completing the simulation Logisim will display a summary of how quickly the circuit was simulated, such as:

    714 Hz (509 ticks in 712 milliseconds)

    Note that displaying information during the simulation makes the simulation go much slower. As just one comparison, the same circuit and image ran at 714 Hz above with just the speed option but 490 Hz with the table option as well.

    stats

    Shows a tab-delimited table containing statistics about components used by the top-level main circuit in the project. The table includes four columns:

    • Unique: The number of times that component appears in the circuit's hierarchy, where each subcircuit within the hierarchy is counted only once.
    • Recursive: The number of times that component appears in the circuit's hierarchy, where we count each subcircuit as many times as it appears in the hierarchy.
    • Component: The name of the component.
    • Library: The name of the library from which the component came.

    The distinction between Unique and Recursive is explained further under Project menu section. If the file uses circuits from a loaded Logisim library, those components are considered to be black boxes: The contents of the library's circuits are not included in the unique and recursive counts.

    (This feature can be useful for instructors who assign students to build projects using a subset of Logisim's libraries.)

    table

    (as already discussed)

    tty

    Any TTY components send their output to the display (standard output), and any information typed at the keyboard is sent to all Keyboard components in the circuit. These components are included even if they are nested deeply in the subcircuit hierarchy.

    Next: Testing multiple files.

    logisim-2.7.1/doc/en/html/guide/verify/multi.html0000644000175000017500000000564011541757130021627 0ustar vincentvincent Testing multiple files

    Testing multiple files

    In the classroom example, you will have many files that you wish to test for their equivalence, and you won't want to read the output for each of the student's solutions.

    Building comparison into the circuit

    One approach is to build a test circuit that does the comparison directly. Here, we create an additional circuit within the testing file that contains our solution circuit. In our overall testing circuit, we include both the subcircuit from adder-master.circ and the subcircuit from the solution circuit located directly into the nested circuit. We wire it so that there is just one output, which is 1 as long as the two subcircuits agree.

    Now we can simply run Logisim substituting each query file. For any correct solution, the only output will be 1.

    Using redirection and shell scripts

    If you're quite comfortable with the command line, you can build your own shell script to accomplish this. Here, we'll use redirection (the > operator) to save the output of each circuit into a file. For instance, we might issue the following two commands to collect the output of the master circuit and the query circuit.

    java -jar logisim-filename.jar adder-test.circ -tty table > output-master.txt
    java -jar logisim-filename.jar adder-test.circ -tty table -sub adder-master.circ adder-query.circ > output-query.txt

    Now we've created two different files. We can then compare the two output files using a program built for that purpose. Under Linux or MacOS X, you might want to use the cmp or diff command-line utilities. Under Windows, you might want to use WinMerge.

    To process several query files, you would like want to build a simple program such as a shell script to iterate through each and comparing the output. Here is how I would do it under Linux's bash:

    RUN_TEST="java -jar logisim-filename.jar adder-test.circ -tty table"
    ${RUN_TEST} > output-master.txt
    for QUERY_FILE in adder-query*.circ
    do
      if ${RUN_TEST} -sub adder-master.circ ${QUERY_FILE} | cmp -s output-master.txt
      then
        echo "${QUERY_FILE} OK"
      else
        echo "${QUERY_FILE} different"
      fi
    done

    Next: User's Guide.

    logisim-2.7.1/doc/en/html/guide/verify/index.html0000644000175000017500000000534311541757130021604 0ustar vincentvincent Command-line verification

    Command-line verification

    Subsections:
    Substituting libraries
    Other verification options
    Testing multiple files

    Logisim includes basic support for executing circuits from the command-line. This is intended both to help with scripted verification of circuit designs and to help instructors perform automated testing of students' solutions.

    We'll start by seeing how to execute a circuit from the command line. For our example, we'll suppose we've built the below circuit in a file named adder-test.circ. It uses a two-bit adder as a subcircuit and iterates using a counter through all 16 possible inputs to it.

    After this circuit has been built, we then execute Logisim from the command line, providing the filename of the project and the -tty option with the table parameter.

    java -jar logisim-filename.jar adder-test.circ -tty table

    Without bringing up any windows, Logisim loads the circuit and begins to execute it, ticking any clocks as fast as it can while completing the propagation between each tick. After each propagation is completed, Logisim loads the current values of the output pins; if any have changed from the previous propagation, then all values are displayed in tab-delimited format. If there is an output pin labeled with the special word halt, its output is not displayed — but once the pin's value reaches 1 after a propagation is completed, Logisim ends the simulation.

    For our example, Logisim displays the table below. Because we have two output pins corresponding to the two inputs a and b into the two-bit adder, these outputs are included as the first two columns of the output. And there is another output pin corresponding to the two-bit adder's output, so it is the third column. The columns are ordered left-to-right according to the top-down ordering within the circuit.

    00      00      000
    01      00      001
    10      00      010
    11      00      011
    00      01      001
    01      01      010
    10      01      011
    11      01      100
    00      10      010
    01      10      011
    10      10      100
    11      10      101
    00      11      011
    01      11      100
    10      11      101
    11      11      110
    

    Next: Substituting libraries.

    logisim-2.7.1/doc/en/html/guide/tutorial/0000755000175000017500000000000011541757130020141 5ustar vincentvincentlogisim-2.7.1/doc/en/html/guide/tutorial/tutor-wires.html0000644000175000017500000000445211541757130023340 0ustar vincentvincent Tutorial: Adding wires

    Next: Step 3: Adding text

    Step 2: Adding wires

    After you have all the components blocked out on the canvas, you're ready to start adding wires. Select the Edit Tool (). When the cursor is over a point that receives a wire, a small green circle will be drawn around it. Press the mouse button there and drag as far as you want the wire to go.

    Logisim is rather intelligent when adding wires: Whenever a wire ends at another wire, Logisim automatically connects them. You can also "extend" or "shorten" a wire by dragging one of its endpoints using the edit tool.

    Wires in Logisim must be horizontal or vertical. To connect the upper input to the NOT gate and the AND gate, then, I added three different wires.

    Logisim automatically connects wires to the gates and to each other. This includes automatically drawing the circle at a T intersection as above, indicating that the wires are connected.

    As you draw wires, you may see some blue or gray wires. Blue in Logisim indicates that the value at that point is "unknown," and gray indicates that the wire is not connected to anything. This is not a big deal as you're in the process of building a circuit. But by the time you finish it, none of your wires should be blue or gray. (The unconnected legs of the OR gate will still be blue: That's fine.)

    If you do have a blue or a gray wire after you think everything ought to be connected, then something is going wrong. It's important that you connect wires to the right places. Logisim draws little dots on the components to indicate where wires ought to connect. As you proceed, you'll see the dots turn from blue to light or dark green.

    Once you have all the wires connected, all of the wires you inserted will themselves be light or dark green.

    Next: Step 3: Adding text

    logisim-2.7.1/doc/en/html/guide/tutorial/tutor-text.html0000644000175000017500000000205011541757130023163 0ustar vincentvincent Tutorial: Adding text

    Next: Step 4: Testing your circuit

    Step 3: Adding text

    Adding text to the circuit isn't necessary to make it work; but if you want to show your circuit to somebody (like a teacher), then some labels help to communicate the purpose of the different pieces of your circuit.

    Select the text tool (). You can click on an input pin and start typing to give it a label. (It's better to click directly on the input pin than to click where you want the text to go, because then the label will move with the pin.) You can do the same for the output pin. Or you could just click any old place and start typing to put a label anywhere else.

    Next: Step 4: Testing your circuit

    logisim-2.7.1/doc/en/html/guide/tutorial/tutor-test.html0000644000175000017500000000445611541757130023172 0ustar vincentvincent Tutorial: Testing your circuit

    Next: User's Guide

    Step 4: Testing your circuit

    Our final step is to test our circuit to ensure that it really does what we intended. Logisim is already simulating the circuit. Let's look again at where we were.

    Note that the input pins both contain 0s; and so does the output pin. This already tells us that the circuit already computes a 0 when both inputs are 0.

    Now to try another combination of inputs. Select the poke tool () and start poking the inputs by clicking on them. Each time you poke an input, its value will toggle. For example, we might first poke the bottom input.

    When you change the input value, Logisim will show you what values travel down the wires by drawing them light green to indicate a 1 value or dark green (almost black) to indicate a 0 value. You can also see that the output value has changed to 1.

    So far, we have tested the first two rows of our truth table, and the outputs (0 and 1) match the desired outputs.

    By poking the switches through different combinations, we can verify the other two rows. If they all match, then we're done: The circuit works!



    To archive your completed work, you might want to save or print your circuit. The File menu allows this, and of course it also allows you to exit Logisim. But why quit now?

    Now that you are finished with tutorial, you can experiment with Logisim by building your own circuits. If you want to build circuits with more sophisticated features, then you should navigate through the rest of the help system to see what else you can do. Logisim is a powerful program, allowing you to build up and test huge circuits; this step-by-step process just scratches the surface.

    Next: User's Guide

    logisim-2.7.1/doc/en/html/guide/tutorial/tutor-orient.html0000644000175000017500000000235311541757130023505 0ustar vincentvincent Tutorial: Orienting yourself

    Next: Step 1: Adding gates

    Step 0: Orienting yourself

    When you start Logisim, you'll see a window similar to the following. Some of the details may be slightly different since you're likely using a different system than mine.

    All Logisim is divided into three parts, called the explorer pane, the attribute table, and the canvas. Above these parts are the menu bar and the toolbar.

    We can quickly dispose of the explorer pane and the attribute table: We won't be examining them in this tutorial, and you can just ignore them. Also, the menu bar is self-explanatory.

    That leaves the toolbar and the canvas. The canvas is where you'll draw your circuit; and the toolbar contains the tools that you'll use to accomplish this.

    Next: Step 1: Adding gates

    logisim-2.7.1/doc/en/html/guide/tutorial/tutor-gates.html0000644000175000017500000000650111541757130023307 0ustar vincentvincent Tutorial: Adding gates

    Next: Step 2: Adding wires

    Step 1: Adding gates

    Recall that we're trying to build the following circuit in Logisim.

    I suggest building a circuit by inserting the gates first as a sort of skeleton and then connecting them with wires later. The first thing we'll do is to add the two AND gates. Click on the AND tool in the toolbar (, the next-to-last tool listed). Then click in the editing area where you want the first AND gate to go. Be sure to leave plenty of room for stuff on the left. Then click the AND tool again and place the second AND gate below it.

    Notice the five dots on the left side of the AND gate. These are spots where wires can be attached. It happens that we'll just use two of them for our XOR circuit; but for other circuits, you may find that having more than two wires going to an AND gate is useful.

    Now add the other gates. First click on the OR tool (); then click where you want it. And place the two NOT gates into the canvas using the NOT tool ().

    I left a little space between the NOT gates and the AND gates; if you want to, though, you can put them up against each other and save yourself the effort of connecting them with a wire later.

    Now we want to add the two inputs x and y into the diagram. Select the Input tool (), and place the pins down. You should also place an output pin next to the OR gate's output using the Output tool (). (Again, I'm leaving a bit of space between the OR gate and the output pin, but you might choose to place them right next to each other.)

    If you decide you don't like where you placed something, then you can select it using the Edit tool () and drag it to the desired spot. Or you can delete it altogether by selecting Delete from the Edit menu or pressing the Delete key.

    As you place each component of the circuit, you'll notice that as soon as the component is placed, Logisim reverts to the Edit tool so that you can move the recently-placed component or (as we'll see soon) connect the component to others by creating wires. If you want to add a copy of the recently placed component, a shortcut is to press Control-D to duplicate the selection. (Some computers use another keys for menus, such as the Command key on Macintoshes. You would press that key with the D key.)

    Next: Step 2: Adding wires

    logisim-2.7.1/doc/en/html/guide/tutorial/index.html0000644000175000017500000000300611541757130022135 0ustar vincentvincent Beginner's tutorial

    Beginner's tutorial

    Next: Step 0: Orienting yourself

    Welcome to Logisim!

    Logisim allows you to design and simulate digital circuits. It is intended as an educational tool, to help you learn how circuits work.

    To practice using Logisim, let's build a XOR circuit - that is, a circuit that takes two inputs (which we'll call x and y) and outputs 0 if the inputs are the same and 1 if they are different. The following truth table illustrates.

    We might design such a circuit on paper.
    But just because it's on paper doesn't mean it's right. To verify our work, we'll draw it in Logisim and test it. As an added bonus, we'll get a circuit that's looks nicer than what you probably would draw by hand.

    Step 0: Orienting yourself
    Step 1: Adding gates
    Step 2: Adding wires
    Step 3: Adding text
    Step 4: Testing your circuit

    Enjoy your circuit-building!

    Next: Step 0: Orienting yourself

    logisim-2.7.1/doc/en/html/guide/subcirc/0000755000175000017500000000000011541757130017730 5ustar vincentvincentlogisim-2.7.1/doc/en/html/guide/subcirc/using.html0000644000175000017500000000724111541757130021747 0ustar vincentvincent Using subcircuits

    Using subcircuits

    Now suppose we want to build a 4-to-1 multiplexer using instances of our 2-to-1 multiplexer. Of course, we would first create a new circuit, which we'll call "4:1 MUX." To add 2-to-1 multiplexers into our circuit, we click the 2:1 MUX circuit once in the explorer pane to select it as a tool, and then we can add copies of it, represented as boxes, by clicking within the canvas.

    If you were to double-click the 2:1 MUX circuit in the explorer pane, then the window would switch to editing the 2:1 MUX circuit instead.

    After building up the circuit, we end up with the following.

    Our circuit for a 4-to-1 multiplexer uses three copies of the 2-to-1 multiplexer, each drawn as a box with pins along the side. The pins on this box correspond to the input and output pins in the 2:1 MUX circuit. The two pins on the west side of the box correspond to the two pins that face east in the 2:1 MUX circuit; the pin on the box's east side corresponds to the 2:1 MUX's west-facing pin (which happens to be an output pin); and the pin on the box's south side corresponds to the 2:1 MUX's north-facing pin. The order of the two pins on the box's west side correspond to the same top-down ordering from the subcircuit's design. (If there were several pins on the box's north or south side, they would correspond to the same left-right order in the subcircuit.)

    If the pins in the subcircuit's layout have labels associated with them, then Logisim will display that label in a tip (that is, a temporary text box) when the user hovers the mouse over the corresponding location of the subcircuit component. (If you find these tips irritating, you can disable them via the Preferences window's Layout tab.)

    Several other components will display these tips, too: For some of the pins of a built-in flip-flop, for example, hovering over it explains what that pin does.

    Incidentally, every pin to a circuit must be either an input or an output. Many manufactured chips have pins that behave as an input in some situations and as an output in others; you cannot construct such chips within Logisim (at least, in the current version).

    Logisim will maintain different state information for all subcircuits appearing in a circuit. For example, if a circuit contains a flip-flop, and that circuit is used as a subcircuit several times, then each subcircuit's flip-flop will have its own value when simulating the larger circuit.

    Now that we have the 4-to-1 multiplexer defined, we can now use it in other circuits. Logisim has no limits on how deeply circuits can be nested - though it will object to nesting circuits within themselves!

    Note: There's nothing wrong with editing a circuit that is being used as a subcircuit; in fact, this is quite common. Be aware, though, that any changes to a circuit's pins (adding, deleting, or moving them) will rearrange them also in the containing circuit. Thus, if you change any pins in a circuit, you will also need to edit any circuits using it as a subcircuit.

    Next: Editing subcircuit appearance.

    logisim-2.7.1/doc/en/html/guide/subcirc/library.html0000644000175000017500000000314111541757130022261 0ustar vincentvincent Logisim libraries

    Logisim libraries

    Every Logisim project is automatically a library that can be loaded into other Logisim projects: Just save it into a file and then load the library within another project. All of the circuits defined in the first project will then be available as subcircuits for the second. This feature allows you to reuse common components across projects and to share favorite components with your friends (or students).

    Each project has a designated "main circuit," which can be changed to refer to the current circuit via the Set As Main Circuit option in the Project menu. The only significance of this is that the main circuit is the one that is displayed when you first open the project. The default name of the circuit in a newly created file ("main") has no significance at all, and you can feel free to delete or rename that circuit.

    With a loaded Logisim library, you are allowed to view circuits and manipulate their states, but Logisim will prevent you from altering the circuits' design and other data stored within the file.

    If you want to alter a circuit in a loaded Logisim library, then you need to open it separately within Logisim. As soon as you save it, the other project should automatically load the modified version immediately; but if it does not, you can right-click the library folder in the explorer pane and select Reload Library.

    Next: User's Guide.

    logisim-2.7.1/doc/en/html/guide/subcirc/index.html0000644000175000017500000000233311541757130021726 0ustar vincentvincent Subcircuits

    Subcircuits

    As you build circuits that are more and more sophisticated, you will want to build smaller circuits that you can use multiple times as a module nested within larger circuits. In Logisim, such a smaller circuit that is used in a larger circuit is called a subcircuit.

    If you're familiar with computer programming, you're familiar with the subprogram concept, whether it's called a subroutine, function, method, or procedure in your favored language. The subcircuit concept is analogous to this, and it serves the same purpose: To break a large job into bite-sized pieces, to save the effort of defining the same concept multiple times, and to facilitate debugging.

    Creating circuits
    Using subcircuits
    Editing subcircuit appearance
    Debugging subcircuits
    Logisim libraries

    Next: Creating circuits.

    logisim-2.7.1/doc/en/html/guide/subcirc/debug.html0000644000175000017500000000526011541757130021707 0ustar vincentvincent Debugging subcircuits

    Debugging subcircuits

    As you test larger circuits, you will likely find bugs. To nail down what's going wrong, exploring what's going on in the subcircuits while running the overall circuit can help. To enter the subcircuit's state, you can use any of three different techniques. The most straightforward is probably to view the simulation hierarchy by clicking the second icon in the explorer pane's upper toolbar (), or by selecting "View Simulation Tree" from the Project menu. This switches the explorer pane so that it shows the hierarchy of subcircuits being simulated.

    Double-clicking an element in this hierarchy will display what is happening inside that subcircuit.

    The second way you can enter a subcircuit is to bring up its popup menu by right-clicking or control-clicking it, and then choosing the View option.

    And the third way is to first ensure the Poke Tool is selected and then click the subcircuit you want to enter; a magnifying glass will appear over the subcircuit's center, and double-clicking the magnifying glass will enter the subcircuit's state.

    In any case, once you enter the subcircuit, you'll see that the pins' values in the subcircuit match the values being sent through them from the containing circuit.

    While in the subcircuit, you are allowed to alter the circuit. If the changes affect any of the subcircuit's outputs, they are propagated into the containing circuit. One exception: The subcircuit inputs are determined based on the values coming into the circuit from the supercircuit, so it doesn't make sense to toggle those values. If you attempt to poke a subcircuit's input, a dialog will pop up asking, The pin is tied to the supercircuit state. Create a new circuit state? Clicking No will cancel the toggle request, while clicking Yes will create a copy of the viewed state, divorced from the outer circuit, with the input pin toggled.

    Once you have completed viewing and/or editing, you can return to the parent circuit either by double-clicking the parent circuit in the explorer pane, or via the Go Out To State submenu of the Simulate menu.

    Next: Logisim libraries.

    logisim-2.7.1/doc/en/html/guide/subcirc/creating.html0000644000175000017500000000226511541757130022417 0ustar vincentvincent Creating circuits

    Creating circuits

    Every Logisim project is actually a library of circuits. In its simplest form, each project has only one circuit (called "main" by default), but it is easy to add more: Select Add Circuit... from the Project menu, and type any name you like for the new circuit you want to create.

    Suppose we want to build a 2-to-1 multiplexer named "2:1 MUX." After adding the circuit, Logisim will look like this.

    In the explorer pane, you can now see that the project now contains two circuits, "main", and "2:1 MUX." Logisim draws a magnifying glass over the icon of the circuit currently being viewed; the current circuit name also appears in the window's title bar.

    After editing the circuit to appear like a 2:1 multiplexer, we might end up with the following circuit.

    Next: Using subcircuits.

    logisim-2.7.1/doc/en/html/guide/subcirc/appear.html0000644000175000017500000001644011541757130022073 0ustar vincentvincent Editing subcircuit appearance

    Editing subcircuit appearance

    Default appearance

    By default, when a subcircuit is placed within a larger circuit, it is drawn as a rectangle with a notch indicating the north end of the subcircuit's layout. Pins will be placed on the rectangle's border based on their facing: Pins that face east in the layout (and typically appear on the west side of the layout) will be placed on the rectangle's west side, according to their top-down ordering in the layout. Pins that face south in the layout (typically toward the north side of the layout) will be placed on the rectangle's north side, according to the left-to-right ordering in the layout.

    The default rectangle can optionally include some letters that will appear in the middle of the rectangle. To specify this, select the selection tool () and click the background of the circuit's layout. This will show the circuit attributes in the attribute table, including the Shared Label, Shared Label Facing, and Shared Label Font attributes. The value of the Shared Label attribute will be drawn in the rectangle's center; the Shared Label Facing attribute customizes which direction the text is drawn, and of course the Shared Label Font attribute customizes the font used.

    Customized appearance

    The default appearance is very usable, and indeed Logisim existed for many years with no other option. If, however, you prefer that the subcircuit be drawn differently, you can select Edit Circuit Appearance from the Project menu, and Logisim's interface will switch from its regular layout-editing interface to an interface for drawing the circuit's appearance. (You can also click the far-right icon () in the explorer pane's upper toolbar.) Below, we are editing the 2:1 multiplexer's appearance so that it is drawn with the usual trapezoid rather than a rectangle.

    With the appearance for the 2:1 multiplexer drawn as above, the layout for the 4:1 multiplexer would then appear as the following.

    The appearance editor is like a traditional drawing program, but there are a few special symbols for indicating how the drawing works when placed into a circuit's layout. These special symbols cannot be removed.

    • The green circle with a line coming out of it, which we'll call the anchor. There is exactly one anchor in each subcircuit appearance. Each component in a circuit has a single point identifying its location; a user sees this when creating a new component: The mouse click identifies just a single location, and the component is placed relative to that (usually with the primary output at the mouse's location) The anchor identifies the mouse's location relative to the overall drawing when the subcircuit is created.

      The anchor also identifies the appearance's facing, as indicated by the direction the anchor's line points from its circle. When placing the subcircuit into a layout, the user can change the subcircuit's facing; the anchor's facing indicates in which direction the appearance is oriented. In our example, the anchor is facing east, and each instance of the subcircuit in the 4:1 multiplexer is also facing east, so they are all drawn in the same orientation as the 2:1 multiplexer's appearance.

    • The blue circles and squares with dots in them are the subcircuit's ports. There are exactly as many ports as there are input and output pins in the circuit. Ports corresponding to inputs are drawn as squares, while ports corresponding to outputs are drawn as circles. Each port indicates how a wire connecting into the circuit will correspond to an input or output pin within the layout.

      When you select a port, Logisim will indicate the corresponding pin by popping up a miniature diagram of the layout in the window's bottom right corner, with the corresponding pin(s) drawn in blue. This does not happen when all ports are selected.

    The toolbar contains tools for adding additional shapes, as listed below with descriptions of how the shift and alt key modifies the tool behavior. In addition, clicking or dragging the mouse with the control key pressed regularly snaps the mouse position to the nearest grid point.

    Select, move, copy, and paste shapes.
    Add or edit text.
    Create a line segment. Shift-drag keeps the line's angle at a multiple of 45°.
    Create a quadratic Bezier curve. For the first drag, where you specify the curve's endpoints, shift-drag keeps the endpoints at an angle that is a multiple of 45°. Then you click to indicate the control point's location; shift-click ensures the curve is symmetric, while alt-click draws the curve through the control point.
    Create a sequence of connected lines, whose vertices are indicated by a succession of clicks. Shift-clicking ensures that the angle between the previous vertex and the current one is a multiple of 45°. Double-click or press the Enter key to complete the shape.
    Create a rectangle through dragging from one corner to the opposite corner. Shift-drag to create a square, and alt-drag to create the rectangle starting from the center.
    Create a rectangle with rounded corners through dragging from one corner to the opposite corner. Shift-drag to create a square, and alt-drag to create the rectangle starting from the center.
    Create an oval through dragging from one corner of its bounding box to the opposite corner. Shift-drag to create a circle, and alt-drag to create the oval starting from the center.
    Create an arbitrary polygon, whose vertices are indicated by a succession of clicks. Shift-clicking ensures that the vertex is at a 45° angle from the previous one. Double-click, press the Enter key, or click the starting vertex to complete the shape.

    Next: Debugging subcircuits.

    logisim-2.7.1/doc/en/html/guide/prop/0000755000175000017500000000000011541757130017256 5ustar vincentvincentlogisim-2.7.1/doc/en/html/guide/prop/shortcome.html0000644000175000017500000000405211541757130022150 0ustar vincentvincent Shortcomings

    Shortcomings

    Logisim's propagation algorithm is more than sophisticated enough for almost all educational purposes; but it is not sophisticated enough for industrial circuit design. In order from most damning to least damning, the shortcomings of Logisim's propagation technique include:

    • Except for the issue of gate delays, Logisim does not particularly concern itself with timing issues. It is very idealized, so that a pair of NOR gates in an S-R latch configuration will toggle in lockstep infinitely, rather than the circuit eventually settle into a stable state.

    • Logisim cannot simulate subcircuits whose pins sometimes behave as inputs and sometimes behave as outputs. Components built using Java can have such pins, though: Within the built-in libraries, the Memory library's RAM circuit contains a D pin that can act both as an input and as an output.

    • Logisim cuts off its simulation after a fixed number of iterations assuming that there is an oscillation error. Conceivably, a large circuit that does not oscillate could lead to trouble.

    • Logisim does nothing with respect to discriminating between voltage levels: A bit can be only on, off, unspecified, or error.

    • There are additional shortcomings, too, that I have omitted because they are so obscure that if you were aware of them, it would be obvious that Logisim comes nowhere close to that level. As an extreme example, I have a friend who works for a major chip manufacturer, and his job is to worry about "bubbles" in chips' nanometer-wide wires growing and leading to random disconnection.

    • Even beyond this, I am not a circuit design specialist; thus, there may well be errors in the propagation technique of which I am not aware. I welcome corrections from experts.

    Next: User's Guide.

    logisim-2.7.1/doc/en/html/guide/prop/oscillate.html0000644000175000017500000000426411541757130022131 0ustar vincentvincent Oscillation errors

    Oscillation errors

    The propagation algorithm, which normally works silently without any problems, will become very visible when you create a circuit that oscillates.

    This circuit is currently in a stable condition. But if you change the input to 1, the circuit will effectively enter an infinite loop. After a while, Logisim will simply give up and show an "Oscillation apparent" message telling you that it believes that the circuit is oscillating.

    It will display the values it has at the time it gives up. These values will look wrong - in this screen shot, the AND gate is emitting 1 although one of its inputs is 0, but it could be that the NOT gate has a 1 input and a 1 output.

    Logisim helpfully circles in red each location that seems to be involved in the oscillation. If an involved point lies within a subcircuit, Logisim will draw that subcircuit's outline in red.

    When Logisim detects oscillation, it shuts down all further simulation. You can re-enable simulation using the Simulate menu's Simulation Enabled option.

    Logisim detects oscillation using a fairly simple technique: If the circuit simulation seems to many iterations, then it will simply give up and report oscillation. (The points it identifies as being involved are those that were touched in the last 25% of the iterations.) Thus, it could erroneously report oscillation, particularly if you are working with an exceptionally large circuit; but it would be one that is larger than any I have built using Logisim. In any case, if you are confident that the reporting is in error, you can configure the number of iterations completed before oscillation occurs via the Project Options window's Simulation tab.

    Next: Shortcomings.

    logisim-2.7.1/doc/en/html/guide/prop/index.html0000644000175000017500000000137211541757130021256 0ustar vincentvincent Value propagation

    Value propagation

    Logisim's algorithm for simulating the propagation of values through circuits is not something that you normally need to worry about. Suffice it to say that the algorithm is sophisticated enough to account for gate delays, but not realistic enough to account for more difficult phenomena like varying voltages or race conditions.

    Do you still want to know more?

    Gate delays
    Oscillation errors
    Shortcomings

    Next: Gate delays.

    logisim-2.7.1/doc/en/html/guide/prop/delays.html0000644000175000017500000000441111541757130021425 0ustar vincentvincent Gate delays

    Gate delays

    As an example of the level of sophistication of Logisim's algorithm, consider the following circuit.

    This "obviously" always outputs 0. But NOT gates don't react instantaneously to their inputs in reality, and neither do they in Logisim. As a result, when this circuit's input changes from 0 to 1, the AND gate will briefly see two 1 inputs, and it will emit a 1 briefly. You won't see it on the screen. But the effect is observable when we use the AND gate's output as an input into the clock of a D flip-flop.

    Poking the 0 input to become 1 leads to an instantaneous 1 going into the D flip-flop, and thus the flip-flop's value will toggle every time the circuit input goes from 0 to 1.

    Every component has a delay associated with it. More sophisticated components built into Logisim tend to have larger delays, but these delays are somewhat arbitrary and may not reflect reality.

    From a technical point of view, it is relatively easy to deal with this level of sophistication in a single circuit. Dealing with gate delays well across subcircuits, though, is a bit more complex; Logisim does attempt to address this correctly by placing all primitive component's propagation values into a single schedule regardless of the subcircuit in which the component lies.

    (Via the Project Options window's Simulation tab, you can configure Logisim to add a random, occasional delay to a component's propagation. This is intended to simulate the unevenness of real circuits. In particular, an R-S latch built using two NOR gates will oscillate without this randomness, as both gates will process their inputs in lockstep. This randomness is disabled by default.)

    Note that I'm stopping short of saying that Logisim always addresses gate delays well. But at least it tries.

    Next: Oscillation errors.

    logisim-2.7.1/doc/en/html/guide/prefs/0000755000175000017500000000000011541757130017415 5ustar vincentvincentlogisim-2.7.1/doc/en/html/guide/prefs/window.html0000644000175000017500000000266011541757130021616 0ustar vincentvincent The Window tab

    The Window tab

    This tab includes preferences affecting the appearance of the main window used for Logisim.

    • Show tick rate: If checked, then when ticks are enabled, Logisim displays a measurement of the rate at which it has been able to complete ticks. The tick rate is measured by averaging over the previous 1,000 ticks. (Disabling ticks or changing the maximum tick rate will clear its history.)

      This actual tick rate may be much less than the selected tick rate, because Logisim cannot simulate larger circuits at a very fast rate. For example, Logisim's maximum speed for a reasonably large circuit might be 16 Hz; you can select a faster tick rate, but the actual speed will not exceed 16 Hz.

    • Toolbar location: This drop-down menu configures the location of the toolbar within the overall window. The toolbar may be placed on any of the window's four borders, described as north, south, east, and west. It may also be hidden, or it can be placed "down the middle" - that is, to the left of the canvas but to the right of the explorer pane and attribute table.

    Next: The Layout tab.

    logisim-2.7.1/doc/en/html/guide/prefs/template.html0000644000175000017500000000277111541757130022125 0ustar vincentvincent The Template tab

    The Template tab

    A template is a Logisim file that is used as a starting point whenever Logisim creates a new project. Also, if you have an existing Logisim file with a strangely configured environment, you can "reset" the environment using the Revert All To Template button in the window for editing Project Options.

    Although templates are useful in other situations also, they are particularly suited for classroom use, where an instructor might want to distribute a template for students to start from. This is particularly likely if the class uses Logisim heavily, including many of the more advanced features, in which case the simple default configuration may prove too simple. Templates can also be useful in the classroom setting when the instructor opens a file submitted by a student who has configured the environment significantly.

    By default, the "Plain template" option will be selected, using the default template shipped with Logisim. If you want a bare-bones configuration, you might choose "Empty template." But if you want to designate another file to use as the template, select a template via the Select... button, and then choose the "Custom template" option.

    Next: The International tab.

    logisim-2.7.1/doc/en/html/guide/prefs/layout.html0000644000175000017500000000662711541757130021633 0ustar vincentvincent The Layout tab

    The Layout tab

    This tab includes preferences affecting the behavior of the circuit layout editor.

    • Printer view: Specifies whether to display the circuit on the screen in the same way it is displayed through the printer. Normally this is off, and Logisim displays the on-screen circuit with indications of the current circuit state, and it displays some hints about component interface (most notably, it draws legs on OR gates to indicate where they would connect). The printer view, though, omits indications of state, and it omits such interface hints.

    • Show attribute halo: Specifies whether to draw the pale teal oval around the component or tool whose attributes are currently displayed in the attribute table.

    • Show component tips: Specifies whether to display the "tool tips" that will temporarily appear when the mouse hovers over components supporting them. For example, if you hover over a subcircuit component's pin, it will display the label of the corresponding pin within the subcircuit. Hovering over one of the ends of a splitter will tell you the bits to which that end corresponds. In addition, all components in the Plexers, Arithmetic, and Memory libraries will provide information about their inputs and outputs via tips.

    • Keep connections while moving: Indicates whether Logisim should add new wires when components are moved to preserve their connections. By default this is on — though it can be turned off temporarily by pressing the shift key while moving the components. If this box is unchecked, then the default will be not to add wires during a move — though you can turn it on temporarily by pressing the shift key during the move.

    • Show Ghosts while adding: When checked, and when a tool for adding a new component is selected, a light-gray outline of a component to be added is drawn as the mouse moves across the canvas. For example, if you select the AND gate tool and move the mouse into the window (without pressing the mouse's button), a gray outline of an AND gate will display where the AND gate will appear when the mouse is clicked.

    • After adding component: By default, after adding each individual component, Logisim switches back to the Edit Tool to allow you to move components around and to add wires. The drop-down box allows you to change this behavior so that Logisim stays at the same tool for adding more of the same component, until you yourself opt to choose the Edit Tool. (This was Logisim's default behavior prior to Logisim 2.3.0. While more intuitive, this behavior requires more mouse movement to switch between tools.)

    • First radix when wire poked: Configures how values are displayed when a wire is clicked using the Poke Tool. Clicking a wire displays temporarily the value, staying until the user clicks elsewhere in the circuit.

    • Second radix when wire poked: Configures the second part of how wire values are displayed.

    Next: The Experimental tab.

    logisim-2.7.1/doc/en/html/guide/prefs/intl.html0000644000175000017500000000763111541757130021260 0ustar vincentvincent The International tab

    The International tab

    This tab allows configuration of Logisim according to regional preferences.

    • Gate shape: Logisim supports three standards for drawing gates: shaped gates, rectangular gates, and DIN 40700 gates. The following table illustrates the distinction.

      Shaped Rectangular DIN 40700
      AND
      OR

      Because the shaped style tends to be more popular in the U.S., while the rectangular style tends to be more popular in Europe, some people refer to these styles according to these regions; but the region-neutral terms shaped and rectangular are preferred. The DIN 40700 standard was a standard for drafting digital and analog electronic components adopted by DIN, a German standards organization. DIN adopted the rectangular standard for digital components in 1976, but some engineers continue to use the older style; they appear to be increasingly rare.

      Logisim does not follow any standard exactly; it steers a middle ground to allow switching between them. In particular, the shaped gates are more square than the dimensions defined by the relevant IEEE standard. And, although XOR and XNOR gates really ought to be the same width as OR and NOR gates with the rectangular style, they are not because of difficulties compressing the shaped-XOR gate.

    • Language: Change between languages. The current version is supplied with English, Spanish, Russian, and German translations.

      • The German translation was introduced with Logisim 2.6.1 and remains current. It is by Uwe Zimmermann, a faculty member at Uppsala University in Sweden.
      • The Greek translation was introduced with Logisim 2.7.0 and remains current. It is by Thanos Kakarountas, a faculty member at Technological Educational Institute of Ionian Islands in Greece.
      • The Portuguese translation was introduced with Logisim 2.6.2 and remains current. It is by Theldo Cruz Franqueira, a faculty member at Pontifícia Universidade Católica de Minas Gerais in Brazil.
      • The Russian translation was introduced with Logisim 2.4.0 and remains current. It is by Ilia Lilov, from Russia.
      • The Spanish translation was complete as of Logisim 2.1.0, but subsequent Logisim versions have added new options that remain untranslated. It was contributed by Pablo Leal Ramos, from Spain.

      Translations of Logisim into other languages are welcome! If you are interested, contact me, Carl Burch. This will not be a commitment: I will be happy to hear of your interest, and I will tell you whether I know of somebody who is working on it already, prepare a version for you to work with, and send you instructions. The translation process does not require an understanding of Java.

    • Replace accented characters: Some platforms have poor support for characters (such as ñ or ö) that do not appear in the 7-bit ASCII character set. When this is checked, Logisim will replace all instances of the characters with the appropriate equivalent 7-bit ASCII characters. The checkbox is disabled when the current language does not have any equivalents available (as with English).

    Next: The Window tab.

    logisim-2.7.1/doc/en/html/guide/prefs/index.html0000644000175000017500000000233611541757130021416 0ustar vincentvincent Application Preferences

    Application Preferences

    Logisim supports two categories of configuration options: application preferences and project options. The application preferences address preferences that span all open projects, whereas project options are specific to that one project. This section discusses application preferences; project options are described in another section.

    You can view and edit application preferences via the Preferences... option from the File menu (or, under Mac OS, the Logisim menu), a window will appear with several tabs. We will discuss these tabs separately, and then we will see how preferences can be configured from the command line.

    The Template tab
    The International tab
    The Window tab
    The Layout tab
    The Experimental tab
    The command line

    Next: The Template tab.

    logisim-2.7.1/doc/en/html/guide/prefs/exp.html0000644000175000017500000000160611541757130021102 0ustar vincentvincent The Experimental tab

    The Experimental tab

    These preferences enable features that are considered experimental, inserted to garner user feedback.

    • Graphics acceleration: One Logisim user observed that adding -Dsun.java2d.d3d=True to the command line seemed to improve Logisim's graphics performance by telling it to use hardware graphics acceleration. This drop-down box attempts to configure Logisim to set this up; reports about whether this drop-down box has any effect on performance would be welcome. It won't have any effect until Logisim is restarted.

    Next: Command line options.

    logisim-2.7.1/doc/en/html/guide/prefs/cmdline.html0000644000175000017500000000530511541757130021721 0ustar vincentvincent Command-line options

    Command-line options

    You can configure many of Logisim's application preferences via command line options. This can be particularly useful in a laboratory of single-student computers where you want Logisim to start up the same for students every time, regardless of how previous students may have configured the program.

    The overall command-line syntax is as follows.

    java -jar jarFileName [options] [filenames]
    

    The optional additional files named on the command line will be opened as separate windows within Logisim.

    The following example starts Logisim in its basic configuration.

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

    Supported options include the following.

    -plain
    -empty
    -template templateFile

    Configures the template for Logisim to use.

    -gates [shaped|rectangular]

    Configures which type of gate to use.

    -locale localeIdentifier

    Configures which translation to use. As of this writing, the supported locales include:

    deGerman
    enEnglish
    esSpanish
    ruRussian
    elGreek
    -accents [yes|no]

    This is only relevant for languages that use characters outside the 7-bit ASCII character set; this would include languages using accented characters, and it would not include English. If no, characters outside the 7-bit ASCII character set are replaced with equivalents appropriate to the language; this would be useful for Java/OS combinations where such characters are not supported well.

    -clearprops

    Clear all application preferences at startup, so Logisim will act as if it were being executed on the host system for the first time.

    -nosplash

    Hides the initial Logisim splash screen.

    -help

    Displays a summary of the command line options.

    -version

    Displays the Logisim version number.

    Next: User's Guide.

    logisim-2.7.1/doc/en/html/guide/opts/0000755000175000017500000000000011541757130017263 5ustar vincentvincentlogisim-2.7.1/doc/en/html/guide/opts/toolbar.html0000644000175000017500000000257411541757130021623 0ustar vincentvincent The Toolbar tab

    The Toolbar tab

    The Toolbar tab allows you to configure what tools appear in the toolbar.

    The left side is an explorer listing all the tools available, and the list on the right side displays the current contents of the toolbar. (Three dashes "---" indicate a separator, which is drawn as a gray line.) Between the explorer and the list are five buttons and a combo box:

    • Add Tool adds the currently selected tool in the explorer at left to the end of the toolbar.

    • Add Separator adds a separator to the end of the toolbar.

    • Move Up moves the currently selected item of the toolbar up/left one spot.

    • Move Down moves the currently selected item of the toolbar down/right one spot.

    • Remove removes the currently selected item from the toolbar.

    The attributes associated with the tools are not displayed in this window; instead, you can view and edit them within the main drawing window.

    Next: The Mouse tab.

    logisim-2.7.1/doc/en/html/guide/opts/simulate.html0000644000175000017500000000500011541757130021767 0ustar vincentvincent The Simulation tab

    The Simulation tab

    The Simulation tab allows configuration of the algorithm used for simulating circuits. These parameters apply to all circuits being simulated in the same window, even for circuits that exist in other libraries loaded within the project.

    • The Iterations Until Oscillation drop-down menu specifies how long to simulate a circuit before deciding that it is oscillating. The number represents the number of clicks of the internal hidden clock (a simple gate takes just one click). The default of 1,000 is good enough for almost all purposes, even for large circuits. But you may want to increase the number of iterations if you are working with a circuit where Logisim reports false oscillations. This is unlikely to be a problem in practice, but one such a circumstance is a circuit that incorporates many of the below latch circuits with random noise enabled. You may want to decrease the number of iterations if you are working with a circuit that is prone to oscillating and you are using an unusually slow processor.

    • The Gate Output When Undefined drop-down menu configures how the built-in logic gates behave when some inputs are unconnected or are floating. By default, Logisim ignores such inputs, allowing a gate to work over fewer inputs than it was designed for. However, in real life, a gate will behave unpredictably in such a situation, and so this drop-down menu allows one to change the gates so that they treat such disconnected inputs as errors.

    • The Add Noise To Component Delays checkbox allows you to enable or disable the random noise that is added to the delays of components. The internal simulation uses a hidden clock for its simulation, and to provide a somewhat realistic simulation, each component (excluding wires and splitters) has a delay between when it receives an input and when it emits an output. If this option is enabled, Logisim will occassionally (about once every 16 component reactions) make a component take one click longer than normal.

      I recommend keeping this option off, as this technique does introduce rare errors with normal circuits.

    Next: The Toolbar tab.

    logisim-2.7.1/doc/en/html/guide/opts/mouse.html0000644000175000017500000000424011541757130021301 0ustar vincentvincent The Mouse tab

    The Mouse tab

    By default, when you click the mouse in Logisim's drawing area, the currently selected tool will be used. If you right-click or control-click, it will display a pop-up menu for the current component below the mouse.

    Logisim allows you to modify this behavior, relieving you of the need to go to the toolbar and/or the explorer all the time. (This may also be handy if you are left-handed.) Each combination of a mouse button and a modifier key (any subset of shift, control, and alt) can be mapped to a different tool. The Mouse tab allows you to configure these mappings.

    • On the left side is an explorer where you can choose the tool you want to map.

    • On the right top side is a rectangle in which you can click using the mouse combination you want to click. For example, if you want to create new wires by shift-dragging, then you would first select the Wiring Tool in the Explorer (under the Base library); and then you would shift-click where it says "Click Using Combination To Map Wiring Tool." If that combination is already being used, then the mapping would be replaced with the new tool.

    • Below this area is a list of current mappings. Note that any combinations that aren't listed simply use the currently selected tool.

    • Below is the Remove button, where you can delete the mapping that is currently selected in the table above the button. In the future, then, that mouse combination would map to whatever tool is currently selected in the toolbar or the explorer pane.

    • Below this is a list of attributes for the tool currently selected in the list of mappings. Each mouse-mapped tool has its own set of attributes, different from the attributes used in the explorer pane and in the toolbar. You can edit those attribute values here.

    Next: User's Guide.

    logisim-2.7.1/doc/en/html/guide/opts/index.html0000644000175000017500000000245411541757130021265 0ustar vincentvincent Project Options

    Project Options

    Logisim supports two categories of configuration options: application preferences and project options. The application preferences address preferences that span all open projects, whereas project options are specific to that one project. This section discusses project options; application preferences are described in another section.

    You can view and edit project options via the Options... option from the Project menu. It brings up the Options window with several tabs.

    We will discuss each of these tabs separately.

    The Simulation tab
    The Toolbar tab
    The Mouse tab

    At the bottom of the window is the Revert All To Template button. When clicked, all the options and tool attributes change to the settings in the current template (as selected under the application preferences).

    Next: The Simulation tab.

    logisim-2.7.1/doc/en/html/guide/menu/0000755000175000017500000000000011541757130017242 5ustar vincentvincentlogisim-2.7.1/doc/en/html/guide/menu/winhelp.html0000644000175000017500000000335711541757130021606 0ustar vincentvincent The Window and Help menus

    The Window menu

    Minimize

    Minimizes (iconifies) the current window.

    Maximize (Zoom on MacOS)

    Resizes the current window to its preferred size.

    Close

    Closes the current window.

    Combinational Analysis

    Shows the current Combinational Analysis window, without changing any of its contents.

    Preferences

    Shows the Application Preferences window.

    individual window titles

    Brings the respective window to the front.

    The Help menu

    Tutorial

    Opens the help system to the "Beginner's Tutorial" section of the Guide to Being a Logisim User.

    User's Guide

    Opens the help system to the Guide to Being a Logisim User.

    Library Reference

    Opens the help system to the Library Reference.

    About...

    Displays a window containing the version number, mixed among the splash screen graphics. (On MacOS, this menu item is under the Logisim menu.)

    Next: User's Guide.

    logisim-2.7.1/doc/en/html/guide/menu/simulate.html0000644000175000017500000000606311541757130021760 0ustar vincentvincent The Simulate menu

    The Simulate menu

    Simulation Enabled

    If checked, circuits viewed will be "live:" That is, the values propagating through the circuit will be updated with each poke or change to the circuit.

    The menu option will be automatically unchecked if circuit oscillation is detected.

    Reset Simulation

    Clears everything about the current circuit's state, so that it is as if you have just opened the file again. If you are viewing a subcircuit's state, the entire hierarchy is cleared.

    Step Simulation

    Advances the simulation one step forward. For example, a signal may end up entering a gate during one step, but the gate won't show a different signal until the next simulation step. To help identify which points in the overall circuit have changed, any points whose values change are indicated with a blue circle; if a subcircuit contains any points that have changed in it (or its subcircuits, recursively), then it will be drawn with a blue outline.

    Go Out To State

    When you delve into a subcircuit's state via its pop-up menu, the Go Out To State submenu lists the circuits above the currently viewed circuit's state. Selecting one displays the corresponding circuit.

    Go In To State

    If you have delved into a subcircuit's state and then moved back out, this submenu lists the subcircuits below the current circuit. Selecting one of the circuits displays the corresponding circuit.

    Tick Once

    Steps one tick forward into the simulation. This can be useful when you want to step the clocks manually, particularly when the clock is not in the same circuit that you are currently viewing.

    Ticks Enabled

    Starts automatically ticking the clock. This will have an effect only if the circuit contains any clock devices (in the Wiring library). The option is disabled by default.

    Tick Frequency

    Allows you to select how often ticks occur. For example, 8 Hz means that ticks will occur eight times a second. A tick is the base unit of measurement for the speed of clocks.

    Note that the clock cycle speed will be slower than the tick speed: The fastest possible clock will have a one-tick up cycle and a one-tick down cycle; such a clock would have up/down cycle rate of 4 Hz if the ticks occur at 8 Hz.

    Logging...

    Enters the logging module, which facilitates automatically noting and saving values in a circuit as a simulation progresses.

    Next: The Window and Help menus.

    logisim-2.7.1/doc/en/html/guide/menu/project.html0000644000175000017500000001250711541757130021603 0ustar vincentvincent The Project menu

    The Project menu

    Add Circuit...

    Adds a new circuit into the current project. Logisim will insist that you name the new circuit. The name must not match any existing circuits in the project.

    Load Library

    Loads a library into the project. You can load three types of libraries, as explained elsewhere in the User's Guide.

    Unload Libraries...

    Unloads current libraries from the project. Logisim will not permit you to unload any libraries currently being used, including libraries containing components appearing in any project circuits, as well as those with tools that appear in the toolbar or that are mapped to the mouse.

    Move Circuit Up

    Moves the currently displayed circuit one step up the list of circuits within the project, as displayed in the explorer pane.

    Move Circuit Down

    Moves the currently displayed circuit one step down the list of circuits within the project, as displayed in the explorer pane.

    Set As Main Circuit

    Sets the currently displayed circuit to be the project's main circuit. (This menu item will be grayed out if the current circuit is already the project's main circuit.) The only significance of the main circuit is that it is the circuit that first appears when a project file is opened.

    Revert To Default Appearance

    If you've edited the circuit's appearance, this menu item reverts the appearance back to the default rectangle-with-notch appearance. The menu item is enabled only when editing the circuit's appearance.

    View Toolbox

    Changes the explorer pane to displaying a list of the project's circuits and the libraries that have been loaded.

    View Simulation Tree

    Changes the explorer pane to displaying the hierarchy of subcircuits in the current simulation.

    Edit Circuit Layout

    Switches to allow you to edit the layout of components, which determines how the circuit works. This menu item is usually disabled since you will usually be editing the layout anyway.

    Edit Circuit Appearance

    Switches to allow you to edit how the circuit will be represented when it is used as a subcircuit within another circuit. By default, the circuit is represented as a rectangle with a gray notch on its north end, but this menu option allows you to draw a different appearance for the subcircuit.

    Remove Circuit

    Removes the currently displayed circuit from the project. Logisim will prevent you from removing circuits that are used as subcircuits, and it will prevent you from removing the final circuit in a project.

    Analyze Circuit

    Computes a truth table and Boolean expressions corresponding to the current circuit, displaying them in the Combinational Analysis window. The analysis process will only be valid for combinational circuits. A full description of the analysis process is described in the Combinational Analysis section.

    Get Circuit Statistics

    Shows a dialog containing statistics about components used by the currently viewed circuit. The dialog includes a table with five columns:

    • Component: The name of the component.
    • Library: The name of the library from which the component came.
    • Simple: The number of times that component appears directly within the viewed circuit.
    • Unique: The number of times that component appears in the circuit's hierarchy, where each subcircuit within the hierarchy is counted only once.
    • Recursive: The number of times that component appears in the circuit's hierarchy, where we count each subcircuit as many times as it appears in the hierarchy.

    The distinction between Unique and Recursive is easiest to explain by considering the 4:1 multiplexer built using three 2:1 multiplexers as in the Using subcircuits section. The 2:1 multiplexer contains two AND gates (and the 4:1 circuit includes none), so the Unique count of AND gates would be 2; but if you were to build the 4:1 multiplexer using this diagram, you would actually need 2 AND gates for each of the three 2:1 multiplexers, so the Recursive count is 6.

    If you are using circuits from a loaded Logisim library, those components are considered to be black boxes: The contents of the library's circuits are not included in the unique and recursive counts.

    Options...

    Opens the Project Options window.

    Next: The Simulate menu.

    logisim-2.7.1/doc/en/html/guide/menu/index.html0000644000175000017500000000163111541757130021240 0ustar vincentvincent Menu Reference

    Menu Reference

    This section explains the six menus that accompany every major Logisim window.

    The File menu
    The Edit menu
    The Project menu
    The Simulate menu
    The Window and Help menus
    Many menu items relate specifically to a currently opened project. But some Logisim windows (particularly the Combinational Analysis window and the Application Preferences window) are not associated with projects. For these windows, the project-specific menu items will be disabled.

    Next: The File menu.

    logisim-2.7.1/doc/en/html/guide/menu/file.html0000644000175000017500000001021011541757130021041 0ustar vincentvincent The File menu

    The File menu

    New

    Opens a new project in a new window. The project will initially be a copy of the currently selected template.

    Open...

    Opens an existing file as a project in a new window.

    Open Recent

    Opens a recently opened project in a new window without prompting the user to navigate through a file selection dialog.

    Close

    Closes all windows associated with the currently viewed project.

    Save

    Saves the currently viewed project, overwriting what was previously in the file.

    Save As...

    Saves the currently viewed project, prompting the user to save into a different file than before.

    Export Image...

    Creates image file(s) corresponding to circuits. The configuration dialog box is described below.

    Print...

    Sends circuit(s) to a printer. The configuration dialog box is described below.

    Preferences...

    Displays the application preferences window. (On Mac OS systems, this will appear in the Logisim menu.)

    Exit

    Closes all currently open projects and terminates Logisim. (On Mac OS systems, this will appear as Quit in the Logisim menu.)

    Configuring Export

    When you select Export Image..., Logisim displays a dialog box with four options.

    • Circuits: A list where you can select one or more circuits that should be exported into image files. (Empty circuits are not displayed as options.)
    • Image Format: You can create PNG, GIF, and JPEG files. I would recommend PNG files: The GIF format is quite dated, and the JPEG format will introduce artifacts into the image, as the JPEG format is really meant for photographic images.
    • Scale Factor: You can scale the images as they are dumped into image files using this slider.
    • Printer View: Whether to use "printer view" in exporting the circuits.

    After clicking OK, Logisim will display a file selection dialog box. If you have selected one circuit, select the file into which the image should be placed. If you have selected multiple circuits, select a directory where the files should be placed; Logisim will name the images based on the circuits' names (main.png, for example).

    Configuring Print

    When you choose Print..., Logisim displays a dialog box for configuring what is printed.

    • Circuits: A list where you can select one or more circuits to be printed. (Empty circuits are not displayed as options.) Logisim will print one circuit per page. If the circuit is too large for the page, the image will be scaled down to fit.
    • Header: Text that should appear centered at the top of each page. The following substitutions will be made into the text.
      %nName of circuit on page
      %pPage number
      %PTotal page count
      %%A single percent sign ('%')
    • Rotate To Fit: If checked, then Logisim will rotate each circuit by 90 degrees when the circuit is too large to fit onto the page and it does not need to be scaled as small when rotated 90 degrees.
    • Printer View: Whether to use "printer view" in printing the circuits.

    After clicking OK, Logisim will display the standard page setup dialog box before printing the circuits.

    Next: The Edit menu.

    logisim-2.7.1/doc/en/html/guide/menu/edit.html0000644000175000017500000001162511541757130021062 0ustar vincentvincent The Edit menu

    The Edit menu

    Undo XX

    Undoes the most recently completed action affecting how the circuit would be saved in a file. Note that this does not include changes to the circuit state (as with manipulations performed by the Poke Tool).

    Cut

    Removes the currently selected components from the circuit onto Logisim's clipboard.

    Note: Logisim's clipboard is maintained separately from the clipboard for the overall system; as a result, cut/copy/paste will not work across different applications, even including other running copies of Logisim. If, however, you have multiple projects open under the same Logisim process, then you should be able to cut/copy/paste between them.

    Copy

    Copies the currently selected components in the circuit onto Logisim's clipboard. (See the note under the Cut menu item.)

    Paste

    Pastes the components on Logisim's clipboard into the current selection. (See the note under the Cut menu item.)

    When you paste components, they will not immediately be dropped; instead, they will be drawn in light gray. They will not actually be ``dropped'' into the circuit until you either move the selection or change the selection so that the components are no longer in it.

    The reason for this odd behavior is this: To be consistent with its other behavior, Logisim must immediately merge any wires as soon as they are dropped into a circuit; this merging process changes existing wires in the circuit. When you paste wires from the clipboard, however, you may want them to appear in a different location, and the changing inherent in the merging process would be against your wishes.

    Delete

    Removes all components in the current selection from the circuit, without modifying the clipboard.

    Duplicate

    Creates a copy of all components in the current selection. This is like selecting Copy, then Paste, except that Duplicate doesn't modify or use the clipboard.

    Select All

    Selects all components in the current circuit.

    Raise Selection

    This menu item is available only when editing a circuit's appearance. It raises the currently selected object(s) so that it is drawn (or they are drawn) on top of an object that currently overlaps the selection. If the selection is overlapped by several objects, it is raised only to be above the lowest one; select the menu item repeatedly until it is in the order it should be.

    (Determining whether two arbitrary objects overlap is difficult. Logisim uses an algorithm of selecting several random points in each of the two objects and seeing if any point is also in the other object. Sometimes it will fail to detect an overlap if the overlap is small — say, less than 5% of either of the objects.)

    Lower Selection

    This menu item is available only when editing a circuit's appearance. It lowers the currently selected object(s) so that it is drawn (or they are drawn) below an object that the selection currently overlaps. If the selection overlaps several objects, it is lowered only to be below the highest one; select the menu item repeatedly until it is in the order it should be.

    Raise To Top

    Available only when editing a circuit's appearance, this menu item raises the currently selected object(s) to be drawn on top of all other objects. (The anchor and the ports are exceptions — they are always on top.)

    Lower To Bottom

    Available only when editing a circuit's appearance, this menu item lowers the currently selected object(s) so that all other objects are drawn on top of them.

    Add Vertex

    Available only when editing a circuit's appearance and a point has been selected on a line, polyline, or polygon, this menu item inserts a new vertex onto the shape. Previous to insertion, the selected point is drawn as a diamond.

    Remove Vertex

    Available only when editing a circuit's appearance and an existing vertex has been selected on a polyline or polygon, this menu item removes the selected vertex. Previous to deletion, the selected vertex is drawn as a diamond within the square representing the vertex. Logisim will not permit removing a vertex on a polygon with only three vertices or on a polyline with only two vertices.

    Next: The Project menu.

    logisim-2.7.1/doc/en/html/guide/mem/0000755000175000017500000000000011541757130017054 5ustar vincentvincentlogisim-2.7.1/doc/en/html/guide/mem/poke.html0000644000175000017500000000324311541757130020702 0ustar vincentvincent Poking memory

    Poking memory

    You can manipulate the contents of memory using the Poke Tool, but the interface for this is severely limited by space constraints: For more than the simplest editing, you will probably find the integrated hex editor far more convenient.

    Nonetheless, to view and edit values within the circuit, the Poke Tool has two modes of operation: You can edit the address displayed, and you can edit an individual value.

    To edit the address displayed, click outside the display rectangle. Logisim will draw a red rectangle around the top address.

    • Typing hexadecimal digits will change the top address accordingly.

    • Typing the Enter key will scroll down one line.

    • Typing the Backspace key will scroll up one line.

    • Typing the space bar will scroll down one page (four lines).

    To edit a particular value, click the value within the display rectangle. Logisim will draw a red rectangle around that address.

    • Typing hexadecimal digits will change the value at the address currently being edited.

    • Typing the Enter key will move to editing the value just below it in the display (down one line).

    • Typing the Backspace key will move to editing the value at the previous address.

    • Typing the space bar will move to editing the value at the following address.

    Next: Pop-up menus and files.

    logisim-2.7.1/doc/en/html/guide/mem/menu.html0000644000175000017500000000375111541757130020714 0ustar vincentvincent Pop-up menus and files

    Pop-up menus and files

    The pop-up menu for memory includes four options in addition to the options common to all components:

    • Edit Contents: Bring up a hex editor for editing the contents of memory.
    • Clear Contents: Resets all values in memory to 0.
    • Load Image...: Resets all values in memory based on the values found in a file using the format described below.
    • Save Image...: Stores all values in memory into a file using the format described below.

    The file format used for image files is intentionally simple; this permits you to write a program, such as an assembler, that generates memory images that can then be loaded into memory. As an example of this file format, if we had a 256-byte memory whose first five bytes were 2, 3, 0, 20, and -1, and all subsequent values were 0, then the image would be the following text file.

    v2.0 raw
    02
    03
    00
    14
    ff
    

    The first line identifies the file format used (currently, there is only one file format recognized). Subsequent values list the values in hexadecimal, starting from address 0; you can place several such values on the same line. If there are more memory locations than are identified in the file, Logisim will load 0 into the other memory locations.

    The image file can use run-length encoding; for example, rather than list the value 00 sixteen times in a row, the file can include 16*00. Notice than the number of repetitions is written in base 10. Files produced by Logisim will use run-length encoding for runs of at least four values.

    You can place comments into the file by using the '#' symbol: All characters in the line starting from the '#' symbol will be ignored by Logisim.

    Next: Hex editor.

    logisim-2.7.1/doc/en/html/guide/mem/index.html0000644000175000017500000000165611541757130021061 0ustar vincentvincent Memory components

    Memory components

    The RAM and ROM components are two of the more useful components in Logisim's built-in libraries. However, because of the volume of information they can store, they are also two of the most complex components.

    Documentation about how they work within a circuit can be found on the RAM and ROM pages of the Library Reference. This section of the User's Guide explains the interface allowing the user to view and edit memory contents.

    Poking memory
    Pop-up menus and files
    Logisim's integrated hex editor

    Next: Poking memory.

    logisim-2.7.1/doc/en/html/guide/mem/hex.html0000644000175000017500000000276211541757130020535 0ustar vincentvincent Hex editor

    Hex editor

    Logisim includes an integrated hex editor for viewing and editing the contents of memory. To access it, bring up a pop-up menu for the memory component and select Edit Contents.... For ROM components, which have the memory contents as part of the attribute value, you can alternatively access the hex editor by clicking the corresponding attribute value.

    The numbers in italics at left display memory addresses, written in hexadecimal. The other numbers display values starting from that memory address; the hex editor may display four, eight, or sixteen values per line, depending on what fits in the window. To help with counting, each group of four values has a larger space between.

    You can navigate through memory using the scroll bar or using the keyboard (the arrow keys, home, end, page up, and page down). Typing hexadecimal characters will alter the currently selected value.

    You can select a range of values by dragging the mouse, shift-clicking the mouse, or navigating through memory with the keyboard while depressing the shift key. Values may be copied and pasted using the Edit menu; the clipboard can also be transferred into other applications.

    Next: User's Guide.

    logisim-2.7.1/doc/en/html/guide/log/0000755000175000017500000000000011541757130017057 5ustar vincentvincentlogisim-2.7.1/doc/en/html/guide/log/table.html0000644000175000017500000000150611541757130021036 0ustar vincentvincent The Table tab

    The Table tab

    The Table tab displays the current log graphically.

    The table contains a column for each component in the selection. Each row in the table displays a snapshot of the simulation after a propagation of values has completed. Any duplicate rows are not added into the log. Note that only the most recent 400 rows are displayed. Some rows may have empty entries if the corresponding component was not in the selection at the time that the row was computed.

    The displayed table is for review only; it is not interactive.

    Next: The File tab.

    logisim-2.7.1/doc/en/html/guide/log/selection.html0000644000175000017500000000442611541757130021740 0ustar vincentvincent The Selection tab

    The Selection tab

    The Selection tab allows you to select which values should be included in the log. The window below corresponds to the following circuit.



    The tab is divided into three vertical areas. The first (leftmost) is a list of all components in the circuit whose values can be logged. Among the built-in libraries, the following types of components support logging.

    Wiring library: Pin, Probe, and Clock components
    I/O library: Button and LED components
    Memory library: All components except ROM
    For components which have labels associated with them, their names correspond to the labels; other components' names specify their type and their location within the circuit. Any subcircuits will also appear in the list; they cannot be selected for logging, but eligible components within them can be. Note that the RAM component requires you to choose which memory address(es) should be logged; it allows logging only for the first 256 addresses.

    The last (rightmost) vertical area lists those components that have been selected. Also, it indicates the radix (base) in which the component's multi-bit values will be logged; the radix does not have a significant effect on one-bit values.

    The middle column of buttons allows the manipulation of the items within the selection.

    • Add adds the currently selected item(s) on the left side into the selection.
    • Change Radix cycles the radix for the currently selected component in the selection between 2 (binary), 10 (decimal), and 16 (hexadecimal).
    • Move Up moves the currently selected component in the selection forward one spot.
    • Move Down moves the currently selected component in the selection back one spot.
    • Remove removes the currently selected component in the selection.

    Next: The Table tab.

    logisim-2.7.1/doc/en/html/guide/log/index.html0000644000175000017500000000313111541757130021052 0ustar vincentvincent Logging

    Logging

    In testing a large circuit, and for documenting a circuit's behavior, a log of past circuit behavior can be useful. This is the purpose for Logisim's logging module, which allows you to select components whose values should be logged; optionally, you can specify a file into which the log should be placed.

    You can enter the logging module via the Logging... option from the Simulate menu. It brings up a window with three tabs.

    We will discuss each of these tabs separately.

    The Selection tab
    The Table tab
    The File tab

    Each project has only one logging window; when you switch to viewing another circuit within the project, the logging window switches automatically to logging the other circuit instead. That is, it does this unless you are moving up or down within the same simulation, in which case the logging module does not change.

    Note that when the logging module switches to logging another simulation, it will cease any logging into a file. Should you switch back to the simulation again, it will remember the configuration for that simulation, but you will need to re-enable the file logging manually.

    Next: The Selection tab.

    logisim-2.7.1/doc/en/html/guide/log/file.html0000644000175000017500000000422211541757130020664 0ustar vincentvincent The File tab

    The File tab

    The File tab allows you to specify a file into which the log should be placed.

    At the top is an indicator of whether file logging is in progress and a button for enabling or disabling it. (Note that you cannot enable it until a file is selected below.) The button allows you to pause and restart file entry. When you switch in the project window to viewing another simulation, the file logging is automatically halted; if you return to the original one and want logging to continue, you will need to re-enable the file logging manually using the button at top.

    In the middle is an indicator of what file is being logged to. To change it, use the Select... button. On selecting a file, file logging will automatically start. If you select a pre-existing file, Logisim will ask whether you want to overwrite the file or append the new entries onto the end.

    At bottom you can control whether a header line should be placed into the file indicating which items are in the selection. If header lines are added, then a new header line will be placed into the file whenever the selection changes.

    File format

    Entries are placed into the file in tab-delimited format corresponding closely to what appears under the Table tab. (One difference is that any header lines will give the full path to components lying in subcircuits.) The format is intentionally simple so that you can feed it into another program for processing, such as a Python/Perl script or a spreadsheet program.

    So that a script can process the file at the same time as Logisim is running, Logisim will flush the new records onto the disk every 500 ms. Note that Logisim may also intermittently close and later re-open the file during the simulation, particularly if several seconds have elapsed without any new records being added.

    Next: User's Guide.

    logisim-2.7.1/doc/en/html/guide/jar/0000755000175000017500000000000011541757130017052 5ustar vincentvincentlogisim-2.7.1/doc/en/html/guide/jar/simpctr.html0000644000175000017500000001571111541757130021426 0ustar vincentvincent Simple Gray Code Counter

    Simple Gray Code Counter

    Often we want components that aren't exclusively combinational in nature - that is, we want the component to have some memory. There is an important subtlety in defining such components: You can't have the component itself store the state, because an individual component can appear many times in the same circuit. It can't appear directly within a circuit multiple times, but it can appear multiple times if it appears in a subcircuit that is used several times.

    The solution is to create a new class for representing the object's current state, and to associate instances of this with the component through the parent circuit's state. In this example, which implements an edge-triggered 4-bit Gray code counter, we define a CounterData class to represent the counter's state, in addition to the InstanceFactory subclass as illustrated previously. The CounterData object remembers both the counter's current value, as well as the last clock input seen (to detect rising edges).

    CounterData

    package com.cburch.gray;
    
    import com.cburch.logisim.data.BitWidth;
    import com.cburch.logisim.data.Value;
    import com.cburch.logisim.instance.InstanceData;
    import com.cburch.logisim.instance.InstanceState;
    
    /** Represents the state of a counter. */
    class CounterData implements InstanceData, Cloneable {
        /** Retrieves the state associated with this counter in the circuit state,
         * generating the state if necessary.
         */
        public static CounterData get(InstanceState state, BitWidth width) {
            CounterData ret = (CounterData) state.getData();
            if(ret == 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.
                ret = new CounterData(null, Value.createKnown(width, 0));
                state.setData(ret);
            } else if(!ret.value.getBitWidth().equals(width)) {
                ret.value = ret.value.extendWidth(width.getWidth(), Value.FALSE);
            }
            return ret;
        }
    
        /** 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 CounterData(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; }
        }
        
        /** Updates the last clock observed, returning true if triggered. */
        public boolean updateClock(Value value) {
            Value old = lastClock;
            lastClock = value;
            return old == Value.FALSE && value == Value.TRUE;
        }
        
        /** 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;
        }
    }
    

    SimpleCounter

    package com.cburch.gray;
    
    import com.cburch.logisim.data.BitWidth;
    import com.cburch.logisim.data.Bounds;
    import com.cburch.logisim.data.Direction;
    import com.cburch.logisim.instance.InstanceFactory;
    import com.cburch.logisim.instance.InstancePainter;
    import com.cburch.logisim.instance.InstanceState;
    import com.cburch.logisim.instance.Port;
    import com.cburch.logisim.util.GraphicsUtil;
    import com.cburch.logisim.util.StringUtil;
    
    /** Manufactures a simple counter that iterates over the 4-bit Gray Code. This
     * example illustrates how a component can maintain its own internal state. All
     * of the code relevant to state, though, appears in CounterData class. */
    class SimpleGrayCounter extends InstanceFactory {
        private static final BitWidth BIT_WIDTH = BitWidth.create(4);
        
        // Again, notice how we don't have any instance variables related to an
        // individual instance's state. We can't put that here, because only one
        // SimpleGrayCounter object is ever created, and its job is to manage all
        // instances that appear in any circuits.
        
        public SimpleGrayCounter() {
            super("Gray Counter (Simple)");
            setOffsetBounds(Bounds.create(-30, -15, 30, 30));
            setPorts(new Port[] {
                    new Port(-30, 0, Port.INPUT, 1),
                    new Port(  0, 0, Port.OUTPUT, BIT_WIDTH.getWidth()),
            });
        }
    
        public void propagate(InstanceState state) {
            // Here I retrieve the state associated with this component via a helper
            // method. In this case, the state is in a CounterData object, which is
            // also where the helper method is defined. This helper method will end
            // up creating a CounterData object if one doesn't already exist.
            CounterData cur = CounterData.get(state, BIT_WIDTH);
    
            boolean trigger = cur.updateClock(state.getPort(0));
            if(trigger) cur.setValue(GrayIncrementer.nextGray(cur.getValue()));
            state.setPort(1, cur.getValue(), 9);
            
            // (You might be tempted to determine the counter's current value
            // via state.getPort(1). This is erroneous, though, because another
            // component may be pushing a value onto the same point, which would
            // "corrupt" the value found there. We really do need to store the
            // current value in the instance.)
        }
    
        public void paintInstance(InstancePainter painter) {
            painter.drawBounds();
            painter.drawClock(0, Direction.EAST); // draw a triangle on port 0
            painter.drawPort(1); // draw port 1 as just a dot
            
            // Display the current counter value centered within the rectangle.
            // However, if the context says not to show state (as when generating
            // printer output), then skip this.
            if(painter.getShowState()) {
                CounterData state = CounterData.get(painter, BIT_WIDTH);
                Bounds bds = painter.getBounds();
                GraphicsUtil.drawCenteredText(painter.getGraphics(),
                        StringUtil.toHexString(BIT_WIDTH.getWidth(), state.getValue().toIntValue()),
                        bds.getX() + bds.getWidth() / 2,
                        bds.getY() + bds.getHeight() / 2);
            }
        }
    }
    

    Next: Gray Code Counter.

    logisim-2.7.1/doc/en/html/guide/jar/library.html0000644000175000017500000000375711541757130021420 0ustar vincentvincent Library Class

    Library Class

    The access point for the JAR library is a class that extends the Library class. The library's main job is to list the tools that are available through the library; most often, the tools are all tools to add the various components defined - that is, instances of the AddTool class working with different component factories.

    Components

    package com.cburch.gray;
    
    import java.util.Arrays;
    import java.util.List;
    
    import com.cburch.logisim.tools.AddTool;
    import com.cburch.logisim.tools.Library;
    
    /** 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 components; practically speaking, though, you'll most often want
         * to create AddTools for new components that can be added into the circuit.
         */
        private List<AddTool> 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 AddTool[] {
                    new AddTool(new GrayIncrementer()),
                    new AddTool(new SimpleGrayCounter()),
                    new AddTool(new GrayCounter()),
            });
        }
        
        /** Returns the name of the library that the user will see. */ 
        public String getDisplayName() {
            return "Gray Tools";
        }
        
        /** Returns a list of all the tools available in this library. */
        public List<AddTool> getTools() {
            return tools;
        }
    }
    

    Next: Simple Gray Code Counter.

    logisim-2.7.1/doc/en/html/guide/jar/index.html0000644000175000017500000001031611541757130021050 0ustar vincentvincent JAR Libraries

    JAR Libraries

    Using JAR libraries

    Logisim has two types of circuit components: those that are designed within Logisim as combinations of components, and those primitive components that are written in Java. Logisim circuits are easier to design, but they cannot support sophisticated user interaction, and they are relatively inefficient.

    Logisim contains a fairly thorough collection of built-in libraries of Java components, but it can also load additional libraries written by you or others. Once you have downloaded a library, you can import it into your project by right-clicking the project in the explorer pane (the top line) and choosing Load Library > JAR Library.... Then, Logisim will prompt you to select the JAR file. (In some circumstances, you may have to type the starting class name when prompted, which would be provided by the library developer. However, a developer typically configures the JAR library to avoid this (by including a manifest file in the JAR with a Library-Class attribute specifying the main class name).)

    Creating JAR libraries

    The remainder of this section is dedicated to a series of thoroughly commented examples illustrating how to develop Logisim libraries yourself. You should only attempt this if you're an experienced Java programmer. You will find the documentation beyond these examples fairly meager.

    You can download a JAR file that allows these examples to be imported into Logisim via the Logisim Web site's Links section. That JAR file also contains the source code contained in these examples.

    Gray Code Incrementer

    Illustrates the essential components of any component type using a simple example of a component that takes a multibit input and computes the next Gray code value following it.

    Library Class

    Illustrates how to define a library. This is the entry point for any JAR file - the class whose name the user enters when loading the JAR library.

    Simple Gray Code Counter

    Illustrates how to make a component that has internal state, in particular an 8-bit counter that iterates through Gray codes.

    Gray Code Counter

    Demonstrates a complete, fairly sophisticated component with which the user can interact. It implements a Gray code counter where the number of bits remembered is customizable, and where the user can edit the current value by clicking on it with the Poke Tool and typing a value.

    Guidelines
    General information for those developing third-party libraries.

    License

    The code in this example JAR library is released under the MIT license, a more permissive license than the GPL, under which the rest of Logisim is released.

    Copyright (c) 2009, Carl Burch.

    Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

    The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

    Next: Gray Code Incrementer.

    logisim-2.7.1/doc/en/html/guide/jar/incr.html0000644000175000017500000002201511541757130020673 0ustar vincentvincent Gray Code Incrementer

    Gray Code Incrementer

    Each component included in a library is defined by creating a subclass of InstanceFactory found in the com.cburch.logisim.instance package. This subclass has all the code involved

    (Here we're describing the API for the current version of Logisim. You may find some libraries developed for older versions of Logisim, in which components were developed by defining two classes, one extending Component and another extending ComponentFactory. Version 2.3.0 introduced the much simpler InstanceFactory API; the older technique is deprecated.)

    Three Logisim packages define most of the classes relevant to defining component libraries.

    com.cburch.logisim.instance

    Contains classes specifically related to defining components, including the InstanceFactory, InstanceState, InstancePainter, and Instance classes.

    com.cburch.logisim.data

    Contains classes related to data elements associated with components, such as the Bounds class for representing bounding rectangles or the Value class for representing values that can exist on a wire.

    com.cburch.logisim.tools

    Contains classes related to the library definition.

    About Gray codes

    Before we go on, let me briefly describe the Gray code on which these examples are based. It's not really important to understanding how these examples work, so you can safely skip to the code below if you wish - particularly if you already know Gray codes.

    Gray code is a technique (named after Frank Gray) for iterating through n-bit sequences with only one bit changed for each step. As an example, consider the 4-bit Gray code listed below.

    0000
    0001
    0011
    0010
           0110
    0111
    0101
    0100
           1100
    1101
    1111
    1110
           1010
    1011
    1001
    1000

    Each value has the bit underlined that will change for the next value in the sequence. For example, after 0000 comes 0001, in which the final bit has been toggled, so the final bit is underlined.

    Logisim's built-in components don't include anything working with Gray codes. But electronics designers find Gray codes useful sometimes. One particularly notable instance of Gray codes is along the axes in Karnaugh maps.

    GrayIncrementer

    This is a minimal example illustrating the essential elements to defining a component. This particular component is an incrementer, which takes an multibit input and produces the next Gray code following it in sequence.

    package com.cburch.gray;
    
    import com.cburch.logisim.data.Attribute;
    import com.cburch.logisim.data.BitWidth;
    import com.cburch.logisim.data.Bounds;
    import com.cburch.logisim.data.Value;
    import com.cburch.logisim.instance.InstanceFactory;
    import com.cburch.logisim.instance.InstancePainter;
    import com.cburch.logisim.instance.InstanceState;
    import com.cburch.logisim.instance.Port;
    import com.cburch.logisim.instance.StdAttr;
    
    /** This component takes a multibit input and outputs the value that follows it
     * in Gray Code. For instance, given input 0100 the output is 1100. */
    class GrayIncrementer extends InstanceFactory {
        /* Note that there are no instance variables. There is only one instance of
         * this class created, which manages all instances of the component. Any
         * information associated with individual instances should be handled
         * through attributes. For GrayIncrementer, each instance has a "bit width"
         * that it works with, and so we'll have an attribute. */
    
        /** The constructor configures the factory. */
        GrayIncrementer() {
            super("Gray Code Incrementer");
            
            /* This is how we can set up the attributes for GrayIncrementers. In
             * this case, there is just one attribute - the width - whose default
             * is 4. The StdAttr class defines several commonly occurring
             * attributes, including one for "bit width." It's best to use those
             * StdAttr attributes when appropriate: A user can then select several
             * components (even from differing factories) with the same attribute
             * and modify them all at once. */
            setAttributes(new Attribute[] { StdAttr.WIDTH },
                    new Object[] { BitWidth.create(4) });
            
            /* The "offset bounds" is the location of the bounding rectangle
             * relative to the mouse location. Here, we're choosing the component to
             * be 30x30, and we're anchoring it relative to its primary output
             * (as is typical for Logisim), which happens to be in the center of the
             * east edge. Thus, the top left corner of the bounding box is 30 pixels
             * west and 15 pixels north of the mouse location. */
            setOffsetBounds(Bounds.create(-30, -15, 30, 30));
            
            /* The ports are locations where wires can be connected to this
             * component. Each port object says where to find the port relative to
             * the component's anchor location, then whether the port is an
             * input/output/both, and finally the expected bit width for the port.
             * The bit width can be a constant (like 1) or an attribute (as here).
             */
            setPorts(new Port[] {
                    new Port(-30, 0, Port.INPUT, StdAttr.WIDTH),
                    new Port(0, 0, Port.OUTPUT, StdAttr.WIDTH),
                });
        }
    
        /** Computes the current output for this component. This method is invoked
         * any time any of the inputs change their values; it may also be invoked in
         * other circumstances, even if there is no reason to expect it to change
         * anything. */
        public void propagate(InstanceState state) {
            // First we retrieve the value being fed into the input. Note that in
            // the setPorts invocation above, the component's input was included at
            // index 0 in the parameter array, so we use 0 as the parameter below.
            Value in = state.getPort(0);
            
            // Now compute the output. We've farmed this out to a helper method,
            // since the same logic is needed for the library's other components.
            Value out = nextGray(in);
            
            // Finally we propagate the output into the circuit. The first parameter
            // is 1 because in our list of ports (configured by invocation of
            // setPorts above) the output is at index 1. The second parameter is the
            // value we want to send on that port. And the last parameter is its
            // "delay" - the number of steps it will take for the output to update
            // after its input.
            state.setPort(1, out, out.getWidth() + 1);
        }
    
        /** Says how an individual instance should appear on the canvas. */
        public void paintInstance(InstancePainter painter) {
            // As it happens, InstancePainter contains several convenience methods
            // for drawing, and we'll use those here. Frequently, you'd want to
            // retrieve its Graphics object (painter.getGraphics) so you can draw
            // directly onto the canvas.
            painter.drawRectangle(painter.getBounds(), "G+1");
            painter.drawPorts();
        }
        
        /** Computes the next gray value in the sequence after prev. This static
         * method just does some bit twiddling; it doesn't have much to do with
         * Logisim except that it manipulates Value and BitWidth objects. */
        static Value nextGray(Value prev) {
            BitWidth bits = prev.getBitWidth();
            if(!prev.isFullyDefined()) return Value.createError(bits);
            int x = prev.toIntValue();
            int ct = (x >> 16) ^ x; // compute parity of x
            ct = (ct >> 8) ^ ct;
            ct = (ct >> 4) ^ ct;
            ct = (ct >> 2) ^ ct;
            ct = (ct >> 1) ^ ct;
            if((ct & 1) == 0) { // if parity is even, flip 1's bit
                x = x ^ 1;
            } else { // else flip bit just above last 1
                int y = x ^ (x & (x - 1)); // first compute the last 1
                y = (y << 1) & bits.getMask();
                x = (y == 0 ? 0 : x ^ y);
            }
            return Value.createKnown(bits, x);
        }
    }
    

    This example by itself is not enough to create a working JAR file; you must also provide a Library class, as illustrated on the next page.

    Next: Library Class.

    logisim-2.7.1/doc/en/html/guide/jar/guide.html0000644000175000017500000000325711541757130021044 0ustar vincentvincent Guidelines

    Guidelines

    Learning more

    Beyond the sequence of examples provided here, the Logisim source code provides copious additional examples, though they do not always illustrate the same attention to readability and good design.

    For maximum portability to future versions, you should stick as much as possible to the classes in the ...instance, ...data, and ...tools packages. Of course, you may use other packages' APIs, but they are more vulnerable to changes in future versions of Logisim.

    I am generally willing to answer occasional requests for help. And bug reports and suggestions for improvements, of course, are always welcome.

    Distribution

    You are free to distribute any JARs you develop without restriction. The GPL restrictions do apply, however, if portions of your work are derived from portions of Logisim source code (released under the GPL). Deriving from the example code in this section of the User's Guide does not incur such restrictions; these examples are released under the MIT license.

    If you would like to share your library with other Logisim users, I will be happy to provide a link to a hosting Web page or the JAR file itself through the Logisim Web site. If you think your library should be built into the basic Logisim release, then I welcome your suggestion, and I'll be happy to acknowledge your contribution in Logisim releases including the work.

    Next: User's Guide.

    logisim-2.7.1/doc/en/html/guide/jar/counter.html0000644000175000017500000001741711541757130021431 0ustar vincentvincent Gray Code Counter

    Gray Code Counter

    This orientation to the Logisim libraries concludes with a fairly sophisticated Gray code counter that allows the user to alter its current value using the Poke Tool and to place a label on the component using the Text Tool. It also customizes the icon that appears in the explorer, associated with the tool.

    GrayCounter

    package com.cburch.gray;
    
    import java.net.URL;
    
    import javax.swing.ImageIcon;
    
    import com.cburch.logisim.data.Attribute;
    import com.cburch.logisim.data.BitWidth;
    import com.cburch.logisim.data.Bounds;
    import com.cburch.logisim.data.Direction;
    import com.cburch.logisim.instance.Instance;
    import com.cburch.logisim.instance.InstanceFactory;
    import com.cburch.logisim.instance.InstancePainter;
    import com.cburch.logisim.instance.InstanceState;
    import com.cburch.logisim.instance.Port;
    import com.cburch.logisim.instance.StdAttr;
    import com.cburch.logisim.util.GraphicsUtil;
    import com.cburch.logisim.util.StringUtil;
    
    /** Manufactures a counter that iterates over Gray codes. This demonstrates
     * several additional features beyond the SimpleGrayCounter class. */
    class GrayCounter extends InstanceFactory {
        public GrayCounter() {
            super("Gray Counter");
            setOffsetBounds(Bounds.create(-30, -15, 30, 30));
            setPorts(new Port[] {
                    new Port(-30, 0, Port.INPUT, 1),
                    new Port(  0, 0, Port.OUTPUT, StdAttr.WIDTH),
            });
            
            // We'll have width, label, and label font attributes. The latter two
            // attributes allow us to associate a label with the component (though
            // we'll also need configureNewInstance to configure the label's
            // location).
            setAttributes(
                    new Attribute[] { StdAttr.WIDTH, StdAttr.LABEL, StdAttr.LABEL_FONT },
                    new Object[] { BitWidth.create(4), "", StdAttr.DEFAULT_LABEL_FONT });
            
            // The following method invocation sets things up so that the instance's
            // state can be manipulated using the Poke Tool.
            setInstancePoker(CounterPoker.class);
            
            // These next two lines set it up so that the explorer window shows a
            // customized icon representing the component type. This should be a
            // 16x16 image.
            URL url = getClass().getClassLoader().getResource("com/cburch/gray/counter.gif");
            if(url != null) setIcon(new ImageIcon(url));
        }
        
        /** The configureNewInstance method is invoked every time a new instance
         * is created. In the superclass, the method doesn't do anything, since
         * the new instance is pretty thoroughly configured already by default. But
         * sometimes you need to do something particular to each instance, so you
         * would override the method. In this case, we need to set up the location
         * for its label. */
        protected void configureNewInstance(Instance instance) {
            Bounds bds = instance.getBounds();
            instance.setTextField(StdAttr.LABEL, StdAttr.LABEL_FONT,
                    bds.getX() + bds.getWidth() / 2, bds.getY() - 3,
                    GraphicsUtil.H_CENTER, GraphicsUtil.V_BASELINE);
        }
    
        public void propagate(InstanceState state) {
            // This is the same as with SimpleGrayCounter, except that we use the
            // StdAttr.WIDTH attribute to determine the bit width to work with.
            BitWidth width = state.getAttributeValue(StdAttr.WIDTH);
            CounterData cur = CounterData.get(state, width);
            boolean trigger = cur.updateClock(state.getPort(0));
            if(trigger) cur.setValue(GrayIncrementer.nextGray(cur.getValue()));
            state.setPort(1, cur.getValue(), 9);
        }
    
        public void paintInstance(InstancePainter painter) {
            // This is essentially the same as with SimpleGrayCounter, except for
            // the invocation of painter.drawLabel to make the label be drawn.
            painter.drawBounds();
            painter.drawClock(0, Direction.EAST);
            painter.drawPort(1);
            painter.drawLabel();
            
            if(painter.getShowState()) {
                BitWidth width = painter.getAttributeValue(StdAttr.WIDTH);
                CounterData state = CounterData.get(painter, width);
                Bounds bds = painter.getBounds();
                GraphicsUtil.drawCenteredText(painter.getGraphics(),
                        StringUtil.toHexString(width.getWidth(), state.getValue().toIntValue()),
                        bds.getX() + bds.getWidth() / 2,
                        bds.getY() + bds.getHeight() / 2);
            }
        }
    }
    

    CounterPoker

    package com.cburch.gray;
    
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.event.KeyEvent;
    import java.awt.event.MouseEvent;
    
    import com.cburch.logisim.data.BitWidth;
    import com.cburch.logisim.data.Bounds;
    import com.cburch.logisim.data.Value;
    import com.cburch.logisim.instance.InstancePainter;
    import com.cburch.logisim.instance.InstancePoker;
    import com.cburch.logisim.instance.InstanceState;
    import com.cburch.logisim.instance.StdAttr;
    
    /** When the user clicks a counter using the Poke Tool, a CounterPoker object
     * is created, and that object will handle all user events. Note that
     * CounterPoker is a class specific to GrayCounter, and that it must be a
     * subclass of InstancePoker in the com.cburch.logisim.instance package. */
    public class CounterPoker extends InstancePoker {
        public CounterPoker() { }
    
        /** Determines whether the location the mouse was pressed should result
         * in initiating a poke. 
         */
        public boolean init(InstanceState state, MouseEvent e) {
            return state.getInstance().getBounds().contains(e.getX(), e.getY());
                // Anywhere in the main rectangle initiates the poke. The user might
                // have clicked within a label, but that will be outside the bounds.
        }
    
        /** Draws an indicator that the caret is being selected. Here, we'll draw
         * a red rectangle around the value. */
        public void paint(InstancePainter painter) {
            Bounds bds = painter.getBounds();
            BitWidth width = painter.getAttributeValue(StdAttr.WIDTH);
            int len = (width.getWidth() + 3) / 4;
    
            Graphics g = painter.getGraphics();
            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(InstanceState state, KeyEvent e) {
            // convert it to a hex digit; if it isn't a hex digit, abort.
            int val = Character.digit(e.getKeyChar(), 16);
            BitWidth width = state.getAttributeValue(StdAttr.WIDTH);
            if(val < 0 || (val & width.getMask()) != val) return;
    
            // compute the next value
            CounterData cur = CounterData.get(state, width);
            int newVal = (cur.getValue().toIntValue() * 16 + val) & width.getMask();
            Value newValue = Value.createKnown(width, newVal);
            cur.setValue(newValue);
            state.fireInvalidated();
            
            // You might be tempted to propagate the value immediately here, using
            // state.setPort. However, the circuit may currently be propagating in
            // another thread, and invoking setPort directly could interfere with
            // that. Using fireInvalidated notifies the propagation thread to
            // invoke propagate on the counter at its next opportunity.
        }
    }
    

    Next: Guidelines.

    logisim-2.7.1/doc/en/html/guide/index.html0000644000175000017500000000452611541757130020302 0ustar vincentvincent The Guide to Being a Logisim User

    The Guide to Being a Logisim User

    Logisim is an educational tool for designing and simulating digital logic circuits. With its simple toolbar interface and simulation of circuits as they are built, it is simple enough to facilitate learning the most basic concepts related to logic circuits. With the capacity to build larger circuits from smaller subcircuits, and to draw bundles of wires with a single mouse drag, Logisim can be used (and is used) to design and simulate entire CPUs for educational purposes.

    Students at colleges and universities around the world use Logisim for a variety of purposes, including:

    • A module in general-education computer science surveys
    • A unit in sophomore-level computer organization courses
    • Over a full semester in upper-division computer architecture courses

    The Guide to Being a Logisim User, which you are reading now, is the official reference for Logisim's features. Its first part is a sequence of sections introducing the major parts of Logisim. These sections are written so that they can be read "cover to cover" to learn about all of the most important features of Logisim.

    Beginner's tutorial
    Libraries and attributes
    Subcircuits
    Wire bundles
    Combinational analysis

    The remaining sections are a motley bunch of reference materials and explanations of some of the lesser corners of Logisim.

    Menu reference
    Memory components
    Logging
    Command-line verification
    Application preferences
    Project options
    Value propagation
    JAR libraries
    About the program
    logisim-2.7.1/doc/en/html/guide/bundles/0000755000175000017500000000000011541757130017732 5ustar vincentvincentlogisim-2.7.1/doc/en/html/guide/bundles/splitting.html0000644000175000017500000000543111541757130022640 0ustar vincentvincent Splitters

    Splitters

    When you work with multi-bit values, you will often want to route different bits in different directions. The Wiring library's splitter tool () allows you to accomplish this.

    For example, suppose we want a circuit that computes the bitwise AND of the two nibbles of its eight-bit input (the upper four bits and the lower four bits). We will have an eight-bit value coming from the input pin, and we want to split that into two four-bit values. In the below circuit, we have used a splitter to accomplish this: The 8-bit input comes into the splitter, which divides the 8 bits into two 4-bit values, which are then fed into the AND gate and from there to the output.

    In this example, the splitter splits an incoming value into multiple outgoing values. But splitters can also work the other way: It can combine multiple values into a single value. In fact, they are non-directional: They can send values one way at one time and another way later, and they can even do both at the same time, as in the below example where a value travels eastward through the two splitters, then is routed back westward through them again, and then back eastward where it finally reaches its output.

    The key to understanding splitters is their attributes. In the following, the term split end refers to one of the multiple wires on one side, while the term combined end refers to the single wire on the other side.

    • The Facing attribute tells where the split ends should be relative to the combined end.
    • The Fan Out attribute specifies how many split ends there are.
    • The Bit Width In attribute specifies the bit width of the combined end.
    • The Bit x attribute says which split end corresponds to bit x of the combined end. If multiple bits correspond to the same split end, then their relative ordering will be the same as in the combined end. Logisim splitters cannot have a bit from the combined end correspond to multiple split ends.

    Note that any change to the Fan Out or Bit Width In attributes will reset all Bit x attributes so that they will distribute the bits of the combined value as evenly as possible among the split ends.

    Next: Wire colors.

    logisim-2.7.1/doc/en/html/guide/bundles/index.html0000644000175000017500000000113511541757130021727 0ustar vincentvincent Wire bundles

    Wire bundles

    In simple Logisim circuits, most wires carry only one bit; but Logisim also allows you to create wires that bundle together multiple bits. The number of bits traveling along a wire is that wire's bit width.

    Creating bundles
    Splitters
    Wire colors

    Next: Creating bundles.

    logisim-2.7.1/doc/en/html/guide/bundles/creating.html0000644000175000017500000000426511541757130022423 0ustar vincentvincent Creating bundles

    Creating bundles

    Every input and output on every component in the circuit has a bit width associated with it. Often the bit width is 1, and there is no way of changing that, but many of Logisim's built-in components include attributes allowing you to customize the bit widths of their inputs and outputs.

    The below screen shot illustrates a simple circuit for finding the bitwise AND of two three-bit inputs. Notice how the three-bit output is the bitwise AND of the two inputs. All components have been customized to deal with three-bit data via its Data Bits attribute; the screen shot shows the AND gate attributes, including the Data Bits attribute of 3.

    All components in Logisim define a bit width for each of input and output. In contrast, a wire's bit width is undefined: Instead, the wire's width adapts to the components to which it is attached. If a wire connects two components demanding different bit widths, Logisim will complain of "Incompatible widths" and indicate the offending locations in orange. In the below, the output pin's Data Bits attribute has been changed to 1, and so Logisim complains that the wire cannot connect a three-bit value to a one-bit value.

    Wires that connect incompatible locations (drawn in orange) do not carry values.

    For single-bit wires, you can see at a glance what value the wire carries because Logisim colors the wire light or dark green depending the value. It does not display values for multi-bit wires: They are simply black. You can, though, probe a wire by clicking it using the poke tool ().

    This probing feature is helpful for debugging circuits using wire bundles.

    Next: Splitters.

    logisim-2.7.1/doc/en/html/guide/bundles/colors.html0000644000175000017500000000414111541757130022121 0ustar vincentvincent Wire colors

    Wire colors

    We are now in a position to summarize the full rainbow of colors that Logisim wires can take on. The following little circuit illustrates all of them at once.

    • Gray: The wire's bit width is unknown. This occurs because the wire is not attached to any components' inputs and outputs. (All inputs and outputs have a defined bit width.)

    • Blue: The wire carries a one-bit value, but nothing is driving a specific value onto the wire. We call this a floating bit; some people call it a high-impedance value. In this example, the component placing a value onto the wire is a three-state pin, so it can emit this floating value.

    • Dark green: The wire is carrying a one-bit 0 value.

    • Bright green: The wire is carrying a one-bit 1 value.

    • Black: The wire is carrying a multi-bit value. Some or all of the bits may not be specified.

    • Red: The wire is carrying an error value. This often arises because a gate cannot determine the proper output, perhaps because it has no inputs. It could also arise because two components are trying to send different values onto the wire; this is what happens in the above example, where one input pin places 0 onto the wire while another places 1 onto the same wire, causing a conflict. Multi-bit wires will turn red when any of the bits carried are error values.

    • Orange: The components attached to the wire do not agree in bit width. An orange wire is effectively "broken": It does not carry values between components. Here, we've attached a two-bit component to a one-bit component, so they are incompatible.

    Next: User's Guide.

    logisim-2.7.1/doc/en/html/guide/attrlib/0000755000175000017500000000000011541757130017737 5ustar vincentvincentlogisim-2.7.1/doc/en/html/guide/attrlib/tool.html0000644000175000017500000000467511541757130021616 0ustar vincentvincent Tool Attributes

    Tool attributes

    Every tool for adding components to a circuit also has a set of attributes, which are imparted to the components created by the tool, although the components' attributes may be changed later without affecting the tool's attributes. When you select a tool, Logisim will change the attribute table to display that tool's attributes.

    For example, suppose we want to create smaller AND gates. Right now, each time we select the AND tool, it creates a large AND gate. But if we edit the Gate Size attribute just after selecting the tool (before placing its AND gate into the circuit), we'll be changing the attributes for the tool, so that future AND gates added using the tool would be narrow instead.

    Now, we can delete the two existing AND gates and add two new AND gates in their place. This time, they will be narrow. (If you chose to reduce the number of inputs to 3, the AND gate would not have vertical extension on the left side. But you'd also have to rewire the circuit so that the wires hit the AND gate's left side.)

    With some tools, the tool's icon reflects some of the attributes' values. One example of this is the Pin tool, whose icon faces the same way as its Facing attribute says.

    The tools in the toolbar each have a separate attribute set from the corresponding tools in the explorer pane. Thus, even though we changed the toolbar's AND tool to create narrow AND gates, the AND tool in the Gates library will still create wide AND gates unless you change its attributes too.

    In fact, the input pin and output pin tools in the default toolbar are both instances of the Wiring library's Pin tool, but the attribute sets are different. The icon for the Pin tool is drawn as a circle or a square depending on the value of its "Output?" attribute.

    Logisim provides a handy shortcut for changing the Facing attribute that controls the direction in which many components face: Typing an arrow key while that tool is selected automatically changes the direction of the component.

    Next: User's Guide.

    logisim-2.7.1/doc/en/html/guide/attrlib/index.html0000644000175000017500000000125211541757130021734 0ustar vincentvincent Libraries and Attributes

    Libraries and Attributes

    In this section, we'll examine how to use the other two major regions of the Logisim window, the explorer pane and the attribute table.

    The explorer pane
    The attribute table
    Tool and component attributes

    Next: The explorer pane.

    logisim-2.7.1/doc/en/html/guide/attrlib/explore.html0000644000175000017500000000751611541757130022314 0ustar vincentvincent The explorer pane

    The explorer pane

    Logisim organizes tools into libraries. They are displayed as folders in the explorer pane; to access a library's components, you have only to double-click the corresponding folder. Below, I have opened the Gates library and selected the NAND tool from it. You can see that Logisim now stands ready to add NAND gates into the circuit.

    If you look through the choices in the Gates library, you'll notice that there was no need for us to develop a XOR circuit earlier: It's built into Logisim.

    When you create a project, it automatically includes several libraries:

    • Wiring: Components that interact directly with wires.
    • Gates: Components that perform simple logic functions.
    • Plexers: More complex combinational components, like multiplexers and decoders.
    • Arithmetic: Components that perform arithmetic.
    • Memory: Components that remember data, like flip-flops, registers, and RAM.
    • I/O: Components that exist for the purpose of interacting with the user.
    • Base: Tools that are integral to using Logisim, though you probably won't need to dig into this library very often.

    Logisim allows you to add more libraries, too, using the Load Library submenu of the Project menu. You can see that Logisim has three categories of libraries.

    • Built-in libraries are libraries that are distributed with Logisim. These are documented in the Library Reference.

    • Logisim libraries are projects built within Logisim and saved to the disk as a Logisim project. You can develop a set of circuits in a single project (as described in the Subcircuits section of this guide) and then use that set of circuits as a library for other projects.

    • JAR libraries are libraries that are developed in Java but not distributed with Logisim. You can download JAR libraries that others have written, or you can write your own as described in the JAR Libraries section of this guide. Developing a JAR library is much more difficult than developing a Logisim library, but the components can be much fancier, including things like attributes and interaction with the user. The built-in libraries (other than Base) were written using the same API as JAR libraries can use, so they aptly demonstrate the range of functionality that the JAR libraries can support.

      Some JAR libraries are distributed without any information about which Java class to start with. When loading such a JAR, Logisim will prompt you to type a class name. This class name should be provided by whoever distributed the JAR file to you.

    To remove a library, choose Unload Library... from the Project menu. Logisim will prevent you from unloading libraries that contain components used in a circuit, that appear in the toolbar, or that are mapped to a mouse button.

    Incidentally, a library technically contains tools, not components. Thus, in the Base library you'll find the Poke Tool (), the Edit Tool (), and other tools that don't correspond directly to individual components. Most libraries, though, contain only tools for adding individual components; all built-in libraries other than the Base library are like this.

    Next: The attribute table.

    logisim-2.7.1/doc/en/html/guide/attrlib/attr.html0000644000175000017500000000433711541757130021606 0ustar vincentvincent The attribute table

    The attribute table

    Many components have attributes, which are properties for configuring how the component behaves or appears. The attribute table is for viewing and displaying a component's attribute values.

    To select which component's attributes you wish to view, click the component using the Edit tool (). (You can also right-click (or control-click) the component and choose Show Attributes from the popup menu. Also, manipulating a component via the Poke tool () or the Text tool () will display that component's attributes.)

    The below screen shot demonstrates what things look like after selecting the upper input of our XOR circuit and scrolling down to view the Label Font attribute.

    To modify an attribute value, click on the value. The interface for modifying the attribute will depend on which attribute you are changing; in the case of the Label Font attribute, a dialog box will appear for selecting the new font; but some attributes (like Label) will allow you to edit the value as a text field, while others (like Label Location) will display a drop-down menu from which to select the value.

    Each component type has a different set of attributes; to learn what they mean, go to the relevant documentation in the Library Reference.

    If you've selected multiple components using the Edit tool, then the attribute table will display attributes that are shared among all the selected components (excluding any wires). If the selected components don't all have the same value for the attribute, then the displayed value will be blank. You can change the value for all selected components' attribute at once by using the attribute table.

    Next: Tool attributes.

    logisim-2.7.1/doc/en/html/guide/analyze/0000755000175000017500000000000011541757130017741 5ustar vincentvincentlogisim-2.7.1/doc/en/html/guide/analyze/table.html0000644000175000017500000000523011541757130021716 0ustar vincentvincent Editing the truth table

    Editing the truth table

    On opening the Combinational Analysis window, you will see that it consists of five tabs.

    This page describes the first three tabs, Inputs, Outputs, and Table. The next page of the guide describes the last two tabs, Expression and Minimized.

    The Inputs and Outputs tabs

    The Inputs tab allows you to view and edit the list of inputs. To add new inputs, type it in the field at the pane's bottom, and click Add. If you want to rename an existing input, select it in the list in the pane's upper left region; then type the name and click Rename.

    To remove an input, select it from the list and click Remove. You can also reorder the inputs (which affects the order of columns in the truth table and in the generated circuit) using the Move Up or Move Down buttons on an input.

    All actions affect the truth table immediately.

    The Outputs tab works in exactly the same way as the Inputs tab, except of course it works with the list of outputs instead.

    The Table tab

    The only item under the Table tab is the current truth table, diagrammed in the conventional order, with inputs constituting the columns on the left and outputs constituting the columns on the right.

    You can edit the current values appearing in the output columns by clicking on the value of interest. The values will cycle through 0, 1, and x (representing a "don't care"). As we'll see on the next page, any don't-care values allow the computation of minimized expressions some flexibility.

    You can also navigate and edit the truth table using the keyboard. And you can copy and paste values using the clipboard. The clipboard can be transferred to any application supporting tab-delimited text (such as a spreadsheet).

    If the truth table is based on an existing circuit, you may see some pink squares in the output columns with "!!" in them. These correspond to errors that occurred while calculating the value for that row - either the circuit seemed to be oscillating, or the output value was an error value (which would be pictured as a red wire in the Logisim circuit). Hovering your mouse over the entry should bring up a tool tip describing which type of error it was. Once you click on the error entry, you will be in the 0-1-x cycle; there is no way to go back.

    Next: Creating expressions.

    logisim-2.7.1/doc/en/html/guide/analyze/open.html0000644000175000017500000001017011541757130021567 0ustar vincentvincent Opening Combinational Analysis

    Opening Combinational Analysis

    The bulk of the Combinational Analysis module is accessed through a single window of that name allowing you to view truth tables and Boolean expressions. This window can be opened in two ways.

    Via the Window menu

    Select Combinational Analysis, and the current Combinational Analysis window will appear. If you haven't viewed the window before, the opened window will represent no circuit at all.

    Only one Combinational Analysis window exists within Logisim, no matter how many projects are open. There is no way to have two different analysis windows open at once.

    Via the Project menu

    From a window for editing circuits, you can also request that Logisim analyze the current circuit by selecting the Analyze Circuit option from the Project menu. Before Logisim opens the window, it will compute Boolean expressions and a truth table corresponding to the circuit and place them there for you to view.

    For the analysis to be successful, each input must be attached to an input pin, and each output must be attached to an output pin. Logisim will only analyze circuits with at most eight of each type, and all should be single-bit pins. Otherwise, you will see an error message and the window will not open.

    In constructing Boolean expressions corresponding to a circuit, Logisim will first attempt to construct a Boolean expressions corresponding exactly to the gates in the circuit. But if the circuit uses some non-gate components (such as a multiplexer), or if the circuit is more than 100 levels deep (unlikely), then it will pop up a dialog box telling you that deriving Boolean expressions was impossible, and Logisim will instead derive the expressions based on the truth table, which will be derived by quietly trying each combination of inputs and reading the resulting outputs.

    After analyzing a circuit, there is no continuing relationship between the circuit and the Combinational Analysis window. That is, changes to the circuit will not be reflected in the window, nor will changes to the Boolean expressions and/or truth table in the window be reflected in the circuit. Of course, you are always free to analyze a circuit again; and, as we will see later, you can replace the circuit with a circuit corresponding to what appears in the Combinational Analysis window.

    Limitations

    Logisim will not attempt to detect sequential circuits: If you tell it to analyze a sequential circuit, it will still create a truth table and corresponding Boolean expressions, although these will not accurately summarize the circuit behavior. (In fact, detecting sequential circuits is provably impossible, as it would amount to solving the Halting Problem. Of course, you might hope that Logisim would make at least some attempt - perhaps look for flip-flops or cycles in the wires - but it does not.) As a result, the Combinational Analysis system should not be used indiscriminately: Only use it when you are indeed sure that the circuit you are analyzing is indeed combinational!

    Logisim will make a change to the original circuit that is perhaps unexpected: The Combinational Analysis system requires that each input and output have a unique name that conforming to the rules for Java identifiers. (Roughly, each character must either a letter or a digit, and the first character must be a letter. No spaces allowed!) It attempts to use the pins' existing labels, and to use a list of defaults if no label exists. If an existing label doesn't follow the Java-identifier rule, then Logisim will attempt to extract a valid name from the label if at all possible.

    Incidentally, the ordering of the inputs in the truth table will match their top-down ordering in the original circuit, with ties being broken in left-right order. (The same applies to the ordering of outputs.)

    Next: Editing the truth table.

    logisim-2.7.1/doc/en/html/guide/analyze/index.html0000644000175000017500000000277711541757130021753 0ustar vincentvincent Combinational analysis

    Combinational analysis

    All circuits fall into one of two well-known categories: In a combinational circuit, all circuit outputs are a strict combination of the current circuit inputs, whereas in a sequential circuit, some outputs may depend on past inputs (the sequence of inputs over time).

    The category of combinational circuits is the simpler of the two. Practitioners use three major techniques for summarizing the behavior of such circuits.

    • logic circuits
    • Boolean expressions, which allow an algebraic representation of how the circuit works
    • truth tables, which list all possible input combinations and the corresponding outputs
    The Combinational Analysis module of Logisim allows you to convert between these three representations in all directions. It is a particularly handy way of creating and understanding circuits with a handful of one-bit inputs and outputs.

    Opening Combinational Analysis
    Editing the truth table
    Creating expressions
    Generating a circuit

    Next: Opening Combinational Analysis.

    logisim-2.7.1/doc/en/html/guide/analyze/gen.html0000644000175000017500000000362211541757130021403 0ustar vincentvincent Generating a circuit

    Generating a circuit

    The Build Circuit button will construct a circuit whose gates correspond to the currently chosen expressions for each output. The circuit's inputs and outputs will be displayed in top-down order corresponding to how they appear under the Inputs and Outputs tabs. Generally speaking, the constructed circuit will be attractive; and, indeed, one application of Logisim's Combinational Analysis module is to beautify poorly drawn circuits. Still, as with any automatic formatting, it will not express the structural details that a human-drawn circuit would.

    When you click the Build Circuit button, a dialog box will appear prompting you to choose which project where you want the circuit and the name you wish to give it.

    If you type the name of an existing circuit, then that circuit will be replaced (after Logisim prompts you to confirm that you really want to do this).

    The Build Circuit dialog includes two options. The Use Two-Input Gates Only option specifies that you want all gates constructed to have two inputs. (NOT gates, of course, constitute an exception to this rule.) The Use NAND Gates Only option specifies that you would like it to translate the circuit into one using only NAND gates. You can select both options if you want to use only two-input NAND gates.

    Logisim cannot construct a NAND-only circuit for an expression containing any XOR operators. This option will therefore be disabled if any outputs' expressions contain XORs.

    Next: User's Guide.

    logisim-2.7.1/doc/en/html/guide/analyze/expr.html0000644000175000017500000001116111541757130021605 0ustar vincentvincent Creating expressions

    Creating expressions

    For each output variable, the Combinational Analysis window maintains two structures - the relevant column of the truth table, and a Boolean expression - specifying how each output relates to its input. You can edit either the truth table or the expression; the other will automatically change as necessary to keep them consistent.

    As we will see on the next page, the Boolean expressions are particularly useful because the Combinational Analysis window will use these when told to build a circuit corresponding to the current state.

    You can view and edit the expressions using the window's last two tabs, the Expression tab and the Minimized tab.

    The Expression tab

    The Expression tab allows you to view and edit the current expression associated with each output variable. You can select the output expression you want to view and edit using the selector labeled "Output:" at the pane's top.

    Just below the selector will appear the expression formatted in a particularly common notation, where an OR is represented as addition, an AND is represented as multiplication, and a NOT is denoted with a bar above the portion affected by the NOT.

    The text pane below this displays the same information in ASCII form. Here, a NOT is represented with a tilde ('~').

    You can edit the expression in the text pane and click the Enter button to make it take effect; doing this will also update the truth table to make it correspond. The Clear button clears the text pane, and the Revert button changes the pane back to representing the current expression.

    Note that your edited expression will be lost if you edit the truth table.

    In addition to multiplication and addition standing for AND and OR, an expression you type may contain any of C/Java logical operators, as well as simply the words themselves.

    highest precedence~ ! ' NOT
    (none) & && AND
    ^ XOR
    lowest precedence+ | || OR

    The following examples are all valid representations of the same expression. You could also mix the operators.

    a' (b + c)
    !a && (b || c)
    NOT a AND (b OR c)

    In general, parentheses within a sequence of ANDs (or ORs or XORs) do not matter. (In particular, when Logisim creates a corresponding circuit, it will ignore such parentheses.)

    The Minimized tab

    The final tab displays a minimized expression corresponding to a column of the truth table. You can select which output's minimized expression you want to view using the selector at top, and you can indicate whether you want to derive a sum-of-products expression or a product-of-sums expression using the selector below.

    If there are four or fewer inputs, a Karnaugh map corresponding to the variable will appear below the selector. You can click the Karnaugh map to change the corresponding truth table values. The Karnaugh map will also display the currently selected terms for the minimized expression as solid semitransparent rounded rectangles.

    Below this is the minimized expression itself, formatted as in the Expression tab's display. If there are more than four inputs, the Karnaugh map will not appear; but the minimized expression will still be computed. (Logisim uses the Quine-McCluskey algorithm to compute the minimized expression. This is equivalent to a Karnaugh map, but it applies to any number of input variables.)

    The Set As Expression button allows you to select the minimized expression as the expression corresponding to the variable. This will generally not be necessary, as edits to the truth table result in using the minimized expression for the changed column; but if you enter an expression through the Expression tab, this can be a convenient way to switch to the corresponding minimized expression.

    Next: Generating a circuit.

    logisim-2.7.1/doc/en/html/guide/about/0000755000175000017500000000000011541757130017410 5ustar vincentvincentlogisim-2.7.1/doc/en/html/guide/about/index.html0000644000175000017500000001164311541757130021412 0ustar vincentvincent About the program

    About the program

    Logisim is open-source software. The source code is included in the src subdirectory of the distributed JAR file.

    If you find Logisim useful, please let me know. Especially do this if you are an educational institution; the information will help me in gaining support for the work.

    I welcome e-mails about Logisim, including bug reports, suggestions, and fixes. When you e-mail me, please remember that I have worked hard to produce Logisim without receiving any payment from you. If you want a right to complain about the software, then I would suggest shelling out the money for a competing program to Logisim. (I know of no open-source competitors that approach Logisim's feature set.) Nonetheless, I remain interested in continuing to improve Logisim, and your suggestions will be most welcome.

    Copyright notice

    Copyright (c) 2005, Carl Burch.

    Logisim is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

    Logisim is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

    Acknowledgements

    The source code to Logisim is primarily my own work; I must acknowledge my employers who fund my work as a professor, including this program: I started the program at Saint John's University (Collegeville, Minnesota, USA) in 2000-2004, and I have continued it at Hendrix College (Conway, Arkansas, USA) from 2004 to present. I am very grateful to these colleges for giving me the time and resources to work on this project. If only all colleges and universities had their act as together and cared as much about excellent teaching as these colleges do!

    Some other people who have been particularly helpful:

    • Theldo Cruz Franqueira, Thanos Kakarountas, Ilia Lilov, Pablo Leal Ramos, and Uwe Zimmermann, who have contributed to translations packaged with Logisim. More information about the translations can be found on International Preferences page.
    • The Spring 2005 CS61C class at the University of California, Berkeley, which endured the beta versions of Logisim 2.0. These students put up with many bugs, and I am very appreciative for their patience and for their suggestions!
    • The Spring 2001 CSCI 150 classes at the College of Saint Benedict and Saint John's University, which used the most rudimentary versions of Logisim as it was being developed.

    Several pieces of Logisim come from others' packages that Logisim uses; several of these pieces are distributed as part of Logisim.

    Sun's Java API (obviously)
    Sun's JavaHelp project
    Provides the integrated help system from the Help menu.
    MRJAdapter, from Steve Roy
    Integration with the Macintosh OS X platform.
    launch4j, from Grzegorz Kowalt
    Allows distribution of Logisim as a Windows executable.
    GIFEncoder, from Adam Doppelt
    Saves images as GIF files. This was itself based on C code written by Sverre H. Huseby.
    ColorPicker, from Jeremy Wood
    Provides the color dialog box that pops up when configuring colors (as with the LED component).
    JFontChooser, from Christos Bohoris
    Provides the font selection dialog box that pops up when selecting font attributes (such as with the Label Font attribute of many components).
    TableSorter, ascribed to Philip Milne, Brendon McLean, Dan van Enckevort, Parwinder Sekhon, and ouroborus@ouroborus.org
    Provides the ability to sort the table in the Get Circuit Statistics dialog through clicking column headers.
    Farm-Fresh Web Icons, http://www.fatcow.com/free-icons
    Provides the icons for controlling simulation that appear under the simulation tree. These icons are released under the Creative Commons Attribution 3.0 License, and they cannot be redistributed under the terms of the GPL.

    And finally, I want to thank all the users who have contacted me - whether with bug reports, with suggestions, or just to let me know that they're using Logisim in their classes. I have to leave these suggesters anonymous, because I don't have their permission to mention them here, but: Thank you!

    logisim-2.7.1/doc/en/html/guide/about/gpl.html0000644000175000017500000003626711541757130021076 0ustar vincentvincent About This Program
    		    GNU GENERAL PUBLIC LICENSE
    		       Version 2, June 1991
    
     Copyright (C) 1989, 1991 Free Software Foundation, Inc.
                           51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
     Everyone is permitted to copy and distribute verbatim copies
     of this license document, but changing it is not allowed.
    
    			    Preamble
    
      The licenses for most software are designed to take away your
    freedom to share and change it.  By contrast, the GNU General Public
    License is intended to guarantee your freedom to share and change free
    software--to make sure the software is free for all its users.  This
    General Public License applies to most of the Free Software
    Foundation's software and to any other program whose authors commit to
    using it.  (Some other Free Software Foundation software is covered by
    the GNU Library General Public License instead.)  You can apply it to
    your programs, too.
    
      When we speak of free software, we are referring to freedom, not
    price.  Our General Public Licenses are designed to make sure that you
    have the freedom to distribute copies of free software (and charge for
    this service if you wish), that you receive source code or can get it
    if you want it, that you can change the software or use pieces of it
    in new free programs; and that you know you can do these things.
    
      To protect your rights, we need to make restrictions that forbid
    anyone to deny you these rights or to ask you to surrender the rights.
    These restrictions translate to certain responsibilities for you if you
    distribute copies of the software, or if you modify it.
    
      For example, if you distribute copies of such a program, whether
    gratis or for a fee, you must give the recipients all the rights that
    you have.  You must make sure that they, too, receive or can get the
    source code.  And you must show them these terms so they know their
    rights.
    
      We protect your rights with two steps: (1) copyright the software, and
    (2) offer you this license which gives you legal permission to copy,
    distribute and/or modify the software.
    
      Also, for each author's protection and ours, we want to make certain
    that everyone understands that there is no warranty for this free
    software.  If the software is modified by someone else and passed on, we
    want its recipients to know that what they have is not the original, so
    that any problems introduced by others will not reflect on the original
    authors' reputations.
    
      Finally, any free program is threatened constantly by software
    patents.  We wish to avoid the danger that redistributors of a free
    program will individually obtain patent licenses, in effect making the
    program proprietary.  To prevent this, we have made it clear that any
    patent must be licensed for everyone's free use or not licensed at all.
    
      The precise terms and conditions for copying, distribution and
    modification follow.
    
    		    GNU GENERAL PUBLIC LICENSE
       TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
    
      0. This License applies to any program or other work which contains
    a notice placed by the copyright holder saying it may be distributed
    under the terms of this General Public License.  The "Program", below,
    refers to any such program or work, and a "work based on the Program"
    means either the Program or any derivative work under copyright law:
    that is to say, a work containing the Program or a portion of it,
    either verbatim or with modifications and/or translated into another
    language.  (Hereinafter, translation is included without limitation in
    the term "modification".)  Each licensee is addressed as "you".
    
    Activities other than copying, distribution and modification are not
    covered by this License; they are outside its scope.  The act of
    running the Program is not restricted, and the output from the Program
    is covered only if its contents constitute a work based on the
    Program (independent of having been made by running the Program).
    Whether that is true depends on what the Program does.
    
      1. You may copy and distribute verbatim copies of the Program's
    source code as you receive it, in any medium, provided that you
    conspicuously and appropriately publish on each copy an appropriate
    copyright notice and disclaimer of warranty; keep intact all the
    notices that refer to this License and to the absence of any warranty;
    and give any other recipients of the Program a copy of this License
    along with the Program.
    
    You may charge a fee for the physical act of transferring a copy, and
    you may at your option offer warranty protection in exchange for a fee.
    
      2. You may modify your copy or copies of the Program or any portion
    of it, thus forming a work based on the Program, and copy and
    distribute such modifications or work under the terms of Section 1
    above, provided that you also meet all of these conditions:
    
        a) You must cause the modified files to carry prominent notices
        stating that you changed the files and the date of any change.
    
        b) You must cause any work that you distribute or publish, that in
        whole or in part contains or is derived from the Program or any
        part thereof, to be licensed as a whole at no charge to all third
        parties under the terms of this License.
    
        c) If the modified program normally reads commands interactively
        when run, you must cause it, when started running for such
        interactive use in the most ordinary way, to print or display an
        announcement including an appropriate copyright notice and a
        notice that there is no warranty (or else, saying that you provide
        a warranty) and that users may redistribute the program under
        these conditions, and telling the user how to view a copy of this
        License.  (Exception: if the Program itself is interactive but
        does not normally print such an announcement, your work based on
        the Program is not required to print an announcement.)
    
    These requirements apply to the modified work as a whole.  If
    identifiable sections of that work are not derived from the Program,
    and can be reasonably considered independent and separate works in
    themselves, then this License, and its terms, do not apply to those
    sections when you distribute them as separate works.  But when you
    distribute the same sections as part of a whole which is a work based
    on the Program, the distribution of the whole must be on the terms of
    this License, whose permissions for other licensees extend to the
    entire whole, and thus to each and every part regardless of who wrote it.
    
    Thus, it is not the intent of this section to claim rights or contest
    your rights to work written entirely by you; rather, the intent is to
    exercise the right to control the distribution of derivative or
    collective works based on the Program.
    
    In addition, mere aggregation of another work not based on the Program
    with the Program (or with a work based on the Program) on a volume of
    a storage or distribution medium does not bring the other work under
    the scope of this License.
    
      3. You may copy and distribute the Program (or a work based on it,
    under Section 2) in object code or executable form under the terms of
    Sections 1 and 2 above provided that you also do one of the following:
    
        a) Accompany it with the complete corresponding machine-readable
        source code, which must be distributed under the terms of Sections
        1 and 2 above on a medium customarily used for software interchange; or,
    
        b) Accompany it with a written offer, valid for at least three
        years, to give any third party, for a charge no more than your
        cost of physically performing source distribution, a complete
        machine-readable copy of the corresponding source code, to be
        distributed under the terms of Sections 1 and 2 above on a medium
        customarily used for software interchange; or,
    
        c) Accompany it with the information you received as to the offer
        to distribute corresponding source code.  (This alternative is
        allowed only for noncommercial distribution and only if you
        received the program in object code or executable form with such
        an offer, in accord with Subsection b above.)
    
    The source code for a work means the preferred form of the work for
    making modifications to it.  For an executable work, complete source
    code means all the source code for all modules it contains, plus any
    associated interface definition files, plus the scripts used to
    control compilation and installation of the executable.  However, as a
    special exception, the source code distributed need not include
    anything that is normally distributed (in either source or binary
    form) with the major components (compiler, kernel, and so on) of the
    operating system on which the executable runs, unless that component
    itself accompanies the executable.
    
    If distribution of executable or object code is made by offering
    access to copy from a designated place, then offering equivalent
    access to copy the source code from the same place counts as
    distribution of the source code, even though third parties are not
    compelled to copy the source along with the object code.
    
      4. You may not copy, modify, sublicense, or distribute the Program
    except as expressly provided under this License.  Any attempt
    otherwise to copy, modify, sublicense or distribute the Program is
    void, and will automatically terminate your rights under this License.
    However, parties who have received copies, or rights, from you under
    this License will not have their licenses terminated so long as such
    parties remain in full compliance.
    
      5. You are not required to accept this License, since you have not
    signed it.  However, nothing else grants you permission to modify or
    distribute the Program or its derivative works.  These actions are
    prohibited by law if you do not accept this License.  Therefore, by
    modifying or distributing the Program (or any work based on the
    Program), you indicate your acceptance of this License to do so, and
    all its terms and conditions for copying, distributing or modifying
    the Program or works based on it.
    
      6. Each time you redistribute the Program (or any work based on the
    Program), the recipient automatically receives a license from the
    original licensor to copy, distribute or modify the Program subject to
    these terms and conditions.  You may not impose any further
    restrictions on the recipients' exercise of the rights granted herein.
    You are not responsible for enforcing compliance by third parties to
    this License.
    
      7. If, as a consequence of a court judgment or allegation of patent
    infringement or for any other reason (not limited to patent issues),
    conditions are imposed on you (whether by court order, agreement or
    otherwise) that contradict the conditions of this License, they do not
    excuse you from the conditions of this License.  If you cannot
    distribute so as to satisfy simultaneously your obligations under this
    License and any other pertinent obligations, then as a consequence you
    may not distribute the Program at all.  For example, if a patent
    license would not permit royalty-free redistribution of the Program by
    all those who receive copies directly or indirectly through you, then
    the only way you could satisfy both it and this License would be to
    refrain entirely from distribution of the Program.
    
    If any portion of this section is held invalid or unenforceable under
    any particular circumstance, the balance of the section is intended to
    apply and the section as a whole is intended to apply in other
    circumstances.
    
    It is not the purpose of this section to induce you to infringe any
    patents or other property right claims or to contest validity of any
    such claims; this section has the sole purpose of protecting the
    integrity of the free software distribution system, which is
    implemented by public license practices.  Many people have made
    generous contributions to the wide range of software distributed
    through that system in reliance on consistent application of that
    system; it is up to the author/donor to decide if he or she is willing
    to distribute software through any other system and a licensee cannot
    impose that choice.
    
    This section is intended to make thoroughly clear what is believed to
    be a consequence of the rest of this License.
    
      8. If the distribution and/or use of the Program is restricted in
    certain countries either by patents or by copyrighted interfaces, the
    original copyright holder who places the Program under this License
    may add an explicit geographical distribution limitation excluding
    those countries, so that distribution is permitted only in or among
    countries not thus excluded.  In such case, this License incorporates
    the limitation as if written in the body of this License.
    
      9. The Free Software Foundation may publish revised and/or new versions
    of the General Public License from time to time.  Such new versions will
    be similar in spirit to the present version, but may differ in detail to
    address new problems or concerns.
    
    Each version is given a distinguishing version number.  If the Program
    specifies a version number of this License which applies to it and "any
    later version", you have the option of following the terms and conditions
    either of that version or of any later version published by the Free
    Software Foundation.  If the Program does not specify a version number of
    this License, you may choose any version ever published by the Free Software
    Foundation.
    
      10. If you wish to incorporate parts of the Program into other free
    programs whose distribution conditions are different, write to the author
    to ask for permission.  For software which is copyrighted by the Free
    Software Foundation, write to the Free Software Foundation; we sometimes
    make exceptions for this.  Our decision will be guided by the two goals
    of preserving the free status of all derivatives of our free software and
    of promoting the sharing and reuse of software generally.
    
    			    NO WARRANTY
    
      11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
    FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
    OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
    PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
    OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
    MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
    TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
    PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
    REPAIR OR CORRECTION.
    
      12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
    WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
    REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
    INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
    OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
    TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
    YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
    PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
    POSSIBILITY OF SUCH DAMAGES.
    
    		     END OF TERMS AND CONDITIONS
    
    logisim-2.7.1/doc/en/html/contents.html0000644000175000017500000001550411541757130017731 0ustar vincentvincent

    Logisim References

    Guide to Being a Logisim User

  • Value propagation
  • JAR libraries
  • About the program
  • Library Reference

    logisim-2.7.1/doc/en/contents.xml0000644000175000017500000002166011541757152016625 0ustar vincentvincent logisim-2.7.1/doc/el/0000755000175000017500000000000011541757152014237 5ustar vincentvincentlogisim-2.7.1/doc/el/img-libs/0000755000175000017500000000000011541757124015741 5ustar vincentvincentlogisim-2.7.1/doc/el/img-guide/0000755000175000017500000000000011541757124016105 5ustar vincentvincentlogisim-2.7.1/doc/el/icons/0000755000175000017500000000000011541757124015351 5ustar vincentvincentlogisim-2.7.1/doc/el/html/0000755000175000017500000000000011541757124015202 5ustar vincentvincentlogisim-2.7.1/doc/el/html/libs/0000755000175000017500000000000011541757126016135 5ustar vincentvincentlogisim-2.7.1/doc/el/html/libs/wiring/0000755000175000017500000000000011541757130017427 5ustar vincentvincentlogisim-2.7.1/doc/el/html/libs/wiring/tunnel.html0000644000175000017500000000545311541757130021631 0ustar vincentvincent Tunnel

    Tunnel

    Library: Wiring
    Introduced: 2.5.0 (in Base library, moved to Wiring in 2.7.0)
    Appearance:

    Behavior

    A tunnel acts like a wire in that it binds points together, but unlike a wire the connection is not explicitly drawn. This is helpful when you need to connect points far apart in the circuit and a network of wires would make the circuit much more ugly. The below illustration illustrates how this works.

    Here, all three tunnels have the same label, a, and so the three points to which the tunnels point are connected. (If one of the tunnels were labeled something else, like b, then it would be part of a different set of tunnels.) The controlled buffer at top emits a floating output since its lower input is 0. This normally leads the wire coming from the controlled buffer to be blue; but here it is dark green because the floating output combines through the tunnel with the 0 from the pin at bottom. If the control input into the buffer changes to 1, then the controlled buffer would feed 1 into the tunnel, which would combine with 0 from the pin at bottom to result in an error value; thus, we would then see red wires feeding through all three tunnels.

    Pins

    A tunnel has only one pin, whose bit width matches the tunnel's Data Bits attribute. This pin is neither an input nor an output — the matching tunnels are simply connected transparently.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute and the arrow keys alter its Facing attribute.

    Facing
    The direction toward which the tunnel points.
    Data Bits
    The number of bits for the tunnel.
    Label
    The text within the label associated with the tunnel. This tunnel is connected to all other tunnels with exactly the same label.
    Label Font
    The font with which to render the label.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    Allows the label associated with the tunnel to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/wiring/transmis.html0000644000175000017500000001152411541757130022160 0ustar vincentvincent Transmission Gate

    Transmission Gate

    Library: Wiring
    Introduced: 2.7.0
    Appearance:

    Behavior

    A transmission gate has three inputs, called source, n-gate, and p-gate; and it has one output, called drain. When diagrammed, the source input and drain output are drawn connected by two plates; Logisim draws an arrowhead to indicate the direction of flow from input to output. The two gate inputs are drawn as lines connected to plates parallel to each of the plates connecting source to drain. The p-gate input's line has a circle, while the n-gate input's line does not.

    p-gate
    source drain
    n-gate

    The transmission gate is simply the combination of two complementary transistors. Indeed, the same behavior can be achieved in Logisim by using just one transistor. However, designers sometimes prefer to use matched pairs of transistors due to electrical issues with draining voltage that is more complex than Logisim attempts to simulate.

    The values at n-gate and p-gate are expected to be opposite to each other. If p-gate is 0 while n-gate is 1, then the value found at source is transmitted to drain. If p-gate is 1 while p-gate is 0, then the connection is broken, so the value at drain is left floating. In all other cases, drain receives an error output — unless source is floating, in which case drain is floating as well. This behavior is summarized by the following table.

    p-gaten-gatedrain
    00X*
    01source
    10Z
    11X*
    X/ZanyX*
    anyX/ZX*

    * If source is Z, drain is Z; otherwise drain is X.

    If the Data Bits attribute is more than 1, each gate input is still a single bit, but the gate values are applied simultaneously to each of the source input's bits.

    Pins (assuming component faces east, gate line top/left)

    West edge (input, bit width matches Data Bits attribute)
    The component's source input that will transmit to the output if triggered by the p-gate and n-gate inputs.
    North edge (input, bit width 1)
    The component's p-gate input.
    South edge (input, bit width 1)
    The component's n-gate input.
    East edge (output, bit width matches Data Bits attribute)
    The component's output, which will match the source input if p-gate is 0 and n-gate is 1, or it will be floating if p-gate is 1 and n-gate is 0. For all other values on p-gate and n-gate, the output is an error value.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute and the arrow keys alter its Facing attribute.

    Facing
    The direction of the component (its output relative to its input).
    Gate Location
    The location of the gate input.
    Data Bits
    The bit width of the component's inputs and outputs.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/wiring/transist.html0000644000175000017500000001572311541757130022174 0ustar vincentvincent Transistor

    Transistor

    Library: Wiring
    Introduced: 2.7.0
    Appearance:

    Behavior

    A transistor has two inputs, called gate and source, and one output, called drain. When diagrammed, the source input and drain output are drawn connected by a plate; Logisim draws an arrowhead to indicate the direction of flow from input to output. The gate input is drawn connected to a plate that is parallel to the plate connecting source to drain. Logisim supports two types of transistors, with slightly different behaviors described below; the P-type transistor is indicated by a circle connecting the gate input to its plate, while the N-type transistor has no such circle.

    Depending on the value found at gate, the value at source may be transmitted to drain; or there may be no connection from source, so drain is left floating. The determination of transmitting or disconnecting depends on the type of transistor: A P-type transistor (indicated by a circle on the gate line) transmits when gate is 0, while an N-type transistor (which has no such circle) transmits when gate is 1. The behavior is summarized by the following tables.

    P-type
    gate
    01X/Z
    0 0ZX
    source1 1ZX
    Z ZZZ
    X XZX
       
    N-type
    gate
    01X/Z
    0 Z0X
    source1 Z1X
    Z ZZZ
    X ZXX

    Or in summarized form:

    P-type
    gatedrain
    0source
    1Z
    X/ZX*
       
    N-type
    gatedrain
    0Z
    1source
    X/ZX*

    * If source is Z, drain is Z; otherwise drain is X.

    If the Data Bits attribute is more than 1, the gate input is still a single bit, but its value is applied simultaneously to each of the source input's bits.

    An N-type transistor behaves very similarly to a Controlled Buffer. The primary difference is that a transistor is meant for more basic circuit designs.

    Pins (assuming component faces east, gate line top/left)

    West edge (input, bit width matches Data Bits attribute)
    The component's source input that will transmit to the output if triggered by the gate input.
    North edge (input, bit width 1)
    The component's gate input. For P-type transistors, the transistor will transmit if the gate value is 0; for N-type transistors, this will trigger the transistor if the gate value is 1.
    East edge (output, bit width matches Data Bits attribute)
    The component's output, which will match the source input if indicated by the gate input, or will be floating if the gate input is the negation of what indicates negation. If gate is floating or an error value, then the output will be an error value.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute and the arrow keys alter its Facing attribute.

    Type
    Determines whether the transistor is P-type or N-type.
    Facing
    The direction of the component (its output relative to its input).
    Gate Location
    The location of the gate input.
    Data Bits
    The bit width of the component's inputs and outputs.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/wiring/splitter.html0000644000175000017500000001152011541757130022162 0ustar vincentvincent Splitter

    Splitter

    Library: Wiring
    Introduced: 2.0 Beta 1 (in Base library, moved to Wiring in 2.7.0)
    Appearance:

    Behavior

    The splitter creates a correspondence between a multi-bit value and several separate subsets of those bits. Despite its name, it can either split a multi-bit value into component parts, or it can combine component parts into a multi-bit value - or indeed it can do both at once. A more complete description of splitters is found in the `Splitters' section of the User's Guide.

    Logisim treats splitters specially when propagating values within a circuit: Whereas all other components have a computed delay for purposes of simulating their behavior, values propagate through splitters (as well as wires) instantaneously.

    Note: The term splitter is a non-standard term, which is unique to Logisim as far as I know. I am unaware of any standard term for such a concept; the only term I have heard used is bus ripper, but this term is unnecessarily violent for my tastes.

    Pins

    To distinguish the several connecting points for a splitter, we refer to the single connecting point one side as its combined end, and we refer to the multiple connecting points on the other side as its split ends.

    Combined end (input/output bit width matches Bit Width In attribute)
    A value holding all of the bits traveling through the splitter.
    Split ends (input/output, bit width computed based on Bit x attributes)
    The number of split ends is specified in the Fan Out attribute, and each split end has an index that is at least 0 and less than the Fan Out attribute. For each split end, all bits for which Bit x refers to its index travels through that split end; the order of these bits is the same as their order within the combined end.

    Attributes

    When the component is selected or being added, the digits '0' through '9' alter its Fan Out attribute, Alt-0 through Alt-9 alter both the Fan Out and Bit Width In attributes, and the arrow keys alter its Facing attribute.

    Facing

    The location of the split ends relative to the combined end.

    Fan Out

    The number of split ends.

    Bit Width In

    The bit width of the combined end.

    Appearance

    Supports different ways of depicting the splitter in the circuit. The Left-handed option (the default) draws a spine going left from the combined end, with a labeled line coming from the spine for each split end. The Right-handed option is the same except the spine goes right (if you're facing according to the Facing attribute). The Centered option centers the spine so it goes in roughly equal directions left and right. And the Legacy option draws diagonal lines to each split end, without labels; this option is primarily for compatibility with versions older than 2.7.0, when this was the only option for splitter appearance.

    Bit x

    The index of the split end to which bit x of the combined end corresponds. The split ends are indexed starting from 0 at the top (for a splitter facing east or west) or from 0 at the left/west (for a splitter facing north or south). A bit can be specified to correspond to none of the split ends. There is no way for a bit to correspond to multiple split ends.

    Sometimes you can avoid twiddling each individual Bit x attribute by bringing up the pop-up menu for a splitter (usually by right-clicking or control-clicking it). The pop-up menu includes options labeled Distribute Ascending and Distribute Descending. The Distribute Ascending option distributes the bits so that each split end receives the same number of bits, starting from end 0. (If the number of split ends doesn't divide exactly into the number of bits, then the bits are distributed as evenly as possible.) Distribute Descending does the same but starts from the highest-numbered end.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/wiring/pull.html0000644000175000017500000000407011541757130021272 0ustar vincentvincent Pull Resistor

    Pull Resistor

    Library: Wiring
    Introduced: 2.5.0 (in Base library, moved to Wiring in 2.7.0)
    Appearance:
    Shaped:
    Rectangular:

    Behavior

    When connected to a point, this component has an effect only when the value at that point is the floating value (Z). In this case, the resistor pulls the wire to which it is connected toward the value indicated in its Pull Direction attribute.

    If it is connected to a multiple-bit value, then each bit in the value that is floating is pulled in the direction specified, while the bits that are not floating are left unchanged.

    Pins

    The resistor has just one pin, which is an output and has a bit width that is derived from whichever component it is connected.

    Attributes

    When the component is selected or being added, the arrow keys alter its Facing attribute.

    Facing
    The direction in which the component's pin lies from component's center.
    Pull Direction
    Specifies the value to which a floating value should be pulled. This could be 0, 1, or the error value.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/wiring/probe.html0000644000175000017500000000454311541757130021432 0ustar vincentvincent Probe

    Probe

    Library: Wiring
    Introduced: 2.0.3 (in Base library, moved to Wiring in 2.7.0)
    Appearance:

    Behavior

    A probe is an element that simply displays the value at a given point in a circuit. It does not itself interact with other components.

    In most respects, the probe component duplicates the functionality found in a Pin component configured as an output pin. The primary difference is that if the circuit is used as a subcircuit component, then an output pin will be a part of that interface, whereas a probe is not. They also are different in that the probe does not have a Data Bits attribute to be configured: The bit width is inferred from whatever value it happens to see on its input. Graphically, they are similar but have slightly different borders: A pin has a thick, black border, whereas a probe has a thin, gray border.

    Pins

    A probe component has only one pin, which will acts as an input to the probe. The width that this pin accepts is adaptive: The probe will adapt to inputs of any width.

    Attributes

    When the component is selected or being added, the arrow keys alter its Facing attribute.

    Facing
    The side of the component where its input pin should be.
    Label
    The text within the label associated with the component.
    Label Location
    The location of the label relative to the component.
    Label Font
    The font with which to render the label.
    Radix
    The base (for example, binary, decimal, or hexadecimal) in which a value is displayed.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    Allows the label associated with the component to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/wiring/pin.html0000644000175000017500000001151311541757130021104 0ustar vincentvincent Pin

    Pin

    Library: Wiring
    Introduced: 2.0 Beta 1 (in Base library, moved to Wiring in 2.7.0)
    Appearance:

    Behavior

    A pin is an output or an input to a circuit, depending on the value of its Output? attribute. In drawing a pin, Logisim represents output pins using a circle or rounded rectangle, and input pins are represented using squares or rectangles. In either case, the individual bits of the value being sent or received is displayed within the component (except within printer view, when the component only says how many bits wide the pin is).

    A pin is a convenient component for interacting with a circuit, and beginning Logisim users need not use them in any other way. But a user building a circuit using several subcircuits (as described in the `Subcircuits' section of the User's Guide) will use pins also to specify the interface between a circuit and a subcircuit. In particular, a circuit layout's pin components define the pins that appear on the subcircuit component when the layout is used within another circuit. In such a circuit, the values sent and received to those locations on the subcircuit component are tied to the pins within the subcircuit layout.

    Pins

    A pin component has only one pin, which will be an input to the component if the pin is an output pin, and it will be an output to the component if the pin is an input pin. In either case, its bit width matches the Data Bits attribute, and its location is specified by the Facing attribute.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute, the arrow keys alter its Facing attribute, and Alt with an arrow key alters its Label Location attribute.

    Facing
    The side of the component where its input/output pin should be.
    Output?
    Specifies whether the component is an output pin or an input pin. (Note that if the pin component is an input pin, then the pin that acts as its interface within the circuit will be an output, and vice versa.)
    Data Bits
    The number of bits for the value that the pin handles.
    Three-state?
    For an input pin, this configures whether the user can instruct the pin to emit unspecified (i.e., floating) values. The attribute deals with the user interface only; it does not have any effect on how the pin behaves when the circuit layout is used as a subcircuit. For an output pin, the attribute has no effect.
    Pull Behavior
    For an input pin, the attribute specifies how floating values should be treated when received as an input, perhaps from a circuit using the layout as a subcircuit. With "unchanged," the floating values are sent into the layout as floating values; with "pull up," they are converted into 1 values before being sent into the circuit layout; and with "pull down," they are converted into 0 values before being sent into the circuit layout.
    Label
    The text within the label associated with the component.
    Label Location
    The location of the label relative to the component.
    Label Font
    The font with which to render the label.

    Poke Tool Behavior

    Clicking an output pin has no effect, although the pin's attributes will be displayed.

    Clicking an input pin will toggle the bit that is clicked. If it is a three-state pin, then the corresponding bit will rotate between the three states.

    If, however, the user is viewing the state of a subcircuit as described in the `Debugging Subcircuits' of the User's Guide, then the pin's value is pinned to whatever value the subcircuit is receiving from the containing circuit. The user cannot change the value without breaking this link between the subcircuit's state and the containing circuit's state, and Logisim will prompt the user to verify that breaking this link is actually desired.

    Text Tool Behavior

    Allows the label associated with the component to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/wiring/index.html0000644000175000017500000000536511541757130021435 0ustar vincentvincent Wiring Library

    Wiring library

    The Wiring library includes components that relate primarily to wires and to basic electrical concepts.

    Splitter
    Pin
    Probe
    Tunnel
    Pull Resistor
    Clock
    Constant
    Power/Ground
    Transistor
    Transmission Gate
    Bit Extender

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/wiring/extender.html0000644000175000017500000000510511541757130022134 0ustar vincentvincent Bit Extender

    Bit Extender

    Library: Wiring
    Introduced: 2.5.0 (in Base library, moved to Wiring in 2.7.0)
    Appearance:

    Behavior

    The bit extender transforms a value into a value of another bit width. If it's being transformed into a smaller bit width, it is simply truncated to keep the lowest-order bits. If it's being transformed into a large bit width, the lowest-order bits are the same, and you have a choice about what the additional high-order bits will be: They can all be 0, all be 1, all match the input's sign bit (its highest-order bit), or the component can have an additional one-bit input that determines the identity of these other bits.

    Pins

    West edge (input, bit width from Bit Width In attribute)

    The multi-bit input whose value is to be transformed.

    East edge (output, bit width from Bit Width Out attribute)

    The computed output.

    North edge (input, bit width 1)

    Specifies what the additional bits in the output should be. This pin is available only when the Extension Type attribute is Input.

    Attributes

    When the component is selected or being added, the digits 0 through 9 alter the Bit Width In attribute and Alt-0 through Alt-9 alter its Bit Width Out attribute.

    Bit Width In
    The input's bit width.
    Bit Width Out
    The output's bit width.
    Extension Type
    Assuming the output bit width exceeds the input bit width, this attribute configures what the additional output bits should be. If Zero or One, the additional bits are 0 or 1 accordingly. If Sign, the additional bits are taken to match the highest-order bit in the input. And if Input, the component has a second input on its north side whose one-bit value is used for the additional bits.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/wiring/constant.html0000644000175000017500000000341711541757130022153 0ustar vincentvincent Constant

    Constant

    Library: Wiring
    Introduced: 2.0 Beta 1 (in Gates library, moved to Wiring in 2.7.0)
    Appearance:

    Behavior

    Emits the value specified in its Value attribute.

    Pins

    There is only one pin, an output whose bit width matches the Data Bits attribute. The location of this pin is specified in the Facing attribute. The component constantly outputs on this pin whatever value specified in the Value attribute.

    Attributes

    When the component is selected or being added, the hexademical digits '0' through '9' and 'a' through 'f' alter its Value attribute, Alt-0 through Alt-9 alter its Data Bits attribute, and the arrow keys alter its Facing attribute.

    Facing
    The direction in which the pin is located relative to where the value is drawn.
    Data Bits
    The bit width of the value placed onto the wire.
    Value
    The value, written in hexademical, that is emitted by the component. The number of bits used to specify the value cannot exceed the component's bit width.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/wiring/const01.html0000644000175000017500000000415611541757130021612 0ustar vincentvincent Power/Ground

    Power/Ground

    Library: Wiring
    Introduced: 2.7.0
    Appearance:

    Behavior

    Emits a single value onto a wire. For a power element, indicated by a triangle, this value will be one (or, if the Data Bits attribute is more than 1, an all-ones value). For a ground element, indicated by an arrow of three shortening parallel lines, this value will be zero (or, if the Data Bits attribute is more than 1, an all-zero value).

    The same functionality can be achieved using the more versatile Constant component. The only reason to prefer ground and power is that they are standard electronic symbols.

    Pins

    There is only one pin, an output whose bit width matches the Data Bits attribute. The component constantly outputs the same value on this pin: for a ground component, the output is an all-zero value, and for a power component, the output is an all-one value.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute and the arrow keys alter its Facing attribute.

    Facing
    The direction in which the arrow will point from the location of its pin.
    Data Bits
    The bit width of the value placed onto the wire.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/wiring/clock.html0000644000175000017500000000513311541757130021412 0ustar vincentvincent Clock

    Clock

    Library: Wiring
    Introduced: 2.0 Beta 13 (in Base library, moved to Wiring in 2.7.0)
    Appearance:

    Behavior

    The clock toggles its output value on a regular schedule as long as ticks are enabled via the Simulate menu. (Ticks are disabled by default.) A "tick" is Logisim's unit of time; the speed at which ticks occur can be selected from the Simulate menu's Tick Frequency submenu.

    The clock's cycle can be configured using its High Duration and Low Duration attributes.

    Note that Logisim's simulation of clocks is quite unrealistic: In real circuits, multiple clocks will drift from one another and will never move in lockstep. But in Logisim, all clocks experience ticks at the same rate.

    Pins

    A clock has only one pin, an output with a bit width of 1, whose value will represent the current value of the clock. The location of this pin is specified in the Facing attribute. The clock's value will toggle on its schedule whenever ticks are enabled, and it will toggle whenever it is clicked using the Poke Tool.

    Attributes

    When the component is selected or being added, the arrow keys alter its Facing attribute.

    Facing
    The side of the component where its output pin should be.
    High Duration
    The length of time within each cycle that the clock's output should be 1.
    Low Duration
    The length of time within each cycle that the clock's output should be 0.
    Label
    The text within the label associated with the clock component.
    Label Location
    The location of the label relative to the component.
    Label Font
    The font with which to render the label.

    Poke Tool Behavior

    Clicking a clock component will toggle its current output value immediately.

    Text Tool Behavior

    Allows the label associated with the component to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/plexers/0000755000175000017500000000000011541757130017612 5ustar vincentvincentlogisim-2.7.1/doc/el/html/libs/plexers/selector.html0000644000175000017500000000462611541757130022330 0ustar vincentvincent Bit Selector

    Bit Selector

    Library: Plexers
    Introduced: 2.0.5
    Appearance:

    Behavior

    Given an input of several bits, this will divide it into several equal-sized groups (starting from the lowest-order bit) and output the group selected by the select input.

    For example, if we have an eight-bit input 01010101, and we are to have a three-bit output, then group 0 will be the lowest-order three bits 101, group 1 will be the next three bits, 010, and group 2 will be the next three bits 001. (Any bits beyond the top are filled in with 0.) The select input will be a two-bit number that selects which of these three groups to output; if the select input is 3, then 000 will be the output.

    Pins (assuming component faces east)

    West edge (input, bit width matches Data Bits attribute)
    Data value from which bits should be selected for the output.
    East edge (output, bit width matches Output Bits attribute)
    A group of bits from the data value, as selected by the select input.
    South edge (input, bit width is quotient of Data Bits and Output Bits, rounded up)
    Select input: Determines which of the bit groups should be routed to the output.

    Attributes

    When the component is selected or being added, the digits '0' through '9' alter its Output Bits attribute, Alt-0 through Alt-9 alter its Data Bits attribute, and the arrow keys alter its Facing attribute.

    Facing
    The direction of the component (its output relative to its input).
    Data Bits
    The bit width of the component's data input.
    Output Bits
    The bit width of the component's output.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/plexers/priencod.html0000644000175000017500000000770111541757130022310 0ustar vincentvincent Priority Encoder

    Priority Encoder

    Library: Plexers
    Introduced: 2.3.0
    Appearance:

    Behavior

    The component has a number of inputs on its west edge, with the first labeled 0 and the other numbered from there. The component determines the indices of the inputs whose values are 1, and it emits the highest index. For example, if inputs 0, 2, 5, and 6 are all 1, then the priority encoder emits a value of 110. If no inputs are 1, or if the component is disabled, then the output of the priority encoder is floating.

    The priority encoder is designed so that a number of encoders can be daisy-chained to accommodate additional inputs. In particular, the component includes an enable input and an enable output. Whenever the enable input is 0, the component is disabled, and the output will be all floating bits. The enable output is 1 whenever the component is enabled and none of the indexed inputs are 1. Thus, you can take two priority encoders and connect the enable output of the first to the enable input of the second: If any of the indexed inputs to the first are 1, then the second will be disabled and so its output will be all floating. But if none of the first's indexed inputs are 1, then its output will be all-floating bits, and the second priority encoder will be enabled and it will identify the highest-priority input with a 1.

    An additional output of the priority encoder is 1 whenever the priority encoder is enabled and finds a 1 on one of the indexed inputs. When chaining priority encoders together, this output can be used to identify which of the encoders was triggered.

    Pins (assuming component faces east)

    West edge, variable number (inputs, bit width 1)
    Input values, indexed from 0 at the top/west end of the edge.
    East edge, upper pin (output, bit width matches Select Bits attribute)
    Output: the highest index among those inputs whose value is 1 - or all floating bits if no inputs are 1 or if the component is disabled via the Enable In input.
    East edge, lower pin (output, bit width 1)
    Group Signal: 1 if the component is enabled and at least one indexed input has a value of 1; otherwise this output is 0.
    South edge (input, bit width 1)
    Enable In: if 0, the component is disabled; otherwise the component is enabled.
    North edge (output, bit width 1)
    Enable Out: 1 if this component is enabled and none of the indexed inputs are 1; otherwise the output is 0.

    Attributes

    When the component is selected or being added, the digits '1' through '4' alter its Select Bits attribute and the arrow keys alter its Facing attribute.

    Facing
    The direction of the component (its output relative to its input).
    Select Bits
    The bit width of the component's primary output. The number of indexed inputs to the priority encoder will be 2selectBits.
    Disabled Output
    Specifies what each bit of the output should be when the component is disabled (i.e., when the enable pin is 0). Options include zero and floating; in the latter case, the output is effectively disconnected from any other ports.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    -logisim-2.7.1/doc/el/html/libs/plexers/mux.html0000644000175000017500000000675411541757130021325 0ustar vincentvincent Multiplexer

    Multiplexer

    Library: Plexers
    Introduced: 2.0 Beta 11
    Appearance:

    Behavior

    Copies an input on the west edge onto the output on the east edge; which of the inputs to copy is specified via the current value received through the input on the south edge. I find it useful to think of a multiplexer as analogous to a railroad switch, controlled by the select input.

    (Incidentally, some authorities spell this multiplexor, but multiplexer is the predominant spelling.)

    Pins (assuming component faces east, select is bottom/left)

    West edge, variable number (inputs, bit width matches Data Bits attribute)
    Data values, one of which is to be routed to the output. Each input data value is numbered, starting with 0 on the north.
    East edge (output, bit width matches Data Bits attribute)
    The output value will match the input values on the west edge whose number is the same as the value currently received through the select input on the south. If the select input contains any unspecified (i.e., floating) bits, then the output is completely floating.
    South edge, left side indicated by gray circle (input, bit width matches Select Bits attribute)
    Select input: The value of this input determines which input on the west edge to route to the output on the east edge.
    South edge, right side (input, bit width 1)
    Enable: When 0, the multiplexer's output consists of all floating bits, regardless of the data and select inputs.

    Attributes

    When the component is selected or being added, the digits '1' through '4' alter its Select Bits attribute, Alt-0 through Alt-9 alter its Data Bits attribute, and the arrow keys alter its Facing attribute.

    Facing
    The direction of the component (its output relative to its input).
    Select Location
    The location of the select and enable lines relative to the component.
    Select Bits
    The bit width of the component's select input on its south edge. The number of inputs to the multiplexer will be 2selectBits.
    Data Bits
    The bit width of the data being routed through the multiplexer.
    Disabled Output
    Specifies what each bit of the output should be when the component is disabled (i.e., when the enable pin is 0). Options include zero and floating; in the latter case, the output is effectively disconnected from any other ports.
    Include Enable?
    The component has an enable input when this attribute is yes. The attribute is primarily for supporting circuits built using older versions of Logisim that did not provide an enable input.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/plexers/index.html0000644000175000017500000000252411541757130021612 0ustar vincentvincent Plexers Library

    Plexers library

    The Plexers library includes control components. Like the components of the Gates library, all are combinational, but their purpose is generally for routing values.

    Multiplexer
    Demultiplexer
    Decoder
    Priority Encoder
    Bit Selector

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/plexers/demux.html0000644000175000017500000000727511541757130021635 0ustar vincentvincent Demultiplexer

    Demultiplexer

    Library: Plexers
    Introduced: 2.0 Beta 11
    Appearance:

    Behavior

    Copies the input on the west edge onto exactly one of the outputs on the east edge; which of these outputs is specified via the current value received through the input on the south edge. I find it useful to think of a demultiplexer as analogous to a railroad switch, controlled by the select input.

    (Incidentally, some authorities spell this demultiplexor, but demultiplexer is the predominant spelling.)

    Pins (assuming component faces east, select is bottom/left)

    West edge (input, bit width matches Data Bits attribute)
    The value to be routed to one of the outputs on the east edge.
    East edge, variable number (outputs, bit width matches Data Bits attribute)
    The outputs are numbered starting with 0 on the north. An output will match the west input if its number matches the value currently received through the select input on the south; otherwise, its value will be either all-zeroes or all-floating, depending on the value of the Three-State? attribute. If the select input contains any unspecified bits, then all outputs are floating.
    South edge, left side (input, bit width 1)
    Enable: When 0, all outputs consist of all floating bits, regardless of the data and select inputs.
    South edge, right side indicated by gray circle (input, bit width matches Select Bits attribute)
    Select input: The value of this input determines to which output on the east edge to route the value received on the west edge.

    Attributes

    When the component is selected or being added, the digits '1' through '4' alter its Select Bits attribute, Alt-0 through Alt-9 alter its Data Bits attribute, and the arrow keys alter its Facing attribute.

    Facing
    The direction of the component (specifying which side has the outputs).
    Select Location
    The location of the select and enable lines relative to the component.
    Select Bits
    The bit width of the component's select input on its south edge. The number of outputs for the demultiplexer will be 2selectBits.
    Data Bits
    The bit width of the data being routed through the demultiplexer.
    Three-state?
    Specifies whether the unselected outputs should be floating (Yes) or zero (No).
    Disabled Output
    Specifies what each bit of the outputs should be when the component is disabled (i.e., when the enable pin is 0). Options include zero and floating; in the latter case, the outputs are effectively disconnected from any other ports.
    Include Enable?
    The component has an enable input when this attribute is yes. The attribute is primarily for supporting circuits built using older versions of Logisim that did not provide an enable input.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/plexers/decoder.html0000644000175000017500000000566611541757130022122 0ustar vincentvincent Decoder

    Decoder

    Library: Plexers
    Introduced: 2.0 Beta 11
    Appearance:

    Behavior

    Emits 1 on exactly one output; which output is 1 depends on the current value received through the input on the south edge.

    Pins (assuming component faces east, select is bottom/left)

    East edge, variable number (outputs, bit width 1)
    The outputs are numbered starting with 0 on the north. Each output will be 1 if its number matches the value currently received through the select input on the south; otherwise, its value will be either zero or floating, depending on the value of the Three-State? attribute. If the select input contains any unspecified bits, then all outputs are floating.
    South edge, left side (input, bit width 1)
    Enable: When 0, all outputs consist of all floating bits (or zeros), regardless of the select input.
    South edge, right side indicated by gray circle (input, bit width matches Select Bits attribute)
    Select input: The value of this input determines which of the outputs is 1.

    Attributes

    When the component is selected or being added, the digits '1' through '4' alter its Select Bits attribute and the arrow keys alter its Facing attribute.

    Facing
    The direction of the component (specifying which side has the outputs).
    Select Location
    The location of the select and enable lines relative to the component.
    Select Bits
    The bit width of the component's select input on its south edge. The number of outputs for the decoder will be 2selectBits.
    Three-state?
    Specifies whether the unselected outputs should be floating (Yes) or zero (No).
    Disabled Output
    Specifies what each bit of the outputs should be when the component is disabled (i.e., when the enable pin is 0). Options include zero and floating; in the latter case, the outputs are effectively disconnected from any other ports.
    Include Enable?
    The component has an enable input when this attribute is yes. The attribute is primarily for supporting circuits built using older versions of Logisim that did not provide an enable input.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/mem/0000755000175000017500000000000011541757130016706 5ustar vincentvincentlogisim-2.7.1/doc/el/html/libs/mem/shiftreg.html0000644000175000017500000001051411541757130021410 0ustar vincentvincent Shift Register

    Shift Register

    Library: Memory
    Introduced: 2.3.0
    Appearance:

    Behavior

    This register consists of several stages, where each clock may lead to each stage receiving the value in the previous stage, while a new value is loaded into the first stage. The component optionally also supports parallel loads and stores to all stages' values.

    The clear input resets all stages to 0 (all zeroes) asynchronously; that is, as long as the clear input is 1, all values are pinned to 0, regardless of the clock input.

    Pins

    * An asterisk marks pins that exist only when the Parallel Load attribute is enabled.

    West edge, top pin (input, bit width 1)
    Shift: When 1 or disconnected, all stages advance with the clock trigger; but if it is 0, no advance takes place. This input is ignored if the Load input is 1.
    West edge, middle pin (input, bit width matches Data Bits attribute)
    Data: When advancing the stages, the value found at this input is loaded into the first stage.
    West edge, bottom pin marked with triangle (input, bit width 1)
    Clock: At the instant that this is triggered as specified by the Trigger attribute, the component may advance the stages or load new values.
    *North edge, left pin (input, bit width 1)
    Load: When this 1, the values found on the other north-edge pins are loaded into all stages at the next clock trigger. When 0 or disconnected, no load occurs.
    *North edge, other pins (input, bit width matches Data Bits attribute)
    Data: These values are loaded into all stages when the clock is triggered while the load input is 1. The leftmost input corresponds to the youngest stage.
    South edge, left pin (input, bit width 1)
    Clear: When this is 1, all stages are asynchronously reset to 0, and all other inputs are ignored.
    *South edge, other pins (output, bit width matches Data Bits attribute)
    Output: Emits the value stored in each stage, with the youngest stage reflected on the leftmost of the pins (next to the clear input).
    East edge (output, bit width matches Data Bits attribute)
    Output: Emits the value stored in the final (oldest) stage.

    Attributes

    When the component is selected or being added, the digits '0' through '9' alter its Number of Stages attribute and Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the value stored in each stage.
    Number of Stages
    The number of stages included in the component.
    Parallel Load
    If yes, then the component includes inputs and outputs facilitating parallel access to all the stages' values.
    Trigger
    Configures how the clock input is interpreted. The value rising edge indicates that the register should update its value at the instant when the clock rises from 0 to 1. The falling edge value indicates that it should update at the instant the clock falls from 1 to 0.
    Label
    The text within the label associated with the component.
    Label Font
    The font with which to render the label.

    Poke Tool Behavior

    If the Parallel Load attribute is no, or if the Data Bits attribute is more than 4, then poking the register has no effect. Otherwise, clicking the component will bring keyboard focus to the clicked stage (indicated by a red rectangle), and typing a hexadecimal digit will change the value stored in that stage.

    Text Tool Behavior

    Allows the label associated with the component to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/mem/rom.html0000644000175000017500000000642211541757130020375 0ustar vincentvincent ROM

    ROM

    Library: Memory
    Introduced: 2.1.0
    Appearance:

    Behavior

    The ROM component stores up to 16,777,216 values (specified in the Address Bit Width attribute), each of which can include up to to 32 bits (specified in the Data Bit Width attribute). A circuit can access the current values in ROM, but it cannot change them. The user can modify individual values interactively via the Poke Tool, or the user can modify the entire contents via the Menu Tool.

    Unlike the RAM component, the ROM component's current contents are stored as an attribute of the component. Thus, if a circuit containing a ROM component is used twice, then both ROM components will hold the same values. Also because of this behavior, the current ROM contents are stored in files created by Logisim.

    Current values are displayed in the component. Addresses displayed are listed in gray to the left of the display area. Inside, each value is listed using hexadecimal. The value at the currently selected address will be displayed in inverse text (white on black).

    Pins

    A on west edge (input, bit width matches Address Bit Width attribute)
    Selects which of the values are currently being accessed by the circuit.
    D on east edge (input/output, bit width matches Data Bit Width attribute)
    Outputs the value at the currently selected address at the D pin if sel is 1 or floating. If sel is 0, then D will be floating.
    sel on south edge (input, bit width 1)
    If you have just one ROM module, ignore this input. If you have multiple ROM modules in parallel, you can use this input to enable or disable the entire ROM module, based on whether the value is 1 or 0. In other words, when this is 0, no value is emitted on the D output.

    Attributes

    When the component is selected or being added, the digits '0' through '9' alter its Address Bit Width attribute and Alt-0 through Alt-9 alter its Data Bit Width attribute.

    Address Bit Width
    The bit width of the address bits. The number of values stored in ROM is 2addrBitWidth.
    Data Bit Width
    The bit width of each individual value in memory.
    Contents
    Stores the contents of memory.

    Poke Tool Behavior

    See poking memory in the User's Guide.

    Text Tool Behavior

    None.

    Menu Tool Behavior

    See pop-up menus and files in the User's Guide.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/mem/register.html0000644000175000017500000000734711541757130021433 0ustar vincentvincent Register

    Register

    Library: Memory
    Introduced: 2.0 Beta 1
    Appearance:

    Behavior

    A register stores a single multi-bit value, which is displayed in hexadecimal within its rectangle, and is emitted on its Q output. When the clock input (indicated by a triangle on the south edge) indicates so, the value stored in the register changes to the value of the D input at that instant. Exactly when the clock input indicates for this to happen is configured via the Trigger attribute.

    The reset input resets the register's value to 0 (all zeroes) asynchronously; that is, as long as reset is 1, the value is pinned to 0, regardless of the clock input.

    Pins

    East edge, labeled Q (output, bit width matches Data Bits attribute)
    Outputs the value currently stored by the register.
    West edge, labeled D (input, bit width matches Data Bits attribute)
    Data input: At the instant that the clock value rises from 0 to 1, the register's value changes to the value of the D input at that instant.
    West edge, labeled en (input, bit width 1)
    Enable: When this is 0, clock triggers are ignored. The current value continues to appear on the output. The clock triggers are enabled when this input is 1 or undefined.
    South edge, indicated with a triangle (input, bit width 1)
    Clock input: At the instant that this input value rises from 0 to 1 (the rising edge), the register's value will be updated to the value of the D input.
    South edge, labeled 0 (input, bit width 1)
    Asynchronous reset: When 0 or undefined, this input has no effect. As long as it is 1, the register's value is pinned to 0. This occurs asynchronously - that is, without regard to the current clock input value. As long as this is 1, the other inputs have no effect.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the value stored in the register.
    Trigger
    Configures how the clock input is interpreted. The value rising edge indicates that the register should update its value at the instant when the clock rises from 0 to 1. The falling edge value indicates that it should update at the instant the clock falls from 1 to 0. The high level value indicates that the register should update continuously whenever the clock input is 1. And the low level value indicates that it should update continuously when the clock input is 0.
    Label
    The text within the label associated with the register.
    Label Font
    The font with which to render the label.

    Poke Tool Behavior

    Clicking the register brings keyboard focus to the register (indicated by a red rectangle), and typing hexadecimal digits will change the value stored in the register.

    Text Tool Behavior

    Allows the label associated with the component to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/mem/random.html0000644000175000017500000001001211541757130021046 0ustar vincentvincent Random

    Random

    Library: Memory
    Introduced: 2.3.0
    Appearance:

    Behavior

    This component iterates through a pseudorandom sequence of numbers, which steps forward to the following number in the sequence each time the clock is triggered while the component is enabled. Technically speaking, the algorithm used to compute the pseudorandom sequence is a linear congruential generator: Starting from a seed r0, the following number r1 is the number

    r1 = (25,214,903,917 r0 + 11) mod 248

    The next value r2 is computed from r1 using the same computation, and so forth. This sequence is of 48-bit numbers; the value seen from the component is the low-order bits as configured by its Data Bits attribute, after first throwing out the lower 12 bits of the current seed.

    Besides the clock input, the component also includes an enable input, which leads the clock input to be ignored when enable is 0, and the reset input, which resets the component's value asynchronously to the initial seed r0.

    The initial seed is user-configurable. If it is configured at 0 (which is the default), then the seed is based on the current time; when instructed to reset through the reset input, the component computes a new seed based on the new current time.

    Pins

    East edge, labeled Q (output, bit width matches Data Bits attribute)
    Outputs the value currently stored by the component.
    West edge, top pin, labeled with a triangle (input, bit width 1)
    Clock: At the instant that this is triggered as specified by the Trigger attribute, the component steps to the following number in its sequence.
    West edge, bottom pin (input, bit width 1)
    Enable: The component is enabled when this input is disconnected or 1; but if it is 0, then the clock input is ignored.
    South edge (input, bit width 1)
    Reset: When this is 1, the pseudorandom sequence asynchronously resets to the initial seed. (If seed is 0, this new seed should be different from the initial seed used previously.)

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the value emitted by the component.
    Seed
    The starting value used for the pseudorandom sequence. If this is 0 (the default), then the starting value is based on the time that the random sequence began.
    Trigger
    Configures how the clock input is interpreted. The value rising edge indicates that the component should update its value at the instant when the clock rises from 0 to 1. The falling edge value indicates that it should update at the instant the clock falls from 1 to 0.
    Label
    The text within the label associated with the component.
    Label Font
    The font with which to render the label.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    Allows the label associated with the component to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/mem/ram.html0000644000175000017500000001452111541757130020356 0ustar vincentvincent RAM

    RAM

    Library: Memory
    Introduced: 2.0 Beta 1
    Appearance:

    Behavior

    The RAM component, easily the most complex component in Logisim's built-in libraries, stores up to 16,777,216 values (specified in the Address Bit Width attribute), each of which can include up to to 32 bits (specified in the Data Bit Width attribute). The circuit can load and store values in RAM. Also, the user can modify individual values interactively via the Poke Tool, or the user can modify the entire contents via the Menu Tool.

    Current values are displayed in the component. Addresses displayed are listed in gray to the left of the display area. Inside, each value is listed using hexadecimal. The value at the currently selected address will be displayed in inverse text (white on black).

    The RAM component supports three different interfaces, depending on the Data Interface attribute.

    One synchronous load/store port (default)

    The component includes a single port on its east side that serves for both loading and storing data. Which it performs depends on the input labeled ld: 1 (or floating) indicates to load the data at the address designated on the component's west side, and 0 indicates to store the data given on the port. To transmit data into and out of the component, you will need to use a Controlled Buffer component, as illustrated below.

    One asynchronous load/store port

    This is the same as above, except that there is no clock. The value found on the data bus is stored into memory whenever the ld input is 0. If, while the ld input is 0, the address or data changes, then an additional store occurs. This option is meant to more closely approximate the interface of many available random-access memories.

    Separate load and store ports

    Two data ports are provided - one on the west side for storing data, and another on the east side for loading data. This option removes the necessity of dealing with the Controlled Buffer and so it is easier to use.

    Pins

    A on west edge (input, bit width matches Address Bit Width attribute)
    Selects which of the values in memory is currently being accessed by the circuit.
    D on west edge (input, bit width matches Data Bit Width attribute)
    This input is present only if "separate load and store ports" is selected for the Data Interface attribute. When a store is requested (via the clock changing from 0 to 1 while sel and str are both 1 or floating), the value found at this port is stored into memory at the currently selected address.
    D on east edge (input/output or output, bit width matches Data Bit Width attribute)
    If sel and ld are 1 or floating, then the RAM component emits the value found at the currently selected address on this port. If there is a single load/store port, the value read from this port is stored whenever a store is requested.
    str on south edge (input, bit width 1)
    Store: This input is present only if "separate load and store ports" is selected for the Data Interface attribute. When it is 1 or floating, a clock pulse will result in storing the data found on the west edge into memory (provided the sel input is also 1 or floating).
    sel on south edge (input, bit width 1)
    Chip select: This input enables or disables the entire RAM module, based on whether the value is 1/floating or 0. The input is meant primarily for situations where you have multiple RAM units, only one of which would be enabled at any time.
    triangle on south edge (input, bit width 1)
    Clock input: This is absent when the Data Interface attribute's value is "One asynchronous load/store port." In other circumstances, when ld is 0, and this input rises from 0 to 1 (and sel is 1/undefined and clr is 0), then the value at the currently selected address changes to whatever value is at the D pin. As long as the clock input remains 0 or 1, though, the D value will not be stored into memory.
    ld on south edge (input, bit width 1)
    Load: Selects whether the RAM should emit (on D) the value at the current address (A). This output behavior is enabled if out is 1 or undefined; if out is 0, then no value is pushed onto D - but if there is a combined load/store port, stores will be enabled.
    clr on south edge (input, bit width 1)
    Clear: When this is 1, all values in memory are pinned to 0, no matter what the other inputs are.

    Attributes

    When the component is selected or being added, the digits '0' through '9' alter its Address Bit Width attribute and Alt-0 through Alt-9 alter its Data Bit Width attribute.

    Address Bit Width
    The bit width of the address bits. The number of values stored in RAM is 2addrBitWidth.
    Data Bit Width
    The bit width of each individual value in memory.
    Data Interface
    Configures which of the three interfaces are used for communicating data into and out of the component.

    Poke Tool Behavior

    See poking memory in the User's Guide.

    Text Tool Behavior

    None.

    Menu Tool Behavior

    See pop-up menus and files in the User's Guide.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/mem/index.html0000644000175000017500000000353711541757130020713 0ustar vincentvincent Memory Library

    Memory library

    The Memory library includes components that remember information.

    D/T/J-K/S-R Flip-Flop
    Register
    Counter
    Shift Register
    Random
    RAM
    ROM

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/mem/flipflops.html0000644000175000017500000001726511541757130021605 0ustar vincentvincent D/T/J-K/S-R Flip-Flop

    D/T/J-K/S-R Flip-Flop

    Library: Memory
    Introduced: 2.0 Beta 1
    Appearance:

    Behavior

    Each flip-flop stores a single bit of data, which is emitted through the Q output on the east side. Normally, the value can be controlled via the inputs to the west side. In particular, the value changes when the clock input, marked by a triangle on each flip-flop, rises from 0 to 1 (or otherwise as configured); on this rising edge, the value changes according to the table below.

    D Flip-Flop T Flip-Flop J-K Flip-Flop S-R Flip-Flop
    DQ
    00
    11
    TQ
    0Q
    1Q'
    JKQ
    00 Q
    01 0
    10 1
    11 Q'
    SRQ
    00 Q
    01 0
    10 1
    11 ??

    Another way of describing the different behavior of the flip-flops is in English text.

    • D Flip-Flop: When the clock triggers, the value remembered by the flip-flop becomes the value of the D input (Data) at that instant.

    • T Flip-Flop: When the clock triggers, the value remembered by the flip-flop either toggles or remains the same depending on whether the T input (Toggle) is 1 or 0.

    • J-K Flip-Flop: When the clock triggers, the value remembered by the flip-flop toggles if the J and K inputs are both 1 and the value remains the same if both are 0; if they are different, then the value becomes 1 if the J (Jump) input is 1 and 0 if the K (Kill) input is 1.

    • S-R Flip-Flop: When the clock triggers, the value remembered by the flip-flop remains unchanged if R and S are both 0, becomes 0 if the R input (Reset) is 1, and becomes 1 if the S input (Set) is 1. The behavior in unspecified if both inputs are 1. (In Logisim, the value in the flip-flop remains unchanged.)

    By default, the clock triggers on a rising edge — that is, when the clock input changes from 0 to 1. However, the Trigger attribute allows this to change to a falling edge (when the clock input changes from 1 to 0), a high level (for the duration that the clock input is 1), or a low level (for the duration that the clock input is 0). The level-trigger options are unavailable for the T and J-K flip-flops, because a flip-flop behaves unpredictably when told to toggle for an indeterminate amount of time.

    Pins

    West edge, marked by triangle (input, bit width 1)
    Clock input: At the instant that this input value switches from 0 to 1 (the rising edge), the value will be updated according to the other inputs on the west edge. As long as this remains 0 or 1, the other inputs on the west edge have no effect.
    West edge, other labeled pin(s) (input(s), bit width 1)
    These inputs control how the flip-flop's value changes during the rising edge of the clock. Their exact behavior depends on the flip-flop; the above tables summarize their behavior.
    East edge, labeled Q, north end (output, bit width 1)
    Outputs the value currently stored by the flip-flop.
    East edge, south end (output, bit width 1)
    Outputs the complement of the value currently stored by the flip-flop.
    South edge, east end (input, bit width 1)
    Asynchronous reset: When 0 or undefined, this input has no effect. As long as it is 1, the flip-flop's value is pinned to 0. This occurs asynchronously - that is, without regard to the current clock input value. As long as this is 1, the other inputs have no effect.
    South edge, center end (input, bit width 1)
    Enable: When this is 0, clock triggers are ignored. The current bit continues to appear on the output. The clock triggers are enabled when this input is 1 or undefined.
    South edge, west end (input, bit width 1)
    Asynchronous set: When 1 or undefined, this input has no effect. When 1, the flip-flop's value is pinned to 1. This occurs asynchronously - that is, without regard to the current clock input value. As long as this input is 1, the other inputs have no effect, except for the asynchronous reset input, which has priority.

    Attributes

    Trigger
    Configures how the clock input is interpreted. The value rising edge indicates that the flip-flop should update its value at the instant when the clock rises from 0 to 1. The falling edge value indicates that it should update at the instant the clock falls from 1 to 0. The high level value indicates that the flip-flop should update continuously whenever the clock input is 1. And the low level value indicates that it should update continuously when the clock input is 0. Note that the latter two options are unavailable for T and J-K flip-flops.
    Label
    The text within the label associated with the flip-flop.
    Label Font
    The font with which to render the label.

    Poke Tool Behavior

    Clicking a flip-flop using the Poke Tool toggles the bit stored in the flip-flop, unless the asynchronous set/reset inputs currently pin the flip-flop's value.

    Text Tool Behavior

    Allows the label associated with the component to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/mem/counter.html0000644000175000017500000001423511541757130021260 0ustar vincentvincent Counter

    Counter

    Library: Memory
    Introduced: 2.3.0
    Appearance:

    Behavior

    The counter holds a single value, whose value is emitted on the output Q. Each time the clock input (diagrammed with a triangle on the component's south edge) triggers according to its Trigger attribute, the value in the counter may update based on the two inputs on the component's west edge: The upper input is called load and the lower is called count, and they are interpreted as follows.

    loadcounttrigger action
    0 or z0 The counter remains unchanged.
    0 or z1 or z The counter increments.
    10 The counter loads the value found at the D input.
    11 or z The counter decrements.

    The range of counting can be configured using the Maximum Value attribute. When the counter reaches this value, the next increment wraps the counter back to 0; and if it is at 0, then a decrement will wrap the counter around back to its maximum value.

    In addition to the output Q, the component also includes a single-bit output carry. This is 1 whenever the counter is at its maximum and the load and count inputs indicate that the component should increment on the next step - or when the counter is at 0 and the load and count inputs indicate to decrement at the next step.

    The clear input resets the counter's value to 0 (all zeroes) asynchronously; that is, as long as the clr input is 1, the value is pinned to 0, regardless of the clock input.

    Pins

    East edge, labeled Q (output, bit width matches Data Bits attribute)
    Outputs the value currently stored by the counter.
    East edge, lower pin (output, bit width 1)
    Carry: When load and count indicate to increment, this output is 1 whenever the counter is at its maximum. When load and count indicate to decrement, this output is 1 whenever the counter is at 0. At all other times, this output is 0.
    West edge, top pin (input, bit width 1)
    Load: When this is 1 while the count input is 0, the counter will load the value found at the data input at the next clock trigger - or, if the count input happens to be 1, the counter's value will decrement.
    West edge, middle pin labeled D (input, bit with matches Data Bits attribute)
    Data: When the clock triggers while load is 1 and count is 0, the counter's value changes to the value found at this input.
    West edge, lower pin labeled ct (input, bit width 1)
    Count: When this is 1 or unconnected, the value in the counter increments whenever the clock input is triggered - or it decrements if the load input happens to also be 1.
    South edge, indicated with a triangle (input, bit width 1)
    Clock: At the instant that this is triggered as specified by the Trigger attribute, the counter updates as indicated by the load and count inputs.
    South edge, labeled 0 (input, bit width 1)
    Clear: When 0 or undefined, this input has no effect. As long as it is 1, the counter's value is asynchronously pinned to 0. This occurs asynchronously - that is, without regard to the current clock input value. As long as this is 1, the other inputs have no effect.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the value emitted by the component.
    Maximum Value
    The maximum value, at which point the counter will set its carry output.
    Action On Overflow
    The behavior when the counter attempts to increment beyond the maximum value or decrement beyond 0. Four possible actions are supported:
    Wrap around
    The next value is 0 (if incrementing - the maximum value if decrementing)
    Stay at value
    The counter's value remains at the maximum (or 0 if decrementing)
    Continue counting
    The counter continues incrementing/decrementing, keeping the number of bits as provided by the Data Bits attribute
    Load next value
    The next value is loaded from the D input.
    Trigger
    Configures how the clock input is interpreted. The value rising edge indicates that the counter should update its value at the instant when the clock rises from 0 to 1. The falling edge value indicates that it should update at the instant the clock falls from 1 to 0.
    Label
    The text within the label associated with the component.
    Label Font
    The font with which to render the label.

    Poke Tool Behavior

    Clicking the counter brings keyboard focus to the component (indicated by a red rectangle), and typing hexadecimal digits will change the value stored in the counter.

    Text Tool Behavior

    Allows the label associated with the component to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/io/0000755000175000017500000000000011541757130016537 5ustar vincentvincentlogisim-2.7.1/doc/el/html/libs/io/tty.html0000644000175000017500000000546111541757130020253 0ustar vincentvincent TTY

    TTY

    Library: Input/Output
    Introduced: 2.2.0
    Appearance:

    Behavior

    This component implements a very simple dumb terminal. It receives a sequence of ASCII codes and displays each printable character. When the current row becomes full, the cursor moves to the following line, possibly scrolling all current rows up if the cursor was already in the bottom row. The only supported control sequences are: backspace (ASCII 8), which deletes the last character in the final row, unless the final row is already empty; newline (ASCII 10), which moves the cursor to the beginning of the following line, scrolling if necessary; and form-feed (ASCII 12, typed as control-L), which clears the screen.

    Pins

    West edge, upper pin (input, bit width 7)
    Data - this is the ASCII value of the next character to be entered into the terminal.
    West edge, lower pin marked by triangle (input, bit width 1)
    Clock - when triggered while the write-enable pin isn't 0, the current ASCII value on the Data input is processed by the terminal.
    South edge, leftmost pin (input, bit width 1)
    Write Enable - when 1 (or floating or error), a clock edge will result in processing a new character from the data input. The clock and data inputs are ignored when Write Enable is 0.
    South edge, second pin from left (input, bit width 1)
    Clear - when 1, the terminal is cleared of all data, and all other inputs are ignored.

    Attributes

    Rows
    The number of rows displayed in the terminal.
    Columns
    The maximum number of characters displayed in each row of terminal.
    Trigger
    If the value is Rising Edge, then when the clock input changes from 0 to 1, the data input is processed (when enabled by the write-enable and clear inputs). If it is Falling Edge,, then this happens when the clock input changes from 1 to 0.
    Color
    The color with which to draw the text appearing in the terminal.
    Background
    The color with which to draw the terminal's background.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/io/led.html0000644000175000017500000000404511541757130020174 0ustar vincentvincent LED

    LED

    Library: Input/Output
    Introduced: 2.1.3
    Appearance:

    Behavior

    Displays the value of its input by coloring the LED (as specified by its Color attribute) or not depending on whether the input is 1 or 0.

    (The LED component is basically redundant with an output pin, except for a somewhat different appearance. Some users, though, thought it would be nice to include.)

    Pins

    A LED has only one pin, a 1-bit input which is used to determine whether to display the LED colored (when the input is 1) or darkened (when the input is anything else).

    Attributes

    When the component is selected or being added, the arrow keys alter its Facing attribute.

    Facing
    The location of the input pin relative to the component.
    Color
    The color to display when the input value is 1.
    Active On High?
    If yes, then the LED is colored when the input is 1. If no, it is colored when the input is 0.
    Label
    The text within the label associated with the component.
    Label Location
    The location of the label relative to the component.
    Label Font
    The font with which to render the label.
    Label Color
    The color with which to draw the label.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    Allows the label associated with the component to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/io/keyboard.html0000644000175000017500000000743711541757130021240 0ustar vincentvincent Keyboard

    Keyboard

    Library: Input/Output
    Introduced: 2.2.0
    Appearance:

    Behavior

    This component allows the circuit to read keys typed from the keyboard - as long as the keys are representable in the 7-bit ASCII code. After clicking the component using the poke tool, the user can type characters, which accumulate in a buffer. At all times, the ASCII value for the leftmost character in the buffer is sent out the rightmost output. When the clock input is triggered, the leftmost character disappears from the buffer and the new leftmost character is sent on the rightmost output.

    The supported characters for the buffer include all the printable ASCII characters, as well as space, newline, backspace, and control-L. In addition, the left-arrow and right-arrow keys move the cursor within the buffer, and the delete key deletes the character to the right of the cursor (if any).

    The component is asynchronous in the sense that when the buffer is empty and the user types a character, that character is sent immediately as an output, without any wait for a clock pulse.

    Pins

    West edge, marked by a triangle (input, bit width 1)
    Clock - when triggered while the read-enable pin isn't 0, the leftmost character from the buffer is deleted, and the outputs are updated to reflect the buffer's new status.
    South edge, leftmost pin (input, bit width 1)
    Read Enable - when 1 (or floating or error), a clock edge will consume the leftmost character from the buffer. The clock input is ignored when Read Enable is 0.
    South edge, second pin from left (input, bit width 1)
    Clear - when 1, the buffer is emptied and does not accept further characters.
    South edge, second pin from right (output, bit width 1)
    Available - this is 1 when the buffer contains at least one character and 0 when the buffer is empty.
    South edge, rightmost pin (output, bit width 7)
    Data - the 7-bit ASCII code for the leftmost character in the buffer, or 0 if the buffer is empty.

    Attributes

    Buffer Length
    The number of characters that the buffer can hold at once.
    Trigger
    If the value is Rising Edge, then when the clock input changes from 0 to 1, the leftmost character is consumed (when enabled by the Read Enable input). If it is Falling Edge,, then this happens when the clock input changes from 1 to 0.

    Poke Tool Behavior

    Pressing the mouse button into the component gives keyboard focus to the component, and a vertical-bar cursor will be displayed.

    Each character typed will then be inserted into the buffer, as long as the buffer hasn't reached its capacity and the character is one of those that the component supports: the printable characters within the 7-bit ASCII code, as well as space, backspace, newline, and control-L. Additionally, the user may type the left-arrow and right-arrow keys to change the location of the cursor within the buffer, and the user may type the delete key to delete the buffer character (if any) just to the right of the cursor.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/io/joystick.html0000644000175000017500000000457011541757130021272 0ustar vincentvincent Joystick

    Joystick

    Library: Input/Output
    Introduced: 2.2.0
    Appearance:

    Behavior

    The user can drag the red knob within the rounded-square area, and the outputs update to indicate the knob's current x- and y-coordinates. This is meant to emulate the joysticks known from the days of classical arcade games.

    Pins

    West edge, north pin (output, bit width matches Bit Width attribute)
    Indicates knob's x-coordinate, to be interpreted as an unsigned integer whose value will never be 0. Thus, a value of 1 represents the far left, and the maximum value for the bit width indicates the far right. When the knob is at rest (in the center), the value has the bit pattern 10...00.
    West edge, south pin (output, bit width matches Bit Width attribute)
    Indicates knob's y-coordinate, whose value ranges as with the x-coordinate pin. When the knob is pulled to the top, this output's value is 1, and when the knob is pulled to the bottom, the output is the maximum value for the bit width selected.

    Attributes

    When the component is selected or being added, Alt-2 through Alt-5 alter its Bit Width attribute.

    Bit Width
    The number of bits used to indicate each of the knob's coordinates.
    Color
    The knob's color as it is drawn on the screen.

    Poke Tool Behavior

    Pressing the mouse button while within the joystick area moves the knob to that location and updates the outputs. Dragging the mouse continues to move the knob and update the outputs, keeping the knob within the joystick's area. Releasing the mouse button reverts the knob back to its rest position.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/io/index.html0000644000175000017500000000350611541757130020540 0ustar vincentvincent Input/Output Library

    Input/Output library

    The Input/Output library includes components that are meant to correspond to typical components found in electronics for interfacing with a user.

    Button
    Joystick
    Keyboard
    LED
    7-Segment Display
    Hex Digit Display
    LED Matrix
    TTY

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/io/hexdig.html0000644000175000017500000000352711541757130020704 0ustar vincentvincent Hex Digit Display

    Hex Digit Display

    Library: Input/Output
    Introduced: 2.2.0
    Appearance:

    Behavior

    Using a seven-segment display, shows the hexadecimal digit corresponding to the four-bit input. If any of the inputs are not 0/1 (either floating or error), then the display shows a dash ('-'). A separate one-bit input controls the display of the decimal point.

    Pins

    South edge, first from left (input, bit width 4)
    This input is interpreted as an unsigned four-bit number, and the corresponding hexadecimal digit is displayed. If any of the bits are floating or error, then a dash ('-') is displayed.
    South edge, second from left (input, bit width 1)
    Controls the decimal point. If this is left unconnected, the decimal point remains off.

    Attributes

    On Color
    The color with which to draw the display segments and decimal point when they are on.
    Off Color
    The color with which to draw the display segments and decimal point when they are off.
    Background
    The color with which to draw the display's background (transparent by default).

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/io/dotmat.html0000644000175000017500000001017511541757130020721 0ustar vincentvincent LED Matrix

    LED Matrix

    Library: Input/Output
    Introduced: 2.2.0
    Appearance:

    Behavior

    Displays a small grid of pixels, whose values are determined by the current inputs. The grid can have up to 32 rows and 32 columns.

    Pins

    The interface to the component varies depending on the value of the Input Format attribute. It has three possible values.

    Columns
    The inputs are lined along the component's south edge, with one multibit input for each column of the matrix. Each input has as many bits as there are rows in the matrix, with the low-order bit corresponding to the southmost pixel in the column. A 1 indicates to light the corresponding pixel, while a 0 indicates to keep the pixel dim. If any of the bits for a column are either floating or error values, then all pixels in the column are lit.
    Rows
    The inputs are lined along the component's west edge, with one multibit input for each row of the matrix. Each input has as many bits as there are columns in the matrix, with the low-order bit corresponding to the rightmost pixel in the row. As with the Columns format, a 1 indicates to light the corresponding pixel, and a 0 indicates to keep the pixel dim. If any bits for a row are floating or error values, then all pixels in the row are lit.
    Select Rows/Columns
    There are two inputs on the component's west edge. The upper multibit input has as many bits as there are columns in the matrix, with the low-order bit corresponding to the rightmost column. The lower multibit input has as many bits as there are rows in the matrix, with the low-order bit corresponding to the bottom row. If any bits in either input are floating or error values, all pixels in the matrix are lit. Normally, though, a pixel at a particular row-column location is lit if the corresponding column bit in the upper input is 1 and the corresponding row bit in the lower input is 1. For example, for a 5x7 matrix, if the first input is 01010 and the second is 0111010, then the second and fourth columns are lit for the second, third, fourth, and sixth rows; the result appears to be a pair of exclamation points. (This input format may seem unintuitive, but LED matrixes are sold commercially with exactly this interface. Lite-On sells such components, for example.)

    Attributes

    Input Format (read-only after component is created)
    Selects how the pins correspond to pixels, as outlined above.
    Matrix Columns
    Selects how many columns are in the matrix, which may range from 1 up to 32.
    Matrix Rows
    Selects how many rows are in the matrix, which may range from 1 up to 32.
    On Color
    Selects the color of a pixel when it is lit.
    Off Color
    Selects the color of a pixel when it is dim.
    Light Persistence
    When this is other than 0, a pixel that is lit remains lit for the given number of clock ticks after the component's inputs indicate that the pixel should become dim.
    Dot Shape
    The square option means that each pixel is drawn as a 10x10 square, filling the component with no gaps between pixels. The circle option means that each pixel is drawn as a diameter-8 circle, with gaps between each circle. The circle option is more difficult to interpret, but it more closely approximates the off-the-shelf LED matrix components.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/io/button.html0000644000175000017500000000343711541757130020747 0ustar vincentvincent Button

    Button

    Library: Input/Output
    Introduced: 2.1.3
    Appearance:

    Behavior

    Outputs 0 normally; but when the user is pressing the the button using the Poke Tool, the output is 1.

    Pins

    A button has only one pin, a 1-bit output, which is 0 except when the user is pressing the button using the Poke Tool, when it is 1.

    Attributes

    When the component is selected or being added, the arrow keys alter its Facing attribute.

    Facing
    The location of the output pin relative to the component.
    Color
    The color with which to display the button.
    Label
    The text within the label associated with the component.
    Label Location
    The location of the label relative to the component.
    Label Font
    The font with which to render the label.
    Label Color
    The color with which to draw the label.

    Poke Tool Behavior

    When the mouse button is pressed, the component's output will be 1. Upon releasing the mouse button, the output reverts back to 0.

    Text Tool Behavior

    Allows the label associated with the component to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/io/7seg.html0000644000175000017500000000505011541757130020272 0ustar vincentvincent 7-Segment Display

    7-Segment Display

    Library: Input/Output
    Introduced: 2.1.3
    Appearance:

    Behavior

    Displays the values of its eight one-bit inputs. Segments are either colored or light gray depending on the inputs. The correspondence is as follows.

    (Manufacturers vary as to how they map inputs to segments; the correspondence used here is based on Texas Instruments' TIL321.)

    Pins

    North edge, first from left (input, bit width 1)
    Controls the middle horizontal segment.
    North edge, second from left (input, bit width 1)
    Controls the upper vertical segment on the left side.
    North edge, third from left (input, bit width 1)
    Controls the upper horizontal segment.
    North edge, fourth from left (input, bit width 1)
    Controls the upper vertical segment on the right side.
    South edge, first from left (input, bit width 1)
    Controls the lower vertical segment on the left side.
    South edge, second from left (input, bit width 1)
    Controls the bottom horizontal segment.
    South edge, third from left (input, bit width 1)
    Controls the lower vertical segment on the right side.
    South edge, fourth from left (input, bit width 1)
    Controls the decimal point.

    Attributes

    On Color
    The color with which to draw the display segments and decimal point when they are on.
    Off Color
    The color with which to draw the display segments and decimal point when they are off.
    Background
    The color with which to draw the display's background (transparent by default).
    Active On High?
    If yes, then the segments light when the corresponding input is 1. If no, they light when the corresponding input is 0.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/index.html0000644000175000017500000003265211541757126020142 0ustar vincentvincent Library Reference

    Library Reference

    A Logisim library holds a set of tools that allow you to interact with a circuit via clicking and dragging the mouse in the canvas area. Most often, a tool is intended for adding components of a particular type into a circuit; but some of the most important tools, such as the Poke Tool and the Select Tool, allow you to interact with components in other ways.

    All of the tools included in Logisim's built-in libraries are documented in this reference material.

    Wiring library
    Splitter
    Pin
    Probe
    Tunnel
    Pull Resistor
    Clock
    Constant
    Power/Ground
    Transistor
    Transmission Gate
    Bit Extender

    Gates library

    NOT Gate
    Buffer

    AND/OR/NAND/NOR Gate

    XOR/XNOR/Odd Parity/Even Parity Gate
    Controlled Buffer/Inverter

    Plexers library
    Multiplexer
    Demultiplexer
    Decoder
    Priority Encoder
    Bit Selector

    Arithmetic library
    Adder
    Subtractor
    Multiplier
    Divider
    Negator
    Comparator
    Shifter
    Bit Adder
    Bit Finder

    Memory library
    D/T/J-K/S-R Flip-Flop
    Register
    Counter
    Shift Register
    Random
    RAM
    ROM

    Input/Output library
    Button
    Joystick
    Keyboard
    LED
    7-Segment Display
    Hex Digit Display
    LED Matrix
    TTY

    Base library
    Poke Tool
    Edit Tool
    Select Tool
    Wiring Tool
    Text Tool
    Menu Tool
    Label
    logisim-2.7.1/doc/el/html/libs/gates/0000755000175000017500000000000011541757126017240 5ustar vincentvincentlogisim-2.7.1/doc/el/html/libs/gates/xor.html0000644000175000017500000001760211541757126020744 0ustar vincentvincent XOR/XNOR/Odd Parity/Even Parity Gate

    XOR/XNOR/Odd Parity/Even Parity Gate

    Library: Gates
    Introduced: 2.0 Beta 1 for XOR/Odd/Even; 2.0 Beta 6 for XNOR
    Appearance:
    XOR XNOR Odd
    Parity
    Even
    Parity
    Shaped:
    Rectangular:

    Behavior

    The XOR, XNOR, Even Parity, and Odd Parity gates each compute the respective function of the inputs, and emit the result on the output.

    By default, any inputs that are left unconnected are ignored — that's if the input truly has nothing attached to it, not even a wire. In this way, you can insert a 5-input gate but only attach two inputs, and it will work as a 2-input gate; this relieves you from having to worry about configuring the number of inputs every time you create a gate. (If all inputs are unconnected, the output is the error value X.) Some users, though, prefer that Logisim insist that all inputs be connected, since this is what corresponds to real-world gates. You can enable this behavior by going to the Project > Options… menu item, selecting the Simulation tab, and selecting Error for undefined inputs for Gate Output When Undefined.

    The two-input truth table for the gates is the following.

    xyXOR XNOROddEven
    00 01 01
    01 10 10
    10 10 10
    11 01 01

    As you can see, the Odd Parity gate and the XOR gate behave identically with two inputs; similarly, the even parity gate and the XNOR gate behave identically. But if there are more than two specified inputs, the XOR gate will emit 1 only when there is exactly one 1 input, whereas the Odd Parity gate will emit 1 if there are an odd number of 1 inputs. The XNOR gate will emit 1 only when there is not exactly one 1 input, while the Even Parity gate will emit 1 if there are an even number of 1 inputs. The XOR and XNOR gates include an attribute titled Multiple-Input Behavior that allow them to be configured to use the Odd Parity and Even Parity behavior.

    If any of the inputs are the error value (e.g., if conflicting values are coming into the same wire) or floating, then the output will be the error value.

    The multi-bit versions of each gate will perform its one-bit transformation bitwise on its inputs.

    Note: Many authorities contend that the shaped XOR gate's behavior should correspond to the odd parity gate, but there is not agreement on this point. Logisim's default behavior for XOR gates is based on the IEEE 91 standard. It is also consistent with the intuitive meaning underlying the term exclusive or: A waiter asking whether you want a side dish of mashed potatoes, carrots, peas, or cole slaw will only accept one choice, not three, whatever some authorities may tell you. (I must admit, though, that I have not subjected this statement to a rigorous test.) You can configure the XOR and XNOR gates to use parity by changing its Multiple-Input Behavior attribute.

    Pins (assuming component faces east)

    West edge (inputs, bit width according to Data Bits attribute)

    The inputs into the component. There will be as many of these as specified in the Number of Inputs attribute.

    Note that if you are using shaped gates, the west side of XOR and XNOR gates will be curved. Nonetheless, the input pins are in a line. Logisim will draw short stubs illustrating this; and if you overshoot a stub, it will silently assume that you did not mean to overshoot it. In "printer view", these stubs will not be drawn unless they are connected to wires.

    East edge (output, bit width according to Data Bits attribute)

    The gate's output, whose value is computed based on the current inputs as described above.

    Attributes

    When the component is selected or being added, the digits '0' through '9' alter its Number of Inputs attribute, Alt-0 through Alt-9 alter its Data Bits attribute, and the arrow keys alter its Facing attribute.

    Facing
    The direction of the component (its output relative to its inputs).
    Data Bits
    The bit width of the component's inputs and outputs.
    Gate Size
    Determines whether to draw a wider or narrower version of the component. This does not affect the number of inputs, which is specified by the Number of Inputs attribute; however, if the number of inputs exceeds 3 (for a narrow component) or 5 (for a wide component), then the gate will be drawn with "wings" to be able to accommodate the number of inputs requested.
    Number of Inputs
    Determines how many pins to have for the component on its west side.
    Output Value
    Indicates how false and true results should be translated into output values. By default, false is indicated by a low voltage (0) and true by a high voltage (1), but one or the other can be replaced by a high-impedance (floating) value instead. This allows wired-or and wired-and connections, as illustrated in the AND/OR/NAND/NOR Gate documentation.
    Label
    The text within the label associated with the gate.
    Label Font
    The font with which to render the label.
    Multiple-Input Behavior (XOR and XNOR only)
    When three or more inputs are provided, the XOR/XNOR gate's output will either be based on whether exactly one input is 1 (the default) or an odd number of inputs are 1.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    Allows the label associated with the gate to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/gates/not.html0000644000175000017500000000600311541757126020725 0ustar vincentvincent NOT Gate

    NOT Gate

    Library: Gates
    Introduced: 2.0 Beta 1
    Appearance:
    Shaped:
    Rectangular:

    Behavior

    The NOT Gate emits the complement of whatever input it receives. The truth table for a NOT gate is the following.

    xout
    01
    10

    If the input is unspecified (i.e., floating), then the output will also be unspecified - unless the "Gate Output When Undefined" option is "Error for undefined inputs," in which case the output is an error. If the input is an error value, then the output will also be.

    A multi-bit NOT gate will perform the above transformation bitwise on its input.

    Pins (assuming component faces east)

    West edge (input, bit width according to Data Bits attribute)
    The component's input.
    East edge (output, bit width according to Data Bits attribute)
    The output, whose value is the complement of the input value.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute and the arrow keys alter its Facing attribute.

    Facing
    The direction of the component (its output relative to its input).
    Data Bits
    The bit width of the component's input and output.
    Gate Size
    Determines whether to draw a larger or a smaller version of the component.
    Output Value
    Indicates how false and true results should be translated into output values. By default, false is indicated by a low voltage (0) and true by a high voltage (1), but one or the other can be replaced by a high-impedance (floating) value instead. This allows wired-or and wired-and connections, as illustrated in the AND/OR/NAND/NOR Gate documentation.
    Label
    The text within the label associated with the gate.
    Label Font
    The font with which to render the label.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    Allows the label associated with the gate to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/gates/index.html0000644000175000017500000000545411541757126021245 0ustar vincentvincent Gates Library

    Gates library

    The Gates library includes a variety of simple components, all of which have a single output whose value is dictated entirely by the current inputs.


    NOT Gate
    Buffer

    AND/OR/NAND/NOR Gate

    XOR/XNOR/Odd Parity/Even Parity Gate
    Controlled Buffer/Inverter

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/gates/controlled.html0000644000175000017500000000676611541757126022312 0ustar vincentvincent Controlled Buffer/Inverter

    Controlled Buffer/Inverter

    Library: Gates
    Introduced: 2.0 Beta 1
    Appearance:

    Behavior

    The controlled buffer and inverter, often called three-state buffers/inverters, each have a one-bit "control" input pin on the south side. The value at this control pin affects how the component behaves:

    • When the value on this pin is 1, then the component behaves just like the respective component (a buffer or a inverter (NOT gate)).
    • When the value is 0 or unknown (i.e., floating), then the component's output is also floating.
    • When the value is an error value (such as would occur when two conflicting values are being fed into the input), then the output is an error value.

    Controlled buffers can be useful when you have a wire (often called a bus) whose value should match the output of one of several components. By placing a controlled buffer between each component output and the bus, you can control whether that component's output is fed onto the bus or not.

    Pins (assuming component faces east, control line right-handed)

    West edge (input, bit width matches Data Bits attribute)
    The component input that will be used to compute the output if the control input is 1.
    South edge (input, bit width 1)
    The component's control input.
    East edge (output, bit width matches Data Bits attribute)
    The component's output, which will be floating if the control input is 0 or floating, the error value if the control input is the error value, and will be computed based on the west-side input if the control input is 1.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute and the arrow keys alter its Facing attribute.

    Facing
    The direction of the component (its output relative to its input).
    Data Bits
    The bit width of the component's inputs and outputs.
    Gate Size
    (Controlled inverter only) Determines whether to draw a larger or a smaller version of the component.
    Control Line Location
    The location of the control line, imagining we are facing the output from the input: If the component faces east and is right-handed, the control line is to the south; but if it is left-handed, the control line is to the north.
    Label
    The text within the label associated with the gate.
    Label Font
    The font with which to render the label.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    Allows the label associated with the gate to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/gates/buffer.html0000644000175000017500000000601511541757126021401 0ustar vincentvincent Buffer

    Buffer

    Library: Gates
    Introduced: 2.0 Beta 1
    Appearance:

    Behavior

    The buffer simply passes through to its right output whatever input it receives on the left side. The truth table for a one-bit buffer is the following.

    xout
    00
    11

    If the input is unspecified (i.e., floating), then the output will also be unspecified - unless the "Gate Output When Undefined" option is "Error for undefined inputs," in which case the output is an error. If the input is an error value, then the output will also be.

    Buffers are the most useless of the gate components provided in Logisim; its presence in the Gates library is just as much a matter of completeness (a component for each possible one-input truth table) as it is a matter of providing useful functionality. Still, it can be occasionally useful to ensure that values propagate in only one direction along a wire.

    Pins (assuming component faces east)

    West edge (input, bit width according to Data Bits attribute)
    The input into the component.
    East edge (output, bit width according to Data Bits attribute)
    The output, which always matches the input into the left side.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute and the arrow keys alter its Facing attribute.

    Facing
    The direction of the component (its output relative to its input).
    Data Bits
    The bit width of the component's inputs and outputs.
    Output Value
    Indicates how false and true results should be translated into output values. By default, false is indicated by a low voltage (0) and true by a high voltage (1), but one or the other can be replaced by a high-impedance (floating) value instead. This allows wired-or and wired-and connections, as illustrated in the AND/OR/NAND/NOR Gate documentation.
    Label
    The text within the label associated with the gate.
    Label Font
    The font with which to render the label.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    Allows the label associated with the gate to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/gates/basic.html0000644000175000017500000002065211541757126021214 0ustar vincentvincent AND/OR/NAND/NOR Gate

    AND/OR/NAND/NOR Gate

    Library: Gates
    Introduced: 2.0 Beta 1
    Appearance:
    AND OR NAND NOR
    Shaped:
    Rectangular:
    DIN 40700:

    Behavior

    The AND, OR, NAND, and NOT gates each compute the respective function of the inputs, and emit the result on the output.

    By default, any inputs that are left unconnected are ignored — that's if the input truly has nothing attached to it, not even a wire. In this way, you can insert a 5-input gate but only attach two inputs, and it will work as a 2-input gate; this relieves you from having to worry about configuring the number of inputs every time you create a gate. (If all inputs are unconnected, the output is the error value X.) Some users, though, prefer that Logisim insist that all inputs be connected, since this is what corresponds to real-world gates. You can enable this behavior by going to the Project > Options… menu item, selecting the Simulation tab, and selecting Error for undefined inputs for Gate Output When Undefined.

    The two-input truth table for the gates is the following. (The letter X represents the error value, and the letter Z represents the floating value.)

    AND
    01X/Z
    0000
    101X
    X/Z0XX
       
    OR
    01X/Z
    001X
    1111
    X/ZX1X
    NAND
    01X/Z
    0111
    110X
    X/Z1XX
       
    NOR
    01X/Z
    010X
    1000
    X/ZX0X

    In short, these components work as expected as long as all inputs are either 0 or 1. If an input is neither 0 nor 1 (it is floating or it is the error value) then the component treats it as both 0 and 1: If the output would be the same both ways (as when an AND gate has one input that is definitely 0 and a questionable second input), that will be the output value; but if the output changes depending on whether it is 0 or 1, the output is the error value.

    The multi-bit versions of each gate will perform its one-bit transformation bitwise on its inputs.

    Pins (assuming component faces east)

    West edge (inputs, bit width according to Data Bits attribute)

    The inputs into the component. There will be as many of these as specified in the Number of Inputs attribute.

    Note that if you are using shaped gates, the west side of OR and NOR gates will be curved. Nonetheless, the input pins are in a line. Logisim will draw short stubs illustrating this; and if you overshoot a stub, it will silently assume that you did not mean to overshoot it. In "printer view", these stubs will not be drawn unless they are connected to wires.

    East edge (output, bit width according to Data Bits attribute)

    The gate's output, whose value is computed based on the current inputs as described above.

    Attributes

    When the component is selected or being added, the digits '0' through '9' alter its Number of Inputs attribute, Alt-0 through Alt-9 alter its Data Bits attribute, and the arrow keys alter its Facing attribute.

    Facing
    The direction of the component (its output relative to its inputs).
    Data Bits
    The bit width of the component's inputs and outputs.
    Gate Size
    Determines whether to draw a wider or narrower version of the component. This does not affect the number of inputs, which is specified by the Number of Inputs attribute. However, if shaped gates are selected, then the gate will be drawn with wings to accommodate additional inputs beyond what the shape naturally accommodates.
    Number of Inputs
    Determines how many pins to have for the component on its west side.
    Output Value
    Indicates how false and true results should be translated into output values. By default, false is indicated by a low voltage (0) and true by a high voltage (1), but one or the other can be replaced by a high-impedance (floating) value instead. This allows wired-or and wired-and connections, as illustrated below: At left, the buffers' Output Value attribute is floating/1 and the resistor pulls to 0, giving wired-or behavior; at right, the buffers' Output Value attribute is 0/floating and the resistor pulls to 1, giving wired-and behavior.
    Label
    The text within the label associated with the gate.
    Label Font
    The font with which to render the label.
    Negate x
    If yes, the input is negated before it is fed into the gate. The inputs are counted top-down if the facing is east or west, and they are counted left-to-right if the facing is north or south.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    Allows the label associated with the gate to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/base/0000755000175000017500000000000011541757126017047 5ustar vincentvincentlogisim-2.7.1/doc/el/html/libs/base/wiring.html0000644000175000017500000000667311541757126021250 0ustar vincentvincent Wiring Tool

    Wiring Tool

    Library: Base
    Introduced: 2.0 Beta 1

    Behavior

    The wiring tool is the tool for creating wire segments that carry values from one endpoint to another. The bit width of these values can be anything; exactly which bit width is automatically inferred from the components to which the wires are ultimately attached. If it is not attached to any components, the wire will be drawn gray to indicate that its bit width is unknown; if the components at the locations that the wire helps to connect disagree on the bit width, then the wire will be drawn orange to indicate the conflict, and the wire will in fact refuse to carry any values at all until the user resolves the conflict.

    A single drag of the mouse can create multiple wire segments. The precise process is a little confusing in its description; but it works quite intuitively in practice: If you request a particular wire segment using the Wiring Tool, that segment will be split apart wherever it hits a pin for an existing component, or wherever it hits the endpoint of an existing wire segment. Also, if an endpoint of any of the new wire segments hit somewhere in the middle of an existing wire, then that wire will be split into multiple segments itself.

    For some components that draw short stubs to which wires can connect (such as an OR gate or a controlled buffer), Logisim will silently correct attempts to create wires that slightly overshoot the stub's end.

    You can also shorten an existing wire segment using the Wiring Tool, using a drag that starts or ends at a terminus of the segment, and that overlaps the existing segment.

    All wires in Logisim are either horizontal or vertical.

    Wires are also non-directional; that is, they carry values from either endpoint to the other. Indeed, a wire can carry values in both directions simultaneously; the center wire in the below example is doing this.

    Attributes

    The wiring tool does not itself have attributes, but the wires that it creates do.

    Direction
    Indicates whether the wire is horizontal or vertical. The value of this attribute cannot be changed.
    Length
    Indicates how many pixels long the wire is. The value of this attribute cannot be changed.

    Poke Tool Behavior

    When you click an existing wire segment using the Poke Tool, Logisim displays the current value traveling through that wire. The behavior is particularly useful for multi-bit wires, whose black color provide no visual feedback about what value the wire is carrying.

    For multi-bit values, you can configure exactly how the value is displayed (in binary, decimal, or hexadecimal, for example) using the Layout pane of the Logisim Preferences dialog box.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/base/text.html0000644000175000017500000000467211541757126020732 0ustar vincentvincent Text Tool

    Text Tool

    Library: Base
    Introduced: 2.0 Beta 1

    Behavior

    The text tool allows you to create and edit labels associated with components. Which components support labels are indicated in the 'Text Tool Behavior' section of their documentation. As of the current release, the following components in the built-in libraries support labels.

    Base library Pin
    Clock
    Label
    Probe
    Memory library D/T/JK/SR Flip-Flop
    Register
    Counter
    Shift Register
    Random
    Input/Output library Button
    LED

    For components that can take a label but have none assigned to it currently, you can click anywhere within the component to add a label. If there is already a label, you need to click within the label. If you click at a point where there is not currently a label to be edited, Logisim will initiate the addition of a new Label component.

    In the current version of Logisim, text editing features are still fairly primitive. Selections of a region of text within a label is impossible. There is no way to insert a line break into a label.

    Attributes

    The attributes for the tool are the same as for the label component. These attributes have no effect when editing the label on an existing component, but they are imparted to any labels created using the text tool.

    Clicking on a component supporting the Text Tool will display that component's attributes.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/base/select.html0000644000175000017500000001026711541757126021222 0ustar vincentvincent Select Tool

    Select Tool

    Library: Base
    Introduced: 2.0 Beta 1

    Behavior

    Allows individual components to be placed into the current selection. There are a number of actions possible with this tool.

    • Pressing the mouse button while it is within a currently selected component begins a drag moving all components of the selection.

      By default, Logisim will compute a way to add new wires so that no existing connections are lost during the move. (Sometimes it will delete or shorten existing wires.) If you're performing a move where you do not want these changes to be made, you can press the shift key during the move. If you want to disable this behavior entirely, go to Project > Options, select the Canvas tab, and uncheck the Keep Connections When Moving box; in this case, the connections are computed only when the shift key is down.

      Dragging a selection can lead to unexpected behavior from wires: If you drag a selection including some wires on top of some other wires, all wires are merged, and the merged wires are placed into the selection. As a result, if you drag the selection a second time, the wires previously at the location will not be left behind. This behavior is necessary to keep with the expected behavior of wires in Logisim. And it does not normally constitute a major problem: Logisim will draw the full selection in the midst of dropping, and you should not drop it until you are sure it is in the correct location.

    • Otherwise, clicking the mouse within a component drops all components from the current selection and selects instead the component(s) containing the clicked location.

    • Shift-clicking the mouse within a component toggles that component's presence within the selection. If multiple components include the same location, all components' presence will be toggled. None of this will happen, though, if shift-clicking is mapped to another tool instead (via the project options window's Mouse tab).

    • Dragging the mouse starting at a location not contained within any components drops all components from the current selection and initiates a rectangular selection. All component(s) contained by the rectangle will be placed into the selection.

    • Shift-dragging the mouse starting at a location not contained within any components initiates a rectangular selection. The presence in the selection of all component(s) contained by the rectangle will be toggled. This will not happen, though, if shift-clicking is mapped to another tool instead.

    After selecting the desired items in the selection, you can of course cut/copy/paste/delete all the items via the Edit menu.

    Logisim's behavior when pasting the clipboard into a circuit is somewhat peculiar: It will not immediately place the components into the circuit; instead, the selection will be a collection of "ghosts," which will be dropped into the circuit as soon as they are either dragged to another location or removed from the selection. (This peculiar behavior is necessary because pasting will otherwise merge the wires of the selection into the current circuit at once, and the wires there previously will be dragged with the pasted clipboard if the user wants to move the pasted components somewhere else.)

    Attributes

    None. Selecting a component, though, will display its attributes. With multiple components selected, attributes shared by all are shown, blank if they have different values and otherwise with the value they all have in common. (Wires are ignored if there are any non-wires in the selection.) Changes to the attribute value affect all selected components.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/base/poke.html0000644000175000017500000000356411541757126020703 0ustar vincentvincent Poke Tool

    Poke Tool

    Library: Base
    Introduced: 2.0 Beta 1

    Behavior

    The Poke Tool is for manipulating the current values associated with components. The precise behavior of the Poke Tool varies depending on which component is clicked; this behavior is documented in the `Poke Tool Behavior' section of each individual component. The following components all have support for the Poke Tool.

    Base library Pin
    Clock
    Memory library D/T/J-K/S-R Flip-Flop
    Register
    Counter
    Shift Register
    RAM
    ROM
    Input/Output library Button
    Joystick
    Keyboard

    Also, clicking a wire segment using the Poke tool displays the value currently carried by the wire, as described on the Wiring Tool's page.

    Attributes

    None. Clicking on a component supporting the Poke Tool, though, will display that component's attributes.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/base/menu.html0000644000175000017500000000376311541757126020712 0ustar vincentvincent Menu Tool

    Menu Tool

    Library: Base
    Introduced: 2.0 Beta 1

    Behavior

    The menu tool permits the user to pull up a pop-up menu for components that already exist. By default, right-clicking or control-clicking a component will bring up this pop-up menu; however, the Mouse tab of the project options allows a user to configure the mouse buttons to work differently.

    The pop-up menu for most components has two items.

    • Delete: Removes the component from the circuit.
    • Show Attributes: Places the component's attributes into the window's attribute table, so that the attribute values can be viewed and changed.

    For some components, however, the menu has additional items. Subcircuits (that is, instances of using one circuit as a "black box" within another) are one example of this: In addition to the above two items, the pop-up menu includes another item.

    • View XXX: Changes the circuit layout being viewed and edited to be the subcircuit's layout instead. The values seen in the layout will be part of the same hierarchy as those of the supercircuit. (See the `Debugging subcircuits' section of the User's Guide.)

    Other components may extend the pop-up menu also. In the built-in libraries of the current version of Logisim, the only such components are RAM and ROM.

    Attributes

    None.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/base/label.html0000644000175000017500000000523011541757126021014 0ustar vincentvincent Label

    Label

    Library: Base
    Introduced: 2.0 Beta 1
    Appearance:

    Behavior

    This is a simple text label that can be placed anywhere in the circuit. It does not interact with values traveling through the circuit in any way, except inasmuch as it will be visible when the circuit is drawn.

    In contrast to all other components in the current built-in libraries, label components can be placed anywhere on the canvas; they do not snap to the grid.

    Pins

    None.

    Attributes

    Text
    The text appearing in the label. This value can be edited in the attribute table or, using the text tool, on the canvas.
    Font
    The font to use when drawing the label.
    Horizontal Alignment
    The horizontal positioning technique for the text relative to the label's official location (where the mouse was clicked in creating the label). "Left" means that the text should be drawn so that its left edge is at the location; "right" means that the text should be drawn so that its right edge is at the location; and "center" means that the text should be drawn so that its center (horizontally) is at the location.
    Vertical Alignment

    The vertical positioning technique for the text relative to the label's official location (where the mouse was clicked in creating the label). "Base" means that the baseline should intersect the location; "Top" means that the text's top should intersect the location; "Bottom" means that the text's bottom should intersect the location; and "Center" means that the text should be centered (vertically) at the location.

    The text's top and bottom is computed based on the font's standard ascent and descent values; thus, even if the actual text contains no tall letters (such as b) or descending letters (such as g), it is assumed to contain such letters for the purposes of vertical positioning.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    Allows the text appearing within the label to be edited.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/base/index.html0000644000175000017500000000277411541757126021056 0ustar vincentvincent Base Library

    Base library

    The Base library includes general-purpose tools.

    Poke Tool
    Edit Tool
    Select Tool
    Wiring Tool
    Text Tool
    Menu Tool
    Label

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/base/edit.html0000644000175000017500000001703511541757126020670 0ustar vincentvincent Edit Tool

    Edit Tool

    Library: Base
    Introduced: 2.3.0

    Behavior

    The Edit tool allows the user to rearrange existing components and to add wires. Exactly what the tool does depends on where the user presses the mouse on the canvas.

    • When the mouse is over a wiring point for an existing component, or if it is atop a current wire, the Edit Tool will display a small green circle around the mouse's location. Pressing the button there initiates the addition of a new wire. But if the user doesn't drag the mouse far enough to initiate a wire before releasing the button, the press is treated as a mouse click, and so the wire is simply added into the current selection.

      The bit width of an added wire is inferred from the components to which it is connected. If it is not attached to any components, the wire will be drawn gray to indicate that its bit width is unknown; if the components at the locations that the wire helps to connect disagree on the bit width, then the wire will be drawn orange to indicate the conflict, and the wire will in fact refuse to carry any values at all until the user resolves the conflict.

      All wires in Logisim are either horizontal or vertical, never diagonal.

      Wires are non-directional; that is, they carry values from either endpoint to the other. Indeed, a wire can carry values in both directions simultaneously: In the below example, a bit flows from the upper input at left through the center wire, then it circles back through the center wire, and then it circles forward again through the center wire before reaching the output at lower right.

      A single drag of the mouse can create multiple wire segments. The precise process is a little confusing in its description; but it works quite intuitively in practice: If you request a particular wire segment using the Wiring Tool, that segment will be split apart wherever it hits a pin for an existing component, or wherever it hits the endpoint of an existing wire segment. Also, if an endpoint of any of the new wire segments hit somewhere in the middle of an existing wire, then that wire will be split into multiple segments itself.

      You can also shorten or delete an existing wire segment by initiating a drag at the terminus of the segment and then drawing backwards across the segment. During the drag, the shortening is indicated by drawing a white line over of the portion of the wire that will be removed.

      Some components draw short stubs to which wires can connect, such as the OR gate and controlled buffer. Logisim will silently correct attempts to create wires that slightly overshoot the stub's end.

    • If, however, the user presses the Alt key at a point in the middle of the wire, then the green circle will disappear. A mouse press selects the wire, and a mouse drag moves it.

    • Pressing the mouse button while it is within a currently selected component begins a drag moving all elements of the selection.

      By default, Logisim will compute a way to add new wires so that no existing connections are lost during the move. (Sometimes it will delete or shorten existing wires.) If you're performing a move where you do not want these changes to be made, you can press the shift key during the move. If you want to disable this behavior entirely, go to Project > Options, select the Canvas tab, and uncheck the Keep Connections When Moving box; in this case, the connections are computed only when the shift key is down.

      Dragging a selection can lead to unexpected behavior from wires: If you drag a selection including some wires on top of some other wires, all wires are merged, and the merged wires are placed into the selection. As a result, if you drag the selection a second time, the wires previously at the location will not be left behind. This behavior is necessary to keep with the intuitive behavior of wires in Logisim, where wires never overlap. And it does not normally constitute a major problem: Logisim will draw the full selection in the midst of dropping, and you should not drop it until you are sure it is in the correct location.

    • Pressing the mouse within an unselected component (but not at one of the component's wiring points) drops all components from the current selection and selects instead the component(s) containing the clicked location.

    • Shift-clicking the mouse within a component toggles that component's presence within the selection. If multiple components include the same location, all components' presence will be toggled.

    • Dragging the mouse starting at a location not contained within any components drops all components from the current selection and initiates a rectangular selection. All component(s) contained by the rectangle will be placed into the selection.

    • Shift-dragging the mouse starting at a location not contained within any components initiates a rectangular selection. The presence in the selection of all component(s) contained by the rectangle will be toggled.

    • However, if the Alt key is pressed at a location not contained within any components, this initiates the addition of a new wire. A small green circle is drawn in such a circumstance to indicate this.

    After selecting the desired items in the selection, you can of course cut/copy/paste/delete/duplicate all the items via the Edit menu.

    Some keys have an effect with the Edit Tool.

    • The arrow keys change the Facing attribute for all components in the selection that have such an attribute.

    • The Delete and Backspace keys will delete everything in the selection from the circuit.

    • The Insert and MenuKey-D keys will create a duplicate of the currently selected components.

    Logisim's behavior when duplicating a selection or pasting the clipboard into a circuit is somewhat peculiar: It will not immediately place the components into the circuit; instead, the selection will be a collection of "ghosts," which will be dropped into the circuit as soon as they are either dragged to another location or removed from the selection. (This peculiar behavior is necessary because pasting will otherwise merge the wires of the selection into the current circuit at once, and the wires there previously will be dragged with the pasted clipboard if the user wants to move the pasted components somewhere else.)

    Attributes

    None. Selecting a component, though, will display its attributes. With multiple components selected, attributes shared by all are shown, blank if they have different values and otherwise with the value they all have in common. (Wires are ignored if there are any non-wires in the selection.) Changes to the attribute value affect all selected components.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/arith/0000755000175000017500000000000011541757126017244 5ustar vincentvincentlogisim-2.7.1/doc/el/html/libs/arith/subtractor.html0000644000175000017500000000623011541757126022323 0ustar vincentvincent Subtractor

    Subtractor

    Library: Arithmetic
    Introduced: 2.0 Beta 11
    Appearance:

    Behavior

    This component subtracts values coming in via the west inputs (the upper minus the lower) and outputs the difference on the east output. The component is designed so that it can be cascaded with other subtractors to provide subtract more bits than is possible with a single subtractor: The borrow-in input provides a one-bit value to be borrowed out of the difference (if the borrow-in input is specified), and a borrow-out output indicates whether the component needs to borrow an upper-order bit to complete the subtraction without underflow (assuming unsigned subtraction).

    Internally, the subtractor simply performs a bitwise NOT on the subtrahend, and add this to the minuend along with the NOT of the borrow-in input. (The minuend is the first operand (upper input) to the subtraction, and the subtrahend is the second (lower input). I happen to like the antiquated terms.)

    If either of the operands contains some floating bits or some error bits, then the component will perform a partial subtraction. That is, it will compute as many low-order bits as possible. But above the floating or error bit, the result will have floating or error bits.

    Pins

    West edge, north end (input, bit width matches Data Bits attribute)
    The minuend of the subtraction; that is, the number from which to subtract.
    West edge, south end (input, bit width matches Data Bits attribute)
    The subtrahend of the subtraction; that is, the number to subtract from the minuend.
    North edge, labeled b in (input, bit width 1)
    If 1, then 1 is borrowed out of the difference. If the value is unknown (i.e., floating), then it is assumed to be 0.
    East edge (output, bit width matches Data Bits attribute)
    The lower dataBits bits of the difference of the two values coming in the west edge, minus the bin bit.
    South edge, labeled b out (output, bit width 1)
    The borrow bit computed for the difference. If the values subtracted as unsigned values yield a negative value, then this bit will be 1; otherwise, it will be 0.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the values to be subtracted and of the result.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/arith/shifter.html0000644000175000017500000000707211541757126021604 0ustar vincentvincent Shifter

    Shifter

    Library: Arithmetic
    Introduced: 2.3.0
    Appearance:

    Behavior

    This component includes two inputs, data and dist, and it has one output, which is the result of shifting data by dist places. Both data and output have the same number of bits in them. The component supports the following shift types:

    • Logical Left: All bits in data are shifted up dist places, with the bottom dist places filled with 0's. For example, 11001011 logically shifted left twice is 00101100. (The top two ones are lost.)
    • Logical Right: All bits in data are shifted down dist places, with the upper dist places filled with 0's. For example, 11001011 logically shifted right twice is 00110010. (The bottom two ones are lost.)
    • Arithmetic Right: All bits in data are shifted down dist places, with the upper dist places filled with repetitions of whatever the uppermost bit in data. For example, 11001011 arithmetically shifted right twice is 11110010.
    • Rotate Left: All bits in data are shifted up dist places, with the top dist places wrapped around into the bottom. For example, 11001011 rotated left twice is 00101111.
    • Rotate Right: All bits in data are shifted down dist places, with the bottom dist places wrapped around into the top. For example, 11001011 rotated right twice is 11110010.

    Note that if dist contains any floating or error inputs, then the output is composed entirely of error values, since there is no way to guess how far to shift the input.

    Pins

    West edge, north end (input, bit width matches the Data Bits attribute)
    The value to be shifted.
    West edge, south end (input, bit width is computed as below)
    The number of bits by which to shift the data input. This input should have as many bits as is the minimum number to indicate any shift distance from 0 up to one less than Data Bits; that is, it should be the ceiling of the base-2 logarithm of Data Bits. For example, if Data Bits were 8, this input would require 3 bits; but if it were 9, it would require 4 bits.
    East edge (output, bit width matches the Data Bits attribute)
    The result of shifting the input value by the input distance.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the data input and of the output.
    Shift Type
    One of the five possible shift types as outlined above (Logical Left, Logical Right, Arithmetic Right, Rotate Left, Rotate Right).

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/arith/negator.html0000644000175000017500000000333311541757126021573 0ustar vincentvincent Negator

    Negator

    Library: Arithmetic
    Introduced: 2.0 Beta 22
    Appearance:

    Behavior

    Computes the two's-complement negation of the input. This negation is performed by maintaining all the lower-order bits up to the lowest-order 1, and complementing all bits above that.

    If the value to be negated happens to be the least negative value, then its negation (which cannot be represented in two's-complement form), is still the least negative value.

    Pins

    West edge (input, bit width matches Data Bits attribute)
    The value to negate.
    East edge, labeled -x (output, bit width matches Data Bits attribute)
    The negation of the input. If the input happens to be the least negative value representable in dataBits bits, however, then the output matches the input.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the component's input and output.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/arith/multiplier.html0000644000175000017500000000544011541757126022323 0ustar vincentvincent Multiplier

    Multiplier

    Library: Arithmetic
    Introduced: 2.0 Beta 20
    Appearance:

    Behavior

    This component multiplies two values coming in via the west inputs and outputs the product on the east output. The component is designed so that it can be cascaded with other multipliers to multiply a multiplicand with more bits than is possible with a single multiplier: The carry-in input provides a multi-bit value to be added into the product (if it is specified), and a carry-out output provides the upper half of the product result, which can be fed into another multiplier.

    If the multiplicand, the multiplier, or the carry-in input contain some floating bits or some error bits, then the component will perform a partial multiplication. That is, it will compute as many low-order bits as possible. But above the floating or error bit, the result will have floating or error bits. Note that if the carry-in input is completely floating, then it will be assumed to be all-zeroes.

    Pins

    West edge, north end (input, bit width matches Data Bits attribute)
    The multiplicand (that is, the first of the two numbers to multiply).
    West edge, south end (input, bit width matches Data Bits attribute)
    The multiplier (that is, the second of the two numbers to multiply).
    North edge, labeled c in (input, bit width matches Data Bits attribute)
    A carry value to add into the product. If all bits of the value are unknown (i.e., floating), then they are assumed to be 0.
    East edge (output, bit width matches Data Bits attribute)
    The lower dataBits bits of the product of the two values coming in the west edge, plus the cin value.
    South edge, labeled c out (output, bit width matches Data Bits attribute)
    The upper dataBits bits of the product.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the values to be multiplied and of the result.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/arith/index.html0000644000175000017500000000405411541757126021244 0ustar vincentvincent Arithmetic Library

    Arithmetic library

    The Arithmetic library includes combinational components that perform arithmetic operations on unsigned and two's-complement values.

    Adder
    Subtractor
    Multiplier
    Divider
    Negator
    Comparator
    Shifter
    Bit Adder
    Bit Finder

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/arith/divider.html0000644000175000017500000000617211541757126021566 0ustar vincentvincent Divider

    Divider

    Library: Arithmetic
    Introduced: 2.0 Beta 22
    Appearance:

    Behavior

    This component divides two values coming in via the west inputs and outputs the quotient on the east output. The component is designed so that it can be cascaded with other dividers to provide support a dividend with more bits than is possible with a single divider: The upper input provides the upper dataBits bits of the dividend (if it is specified at all), and the rem bits provide the remainder, which can be fed as the upper input into another divider.

    If the divisor is 0, then no division is performed (i.e., the divisor is assumed to be 1).

    The divider essentially performs unsigned division. That is, the remainder will always be between 0 and divisor-1. The quotient will always be an integer so that

    quotient * divisor + remainder = dividend .
    If, however, the quotient does not fit into dataBits bits, then only the lower dataBits bits will be reported. The component does not provide any method for accessing the upper dataBits bits.

    If either of the operands contains some floating bits or some error bits, then the component's outputs will be either entirely floating or entirely error values.

    Pins

    West edge, north end (input, bit width matches Data Bits attribute)
    The lower dataBits bits of the dividend (that is, the first operand for the division).
    West edge, south end (input, bit width matches Data Bits attribute)
    The divisor (that is, the second operand for the division)
    North edge, labeled upper (input, bit width matches Data Bits attribute)
    The upper dataBits bits of the dividend (that is, the first operand for the division).
    East edge (output, bit width matches Data Bits attribute)
    The lower dataBits bits of the quotient, as specified above.
    South edge, labeled rem (output, bit width matches Data Bits attribute)
    The remainder of the division. This value will always be between 0 and divisor-1.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the values to be divided and of the result.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/arith/comparator.html0000644000175000017500000000444211541757126022305 0ustar vincentvincent Comparator

    Comparator

    Library: Arithmetic
    Introduced: 2.0 Beta 22
    Appearance:

    Behavior

    Compares two values, either as unsigned values or as two's-complement values, depending on the Numeric Type attribute. Normally, one of the outputs will be 1, and the other two outputs will be 0.

    The comparison is performed starting at the most significant bits in each number and descending downward in parallel until a location is found where the two values disagree. If, however, an error value or a floating value is encountered during this descent, then all outputs will match that error or floating value.

    Pins

    West edge, north end (input, bit width matches Data Bits attribute)
    The first of the two values to be compared.
    West edge, south end (input, bit width matches Data Bits attribute)
    The second of the two values to be compared.
    East edge, labeled > (output, bit width 1)
    1 if the first input is greater than the second input, 0 if the first input is less than or equal the second input.
    East edge, labeled = (output, bit width 1)
    1 if the first input equals the second input, 0 if the first input is not equal the second input.
    East edge, labeled < (output, bit width 1)
    1 if the first input is less than the second input, 0 if the first input is greater than or equal the second input.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the component's inputs.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/arith/bitfinder.html0000644000175000017500000000735611541757126022113 0ustar vincentvincent Bit Finder

    Bit Finder

    Library: Arithmetic
    Introduced: 2.6.1
    Appearance:

    Behavior

    The component takes a multi-bit input and determines the the index of a bit, where the index is computed by counting from 0 as the lowest-order bit. Exactly which index it computes depends on the Type attribute, as illustrated by the examples in the below table for the 8-bit sample input 11010100.

    TypeOutput for 11010100
    Lowest-order 12
    Highest-order 17
    Lowest-order 00
    Highest-order 05

    For the lowest-order 1, the output is 2 because if you index the bits starting from 0 for the lowest-order bit, the first 1 you will find is at index 2. (The bits at indices 0 and 1 are both 0.) For the highest-order 1, the output is 7 because the topmost 1 bit is at index 7 (again counting from the lowest-order bit as 0).

    The component's output on the south edge indicates whether the desired bit was found at all. In the above examples involving the input 11010100, the south output is 1 in all cases. But if the input were 00000000 and the component is to find the lowest-order 1, then the south output would be 0 — and the output on the east edge would be 0 as well.

    If while searching for the desired value, a value that is neither 0 or 1 is found (the bit could be floating or an error value), then both outputs will consist entirely of error bits. Note that this occurs only if the problematic bit is encountered before finding the desired bit: For the input x1010100, the output would still be 2 if the lowest-order 1 is desired; but we would get error values if the component's type indicates to search for the highest-order 1 or the highest-order 0, since there is an erroneous bit in a higher-order bit than either the highest-order 0 or the highest-order 1.

    Pins

    West edge (input, bit width matches Data Bits attribute)
    The multibit input that is to be searched for the desired bit.
    East edge (output, bit width computed as described below)
    The index of the desired bit, counting from 0 for the lowest-order bit. The bit width is the minimum number of bits to store the maximum possible index, which is one less than the value of the Data Bits attribute.
    South edge (output, bit width 1)
    1 if the desired bit is found, 0 if all input bits are the inverse of the desired bit, and the error value if a non-0, non-1 value is found before the desired bit.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the input.
    Type
    Indicates which bit to search for — the lowest-order 0, the highest-order 0, the lowest-order 1, or the highest-order 1.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/arith/bitadder.html0000644000175000017500000000504011541757126021707 0ustar vincentvincent Bit Adder

    Bit Adder

    Library: Arithmetic
    Introduced: 2.6.0
    Appearance:

    Behavior

    The component determines how many 1 bits are in its input(s) and emits the total number of 1 bits on its output. For example, given the 8-bit input 10011101, the output would be 5, since there are five 1-bits in the input (the first, the last, and a string of three bits in the middle).

    If any of the input bits are floating or error values, then the output will contain error bits in the output corresponding to the range of possible outputs depending on whether those floating/error values are counted as zeroes or ones. For instance, if the 14-bit input is 111x10110x1101, then the output must be at least 9 (if the x's are interpreted as zeroes) and at most 11 (if they are interpreted as ones). Thus, the output will be 10EE: The upper two bits will be 1 and 0 since all integers between 9 and 11 have 1 and 0 as their top two bits, but the lower two bits are EE since integers between 9 and 11 vary within these bits.

    Pins

    West edge (inputs, bit width matches Data Bits attribute)
    The inputs whose 1 bits are to be counted. The number of inputs is based on the Number of Inputs attribute.
    East edge (output, bit width computed as described below)
    The number of input bits which are 1. The bit width of the output is the minimum number of bits to store the maximum possible value (which would be the product of the Data Bits attribute and the Number of Inputs attribute).

    Attributes

    When the component is selected or being added, the digits '0' through '9' alter its Number of Inputs attribute and Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the input(s).
    Number of Inputs
    The number of input values.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/libs/arith/adder.html0000644000175000017500000000506511541757126021217 0ustar vincentvincent Adder

    Adder

    Library: Arithmetic
    Introduced: 2.0 Beta 11
    Appearance:

    Behavior

    This component adds two values coming in via the west inputs and outputs the sum on the east output. The component is designed so that it can be cascaded with other adders to provide add more bits than is possible with a single adder: The carry-in input provides a one-bit value to be added into the sum also (if it is specified), and a carry-out output provides a one-bit overflow value that can be fed to another adder.

    If either of the addends contains some floating bits or some error bits, then the component will perform a partial addition. That is, it will compute as many low-order bits as possible. But above the floating or error bit, the result will have floating or error bits.

    Pins

    West edge, north end (input, bit width matches Data Bits attribute)
    One of the two values to add.
    West edge, south end (input, bit width matches Data Bits attribute)
    The other of the two values to add.
    North edge, labeled c in (input, bit width 1)
    A carry value to add into the sum. If the value is unknown (i.e., floating), then it is assumed to be 0.
    East edge (output, bit width matches Data Bits attribute)
    The lower dataBits bits of the sum of the two values coming in the west edge, plus the cin bit.
    South edge, labeled c out (output, bit width 1)
    The carry bit computed for the sum. If the values added together as unsigned values yield a result that fits into dataBits bits, then this bit will be 0; otherwise, it will be 1.

    Attributes

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the values to be added and of the result.

    Poke Tool Behavior

    None.

    Text Tool Behavior

    None.

    Back to Library Reference

    logisim-2.7.1/doc/el/html/index.html0000644000175000017500000000054211541757124017200 0ustar vincentvincent Welcome to Logisim!

    Welcome to Logisim!

    Units in the Logisim help system include:

    Guide to Being a Logisim User
    Library Reference

    logisim-2.7.1/doc/el/html/guide/0000755000175000017500000000000011541757124016277 5ustar vincentvincentlogisim-2.7.1/doc/el/html/guide/verify/0000755000175000017500000000000011541757126017605 5ustar vincentvincentlogisim-2.7.1/doc/el/html/guide/verify/sub.html0000644000175000017500000000632611541757126021273 0ustar vincentvincent Substituting libraries

    Substituting libraries

    Now suppose we have two Logisim circuits that are supposed to do the same thing. As an instructor, you might have had students complete an assignment: You have one file containing your solution, but you have several student files containing their work. Maybe the assignment was to build a two-bit adder.

    I'll imagine that we have two files, named adder-master.circ and adder-query.circ. Each file contains a circuit named 2-bit adder (it's important that the circuit to test be named exactly the same), whose appearance is the following.

    adder-master.circ adder-query.circ

    As you can see, the master circuit uses Logisim's built-in adder, while the query circuit uses two subcircuits representing a half adder and a full adder (which themselves are built up of simple gates). For the purpose of our example, the query circuit has a stupid error: The carry from the half adder is not connected into the full adder.

    We build our testing circuit into a different file. There, we load adder-master.circ as a Logisim Library (Project > Load Library > Logisim Library…), and we insert its 2-bit adder as a subcircuit. We could execute this circuit directly to get the desired output for a perfect solution.

    java -jar logisim-filename.jar adder-test.circ -tty table

    But we want to execute the circuit using adder-query.circ rather than adder-master.circ as the loaded library. The naive approach would be to open Logisim and load that library instead; or you might simply remove the adder-master.circ file and rename adder-query.circ to be named adder-master.circ instead. But Logisim includes a handy -sub option that temporarily replace one file by another during that session — without making any changes on disk.

    java -jar logisim-filename.jar adder-test.circ -tty table -sub adder-master.circ adder-query.circ

    The output you would see from this is shown below; it is of course different from what we saw in the previous section since now it is executing using the erroneous adder-query.circ.

    00      00      0E0
    01      00      0E1
    10      00      EE0
    11      00      EE1
    00      01      0E1
    01      01      0E0
    10      01      EE1
    11      01      EE0
    00      10      EE0
    01      10      EE1
    10      10      1E0
    11      10      1E1
    00      11      EE1
    01      11      EE0
    10      11      1E1
    11      11      1E0

    Next: Other verification options.

    logisim-2.7.1/doc/el/html/guide/verify/other.html0000644000175000017500000001025411541757126021616 0ustar vincentvincent Other verification options

    Other verification options

    There are a some additional options related to command-line execution.

    The -load command-line parameter

    A more complex circuit might include a RAM component that needs to be loaded with a program in order for the circuit to have anything to do. You can specify a memory image file at the command line, which will be loaded into any RAM component in the circuit before simulation begins. (This does not work when loading the GUI - it is only for command-line execution.)

    java -jar logisim-filename.jar cpu.circ -tty table -load mem-image.txt

    The order of the parameters is not important (except the table parameter must be immediately after -tty, and the memory image's filename must be immediately after -load). The memory image file should be in Logisim's memory image format.

    Logisim searches for RAM recursively, so this will still work if RAM is nested within a subcircuit. There is no way, though, to distinguish different RAM components: Logisim will attempt to load the same file into every RAM that it can find.

    Options for the -tty parameter

    In our examples thus far, we've always used -tty table to indicate that a table of output values should be displayed. You can customize the behavior in other ways by listing one or more options, separated by commas. For instance, you might write -tty table,halt,speed, and the program will perform all three behaviors listed below. (The order in which they are listed does not matter.)

    halt

    After the simulation ends, a one-line message is displayed explaining why the simulation ended. Error conditions - such as a detected oscillation - are displayed in any case.

    speed

    If you use speed in conjunction with -tty, then after completing the simulation Logisim will display a summary of how quickly the circuit was simulated, such as:

    714 Hz (509 ticks in 712 milliseconds)

    Note that displaying information during the simulation makes the simulation go much slower. As just one comparison, the same circuit and image ran at 714 Hz above with just the speed option but 490 Hz with the table option as well.

    stats

    Shows a tab-delimited table containing statistics about components used by the top-level main circuit in the project. The table includes four columns:

    • Unique: The number of times that component appears in the circuit's hierarchy, where each subcircuit within the hierarchy is counted only once.
    • Recursive: The number of times that component appears in the circuit's hierarchy, where we count each subcircuit as many times as it appears in the hierarchy.
    • Component: The name of the component.
    • Library: The name of the library from which the component came.

    The distinction between Unique and Recursive is explained further under Project menu section. If the file uses circuits from a loaded Logisim library, those components are considered to be black boxes: The contents of the library's circuits are not included in the unique and recursive counts.

    (This feature can be useful for instructors who assign students to build projects using a subset of Logisim's libraries.)

    table

    (as already discussed)

    tty

    Any TTY components send their output to the display (standard output), and any information typed at the keyboard is sent to all Keyboard components in the circuit. These components are included even if they are nested deeply in the subcircuit hierarchy.

    Next: Testing multiple files.

    logisim-2.7.1/doc/el/html/guide/verify/multi.html0000644000175000017500000000564611541757126021640 0ustar vincentvincent Testing multiple files

    Testing multiple files

    In the classroom example, you will have many files that you wish to test for their equivalence, and you won't want to read the output for each of the student's solutions.

    Building comparison into the circuit

    One approach is to build a test circuit that does the comparison directly. Here, we create an additional circuit within the testing file that contains our solution circuit. In our overall testing circuit, we include both the subcircuit from adder-master.circ and the subcircuit from the solution circuit located directly into the nested circuit. We wire it so that there is just one output, which is 1 as long as the two subcircuits agree.

    Now we can simply run Logisim substituting each query file. For any correct solution, the only output will be 1.

    Using redirection and shell scripts

    If you're quite comfortable with the command line, you can build your own shell script to accomplish this. Here, we'll use redirection (the > operator) to save the output of each circuit into a file. For instance, we might issue the following two commands to collect the output of the master circuit and the query circuit.

    java -jar logisim-filename.jar adder-test.circ -tty table > output-master.txt
    java -jar logisim-filename.jar adder-test.circ -tty table -sub adder-master.circ adder-query.circ > output-query.txt

    Now we've created two different files. We can then compare the two output files using a program built for that purpose. Under Linux or MacOS X, you might want to use the cmp or diff command-line utilities. Under Windows, you might want to use WinMerge.

    To process several query files, you would like want to build a simple program such as a shell script to iterate through each and comparing the output. Here is how I would do it under Linux's bash:

    RUN_TEST="java -jar logisim-filename.jar adder-test.circ -tty table"
    ${RUN_TEST} > output-master.txt
    for QUERY_FILE in adder-query*.circ
    do
      if ${RUN_TEST} -sub adder-master.circ ${QUERY_FILE} | cmp -s output-master.txt
      then
        echo "${QUERY_FILE} OK"
      else
        echo "${QUERY_FILE} different"
      fi
    done

    Next: User's Guide.

    logisim-2.7.1/doc/el/html/guide/verify/index.html0000644000175000017500000000535111541757126021606 0ustar vincentvincent Command-line verification

    Command-line verification

    Subsections:
    Substituting libraries
    Other verification options
    Testing multiple files

    Logisim includes basic support for executing circuits from the command-line. This is intended both to help with scripted verification of circuit designs and to help instructors perform automated testing of students' solutions.

    We'll start by seeing how to execute a circuit from the command line. For our example, we'll suppose we've built the below circuit in a file named adder-test.circ. It uses a two-bit adder as a subcircuit and iterates using a counter through all 16 possible inputs to it.

    After this circuit has been built, we then execute Logisim from the command line, providing the filename of the project and the -tty option with the table parameter.

    java -jar logisim-filename.jar adder-test.circ -tty table

    Without bringing up any windows, Logisim loads the circuit and begins to execute it, ticking any clocks as fast as it can while completing the propagation between each tick. After each propagation is completed, Logisim loads the current values of the output pins; if any have changed from the previous propagation, then all values are displayed in tab-delimited format. If there is an output pin labeled with the special word halt, its output is not displayed — but once the pin's value reaches 1 after a propagation is completed, Logisim ends the simulation.

    For our example, Logisim displays the table below. Because we have two output pins corresponding to the two inputs a and b into the two-bit adder, these outputs are included as the first two columns of the output. And there is another output pin corresponding to the two-bit adder's output, so it is the third column. The columns are ordered left-to-right according to the top-down ordering within the circuit.

    00      00      000
    01      00      001
    10      00      010
    11      00      011
    00      01      001
    01      01      010
    10      01      011
    11      01      100
    00      10      010
    01      10      011
    10      10      100
    11      10      101
    00      11      011
    01      11      100
    10      11      101
    11      11      110
    

    Next: Substituting libraries.

    logisim-2.7.1/doc/el/html/guide/tutorial/0000755000175000017500000000000011541757126020144 5ustar vincentvincentlogisim-2.7.1/doc/el/html/guide/tutorial/tutor-wires.html0000644000175000017500000000447411541757126023347 0ustar vincentvincent Tutorial: Adding wires

    Next: Step 3: Adding text

    Step 2: Adding wires

    After you have all the components blocked out on the canvas, you're ready to start adding wires. Select the Edit Tool (). When the cursor is over a point that receives a wire, a small green circle will be drawn around it. Press the mouse button there and drag as far as you want the wire to go.

    Logisim is rather intelligent when adding wires: Whenever a wire ends at another wire, Logisim automatically connects them. You can also "extend" or "shorten" a wire by dragging one of its endpoints using the edit tool.

    Wires in Logisim must be horizontal or vertical. To connect the upper input to the NOT gate and the AND gate, then, I added three different wires.

    Logisim automatically connects wires to the gates and to each other. This includes automatically drawing the circle at a T intersection as above, indicating that the wires are connected.

    As you draw wires, you may see some blue or gray wires. Blue in Logisim indicates that the value at that point is "unknown," and gray indicates that the wire is not connected to anything. This is not a big deal as you're in the process of building a circuit. But by the time you finish it, none of your wires should be blue or gray. (The unconnected legs of the OR gate will still be blue: That's fine.)

    If you do have a blue or a gray wire after you think everything ought to be connected, then something is going wrong. It's important that you connect wires to the right places. Logisim draws little dots on the components to indicate where wires ought to connect. As you proceed, you'll see the dots turn from blue to light or dark green.

    Once you have all the wires connected, all of the wires you inserted will themselves be light or dark green.

    Next: Step 3: Adding text

    logisim-2.7.1/doc/el/html/guide/tutorial/tutor-text.html0000644000175000017500000000206411541757126023173 0ustar vincentvincent Tutorial: Adding text

    Next: Step 4: Testing your circuit

    Step 3: Adding text

    Adding text to the circuit isn't necessary to make it work; but if you want to show your circuit to somebody (like a teacher), then some labels help to communicate the purpose of the different pieces of your circuit.

    Select the text tool (). You can click on an input pin and start typing to give it a label. (It's better to click directly on the input pin than to click where you want the text to go, because then the label will move with the pin.) You can do the same for the output pin. Or you could just click any old place and start typing to put a label anywhere else.

    Next: Step 4: Testing your circuit

    logisim-2.7.1/doc/el/html/guide/tutorial/tutor-test.html0000644000175000017500000000450611541757126023171 0ustar vincentvincent Tutorial: Testing your circuit

    Next: User's Guide

    Step 4: Testing your circuit

    Our final step is to test our circuit to ensure that it really does what we intended. Logisim is already simulating the circuit. Let's look again at where we were.

    Note that the input pins both contain 0s; and so does the output pin. This already tells us that the circuit already computes a 0 when both inputs are 0.

    Now to try another combination of inputs. Select the poke tool () and start poking the inputs by clicking on them. Each time you poke an input, its value will toggle. For example, we might first poke the bottom input.

    When you change the input value, Logisim will show you what values travel down the wires by drawing them light green to indicate a 1 value or dark green (almost black) to indicate a 0 value. You can also see that the output value has changed to 1.

    So far, we have tested the first two rows of our truth table, and the outputs (0 and 1) match the desired outputs.

    By poking the switches through different combinations, we can verify the other two rows. If they all match, then we're done: The circuit works!



    To archive your completed work, you might want to save or print your circuit. The File menu allows this, and of course it also allows you to exit Logisim. But why quit now?

    Now that you are finished with tutorial, you can experiment with Logisim by building your own circuits. If you want to build circuits with more sophisticated features, then you should navigate through the rest of the help system to see what else you can do. Logisim is a powerful program, allowing you to build up and test huge circuits; this step-by-step process just scratches the surface.

    Next: User's Guide

    logisim-2.7.1/doc/el/html/guide/tutorial/tutor-orient.html0000644000175000017500000000236711541757126023515 0ustar vincentvincent Tutorial: Orienting yourself

    Next: Step 1: Adding gates

    Step 0: Orienting yourself

    When you start Logisim, you'll see a window similar to the following. Some of the details may be slightly different since you're likely using a different system than mine.

    All Logisim is divided into three parts, called the explorer pane, the attribute table, and the canvas. Above these parts are the menu bar and the toolbar.

    We can quickly dispose of the explorer pane and the attribute table: We won't be examining them in this tutorial, and you can just ignore them. Also, the menu bar is self-explanatory.

    That leaves the toolbar and the canvas. The canvas is where you'll draw your circuit; and the toolbar contains the tools that you'll use to accomplish this.

    Next: Step 1: Adding gates

    logisim-2.7.1/doc/el/html/guide/tutorial/tutor-gates.html0000644000175000017500000000657511541757126023325 0ustar vincentvincent Tutorial: Adding gates

    Next: Step 2: Adding wires

    Step 1: Adding gates

    Recall that we're trying to build the following circuit in Logisim.

    I suggest building a circuit by inserting the gates first as a sort of skeleton and then connecting them with wires later. The first thing we'll do is to add the two AND gates. Click on the AND tool in the toolbar (, the next-to-last tool listed). Then click in the editing area where you want the first AND gate to go. Be sure to leave plenty of room for stuff on the left. Then click the AND tool again and place the second AND gate below it.

    Notice the five dots on the left side of the AND gate. These are spots where wires can be attached. It happens that we'll just use two of them for our XOR circuit; but for other circuits, you may find that having more than two wires going to an AND gate is useful.

    Now add the other gates. First click on the OR tool (); then click where you want it. And place the two NOT gates into the canvas using the NOT tool ().

    I left a little space between the NOT gates and the AND gates; if you want to, though, you can put them up against each other and save yourself the effort of connecting them with a wire later.

    Now we want to add the two inputs x and y into the diagram. Select the Input tool (), and place the pins down. You should also place an output pin next to the OR gate's output using the Output tool (). (Again, I'm leaving a bit of space between the OR gate and the output pin, but you might choose to place them right next to each other.)

    If you decide you don't like where you placed something, then you can select it using the Edit tool () and drag it to the desired spot. Or you can delete it altogether by selecting Delete from the Edit menu or pressing the Delete key.

    As you place each component of the circuit, you'll notice that as soon as the component is placed, Logisim reverts to the Edit tool so that you can move the recently-placed component or (as we'll see soon) connect the component to others by creating wires. If you want to add a copy of the recently placed component, a shortcut is to press Control-D to duplicate the selection. (Some computers use another keys for menus, such as the Command key on Macintoshes. You would press that key with the D key.)

    Next: Step 2: Adding wires

    logisim-2.7.1/doc/el/html/guide/tutorial/index.html0000644000175000017500000000302211541757126022136 0ustar vincentvincent Beginner's tutorial

    Beginner's tutorial

    Next: Step 0: Orienting yourself

    Welcome to Logisim!

    Logisim allows you to design and simulate digital circuits. It is intended as an educational tool, to help you learn how circuits work.

    To practice using Logisim, let's build a XOR circuit - that is, a circuit that takes two inputs (which we'll call x and y) and outputs 0 if the inputs are the same and 1 if they are different. The following truth table illustrates.

    We might design such a circuit on paper.
    But just because it's on paper doesn't mean it's right. To verify our work, we'll draw it in Logisim and test it. As an added bonus, we'll get a circuit that's looks nicer than what you probably would draw by hand.

    Step 0: Orienting yourself
    Step 1: Adding gates
    Step 2: Adding wires
    Step 3: Adding text
    Step 4: Testing your circuit

    Enjoy your circuit-building!

    Next: Step 0: Orienting yourself

    logisim-2.7.1/doc/el/html/guide/subcirc/0000755000175000017500000000000011541757126017733 5ustar vincentvincentlogisim-2.7.1/doc/el/html/guide/subcirc/using.html0000644000175000017500000000726311541757126021756 0ustar vincentvincent Using subcircuits

    Using subcircuits

    Now suppose we want to build a 4-to-1 multiplexer using instances of our 2-to-1 multiplexer. Of course, we would first create a new circuit, which we'll call "4:1 MUX." To add 2-to-1 multiplexers into our circuit, we click the 2:1 MUX circuit once in the explorer pane to select it as a tool, and then we can add copies of it, represented as boxes, by clicking within the canvas.

    If you were to double-click the 2:1 MUX circuit in the explorer pane, then the window would switch to editing the 2:1 MUX circuit instead.

    After building up the circuit, we end up with the following.

    Our circuit for a 4-to-1 multiplexer uses three copies of the 2-to-1 multiplexer, each drawn as a box with pins along the side. The pins on this box correspond to the input and output pins in the 2:1 MUX circuit. The two pins on the west side of the box correspond to the two pins that face east in the 2:1 MUX circuit; the pin on the box's east side corresponds to the 2:1 MUX's west-facing pin (which happens to be an output pin); and the pin on the box's south side corresponds to the 2:1 MUX's north-facing pin. The order of the two pins on the box's west side correspond to the same top-down ordering from the subcircuit's design. (If there were several pins on the box's north or south side, they would correspond to the same left-right order in the subcircuit.)

    If the pins in the subcircuit's layout have labels associated with them, then Logisim will display that label in a tip (that is, a temporary text box) when the user hovers the mouse over the corresponding location of the subcircuit component. (If you find these tips irritating, you can disable them via the Preferences window's Layout tab.)

    Several other components will display these tips, too: For some of the pins of a built-in flip-flop, for example, hovering over it explains what that pin does.

    Incidentally, every pin to a circuit must be either an input or an output. Many manufactured chips have pins that behave as an input in some situations and as an output in others; you cannot construct such chips within Logisim (at least, in the current version).

    Logisim will maintain different state information for all subcircuits appearing in a circuit. For example, if a circuit contains a flip-flop, and that circuit is used as a subcircuit several times, then each subcircuit's flip-flop will have its own value when simulating the larger circuit.

    Now that we have the 4-to-1 multiplexer defined, we can now use it in other circuits. Logisim has no limits on how deeply circuits can be nested - though it will object to nesting circuits within themselves!

    Note: There's nothing wrong with editing a circuit that is being used as a subcircuit; in fact, this is quite common. Be aware, though, that any changes to a circuit's pins (adding, deleting, or moving them) will rearrange them also in the containing circuit. Thus, if you change any pins in a circuit, you will also need to edit any circuits using it as a subcircuit.

    Next: Editing subcircuit appearance.

    logisim-2.7.1/doc/el/html/guide/subcirc/library.html0000644000175000017500000000314111541757126022264 0ustar vincentvincent Logisim libraries

    Logisim libraries

    Every Logisim project is automatically a library that can be loaded into other Logisim projects: Just save it into a file and then load the library within another project. All of the circuits defined in the first project will then be available as subcircuits for the second. This feature allows you to reuse common components across projects and to share favorite components with your friends (or students).

    Each project has a designated "main circuit," which can be changed to refer to the current circuit via the Set As Main Circuit option in the Project menu. The only significance of this is that the main circuit is the one that is displayed when you first open the project. The default name of the circuit in a newly created file ("main") has no significance at all, and you can feel free to delete or rename that circuit.

    With a loaded Logisim library, you are allowed to view circuits and manipulate their states, but Logisim will prevent you from altering the circuits' design and other data stored within the file.

    If you want to alter a circuit in a loaded Logisim library, then you need to open it separately within Logisim. As soon as you save it, the other project should automatically load the modified version immediately; but if it does not, you can right-click the library folder in the explorer pane and select Reload Library.

    Next: User's Guide.

    logisim-2.7.1/doc/el/html/guide/subcirc/index.html0000644000175000017500000000233311541757126021731 0ustar vincentvincent Subcircuits

    Subcircuits

    As you build circuits that are more and more sophisticated, you will want to build smaller circuits that you can use multiple times as a module nested within larger circuits. In Logisim, such a smaller circuit that is used in a larger circuit is called a subcircuit.

    If you're familiar with computer programming, you're familiar with the subprogram concept, whether it's called a subroutine, function, method, or procedure in your favored language. The subcircuit concept is analogous to this, and it serves the same purpose: To break a large job into bite-sized pieces, to save the effort of defining the same concept multiple times, and to facilitate debugging.

    Creating circuits
    Using subcircuits
    Editing subcircuit appearance
    Debugging subcircuits
    Logisim libraries

    Next: Creating circuits.

    logisim-2.7.1/doc/el/html/guide/subcirc/debug.html0000644000175000017500000000531011541757126021706 0ustar vincentvincent Debugging subcircuits

    Debugging subcircuits

    As you test larger circuits, you will likely find bugs. To nail down what's going wrong, exploring what's going on in the subcircuits while running the overall circuit can help. To enter the subcircuit's state, you can use any of three different techniques. The most straightforward is probably to view the simulation hierarchy by clicking the second icon in the explorer pane's upper toolbar (), or by selecting "View Simulation Tree" from the Project menu. This switches the explorer pane so that it shows the hierarchy of subcircuits being simulated.

    Double-clicking an element in this hierarchy will display what is happening inside that subcircuit.

    The second way you can enter a subcircuit is to bring up its popup menu by right-clicking or control-clicking it, and then choosing the View option.

    And the third way is to first ensure the Poke Tool is selected and then click the subcircuit you want to enter; a magnifying glass will appear over the subcircuit's center, and double-clicking the magnifying glass will enter the subcircuit's state.

    In any case, once you enter the subcircuit, you'll see that the pins' values in the subcircuit match the values being sent through them from the containing circuit.

    While in the subcircuit, you are allowed to alter the circuit. If the changes affect any of the subcircuit's outputs, they are propagated into the containing circuit. One exception: The subcircuit inputs are determined based on the values coming into the circuit from the supercircuit, so it doesn't make sense to toggle those values. If you attempt to poke a subcircuit's input, a dialog will pop up asking, The pin is tied to the supercircuit state. Create a new circuit state? Clicking No will cancel the toggle request, while clicking Yes will create a copy of the viewed state, divorced from the outer circuit, with the input pin toggled.

    Once you have completed viewing and/or editing, you can return to the parent circuit either by double-clicking the parent circuit in the explorer pane, or via the Go Out To State submenu of the Simulate menu.

    Next: Logisim libraries.

    logisim-2.7.1/doc/el/html/guide/subcirc/creating.html0000644000175000017500000000230111541757126022411 0ustar vincentvincent Creating circuits

    Creating circuits

    Every Logisim project is actually a library of circuits. In its simplest form, each project has only one circuit (called "main" by default), but it is easy to add more: Select Add Circuit... from the Project menu, and type any name you like for the new circuit you want to create.

    Suppose we want to build a 2-to-1 multiplexer named "2:1 MUX." After adding the circuit, Logisim will look like this.

    In the explorer pane, you can now see that the project now contains two circuits, "main", and "2:1 MUX." Logisim draws a magnifying glass over the icon of the circuit currently being viewed; the current circuit name also appears in the window's title bar.

    After editing the circuit to appear like a 2:1 multiplexer, we might end up with the following circuit.

    Next: Using subcircuits.

    logisim-2.7.1/doc/el/html/guide/subcirc/appear.html0000644000175000017500000001655611541757126022106 0ustar vincentvincent Editing subcircuit appearance

    Editing subcircuit appearance

    Default appearance

    By default, when a subcircuit is placed within a larger circuit, it is drawn as a rectangle with a notch indicating the north end of the subcircuit's layout. Pins will be placed on the rectangle's border based on their facing: Pins that face east in the layout (and typically appear on the west side of the layout) will be placed on the rectangle's west side, according to their top-down ordering in the layout. Pins that face south in the layout (typically toward the north side of the layout) will be placed on the rectangle's north side, according to the left-to-right ordering in the layout.

    The default rectangle can optionally include some letters that will appear in the middle of the rectangle. To specify this, select the selection tool () and click the background of the circuit's layout. This will show the circuit attributes in the attribute table, including the Shared Label, Shared Label Facing, and Shared Label Font attributes. The value of the Shared Label attribute will be drawn in the rectangle's center; the Shared Label Facing attribute customizes which direction the text is drawn, and of course the Shared Label Font attribute customizes the font used.

    Customized appearance

    The default appearance is very usable, and indeed Logisim existed for many years with no other option. If, however, you prefer that the subcircuit be drawn differently, you can select Edit Circuit Appearance from the Project menu, and Logisim's interface will switch from its regular layout-editing interface to an interface for drawing the circuit's appearance. (You can also click the far-right icon () in the explorer pane's upper toolbar.) Below, we are editing the 2:1 multiplexer's appearance so that it is drawn with the usual trapezoid rather than a rectangle.

    With the appearance for the 2:1 multiplexer drawn as above, the layout for the 4:1 multiplexer would then appear as the following.

    The appearance editor is like a traditional drawing program, but there are a few special symbols for indicating how the drawing works when placed into a circuit's layout. These special symbols cannot be removed.

    • The green circle with a line coming out of it, which we'll call the anchor. There is exactly one anchor in each subcircuit appearance. Each component in a circuit has a single point identifying its location; a user sees this when creating a new component: The mouse click identifies just a single location, and the component is placed relative to that (usually with the primary output at the mouse's location) The anchor identifies the mouse's location relative to the overall drawing when the subcircuit is created.

      The anchor also identifies the appearance's facing, as indicated by the direction the anchor's line points from its circle. When placing the subcircuit into a layout, the user can change the subcircuit's facing; the anchor's facing indicates in which direction the appearance is oriented. In our example, the anchor is facing east, and each instance of the subcircuit in the 4:1 multiplexer is also facing east, so they are all drawn in the same orientation as the 2:1 multiplexer's appearance.

    • The blue circles and squares with dots in them are the subcircuit's ports. There are exactly as many ports as there are input and output pins in the circuit. Ports corresponding to inputs are drawn as squares, while ports corresponding to outputs are drawn as circles. Each port indicates how a wire connecting into the circuit will correspond to an input or output pin within the layout.

      When you select a port, Logisim will indicate the corresponding pin by popping up a miniature diagram of the layout in the window's bottom right corner, with the corresponding pin(s) drawn in blue. This does not happen when all ports are selected.

    The toolbar contains tools for adding additional shapes, as listed below with descriptions of how the shift and alt key modifies the tool behavior. In addition, clicking or dragging the mouse with the control key pressed regularly snaps the mouse position to the nearest grid point.

    Select, move, copy, and paste shapes.
    Add or edit text.
    Create a line segment. Shift-drag keeps the line's angle at a multiple of 45°.
    Create a quadratic Bezier curve. For the first drag, where you specify the curve's endpoints, shift-drag keeps the endpoints at an angle that is a multiple of 45°. Then you click to indicate the control point's location; shift-click ensures the curve is symmetric, while alt-click draws the curve through the control point.
    Create a sequence of connected lines, whose vertices are indicated by a succession of clicks. Shift-clicking ensures that the angle between the previous vertex and the current one is a multiple of 45°. Double-click or press the Enter key to complete the shape.
    Create a rectangle through dragging from one corner to the opposite corner. Shift-drag to create a square, and alt-drag to create the rectangle starting from the center.
    Create a rectangle with rounded corners through dragging from one corner to the opposite corner. Shift-drag to create a square, and alt-drag to create the rectangle starting from the center.
    Create an oval through dragging from one corner of its bounding box to the opposite corner. Shift-drag to create a circle, and alt-drag to create the oval starting from the center.
    Create an arbitrary polygon, whose vertices are indicated by a succession of clicks. Shift-clicking ensures that the vertex is at a 45° angle from the previous one. Double-click, press the Enter key, or click the starting vertex to complete the shape.

    Next: Debugging subcircuits.

    logisim-2.7.1/doc/el/html/guide/prop/0000755000175000017500000000000011541757126017261 5ustar vincentvincentlogisim-2.7.1/doc/el/html/guide/prop/shortcome.html0000644000175000017500000000405211541757126022153 0ustar vincentvincent Shortcomings

    Shortcomings

    Logisim's propagation algorithm is more than sophisticated enough for almost all educational purposes; but it is not sophisticated enough for industrial circuit design. In order from most damning to least damning, the shortcomings of Logisim's propagation technique include:

    • Except for the issue of gate delays, Logisim does not particularly concern itself with timing issues. It is very idealized, so that a pair of NOR gates in an S-R latch configuration will toggle in lockstep infinitely, rather than the circuit eventually settle into a stable state.

    • Logisim cannot simulate subcircuits whose pins sometimes behave as inputs and sometimes behave as outputs. Components built using Java can have such pins, though: Within the built-in libraries, the Memory library's RAM circuit contains a D pin that can act both as an input and as an output.

    • Logisim cuts off its simulation after a fixed number of iterations assuming that there is an oscillation error. Conceivably, a large circuit that does not oscillate could lead to trouble.

    • Logisim does nothing with respect to discriminating between voltage levels: A bit can be only on, off, unspecified, or error.

    • There are additional shortcomings, too, that I have omitted because they are so obscure that if you were aware of them, it would be obvious that Logisim comes nowhere close to that level. As an extreme example, I have a friend who works for a major chip manufacturer, and his job is to worry about "bubbles" in chips' nanometer-wide wires growing and leading to random disconnection.

    • Even beyond this, I am not a circuit design specialist; thus, there may well be errors in the propagation technique of which I am not aware. I welcome corrections from experts.

    Next: User's Guide.

    logisim-2.7.1/doc/el/html/guide/prop/oscillate.html0000644000175000017500000000430011541757126022123 0ustar vincentvincent Oscillation errors

    Oscillation errors

    The propagation algorithm, which normally works silently without any problems, will become very visible when you create a circuit that oscillates.

    This circuit is currently in a stable condition. But if you change the input to 1, the circuit will effectively enter an infinite loop. After a while, Logisim will simply give up and show an "Oscillation apparent" message telling you that it believes that the circuit is oscillating.

    It will display the values it has at the time it gives up. These values will look wrong - in this screen shot, the AND gate is emitting 1 although one of its inputs is 0, but it could be that the NOT gate has a 1 input and a 1 output.

    Logisim helpfully circles in red each location that seems to be involved in the oscillation. If an involved point lies within a subcircuit, Logisim will draw that subcircuit's outline in red.

    When Logisim detects oscillation, it shuts down all further simulation. You can re-enable simulation using the Simulate menu's Simulation Enabled option.

    Logisim detects oscillation using a fairly simple technique: If the circuit simulation seems to many iterations, then it will simply give up and report oscillation. (The points it identifies as being involved are those that were touched in the last 25% of the iterations.) Thus, it could erroneously report oscillation, particularly if you are working with an exceptionally large circuit; but it would be one that is larger than any I have built using Logisim. In any case, if you are confident that the reporting is in error, you can configure the number of iterations completed before oscillation occurs via the Project Options window's Simulation tab.

    Next: Shortcomings.

    logisim-2.7.1/doc/el/html/guide/prop/index.html0000644000175000017500000000137211541757126021261 0ustar vincentvincent Value propagation

    Value propagation

    Logisim's algorithm for simulating the propagation of values through circuits is not something that you normally need to worry about. Suffice it to say that the algorithm is sophisticated enough to account for gate delays, but not realistic enough to account for more difficult phenomena like varying voltages or race conditions.

    Do you still want to know more?

    Gate delays
    Oscillation errors
    Shortcomings

    Next: Gate delays.

    logisim-2.7.1/doc/el/html/guide/prop/delays.html0000644000175000017500000000442511541757126021435 0ustar vincentvincent Gate delays

    Gate delays

    As an example of the level of sophistication of Logisim's algorithm, consider the following circuit.

    This "obviously" always outputs 0. But NOT gates don't react instantaneously to their inputs in reality, and neither do they in Logisim. As a result, when this circuit's input changes from 0 to 1, the AND gate will briefly see two 1 inputs, and it will emit a 1 briefly. You won't see it on the screen. But the effect is observable when we use the AND gate's output as an input into the clock of a D flip-flop.

    Poking the 0 input to become 1 leads to an instantaneous 1 going into the D flip-flop, and thus the flip-flop's value will toggle every time the circuit input goes from 0 to 1.

    Every component has a delay associated with it. More sophisticated components built into Logisim tend to have larger delays, but these delays are somewhat arbitrary and may not reflect reality.

    From a technical point of view, it is relatively easy to deal with this level of sophistication in a single circuit. Dealing with gate delays well across subcircuits, though, is a bit more complex; Logisim does attempt to address this correctly by placing all primitive component's propagation values into a single schedule regardless of the subcircuit in which the component lies.

    (Via the Project Options window's Simulation tab, you can configure Logisim to add a random, occasional delay to a component's propagation. This is intended to simulate the unevenness of real circuits. In particular, an R-S latch built using two NOR gates will oscillate without this randomness, as both gates will process their inputs in lockstep. This randomness is disabled by default.)

    Note that I'm stopping short of saying that Logisim always addresses gate delays well. But at least it tries.

    Next: Oscillation errors.

    logisim-2.7.1/doc/el/html/guide/prefs/0000755000175000017500000000000011541757126017420 5ustar vincentvincentlogisim-2.7.1/doc/el/html/guide/prefs/window.html0000644000175000017500000000266611541757126021627 0ustar vincentvincent The Window tab

    The Window tab

    This tab includes preferences affecting the appearance of the main window used for Logisim.

    • Show tick rate: If checked, then when ticks are enabled, Logisim displays a measurement of the rate at which it has been able to complete ticks. The tick rate is measured by averaging over the previous 1,000 ticks. (Disabling ticks or changing the maximum tick rate will clear its history.)

      This actual tick rate may be much less than the selected tick rate, because Logisim cannot simulate larger circuits at a very fast rate. For example, Logisim's maximum speed for a reasonably large circuit might be 16 Hz; you can select a faster tick rate, but the actual speed will not exceed 16 Hz.

    • Toolbar location: This drop-down menu configures the location of the toolbar within the overall window. The toolbar may be placed on any of the window's four borders, described as north, south, east, and west. It may also be hidden, or it can be placed "down the middle" - that is, to the left of the canvas but to the right of the explorer pane and attribute table.

    Next: The Layout tab.

    logisim-2.7.1/doc/el/html/guide/prefs/template.html0000644000175000017500000000277711541757126022136 0ustar vincentvincent The Template tab

    The Template tab

    A template is a Logisim file that is used as a starting point whenever Logisim creates a new project. Also, if you have an existing Logisim file with a strangely configured environment, you can "reset" the environment using the Revert All To Template button in the window for editing Project Options.

    Although templates are useful in other situations also, they are particularly suited for classroom use, where an instructor might want to distribute a template for students to start from. This is particularly likely if the class uses Logisim heavily, including many of the more advanced features, in which case the simple default configuration may prove too simple. Templates can also be useful in the classroom setting when the instructor opens a file submitted by a student who has configured the environment significantly.

    By default, the "Plain template" option will be selected, using the default template shipped with Logisim. If you want a bare-bones configuration, you might choose "Empty template." But if you want to designate another file to use as the template, select a template via the Select... button, and then choose the "Custom template" option.

    Next: The International tab.

    logisim-2.7.1/doc/el/html/guide/prefs/layout.html0000644000175000017500000000663511541757126021635 0ustar vincentvincent The Layout tab

    The Layout tab

    This tab includes preferences affecting the behavior of the circuit layout editor.

    • Printer view: Specifies whether to display the circuit on the screen in the same way it is displayed through the printer. Normally this is off, and Logisim displays the on-screen circuit with indications of the current circuit state, and it displays some hints about component interface (most notably, it draws legs on OR gates to indicate where they would connect). The printer view, though, omits indications of state, and it omits such interface hints.

    • Show attribute halo: Specifies whether to draw the pale teal oval around the component or tool whose attributes are currently displayed in the attribute table.

    • Show component tips: Specifies whether to display the "tool tips" that will temporarily appear when the mouse hovers over components supporting them. For example, if you hover over a subcircuit component's pin, it will display the label of the corresponding pin within the subcircuit. Hovering over one of the ends of a splitter will tell you the bits to which that end corresponds. In addition, all components in the Plexers, Arithmetic, and Memory libraries will provide information about their inputs and outputs via tips.

    • Keep connections while moving: Indicates whether Logisim should add new wires when components are moved to preserve their connections. By default this is on — though it can be turned off temporarily by pressing the shift key while moving the components. If this box is unchecked, then the default will be not to add wires during a move — though you can turn it on temporarily by pressing the shift key during the move.

    • Show Ghosts while adding: When checked, and when a tool for adding a new component is selected, a light-gray outline of a component to be added is drawn as the mouse moves across the canvas. For example, if you select the AND gate tool and move the mouse into the window (without pressing the mouse's button), a gray outline of an AND gate will display where the AND gate will appear when the mouse is clicked.

    • After adding component: By default, after adding each individual component, Logisim switches back to the Edit Tool to allow you to move components around and to add wires. The drop-down box allows you to change this behavior so that Logisim stays at the same tool for adding more of the same component, until you yourself opt to choose the Edit Tool. (This was Logisim's default behavior prior to Logisim 2.3.0. While more intuitive, this behavior requires more mouse movement to switch between tools.)

    • First radix when wire poked: Configures how values are displayed when a wire is clicked using the Poke Tool. Clicking a wire displays temporarily the value, staying until the user clicks elsewhere in the circuit.

    • Second radix when wire poked: Configures the second part of how wire values are displayed.

    Next: The Experimental tab.

    logisim-2.7.1/doc/el/html/guide/prefs/intl.html0000644000175000017500000000764511541757126021270 0ustar vincentvincent The International tab

    The International tab

    This tab allows configuration of Logisim according to regional preferences.

    • Gate shape: Logisim supports three standards for drawing gates: shaped gates, rectangular gates, and DIN 40700 gates. The following table illustrates the distinction.

      Shaped Rectangular DIN 40700
      AND
      OR

      Because the shaped style tends to be more popular in the U.S., while the rectangular style tends to be more popular in Europe, some people refer to these styles according to these regions; but the region-neutral terms shaped and rectangular are preferred. The DIN 40700 standard was a standard for drafting digital and analog electronic components adopted by DIN, a German standards organization. DIN adopted the rectangular standard for digital components in 1976, but some engineers continue to use the older style; they appear to be increasingly rare.

      Logisim does not follow any standard exactly; it steers a middle ground to allow switching between them. In particular, the shaped gates are more square than the dimensions defined by the relevant IEEE standard. And, although XOR and XNOR gates really ought to be the same width as OR and NOR gates with the rectangular style, they are not because of difficulties compressing the shaped-XOR gate.

    • Language: Change between languages. The current version is supplied with English, Spanish, Russian, and German translations.

      • The German translation was introduced with Logisim 2.6.1 and remains current. It is by Uwe Zimmermann, a faculty member at Uppsala University in Sweden.
      • The Greek translation was introduced with Logisim 2.7.0 and remains current. It is by Thanos Kakarountas, a faculty member at Technological Educational Institute of Ionian Islands in Greece.
      • The Portuguese translation was introduced with Logisim 2.6.2 and remains current. It is by Theldo Cruz Franqueira, a faculty member at Pontifícia Universidade Católica de Minas Gerais in Brazil.
      • The Russian translation was introduced with Logisim 2.4.0 and remains current. It is by Ilia Lilov, from Russia.
      • The Spanish translation was complete as of Logisim 2.1.0, but subsequent Logisim versions have added new options that remain untranslated. It was contributed by Pablo Leal Ramos, from Spain.

      Translations of Logisim into other languages are welcome! If you are interested, contact me, Carl Burch. This will not be a commitment: I will be happy to hear of your interest, and I will tell you whether I know of somebody who is working on it already, prepare a version for you to work with, and send you instructions. The translation process does not require an understanding of Java.

    • Replace accented characters: Some platforms have poor support for characters (such as ñ or ö) that do not appear in the 7-bit ASCII character set. When this is checked, Logisim will replace all instances of the characters with the appropriate equivalent 7-bit ASCII characters. The checkbox is disabled when the current language does not have any equivalents available (as with English).

    Next: The Window tab.

    logisim-2.7.1/doc/el/html/guide/prefs/index.html0000644000175000017500000000233611541757126021421 0ustar vincentvincent Application Preferences

    Application Preferences

    Logisim supports two categories of configuration options: application preferences and project options. The application preferences address preferences that span all open projects, whereas project options are specific to that one project. This section discusses application preferences; project options are described in another section.

    You can view and edit application preferences via the Preferences... option from the File menu (or, under Mac OS, the Logisim menu), a window will appear with several tabs. We will discuss these tabs separately, and then we will see how preferences can be configured from the command line.

    The Template tab
    The International tab
    The Window tab
    The Layout tab
    The Experimental tab
    The command line

    Next: The Template tab.

    logisim-2.7.1/doc/el/html/guide/prefs/exp.html0000644000175000017500000000161411541757126021104 0ustar vincentvincent The Experimental tab

    The Experimental tab

    These preferences enable features that are considered experimental, inserted to garner user feedback.

    • Graphics acceleration: One Logisim user observed that adding -Dsun.java2d.d3d=True to the command line seemed to improve Logisim's graphics performance by telling it to use hardware graphics acceleration. This drop-down box attempts to configure Logisim to set this up; reports about whether this drop-down box has any effect on performance would be welcome. It won't have any effect until Logisim is restarted.

    Next: Command line options.

    logisim-2.7.1/doc/el/html/guide/prefs/cmdline.html0000644000175000017500000000530511541757126021724 0ustar vincentvincent Command-line options

    Command-line options

    You can configure many of Logisim's application preferences via command line options. This can be particularly useful in a laboratory of single-student computers where you want Logisim to start up the same for students every time, regardless of how previous students may have configured the program.

    The overall command-line syntax is as follows.

    java -jar jarFileName [options] [filenames]
    

    The optional additional files named on the command line will be opened as separate windows within Logisim.

    The following example starts Logisim in its basic configuration.

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

    Supported options include the following.

    -plain
    -empty
    -template templateFile

    Configures the template for Logisim to use.

    -gates [shaped|rectangular]

    Configures which type of gate to use.

    -locale localeIdentifier

    Configures which translation to use. As of this writing, the supported locales include:

    deGerman
    enEnglish
    esSpanish
    ruRussian
    elGreek
    -accents [yes|no]

    This is only relevant for languages that use characters outside the 7-bit ASCII character set; this would include languages using accented characters, and it would not include English. If no, characters outside the 7-bit ASCII character set are replaced with equivalents appropriate to the language; this would be useful for Java/OS combinations where such characters are not supported well.

    -clearprops

    Clear all application preferences at startup, so Logisim will act as if it were being executed on the host system for the first time.

    -nosplash

    Hides the initial Logisim splash screen.

    -help

    Displays a summary of the command line options.

    -version

    Displays the Logisim version number.

    Next: User's Guide.

    logisim-2.7.1/doc/el/html/guide/opts/0000755000175000017500000000000011541757126017266 5ustar vincentvincentlogisim-2.7.1/doc/el/html/guide/opts/toolbar.html0000644000175000017500000000260211541757126021616 0ustar vincentvincent The Toolbar tab

    The Toolbar tab

    The Toolbar tab allows you to configure what tools appear in the toolbar.

    The left side is an explorer listing all the tools available, and the list on the right side displays the current contents of the toolbar. (Three dashes "---" indicate a separator, which is drawn as a gray line.) Between the explorer and the list are five buttons and a combo box:

    • Add Tool adds the currently selected tool in the explorer at left to the end of the toolbar.

    • Add Separator adds a separator to the end of the toolbar.

    • Move Up moves the currently selected item of the toolbar up/left one spot.

    • Move Down moves the currently selected item of the toolbar down/right one spot.

    • Remove removes the currently selected item from the toolbar.

    The attributes associated with the tools are not displayed in this window; instead, you can view and edit them within the main drawing window.

    Next: The Mouse tab.

    logisim-2.7.1/doc/el/html/guide/opts/simulate.html0000644000175000017500000000500611541757126022000 0ustar vincentvincent The Simulation tab

    The Simulation tab

    The Simulation tab allows configuration of the algorithm used for simulating circuits. These parameters apply to all circuits being simulated in the same window, even for circuits that exist in other libraries loaded within the project.

    • The Iterations Until Oscillation drop-down menu specifies how long to simulate a circuit before deciding that it is oscillating. The number represents the number of clicks of the internal hidden clock (a simple gate takes just one click). The default of 1,000 is good enough for almost all purposes, even for large circuits. But you may want to increase the number of iterations if you are working with a circuit where Logisim reports false oscillations. This is unlikely to be a problem in practice, but one such a circumstance is a circuit that incorporates many of the below latch circuits with random noise enabled. You may want to decrease the number of iterations if you are working with a circuit that is prone to oscillating and you are using an unusually slow processor.

    • The Gate Output When Undefined drop-down menu configures how the built-in logic gates behave when some inputs are unconnected or are floating. By default, Logisim ignores such inputs, allowing a gate to work over fewer inputs than it was designed for. However, in real life, a gate will behave unpredictably in such a situation, and so this drop-down menu allows one to change the gates so that they treat such disconnected inputs as errors.

    • The Add Noise To Component Delays checkbox allows you to enable or disable the random noise that is added to the delays of components. The internal simulation uses a hidden clock for its simulation, and to provide a somewhat realistic simulation, each component (excluding wires and splitters) has a delay between when it receives an input and when it emits an output. If this option is enabled, Logisim will occassionally (about once every 16 component reactions) make a component take one click longer than normal.

      I recommend keeping this option off, as this technique does introduce rare errors with normal circuits.

    Next: The Toolbar tab.

    logisim-2.7.1/doc/el/html/guide/opts/mouse.html0000644000175000017500000000424611541757126021312 0ustar vincentvincent The Mouse tab

    The Mouse tab

    By default, when you click the mouse in Logisim's drawing area, the currently selected tool will be used. If you right-click or control-click, it will display a pop-up menu for the current component below the mouse.

    Logisim allows you to modify this behavior, relieving you of the need to go to the toolbar and/or the explorer all the time. (This may also be handy if you are left-handed.) Each combination of a mouse button and a modifier key (any subset of shift, control, and alt) can be mapped to a different tool. The Mouse tab allows you to configure these mappings.

    • On the left side is an explorer where you can choose the tool you want to map.

    • On the right top side is a rectangle in which you can click using the mouse combination you want to click. For example, if you want to create new wires by shift-dragging, then you would first select the Wiring Tool in the Explorer (under the Base library); and then you would shift-click where it says "Click Using Combination To Map Wiring Tool." If that combination is already being used, then the mapping would be replaced with the new tool.

    • Below this area is a list of current mappings. Note that any combinations that aren't listed simply use the currently selected tool.

    • Below is the Remove button, where you can delete the mapping that is currently selected in the table above the button. In the future, then, that mouse combination would map to whatever tool is currently selected in the toolbar or the explorer pane.

    • Below this is a list of attributes for the tool currently selected in the list of mappings. Each mouse-mapped tool has its own set of attributes, different from the attributes used in the explorer pane and in the toolbar. You can edit those attribute values here.

    Next: User's Guide.

    logisim-2.7.1/doc/el/html/guide/opts/index.html0000644000175000017500000000246211541757126021267 0ustar vincentvincent Project Options

    Project Options

    Logisim supports two categories of configuration options: application preferences and project options. The application preferences address preferences that span all open projects, whereas project options are specific to that one project. This section discusses project options; application preferences are described in another section.

    You can view and edit project options via the Options... option from the Project menu. It brings up the Options window with several tabs.

    We will discuss each of these tabs separately.

    The Simulation tab
    The Toolbar tab
    The Mouse tab

    At the bottom of the window is the Revert All To Template button. When clicked, all the options and tool attributes change to the settings in the current template (as selected under the application preferences).

    Next: The Simulation tab.

    logisim-2.7.1/doc/el/html/guide/menu/0000755000175000017500000000000011541757126017245 5ustar vincentvincentlogisim-2.7.1/doc/el/html/guide/menu/winhelp.html0000644000175000017500000000335711541757126021611 0ustar vincentvincent The Window and Help menus

    The Window menu

    Minimize

    Minimizes (iconifies) the current window.

    Maximize (Zoom on MacOS)

    Resizes the current window to its preferred size.

    Close

    Closes the current window.

    Combinational Analysis

    Shows the current Combinational Analysis window, without changing any of its contents.

    Preferences

    Shows the Application Preferences window.

    individual window titles

    Brings the respective window to the front.

    The Help menu

    Tutorial

    Opens the help system to the "Beginner's Tutorial" section of the Guide to Being a Logisim User.

    User's Guide

    Opens the help system to the Guide to Being a Logisim User.

    Library Reference

    Opens the help system to the Library Reference.

    About...

    Displays a window containing the version number, mixed among the splash screen graphics. (On MacOS, this menu item is under the Logisim menu.)

    Next: User's Guide.

    logisim-2.7.1/doc/el/html/guide/menu/simulate.html0000644000175000017500000000606311541757126021763 0ustar vincentvincent The Simulate menu

    The Simulate menu

    Simulation Enabled

    If checked, circuits viewed will be "live:" That is, the values propagating through the circuit will be updated with each poke or change to the circuit.

    The menu option will be automatically unchecked if circuit oscillation is detected.

    Reset Simulation

    Clears everything about the current circuit's state, so that it is as if you have just opened the file again. If you are viewing a subcircuit's state, the entire hierarchy is cleared.

    Step Simulation

    Advances the simulation one step forward. For example, a signal may end up entering a gate during one step, but the gate won't show a different signal until the next simulation step. To help identify which points in the overall circuit have changed, any points whose values change are indicated with a blue circle; if a subcircuit contains any points that have changed in it (or its subcircuits, recursively), then it will be drawn with a blue outline.

    Go Out To State

    When you delve into a subcircuit's state via its pop-up menu, the Go Out To State submenu lists the circuits above the currently viewed circuit's state. Selecting one displays the corresponding circuit.

    Go In To State

    If you have delved into a subcircuit's state and then moved back out, this submenu lists the subcircuits below the current circuit. Selecting one of the circuits displays the corresponding circuit.

    Tick Once

    Steps one tick forward into the simulation. This can be useful when you want to step the clocks manually, particularly when the clock is not in the same circuit that you are currently viewing.

    Ticks Enabled

    Starts automatically ticking the clock. This will have an effect only if the circuit contains any clock devices (in the Wiring library). The option is disabled by default.

    Tick Frequency

    Allows you to select how often ticks occur. For example, 8 Hz means that ticks will occur eight times a second. A tick is the base unit of measurement for the speed of clocks.

    Note that the clock cycle speed will be slower than the tick speed: The fastest possible clock will have a one-tick up cycle and a one-tick down cycle; such a clock would have up/down cycle rate of 4 Hz if the ticks occur at 8 Hz.

    Logging...

    Enters the logging module, which facilitates automatically noting and saving values in a circuit as a simulation progresses.

    Next: The Window and Help menus.

    logisim-2.7.1/doc/el/html/guide/menu/project.html0000644000175000017500000001250711541757126021606 0ustar vincentvincent The Project menu

    The Project menu

    Add Circuit...

    Adds a new circuit into the current project. Logisim will insist that you name the new circuit. The name must not match any existing circuits in the project.

    Load Library

    Loads a library into the project. You can load three types of libraries, as explained elsewhere in the User's Guide.

    Unload Libraries...

    Unloads current libraries from the project. Logisim will not permit you to unload any libraries currently being used, including libraries containing components appearing in any project circuits, as well as those with tools that appear in the toolbar or that are mapped to the mouse.

    Move Circuit Up

    Moves the currently displayed circuit one step up the list of circuits within the project, as displayed in the explorer pane.

    Move Circuit Down

    Moves the currently displayed circuit one step down the list of circuits within the project, as displayed in the explorer pane.

    Set As Main Circuit

    Sets the currently displayed circuit to be the project's main circuit. (This menu item will be grayed out if the current circuit is already the project's main circuit.) The only significance of the main circuit is that it is the circuit that first appears when a project file is opened.

    Revert To Default Appearance

    If you've edited the circuit's appearance, this menu item reverts the appearance back to the default rectangle-with-notch appearance. The menu item is enabled only when editing the circuit's appearance.

    View Toolbox

    Changes the explorer pane to displaying a list of the project's circuits and the libraries that have been loaded.

    View Simulation Tree

    Changes the explorer pane to displaying the hierarchy of subcircuits in the current simulation.

    Edit Circuit Layout

    Switches to allow you to edit the layout of components, which determines how the circuit works. This menu item is usually disabled since you will usually be editing the layout anyway.

    Edit Circuit Appearance

    Switches to allow you to edit how the circuit will be represented when it is used as a subcircuit within another circuit. By default, the circuit is represented as a rectangle with a gray notch on its north end, but this menu option allows you to draw a different appearance for the subcircuit.

    Remove Circuit

    Removes the currently displayed circuit from the project. Logisim will prevent you from removing circuits that are used as subcircuits, and it will prevent you from removing the final circuit in a project.

    Analyze Circuit

    Computes a truth table and Boolean expressions corresponding to the current circuit, displaying them in the Combinational Analysis window. The analysis process will only be valid for combinational circuits. A full description of the analysis process is described in the Combinational Analysis section.

    Get Circuit Statistics

    Shows a dialog containing statistics about components used by the currently viewed circuit. The dialog includes a table with five columns:

    • Component: The name of the component.
    • Library: The name of the library from which the component came.
    • Simple: The number of times that component appears directly within the viewed circuit.
    • Unique: The number of times that component appears in the circuit's hierarchy, where each subcircuit within the hierarchy is counted only once.
    • Recursive: The number of times that component appears in the circuit's hierarchy, where we count each subcircuit as many times as it appears in the hierarchy.

    The distinction between Unique and Recursive is easiest to explain by considering the 4:1 multiplexer built using three 2:1 multiplexers as in the Using subcircuits section. The 2:1 multiplexer contains two AND gates (and the 4:1 circuit includes none), so the Unique count of AND gates would be 2; but if you were to build the 4:1 multiplexer using this diagram, you would actually need 2 AND gates for each of the three 2:1 multiplexers, so the Recursive count is 6.

    If you are using circuits from a loaded Logisim library, those components are considered to be black boxes: The contents of the library's circuits are not included in the unique and recursive counts.

    Options...

    Opens the Project Options window.

    Next: The Simulate menu.

    logisim-2.7.1/doc/el/html/guide/menu/index.html0000644000175000017500000000163111541757126021243 0ustar vincentvincent Menu Reference

    Menu Reference

    This section explains the six menus that accompany every major Logisim window.

    The File menu
    The Edit menu
    The Project menu
    The Simulate menu
    The Window and Help menus
    Many menu items relate specifically to a currently opened project. But some Logisim windows (particularly the Combinational Analysis window and the Application Preferences window) are not associated with projects. For these windows, the project-specific menu items will be disabled.

    Next: The File menu.

    logisim-2.7.1/doc/el/html/guide/menu/file.html0000644000175000017500000001021011541757126021044 0ustar vincentvincent The File menu

    The File menu

    New

    Opens a new project in a new window. The project will initially be a copy of the currently selected template.

    Open...

    Opens an existing file as a project in a new window.

    Open Recent

    Opens a recently opened project in a new window without prompting the user to navigate through a file selection dialog.

    Close

    Closes all windows associated with the currently viewed project.

    Save

    Saves the currently viewed project, overwriting what was previously in the file.

    Save As...

    Saves the currently viewed project, prompting the user to save into a different file than before.

    Export Image...

    Creates image file(s) corresponding to circuits. The configuration dialog box is described below.

    Print...

    Sends circuit(s) to a printer. The configuration dialog box is described below.

    Preferences...

    Displays the application preferences window. (On Mac OS systems, this will appear in the Logisim menu.)

    Exit

    Closes all currently open projects and terminates Logisim. (On Mac OS systems, this will appear as Quit in the Logisim menu.)

    Configuring Export

    When you select Export Image..., Logisim displays a dialog box with four options.

    • Circuits: A list where you can select one or more circuits that should be exported into image files. (Empty circuits are not displayed as options.)
    • Image Format: You can create PNG, GIF, and JPEG files. I would recommend PNG files: The GIF format is quite dated, and the JPEG format will introduce artifacts into the image, as the JPEG format is really meant for photographic images.
    • Scale Factor: You can scale the images as they are dumped into image files using this slider.
    • Printer View: Whether to use "printer view" in exporting the circuits.

    After clicking OK, Logisim will display a file selection dialog box. If you have selected one circuit, select the file into which the image should be placed. If you have selected multiple circuits, select a directory where the files should be placed; Logisim will name the images based on the circuits' names (main.png, for example).

    Configuring Print

    When you choose Print..., Logisim displays a dialog box for configuring what is printed.

    • Circuits: A list where you can select one or more circuits to be printed. (Empty circuits are not displayed as options.) Logisim will print one circuit per page. If the circuit is too large for the page, the image will be scaled down to fit.
    • Header: Text that should appear centered at the top of each page. The following substitutions will be made into the text.
      %nName of circuit on page
      %pPage number
      %PTotal page count
      %%A single percent sign ('%')
    • Rotate To Fit: If checked, then Logisim will rotate each circuit by 90 degrees when the circuit is too large to fit onto the page and it does not need to be scaled as small when rotated 90 degrees.
    • Printer View: Whether to use "printer view" in printing the circuits.

    After clicking OK, Logisim will display the standard page setup dialog box before printing the circuits.

    Next: The Edit menu.

    logisim-2.7.1/doc/el/html/guide/menu/edit.html0000644000175000017500000001162511541757124021063 0ustar vincentvincent The Edit menu

    The Edit menu

    Undo XX

    Undoes the most recently completed action affecting how the circuit would be saved in a file. Note that this does not include changes to the circuit state (as with manipulations performed by the Poke Tool).

    Cut

    Removes the currently selected components from the circuit onto Logisim's clipboard.

    Note: Logisim's clipboard is maintained separately from the clipboard for the overall system; as a result, cut/copy/paste will not work across different applications, even including other running copies of Logisim. If, however, you have multiple projects open under the same Logisim process, then you should be able to cut/copy/paste between them.

    Copy

    Copies the currently selected components in the circuit onto Logisim's clipboard. (See the note under the Cut menu item.)

    Paste

    Pastes the components on Logisim's clipboard into the current selection. (See the note under the Cut menu item.)

    When you paste components, they will not immediately be dropped; instead, they will be drawn in light gray. They will not actually be ``dropped'' into the circuit until you either move the selection or change the selection so that the components are no longer in it.

    The reason for this odd behavior is this: To be consistent with its other behavior, Logisim must immediately merge any wires as soon as they are dropped into a circuit; this merging process changes existing wires in the circuit. When you paste wires from the clipboard, however, you may want them to appear in a different location, and the changing inherent in the merging process would be against your wishes.

    Delete

    Removes all components in the current selection from the circuit, without modifying the clipboard.

    Duplicate

    Creates a copy of all components in the current selection. This is like selecting Copy, then Paste, except that Duplicate doesn't modify or use the clipboard.

    Select All

    Selects all components in the current circuit.

    Raise Selection

    This menu item is available only when editing a circuit's appearance. It raises the currently selected object(s) so that it is drawn (or they are drawn) on top of an object that currently overlaps the selection. If the selection is overlapped by several objects, it is raised only to be above the lowest one; select the menu item repeatedly until it is in the order it should be.

    (Determining whether two arbitrary objects overlap is difficult. Logisim uses an algorithm of selecting several random points in each of the two objects and seeing if any point is also in the other object. Sometimes it will fail to detect an overlap if the overlap is small — say, less than 5% of either of the objects.)

    Lower Selection

    This menu item is available only when editing a circuit's appearance. It lowers the currently selected object(s) so that it is drawn (or they are drawn) below an object that the selection currently overlaps. If the selection overlaps several objects, it is lowered only to be below the highest one; select the menu item repeatedly until it is in the order it should be.

    Raise To Top

    Available only when editing a circuit's appearance, this menu item raises the currently selected object(s) to be drawn on top of all other objects. (The anchor and the ports are exceptions — they are always on top.)

    Lower To Bottom

    Available only when editing a circuit's appearance, this menu item lowers the currently selected object(s) so that all other objects are drawn on top of them.

    Add Vertex

    Available only when editing a circuit's appearance and a point has been selected on a line, polyline, or polygon, this menu item inserts a new vertex onto the shape. Previous to insertion, the selected point is drawn as a diamond.

    Remove Vertex

    Available only when editing a circuit's appearance and an existing vertex has been selected on a polyline or polygon, this menu item removes the selected vertex. Previous to deletion, the selected vertex is drawn as a diamond within the square representing the vertex. Logisim will not permit removing a vertex on a polygon with only three vertices or on a polyline with only two vertices.

    Next: The Project menu.

    logisim-2.7.1/doc/el/html/guide/mem/0000755000175000017500000000000011541757124017055 5ustar vincentvincentlogisim-2.7.1/doc/el/html/guide/mem/poke.html0000644000175000017500000000324311541757124020703 0ustar vincentvincent Poking memory

    Poking memory

    You can manipulate the contents of memory using the Poke Tool, but the interface for this is severely limited by space constraints: For more than the simplest editing, you will probably find the integrated hex editor far more convenient.

    Nonetheless, to view and edit values within the circuit, the Poke Tool has two modes of operation: You can edit the address displayed, and you can edit an individual value.

    To edit the address displayed, click outside the display rectangle. Logisim will draw a red rectangle around the top address.

    • Typing hexadecimal digits will change the top address accordingly.

    • Typing the Enter key will scroll down one line.

    • Typing the Backspace key will scroll up one line.

    • Typing the space bar will scroll down one page (four lines).

    To edit a particular value, click the value within the display rectangle. Logisim will draw a red rectangle around that address.

    • Typing hexadecimal digits will change the value at the address currently being edited.

    • Typing the Enter key will move to editing the value just below it in the display (down one line).

    • Typing the Backspace key will move to editing the value at the previous address.

    • Typing the space bar will move to editing the value at the following address.

    Next: Pop-up menus and files.

    logisim-2.7.1/doc/el/html/guide/mem/menu.html0000644000175000017500000000375111541757124020715 0ustar vincentvincent Pop-up menus and files

    Pop-up menus and files

    The pop-up menu for memory includes four options in addition to the options common to all components:

    • Edit Contents: Bring up a hex editor for editing the contents of memory.
    • Clear Contents: Resets all values in memory to 0.
    • Load Image...: Resets all values in memory based on the values found in a file using the format described below.
    • Save Image...: Stores all values in memory into a file using the format described below.

    The file format used for image files is intentionally simple; this permits you to write a program, such as an assembler, that generates memory images that can then be loaded into memory. As an example of this file format, if we had a 256-byte memory whose first five bytes were 2, 3, 0, 20, and -1, and all subsequent values were 0, then the image would be the following text file.

    v2.0 raw
    02
    03
    00
    14
    ff
    

    The first line identifies the file format used (currently, there is only one file format recognized). Subsequent values list the values in hexadecimal, starting from address 0; you can place several such values on the same line. If there are more memory locations than are identified in the file, Logisim will load 0 into the other memory locations.

    The image file can use run-length encoding; for example, rather than list the value 00 sixteen times in a row, the file can include 16*00. Notice than the number of repetitions is written in base 10. Files produced by Logisim will use run-length encoding for runs of at least four values.

    You can place comments into the file by using the '#' symbol: All characters in the line starting from the '#' symbol will be ignored by Logisim.

    Next: Hex editor.

    logisim-2.7.1/doc/el/html/guide/mem/index.html0000644000175000017500000000165611541757124021062 0ustar vincentvincent Memory components

    Memory components

    The RAM and ROM components are two of the more useful components in Logisim's built-in libraries. However, because of the volume of information they can store, they are also two of the most complex components.

    Documentation about how they work within a circuit can be found on the RAM and ROM pages of the Library Reference. This section of the User's Guide explains the interface allowing the user to view and edit memory contents.

    Poking memory
    Pop-up menus and files
    Logisim's integrated hex editor

    Next: Poking memory.

    logisim-2.7.1/doc/el/html/guide/mem/hex.html0000644000175000017500000000277011541757124020535 0ustar vincentvincent Hex editor

    Hex editor

    Logisim includes an integrated hex editor for viewing and editing the contents of memory. To access it, bring up a pop-up menu for the memory component and select Edit Contents.... For ROM components, which have the memory contents as part of the attribute value, you can alternatively access the hex editor by clicking the corresponding attribute value.

    The numbers in italics at left display memory addresses, written in hexadecimal. The other numbers display values starting from that memory address; the hex editor may display four, eight, or sixteen values per line, depending on what fits in the window. To help with counting, each group of four values has a larger space between.

    You can navigate through memory using the scroll bar or using the keyboard (the arrow keys, home, end, page up, and page down). Typing hexadecimal characters will alter the currently selected value.

    You can select a range of values by dragging the mouse, shift-clicking the mouse, or navigating through memory with the keyboard while depressing the shift key. Values may be copied and pasted using the Edit menu; the clipboard can also be transferred into other applications.

    Next: User's Guide.

    logisim-2.7.1/doc/el/html/guide/log/0000755000175000017500000000000011541757124017060 5ustar vincentvincentlogisim-2.7.1/doc/el/html/guide/log/table.html0000644000175000017500000000151411541757124021036 0ustar vincentvincent The Table tab

    The Table tab

    The Table tab displays the current log graphically.

    The table contains a column for each component in the selection. Each row in the table displays a snapshot of the simulation after a propagation of values has completed. Any duplicate rows are not added into the log. Note that only the most recent 400 rows are displayed. Some rows may have empty entries if the corresponding component was not in the selection at the time that the row was computed.

    The displayed table is for review only; it is not interactive.

    Next: The File tab.

    logisim-2.7.1/doc/el/html/guide/log/selection.html0000644000175000017500000000444211541757124021737 0ustar vincentvincent The Selection tab

    The Selection tab

    The Selection tab allows you to select which values should be included in the log. The window below corresponds to the following circuit.



    The tab is divided into three vertical areas. The first (leftmost) is a list of all components in the circuit whose values can be logged. Among the built-in libraries, the following types of components support logging.

    Wiring library: Pin, Probe, and Clock components
    I/O library: Button and LED components
    Memory library: All components except ROM
    For components which have labels associated with them, their names correspond to the labels; other components' names specify their type and their location within the circuit. Any subcircuits will also appear in the list; they cannot be selected for logging, but eligible components within them can be. Note that the RAM component requires you to choose which memory address(es) should be logged; it allows logging only for the first 256 addresses.

    The last (rightmost) vertical area lists those components that have been selected. Also, it indicates the radix (base) in which the component's multi-bit values will be logged; the radix does not have a significant effect on one-bit values.

    The middle column of buttons allows the manipulation of the items within the selection.

    • Add adds the currently selected item(s) on the left side into the selection.
    • Change Radix cycles the radix for the currently selected component in the selection between 2 (binary), 10 (decimal), and 16 (hexadecimal).
    • Move Up moves the currently selected component in the selection forward one spot.
    • Move Down moves the currently selected component in the selection back one spot.
    • Remove removes the currently selected component in the selection.

    Next: The Table tab.

    logisim-2.7.1/doc/el/html/guide/log/index.html0000644000175000017500000000313711541757124021061 0ustar vincentvincent Logging

    Logging

    In testing a large circuit, and for documenting a circuit's behavior, a log of past circuit behavior can be useful. This is the purpose for Logisim's logging module, which allows you to select components whose values should be logged; optionally, you can specify a file into which the log should be placed.

    You can enter the logging module via the Logging... option from the Simulate menu. It brings up a window with three tabs.

    We will discuss each of these tabs separately.

    The Selection tab
    The Table tab
    The File tab

    Each project has only one logging window; when you switch to viewing another circuit within the project, the logging window switches automatically to logging the other circuit instead. That is, it does this unless you are moving up or down within the same simulation, in which case the logging module does not change.

    Note that when the logging module switches to logging another simulation, it will cease any logging into a file. Should you switch back to the simulation again, it will remember the configuration for that simulation, but you will need to re-enable the file logging manually.

    Next: The Selection tab.

    logisim-2.7.1/doc/el/html/guide/log/file.html0000644000175000017500000000423011541757124020664 0ustar vincentvincent The File tab

    The File tab

    The File tab allows you to specify a file into which the log should be placed.

    At the top is an indicator of whether file logging is in progress and a button for enabling or disabling it. (Note that you cannot enable it until a file is selected below.) The button allows you to pause and restart file entry. When you switch in the project window to viewing another simulation, the file logging is automatically halted; if you return to the original one and want logging to continue, you will need to re-enable the file logging manually using the button at top.

    In the middle is an indicator of what file is being logged to. To change it, use the Select... button. On selecting a file, file logging will automatically start. If you select a pre-existing file, Logisim will ask whether you want to overwrite the file or append the new entries onto the end.

    At bottom you can control whether a header line should be placed into the file indicating which items are in the selection. If header lines are added, then a new header line will be placed into the file whenever the selection changes.

    File format

    Entries are placed into the file in tab-delimited format corresponding closely to what appears under the Table tab. (One difference is that any header lines will give the full path to components lying in subcircuits.) The format is intentionally simple so that you can feed it into another program for processing, such as a Python/Perl script or a spreadsheet program.

    So that a script can process the file at the same time as Logisim is running, Logisim will flush the new records onto the disk every 500 ms. Note that Logisim may also intermittently close and later re-open the file during the simulation, particularly if several seconds have elapsed without any new records being added.

    Next: User's Guide.

    logisim-2.7.1/doc/el/html/guide/jar/0000755000175000017500000000000011541757124017053 5ustar vincentvincentlogisim-2.7.1/doc/el/html/guide/jar/simpctr.html0000644000175000017500000001571111541757124021427 0ustar vincentvincent Simple Gray Code Counter

    Simple Gray Code Counter

    Often we want components that aren't exclusively combinational in nature - that is, we want the component to have some memory. There is an important subtlety in defining such components: You can't have the component itself store the state, because an individual component can appear many times in the same circuit. It can't appear directly within a circuit multiple times, but it can appear multiple times if it appears in a subcircuit that is used several times.

    The solution is to create a new class for representing the object's current state, and to associate instances of this with the component through the parent circuit's state. In this example, which implements an edge-triggered 4-bit Gray code counter, we define a CounterData class to represent the counter's state, in addition to the InstanceFactory subclass as illustrated previously. The CounterData object remembers both the counter's current value, as well as the last clock input seen (to detect rising edges).

    CounterData

    package com.cburch.gray;
    
    import com.cburch.logisim.data.BitWidth;
    import com.cburch.logisim.data.Value;
    import com.cburch.logisim.instance.InstanceData;
    import com.cburch.logisim.instance.InstanceState;
    
    /** Represents the state of a counter. */
    class CounterData implements InstanceData, Cloneable {
        /** Retrieves the state associated with this counter in the circuit state,
         * generating the state if necessary.
         */
        public static CounterData get(InstanceState state, BitWidth width) {
            CounterData ret = (CounterData) state.getData();
            if(ret == 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.
                ret = new CounterData(null, Value.createKnown(width, 0));
                state.setData(ret);
            } else if(!ret.value.getBitWidth().equals(width)) {
                ret.value = ret.value.extendWidth(width.getWidth(), Value.FALSE);
            }
            return ret;
        }
    
        /** 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 CounterData(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; }
        }
        
        /** Updates the last clock observed, returning true if triggered. */
        public boolean updateClock(Value value) {
            Value old = lastClock;
            lastClock = value;
            return old == Value.FALSE && value == Value.TRUE;
        }
        
        /** 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;
        }
    }
    

    SimpleCounter

    package com.cburch.gray;
    
    import com.cburch.logisim.data.BitWidth;
    import com.cburch.logisim.data.Bounds;
    import com.cburch.logisim.data.Direction;
    import com.cburch.logisim.instance.InstanceFactory;
    import com.cburch.logisim.instance.InstancePainter;
    import com.cburch.logisim.instance.InstanceState;
    import com.cburch.logisim.instance.Port;
    import com.cburch.logisim.util.GraphicsUtil;
    import com.cburch.logisim.util.StringUtil;
    
    /** Manufactures a simple counter that iterates over the 4-bit Gray Code. This
     * example illustrates how a component can maintain its own internal state. All
     * of the code relevant to state, though, appears in CounterData class. */
    class SimpleGrayCounter extends InstanceFactory {
        private static final BitWidth BIT_WIDTH = BitWidth.create(4);
        
        // Again, notice how we don't have any instance variables related to an
        // individual instance's state. We can't put that here, because only one
        // SimpleGrayCounter object is ever created, and its job is to manage all
        // instances that appear in any circuits.
        
        public SimpleGrayCounter() {
            super("Gray Counter (Simple)");
            setOffsetBounds(Bounds.create(-30, -15, 30, 30));
            setPorts(new Port[] {
                    new Port(-30, 0, Port.INPUT, 1),
                    new Port(  0, 0, Port.OUTPUT, BIT_WIDTH.getWidth()),
            });
        }
    
        public void propagate(InstanceState state) {
            // Here I retrieve the state associated with this component via a helper
            // method. In this case, the state is in a CounterData object, which is
            // also where the helper method is defined. This helper method will end
            // up creating a CounterData object if one doesn't already exist.
            CounterData cur = CounterData.get(state, BIT_WIDTH);
    
            boolean trigger = cur.updateClock(state.getPort(0));
            if(trigger) cur.setValue(GrayIncrementer.nextGray(cur.getValue()));
            state.setPort(1, cur.getValue(), 9);
            
            // (You might be tempted to determine the counter's current value
            // via state.getPort(1). This is erroneous, though, because another
            // component may be pushing a value onto the same point, which would
            // "corrupt" the value found there. We really do need to store the
            // current value in the instance.)
        }
    
        public void paintInstance(InstancePainter painter) {
            painter.drawBounds();
            painter.drawClock(0, Direction.EAST); // draw a triangle on port 0
            painter.drawPort(1); // draw port 1 as just a dot
            
            // Display the current counter value centered within the rectangle.
            // However, if the context says not to show state (as when generating
            // printer output), then skip this.
            if(painter.getShowState()) {
                CounterData state = CounterData.get(painter, BIT_WIDTH);
                Bounds bds = painter.getBounds();
                GraphicsUtil.drawCenteredText(painter.getGraphics(),
                        StringUtil.toHexString(BIT_WIDTH.getWidth(), state.getValue().toIntValue()),
                        bds.getX() + bds.getWidth() / 2,
                        bds.getY() + bds.getHeight() / 2);
            }
        }
    }
    

    Next: Gray Code Counter.

    logisim-2.7.1/doc/el/html/guide/jar/library.html0000644000175000017500000000375711541757124021421 0ustar vincentvincent Library Class

    Library Class

    The access point for the JAR library is a class that extends the Library class. The library's main job is to list the tools that are available through the library; most often, the tools are all tools to add the various components defined - that is, instances of the AddTool class working with different component factories.

    Components

    package com.cburch.gray;
    
    import java.util.Arrays;
    import java.util.List;
    
    import com.cburch.logisim.tools.AddTool;
    import com.cburch.logisim.tools.Library;
    
    /** 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 components; practically speaking, though, you'll most often want
         * to create AddTools for new components that can be added into the circuit.
         */
        private List<AddTool> 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 AddTool[] {
                    new AddTool(new GrayIncrementer()),
                    new AddTool(new SimpleGrayCounter()),
                    new AddTool(new GrayCounter()),
            });
        }
        
        /** Returns the name of the library that the user will see. */ 
        public String getDisplayName() {
            return "Gray Tools";
        }
        
        /** Returns a list of all the tools available in this library. */
        public List<AddTool> getTools() {
            return tools;
        }
    }
    

    Next: Simple Gray Code Counter.

    logisim-2.7.1/doc/el/html/guide/jar/index.html0000644000175000017500000001031611541757124021051 0ustar vincentvincent JAR Libraries

    JAR Libraries

    Using JAR libraries

    Logisim has two types of circuit components: those that are designed within Logisim as combinations of components, and those primitive components that are written in Java. Logisim circuits are easier to design, but they cannot support sophisticated user interaction, and they are relatively inefficient.

    Logisim contains a fairly thorough collection of built-in libraries of Java components, but it can also load additional libraries written by you or others. Once you have downloaded a library, you can import it into your project by right-clicking the project in the explorer pane (the top line) and choosing Load Library > JAR Library.... Then, Logisim will prompt you to select the JAR file. (In some circumstances, you may have to type the starting class name when prompted, which would be provided by the library developer. However, a developer typically configures the JAR library to avoid this (by including a manifest file in the JAR with a Library-Class attribute specifying the main class name).)

    Creating JAR libraries

    The remainder of this section is dedicated to a series of thoroughly commented examples illustrating how to develop Logisim libraries yourself. You should only attempt this if you're an experienced Java programmer. You will find the documentation beyond these examples fairly meager.

    You can download a JAR file that allows these examples to be imported into Logisim via the Logisim Web site's Links section. That JAR file also contains the source code contained in these examples.

    Gray Code Incrementer

    Illustrates the essential components of any component type using a simple example of a component that takes a multibit input and computes the next Gray code value following it.

    Library Class

    Illustrates how to define a library. This is the entry point for any JAR file - the class whose name the user enters when loading the JAR library.

    Simple Gray Code Counter

    Illustrates how to make a component that has internal state, in particular an 8-bit counter that iterates through Gray codes.

    Gray Code Counter

    Demonstrates a complete, fairly sophisticated component with which the user can interact. It implements a Gray code counter where the number of bits remembered is customizable, and where the user can edit the current value by clicking on it with the Poke Tool and typing a value.

    Guidelines
    General information for those developing third-party libraries.

    License

    The code in this example JAR library is released under the MIT license, a more permissive license than the GPL, under which the rest of Logisim is released.

    Copyright (c) 2009, Carl Burch.

    Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

    The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

    Next: Gray Code Incrementer.

    logisim-2.7.1/doc/el/html/guide/jar/incr.html0000644000175000017500000002201511541757124020674 0ustar vincentvincent Gray Code Incrementer

    Gray Code Incrementer

    Each component included in a library is defined by creating a subclass of InstanceFactory found in the com.cburch.logisim.instance package. This subclass has all the code involved

    (Here we're describing the API for the current version of Logisim. You may find some libraries developed for older versions of Logisim, in which components were developed by defining two classes, one extending Component and another extending ComponentFactory. Version 2.3.0 introduced the much simpler InstanceFactory API; the older technique is deprecated.)

    Three Logisim packages define most of the classes relevant to defining component libraries.

    com.cburch.logisim.instance

    Contains classes specifically related to defining components, including the InstanceFactory, InstanceState, InstancePainter, and Instance classes.

    com.cburch.logisim.data

    Contains classes related to data elements associated with components, such as the Bounds class for representing bounding rectangles or the Value class for representing values that can exist on a wire.

    com.cburch.logisim.tools

    Contains classes related to the library definition.

    About Gray codes

    Before we go on, let me briefly describe the Gray code on which these examples are based. It's not really important to understanding how these examples work, so you can safely skip to the code below if you wish - particularly if you already know Gray codes.

    Gray code is a technique (named after Frank Gray) for iterating through n-bit sequences with only one bit changed for each step. As an example, consider the 4-bit Gray code listed below.

    0000
    0001
    0011
    0010
           0110
    0111
    0101
    0100
           1100
    1101
    1111
    1110
           1010
    1011
    1001
    1000

    Each value has the bit underlined that will change for the next value in the sequence. For example, after 0000 comes 0001, in which the final bit has been toggled, so the final bit is underlined.

    Logisim's built-in components don't include anything working with Gray codes. But electronics designers find Gray codes useful sometimes. One particularly notable instance of Gray codes is along the axes in Karnaugh maps.

    GrayIncrementer

    This is a minimal example illustrating the essential elements to defining a component. This particular component is an incrementer, which takes an multibit input and produces the next Gray code following it in sequence.

    package com.cburch.gray;
    
    import com.cburch.logisim.data.Attribute;
    import com.cburch.logisim.data.BitWidth;
    import com.cburch.logisim.data.Bounds;
    import com.cburch.logisim.data.Value;
    import com.cburch.logisim.instance.InstanceFactory;
    import com.cburch.logisim.instance.InstancePainter;
    import com.cburch.logisim.instance.InstanceState;
    import com.cburch.logisim.instance.Port;
    import com.cburch.logisim.instance.StdAttr;
    
    /** This component takes a multibit input and outputs the value that follows it
     * in Gray Code. For instance, given input 0100 the output is 1100. */
    class GrayIncrementer extends InstanceFactory {
        /* Note that there are no instance variables. There is only one instance of
         * this class created, which manages all instances of the component. Any
         * information associated with individual instances should be handled
         * through attributes. For GrayIncrementer, each instance has a "bit width"
         * that it works with, and so we'll have an attribute. */
    
        /** The constructor configures the factory. */
        GrayIncrementer() {
            super("Gray Code Incrementer");
            
            /* This is how we can set up the attributes for GrayIncrementers. In
             * this case, there is just one attribute - the width - whose default
             * is 4. The StdAttr class defines several commonly occurring
             * attributes, including one for "bit width." It's best to use those
             * StdAttr attributes when appropriate: A user can then select several
             * components (even from differing factories) with the same attribute
             * and modify them all at once. */
            setAttributes(new Attribute[] { StdAttr.WIDTH },
                    new Object[] { BitWidth.create(4) });
            
            /* The "offset bounds" is the location of the bounding rectangle
             * relative to the mouse location. Here, we're choosing the component to
             * be 30x30, and we're anchoring it relative to its primary output
             * (as is typical for Logisim), which happens to be in the center of the
             * east edge. Thus, the top left corner of the bounding box is 30 pixels
             * west and 15 pixels north of the mouse location. */
            setOffsetBounds(Bounds.create(-30, -15, 30, 30));
            
            /* The ports are locations where wires can be connected to this
             * component. Each port object says where to find the port relative to
             * the component's anchor location, then whether the port is an
             * input/output/both, and finally the expected bit width for the port.
             * The bit width can be a constant (like 1) or an attribute (as here).
             */
            setPorts(new Port[] {
                    new Port(-30, 0, Port.INPUT, StdAttr.WIDTH),
                    new Port(0, 0, Port.OUTPUT, StdAttr.WIDTH),
                });
        }
    
        /** Computes the current output for this component. This method is invoked
         * any time any of the inputs change their values; it may also be invoked in
         * other circumstances, even if there is no reason to expect it to change
         * anything. */
        public void propagate(InstanceState state) {
            // First we retrieve the value being fed into the input. Note that in
            // the setPorts invocation above, the component's input was included at
            // index 0 in the parameter array, so we use 0 as the parameter below.
            Value in = state.getPort(0);
            
            // Now compute the output. We've farmed this out to a helper method,
            // since the same logic is needed for the library's other components.
            Value out = nextGray(in);
            
            // Finally we propagate the output into the circuit. The first parameter
            // is 1 because in our list of ports (configured by invocation of
            // setPorts above) the output is at index 1. The second parameter is the
            // value we want to send on that port. And the last parameter is its
            // "delay" - the number of steps it will take for the output to update
            // after its input.
            state.setPort(1, out, out.getWidth() + 1);
        }
    
        /** Says how an individual instance should appear on the canvas. */
        public void paintInstance(InstancePainter painter) {
            // As it happens, InstancePainter contains several convenience methods
            // for drawing, and we'll use those here. Frequently, you'd want to
            // retrieve its Graphics object (painter.getGraphics) so you can draw
            // directly onto the canvas.
            painter.drawRectangle(painter.getBounds(), "G+1");
            painter.drawPorts();
        }
        
        /** Computes the next gray value in the sequence after prev. This static
         * method just does some bit twiddling; it doesn't have much to do with
         * Logisim except that it manipulates Value and BitWidth objects. */
        static Value nextGray(Value prev) {
            BitWidth bits = prev.getBitWidth();
            if(!prev.isFullyDefined()) return Value.createError(bits);
            int x = prev.toIntValue();
            int ct = (x >> 16) ^ x; // compute parity of x
            ct = (ct >> 8) ^ ct;
            ct = (ct >> 4) ^ ct;
            ct = (ct >> 2) ^ ct;
            ct = (ct >> 1) ^ ct;
            if((ct & 1) == 0) { // if parity is even, flip 1's bit
                x = x ^ 1;
            } else { // else flip bit just above last 1
                int y = x ^ (x & (x - 1)); // first compute the last 1
                y = (y << 1) & bits.getMask();
                x = (y == 0 ? 0 : x ^ y);
            }
            return Value.createKnown(bits, x);
        }
    }
    

    This example by itself is not enough to create a working JAR file; you must also provide a Library class, as illustrated on the next page.

    Next: Library Class.

    logisim-2.7.1/doc/el/html/guide/jar/guide.html0000644000175000017500000000325711541757124021045 0ustar vincentvincent Guidelines

    Guidelines

    Learning more

    Beyond the sequence of examples provided here, the Logisim source code provides copious additional examples, though they do not always illustrate the same attention to readability and good design.

    For maximum portability to future versions, you should stick as much as possible to the classes in the ...instance, ...data, and ...tools packages. Of course, you may use other packages' APIs, but they are more vulnerable to changes in future versions of Logisim.

    I am generally willing to answer occasional requests for help. And bug reports and suggestions for improvements, of course, are always welcome.

    Distribution

    You are free to distribute any JARs you develop without restriction. The GPL restrictions do apply, however, if portions of your work are derived from portions of Logisim source code (released under the GPL). Deriving from the example code in this section of the User's Guide does not incur such restrictions; these examples are released under the MIT license.

    If you would like to share your library with other Logisim users, I will be happy to provide a link to a hosting Web page or the JAR file itself through the Logisim Web site. If you think your library should be built into the basic Logisim release, then I welcome your suggestion, and I'll be happy to acknowledge your contribution in Logisim releases including the work.

    Next: User's Guide.

    logisim-2.7.1/doc/el/html/guide/jar/counter.html0000644000175000017500000001741711541757124021432 0ustar vincentvincent Gray Code Counter

    Gray Code Counter

    This orientation to the Logisim libraries concludes with a fairly sophisticated Gray code counter that allows the user to alter its current value using the Poke Tool and to place a label on the component using the Text Tool. It also customizes the icon that appears in the explorer, associated with the tool.

    GrayCounter

    package com.cburch.gray;
    
    import java.net.URL;
    
    import javax.swing.ImageIcon;
    
    import com.cburch.logisim.data.Attribute;
    import com.cburch.logisim.data.BitWidth;
    import com.cburch.logisim.data.Bounds;
    import com.cburch.logisim.data.Direction;
    import com.cburch.logisim.instance.Instance;
    import com.cburch.logisim.instance.InstanceFactory;
    import com.cburch.logisim.instance.InstancePainter;
    import com.cburch.logisim.instance.InstanceState;
    import com.cburch.logisim.instance.Port;
    import com.cburch.logisim.instance.StdAttr;
    import com.cburch.logisim.util.GraphicsUtil;
    import com.cburch.logisim.util.StringUtil;
    
    /** Manufactures a counter that iterates over Gray codes. This demonstrates
     * several additional features beyond the SimpleGrayCounter class. */
    class GrayCounter extends InstanceFactory {
        public GrayCounter() {
            super("Gray Counter");
            setOffsetBounds(Bounds.create(-30, -15, 30, 30));
            setPorts(new Port[] {
                    new Port(-30, 0, Port.INPUT, 1),
                    new Port(  0, 0, Port.OUTPUT, StdAttr.WIDTH),
            });
            
            // We'll have width, label, and label font attributes. The latter two
            // attributes allow us to associate a label with the component (though
            // we'll also need configureNewInstance to configure the label's
            // location).
            setAttributes(
                    new Attribute[] { StdAttr.WIDTH, StdAttr.LABEL, StdAttr.LABEL_FONT },
                    new Object[] { BitWidth.create(4), "", StdAttr.DEFAULT_LABEL_FONT });
            
            // The following method invocation sets things up so that the instance's
            // state can be manipulated using the Poke Tool.
            setInstancePoker(CounterPoker.class);
            
            // These next two lines set it up so that the explorer window shows a
            // customized icon representing the component type. This should be a
            // 16x16 image.
            URL url = getClass().getClassLoader().getResource("com/cburch/gray/counter.gif");
            if(url != null) setIcon(new ImageIcon(url));
        }
        
        /** The configureNewInstance method is invoked every time a new instance
         * is created. In the superclass, the method doesn't do anything, since
         * the new instance is pretty thoroughly configured already by default. But
         * sometimes you need to do something particular to each instance, so you
         * would override the method. In this case, we need to set up the location
         * for its label. */
        protected void configureNewInstance(Instance instance) {
            Bounds bds = instance.getBounds();
            instance.setTextField(StdAttr.LABEL, StdAttr.LABEL_FONT,
                    bds.getX() + bds.getWidth() / 2, bds.getY() - 3,
                    GraphicsUtil.H_CENTER, GraphicsUtil.V_BASELINE);
        }
    
        public void propagate(InstanceState state) {
            // This is the same as with SimpleGrayCounter, except that we use the
            // StdAttr.WIDTH attribute to determine the bit width to work with.
            BitWidth width = state.getAttributeValue(StdAttr.WIDTH);
            CounterData cur = CounterData.get(state, width);
            boolean trigger = cur.updateClock(state.getPort(0));
            if(trigger) cur.setValue(GrayIncrementer.nextGray(cur.getValue()));
            state.setPort(1, cur.getValue(), 9);
        }
    
        public void paintInstance(InstancePainter painter) {
            // This is essentially the same as with SimpleGrayCounter, except for
            // the invocation of painter.drawLabel to make the label be drawn.
            painter.drawBounds();
            painter.drawClock(0, Direction.EAST);
            painter.drawPort(1);
            painter.drawLabel();
            
            if(painter.getShowState()) {
                BitWidth width = painter.getAttributeValue(StdAttr.WIDTH);
                CounterData state = CounterData.get(painter, width);
                Bounds bds = painter.getBounds();
                GraphicsUtil.drawCenteredText(painter.getGraphics(),
                        StringUtil.toHexString(width.getWidth(), state.getValue().toIntValue()),
                        bds.getX() + bds.getWidth() / 2,
                        bds.getY() + bds.getHeight() / 2);
            }
        }
    }
    

    CounterPoker

    package com.cburch.gray;
    
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.event.KeyEvent;
    import java.awt.event.MouseEvent;
    
    import com.cburch.logisim.data.BitWidth;
    import com.cburch.logisim.data.Bounds;
    import com.cburch.logisim.data.Value;
    import com.cburch.logisim.instance.InstancePainter;
    import com.cburch.logisim.instance.InstancePoker;
    import com.cburch.logisim.instance.InstanceState;
    import com.cburch.logisim.instance.StdAttr;
    
    /** When the user clicks a counter using the Poke Tool, a CounterPoker object
     * is created, and that object will handle all user events. Note that
     * CounterPoker is a class specific to GrayCounter, and that it must be a
     * subclass of InstancePoker in the com.cburch.logisim.instance package. */
    public class CounterPoker extends InstancePoker {
        public CounterPoker() { }
    
        /** Determines whether the location the mouse was pressed should result
         * in initiating a poke. 
         */
        public boolean init(InstanceState state, MouseEvent e) {
            return state.getInstance().getBounds().contains(e.getX(), e.getY());
                // Anywhere in the main rectangle initiates the poke. The user might
                // have clicked within a label, but that will be outside the bounds.
        }
    
        /** Draws an indicator that the caret is being selected. Here, we'll draw
         * a red rectangle around the value. */
        public void paint(InstancePainter painter) {
            Bounds bds = painter.getBounds();
            BitWidth width = painter.getAttributeValue(StdAttr.WIDTH);
            int len = (width.getWidth() + 3) / 4;
    
            Graphics g = painter.getGraphics();
            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(InstanceState state, KeyEvent e) {
            // convert it to a hex digit; if it isn't a hex digit, abort.
            int val = Character.digit(e.getKeyChar(), 16);
            BitWidth width = state.getAttributeValue(StdAttr.WIDTH);
            if(val < 0 || (val & width.getMask()) != val) return;
    
            // compute the next value
            CounterData cur = CounterData.get(state, width);
            int newVal = (cur.getValue().toIntValue() * 16 + val) & width.getMask();
            Value newValue = Value.createKnown(width, newVal);
            cur.setValue(newValue);
            state.fireInvalidated();
            
            // You might be tempted to propagate the value immediately here, using
            // state.setPort. However, the circuit may currently be propagating in
            // another thread, and invoking setPort directly could interfere with
            // that. Using fireInvalidated notifies the propagation thread to
            // invoke propagate on the counter at its next opportunity.
        }
    }
    

    Next: Guidelines.

    logisim-2.7.1/doc/el/html/guide/index.html0000644000175000017500000000453411541757124020302 0ustar vincentvincent The Guide to Being a Logisim User

    The Guide to Being a Logisim User

    Logisim is an educational tool for designing and simulating digital logic circuits. With its simple toolbar interface and simulation of circuits as they are built, it is simple enough to facilitate learning the most basic concepts related to logic circuits. With the capacity to build larger circuits from smaller subcircuits, and to draw bundles of wires with a single mouse drag, Logisim can be used (and is used) to design and simulate entire CPUs for educational purposes.

    Students at colleges and universities around the world use Logisim for a variety of purposes, including:

    • A module in general-education computer science surveys
    • A unit in sophomore-level computer organization courses
    • Over a full semester in upper-division computer architecture courses

    The Guide to Being a Logisim User, which you are reading now, is the official reference for Logisim's features. Its first part is a sequence of sections introducing the major parts of Logisim. These sections are written so that they can be read "cover to cover" to learn about all of the most important features of Logisim.

    Beginner's tutorial
    Libraries and attributes
    Subcircuits
    Wire bundles
    Combinational analysis

    The remaining sections are a motley bunch of reference materials and explanations of some of the lesser corners of Logisim.

    Menu reference
    Memory components
    Logging
    Command-line verification
    Application preferences
    Project options
    Value propagation
    JAR libraries
    About the program
    logisim-2.7.1/doc/el/html/guide/bundles/0000755000175000017500000000000011541757124017733 5ustar vincentvincentlogisim-2.7.1/doc/el/html/guide/bundles/splitting.html0000644000175000017500000000545311541757124022645 0ustar vincentvincent Splitters

    Splitters

    When you work with multi-bit values, you will often want to route different bits in different directions. The Wiring library's splitter tool () allows you to accomplish this.

    For example, suppose we want a circuit that computes the bitwise AND of the two nibbles of its eight-bit input (the upper four bits and the lower four bits). We will have an eight-bit value coming from the input pin, and we want to split that into two four-bit values. In the below circuit, we have used a splitter to accomplish this: The 8-bit input comes into the splitter, which divides the 8 bits into two 4-bit values, which are then fed into the AND gate and from there to the output.

    In this example, the splitter splits an incoming value into multiple outgoing values. But splitters can also work the other way: It can combine multiple values into a single value. In fact, they are non-directional: They can send values one way at one time and another way later, and they can even do both at the same time, as in the below example where a value travels eastward through the two splitters, then is routed back westward through them again, and then back eastward where it finally reaches its output.

    The key to understanding splitters is their attributes. In the following, the term split end refers to one of the multiple wires on one side, while the term combined end refers to the single wire on the other side.

    • The Facing attribute tells where the split ends should be relative to the combined end.
    • The Fan Out attribute specifies how many split ends there are.
    • The Bit Width In attribute specifies the bit width of the combined end.
    • The Bit x attribute says which split end corresponds to bit x of the combined end. If multiple bits correspond to the same split end, then their relative ordering will be the same as in the combined end. Logisim splitters cannot have a bit from the combined end correspond to multiple split ends.

    Note that any change to the Fan Out or Bit Width In attributes will reset all Bit x attributes so that they will distribute the bits of the combined value as evenly as possible among the split ends.

    Next: Wire colors.

    logisim-2.7.1/doc/el/html/guide/bundles/index.html0000644000175000017500000000113511541757124021730 0ustar vincentvincent Wire bundles

    Wire bundles

    In simple Logisim circuits, most wires carry only one bit; but Logisim also allows you to create wires that bundle together multiple bits. The number of bits traveling along a wire is that wire's bit width.

    Creating bundles
    Splitters
    Wire colors

    Next: Creating bundles.

    logisim-2.7.1/doc/el/html/guide/bundles/creating.html0000644000175000017500000000431511541757124022420 0ustar vincentvincent Creating bundles

    Creating bundles

    Every input and output on every component in the circuit has a bit width associated with it. Often the bit width is 1, and there is no way of changing that, but many of Logisim's built-in components include attributes allowing you to customize the bit widths of their inputs and outputs.

    The below screen shot illustrates a simple circuit for finding the bitwise AND of two three-bit inputs. Notice how the three-bit output is the bitwise AND of the two inputs. All components have been customized to deal with three-bit data via its Data Bits attribute; the screen shot shows the AND gate attributes, including the Data Bits attribute of 3.

    All components in Logisim define a bit width for each of input and output. In contrast, a wire's bit width is undefined: Instead, the wire's width adapts to the components to which it is attached. If a wire connects two components demanding different bit widths, Logisim will complain of "Incompatible widths" and indicate the offending locations in orange. In the below, the output pin's Data Bits attribute has been changed to 1, and so Logisim complains that the wire cannot connect a three-bit value to a one-bit value.

    Wires that connect incompatible locations (drawn in orange) do not carry values.

    For single-bit wires, you can see at a glance what value the wire carries because Logisim colors the wire light or dark green depending the value. It does not display values for multi-bit wires: They are simply black. You can, though, probe a wire by clicking it using the poke tool ().

    This probing feature is helpful for debugging circuits using wire bundles.

    Next: Splitters.

    logisim-2.7.1/doc/el/html/guide/bundles/colors.html0000644000175000017500000000414711541757124022130 0ustar vincentvincent Wire colors

    Wire colors

    We are now in a position to summarize the full rainbow of colors that Logisim wires can take on. The following little circuit illustrates all of them at once.

    • Gray: The wire's bit width is unknown. This occurs because the wire is not attached to any components' inputs and outputs. (All inputs and outputs have a defined bit width.)

    • Blue: The wire carries a one-bit value, but nothing is driving a specific value onto the wire. We call this a floating bit; some people call it a high-impedance value. In this example, the component placing a value onto the wire is a three-state pin, so it can emit this floating value.

    • Dark green: The wire is carrying a one-bit 0 value.

    • Bright green: The wire is carrying a one-bit 1 value.

    • Black: The wire is carrying a multi-bit value. Some or all of the bits may not be specified.

    • Red: The wire is carrying an error value. This often arises because a gate cannot determine the proper output, perhaps because it has no inputs. It could also arise because two components are trying to send different values onto the wire; this is what happens in the above example, where one input pin places 0 onto the wire while another places 1 onto the same wire, causing a conflict. Multi-bit wires will turn red when any of the bits carried are error values.

    • Orange: The components attached to the wire do not agree in bit width. An orange wire is effectively "broken": It does not carry values between components. Here, we've attached a two-bit component to a one-bit component, so they are incompatible.

    Next: User's Guide.

    logisim-2.7.1/doc/el/html/guide/attrlib/0000755000175000017500000000000011541757124017740 5ustar vincentvincentlogisim-2.7.1/doc/el/html/guide/attrlib/tool.html0000644000175000017500000000471111541757124021606 0ustar vincentvincent Tool Attributes

    Tool attributes

    Every tool for adding components to a circuit also has a set of attributes, which are imparted to the components created by the tool, although the components' attributes may be changed later without affecting the tool's attributes. When you select a tool, Logisim will change the attribute table to display that tool's attributes.

    For example, suppose we want to create smaller AND gates. Right now, each time we select the AND tool, it creates a large AND gate. But if we edit the Gate Size attribute just after selecting the tool (before placing its AND gate into the circuit), we'll be changing the attributes for the tool, so that future AND gates added using the tool would be narrow instead.

    Now, we can delete the two existing AND gates and add two new AND gates in their place. This time, they will be narrow. (If you chose to reduce the number of inputs to 3, the AND gate would not have vertical extension on the left side. But you'd also have to rewire the circuit so that the wires hit the AND gate's left side.)

    With some tools, the tool's icon reflects some of the attributes' values. One example of this is the Pin tool, whose icon faces the same way as its Facing attribute says.

    The tools in the toolbar each have a separate attribute set from the corresponding tools in the explorer pane. Thus, even though we changed the toolbar's AND tool to create narrow AND gates, the AND tool in the Gates library will still create wide AND gates unless you change its attributes too.

    In fact, the input pin and output pin tools in the default toolbar are both instances of the Wiring library's Pin tool, but the attribute sets are different. The icon for the Pin tool is drawn as a circle or a square depending on the value of its "Output?" attribute.

    Logisim provides a handy shortcut for changing the Facing attribute that controls the direction in which many components face: Typing an arrow key while that tool is selected automatically changes the direction of the component.

    Next: User's Guide.

    logisim-2.7.1/doc/el/html/guide/attrlib/index.html0000644000175000017500000000126011541757124021734 0ustar vincentvincent Libraries and Attributes

    Libraries and Attributes

    In this section, we'll examine how to use the other two major regions of the Logisim window, the explorer pane and the attribute table.

    The explorer pane
    The attribute table
    Tool and component attributes

    Next: The explorer pane.

    logisim-2.7.1/doc/el/html/guide/attrlib/explore.html0000644000175000017500000000754011541757124022312 0ustar vincentvincent The explorer pane

    The explorer pane

    Logisim organizes tools into libraries. They are displayed as folders in the explorer pane; to access a library's components, you have only to double-click the corresponding folder. Below, I have opened the Gates library and selected the NAND tool from it. You can see that Logisim now stands ready to add NAND gates into the circuit.

    If you look through the choices in the Gates library, you'll notice that there was no need for us to develop a XOR circuit earlier: It's built into Logisim.

    When you create a project, it automatically includes several libraries:

    • Wiring: Components that interact directly with wires.
    • Gates: Components that perform simple logic functions.
    • Plexers: More complex combinational components, like multiplexers and decoders.
    • Arithmetic: Components that perform arithmetic.
    • Memory: Components that remember data, like flip-flops, registers, and RAM.
    • I/O: Components that exist for the purpose of interacting with the user.
    • Base: Tools that are integral to using Logisim, though you probably won't need to dig into this library very often.

    Logisim allows you to add more libraries, too, using the Load Library submenu of the Project menu. You can see that Logisim has three categories of libraries.

    • Built-in libraries are libraries that are distributed with Logisim. These are documented in the Library Reference.

    • Logisim libraries are projects built within Logisim and saved to the disk as a Logisim project. You can develop a set of circuits in a single project (as described in the Subcircuits section of this guide) and then use that set of circuits as a library for other projects.

    • JAR libraries are libraries that are developed in Java but not distributed with Logisim. You can download JAR libraries that others have written, or you can write your own as described in the JAR Libraries section of this guide. Developing a JAR library is much more difficult than developing a Logisim library, but the components can be much fancier, including things like attributes and interaction with the user. The built-in libraries (other than Base) were written using the same API as JAR libraries can use, so they aptly demonstrate the range of functionality that the JAR libraries can support.

      Some JAR libraries are distributed without any information about which Java class to start with. When loading such a JAR, Logisim will prompt you to type a class name. This class name should be provided by whoever distributed the JAR file to you.

    To remove a library, choose Unload Library... from the Project menu. Logisim will prevent you from unloading libraries that contain components used in a circuit, that appear in the toolbar, or that are mapped to a mouse button.

    Incidentally, a library technically contains tools, not components. Thus, in the Base library you'll find the Poke Tool (), the Edit Tool (), and other tools that don't correspond directly to individual components. Most libraries, though, contain only tools for adding individual components; all built-in libraries other than the Base library are like this.

    Next: The attribute table.

    logisim-2.7.1/doc/el/html/guide/attrlib/attr.html0000644000175000017500000000436711541757124021612 0ustar vincentvincent The attribute table

    The attribute table

    Many components have attributes, which are properties for configuring how the component behaves or appears. The attribute table is for viewing and displaying a component's attribute values.

    To select which component's attributes you wish to view, click the component using the Edit tool (). (You can also right-click (or control-click) the component and choose Show Attributes from the popup menu. Also, manipulating a component via the Poke tool () or the Text tool () will display that component's attributes.)

    The below screen shot demonstrates what things look like after selecting the upper input of our XOR circuit and scrolling down to view the Label Font attribute.

    To modify an attribute value, click on the value. The interface for modifying the attribute will depend on which attribute you are changing; in the case of the Label Font attribute, a dialog box will appear for selecting the new font; but some attributes (like Label) will allow you to edit the value as a text field, while others (like Label Location) will display a drop-down menu from which to select the value.

    Each component type has a different set of attributes; to learn what they mean, go to the relevant documentation in the Library Reference.

    If you've selected multiple components using the Edit tool, then the attribute table will display attributes that are shared among all the selected components (excluding any wires). If the selected components don't all have the same value for the attribute, then the displayed value will be blank. You can change the value for all selected components' attribute at once by using the attribute table.

    Next: Tool attributes.

    logisim-2.7.1/doc/el/html/guide/analyze/0000755000175000017500000000000011541757124017742 5ustar vincentvincentlogisim-2.7.1/doc/el/html/guide/analyze/table.html0000644000175000017500000000523611541757124021725 0ustar vincentvincent Editing the truth table

    Editing the truth table

    On opening the Combinational Analysis window, you will see that it consists of five tabs.

    This page describes the first three tabs, Inputs, Outputs, and Table. The next page of the guide describes the last two tabs, Expression and Minimized.

    The Inputs and Outputs tabs

    The Inputs tab allows you to view and edit the list of inputs. To add new inputs, type it in the field at the pane's bottom, and click Add. If you want to rename an existing input, select it in the list in the pane's upper left region; then type the name and click Rename.

    To remove an input, select it from the list and click Remove. You can also reorder the inputs (which affects the order of columns in the truth table and in the generated circuit) using the Move Up or Move Down buttons on an input.

    All actions affect the truth table immediately.

    The Outputs tab works in exactly the same way as the Inputs tab, except of course it works with the list of outputs instead.

    The Table tab

    The only item under the Table tab is the current truth table, diagrammed in the conventional order, with inputs constituting the columns on the left and outputs constituting the columns on the right.

    You can edit the current values appearing in the output columns by clicking on the value of interest. The values will cycle through 0, 1, and x (representing a "don't care"). As we'll see on the next page, any don't-care values allow the computation of minimized expressions some flexibility.

    You can also navigate and edit the truth table using the keyboard. And you can copy and paste values using the clipboard. The clipboard can be transferred to any application supporting tab-delimited text (such as a spreadsheet).

    If the truth table is based on an existing circuit, you may see some pink squares in the output columns with "!!" in them. These correspond to errors that occurred while calculating the value for that row - either the circuit seemed to be oscillating, or the output value was an error value (which would be pictured as a red wire in the Logisim circuit). Hovering your mouse over the entry should bring up a tool tip describing which type of error it was. Once you click on the error entry, you will be in the 0-1-x cycle; there is no way to go back.

    Next: Creating expressions.

    logisim-2.7.1/doc/el/html/guide/analyze/open.html0000644000175000017500000001017011541757124021570 0ustar vincentvincent Opening Combinational Analysis

    Opening Combinational Analysis

    The bulk of the Combinational Analysis module is accessed through a single window of that name allowing you to view truth tables and Boolean expressions. This window can be opened in two ways.

    Via the Window menu

    Select Combinational Analysis, and the current Combinational Analysis window will appear. If you haven't viewed the window before, the opened window will represent no circuit at all.

    Only one Combinational Analysis window exists within Logisim, no matter how many projects are open. There is no way to have two different analysis windows open at once.

    Via the Project menu

    From a window for editing circuits, you can also request that Logisim analyze the current circuit by selecting the Analyze Circuit option from the Project menu. Before Logisim opens the window, it will compute Boolean expressions and a truth table corresponding to the circuit and place them there for you to view.

    For the analysis to be successful, each input must be attached to an input pin, and each output must be attached to an output pin. Logisim will only analyze circuits with at most eight of each type, and all should be single-bit pins. Otherwise, you will see an error message and the window will not open.

    In constructing Boolean expressions corresponding to a circuit, Logisim will first attempt to construct a Boolean expressions corresponding exactly to the gates in the circuit. But if the circuit uses some non-gate components (such as a multiplexer), or if the circuit is more than 100 levels deep (unlikely), then it will pop up a dialog box telling you that deriving Boolean expressions was impossible, and Logisim will instead derive the expressions based on the truth table, which will be derived by quietly trying each combination of inputs and reading the resulting outputs.

    After analyzing a circuit, there is no continuing relationship between the circuit and the Combinational Analysis window. That is, changes to the circuit will not be reflected in the window, nor will changes to the Boolean expressions and/or truth table in the window be reflected in the circuit. Of course, you are always free to analyze a circuit again; and, as we will see later, you can replace the circuit with a circuit corresponding to what appears in the Combinational Analysis window.

    Limitations

    Logisim will not attempt to detect sequential circuits: If you tell it to analyze a sequential circuit, it will still create a truth table and corresponding Boolean expressions, although these will not accurately summarize the circuit behavior. (In fact, detecting sequential circuits is provably impossible, as it would amount to solving the Halting Problem. Of course, you might hope that Logisim would make at least some attempt - perhaps look for flip-flops or cycles in the wires - but it does not.) As a result, the Combinational Analysis system should not be used indiscriminately: Only use it when you are indeed sure that the circuit you are analyzing is indeed combinational!

    Logisim will make a change to the original circuit that is perhaps unexpected: The Combinational Analysis system requires that each input and output have a unique name that conforming to the rules for Java identifiers. (Roughly, each character must either a letter or a digit, and the first character must be a letter. No spaces allowed!) It attempts to use the pins' existing labels, and to use a list of defaults if no label exists. If an existing label doesn't follow the Java-identifier rule, then Logisim will attempt to extract a valid name from the label if at all possible.

    Incidentally, the ordering of the inputs in the truth table will match their top-down ordering in the original circuit, with ties being broken in left-right order. (The same applies to the ordering of outputs.)

    Next: Editing the truth table.

    logisim-2.7.1/doc/el/html/guide/analyze/index.html0000644000175000017500000000300511541757124021735 0ustar vincentvincent Combinational analysis

    Combinational analysis

    All circuits fall into one of two well-known categories: In a combinational circuit, all circuit outputs are a strict combination of the current circuit inputs, whereas in a sequential circuit, some outputs may depend on past inputs (the sequence of inputs over time).

    The category of combinational circuits is the simpler of the two. Practitioners use three major techniques for summarizing the behavior of such circuits.

    • logic circuits
    • Boolean expressions, which allow an algebraic representation of how the circuit works
    • truth tables, which list all possible input combinations and the corresponding outputs
    The Combinational Analysis module of Logisim allows you to convert between these three representations in all directions. It is a particularly handy way of creating and understanding circuits with a handful of one-bit inputs and outputs.

    Opening Combinational Analysis
    Editing the truth table
    Creating expressions
    Generating a circuit

    Next: Opening Combinational Analysis.

    logisim-2.7.1/doc/el/html/guide/analyze/gen.html0000644000175000017500000000363611541757124021411 0ustar vincentvincent Generating a circuit

    Generating a circuit

    The Build Circuit button will construct a circuit whose gates correspond to the currently chosen expressions for each output. The circuit's inputs and outputs will be displayed in top-down order corresponding to how they appear under the Inputs and Outputs tabs. Generally speaking, the constructed circuit will be attractive; and, indeed, one application of Logisim's Combinational Analysis module is to beautify poorly drawn circuits. Still, as with any automatic formatting, it will not express the structural details that a human-drawn circuit would.

    When you click the Build Circuit button, a dialog box will appear prompting you to choose which project where you want the circuit and the name you wish to give it.

    If you type the name of an existing circuit, then that circuit will be replaced (after Logisim prompts you to confirm that you really want to do this).

    The Build Circuit dialog includes two options. The Use Two-Input Gates Only option specifies that you want all gates constructed to have two inputs. (NOT gates, of course, constitute an exception to this rule.) The Use NAND Gates Only option specifies that you would like it to translate the circuit into one using only NAND gates. You can select both options if you want to use only two-input NAND gates.

    Logisim cannot construct a NAND-only circuit for an expression containing any XOR operators. This option will therefore be disabled if any outputs' expressions contain XORs.

    Next: User's Guide.

    logisim-2.7.1/doc/el/html/guide/analyze/expr.html0000644000175000017500000001117511541757124021613 0ustar vincentvincent Creating expressions

    Creating expressions

    For each output variable, the Combinational Analysis window maintains two structures - the relevant column of the truth table, and a Boolean expression - specifying how each output relates to its input. You can edit either the truth table or the expression; the other will automatically change as necessary to keep them consistent.

    As we will see on the next page, the Boolean expressions are particularly useful because the Combinational Analysis window will use these when told to build a circuit corresponding to the current state.

    You can view and edit the expressions using the window's last two tabs, the Expression tab and the Minimized tab.

    The Expression tab

    The Expression tab allows you to view and edit the current expression associated with each output variable. You can select the output expression you want to view and edit using the selector labeled "Output:" at the pane's top.

    Just below the selector will appear the expression formatted in a particularly common notation, where an OR is represented as addition, an AND is represented as multiplication, and a NOT is denoted with a bar above the portion affected by the NOT.

    The text pane below this displays the same information in ASCII form. Here, a NOT is represented with a tilde ('~').

    You can edit the expression in the text pane and click the Enter button to make it take effect; doing this will also update the truth table to make it correspond. The Clear button clears the text pane, and the Revert button changes the pane back to representing the current expression.

    Note that your edited expression will be lost if you edit the truth table.

    In addition to multiplication and addition standing for AND and OR, an expression you type may contain any of C/Java logical operators, as well as simply the words themselves.

    highest precedence~ ! ' NOT
    (none) & && AND
    ^ XOR
    lowest precedence+ | || OR

    The following examples are all valid representations of the same expression. You could also mix the operators.

    a' (b + c)
    !a && (b || c)
    NOT a AND (b OR c)

    In general, parentheses within a sequence of ANDs (or ORs or XORs) do not matter. (In particular, when Logisim creates a corresponding circuit, it will ignore such parentheses.)

    The Minimized tab

    The final tab displays a minimized expression corresponding to a column of the truth table. You can select which output's minimized expression you want to view using the selector at top, and you can indicate whether you want to derive a sum-of-products expression or a product-of-sums expression using the selector below.

    If there are four or fewer inputs, a Karnaugh map corresponding to the variable will appear below the selector. You can click the Karnaugh map to change the corresponding truth table values. The Karnaugh map will also display the currently selected terms for the minimized expression as solid semitransparent rounded rectangles.

    Below this is the minimized expression itself, formatted as in the Expression tab's display. If there are more than four inputs, the Karnaugh map will not appear; but the minimized expression will still be computed. (Logisim uses the Quine-McCluskey algorithm to compute the minimized expression. This is equivalent to a Karnaugh map, but it applies to any number of input variables.)

    The Set As Expression button allows you to select the minimized expression as the expression corresponding to the variable. This will generally not be necessary, as edits to the truth table result in using the minimized expression for the changed column; but if you enter an expression through the Expression tab, this can be a convenient way to switch to the corresponding minimized expression.

    Next: Generating a circuit.

    logisim-2.7.1/doc/el/html/guide/about/0000755000175000017500000000000011541757124017411 5ustar vincentvincentlogisim-2.7.1/doc/el/html/guide/about/index.html0000644000175000017500000001165111541757124021412 0ustar vincentvincent About the program

    About the program

    Logisim is open-source software. The source code is included in the src subdirectory of the distributed JAR file.

    If you find Logisim useful, please let me know. Especially do this if you are an educational institution; the information will help me in gaining support for the work.

    I welcome e-mails about Logisim, including bug reports, suggestions, and fixes. When you e-mail me, please remember that I have worked hard to produce Logisim without receiving any payment from you. If you want a right to complain about the software, then I would suggest shelling out the money for a competing program to Logisim. (I know of no open-source competitors that approach Logisim's feature set.) Nonetheless, I remain interested in continuing to improve Logisim, and your suggestions will be most welcome.

    Copyright notice

    Copyright (c) 2005, Carl Burch.

    Logisim is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

    Logisim is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

    Acknowledgements

    The source code to Logisim is primarily my own work; I must acknowledge my employers who fund my work as a professor, including this program: I started the program at Saint John's University (Collegeville, Minnesota, USA) in 2000-2004, and I have continued it at Hendrix College (Conway, Arkansas, USA) from 2004 to present. I am very grateful to these colleges for giving me the time and resources to work on this project. If only all colleges and universities had their act as together and cared as much about excellent teaching as these colleges do!

    Some other people who have been particularly helpful:

    • Theldo Cruz Franqueira, Thanos Kakarountas, Ilia Lilov, Pablo Leal Ramos, and Uwe Zimmermann, who have contributed to translations packaged with Logisim. More information about the translations can be found on International Preferences page.
    • The Spring 2005 CS61C class at the University of California, Berkeley, which endured the beta versions of Logisim 2.0. These students put up with many bugs, and I am very appreciative for their patience and for their suggestions!
    • The Spring 2001 CSCI 150 classes at the College of Saint Benedict and Saint John's University, which used the most rudimentary versions of Logisim as it was being developed.

    Several pieces of Logisim come from others' packages that Logisim uses; several of these pieces are distributed as part of Logisim.

    Sun's Java API (obviously)
    Sun's JavaHelp project
    Provides the integrated help system from the Help menu.
    MRJAdapter, from Steve Roy
    Integration with the Macintosh OS X platform.
    launch4j, from Grzegorz Kowalt
    Allows distribution of Logisim as a Windows executable.
    GIFEncoder, from Adam Doppelt
    Saves images as GIF files. This was itself based on C code written by Sverre H. Huseby.
    ColorPicker, from Jeremy Wood
    Provides the color dialog box that pops up when configuring colors (as with the LED component).
    JFontChooser, from Christos Bohoris
    Provides the font selection dialog box that pops up when selecting font attributes (such as with the Label Font attribute of many components).
    TableSorter, ascribed to Philip Milne, Brendon McLean, Dan van Enckevort, Parwinder Sekhon, and ouroborus@ouroborus.org
    Provides the ability to sort the table in the Get Circuit Statistics dialog through clicking column headers.
    Farm-Fresh Web Icons, http://www.fatcow.com/free-icons
    Provides the icons for controlling simulation that appear under the simulation tree. These icons are released under the Creative Commons Attribution 3.0 License, and they cannot be redistributed under the terms of the GPL.

    And finally, I want to thank all the users who have contacted me - whether with bug reports, with suggestions, or just to let me know that they're using Logisim in their classes. I have to leave these suggesters anonymous, because I don't have their permission to mention them here, but: Thank you!

    logisim-2.7.1/doc/el/html/guide/about/gpl.html0000644000175000017500000003626711541757124021077 0ustar vincentvincent About This Program
    		    GNU GENERAL PUBLIC LICENSE
    		       Version 2, June 1991
    
     Copyright (C) 1989, 1991 Free Software Foundation, Inc.
                           51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
     Everyone is permitted to copy and distribute verbatim copies
     of this license document, but changing it is not allowed.
    
    			    Preamble
    
      The licenses for most software are designed to take away your
    freedom to share and change it.  By contrast, the GNU General Public
    License is intended to guarantee your freedom to share and change free
    software--to make sure the software is free for all its users.  This
    General Public License applies to most of the Free Software
    Foundation's software and to any other program whose authors commit to
    using it.  (Some other Free Software Foundation software is covered by
    the GNU Library General Public License instead.)  You can apply it to
    your programs, too.
    
      When we speak of free software, we are referring to freedom, not
    price.  Our General Public Licenses are designed to make sure that you
    have the freedom to distribute copies of free software (and charge for
    this service if you wish), that you receive source code or can get it
    if you want it, that you can change the software or use pieces of it
    in new free programs; and that you know you can do these things.
    
      To protect your rights, we need to make restrictions that forbid
    anyone to deny you these rights or to ask you to surrender the rights.
    These restrictions translate to certain responsibilities for you if you
    distribute copies of the software, or if you modify it.
    
      For example, if you distribute copies of such a program, whether
    gratis or for a fee, you must give the recipients all the rights that
    you have.  You must make sure that they, too, receive or can get the
    source code.  And you must show them these terms so they know their
    rights.
    
      We protect your rights with two steps: (1) copyright the software, and
    (2) offer you this license which gives you legal permission to copy,
    distribute and/or modify the software.
    
      Also, for each author's protection and ours, we want to make certain
    that everyone understands that there is no warranty for this free
    software.  If the software is modified by someone else and passed on, we
    want its recipients to know that what they have is not the original, so
    that any problems introduced by others will not reflect on the original
    authors' reputations.
    
      Finally, any free program is threatened constantly by software
    patents.  We wish to avoid the danger that redistributors of a free
    program will individually obtain patent licenses, in effect making the
    program proprietary.  To prevent this, we have made it clear that any
    patent must be licensed for everyone's free use or not licensed at all.
    
      The precise terms and conditions for copying, distribution and
    modification follow.
    
    		    GNU GENERAL PUBLIC LICENSE
       TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
    
      0. This License applies to any program or other work which contains
    a notice placed by the copyright holder saying it may be distributed
    under the terms of this General Public License.  The "Program", below,
    refers to any such program or work, and a "work based on the Program"
    means either the Program or any derivative work under copyright law:
    that is to say, a work containing the Program or a portion of it,
    either verbatim or with modifications and/or translated into another
    language.  (Hereinafter, translation is included without limitation in
    the term "modification".)  Each licensee is addressed as "you".
    
    Activities other than copying, distribution and modification are not
    covered by this License; they are outside its scope.  The act of
    running the Program is not restricted, and the output from the Program
    is covered only if its contents constitute a work based on the
    Program (independent of having been made by running the Program).
    Whether that is true depends on what the Program does.
    
      1. You may copy and distribute verbatim copies of the Program's
    source code as you receive it, in any medium, provided that you
    conspicuously and appropriately publish on each copy an appropriate
    copyright notice and disclaimer of warranty; keep intact all the
    notices that refer to this License and to the absence of any warranty;
    and give any other recipients of the Program a copy of this License
    along with the Program.
    
    You may charge a fee for the physical act of transferring a copy, and
    you may at your option offer warranty protection in exchange for a fee.
    
      2. You may modify your copy or copies of the Program or any portion
    of it, thus forming a work based on the Program, and copy and
    distribute such modifications or work under the terms of Section 1
    above, provided that you also meet all of these conditions:
    
        a) You must cause the modified files to carry prominent notices
        stating that you changed the files and the date of any change.
    
        b) You must cause any work that you distribute or publish, that in
        whole or in part contains or is derived from the Program or any
        part thereof, to be licensed as a whole at no charge to all third
        parties under the terms of this License.
    
        c) If the modified program normally reads commands interactively
        when run, you must cause it, when started running for such
        interactive use in the most ordinary way, to print or display an
        announcement including an appropriate copyright notice and a
        notice that there is no warranty (or else, saying that you provide
        a warranty) and that users may redistribute the program under
        these conditions, and telling the user how to view a copy of this
        License.  (Exception: if the Program itself is interactive but
        does not normally print such an announcement, your work based on
        the Program is not required to print an announcement.)
    
    These requirements apply to the modified work as a whole.  If
    identifiable sections of that work are not derived from the Program,
    and can be reasonably considered independent and separate works in
    themselves, then this License, and its terms, do not apply to those
    sections when you distribute them as separate works.  But when you
    distribute the same sections as part of a whole which is a work based
    on the Program, the distribution of the whole must be on the terms of
    this License, whose permissions for other licensees extend to the
    entire whole, and thus to each and every part regardless of who wrote it.
    
    Thus, it is not the intent of this section to claim rights or contest
    your rights to work written entirely by you; rather, the intent is to
    exercise the right to control the distribution of derivative or
    collective works based on the Program.
    
    In addition, mere aggregation of another work not based on the Program
    with the Program (or with a work based on the Program) on a volume of
    a storage or distribution medium does not bring the other work under
    the scope of this License.
    
      3. You may copy and distribute the Program (or a work based on it,
    under Section 2) in object code or executable form under the terms of
    Sections 1 and 2 above provided that you also do one of the following:
    
        a) Accompany it with the complete corresponding machine-readable
        source code, which must be distributed under the terms of Sections
        1 and 2 above on a medium customarily used for software interchange; or,
    
        b) Accompany it with a written offer, valid for at least three
        years, to give any third party, for a charge no more than your
        cost of physically performing source distribution, a complete
        machine-readable copy of the corresponding source code, to be
        distributed under the terms of Sections 1 and 2 above on a medium
        customarily used for software interchange; or,
    
        c) Accompany it with the information you received as to the offer
        to distribute corresponding source code.  (This alternative is
        allowed only for noncommercial distribution and only if you
        received the program in object code or executable form with such
        an offer, in accord with Subsection b above.)
    
    The source code for a work means the preferred form of the work for
    making modifications to it.  For an executable work, complete source
    code means all the source code for all modules it contains, plus any
    associated interface definition files, plus the scripts used to
    control compilation and installation of the executable.  However, as a
    special exception, the source code distributed need not include
    anything that is normally distributed (in either source or binary
    form) with the major components (compiler, kernel, and so on) of the
    operating system on which the executable runs, unless that component
    itself accompanies the executable.
    
    If distribution of executable or object code is made by offering
    access to copy from a designated place, then offering equivalent
    access to copy the source code from the same place counts as
    distribution of the source code, even though third parties are not
    compelled to copy the source along with the object code.
    
      4. You may not copy, modify, sublicense, or distribute the Program
    except as expressly provided under this License.  Any attempt
    otherwise to copy, modify, sublicense or distribute the Program is
    void, and will automatically terminate your rights under this License.
    However, parties who have received copies, or rights, from you under
    this License will not have their licenses terminated so long as such
    parties remain in full compliance.
    
      5. You are not required to accept this License, since you have not
    signed it.  However, nothing else grants you permission to modify or
    distribute the Program or its derivative works.  These actions are
    prohibited by law if you do not accept this License.  Therefore, by
    modifying or distributing the Program (or any work based on the
    Program), you indicate your acceptance of this License to do so, and
    all its terms and conditions for copying, distributing or modifying
    the Program or works based on it.
    
      6. Each time you redistribute the Program (or any work based on the
    Program), the recipient automatically receives a license from the
    original licensor to copy, distribute or modify the Program subject to
    these terms and conditions.  You may not impose any further
    restrictions on the recipients' exercise of the rights granted herein.
    You are not responsible for enforcing compliance by third parties to
    this License.
    
      7. If, as a consequence of a court judgment or allegation of patent
    infringement or for any other reason (not limited to patent issues),
    conditions are imposed on you (whether by court order, agreement or
    otherwise) that contradict the conditions of this License, they do not
    excuse you from the conditions of this License.  If you cannot
    distribute so as to satisfy simultaneously your obligations under this
    License and any other pertinent obligations, then as a consequence you
    may not distribute the Program at all.  For example, if a patent
    license would not permit royalty-free redistribution of the Program by
    all those who receive copies directly or indirectly through you, then
    the only way you could satisfy both it and this License would be to
    refrain entirely from distribution of the Program.
    
    If any portion of this section is held invalid or unenforceable under
    any particular circumstance, the balance of the section is intended to
    apply and the section as a whole is intended to apply in other
    circumstances.
    
    It is not the purpose of this section to induce you to infringe any
    patents or other property right claims or to contest validity of any
    such claims; this section has the sole purpose of protecting the
    integrity of the free software distribution system, which is
    implemented by public license practices.  Many people have made
    generous contributions to the wide range of software distributed
    through that system in reliance on consistent application of that
    system; it is up to the author/donor to decide if he or she is willing
    to distribute software through any other system and a licensee cannot
    impose that choice.
    
    This section is intended to make thoroughly clear what is believed to
    be a consequence of the rest of this License.
    
      8. If the distribution and/or use of the Program is restricted in
    certain countries either by patents or by copyrighted interfaces, the
    original copyright holder who places the Program under this License
    may add an explicit geographical distribution limitation excluding
    those countries, so that distribution is permitted only in or among
    countries not thus excluded.  In such case, this License incorporates
    the limitation as if written in the body of this License.
    
      9. The Free Software Foundation may publish revised and/or new versions
    of the General Public License from time to time.  Such new versions will
    be similar in spirit to the present version, but may differ in detail to
    address new problems or concerns.
    
    Each version is given a distinguishing version number.  If the Program
    specifies a version number of this License which applies to it and "any
    later version", you have the option of following the terms and conditions
    either of that version or of any later version published by the Free
    Software Foundation.  If the Program does not specify a version number of
    this License, you may choose any version ever published by the Free Software
    Foundation.
    
      10. If you wish to incorporate parts of the Program into other free
    programs whose distribution conditions are different, write to the author
    to ask for permission.  For software which is copyrighted by the Free
    Software Foundation, write to the Free Software Foundation; we sometimes
    make exceptions for this.  Our decision will be guided by the two goals
    of preserving the free status of all derivatives of our free software and
    of promoting the sharing and reuse of software generally.
    
    			    NO WARRANTY
    
      11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
    FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
    OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
    PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
    OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
    MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
    TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
    PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
    REPAIR OR CORRECTION.
    
      12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
    WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
    REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
    INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
    OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
    TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
    YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
    PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
    POSSIBILITY OF SUCH DAMAGES.
    
    		     END OF TERMS AND CONDITIONS
    
    logisim-2.7.1/doc/el/html/contents.html0000644000175000017500000001550411541757124017732 0ustar vincentvincent

    Logisim References

    Guide to Being a Logisim User

  • Value propagation
  • JAR libraries
  • About the program
  • Library Reference

    logisim-2.7.1/doc/el/contents.xml0000644000175000017500000002166011541757152016623 0ustar vincentvincent logisim-2.7.1/doc/doc_ru.hs0000644000175000017500000000421611541757154015453 0ustar vincentvincent Logisim - Help top TOC javax.help.TOCView ru/contents.xml Search javax.help.SearchView search_lookup_ru Favorites javax.help.FavoritesView main window javax.help.BackAction javax.help.ForwardAction javax.help.HomeAction javax.help.SeparatorAction javax.help.FavoritesAction logisim-2.7.1/doc/doc_pt.hs0000644000175000017500000000421611541757154015450 0ustar vincentvincent Logisim - Help top TOC javax.help.TOCView pt/contents.xml Search javax.help.SearchView search_lookup_pt Favorites javax.help.FavoritesView main window javax.help.BackAction javax.help.ForwardAction javax.help.HomeAction javax.help.SeparatorAction javax.help.FavoritesAction logisim-2.7.1/doc/doc_es.hs0000644000175000017500000000421611541757154015434 0ustar vincentvincent Logisim - Help top TOC javax.help.TOCView es/contents.xml Search javax.help.SearchView search_lookup_es Favorites javax.help.FavoritesView main window javax.help.BackAction javax.help.ForwardAction javax.help.HomeAction javax.help.SeparatorAction javax.help.FavoritesAction logisim-2.7.1/doc/doc_en.hs0000644000175000017500000000421611541757154015427 0ustar vincentvincent Logisim - Help top TOC javax.help.TOCView en/contents.xml Search javax.help.SearchView search_lookup_en Favorites javax.help.FavoritesView main window javax.help.BackAction javax.help.ForwardAction javax.help.HomeAction javax.help.SeparatorAction javax.help.FavoritesAction logisim-2.7.1/doc/doc_el.hs0000644000175000017500000000421611541757154015425 0ustar vincentvincent Logisim - Help top TOC javax.help.TOCView el/contents.xml Search javax.help.SearchView search_lookup_el Favorites javax.help.FavoritesView main window javax.help.BackAction javax.help.ForwardAction javax.help.HomeAction javax.help.SeparatorAction javax.help.FavoritesAction logisim-2.7.1/doc/doc_de.hs0000644000175000017500000000421611541757154015415 0ustar vincentvincent Logisim - Help top TOC javax.help.TOCView de/contents.xml Search javax.help.SearchView search_lookup_de Favorites javax.help.FavoritesView main window javax.help.BackAction javax.help.ForwardAction javax.help.HomeAction javax.help.SeparatorAction javax.help.FavoritesAction logisim-2.7.1/doc/de/0000755000175000017500000000000011541757152014227 5ustar vincentvincentlogisim-2.7.1/doc/de/img-guide/0000755000175000017500000000000011541757124016075 5ustar vincentvincentlogisim-2.7.1/doc/de/img-guide/tutorial-shot-wires.png0000644000175000017500000001247111541757124022555 0ustar vincentvincentPNG  IHDRlu|#PLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccRtIDATx{s8EH$m?[`2餤dm3|>}׺Zwf[6m7#?v,P5[AU3M;cUsV;gUsV;gO˦Ԣ{4-@Ȋ|Ô01C͓oQt~Oн;F{]eLo*{qg]vUdx1.>qf`H>U>]|F/Pl7%y][!xVl>5^poQ3A?ŕ(;|܍T?JUfS6{g+sxMt?MtUt ͪ[U[X=K~~U+#_nfFu.}9(x *#]͌S 8GH}tIͰ]/2px3ف?Q]`Ͱ:{?gUsVjUYN9[e}mDFpc{ ~a䤞Fp•ýXC [nlOctGjrJӠfU*ҍ4RPz f]ҍ4"uKR|j^~zX]nJ"tA9+ ҽnx/^۬-m+(O#2#-\Ӹ~=|F~^q ÜͪZUo[>WDnFty9{_+9̷k^R_[xF UU&#Rbž]M1[}G,q0n-ifEQ_|?ߏN+wd_=dbV>543,j8}i,OSn ϬƒvE e6Rj:,ȧ]s:4HgfXm_im_-ސyu+Lb ):ZvPC~=t&A^(#y {7.XRe36Vp1lpt[-_Xy]]:TRǍ]0K ;4r')5*1hx}~ |7OYlPU &>FoUQjYRJ{E^eK :)fw#隇=!›Bw W@G@%I1+b$2_/8x)@iWYqt=jFѥB ]t/AwfBNt34t=|ksZ:/lD:sF G2mtr46Mn renCp]q.ͩ=#D9`\c4Go@ԜSnxYג*`嚽ό͢lw3ϡ#ofEw nƪ@56d]%b4Ӆ^x3boi>[Ui o|äț_jO0OP[)_Utc "7eLDJ|g`]01-pftmէI8SfۥB=ݑ]n|6БH,PT^Pb{MwH?TontUZ[o-Ed#o5u+݂᥂R׹5ӽ]FƪK`EyO?] *k ^[$2 >Z]#]iXdӍlå%,*]X閧yWۡn&C7PH MNnر*xҽ>B<; O'3 #x.y.ҍV!o͢껱Jx`2 UJLAbdtU e|ݎѦ}Mנb"33XYKP]~eB\ τ/B~9KIJ.{&sEhMJaV+0|e6z:Ot]ݞD9ύf^ wXwͮzqPC5ӵcm_gkzU^I`ܭoy6Ndat1v]q전(?zn[KUm[t?޵0b k[RxM~uGd]vaVx3XP&UGlpt[+H?}˧KJy ~}:n ~ObvW]9546zטZp˦Lndf@mKsDoMW1GuAۥ#2iNtWKjh~/,\Dv(<-"*{fwݻ5[n7E7K\mҵUvѵ/S$\urpн;JqY]Jfg 9>߯K8@v®|$eϋT2V] AOtnvI\4<89f.;]4SpG)(ôDG+AeGa9!MۻrߕN OxB+d $+]|b RѸ%W7,f +\tˆ.uM`b R63sVy+=y\VT9 TYU6^x ;t/.c܌mXJ7TƎe!Q| cY3/hBH7ttaQ&]HduֻtRzDI׫\&]+]+]-WBHJQ1t9s;tGr]E]jIU gRf7IENDB`logisim-2.7.1/doc/de/img-guide/tutorial-shot-wire1.png0000644000175000017500000001243511541757124022453 0ustar vincentvincentPNG  IHDRlu|#PLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccRXIDATxks8EH7df餤dM3>:Z%Y'۲ѽ`$ ]<:>( Н )Н )Н_tYv?!šI5)SЀIO]a|4H$ӏO39Iǜْ/|hreL)M)T2דr*ɀ!. ?7'缰_,5Vtq9_(><,[ח1@ƋffI/AθVG)$ltWRj*҆'6ڬt@֊*Dz?W Sx+]=": 9d WNOj OtU BẄk!|7s< TT!e_]6֟<럋O!f͙p* Qo^OHg̽F䊴jl//Vbn"^"m~S{(iZʑ5"[ZU ]9#D'Xo-/a2/z?Y &[LZMQ_ nNqϕ.$jKOI)CyE_m˃qvLӁҤ2.y5"}9\)!׋,nG!P..4 *PR`,.!EF#MbZx>M3=B.-B(W9J ɿ{[yj|zHVMYFG5E"SV;eS{S4UAR1OYv_EO+R;e;_{@vНd*5{ټr;$jK*sZ*ݷs#NiN"]M\x0'mlٞӽu3x.>$g^[#eC3 dd C 3"^Uܬ"e/^tt}4 50tz|Q/It^.?5]pg0^q{x%`J+JF7F@{XɓUۂxi֗" -ㅢxŲޠ|iVC [@W۔]d.UPCw4oVͅzJ-.%6wg\^/]U=[5`jbد/3]<"Нsj[FDK2ӭ̨ͥ/{p2A3㐂zu6qWf"mRg3tgtӋ"ttxȇ.fTVWY )xMYu*trɔ-w>H#1׾=yjtR@0pp'7(G.Gb̖b>k ]_Oz]J[Zԗn3l] [%!{>U/wU |#7E>%s:WvB' {]=Ys6)t-FR3#5\S~=?~}%g8eN*zUo5\v+^5^5s#kput+j[MoqMK GDBHlV/7vcξi]xwӪ[S]%gfK 7ٮeK[ I?մqiѴ*7G$[21#]SOC[3tl_[uUuBy-55"VK,TPd-%*"4K. ]z_FV5xBt^9f"2vY]LhBJt G2oRp88|es[d2Un$ܥr .{ğ~sUM=̿Ңllna7.ޒiҶѕI?FGY8ѫ7vv[odh^ū?\Uw I8WOl~+.8['&[@*] ^6Pqub0DmGwmIt*0[aty%ꛍ$Kݏn3"Tvz Nt-+4t<%nRIv3O\窄UAj;۵*jghkΪzo5x=*tSKu-Vx $JQl7qfRt[oI>lr{f+hLW&Gw&"%%3N}s O\dm1 z ~L0߫r]KcxԬFyTUOס0q`%v5O0׏.nlp0|6ӈgi)(QKDoMtgk KuiDEyD /~b jJWŋ߉təB7ƕlx LtpR$ wCK7.]{ i]LV@T.6H} ] 0K3]9F(tnw)dXu~ڮݫMt7W~*ďw?l9q}%k#8t/v{?]WsAI0yfy.JOGO~7jH49*e{nHDiW5v;9\oJ `\}搹r u~U[_Քƻӵ||"=Pu1iLt%]te7`zg  cd+(OU}^&OoXB:AŦ䛑СqIuG7c'VPx0 e[+sMU󹔠q8۴U5 |}WDI+ Q{E-Vt푴tP>E t Vl7rg]a1AF @t#wEP2UFWzUرI_kpoH+]1[A7"GMYlwGOlC>lHH4B;dv$nC5҅oK!ލMB7Tc}XITl7T؅BnRft"Ptus2ZgYMp2ԣvDI6QJ唻oJ4/xY1]7EH/3]FttwpXrd^ P3 GZ9<]hVz͠ݕ;H*Vp~vK^xНmw̌.6Z?t YMvϦFf ]FxcN'SzunwQKtU7+FWrw (tc<4sP2p^檄.,+}!]j;V<=^5tSUu2ow) 7oFt![mۮ*j1)tt6Ed"DꧪOg k*tSDf'R&YUyѵrdЂ)ٮvtmָW5XUmȬ0p ݜdVvϮG! ?绅}k+ݟh[]BW8(d]SyёJƪAfFvPDŒ >d[uzWdv{.ZG`8ݣ䔡J=tĈn2⁣WŖmtYt'r 2f`:b olWhwtu 2ҥX'!;YUňtϑv`Yѥ:LlC*gf*ocdgtoQ{?eSV;eM7=^G!2nyX>ֳv`3eO}"Kwv*6u`9,]64+ۉxߞP7gEf $vA_' <:[%ӭpP9t]>?neǽЕjfŅ %x-97]WMuđYvatBWM:_7JJ tv8tlhjf|jCr^nhVJ:]ٮ VaBHLX>ѨVVxvWȆt!nf`ȅ|BBgy5D۝WJL.iDṰtye߼5 |59HɅ$BWo'}n?]9@HɗBR.MM@FIENDB`logisim-2.7.1/doc/de/img-guide/tutorial-shot-text.png0000644000175000017500000001330211541757124022402 0ustar vincentvincentPNG  IHDRlu|#PLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccRIDATxio۸8qmFIui_q*nN$K$E. #tU5SV3V;gUsV;gUsVt?tQ8)ɡ)$4(ЀY~ѽ?F;]a0O@0< xXb 5(L%=>c:]zQ;C>-K5~4EJT򜞨c!#)q͡ ~}n0aE sV;gYssV:gUsV}d+އD'#ug'#hXF:{!{d-݁c59YUjto7nhYtuJ7Md$td뎹,Cl~~FtdMFjw? V-5[DxOHqzGlS&ɚ,g&`[Әݞmwym[¯2hZU|Z>-xcG;{5Sp\[g-\]Kmn%?[ZU!Jmհ-{_"ڻ[6uޖ",wчc"-]?˖5d~R!jimy./ӊҴ@,Z*1'ݐC:磁ۿXVM [vȚg:3>F);;d ݐZU/tܢyb](FҼGOHΊJ9$f6JXwU,ta b9]I!*Xdu_+nEsnd.Pi L^j+_]J#41'Z%]K9Qz @ͷ#gF&]{lE7"r+M'z#T}t%āЉ.V+v>W) A7 \]Qsg݃,Y1XWnOrl|OjEm. ətK.7TE[Zl.IC(,D:]ep0V ^Hf.~'#2ufXugVw!jU ]WoxG m:@ytugҦ:9ԙDv~$Pxs}t,MigD+'2nX/0xr(1Z itE"ʣˋn;gBtݽDo])8}ҵHLy]nmtOm7z^Th U]jNv5341kΫFo1x#fyU-EFQRVETlnFKh3ofEwn'T8;P36c8 Z)A7f<}Ut~bWB]]U-i M֘ԪH.鲵 0Dr!Ѫt3C}e|ir7^h͊.|}(vi+2f:֥-gWR|rfW ZDWqrYb9x+K NmJە/t^hnl_Uݕ16oj_U/.Μ37U xZ:B V*&k 5]ФgqI;nj&M7ȑU"J7U=%sMU^MJ1QχnxKRGAhMDc}wIՋc<xSG ҿpRnkltx y7uĆKϖo$q|mH_Uq*@KlA&iVU[&i;̚yg & q+njA$aº8Xo=]L :>ާ.&יOr͛5"'ibth;<.WwA7=k[=ҞHDbi\t{Qs㥿a}OvgntuXoX?F 6VtJ[׹}\V"C9 Na8]UoR]F_ڮr]ӭK˔:XuRS^oMws=2P~{)pttXf NƋP ݛ=>?]LGsA}&qf?3艤G=tɜSfKj WvTOpp%fHӪ3UOֽϫRغUͩ?]7lNddY>s6s+u.'z2E)7]u|F0|$2t;9rU]͉nrTYt9/-g;FG!}wtrC䚛1XYAϤu\4KBm*DwWN7l+d|~2dXb$E\^QW%ٖ]HOkoO ]'*AlJaTdvMCԪT-2"/]rU1\Yqm19>-\Ŧq՛ѣr#^6~=^5ةIz>Ej200ZA77Z<#ߎ]']x8QQCS(2~IӅ@#!|?`#Gеy8݌nA]ڮS]802@ H^BP )1tOѶ"We{}UPۥK3s*M-/-LwOx]jh𵪳J7@nnJ7{[B._U[DvS@3!vPT&*gnϙ][u݈Uc@[8]0W97nGomOעD9[}kiE蚨J72);膿;Ϙ4gK*] CQ](auHL]9Ftt𖘙3c=ХOl^eپ>!gc/9P 1]Di¥]2'~iVd;rW[+QjM]q!q=[k29nnt>U>\;vMͮ3Z[nmzEvRbz+@)cpztɼM1j0tĎtB$Zz J]R4+AWxs*7LzO ζovyU.,ku!"(kv&KS AUFEU Y2wlԪX!nx6d3HhW5]-Zp]&0VcwB2]2Up{Khq3XЍШdj:sf$K74iۥ*N74-%b;L``Zt̫T7_mFəW%?CX}6+Gx0Q]R8n:_#/;9xyY]Z?cx0jx>=,Kx~'vPT[) ۿͪxnw7|ZF_ JL!aw^z8:{"v ]F"uNAuqw^:Jx5;He Xݒ` gs;t2]MZ)$Uݲq/ZIENDB`logisim-2.7.1/doc/de/img-guide/tutorial-shot-test.png0000644000175000017500000001362511541757124022405 0ustar vincentvincentPNG  IHDRlu|#PLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccRIDATx{S826dY:6 [髿Hr|A_$Y뱍PlZTTWUYUY?zI\sYIs98& l0Ÿӱ A?|( uYB~xwg鸓;yKFe{̤K>[%Ve?]zEJnTrs!3)ͦ~~l0i<i6%MD8R,x98LI'eO]kɣsXߤYUt7GJY&Xخ&"˃%oҡ= aGP]\Cғ; YHy  ťgchmNtD#Fz>"0wu4)brry_/qh(/v iM'Mە+-<{x>F(*DD}u!lCWHD!Q{vm<9]jrޭnk^`0]F;Mulۮhlf$>WF _/;]m5r>B+ZhA׬wyR/5.QNN.>WFJ_/OıFȔK;1B),O|RdiҌ *jsFz@ɮѥ5 \Wxrѹ2Cs]/]@AMo_WAMnShrtIE[ѭJP;gUsV;gWUsFjnC筪*9еt~-~UwUsN׵BJwxitXtcZ[z ?]Ś>-9@7wm?8E&$û\.6BUؘbr2tv+E ]7CS2Hѣ.>Ȃ k#Ig7^בϣXKbK6]WEEoןK~]Ylׅ)/fFw5moYNK"~ҟF.5[ǶZHjlt]|tU9xtilkRZ-Es;TKR"۠C$s̵utyY5`jR6dkK{rY5+#^Gt/s;hƮfpY4x:Hmp]-/6pecHw]x(V^u~Ϊt57gU9ҝ&sH6t~&*2+w|F"(6\MNeDW +Z9u)fzGKw\MN]~٪tS5~J7ShYt)Ddnнmk ݿcgd\aJ7CHm)!X#K9 ==ЭlWfzYL*KC1?{:"k}]~79Fgת]lϿkm;2Á߿]2W]m3_cFWWmQt+XVUAI-jv檶;lKcU7Kϸݓi*Ez}rnx`vt?1A^OD֞7vpZm %/˖NI7fSyk` nބk5 e831p-VZ881^FvO% .4Qy;샇8*mS5Qf8bf Kf ,6Iͅ$k1j3sLBf,0XF2袹U?)sh(Btlk]uMOFRM̉d rVF ̨M^2cwאQ]u+#f ,d=G8Х8b}c9ba *q۷v{`5YoKDQNNM%v/5uNt HoS2;閴]n[Zl&PDջ.D&]x`cB <^hv˴aBrz:ޘhUit9^GAs7Hru{^mHo.L~%Pxн+Fw R/l(o.̢K; { 1mV,BpIfAWLnd$`-c7vOt#|[/V]6SAMj<Zztb`Y¿ ^n;\U-zV{=a1Ҫ#] N+0{]#&[nGE߱|_ڮ mT [ Glֻ`5G}@>c](/(oV2Lt^AmfQ qsw dewJ]T [:Vmyv;V⳵flj Uv-F7D#W]twA7?c[7_H$"9z34.(0u=F*瞛+]/]c'&UH .MAtG/)toכnTΰf>SOAmbKPvGkm@br2N]\O9t/v离 CD^|nl.wt; K^b:; =و;3HC.>L.ߝ<4[pn>ဎDfxWͿmX"o 06sXUt}9׺w*ۯjNiq>ut6*0sSRT.ϋQn|&0 >ixt].rC͉nT^tMddz39;ecP]S0 YƎA \ykB6[;70l+luleȊLNn_"~UW{ӊ+ٖ}_U,ڎ ]'*AlRUL{lhU᭣moh49] Ma&dZcK5#QеxSg Z4=MLrᑓx59IpȱY‰`f{ӢWK%T87O\ON)WZt}",Q[.0dMn ɔ(.VTll!MI y]]4\ftAW䊑.n2ts} ]IJ,|%T(.V5Хw̃Jբ;,.HΪt,wN*MǠ˛wv lfrXkVm!F Bg^YY.*"BvC~=ߏf}{]ֻKDmd3}nUz /ƎBW+ ^20.dzwoӁ=rstCWLٮte#_nyFK$tA6,%3~c9ttw<~fn6lQ_ ݦ;r^:/oejnwwA6t/ tow4%.$+]]|Xs$ l9Phzw0\Qm3FIWy+WG"5Z|ݒ`Zts;t2]CFL,W?&KIENDB`logisim-2.7.1/doc/de/img-guide/tutorial-shot-labeled.png0000644000175000017500000002155711541757124023021 0ustar vincentvincentPNG  IHDRlu|#gAMA wPLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccR pHYs  Nj!IDATx]vںOVڛ&]vO!~53z#`>KƛF(JkCEfnu=d1np> 9gqC!ML aWoJX&Eg-V)iI86_K~|^8i&`tn|y0^CP=qHIע}<=1U(|4pm(;L_}Y[ʩ/^q2Kuq&LO C}nȿf ]wXRFjRzt<p']r[Pf<S؅t7_%n#-c b(%?1O}gd`8]pͫ;] P8,d"/?5=|ew2uT.)dxZ}x\=[Q(]U S77iN%2_ d@?,r3.j 9RG</X?؄:Q>Yi.خL&>Ha r.`_U9)t+3%Pm32 Ğ8/=~*\-lBJ˓FFo9ȩF t.жٕ_@2*~5ʨy?*L:k.3 ]q@[7宨)Pa0妕_C)XesNIfp4BI< ,OhlL}/B6GmWy%k v{eUʨe`R">ZZPjt+a2OglG߹o{0+ByJh -O'csvؕEO/ί V y2e6>ǪwqFuQct+~BM>a-*U I/}ٽHy抎vU23R2;[nwEQqSw6t.P^T5b}w%SԨ2gYC9%5=O_8ҋGm fҵ{. |wtH1LhjHeT®3MM֨-v刵M[_]ɔHX%\Ir7?q c^HK&1gn3<} 똆%Cf1Zr&jz遾t ftxܷ`<%nB*'r)ZbG%5Wz`aՌ FeFV|8v}WPxdâ l J^#Ye%XO!]wQIn5GpI[ A#=xAI4ӵ³{:D%Y9;YgyOf} /6s$t-v#?W2٭Uy]R)x2=Ik=zw@hqݕv'L98̋Ǣw{bY[[ fR{" ص@v z'+hTqc,v})'O=T#@;vo r|kn*L1Ԅ HK0l~da9=-E ksXJ+#K ꡔUz hTrة ujuHl vMyF/MPTYO5NRzL'y)[5P/ӐZhh1V]jnE6ԯ`o0#][Bt #H^ SjuO2%]ud߷^^ v0-g".-!&tJ#KݭU-+pUM‘S PS9L 3/Uj$1%کJ^ ֳ 5H[nxw×(VVel+0sKqK & T^ k]~g6WlV%z710*6MF}W<[#3Gj~vgqKT :Ukd3cJx_9G4Hd~yHdގlGi[6.{D*3[[B-ᨠkQͨg7ToΣ#vze~v羯z~ nXܾ}l//sm~ jDjzqNLbt?䑐<>[vޛ@k$vΆ%I2?5wٝC2/n[tZXcCO|>cCd}xq w>;C",Evg]koCNdBvyvE vGE3|v8/9cD/;k?Ak٭P jSt(֞c;X dtv_cQǮ?qBW슸quY4]kZ+SDĴKXpY],/2poUdW4x吁ue:|T&*]k`=f*dDFgSfk˺lw=.D8¯)SFk˺ev" A] k³; {Eb^ GUevcmWXJ8+d!d.&CiT'E4ux+zgF& (j;g*_;$2PidL&O(Z7ZʌLAPe7ͮpbd`@ZZҡ\,Nr8ɉ|uQS(/}="B9Uq@ق;y%cKLD *A`CAa2y%vSNt?<@] fBia g|aJ!SbihT<ĮT%ԋQ혈סQ.Xob)`=#N6.)˴b6{v@l,(8у.VL.fIZ7RِAgvWV̜bt"ng2[jIZɩ%eᜭ0x] ZU `HVKKsuY03S+}{HmdGnu,װ,WYKT|x(`3l|Bwb'=XR,W.EVʩ eVXgw9,D1)`džV)[-I:Sy~=#VZV!sAp$Z*FV;UUzWG4G7ՒZ2WS1+f|&r=+EՖbѳ;Ap}g3r~_SL!{u3@בHF]VdS\ov3DO6iFȩw^;=x:p&Ik`?ͪ) &N߫cg]g16qŒ;ZXk@*M  ayr?;9GEWU6`m'-*Ic= #vf?4Unien' ؅x tDz(;eؙX}́}6Lѻfg.p6Q0z*M_8Z䢒JY 3{6::V0kqr7tuK3FfLG.,˪ 9 vsbwxG* fQ1VZ’]e5{x'#g{#U\dB3jwT˖\ _-+k^l~H>˜kZbgj 9 vgQ&9?&eؙg5;zC`"u̠7cQ-s%ղ* ׬ؽ9Z=ig f׳`Zӧ5:%#ײL©2C=D9XUdNI0YQ0 ղ5sC )^f^VgJ5$ ,# i\(N +e[.(UgG%x@؍UOf3`:5}“$l}́`;}kvonF46OGU +es.t 1L+x@؍Wo.N;?ϑZN>K5GEjْ,\Yb8$u&ߔ*s~dvX{]թ-fy؍9[>yvO`7-vvy)yvOd7d;LgّTvS.v[ ʪiNJ"wgtHv$zze7Y.XՑ{bg?إ7<+o'C*^wns&74Sa_ņ]Yv1 Klqz&vA{y^B:&pkDqL-etbWJ ci{mbӯD93 S44E ؝Lpo21SsL{0ʙߞaPzKb)8x%A.3lv ݷ@]]dEB[ӻ6c,@/2lfׯ/J^6V$w+ΞF B4aQM+_nd8p"z8Uz鎑 :HõQW0 #Y.s(Ska+{V#=u,[4I&V=%u819hXd)sD dw4O0~S(6ʈF1j"2xv%vqFP"ŭPˬ`: |s 4)I,ϸ*AQߕڨ]Yf۪8wWdVv#WSiCWwaPaJdVJ*SM>2cUi,OƖYձ[qG&; N_B+"Z䎴T*!xEi!ѕMtv`8U3cE!v+C%wkbo.-&bQ",+ܫ_ggj$RBb5Y+|(%VCʯ(En_mWJ pp’XNgwPR3D kKě(K` 4$Vv BW<=.oBE $V(DCnaSW&xg>x-?'7%V(h:+^#حCɀݸHI*ͦĊP,:)ŠIAWb~ų7Lv%5ǜ>+XO$W}dwzy R1fK2%V!EZE:w㊟E8{PhU[OH^`)3KcXU%o%zWq Ԫz[ݓVyΎWvn1+n%+,dxFӡ `nyv{n> Frgdv܆gdkx xvO^<=C{`7{qnv : x5w.[V̳; vxH pO3?xk;坡`vs |g/ϋmnw7,v9A [~Nog4Ů#h܎߄]f_^-f~>]hw?o% XG>ΞF_~7wv2?n~>_M.0zU75s.WO#4ħ z ]zp) T=^cwv0ZbGqr@v;OSpnvkF"9{z|QÎ١ !VS/mn" TTmd+80m5od2-///zMT4}YЬGWf wQ41VvL9% N^"9}~SW~{ezΣhT$"7 !Vq0S/lw_v~lxH敾[Q/{+>VݜU ʖhNWI)Gy͠Gۃ&ߕԼZʨ@lwyQU9.Ѿ\UFͪ?_vcR.4 *PVd"/[DVFjZx\3=Jͮѥ-J9 L){r$0HM&LFKZP&G!;g9 Yh+,?]b @t&qAy?~0T@w{z@w|iM5LoˇZɽ]ΝWź>teœBڿwk2>`^-˷Z*]e) ~ld$$#E ]~e\"uO7lt|,0t0tv|YOIt^.K>?B]tp^qyx5`jxY)?,nFLvM蔯Ttm΋xNǷ>I^m<)]W=[ҡZ.k= +Rz*]{|RZrx*%~٤-tRz tǗS"h\t.} ݯ!kfhxmtmtWBnՈ-ϥRntDjt͆FDKr-̤国wٌ-fpY4⼑׈zH 7E{Ů"lvЏ.z%KXn<4 Sn YO#7%C%FtK9t+1ytK76kK`[Jjf=tJ{%)s 6 zU]U]=Tp5߽g[Bq{Gf:ex,7Ep tg\]Km%Z^ CII=jwZwn`*UxwGӲ[QT]؅wCR'we= H?UvKiiU2@,}6| xF!ifYptl[Oc6tUxh2Lpct^ aj)`Tgbkb/t^ tM=Iȷtvη>??kox{{Hgx/TbYpo鬯ԟ~sUu,v#(y]m}]%i~ɢWdkMThx;. 3݊ڡ}6tG۱W4^jǻ"GP7g ٍLϣl!82ZYѵOU{b x(ti 6Bph.f 9.uPz߽W q PҬ*1Ս.ov?U΄ RKoaLnǻLƻyq5$-nJDsUʌ05ss;NucMt(5B5{RefkJu>1^Db3wO#ofEw @J)1YC)e}WfL7vu p8oRtǞ0Wd8WTz$M}ݫ `ʬUO 删.鲵0r~]mTZH˛ whW:͚]o jK]Q1КNnx%RQwyũf؝8hPo! #Unc+Mt|ɚkґ7nh7oY[)-ݶ. ݶó;VM0o4cO2}D"0~{IsUHQ o۫] 2pnO x8mU{Ē/'-csO{*zJsܦ]JIk[>_=ӤUn )ySLV2++}c)R[_gkyIuFX\>s!mͧi8iIܿۤV:8ȚiBC.әHD,0U}+w7Wߵ(\J(El\8$;ݫa; Us_n{ t.S4$3 H 7]݆S˔"J ym= Sh.qCer'NA=.WsAIkă3$exx?y6xF۬|f9F nK~ǞQPu\`ۨ lˁn[%XTfl?EWyuf3Lo=&nP\tTshN׌yA['K7_q> |L7pk \9hV++tJDFѤz5{꩟LӖ-mtMTj,PEw׫lӮWas$z'GЭtp[vt+ībez|twxCnJ@7ߕҕe/N8Y\}99^ D=GNٕ<+p-*t hxr(]լ\qCDKzsg_ w݈Br\("I@qN320], *-$V[ؒ]5&}tR*MJH5}Xh_*2.R)uYy+=[Ռqt Ӟ95I饬XWJY8k&j2>YnO;M!_ &n[%}`ON fEIl=C_\UsU=yUtQ>J^tMUh^t7M t"K)qQtgF7$)]b@^,qɇ3 {UUd[I@׌eJ{Lg{9nFsUxE*gëXyaay9Կ wGu\}ʉcvYUUulw% $C ѷ ܏)>mtMm}ؓ9X*k*+<墛E\Xt8 55@wޚݱjpAӓi4f@7|t -g9Ј˜j]b"'!7]#ɿۿw-urӭiZp|25o.ůk|S,+YblzXY-n?bFN}wxyg3(]B¾%Et3໋*tht\#"37 3IW|K+iit3ZI.qA7ϭjtR~zZ;ݑ\אaBjOlvHU IENDB`logisim-2.7.1/doc/de/img-guide/tutorial-shot-comps.png0000644000175000017500000001235711541757124022550 0ustar vincentvincentPNG  IHDRlu|#PLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccR*IDATx{s8EHHHچξ&3K'%m髿Ւ,ɺْ~ HǺTVELuSXUYUYӽ.Mb _0ŏnP$DZ)]?7`bŸiGh' L{7N1wa*cNeJSl_Nh&(vg\ܟ~@\gBN؉Vp#Y2ٵ/‬g e8㫊p?\[KhŇj]K[Xtoʆ'|mt􄜭x]߿0ewY2h?ȋ22;s ( Nߔ!-ļRK@WwiQU9.eDrV))W-]ԻMm@ ĆQpv%_|#HBWl3YϻiGKtqͱΫ圭RSw tY 5qfuJ6Uon&Em&GCUYTU^,;]b$TY}tW~`NURUsLW`OXvKtK?>dl2|<(%mi~U)ӑ+]Bw\v'}m%];Z>Cr+Ur)Y+,5⏵]߾wCW+}se^"eϏut} 4 50tz|Y/It^.>?-]`p^v{x%`TJ+xsQ~Z.;#L\1_.h^Мo})⼐ۢ??~Rx7A\vZ@ZT&V&%VEj}-˯*]7Zv/͕n~ -%D;}\+^]oU=YUsNLJ.j.9]=Ft63s^o4cSG3t;mfRp^9F"HMh"nzY/> `~9ҝjܜU#^JwΪwY -=z;(VUz y+At7}E,q0v-i4fEQ_|?ߏN6>;%fČt]vkN? i,fYxtX ]V t"Xӟ#bgK$YK 鬊 B wF]f惔xFtۗD*ސy3»Cd%8tzeEwKP]F;rR ~jHWfqtҖ*Y*нjvWc:/zy]\ *w.1t4H}g?D'n]m]Պq7kdbBf٪z#ުm$6}"3({(J։1k~Js\xc(Q6P iubk$ҭG7]+ЬfyfLjmoۆLc:*,x3$,34]<.u^vt }*ױ*akzcU+s3f4ǎ3t-%߯o9x=rit[K̺Tz+}bn%ͨ8} y3+9Vj$d%w]CU2]1B'VJ1-:$*!&ı*KKI㻿:jo'l*ZUP\D%k%&aޕ1\̪t#C]^t+YpgJ5z.wم֜f]cq. 72f]6Z/!63wYy{K+l/etV;VЉ:VwiťSf4Ahg=B5\\A+~gN^Dti"hҮIG81 [6]٬VIJ/a J7T%fK  nM qߢgC7IBgi+{(D0~k{I*cUHw7t '+ WG:W&"%%3Ncs O=B=V|?Ak@(׵EOh'gVzx^f0*ϝ''(|m>ې6+ 'yI;ttCgǴõm3yUF$=$LOA:'#}kȬ)ܿ,-n: Eo jh.TTjTonhyYB-=n)",:rt K ]R ]oZGbt})b  6HNҐ”wZ{eVvE2ݘ6\]¶ޥa[Bt6c\Mn ߥdMNnб*^t!͝]'#Ǚ +]2>]<]qި9"dnR?@r'4vZ*sSfj3QP<׃UIlqU۫t+PNŔN3ѕb^w2ӕlC׃I&g@#]9՜@|A['K7_0{_))u-A)6jeDlxkț/ˏVO1M(J7Xko"1C #TW٦]s?U\6v;&r(ClJBzT.~ӏWeB\τ麡H/Bz9KxĒ.{&sEhMJaV幄++H(/s.Ll~D9ڏf^ w@zWuMzqPC5ӵ9/ZUP!M^p]޼B'F0i/8#A Q>EtwlZt?^;aVe#Iʍ,iMd2uwQMt0+FW w (t Ơd_t[U ]XV9]긁qAXU/ƪk2w%e[6]ercdb\6mWtzD n *]OF$ҜT]PbbͅnʑȂDD*/] Z0'ߵr|΃n^nMn9qU؊kw k^ -I6[`{Е,-,ys~XٗfE!t]EOB5 he:tjf$leT<C N'qUs#@v,5Q-HYeqU㲂̅> {JwΪt笲$XM"*Kp,,Byr+mDzgxJ7RVU&s`.2FU]Ѫt,:须aȜtin5MX˺fw t蔣7gEf +$wnw?O/Z'nwL @6n{lUzW컍BW2+!$P൷tQ{o#:+wՏ秛R~oMNWVtU]DtS\ 5\t6sw0 f|+]#]2`` %zrُԻz{X҅x:+] ]_I8Y}wkE3z7]*S{:ˤ˾ykWjvt#RI)q*@7O0Tf?]9n&UإTKsVJ= IENDB`logisim-2.7.1/doc/de/img-guide/tutorial-shot-blank.png0000644000175000017500000001013611541757124022507 0ustar vincentvincentPNG  IHDRlu|#PLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccRIDATxS*SVw?׶̙ZdzW &-H9k\}RUP"U5 ,-Y[@dnJOwuk M fņ<0eSN'"E ~ׇ$;tW{B?X"S)7V#('\\a;W"lG5.j6kO&|5tԝ)\8e wU2wh?̋22ېk , OO]Ԇ:|wBG9tMCZNɿ绅&J:E~ ~Nf(]fϦ?*:!TfoK^)qЫJ#^<6p-}[FqsitOw IGWmR|o^^ƕg~7s6UE۳ݰyf[}5v>tonG3"C/__Ewio= 7ЈƙMn.zU% tK,-Y:m4@W̻RfƪYO~&sJ>@TM/ItsӍwx%L; U W5 {!^2 :m4M,{.!NNM3}S)@P@7Е.@ ݑ߽5Bp@w$p+4DmuD?3=KẃffnBp#ѠqDKSbE\*2{i tcxA7ǸNC㉼ݒ{>M] oRtLqRWݳ/lwS)/{7'lik.!銵<{qM wh˽3m4综U39{gi4eR25;M~}f vpuiQ]:_EWiQzW_< x9,nfJxZyE#ݒ%k<_gGaHd`o=^c6ԋ$5P '5k-$K>cKgxTq)Y7{4 ͤ~Lӄ^U*a+m47{/|ftG~}ZڼO#qr 78YfDHd;U(|ף1/-Y[(z?3=Ku ːˀT~1 KgxU t tKVCbtVŎ|5]1 ^%|6tIe1/_O@7% nq9,zdntՙ ӵl@7]N!N Ƽd0Ѝ 6{? SA<6c #H[FL7,5 PBݙtqwv\)b.VV,AwfUQ"K5Q'^D?f;wӞt-UiGW tHV \[z;Cwtyz$<2-s;hEnM7gf~'Hh*?D2nt)wy%;wz5@7^k ek7kctkO*`=KwR6#̒ a`V.)nx9)@[@dnݒ~+M%nݒ5b}g#Mݱj86j,_ 9݉ʝ#ݒdk1WyTfŶO'#.bsK7̊mNGfKyc4P t-U9(;Q9u[+ t%_ZY)V ƪƴgu+;N9]h5ܧ,-Y㉫,-Y#g{ wǪtKȥn(u]],UE]t/MI'4kB8q8Rt7K?oRXDx2f^Xk_Ȁ*ۊj$]6Sh{+(÷EWGA7$ v3C1Դ}]v@@X'2dl*Vq0]YRԂT2dYUg63kϜg{8]隬äR}f2V*KqY'zTgݒ%kDt]1F"^mXOЍ>ʯ2gM-.YUc0Ý@Z]GmR?N.]̱u.kwWoKF1F1VvKo:2>ufqGj3*WX.W.=ίwӴXǪ0Rb$2r,BJev7@dnq)YJ{$2U%i4"f10^bSg;cIENDB`logisim-2.7.1/doc/de/img-guide/tutorial-shot-ands.png0000644000175000017500000001073511541757124022352 0ustar vincentvincentPNG  IHDRlu|#PLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccRIDATx{s(I86ۓm'uLiFr2n#Y|!@ #t*T@`ݒtK-Y@dOw}JM ja0cN' EґsTYJ7h|W/]\k*S3|ߘI}h0.MwZ?l$]o3PCӊ9 iHV%6(x6$Xk&V$b9tap.|ʖ}TSJ+M~JU-Ihմ.>!#;ݟoۑQJ}W$yC)C/s9@ Em;Y?ʠתvJ?-]4AVRjtZ}g R72}vMUXzR脰/GWf wo>EytiX]3p6ϗ8cn'D;y]R剏oM+WZ^c9APѲ^_ aUfJz@e]t.s9ެԷR/Լw2ezcweòG7wUC[eKI[e+򄔣ϼP*cgdj^eAlwˎsh]Cd5}V)ˆ|y]ǚa׻ (C@y“(%2ZeQjv.k9yU\o̔w/]Q@@7쯇AK&d҆S -Y@dݒE^JFTb.Y~_ʼnM-Y]t~6PPݒ5],%ҨOkit_Og;w_ nf|ԗנY,s ݮζi^;ʖ?'Q5bxmUrhVLNF.oN?Z BWū=UNFȂ #Igw^ךԗBk]vep)Cg[n΋o@w'bhtk=ߛ5ۂyQEu['OAWUvVJHOᢋ~otR ]kS/Uok~6b ŞhѮn|)=%E!rqʚ^O]dU=K!K*bjsԋO7]vEjt͆Kr%nl}f֛7hF3jY,f|H 7݋tË"_mvg|4.f83% ,+YZnɂ;MJV"zmO2O#v׾'-RӰ*;]cWqU[kJw#^=iLnd<,;Tӽ_ݑF+ݚt(v =̺%'itod놧 Cou$߻_="Vaf!id{JT ݇Vmmq㯏HKz8lqfmltGzyL6pUBVG;O[Ŗ|̱YЫ"_#R寿+82)ۿՎl53Н"o7pmtŖ-˖jޕC|_qN1 ƪ yj>rnfe= H?5u-/Ӳ$מ|Yh8,iLfY.iLnʽ*[lXu̪6 莕`:XuK/D;|UPt#Ud芝/U0RSIUu_z%R|u)tْ4T_InWJMߩnNUsaj!IjK^l~!82ZgYҍw /x+tY 6Bph)fL7}QvhYҍA )n*Eq/vJNqt{_rũ]΋K6*>V%ƪ05ssj:<0^Db3w#o/acUD,vԟMfLw.B߿o@+80VE~cUU+m " ⻯{'lG2zUX]DJ>˝+c1 N ˛ ewh{*n׻vWT,0 NԴvJ7^D3vW_Ѓf/Y@w^Jߕ ^;t*m`Fs[_[،*i*Tf:Yt3Btu[{NlVt4~ة͊nAwx&O7}9tgçгJw!iOcG"{z{IzS/U\j,3ANM5}wX5vŧK>cKgqoi2Nzn>+ Z"o~m=~°{}DkyI3tt[3W2|If}nb[{Y9ܿ4XDG"PVeT}ע~s ,[toJ7Un{HUPWtCrr`vmtKt7M~(^馃CjOOЈy^MfShļ$GdƼDlvg2|s)fç"oM͞~zF fit{Z'|}6LJWך?nwgg (+'xzXtWVȚj1DUQƥ!']q%yMN`g.{>H52d9fݡ>%;aGw?oGvH.Kۙr 1G(r~7LgF7g/qktm2sỬL=s Yb5@ jܐxIҭ>XUR$hez?uBzx)mi?V;?]% U;\y3T@j<فnݱzwفnݱʙA;V9?p3[VlP<C\Ut;Fw m.nJ\ 8z]2KLe+>WDyTfE/P3w$Mߥ1QtseY-UGKyb4P t-2}WvQ9?iwlt?ZaVJ7.mif%j70V%G|z[w>s (eitBM85Nn+5ҕs DW_*9]m!2ݒt\Н(ݒtKV^tcP7c|7 ^ $-^vr]{v-t5KSAۥi/ݟt۬]4n*hWeZtjf{DF*[9M@mQ]wc 3*7t1jIENDB`logisim-2.7.1/doc/de/img-guide/tutorial-shot-all.png0000644000175000017500000001330211541757124022166 0ustar vincentvincentPNG  IHDRlu|#PLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccRIDATxio۸8qmFIui_q*nN$K$E. #tU5SV3V;gUsV;gUsVt?tQ8)ɡ)$4(ЀY~ѽ?F;]a0O@0< xXb 5(L%=>c:]zQ;C>-K5~4EJT򜞨c!#)q͡ ~}n0aE sV;gYssV:gUsV}d+އD'#ug'#hXF:{!{d-݁c59YUjto7nhYtuJ7Md$td뎹,Cl~~FtdMFjw? V-5[DxOHqzGlS&ɚ,g&`[Әݞmwym[¯2hZU|Z>-xcG;{5Sp\[g-\]Kmn%?[ZU!Jmհ-{_"ڻ[6uޖ",wчc"-]?˖5d~R!jimy./ӊҴ@,Z*1'ݐC:磁ۿXVM [vȚg:3>F);;d ݐZU/tܢyb](FҼGOHΊJ9$f6JXwU,ta b9]I!*Xdu_+nEsnd.Pi L^j+_]J#41'Z%]K9Qz @ͷ#gF&]{lE7"r+M'z#T}t%āЉ.V+v>W) A7 \]Qsg݃,Y1XWnOrl|OjEm. ətK.7TE[Zl.IC(,D:]ep0V ^Hf.~'#2ufXugVw!jU ]WoxG m:@ytugҦ:9ԙDv~$Pxs}t,MigD+'2nX/0xr(1Z itE"ʣˋn;gBtݽDo])8}ҵHLy]nmtOm7z^Th U]jNv5341kΫFo1x#fyU-EFQRVETlnFKh3ofEwn'T8;P36c8 Z)A7f<}Ut~bWB]]U-i M֘ԪH.鲵 0Dr!Ѫt3C}e|ir7^h͊.|}(vi+2f:֥-gWR|rfW ZDWqrYb9x+K NmJە/t^hnl_Uݕ16oj_U/.Μ37U xZ:B V*&k 5]ФgqI;nj&M7ȑU"J7U=%sMU^MJ1QχnxKRGAhMDc}wIՋc<xSG ҿpRnkltx y7uĆKϖo$q|mH_Uq*@KlA&iVU[&i;̚yg & q+njA$aº8Xo=]L :>ާ.&יOr͛5"'ibth;<.WwA7=k[=ҞHDbi\t{Qs㥿a}OvgntuXoX?F 6VtJ[׹}\V"C9 Na8]UoR]F_ڮr]ӭK˔:XuRS^oMws=2P~{)pttXf NƋP ݛ=>?]LGsA}&qf?3艤G=tɜSfKj WvTOpp%fHӪ3UOֽϫRغUͩ?]7lNddY>s6s+u.'z2E)7]u|F0|$2t;9rU]͉nrTYt9/-g;FG!}wtrC䚛1XYAϤu\4KBm*DwWN7l+d|~2dXb$E\^QW%ٖ]HOkoO ]'*AlJaTdvMCԪT-2"/]rU1\Yqm19>-\Ŧq՛ѣr#^6~=^5ةIz>Ej200ZA77Z<#ߎ]']x8QQCS(2~IӅ@#!|?`#Gеy8݌nA]ڮS]802@ H^BP )1tOѶ"We{}UPۥK3s*M-/-LwOx]jh𵪳J7@nnJ7{[B._U[DvS@3!vPT&*gnϙ][u݈Uc@[8]0W97nGomOעD9[}kiE蚨J72);膿;Ϙ4gK*] CQ](auHL]9Ftt𖘙3c=ХOl^eپ>!gc/9P 1]Di¥]2'~iVd;rW[+QjM]q!q=[k29nnt>U>\;vMͮ3Z[nmzEvRbz+@)cpztɼM1j0tĎtB$Zz J]R4+AWxs*7LzO ζovyU.,ku!"(kv&KS AUFEU Y2wlԪX!nx6d3HhW5]-Zp]&0VcwB2]2Up{Khq3XЍШdj:sf$K74iۥ*N74-%b;L``Zt̫T7_mFəW%?CX}6+Gx0Q]R8n:_#/;9xyY]Z?cx0jx>=,Kx~'vPT[) ۿͪxnw7|ZF_ JL!aw^z8:{"v ]F"uNAuqw^:Jx5;He Xݒ` gs;t2]MZ)$Uݲq/ZIENDB`logisim-2.7.1/doc/de/img-guide/prop-oscillate-error.png0000644000175000017500000001300111541757124022662 0ustar vincentvincentPNG  IHDRlu|#PLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccRM2l-eH֛mٲMlY]>,ȚPQ̲&LwtLwtLwn9Ԭ;,Z RlkEGIui"" ̊t$wꀰv}yDϐA0~c(WrJe5(O^c:]zQ q'`hC9-'kHיjti9+\:=Q#2BRDiq>f"g-O|2,ߐ'ڪ͗`1%YZ>˖w&/lV)?Vҥx U龼/WGJY&1خ& AC@8:Yma;; b‚/og! )GCDf^ڂSFS_yTt\6'~Q81I^D'$̽< C:bsu82Kme(IVM8}9nخ^)i寇GQCHD3ajAJ-@ID/Ǧdw+ze%V v_]t,mMz̫Anz)t؁t=sZoNpUaÓGtx7yua m{G# J ^PMa#&+#Ao_?a;C׎w[j}^c==9\0H-3/k)(܁w?[R Pa[-n-[|\=^I|خ /naBw֣oYNjKa;kN7*ĐQ!]y0NYknSV;e'M=x#uy(+{<0Pc<%MzWhr {+Bw##-cnb I>x.e^M25XEэ̿,/2ݪUD^1uXNvOGWRSɢ#ZLW^ty*EϿ8lAc1M>'([ͻ(^L"c-p;JH0̚|%H:vQ<5~qbvHzL|9u2g69j0o*]egP;uuz_m_f~V.]h-4snl lUdKm6bL_h)XY-:c*2VѨ晡2]U*<<3#**NYNYKiTU;bcՕ\wgr=zՆ.}% ͍o7N9W-m}lTQSU S^0k_u!9*t[L `t׀.tyx_2Op:.z vuO сsFU;[ҿ2m$t"0.m`"3rE-Qgۭ?SazisUE0/nN|3'\G5g$9ֈR5g8 wSeETT$ZO7fǡhc]M ^zn:Š0ntOm;paoX(ufؖ^2R~|RV[*SF]vt6p_ ] N|r Z 1gա[@a|i|VOEUO~W4ԵnTtߕA-q~8Jq ʛlG nh-#73~W_cS҅$].?o]i_AoTXtrEkSD%tJP:\'Kw tk]QnA\ʯW-Rokw#`tgntFg6ƾ#j5@ѻMt ]tC7s҈WG8[EG7caoDZ#lt4筻xS4moMW hnߌ?)rms@>m|O&}dM:i `_inyq2x} EOtOLycԴ9⡍ljX Bs~ &LTt vOW Yu>g}OO-M׎0 5G(ўb«fJӣkWmY調qQ./tM|\&G۵آnd TnhX[}tS5/ƣkCǫ9o7 >i9;jRgY/R~d ;[Nk^y%e3]C]U`Qz?lrქ[ˆ,H1& +sC#7Z}LA٥,> 507XOO!t$thcAK%|-_ oV=co47Yt3Tnߨ\U-?ŧ}9%z6SI[QJ.7܆뽱Ja-.om3 ;!ldU<\ 8chSXV%7 ތ@p1-Ueqx5;\x9wOy Ш<9r4l2HoD,gDR(#v].CatL-!ҕO:$oxxٴf%#;--ۢlIKzT z薁¬I6橪KCViF"[vA jM)Ĥ[OKOC8)"y*lB2*#r jKWt#nĐ.7M26z93 #=)yT53,+%]D۴Bh`sUun;Yݦ/AtW޶?Mjb*p0"+ۮ_y0Ӎ#zO6߇L׫ln3t}tπ:Yj}m5ќeC52* vUf|[A~UpXIɮuukRu93Prh`eAW%l.6Pqǚ*%Y/$-pt;ů [0ҰlqYZƖǯ+^Js i3.K`k6z?Zl|yq7OD-vkW|g[~C])=ݺ^s={]_>"(6]_"F*7]vHtkz t׭z.GuF>n&R+{Yk]ARAFd:gq1lJے&mED:hЪx )sjmbyo Yl l 0"*=.lKvt044V0sC4sj27=öt-^͖5n5.) Ke!tTj6F5%rPtS;MzkhE%.lH knlKU8UV"tinj+QtsU35tC±FT`@]%\U[u5ڮn40-_Yk*]k y@0ʹLs=R]^G嶠w ;ePbIJrDYʋ TBmO @7V3l0W$Y~U|E8Ŵϧev+J vKxp^D1(Mq4Xg^P7pߧEǽzxg|t| |iA&N邠oߞlW*]WS*]Ń DmW\33WA\WB~wG!܃^J}m3WV9+G  ۩ktH]qlt#Ջ(Yat)k )۷',McqXr ei_Wl9Ӆ24+CQUr9 CC#]PlNeS-吇,-:D!`]p7ç+n߲V>зGRăf%3kL׫B?v(~-W_2ﶓJ, 0Lpmԇv2kn&سpRԦKw [v[w$uUԦ7 ]e[+{]BtSE54b~ݙ\^ژ j]|;~ݙeNrWpzE5ӽܣ3Tv)lKL>[h?/]Ld]2r۵"~CU*i?L5-HdLͥUXƼTn>C0Mmʮ 5LQz?2kIENDB`logisim-2.7.1/doc/de/img-guide/prop-oscillate-before.png0000644000175000017500000001212011541757124022774 0ustar vincentvincentPNG  IHDRlu|#PLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccRIDATxms:q86yj{2sI:4ߧ ާ'!Ě@V(XHwBsҝ?͗XѴbVk4tTI$(W>0K#ڛ!vr]|wqg] X,5L*]~멒Ɂ ]oow%]^3Bمʮ3w"HMKxIZk&^$[Ù*8lx8:\I[+GC宍QV-5iT=_[i%]Oj#;ݗ)++v[lj#0/*0<]),2=Q5H-BiHU9Yi;9]rޮf T6ݲzX]q .4$*[N֢ϗ'}浀rVo>C}vWQ/3nݕEWsh]~u5b|x*97|y]ur.FB_*M+(ʨC]5A+p^ᗋSrU$ƙ0 jztiӛۄhrtYCYHwBs{HAPVsVpmڷ ?߾u]Hw2麖РDztˠK>? ^KRv,W&n{Lu0t:]z]1!|vo*|KŽyۋǫFW5uᥕ֍1>H=?T=ܹɋ0tm[=_bre"N׊w:TedKe\tp &)@ڔ]淒.mtmSJղ^5#*]E j=DfƆFFq] YU{U[̚.#˚n;wDMyY+?F38!e[3vuj{:ᦻhO7,ᗍ!t&tm]fp0p~BsFY:g!9 4&ཀྵPSTܸk龀"ӱ|0UOQqC7 at:.YOѤ6kLJGt5ҵzziՁn]S>m\Iv'g rmGYO_ t>?{*#_Ͽ4mm?6ܡo5-H&)53[ei5mJM ԇثr׫[ 'u'Eڗ'I7mἧ+>jf뒷|k)hNj5Vz7Ba͗4c:U]F a[|VU%M軦Jځ>3fUǿT}etsI3C!]SS4)ثr8# 3sҝՉnJnP誅/W_±R' Y]TB ]J;?~rnP}3qc]{UT7WՃoݰObw'p5Bu{GV n"M8MGP}!3z@Au+.$Jwvf>U̜v+Du}N-UQQU8jf¼VuNu9DtmfLww7!|JA7axF>?ҍ@7utް0QtP%;tMÌUvխL}tK?);o5>K:aPlN%.+/k1rMG5[|'a|:}@L7Zg ௪vWUm1}φ&~d&=t}0"*4@7긴Hn[%rRi)`Y5'XAKO*r}mk(ƪ dD)1^ bat4t 5ߍ ƚ#;Oux*"M3V%"a\tWr=rA v^H]1.W'v U]nXzGQ%Zs_}q/d^O}۩("|W:nK X| ؟D mJ^O+UV.G0tϼ*' MoGX(ft)ZFB#{>כLcnU&K4w;<[/0XU~5XA1馋Dzp^Dx(ןv543VQP7U9'k|toBtA| |iI^邤x"|׌*C{+; EF"3WABWBvwtǣ]A%_/eJ+<}捨kE۹43Frz85=Ͽgn2REAOƒ1ҽGA?.5jJI&aStYy[7{y^?X}Lf>w~vm£jnC [>Ñ߀/*~~X70<>,=m:lU4- Q0hu&uPllewQ(>R+rx_"7z̗Q_mf8q{Mr/@'OeԬG{%1 Ule9St tuZ*0'g5SKsOFE>Dp澿FZ"o*sNtJc*p:OK5< EZ|@O', 4U+=ä[˥z\&ʓߐ|xm8];# @UiB 9U7&zs'cC(߰] %rE}&ܖ!dybK"H qۏvV:3Չ.ޯ$a8A,\ 3Ծssh>¢?:۝0t[)G (ܣ0#VQx:ӾٚoZ}[SBx5Zo'#. \GX!MҭEl}Q_/QQZGhj.#eBx"@~ND=/.|y&ĉBT~q~NO4Sӊp7v*MQ=*~(D#s(2/τ*S-Z>믞BWF1kfj$k?I=["gB(M(>nW Rzq*T7N7{Ӆo W\٧+62mLBlqc/,WhfdF}`d^$&<$cAEQ>&dԥzUljTSp鍊K|֘A +BP|CF uPVٓ(^1Gx+`m.,BLH5 P-ۅg_BpF(4ct@X|Cng^@zPy\we4c9gBBMƅo^ E"kLިEXXlD3n}O\~:# z#)g?k3>Oei׿kBp//3`ud{!Lip`@s#'kx%zw(k)JHh,EXNz^9$[׹Qx҉Ĥ|BQ㧭ui֟ʌ-HuVHaNmd:Gx[s0YF>#WtN@/DWz_eayw*L;u\ablj#ca]{XYca[E]б0k[bfUmM]*?TYtuRv{ӝ# bɋ#$/FH^]"X5ہDXPֺDxoG1#.FH^?/-XiXs6, hj;;%g`G۶Wy%#FqT: 7_$W)~<| ATʜ2;UsSqR.VEi2K_Jʔ5!UC5-c"} Ѯ+I~%<ڱ3r#A!;͘]d<38k>5- W;=}CXTk62\"4SIiF"YiWtuN3ڧ?#iTuN3ۧ#$/FH^!y1Bbɋ#$/FH^!y1Bbɋ#$/FH^!y1Bbɋ#$/FH^!y1Bbɋ#$/FH^!y1Bbɋ#$/FH^!y1Bbɋ#$/FH^ >‚EX܋ށ!y1Bbɋ#$/FH^$Fi R}FؖaaakbMb b6'!Lќ5Q\8` )K%y@iFؚFHg!̸#Z.]QHeǙ\P)*$HM7m3[P[_::]ooӠJ")Oop[ Ƒ/߭rUqiI(^Z1Y ~/?)3#7&8<$*D$E`SiƮ͕3/LqiTKi\*U Np }#dUPRYE_oh|^}x?~NsH2EYI 򛬓8Hjuc:iQ*:uLW]s}!rSGV^[u uuB '@kxGUUҕ*PWÙQ&]ee式%enAΗJ:,lQ_^IjBhNv'e|̇${H!$92\g΍JLY)HRJpW5BbՌHjuCK󉾀ZS#&=uXgŇ GcU>ZR}ad6WC_TfhRB>/`Us{ɎAX`** B"zX_i͇R7d8S-J+ ?mQ_5Kl{C̓<筡65U ҢTO&|_sO:} Bex.CEx.CHDыGPHѫ?!!wN=U"Ny M^{}nݣ8W5eχޣ8=!O Xfg&ZpH,*|SCq?y)y+R\oLE)n ?#X(ጥzmyO, 8/t+=-®Jq/I{yFe]BO`ɝ;1+d]G4&j!:ܯ3nxn;3؅!XX/DTZzS7^oӽola_nhUp]Ȯ!ic. Ȋ 9zzj}Fm᰼{4GVt URZg)!&q]UXU;.* \N Cnx+.6N!Yx!o^^h=¡3ߣ>xa!'Ut##/j 3Z-Yx*cb t; {B4/>P#4H-XԽroO#&v[ D,Yl_Ϳ/f/z%Hؿs`Z|(#C>-o ~ @Ջo7{y/LKoyX*>̌z7XUؿ<7{oSZ.6TGވгkXޤr<is1UH]_,}}ªH+^xF%4 B^YHf'Z/3"QИ(ex Bm2-LF1UcbD*?x3~{nE^8wWe;RYzHec4s?Gh ^?қyFNS/^Hz"B]!zB"Eы!D/B^!zB"Eы!D/B^!zB"Eы!D/B^!zB"Eы!D/B^.¿_9P3XtJIj-`y}L^*?YX{FN?rXA!XQnΐBW e[ڎW˷!up "쯵A6θ_jX;QLmgH]d!,AP|X]cuxRGYvCD =Gt[60;tvEFhoc:!u/ kB:© ö3.j7"Bo`jХΐ:B!u1;X;Ȅ]!u'|;YvV!uߑmgH]_*яMEы!D/B^!z=tM.:5w;4鑺xSh+䫧(#Led7Bʟx(a*MvzyӟTK? j:B0MvzBߛMV} is݈TMQGLC-QSQNO{NN7ѽ?dnTd[~lB/B^!zB"EE8Y kS*YPeVH-_"|/Vˍu&UJ'"5FEPXKxDWmN4JTk*R+Fc8K@!,Uc};#]w'EC}rPYU܊gɅyݝ' +!49|cjWHcDGCG#߼' ფ˙+B?=BR!zB"EыJ hIENDB`logisim-2.7.1/doc/de/img-guide/prefs-intl.png0000644000175000017500000001240211541757124020665 0ustar vincentvincentPNG  IHDRUU&PLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccR=IDATx{s>ǡvigj+c?:>srAAvErǓDHB1bRE! ^0xx&g`"Jc'k*@8Χ3v9dn𒰗+LEη<ګĐh0@8$],uQQʎe3/rQF J։QJAdok1"D#g)K6y[8oǃd##b澂!]7]cL?:Ms'q(X_!NYв l2]dk9P#\/g y yȯ<O_n+d ӜVwg{[]f2ˌZC3M9}Vkn^ K2O'Wn[Qߌv-Ѝvx21"\d8$=+fBDJ0e:m/?Brz}ew?Bh|;UkXEEPkU8i.Bc. ?mS)4:*+}ʣViyѯ=2P9L6Q;連(vHVa}p<p[W8,k!n~&Jy!ƴJ=2P9L6f;zxsWԼ"+?IV #'o(o(d!}lۃ}f@n|r<^-!>OH zNDN o]frP_|:~^H?[8F-D7D|UR{!OǷ<^GF%z4в;_;n+ޚ-,9!_阕O1KdEB&,Cnp'DuV_l#E_]녙(j,B#ޚ/ e[8[UXHj"{ɜUѮk?x~q/D`xl 0D)$-j=u/B!2upʳnaeY;.,zQu|Ez0;Ě"X=R;>#5gQ{fJUT{l/E.\!e%ㅝˉxUNݜ"[rM!3B4G(;G*ɢۈ0tHSFE{"l[d T m!~xt6B?AXBRH"cc3uLِW/C)^(Ut4LP|Ysfl/ؙu[#BXY)"EO).ק[[@G"/B0tE! ^0xE!YJaCcywK/xńE!l=$W%JoÑOle%){}YL`kQV9"|r{ #Cq$OT-!.c͊!Ř$.'s`w@C=GCo;s͊8_(֦2~ 0oD/40~zgcX+fgi2ZYxSNBwޏ} Wyzg 3V3+Qb?}m<7ԝhP5+-Q 5Êqpdwk4&A_ TއKz߰Tj BxȪh g}-٦?TmMD բft0 c &hBؘJx`n 9{S|KڽWu}鍝n'BبEh.5}Ρ3–!a"DxũJW! ^0xBS*@UoIbBf[(sDX4* =( OayiÚc#| 8hw2/=*"Q|!RqY7?!Q&BX~9ϫ4ؕʈNm!urX[hxSX.#: a*Wݛ|Q!JmTg(6(Bۙ F,vcH^ش<&- 2(BBؔք›p-'Y[z]w c"]5l=y-Dœ|10=҈*tT0w1RIf_a`L ¨, Bx#n6!a"/Bx zUqtuИ_+C+_zAeE{^Q1 V}~1ڸ&wt5_]^ڗiE[.[BsG|/l#N{B)Fp hVPܫ77fB Qcj$/vӫ5CA/k5gn2<{h/cY-hE2a H2oKYȵ/̶07# hNF[xuB/9c/).ʠMJH>#U#cYˎ,3]:eXqՃ#_zh/+5ٸ]/Ba"/BϠf= [MjNEH*'Ba"+H#SNg;KNa"heΧJmlƧ0xi=!mWwsGp99o!k&ߘstGᎅ[Bv86ef*vr谷r4BǰRͼM~v2(q t]GKg0&h?}t|b' {IQo'üy $Sd֏1n,h|v.<;noc9a1J6A8_gi4l oF1{CJ83VVƭq/?jc܎Y-=>hnof4\g^,qڸ52_>`o0ccY=qJ5urAb..ƭq']jDHM7w4V*7GrK%yxyHYu7l;}L:6:{+UmPa",Fx !! ^0xE! ^0xED%+H XTށa"/Ba" ^kIXw# 7:nKDD Dk!,!,!M5omeTMkS C' 6I3_%Yi촰&ET6-x9ec)(pq F<=EV2()( ![``Ŭ#73H gidP&~XcBX̶zʏ`@`$4<Ec( $C, c2uZ}NF#O"f+nx+NE)S0!MP6~ZqGʶBh%vn1!Qv2Es}P#HzBc{NF5"DD Dk!,!,!MHa 4+מuO^FA $/Ba"jrkIENDB`logisim-2.7.1/doc/de/img-guide/prefs-exp.png0000644000175000017500000001215211541757124020515 0ustar vincentvincentPNG  IHDRUU&PLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccRIDATxksq <2SĤ81KH(>Zj%_0`.=d0֥%qKl֡KD5%K d/A^G>zTW &a9<7iui}z ;kt,QU]o"B8Zal'J/5mQjmv8Y^>Kj5Q 6uVgMd6≕ lG!z>O5%Wi=G V=^WҶ[A&]5}3NLjgZBif g|0y֕L?6jRy`} vt9̺z_ju|&m)PU` Kiklj"ue9&d2yNV5f8씛J#\WoV{|ocen}:h\U9pI7;:Лm]y1L(g@)͵F6Y l? k=#4lUkaux3W߻[{ ==hVUuA$~}˰V>)7R,! *ҢVv, Do׹k)r!#UZ/Lk,\!p4~ݻʺMtfmemE9^+K$^&/\( A-«{b3k>Gc,^+g_R vnⅬ6|)r^x+Zӭa-6yV6&?N`f=nX^ 7fӅc!4O&37˄7ϔ2 1lSݵ i7|( 5C}H{` 07˔n2x,\['g~+}-7[cĻܢ1Q3۪ &w3]ʙ kVcG،Gj,'x"*wHXnQhG,RS{` p>j>Mc~ KL(Dx$Ȗ?v]L^a1C**UrO)?&@X1'XDNfCm0^yl3QqfZbo=&0VV<['ԙ0?&ªHT_Fz9w@u?g1ޤ_RwDQf18su+{cZb%BʿXH+#I` UOit"/bWgfz@9#6uw(d ̴ru^H-X/aங?nNh+[5Dlw<`nPXX3GauB#Xrwq⁓:{@pvn,{oHmI{9HrxF/J3Rb -ij;Réoî` j1c5>.D^wQLv!_-!L^"v!L^?#-Kv"AxM ‡0yCD,+`ި+Hr@r d/A^!{ B%K d/A^!{ B%K d/A^!{B,ŝvfY׿jŧwR%>]<+WEw;ؗ䭢h,UkpƒWga)Q"K dNqLz["-϶v7uP?jT-&OFDO4ʓF?P M+1hW4|B|un~yߎpb?(Ncd H*9{}|Y~$+E(m?%kK=6\iآ߅uL׮~c`7_mڗ+_NT*.]ZR >#$O5pX/K@ڽ[D. B:@ ( G 0zTU^ u., WGJ'ґ>*OIBRʒL]<6n;ƥqL<,.A . )Ea8vf,{Up]MCL{tTtPb-= ׾dj>8@ V!3FɃaӘ+GMW)_q]#G~L~Po-^4{MckEl*9~,K(ǩ ٜZ}7~A=w^5@? ^թ3R#]]t-=݂:ΌM\e)Xд z!*бXx*V&Z)~:s.XWծ*9sF3RW6Fi[ڙg-B)k>0gk4>zFӃXC: JwG|քwp4'Ec#}l<>\>8!{Gx_^ʼnLA'B =:B1 B"ź3_eښhN-"-wT U[ݱ"7äh8zFYg8U[aVuיEmҫ2Z!mjS&Fo5R({im-R^MG*Ц6i";Lhim`AH'/gqIg"`R\Gu_gÅ&ɨ rE,g$akJkeʈs2E^.R:L5A9pM|;t/ Hߩ+Jxfˈs2Miêk5{gF ,تix )#ب v DӁ'g $ Bi1%6l0&ŊTgs2]NĆq4k5aaezʔil ݚH`)u)]*`6ĴRi8wD5EVK aqe3'k+WQ`B23ԍMHb _,s=LhC'Ei*UeTTrHICeO2NP8o 66t_fC7KK5 )QZ5N, hȐd6K_ekj|2eZEq eZFRVG"#NpB:476c 㚚 . 1+i+}gI7A'm.C\4IT:\y}5|>jz0-? !`Zè13Ukw[7X3 Okw{4X3]A>B>XsMߣ&%K d/A^!{ B%K d/A^!{ B%K d/A^!{ B%K d/A^!{ B%K"y GHz?@!{ B%K d/ܽx S< I6I6Hv&A$A Aؙ:$.R+CyJ L#$wv ejܥYi´z& La#fґ^[!B,ĭzȵj>Pk ffpа PBXoίJ[ ["ĸjmd8 A׬#I( ;Bo,h=&q ]a/2,;E9 [lLq(Y텑 Â3BָzA18zp";T8#5Lvi&q$]@#ÂCwM I6I6Hv&A$A Aؙax mЏ/o}׽X 5I d/A^!{a IENDB`logisim-2.7.1/doc/de/img-guide/opts-toolbar.png0000644000175000017500000002171511541757124021236 0ustar vincentvincentPNG  IHDR[q~PLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccR"IDATx}W*mmu{cj׸j?3B! ̽&!)_Ha"KRE%egKFdKFdWߖ^!PMMx!qͭx/עn3Щ"O=Zh@DmG]_9;s0 /EAM_N&:hlH% G>}QzVbDd7g6d'mHѡC h햍oqVƪIi3rRB y1~8.5koLX EHytKmf Yj=+VW?nZvKUd~ :͎/H!A|쨕28˿ eF" a=!A04[lJm^ߡTBqW#[7B #ܽY+EL'#H& k>0?G)=PݙԷ_*H&  !~ .7vw <5 춇Y8;-sAdG%pIyԢZnx-7—EMKȻ/pTiQaʊF 3?ecj"B6[kk?9W0#'6W;7=3,&g֏8IA(%749͙\^lc f~\6 =f 7ԱE0fPf/7yJ@xm-UCl}'J}ޑ6V. o%BRB~=OZ qa`n[Kq5FF˰b 1PHw*TBEX7/޿ey/04k} | p=B YX!١Be@U_VFA-ޡPI~iL/N 3Jgh'iɇkEUb].oCLNQٳU"B^cjw/WJ2D؝`b+~߼ 1X7kA79w[!3Z6bTV`DM CF4ZVHJįnhW /ݿh <>va{P3+x Vxxf@+n{ B֢o֤hHI9BMAk]\4Br`Aw}#R$- +y%Yc"TlVH TB!"̾3#I2ŒpxfKFh4_FWQRSc$K85_2ILq.r6q6^u|'R Ҏ_|Neg)*#/ߟC,#tTTlgYF訨@5;۳2#QDx!=qP'ǚդj m@uصe7*J‹ߘI_脊nV =`3!$~5[/ {%$+PO BE ) nUq|$T~{ѿ-f L߭f@U]s(j]7АBP!/}~|"to?o^9yEG֌!\aI~%laBۿ?hG$QAAh^*Bebv+/iҖJ!pŽ|u{=Rmhd _q }?W[bJp{x䶄D{~vF\ݣ >`zR$wh>g18P@;kbg3iHeۧ][nHGTXqstBx:gCՊOx.}e QO }wᯇr7W鱮UQU.CEv7x-{$?@g#Oz;C-F1B,N}ٕf#[:VZ'{\2O?m: m#҂HIAGP}+3}~1C2bnF|u-(Oro`Lc- ؄6V{]ϻӃ rzD~;Ru["\= #?͗ozzDF,6@aLwte@4R[ CXa ȰA+l:]"dY?6ҳV4RBCHl3?Gif[z'a&!~a[W{mdzG qRH&MBvȾu8Ӕ~!ݐGҷhAmpSIM넮"0"DAH!O'Vϒٷƙ[TZQ) iȈ V!O 'fA3v̾e8~K{GDx]?ۙmP&PC*+7B ^7䙆G0V(J]ޓMo$qa3̱g蚥1_8@ږ󏝡GFFGQVH6 '@Pc̸NnQg?DyBLeլ 49>BFs5[%xf苰aPB~\d-6]@#p_n7@bGGS:Y2g̵U?10֚8NEEf&iJ X@}(uB? 鵔\[Ta=˜ŏ$JQ؀i W7pSot wS6j<[4EMG>B?EuXo=` `iVhΝ4jEHʜAs{cCk9x Y3/䙰T+jl!EV_=IM-~7%ZvTl.9twwH@ZoQ\zO,_p[(CeoI!ٯP lA/}7+aoI(}K6=x[2>RB8SMi'ܓ̘$=!pf &Idq9_2܀$])ݾ2ika^dH u+&1W &# Z3/N]P A$AIwX]Ed0aКy!\?g$R*^X'mLwPbu2/evU5LFf~mH d|Q$0l` E CC D}3&z!I`Wz/)itkEKBFodD~72|Qe! K*/ś,A3DN{FG8PdFGzOb/1,0š65I)_2U| VҖSN#j:ܶB=w "I ]+_k`F( qgVbo~}h~ S}$ܔ/[Ei\Y_Z.\3G^11؉"$1CB\>~WFj"8r"q9tݣ0mGXgou}!&-r`10ؓ1#DBLLS+KawL§c:*>%q 4Ov#lc_D'#ۧƘ`CZDeW2.F֤% #Rǘ>!0a8SDp,鋰3&ƈC4bb/䐂4"bbf7ط##R i 1F6C. t:O0^u[x)B*_L~FD4 gw,FCpo@s"-$yVήmai ,.d(%Y $HGfN\UI/AGi쬎pRo?od<>~ePQq!=5{[I <[f s%_91TlA.NpE9 *JCxC!jG/:Â5|b aDPQRP]CaM&\`ZAzsaHE )JEmj愰޶֬~Oq:~ `C* EQ[!2PJV[_Xl}!FGt#R(HU#x.A}F *֩bCe1Њ#TDX 5aS(ʆ[Q>?ߏ }G(se*7YƓX,=$#L^2%#L^2%#L^2%#L^" ;S6[`A6j82##a$#a$#a$#a$#ad4`9_{7$4Bu?{_8~u]ȢF>;58[+F#t;!cXr/2jU"b#,zwW0ZzBI!+ et\Y,Vh.Yr:lgsIJ@jW\3{qwW#fV_ѝpf+o`f\YWf[T؆|_r+YbMiireqEY)qe!f|fzjW% )rJs/+-F1YƾP/rEz";H5~hi@H+5j1X-flr Be'V(皭Q|Ev&8#T k@H*Vhֵ%Wn˩VwbAz1 BC9e}yаBB A#чѝ!oܧ`lNx_)՝ ppQ^Dv B0Y*T遯$wW&Gv%U fr*Beygv†4^̆P/gb ˊPh{*} rw6˝ڐ/wJF8p $xWH26d֫M$ԵpAeUzM_dKFdKFdȥfxIENDB`logisim-2.7.1/doc/de/img-guide/opts-simulate.png0000644000175000017500000001277311541757124021423 0ustar vincentvincentPNG  IHDR[q~PLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccR6IDATxr۸Ŕ))Jrjvhv\i;*>_}P5c`dv}v\rb5{ܶ[6—RR& w_3V97!Q6 eoXzmQ׆]:4e9nXj_7ǔɽ^, eB<.b6KZtHF5m]>}vu\5ʾK//_VA'”r꟯4Bf2wK=󵽐}BgF{^h:ىv—˯ 喹xA'UvW^($t)P`uյ%@ٶft|Aޑ y},1¯/b)/t#wc BXt̎A-ꭽz ?U*_`Bڅ;r!b!{!{!{I Y1A˼t ,9?/.:jL>3s~I]EՌ[,@ة~|[!rh@B(LQ) !G&t(y#NNgfm(% ,AQ0>>G/usC*M;-?Q谬tK?V*<$lLsOhm?s~整j:/zwu~{_OGP4&,Bù,R~VfJG:3[ dc6=AѴqQĺ^?]~X{ۭkw#7MQR 0/ ?YVkNPɠBկK(Y3[KF4 ]LPqY4aB Q(c?*:r NVaͩ>mAwP ‡#?5$~wQHj4Y44'#MFR^o (QHa': ڛ"4ufBKPl,v/.Y\ 9YDY߬/кJB3 $g3hӣi{͈Tf׵ [HUؘ{;M%S0x/H/q]噶 t=Etع=b%tw/ܭ1H@8(<79y?'N// ΁]"{dv ]G@] . d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ d/ VeԌ8%NE3J/fZ4JNr4p>ٟ>r}T5?XtCSMB:U?O'Mz9p,jDX=~]ۯ Fqc]"ܚp8ވZ@Q(+ U٨iƍ~VeˢcJEfcB.JtAB"}^f{BTu5fQLQWbUe%8Qcy,;:ѡl~vC:RF(NX\5~x >Fk=T| I2?9Ձ ͠wۈCbႪ3b<;A2f*ZWji8Yo@+]:ckhz\P`/@MpWƭ( -n#${1vd!cH#IUn ${a7/C%wGjaޑFPʻDsgy5S#n!8Z݂}_#u  {!{!{!{!{!{{,p"LC3>8@]@^@^@^@^@^@^@^@^@^@أ7vkd =ۣ[{muuVK)z<;%$@G؅SzB.Aܗ. 6hBX7>߱6tnF4yO4|3X<Ù#9PC!ԩu̱GhTom7NВ"YiXԨY\fl >&L;]Zq0D.t$tx!t)VNi|.ӫjfHzɕP.嫰Μ57ş4IJΛ*_ksiuR\¸ 1#699rjHTUh}[Qܺk-&Z/iA塭E6WME.?aT5?DMvܓ7mru՚ͨ8g6fajm;7]BJEN&E:QWg{>WS1j2{aYϩL-D᪝ܓ7mra&9D_ a,nf'J"r BQDմƤl[`!ҸWa|V^hʛ6d($fQr%ae]`ZQxc g"BRc$:-Q6E6KT޴Kw6t/l4'B_8M(H۹٭퉑`R9ݠfD `/?u([Al~^@^@^#3o         ً GvCc?KmF!AHoBhk5G1pT:`>ԃ<}^Jz*B=̡,_x_HQqϦ%*֟IZ&C=VtżK:0o{v V{ly8{r R/"VI񟵳ItuQؕq^vżu{5ֹ1N°)YCs!hPU*_"8wE ½0/-S]ܧc7н0vSV>AfK3Hh9$0oԅPΜ֑y5p/tOq0L|Vr ZQv]SʺS$N_$=I64:rx?A[{a`ӓT1 sxu_kvE `*gh~CtGȗTC9 wu|SWμMR,xa\W}F:RR,a\W7MŠ y~^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^b+ ;״g,ۦsGOv!-[;0L# o4:0L!\=,enp?0m;5B{lCO!k/ dFt:ҪkDaP7&.üNG<ʴ{EE"Vl]Z Qfb/k),륱Zvl#呝g#:W )\V"2Z#fYadqcUU6kpkz;0Oܛ Cc<<ꠐT] 4?*,NsPalVf^#dJU.ll[t80OۛtT -jrOՔAV®>a!Fp4}-3u^ez MKmR'D]L9o^ش;=]~w+*rY.@*GS+mQزKhZa`/>qosyQ]ݟ?*ޔvaB)acWfvvuhEaQ"_ ۽"{}{TT/ؽO8hvuCSia`,:t'j {GjgwzJ$-B6Բ*b.]ǂں;3hށi'>#ճZ`o$ ʾz]H@x.$ ^o^ ;{u 5^.yRI'u     ~JîIENDB`logisim-2.7.1/doc/de/img-guide/opts-mouse.png0000644000175000017500000001563711541757124020732 0ustar vincentvincentPNG  IHDR[q~PLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccRIDATx}wևG8Yqi՟g'Tr&q2Aŭr2IP1kc"^0z!Wf3PI=ܝ|*RgvsoU_HN(ӳ.%!}ɇ*}V>PTKbd/-OX t+g'}t[}\57&Vn2w@?U4#-;m 6 q$]^nK™E߿:c6{( ;.b2KkTEVHZ(y =`iB51ҪS\֭j_I_^-Wt#ξR^v$mAG}!3e19 vZ*+yTeTP%ӦKW75?^./"tv@F(tV͈tkkMVF_imE|e%T}!2g"˿H5B}yBƙtlkxɴV ܌yAG:)B>m|FqF2IHm ``Ï.:A(3vXȾڳ/v]tEݿp"K! *:([0z!E8CErR"~u}<~"p̈Թz>J-{ p6 i*Cן ash_NK=gy'thZm Z褲tE읜ܞ[^.WW,EXl ͙dzg)dHe咳\rm;>cN@O*wN ^[P+ʬ5!fVHVv/_ b75UF51=nX55p% T}y)T5qLScE?lYAYȒ_ iMa.{{50BEY9-iWٻ_q7*T5D&Bj ?3{fxLYO@)0X mpn IX! s`GOf X̾Tm^5Y]-BMp}^un #KOk KP~\+:O9,B>3LjiϲqXXA;*i2uVHl0%?R1rb p 廜1DQq]" y/c}!oH"E?S)mĊW p2fr ;yۨ"bR>3⌳xʛ]blk'=HWB ƈ2="u" "K="eGEEЩiS{ӑ#ݪ {nh%fr Ƈٙ l-D8H>!)"_+D8Ek}MJ0$¡wЃp`>Ճٌ B ib-8D#יGhJ^!ªE8}@=# Y#{.Dh"WcUIq)`"B Pv>BH}|3|2i߄&}0{F_tJh(]j+Dh7$/Ӂ@9`a~{~MYTTC#'O@H-O\mZ?;i.Y*_dbM6RpNCAYf Ù{**Otʀ'7_':>yNALiK7+}匜VڞGhH /$=ix/!lS{oD:#R6`bEБм#Gjz!"Og"#P2U!ZaB F|ϰ{9BC(?7L>%kA]<#zAVӲ.JA}!!rY܂AvfXb:q !t[naBo#4IIR mۉGmPs B# cŵoҎ`K`]&xO*=wy+Ǎ5B,vA@cX@CZM a!mDJ@1 *q[aN( $5RF:n+G!=#J;{t#FJ<03 *p)w)p( F[O!S{&l_rDPN$/!S+cOda: 4&sUxŜ5yg4lBDX.'?K5WYUx&2l/({"7?/Dt^_Hy4&׭SG/ysC2[!RV<\OExCpwF/1HoHz"^0z!׵|oH\" _iL{}ru=l|W7IgX"|o{~M/Kk҈p=zՌ㯰EI3ʃbL{24)̄GmFh|5Y^i8?Ma,h8?ma eafOϗ ?,?8B]9 . 2Hv\ןGHH2/ "Wkc?9=:AUNy!GŰeˌ3X>l]"/a!EM$Ȇ:[J '6FP,yx$%/\'URGۃab},=!"'2y|pPXEnE$NkvF([.چnF: \svUlltZ<ӕa_,.-"4Nau=+UU $62T0Ċٳ-t. "궛~8cXa]_Hv-RSPe.10Уg)#,CIA9/<;0Bсe&[$=Z#R:MІMbF]Bͦč͊#RQ&9oDZqf#s|_i];M!+jWUf_ BK[ƪ93ݳ}UrEd~ˬX0iBO[!._x[[kd9+OXL?!b{ɩWxvB ־&#c"~ٻ7ب7}a_|WiZ(wo}ﭣGmFh>ƼrZ/K Q,+t.#B-n'z${ٟ E_XIu_!K|EgGԳ|U VFeH+ xsPuDhZ@-O}^{[O9|6] k_Q(2-V9*-a[>׾6nZ'kF]Cxm܅\ /ڐֺ]H\%WֹnOD(~L^{׸kT{-ե!A1y."뵯sfO宕]Wr!zi "HܯOK\!׀_P6 i)D5$BN%ٱd?F\_87f_AqFA2g=g-pZx<=4wҜdQ-c׋ϙ^4,"'qdޓx F J͊IV]'' e#D\- Tc9B;^M<(t3b!+=ln|0 ύ~˫KWStZ< D.t3 +9 FhDfW_87RrzVh]+D.L+;HDn3:AQW+2 zAAXF_;SD5 ܙ hx59"PB#2y 疕Z/ˑ]«2^f<!)dYVv4B;;U#Rh}Vs_=# 5 -_"\n= ^./[OB˭'!BonC[nrҎaj(>O0z!"^0z?C<IENDB`logisim-2.7.1/doc/de/img-guide/opts-canvas.png0000644000175000017500000001463411541757124021051 0ustar vincentvincentPNG  IHDR[q~PLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccRIDATx]ks)Hn/;&ŝ)&3!)~-6AwgwzY-ֱz6cF;` )$0ˤ}*qvXӖ_竦QX_2;:ǥ_U7uηL8w VPPX8i)J{yf mjjj=n,|? ־_Yu~DJ%+nIaɱPVHXDi<vmjB1d.0#K_Ue)̷Wf,D䐾/<8ӭ\ [asxFjvW!l{)Sk7FZC& Sߜ{_{%( NgNQ[xWS <@?NQ ׮´@B110QSHL!y  hg-8D?:b]GL?*ڑE,,lܦޔEp FCKRxbaץ?rSxHKV8F^iYax-d~X"pd$g-e!aA[pn͢xĠp(,+=o|"E(xk))Lǀ\ S'╧0Fs?RHg^r/yX .љjZUY|2  l2'pm E5ʒz!+0ҼA *߾'Rxs+/C_i@KnlWB.U{ﳠ?VW XPh{Z? >u_[X8*㻭*{ť x.]g4͎=u«g>${U.{ފ櫩Q0> zCï\+X D6u7FW͊Z;^U&HHnZY E=D*^Bmwŀ,s:҈<ܱpc α>q=| 㭺y}x&ݭ6XI{hۯ:اP#iOa /(Y@q cy@Hߤ%)Խ_݀&֡^kv!'K|H|wSiO]7,6x}fۗ<\ ÌSL ;:xLnH{ꙓEB|uwvmu 5)gB+dca·⯥ɡk.Po⏅*ծBB Bów5 GB| By@Q ޛF)CZz3RuJYŒԦҳ7"A$83×Q VXR}(Ѫ!̍{X;3F^0HhՋѪ-)U/ZS8F^0pVhao}f1& Y!c,,B` Ƀ)$Nc Bw~䩱GQP9*$ҞjL(P6ze '!*_?kp셿k68k;^Vv(A ҇vA!=RԂ+ 5!N'Q0BbcEQG' S8 [I3(ogt?|/NL>ƬpTڳc@:[%0lFIJLCd\/NL(z__FqfT}6N0#5xFZO~=/+KY`ɑ|F.?" }`ˉgmq&tO<#UcOړg (=g'e K  o !o )d4Ok8 $w_rl\S )$<zJ;7),ʟv@bHW]& .RQ[zFqby0SHL!y0ǻo@~v[(d߅^ VUxMe ?_4S8]ȟLZ@I68jiDMFN:7VIkɽ\Ţ^ȥg; g({RKywQ :vX Y%Uy\bw)r(VIIɡJj O X;B@,dTad mZZ4aG(|БC)FwbI+:[`ԩSSHL!y0SHnP[D u|=!N" 21F^dW=0A^Y@dKfUj*E$XU=?b=l VkqG'eTA2HK8 (3qePгi^O>ْX D5'ˠ Gc/\RVh5Jp<ŒodePe?ca769b'Q ʥeP0P (b tP2:)4#eTA'ó jƓ?G!ˠc3ePCMSHL!y0SH﹵OxXyY$\U<`KݴI{*RS( "L^X@ϋYa ?E v )D'V /y1Ea<\8 ,a6T"*'bcэL+t71VO 2Id7~2$D **yERxJ`bD_v{rbݟ@ʐ3κ;ڟɘ WE,PJ*؏4¬fMSճӋ܃0eHn~FdLc! h%ODuZAtIz߉nC\z V1kQQRX]+XabёLKY$X=`?RWB8={AedLdUT^E+Tz,D dZ+3NN5`W`=2$69: <"c2(OE5PsoF,bYMDG2 eLbݟX4:F_`&` Ƀ)$0CmǢL՗)7SƜ)L)$<>#y[L!yPHG7\ `ލ?rϟ)!a!,HaG_6}:SօEnYHb6f5H7bK~8SCZ2X#l( Eiji >C5 naGD4A#ղ@@[5m#" ‹ umS^V`Y FPHi,4A!u' /lݠ O 4Og'X_ܒv(bB| t|:¶=ŌP(WyeގI1P9ɐB()T՛MS) ц+gN{V퐌o;Z;mAuAmllh:8 IfgCWLm{< PA/gףbӐa$)D~ZA':;urW;Ux[P8.t>8ImfeʸnP. bf3=u_"h&OPacM8"vl""o]f;VhKcp3Rqy$yugI2enOP ~?4;ҥ CS;j0h-muNzhF6#%FۈIb[}>)+ WJF¹]6Dڝ:qD{1ʆ Yab3Ҙ^NAʔX3* eGJ v,ԣ; -J )7#Mnh 7;Ւdg,2e\7cеBIqV윌<+c?ʡ{ȌTQ\Kw:BV8̆slUdFjeʨnHwO [ᔑдfۈmh:fLai64eSnGP<ʯ#BlJ/ FOШi33k cXg#I0bә5cs~QhuV]樗>(Q}-͕`CH,u6 G \'_mHػfv(yU[}Qk'9% (ti _;{Q2KB! Ssݱn75)i E):S UPF ]C% ?(HqW5Rx`w[9Pyշ?X#˜B3#)؞ZH׉*H!tdXH3p)Q0S8.$ f Ƀ)$rQ\EDȁ)$Uˣs_#\?N\)wWnlG̍L! $x9rL׎S~O愕0hǸj׋ 9s~ݼ!>%9O7nJɅ:']gJ9Ç^YjSG{1\7dN!u/d愪w98_ r^])Ȓox:ڪ b.sZRrө]'Cao9_W0ةiR/pב|2sWɍ>mBbngiܣ 19ZU ot3Dɹn梘Qvj@yrx% \7DMl?"{y﷪buV\9f9 #N2GgB%`Tr F%`Xr(5q WfyQ%_pω]}mz`rUanr K&x3֫HIՏ~r!'6gWjY|}@9ˑhBT\b&hAeFѣ~|# ߙFQ9VC{aBw "R3 Nt 9phs&9H*7A)ds= uAJNÈI٤+l\ ny-_#xmPl}hi|!mkMPة k9F Z @3TU{ip9He C@Aǹ˛OO3腂:pgv|r̫>i$NP7!dXk?ǓCs.yk09ҕUmJtNr$fsM"6nŶӚlvJLtŎ)vztcR:3FRrԻZ5,Ȣ7Nݫ"2uZr.s0*9D f23S0NBN<CCeݟWgHO衽rU9oHr >FRnXF}JM-,#~ԢөZ4Sje7#2;k+0QrL$uomT }:yOOn/4r4m r{9ehmЍfIu~@:Mvz9>RQ?Ց$t8L  2u~hb)mdIZG#<8U]iֈ{}b#EI&EwLH|R:BN|q9^iI#UY[$ږlQVpA~jahr\kx 9'-;ŏ6e>u(/ZL&,QpLwik#te"S3f^O?Ƨ'<4)I#eCVkduy2BBZ`5zV0*9S0FGG$Q1Zr*9`~r| ј-i4 VrV)hlLD ܄ve@ә8TG6Hez:|.΍rĢk`*%cg*^֤.!:BѩŃm55>b!rңFGyQ~1&xOVSiGdX f%k4vks0\4PmtOcrs*ՂӤɷjEؔl)yN6'Gٌ' D{WkA d/9! ZǘF 9LZup9bh2CX; ڬ} ʸAgCKȉ!Z5L.'% KnN|m?R{־')PP F%`Tr F%`Tr F%`DZDlGavgP839J'}sȾLlXۄM,>Sڑ- hv#pdkEζaEdK 1vx3pf\9iS+^HOԋ5 :iwsÚ4 O g{3gdؼ5ϜnvҖp_h_WA=9 g_͠{wvGN^zZ9ah3onq໚;9 ݭ2zwsE^[dm#گ[V Bȑ|X}׎')mS-~ni9gyݠIt9q96w 9A]k*0gH,VEtU"efoP@ ;GHT꺮UPA^+kX HCek8@׆eH@Q!X[G!܁')P;%(jjEeqyyqfX[|Z]o`i:;w}[bu ϧBNyA"pjv{fMsaұxlPq+ްd%*%d*%pS"RhcapB7oW%#';V߿y?"d"1"xjB : yt,o`۸ej倲Tʗ}`졓 A!pJj$0w)+^!ҔP@b~'t(z<5\L ¤cɱ:Lc/)Wr)NU2}-KTQ VgnLrQ< N?08)}<eH]EJK˱L (j.r(8=jw eV@VRk㩔KBPQ?m P)2eYP6]=$_cC78١4P.h1jI+S.%@u8^Ö9:#ERcoqu[f8P8 uDQφph/PHY}i +R3e=Fŏ]/T eB^fS?D͔P/9cSV⛔-mWYB_[5|a$=C菉PkxerK2D6y|eŢ賀ߴj;X0>_"؅>X"ؔ+mjǒbW-5OQ)״Dw7id(Rʐ >*ɨXU M9(ʔOA)G@ f kªf,kȔO@)(S>eʧLt,WߗfݣiBV~L R,zh\ŃMLx?zHQhˉ$] 頌7p=C]vꔧbxך2>yiMdх24۳{? ܘj9Q۟z|}oRVteʧ e h7׳ϔPr+Ny;e+9.e\xQɋY%msjpnJX݃?`p>ok˔.jp zQ3'eZ%UJD*Q0 Ό9(:墍2XP>؃ Y/3f2*LDYi#_0+%+Q(P=n+F&g4OI e G1eBS2RRcI6hMR%&Q66 c|1mre6glh 眲0;$T씡S07*ʣ"Bvʵ>6̞Ϥz#-2))yZQnMvࠋ>*ySQ$g2SPw 3uOA)(As "~+⛪Zza2ZHdU-p Dy#--ca&Ly@Fo;ar@<ϔ;X )S /z-Uy)w0KC$P<ׯ͋aЮ [)X/_n^$(o뀿~~%ŋ;*S ca56, ˔_!%`oss2,u_#߈UT=yS)wCM7^a |z_rgIc|_bŗC 3} Nw~yYG4v|5m6_ne)QGPIP[2 |?`u_~8p&䬔]vkz0ǖu(0@/ma1w BFgT 1(԰ n~|w`]<+S_3"*e,K e15h$=zsL_^)KSD(}YgǸ_\[:C$_UɊ(QvJmWE W[L Ǘ/YeyFGp>cv_2erLİsEr"9SsE/GO0gb6KOR{`&|)WN#(c=ؗ6M}U[3{g/G/okאָ2.)ˋPd d6zݸrarS_2ta,e*sE}ˬS~vVGNr}bh"lu5L9)Y== cvA;߉Mte|>ȿ2݊kXZ}Ǿ(/j3cq6%|})w+by?6 tNF2%j,e}Ve%m١ӧqTz_Nq:bNrUӡP ᥜ@9>ߛ^ wgLrEA-f;wU{#dXV,qE ͔gw+,wr fyi)Wtʍ#^4F ]Ce|<,Ow> , #QΙrZonC12p(TPnSPnIl& 0hMjSDhhY:^z}o_)OZ/t|:&R&!>i,+KP>+cR&ϒO 3UܻWu(q)Wir/\(Q|22s\U@*2/{x(>tUn'@0 ҁrcHt_~o/d}jV84)5SV(@Y[LC0wz&%ZjR%JY>ey_^ILDYsd#rr8;sESW,˼y_ cy_4F_6ӫ `j<"#A5I|K![)r1K9R`MP QwtU]}_ڂum4kG|BJ/T=XfQ㶼z1#SGqLkF9RƟBxY>e)iC<}Ϯ~C_Kky~oU zQw8;a}92IQ(k$FyYқ.re C; MY^ m #ޗ.ǧ#lָ}BOٍ<%XR2Yy_nSe6v\}|;~he {{E b(GA1YK-bJy-fml/ReOE@I`dQv|&բ1vL  9**2lwz8fl1K@3X9;@sD3(Nni>6)gWQf{%_Fќϥ/ga'w5w}/%M1痧iNOd_o֥ux ɗY|n:'DZXS<>>9O*S S<1%HII:'}lϤGV e0%?}9LA&Nyhtea221CWS& S:Yk30ƉMȔ5D*$38JdJI)qM)ϲBdd2f_Y}ih.r2*~4^|EV3BeT_ \o^>; 9ǒ2 K>a?&oYaڻQf2)+56%Vu'5q e._^9t5_Vo ›82/稔mͲL_ZȮ7{Lʒ!?[3ʫ3ؑdž;߁>|Y2v؞)P&oK.X_rvY2L2eGDtqTSFZȉgʭr*eg iEn=)˃PI>#e>vzىg-yLy@G8I-ʯ˛F*߆W|ȓDޫ@)[YOjrl1exu֗f s4쀖J+Kz"k,*"Y̚0ݙɤ[IENDB`logisim-2.7.1/doc/de/img-guide/img_guide_frame/tutorial-shot-wire1.png0000644000175000017500000001432011541757124025551 0ustar vincentvincentPNG  IHDRPLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccR IDATx흋r(q(ۦnlMlc׭$ӭ d!->R5Ua3.sbUdMW%\fIJ[P>dɎAUnZA8XpT@b=--C_v>K՜n'X(4Ğ{,C `/eE-0ZHD,n{ KuG޿+ ,-]>Su|(^+TwQ\iޯHD_G}<)ڃ){ĀYӜip,l,]J||(Y@ f@^Y\(s)U0XP eɈ!HU/_OY;~<9\Lv[ 62HRj ^I}T~%<`:m)nӪ`z>I]UUG7 |쨽5ĠUvKpR M$4?2d&Cn2*VMaCS:2sP|QF/PȚ%<˚23P|ʔA9(S>"լ{4CȊuSB(&"׬LA=寥ܢ]7m9DQ3N1gwa*cNyJz)í=VD](x=ܜݟca?X ekP%XtJo 7EiUdy<*y g aq-#m>o˭4 x5>TBʍݪ٬a?̻ګҚVSiWl-6sTf,KET :9Tp( պ[|y!Gȡʢ!V5c/n, ҲT\aQf_{ƚ6o<Mȣ9ғ LJ NzcoJtG>]H\nf{yu%/ŗaŲW-̻aRZ^ R'k(D4,jiygw-eCD;Xk`-//ji 3|6#`Ĵܗ|GJ2ɣe]Ym2>aZUJeQS]i vg6,;5$KK `%HhBYcIIf9j|2nQ |/l2PfDXDZsRM&H#,gr2sP|ʔA5嫬Q,J9krl9GơLDoVrIYѕ)4Uz3o6of)'&C)W2fnȾWs Ԝ]˸࣒eBy57o :9]QRzHGY¬|>5) ]4T`-.#+F( 3g"O"fKXc7NWGD@V2x;3Mzf<062bCh5ep1Qa"R)Y*yXY?D+W5@jzYm#jʗ:g4$؍ G1eBSRc &hMZ&&P6 cR|1mr6̞z<|#-Ҏ))[Qtvࠫ>*ySQ$g2sPw3uA9(?As"~*ꓬZja2ZDDU-p+Dy#--ma&Ly@F?ar@̔;I[ʔ֗r3.ʪȔH[5kC&P~?͋aЮ [)K[/_^TS w~)ޏŋ;'*S ma56\C)o!%`|~ƒ ˽j}]jȒ/ߓwDsY,@'7TcgǾj:/y |z_rg\Ic6|_~/ҎiU\e!G/&|N9PQ# TS[2yw/h_8drF.5SD[ c:LK7:M+,iWPb-JgU bk:oD4ª 25ԓ\]5ސ0Ld(c?ZQ77od%8<詽|r?SeFF~Z{$9e1Ŋbi (;BQ!Cʶ'WS_g4+~E2uP_)swx oA7ŕX ;=z_bā1GT%qbgB(9J@4hbV?dWnr^6d9bP /tOejEjr eЗݰS B@A,PF8(]QNn!/ߋ/zvp"c6k|sފk) 1Aw^(ӭEw쫍Sc&p,ƾe:$v;eʱ*5Hv5y_Oe1ZW[MƗ[]QSrr*/'N81O*PvdՉ(wED(Gx(1PNdkG9Yӡ%b(~fDФ(GF8 sgd K ױ/W4O|l<P?[z 4Bl F8%9r[~!Ct}Y#0>_<9Ήa1ǜ+D"HOAc_SY y$ƎVi mWd<"#A5v I%ƭ9%}R`MP Qnvtu%άR (Sl r(;iuA+o gLuL)h) MF9<>tcDm-./U3cܔz_? "v>q%͔y\M[/)#FHpB[+s$Ȕ o<9RH_/ \(/ΆrLr}F")|Y>NG2S}lJ[ӾٗEp8vq2`6G:}יbFU#<ޗ|a*PFrTi/L/;il,2L{xJ2)wOrbcjsAΝr"=2'eȎf}?Jɽ)to jwOvʽ)<(_^oȼ-tcNnNFej4iʸ]\<5Q4kSvCي˼6A,e=< ד?4( tf<,@˨%.0euXsWnH J@hMsL;JGʎ8-RK7d֑[Ic+fY)c'N3d%d9oxΦ)QfoPΘ&S~3eP(waӒ!3mdWbF2u@_Nd)j.ksJr+A} MYtb}0W'Nwd|}lJIwܦFDմ(X/cƚ#aꨤ)KnE)e]'!mr0Tga ˊn!So?Oy9+g4`]ԝr:ƴ@yD5DG:L2^L%B<(9P'i}: CpT|7%eukjf HV$B)YCb"/ 9"S^co}R|Y,A95uǣ"t}6_e!Z)SD=Ɖ*d]n,%D22 7ohBc/G. ͢n23(+rJrpG=R$LǑƸB &hIG\/I;)mL9LA&FyhʔädJ:SvQNl:@Ee*M̔(=ʂ)r$e 뚺 Reȶ`iG0r4͚LCSfuٗ{)m/њnϪ?IXdhn5#+Q@廿ghpkrnO%e}h7~Jʟtp^;e׽SjleRK'Or@ʨ]^Z9,_ث֕7e)q enR2~)+2"p1) hjlbElϔ[(.hbGJX~}`4=SnL(ߡU| `eYeʎ+<˧uTSFZϔ[)W,Ue݊.{RvmLe}lG}(/)P3Q/ʯQpJZO7e)rUAsӑ'e92VSxBLԒ*MbR/\h-VמDXT!D ^5Uadz IENDB`logisim-2.7.1/doc/de/img-guide/img_guide_frame/tutorial-shot-text.png0000644000175000017500000001534711541757124025520 0ustar vincentvincentPNG  IHDRPLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccR"IDATx s(q.NvϼnlM<]n?_ْM t LU_ONSSƙPi骢xrIP(?=?R TZյ"0:{ѲrTB^G[1TۆCKTuR"Vـ?|rBlBWG]oInx7c~_KaPܢoO7mXx<i;rf|%[se<<0M9%ߢkd2Z/UO3N7nAV8Q_6`T.ǎ8(嚶 G!$t2S,:}tt'颮iZı)D9P>$ES 3P|*A9P>lEXZ,k?UI,vhB#ͫg|'>2V;ӡqzEQ+oAe\sSf[nFL](tUs?i)7eֲ'.=ǫܵQD^,*Ŀ:{,V$kͰg |YWkiڊ"^lWܙQK{&ZIxkY5M/dqі ~LmY&yה V0\|A6YQE-WweQ U=%;ODZPUPVCǕ&@d۳]%32e6>{qr9YaY_T{,_SZqN9_oUK+UM-LBY =je5 3VeОrhd5ny'v( ;% Ac{myq:33 U˨؞u[VYӀP-Êʕt,U{Ƌ6[V`^c\e lˢ-NV r>Ք۫a\&yvLӯrYM :Vd2h(Q+32c$zߠF)h_xpScok/eY@Vu.25Vdh>vFRqQFJ(J9P> Mt%)S\t pC9(r\x3廻*eW|rPtz T??M|261۔7O{|)&O=|Tlb(/./7ɹ/RQʕ?2?l`rS+R/ h'./+II\!f+c׻N=ѳ2h3rJQF8;(_m6 2eBBΚ21f)mʴ1)ec4l`6ZtOA^Nv?xO8c|2f$rdPffL?q, 3lx]^fJNDf*LoLbsGeԎeo۔%}?e.!k\f|r2*!{20O((#_B9_G}-pd){(+ZKE˕ T~ČkMdUY*("Z~ʵ964{Rp9WE'߭6zw>*ESFUʝAx sP;OsP|*OМ8c?w}ƔAk4bٍ(=#הB%([[0#hNǃUPN(_UWr'9` RL+vQP"gcj7jv2f5+lL`7Riӿ0C{F[Gd{=Yhx$[lLcS2^!cƾ[+Owl]f_>}N+V()`}5de^y^5W<\I@zfvk2_ݖ]+;;0f/l9﫾i;i4~_ueشf]F ƖeY~Ew_xޓʉ9»Q2|9'f^+Crzd\(gTf_b=N0["{o6BoA}VlȔc-^Q,e9e<}e)Smګ[?sl9.K8V)휠]/+[V Ib+oņE9vm8nk_zYcr_Y%L5/BxQ>ww|`l0Ieu6S̾8yt<|߂>A:qn` 3<(tdkGy^C9KTxdIQΖ2ќp"*sUlV&wp>$an<9z|sr,1nO<uYʴrҶ&)7(04v-GXĜ^R.ǡv %2g"PNWmFvg﹉j7mJ*4p-l UvV'3)og/ )hC Z r/ =?l7'@~ݺ_BbqHʋCb0ø C‡%#Bظv Pa)cv7G9Wd)('>CN2(X[Feԛئ˸| (9ODPe\;(&J_RƌP KP[m"`5S6q_jlR);ݓQ[Dy)ɆO9+w=P\?(88(c+b%h"־T}msg LVKe9$.iVM.e0n+@Zr'hZr}.Y]/:_(+rV>e)icJu[:ݗ)/Wż\ٲS^r#72;kPȂSfFLI: etR0 j2}mP"o>BxsKv틳ܵZE˓Yڸk_7կr%J6zcwh:.멉 c{(#qZvL8|P\FZ(AJO(ciذUS- 1/;ig,r/c2\´{.k|m3IcR!~1Pf 2.C܉-J3Vl<ٗ.Wr(:}\djc\0ǮSq/ΓOyx:?ʹwMpzI>OcPs2:HMĵrLkg(vo,ع$)gwWe㫷Lh](\d^M*8:FrGTPTp|T2 (EESӷiR_d:6eyQWlG!HazO/oɏ<.3ep_(g2moJrzol>}C?g!qPrQ&X"`7 !))J.̖]N-;Ủ<9sΣt5[6/u4e#s"e笔mfrq]AE=6 X-"s ekM_Q *er9^(P-*6I8^?.)_UP"b-V"2uj^(Rd+ŖOȖw+ʸI9t\> e!ߕTcRcY%YDn['+HU_@/S QբxUcuahV2S%RӍ%@)֏ǚGԀnFG`8#@EYh- ­6(/V5'[ _~;_ hЇ8Qxq"N9LM6(e#Ո#4ʗ}&wi!#AjF$70 ;p7dhOŎkY ]cY8Xjj]aD0Z)*%)׺5`P;5jZ1-EHgY<$70ZD-.I;^s+r@PZKS:#,wxxE80BukkJ^ĭcOrrP)Ē'$k!(׸5A*兤ǫx4bCy@{ .Ȉ,GɔI_љ(ٰY)/ÖQGj'']F;9pSjnK fB(ٗZʡ)vEʆ̶',򿟛 lc ]I}\7vʧBt(ʫ/˱c"kS)bɈ&(W:>4hZmO[)^km%LR@0\Oq+Z9K *Sx皝29ӏх2Nǻ_Hٛk:I3FT'cyQP<jgLc"I#T8Þ2qk0-Q[V:9,w&^٬QT6ܚUY&)YW|_~/W67Te^gl<lU ׵#4pC&+'ZC jEBkLI~巹UJ2!dvY`.iyɯY+e4>{vr>Y!Y/~l]xn9lZeb j*x25eYFLo{6mYd}~]LZlYHxl)H^v L[,*OAʮmZ&fP< 5)OeG 7FXlh9tRe/j>oT(M]sFs[Fܑ)|>4U.$ڊɊSou3.p\uꔟoma#V2x3I)܃-(Ș ; 88Ka`wY0,Ȇ-0q>oLw4ʷLϷf+@{z`P>3`9Q&f?4Iي1SRFS).R'P`f2l1Lmeh<7By2eEG ׁcyid~P׀ K2؂2ׂ90+Qq%ݔ[60*RU)7aNbsw]V8[d]qSS/zX>)ESM*wGEp *OAŻT/;ژʌ6r`zYgrYSR3KQ Y,kc*|x'|[K@?Q|p-ݏ+ XENP kc=6,!_Z$-OkO^;.j}]n%d͖7Z\jL~'VPNSJ6L^5PBvJzbv0_ݖm+;ifPKE&28 WB@|}h-Gk&;7[6faФ !w*w42(0-Ou: erN̴b D"ȈPΨ̾"Ŗ3ϧ{0[BnKgL9z9$b) (3־F̟Ynbo˛3OA7*6f]f_cdQƟYok , x9eɓlcŎF9}Mm˼&.?[}cNr}rؑǦ[]+)Kžn$ϱAp˽[lzYزSf[y+6.ʱk_mo8w[${̔XzA~_YRZ(kO02o[-k&l} z;9y, N41rǷrP"gN'@_4 t<#c=ٚѫtsPΒ0s?^tTL4n+ gd*6g+E;80)TV8VTP.x;m)G;N;C־Sx)T8e/R -[g1gy˱Hd)l̚p.zq2)3|=vܦBݒQRֳ%TZsd^h豭b%Sւ,.>eʡkZ.@Q^}YMYy(;W4Q~4T4xϽ Ya;fdG%׋4/[tئSVRl[Y:EW0}_|e:mU3C#{LePV5m[!|eflDb̉S^F?W>mnf$)"S-rKOo]mzdA B(#FJݿ̮A e?eu0)?-d]jjBNțO))rϖqYAY}q2VˢV ~Kp,W :c)SQVQ(sS}ZNw̱i9^W[kSV2 B0Qp2z{=Pe7!Va 5(k+;vƄ׾5]e e0{.<m}XmoQ+By){ᯗIRHRSzaLW(r+)7ײ+Bw(pbh+Ѝ('}OaM+I%SK,p @9kzIʎ*[mqPJTo9JlB-*mф)?;WwvP mml KoC% B\qv\~_$ nƻ&te.B9lz{/S,9Z(?% Yg,d"7qO~_O QBTRC i5YJk ]6ST(5`w{xؐ6`n./n+1)4Ȗ+aQoA9Ƕr6/c)Ǹs|[e6/Kw%{>ٸLc(7ܔv ={erHo>ۥ lyoR&o̬amw!}Ө`IneDa)R:z(|a|MZ铱xw'1C#dse9wK3ާ?{Rm= Qi̐my oe!1Vf_ÏTQ60Q89z$.b-셄.@ee=m-k^75w4m@L}!h1vk30uԨ)k5ݓjΈxI#s]㦬y oE9I-QGB#Offp@~O3T5ǙW+9 &"}y 淦vA9O9kgjA/9{{?LWL$\ k_ sH=#Ӌֹl8KƂ U~tCmϺB)sŰW@(JO0%{le`PN c@J7G.,m Œ)OٌRrFO͆"l{xQґWw`F 择`-e|=u2e9VWqꗲ=r2ac1Y @QO/1.7k@z}="0f/5қO,.duq=K~Y)\^])p١<+4Z4ApF\LsqS^f_oؘ9yƚzI.O]}! p]g;C=`04 MDy=/d]d)Vz/7o}j.2qCWwfqys|.2/u yuo@]c.2q^ǦCt|su}eZN)8+=(+UDjFNZNw+FHyV""Dr6͚LCSuŖ{P)߽¯dU {_nί0GW(e_(gmLic' ˇ2 ˾QI(M0[Fv;e6Z|Ăq3'R 9zMװeތ>b]DS2'RFrxJY6jV(K1٧RKM*ZBru2R6(`aJE.i t!vW2 'e"v5,)CbˇwUPN-ʭa=+e g#e݊2.GR互*s@sQ?Pn,2ʓP__ԜZ#W4e-2߆נ|p_(F] cx¨R*KR/-\x//#KuѱyCׇIENDB`logisim-2.7.1/doc/de/img-guide/img_guide_frame/tutorial-shot-labeled.png0000644000175000017500000002334311541757124026117 0ustar vincentvincentPNG  IHDRgAMA wPLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccR pHYs  Nj$IDATx흉z8a9{!NItNnϷ~TU@ ,f ZLx)%(sbRYM>"9bw)kWB^(nSAGqReA]lcB>ga2-GڟaՀ[= ,> G߇Qm{~v/C=QI'l Y7.7!?ͬgv7ea)ڜH/RFز=#]RV sN9xբfMmM-LPWHY=!2(geۈ*|x06??q-@/9?w_n2g3O{fAe  J~̍ynLQIK0(}Fskqs#" tA⚓\p|[p(VPfr.y==3ݠ,6ߗ2M-=7|xMIp Ztii~>f4<j[ΔS-E`i4銲ܦrkEӈd/Ʒh ^\eZdub+{S-=&{CKQ)WOwiBrAP4uE%Q(9_A.|+ecNXk/ ʞӧU(9_AQ&IR~7SJDT,KmrZCEl OD-+(V|qI,1L ʤFD܎X]ת{5%5IT^Z? >)l7PTtf۪}re?W.y}H6]'Y){\s]7CC>K[Ӂ6S=սa٫Z+u6:99gC8W|@F'mNY۠~H^%2ʖ? 582uݞ\ݟרZ I95LH7SB VoK6Si-P-y3N\8o_Ѩ mW&MÌA:f:y*MBWle߁ciU_?U{nԦ~e^y^myzHkĹH--xe%dk\/ 2!`y:_fj_6ز&>x*0|nj Ȃy=謨~[lPwd۽?zY 6z)E^`e& ^J Mȩ|)?DAW_(}W^g*N.   ^_Ѿh.{Er5ge74[!BH =K(`Bltn1lKvȷ2eC6زrÌ(:uOQhdדBܑ-JXB5'lL H<0c"y`E(_^5kJ͔eṞl*d6岎zdzn˪1`lWPW-(ӀVR|-\8U-/3j{mnp^d*^藩z[PˢǨrس20Y1[TRVisŀ0Pzm/DbH8_؍=m%t+(2FrXȶ\&ˊ0j:junCYˢ$Uk أD{UͩvoC$p)5A$Q?>dõ`$E)ޤmQgk>/-E6y*S8 Q gt`_qR*z~y~?*>*e5zƏ<_ks@#2^XJ凳&;9ؿORH>$Mk$Gv}hZi-,ܳW'A)(sWyqhT\;ƴ4G˒߇mI4`'ދ 9ǐh< qPEpKߦ0 -?lcQ͇r寠ry%)>eϭ-(#NCWVwYDr(Ib6 mS vա(3`yOc4E̍J Pu4&9ʍJdT97"Jua(d\'J~YLYc y_FѤ:riSfUʋWUτh9eT}b6"q͔ҁFѤ(+ggu7A9oڞ5| lS6=?3,L2!Hsqyw+b7'NPZ䧘iMڍr uB51ي̊% ⬢l"q^ruCak e}7'N8"FѤ)#tg߹f6 ĝkV2+ƌE:> SMsvla0d#7&N e,q4&D\m 95p.)cGfoS\E1!)r&;gL7C|9|ELp0Ga6q"uȇOhA^?up*f:;yJV\f.-2齎MbekWÌIA ci#x]{>q[yHN8hE* v,(vJym|Ý՛L(,c"ai]&BK:R :|E*2"F5Q.5dٖ޿cqʵihyrɁ9#y@|8dOhR#奍2{_S_'J1^,j0^QcSLw0&Nq `E>bl -BLQvJ*6R'rثeZD.T75*e:lEjWRfdž>Yȩ<*(Xק91#@C塯Lw0&N@Z;FѤf5z/fSJ׾aZ:a_[`LU9:_OhuT?Ew+m?0)8SVPQ4igʬb#y௕Џ9A7nO4u;iMrQ'ikݑ H (wB͕uhHS*E*|biNUr3hgᅩ$)7G҅~9"1ETZ (aq;mE+iP~zON VNۉS41Ojٞ~7sukP~7oi;ݎ:gmÑWi^t4wop9ĻpKjRx1JYTLeVR[ X>> gVNG-JCf.);Vb.)MV/?=qLBTW?.s,0eq+ϛA.)$L|$fjr 2lrV߀4 }9"_=v{q&4JA;C/o!G&#fo If¦^0|ge3}m}5okY+ij_1Q~8ȇh4^5h5Ԁ]\"4+ { )iޗ[r((sS~;qdBcR;4{:[ [Vxy`RIjZhڕ'OS}hB'-1r0=g^r\R.%(;ņ^a睶 7f د3 0Wї-6:Zt} >6(5lLi1dti-B9*,&# MVЗ"҂1mLʌȗ0 VQHز-s?wIig8IHL>m$JتG  LUfL<$VUb[ 1&$9 1 Gp¤% ]:d9_)]UY sJnuLrgP,J,q;2/j@W?ؒyryID5r&hXu PUM;ݪ|E|dJ2(sDDOC,:Qz |ʡp/X4sAZ׻1jDO+f/ x@/ۮ-w~9:Q`~ހU‚X%xZF&_4~DCF!G/Y)XF}r"ƅb-ÂeLJQAƯ_)(%+eY9"FyY&ker]Mgi^p\B.p5, 2RH.Pd`wWKb-Iwh.U#rj/yiϝe@ސa ?"/yRY?xC<˅܅)7K4ʨ 34Ԯ(G CY~(A!@Y r߇vX)/;e7WED[Y(Ṛ-e7zW\M }rڇ(ߚr%)rD9m/NW=rׇ;D\{/~r֊nIXZDKΗ57{_nc_YY5KF.[w>vl:f\2CV{+srck\DH->2Eʈ\9]rΕ%QQ)eeT i5#Ո\*Y>,^(melPv~ٌܥ\#WB~jO `<ҙOAFF(υa0KQB;ز_x~=,D"<7Gw{nʖ_+\ EA%"WUxn-QU}5! n/hu>3"W~P r{ԁ}uGYlC?ʴrr-v$W47W얰ĶRuVzag scs %jJv{F}z_փN(VC+]r>v0/*! (UWjJvՁQX#7)ͥP'laQH` +2W Kn^VWм8iom3tg0]Ǚ[KVI) WeP\immҸVW]T:܊"d+2J VW jmZc}x_P־j}Zd+ -ZWT:7Mֶ"⤹XXc_xĺH-lcض(*ݴ6I;S })!QG,~W,F&ն8i_Rc2<ڸhm`R-vVSv98)c>g~+\e4ZV ݢT`clY*}e-vQhf)ɖ+CņRZYeqҮҚU}Q={ꢅwt I 5VlUC71,N_ZסZIrDUF-UC7mu,NڛlǤ<<H]H'[4VUCZz"y\~eѶR=6/Nڛ,1)gP(- UFjaê~{@uqT KB)w8ͩmhN*2Č=2|RӠY5Uu܆OU(dc_w7e2bh;2(&b+1G7w//ܕLO|>7؎rW2){xd?}QVٌ{Gܕ*mrqv1V~[V(w&2d õe=CvAy :{ѭVMjΤSO%uQFFR]ק CMG==qܑL܎Wce@;V.kRُ";cnQLʏYVϤQJ&D}2 q8Jyu.)*ͤnWS;ŏɛܑLI=`ʍ#q7َr7Pƹ% e;nl֎q;Ukd=.eƾ%%F\MaL*\Sac#e%gɖ2p1K,wʖdA*]@jM!::/!"JXL$&mƐ<- 8R-lP.ppvP,4) gI2`^-{Vp+)b˰ 6O团`F=U 08Q#j[8>qT8Q|EQрdE F)d&h[Svc_}52&ʉoxY~ qTж;_Ζ{֖xSS|S UbtlTЦv*uRV8@;o\<~@26@.R 8ʽj;[)ϩf4J%Rv6hnY< qes,O}Ƶ㑲W,hrC':GWmEۡ' /B'䛴lz ;kns垵 0T*lj困A9&k]ڈ>8_ڵܿs'MS&M(I:XAitEGȪSZ,B x0޺u|q lճ|Lܓ*hcW3䰪|+xq\ZgT"`8@Kؚ3 ^T a\cjoY)wΖцK5U[DTⲦQL `h [`] QGt% We]]9}_ZX=Si;ʽŖ(WJ'MTTw,4| -}rwj^^s]ˈbH?B-&e{V1ݹJ.ztܝj+驠/⪅StJ1(w(H$ ^h!`I2=5Re 2i@Z=hGtS4F!7HDٍ}3k *F i8π <-.(S"rw:  %U!`CŕWdIqvq_͒!\+ͫ!`RaYGWbSWJ2\i̽f>0)Sz((we1^X`KzA Se(ktSw42[tw cz)D>sSw"",*ݶ-LDRWwڑr]"Kaŕ!AS)Bqe37IFtN91^MFT܋L'hgGQIW>(Y@ٍ}u>u*~|gF:z}]?uLy/Z)N}>VQՖ^_>_yǐ7˷թJce|lǥ4=Ab,_;2)WZ컕k_ {6me6rMV{Nf N/_ {[lƍ]K7e;劏7|acw+g Mծxl^/x}NyƼ̧Q8tWqaTxy#NCer's(ܭ`q]o{}dr#;"WG^ۭӖ&#P'vjU2VQ0YnfR9mӝ~2NwRc YVT)z>2˂ Yd9SN=)˔QgNUbk\(IENDB`logisim-2.7.1/doc/de/img-guide/img_guide_frame/tutorial-shot-gates.png0000644000175000017500000001407311541757124025632 0ustar vincentvincentPNG  IHDRPLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccRvIDATx s88!ӦtIfɶ&v:?ݑBFnFd=I ,T8:M%3%iu,2R) -%OUYz]U9`8+6݂M`)4]3F H4z|4MJbo Dev`Ϩ5a¹x,/=eP,d Q 0VI6A($N[Hrc珜tE;e/jHONE'KiM#o?2L8;1NHr*)]PH>‘-ꌛ1E>~8r485jˆipN1(Cj*B"\r~_-gʙYCk)UɔF9$?ߏ{+(!7EP2 ed&)g_叟P9Jrj:FdʩB"uW?-';r,43Z e튔 <_&Þ:#Ebqs{9ߑD?r,UDȆ(FKY}) R=e=Fϧ\π4e:BQ(Ͷz.2ۚ) BG_b.CSᛔ=m]YAok8 62HRGZDBȹz.57Q6e{,&pKF|LZBXerW<yˎW)z.1wb rEt{v: j?#dNr (IJƦ5"9(R@s d`NXP^D."(R"9(R"9h(믫Ph-J)) ejQxDc)<>6hRSZzu+)'t1j22޾I>r(T\ 뵦Oy:(GjEptmdkSM2ٷ]EmJ_^X!WO g+!E rAlg0-^Z<w%\ŢR~wqP+6\nZ0mf}-h,QAUyy@Qp|6šƖ<rJ,ĶT՘Kj9 ^h4\n̾+[ڙhRZw!j5ON/.+8)/g>C6"s;21V *ϛl60LJkA^J5:  K+zrA,JE-Aޠ\?uUCM_J ֖Y&\Qͳ>̓P-/.&KO1&[ĴRLiAYiV.5/7+җ/s뫦_i tW6-u +ikH4V@*HiCYcIEn9Z|2Q~/g]*5&Me2c׷QJvcaB(eGYkZ)R"9(RJQ+F:eQQ- 5H4)AV N=Sn_( e XVPr) Jyd+%j.2dL{<ԊY.xf,pKX܁8>jGY¬rW) ]TT`-.#+Ff(?Q3QK"f3bWNw{"C@V2x3M:30&2bCyo%epe0fpUʨ2elY,1gYQ.3)عHQ~)keEA0wb=glO\-,Т`36ՖOܖ?oFYE¢v-=R'Ee{2e"z`ʯx2#}W[mٜ!Ng/)rrK{81O9U[Qò P zxa|@91v7[S`΁{e/]1EA'E[LGs6 UxGƪ`![a;eX\N)/FTV/ry"ES.}T }Iܔ\[!C?s_Cڮl1>󤊔\%)FjuBΑiUGjT'@INZMd[Wsh잩[dZOY: >tQCY)E{-V#!)gLn`}!YV Ig~94y7?%(w@羂lqF=<#}rW e巾K`TC(#e9Z}ISGYXE<+;}i m·iHWOyDERGk{yHظH7]-4/X`{NQM]k]wI+t){rd)wo~H]-옥;)P.Q2e9-sHg (,7e߿`ӍM^Z1Q;/zEݍ/;eq(@}qƽE(oB6OX^mRqf ˶,kڶd $˂2D81sc(SzB~Zr=ZHWSL2¸8F>凅^׬VE@gk6jKt#8іD6űC R&P(lY藅D-(/fC:;iSFQ~8:~[9)1Ȟc[dg2360fMZ2I7җ-g2~L1}_œs/A8;=ʖ2݂uoɇ|<'KVN2|ި[Ar:/r#@M6eOKp=E[ln)lp-񬳜qŎ__f֢7ԑ8}j=ܓ/#-؊G+`>qܗR(?Kr?jѧE`;=jjGӒ!0IW`ARl-` R֩2}#5QklRn^ݧ-WŌWo/7i(RW#)W r<b0z#?$ʆr^H 5Tv/x˕lk[驙2YEӂd/(5ͽf9_K8U<5.`[~Gř$.ןcWO_XK~_U/-]cHaCri)?f^oJjKrSP[Jm:2ZRr70u8'$[[F$ Ul)td/e[ȆiԶӑ;(ۦU +4eк`eL)wvI]9(85Pf+~-{A{W\Wd rpNG=R$HSk F,IG\-I;)]:UL؅(Rvv)_VzHMI&F}gHًjG_cԩ$)QxDʞ)AHy墺VGLіiQd2ܣHfW|EՏퟢ8Hgh.]ʅQ@#?j$(7(?lmu[qj~87JH}\ز|cMux{JYWJ)KNY͖cIY(RRHrzFYRV-ÖlNG ɴR+q|_ |2V3O"򰪝S r#"[J8mYҴm"˒ˣP2I161vxw(xtHg8%UGYg\d?PW8p)t »JT([iSZg}h:Gh1,47 QV²Yԩ ?ךIENDB`logisim-2.7.1/doc/de/img-guide/img_guide_frame/tutorial-shot-comps.png0000644000175000017500000001422411541757124025646 0ustar vincentvincentPNG  IHDRPLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccRIDATx w,I&ݺ<=xzo&͖|>ûhoMx "R4Ua3 sl%MW9'QJ[zP>dȎAnZ^,aw`?X# i_Y/U:j{,}{bx!2 r]-o$@g7a#y zKKOԡ`ݹ?g -s|<.lDJm!L+T:p/v1 Ӵw-ӼB6+p !'KIڀY|#~?ڜ *c=L2oY@rD+X%X6dhPH,[6Ο8ei?܋64_T-0 O(qy8a±h&tyݛ1p@KSVInUlB|%ι\,wOSc*/XF >c2"$% 5ZJ1_'~@[@+%PU/@jmrmF̢[D *nL0YY}/ox>(9BY4֪jL?5͜7WZ5(/ cBwMJS.Qͳ9ғ LJ Nz{oJt,G>]H\nb%J^ RS/êQ|wäYSѰۢ1߭,ba5&Zr}W 2vA~bf,rG52O,C ,bo.&jKO >9ṂivQӂ.ӬYCYj|0G^H_*%2+)חWM hxzu/lXw *VRאh,--#ɣ e]&'ѻiH%ʸEɄUjLݛ@eTcǮd2l6aD)e'Yk(SP| *)_$MWr4eQIӖs$iJOAV'E)ܸ\)HCY>j(T\|~8BƬR+wJyN;tW|Tr,cV( ArSܴ?7>+*>(K2J"eq ed(׼0q&r,bK05v)?|zQ.r4 pi`)W3cڤ'&'s J9k!#: `\Rg˄Y QHɗR~>tw$ߨѾ]RcjQR>93)$Qn^?^8 eY,x畞2K0QFkz21 3ȏ)e^o 9Zn^(12_&>[R~N 2%5`kU$OfR؜2PsjÜPJ0Sn t}l&ӷ\<ܨ*2SDgv':p6H;*b<^nEف.:M a׵+(;ep_ / ?NZ6)OܴN-}ˬS~VKNrGCh"l5L:) ;f2v.ܕ[a xa<P?[a{lT|m F8%9rS~rBF`|y {xtȴ(` D_>Mp8ua䕩Jk)CIh 9QFq\5tėb^cGˡ6:ޤ,e HroPF9M ?$_/ӿ4*J7ufωr ODr[7&DY#}W e巾K`nuOJ<TKJ򔑲-~ʡhhȔ]u8=K=wCQ""O} $ƖVi nSTOy@Ef)G"oӇq#n_"fIo4>AUM]kݴI3kG\Bk('[}~/7ʖcZmsʙˢsp3cl;eisZzQ;8[Q&ϮP6p 1Qv^#xhFoLb3eq(ռ;[ QBgxď]|a+]+ NC52S}lJ[Ӿs-e!/?0qlMw:^/pRzīW!e/T-z_@f%A0Ml]/O$vJé-DepJwS#e< rCP͔=((FvT=FHM{KV4 +ߛ/SLs82Yސy[>BTQFfjr4jʸ]\<5QTkSCيd˼6A,e < בUOeX]^Bj<,@˨%0euXuWvH ^q0<ܑ\iZcwHrv\} `9:]+qlŬZ؉jQ&w}saW)Qfc{I;cҚV x|c_@|%P0%CneWdF2udO_d)*j.ksr#A} MYtb}0[ʽ h2 >6BY^nR #jZAeЗ1cMr0TԔ%K{["ujGvޓj6NP^*0fE7ʱC˂:3/SK 8Xk>ϼ1mYP^o4rM:N:W#SPae0 C!bIZN}f-*ߍf}Y]o)&9#z|֐ȉrpH͔؛ecy_e_'9PyMy&*]aac/ ȍrcG)Due2t.Wb"GTr iUכwb&#fQ7zK}9M9u8ǣ)iHcj #ɗd┇NU' ʂ)r %ʧ5u#auv {Ǿ sRLj ~UINI? <65]ŗ {5xºp,% sPҶbY-e]Fd=$eMrMlIYc/w _ 12&' ɰ[B#*~|] S>ϋDْrm|_Վ`hR r#"J8™|yBl[eGʶ LWRmI١eOGw56a]|#ɲPHP*Ɨ0#20Δr r RSD6ߒ] dGһҬSDNNyNqd?4T<ܞb@ۊQٝ]%"Ɉ7ևj@|@ClBV(glvs 3 /{B);vC+V.=LޞCѶsK~>&/^97BωgrK|VQVOA%8\*5 }F1{|dDFbD&_ePW5:ܔ5Ul)LB) p>eGgoLw<~+?Q6)O }Q-<θ@ks,Yۄ/?eQlFdaQ̤)rQ'H2^[lVǦϊuΓf<иg88oQ,Y:8pXvL3ߌ*Ť#4er2he@@ nGV3ƼvMLd ixEYS)Pp#u.ɏto{ eu6%PM/[m~>r)-qCuTq+\)exM95sebMwbJ y('עʼ5)'@[ϗGu[ k.X YGʕ·2#\pu{dNF+P~/!eON4bEJH!Ñ2y %Eг,٩ts4uz Ӳ[_4M/*XpuS?ş--|Y&y@^tvUYCh@+e*%r(4}绕LPVEMUAi":˾saQ,9 z{[t̥Ox\5JU!VS/ӦPW5aV^U rʬOQhdu^^I߭l* nJ8 {rje Off ̫|YQ,>>á_6 in/%t,U{C/df^_el@EQ뤦.=.jV/*'"є뫢_y:~W9-U +okx2WT@j(ل9YEQ6sde֣$F_UnJ꫄, u}F:Wʴkۄ3ҙRXgJJHy BcR4JRQ,Auj@AԈr)2廻& )A.=RjR,)BE`SsKy3y,D =W2O~VjEPN'ArxVjD0e#Q0;u8L6MF,ڋL޲bP rjIl`F[biS~N䣜gDg&"Ieq(+f0L #%/e*;QFg61'YecAY.CyMM6R~!f*LǗg )ƎGG_3qR[1QfwENj*I唩d9IqVDra 23h3[ᬑwVUwşVd,&J)H  <1WAHy _ЌAr߿ʻ۞\*HTߢQIb5jjȔ{Ԓ?@58lC`jmKXBugH9L35$0-}{]TZ)S9ÌCW|9aבe{ V5;6SNE"尲[l!הuG~\Y^)m8(_m5d˗;\$/:NtoF-6R"w55deζ<)ƿy)6/C1Έd|˿% mk ,#kfLvK~,: :r@̊Qeq6JL}kS'ؑr8 jRAQW$!1)AHy BcP[RV jMY&U:Xs_ZJ(yC/UKl З/՘-7@qޗ(G_>#}puFjMCҋ? H9ZR'w2[;K*fV  CV jMYt˻^ξOX™s}+U| #cȣDbA˃Qy+pu_\u&3ϗCb攧r8}bA@H9>V}\4AH9TIyV< QF(SBys yTMycbY*ЗƗ7߬/=0noRjCuk!V 刪Ls9e/E3V jˬ_ 6[C)GT~r ;oy3V#[r=\|}СXϗ#e䗤,B)GT/},փc#X<6 h`q(e99FwAQƿhCc*KV)GTNX[QaP9¹n!`BcR^C1)[CUp>- )GA٨aZAZݛ V2UHy r)_^#Sȡ|姤̟%#ز)Os4rHȦ qNK9*(WjArߕs1~y 1cR zSwUP Ҕ(*,A1(qN,iH9* :<ҔӁ }9 =z-#bI9|{ 倲(3Y}A <US^|W~NYF)Td&r@oW+(p 1H9lb{b>P}u ydS6RNgZW?sק&*vd2)+/+QK8?P/y1()'_WdǐJq9e֓j7_T55d@ʽG"q|5m|Є)oMhG×U+|l R/UFJb-ёspbK1vldh˦rP<ǠASC rBcE!B_ǠV+f򐅔 iS HULjG:ǐG>ȟM%xl-wї˰n 2 )W~BfkEaRy#c#r5DbדXuJǗAE`-(WjNP[D,bsf/*=Zw_ߕs1r(Ê(E"b͈Z5dfjE$ym|(Ǘb-(㞺a561>V/QȦ, 'וE\cZRBaeQ\}1ƞ\$Mef Ѐf8r4 2ԍP?#c#rU}9 } )ܷ%!`_vzkLjKΞ[aK=S6"xBcR@YK>N9S0{УPP{- jz4yv}}uf\; =讗+\tn ם{>{BH1:cybApn,gsaʱdl@Xa+޲>9ʫryV\SEX=rEJo0>^,sA<}пefbn1D?p2 8wrķer26$–PV\(_|@思lIsbaxQRdL!ɡp2*?wcKM6aB}>NR8-v*)mZlpH>Wʞ .\1E߿?r445apIY1$C*J"Xz~]ΔsǠV)grGɾHVr,[(*b6;N9gQ~vuaXS^c:啚B,"mgO85; I9'ev-K^e쪔<^㖗8 VchuA[f90LY뉒 nA}ͭ2|Wv${J8 5ʼE΁׃bͦz,2ڛ9B,{_j.禌-);ZPop7Η FJ 8p;TnJꝤg+%Qpon\P~r&7WE>XerS=.eȎkXcK ]e7mJ}ޤBJ [5}TtQ*2,SPPsrt@#Vq1g/@P <)\fݣi-DX1 .b 7xxl̄}O[)/y׍nFSN,QhxZ谫jsS3sNnkoq'q eoqg֑3p(Ӓ{$g,9qy{NeF+xת?C<"Z{/od>(;AY5תjLG[, rT\,a,1Ѵ^aځtUaDZ^+%GG%OjLO׺#(%SW㼭2cʿj( jkqۄiIC @)Z (OA@y SPI 4^ hAe9E~PrM{@ erƻUIJxIʅ٤Ww-g2z<Ԋ٠ͪ7My3ܖG?jGYll6UW) ]TT`+ZV2zɫQ 3SK*fs\cWN"'Ȃ@5$ebwfٚtbjEya6)gM)d҆>p.)5Ό׀٤L PH͗Z~6tw4_Ѿ|?XMO9mDIynsfS)ILݘ|d%fW5UzJVXz,%2Yӻ։)M=\/?emR.,gd}YIh)b:Y|pI5646gPWתO2ؒ2PIf WRIr%USnl}l&oTd")WD3'#p6:*RO;bw+t֔}TFp1 ,)(OA0o SP )QTG] Zfa *-”QuQBQt%eg+eԦOϕAO=nŗH-rW`V5fq]ɏ$n:Ut(SImͻ r?`eU_>{pf@8*ULrʽ|-3~nlj]  g5p@)}?+a)}T(⩧`ƾrSce;N.CsSn}#ėQ11_sׁibDC!(_2ȗ_d|>٘$gu5l#c>"c(˜T"jؐ)'7$n=j:6\q9e,ԠqQRsH_`L eeuveEy)U| ˱Gڏ}-Lyc_\Ԡ)r*;8v+0s{R!1`vߤ( 6;*,r@+0~8%>#hTan ڋjKORz_#anK`EʱGN"Kkة3x' |9q'Rg+z7,7Lis6Xʑ`N|x(hGEЗaC<'ND_V>w/R~w+_n'BĦ}i9}Chx##|orw9 fQu&ŶPIYb^'=)6N]ЕaEꔇ#<yP\(W3˼8'ev/(U#y^rA&Q=5̭Fd>y)2u|9vy S.OA ^>ED@=|Ww9(.e f'.]TKY>qќsfYMX{WiRpg7^K2&$Vc=~_bf*K9:&ՎnNIj3kc?Bk$OeFG姅wp3CZPO`7呼QfϮ:(p 1Q{ Lc{f:P(y_YPVbo\?u姇**wm$X<)f ۗ]bݐ=e&y XV[- qE|Sq- \0V}l⋌$2F|>yRH _p_6PVo_}F*S|l Y;LU@{J s1bkwvRVxSN40H]˻{넱T ez_7q |t|5ʎ,|bp5<һU S<"=$(/ydȽ%rYF _֔L]2E/i`ͅS{vCsE<:gĜ:Rrȡ˲F6A㆗wUr|]Q@Yˤ%(esXuWʣݗ2\})fv_+Nt'XrGGX #^Ǿ4GNv+1(=@٩1!S%!X.`*<%MY44εFb8.n݀rxyP{/Hf5N{k[כ9&R)'z=`V_ǔpl*IYe >EVT4*-es5L5S&3$IyMsF!5Q+ 9 Y'ehԛecy_@]辬OkA95u# m%E*]ea˗vYIԎrcGA&2GtSdLBPZ[MԒ2P>AM7dLc/G.2ˢn3}jd6gG=R>Iu3u# q2&lV%:S@cWP&'2ZkMNzABAe*P$<)(Mnrq!n%IY_FʷIt+b<"d\(od't{ h{/e! }d7X@R2 cgIs@(6r 9c;(eR0ك|)2!H5vl;ԇ/C+)ߒU~rq!nY;="e},6e ,cg);VDh>v2ʣ}^z/(gxծEP/Rb8d>v6 L9g+ Ch2;|~Cs P.zr2 ƖAcťX֘IENDB`logisim-2.7.1/doc/de/img-guide/img_guide_frame/tutorial-shot-all.png0000644000175000017500000001532111541757124025274 0ustar vincentvincentPNG  IHDRgAMA wPLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccR pHYs  NjIDATx S8];0$[H6-0|:%[NmfE?|bNU/bOE9L(WtUQUa*>#z(dQ L6#0(W뫻0Vwoǒ" +Z/ H߹CߞoKڌϱ#2y>xBn_Ч>/(G=OA%8p.,CNzr>U2BBU=2RWe!Jv&BK:!/{m%Q}yN.WM,yȋ:oPIqF{sΥS26o{)ˈeQUfA/L=12z@_$/nׄ&a/NBSOI^x`+뷏炩=MzIp DF)?iJSF<H\5iJ1/ Yg<,74F,T-P d,˹Ld-\RR|{(pP*eexgR8_>\T8W0aR^L)|='{YEmv-|؅ѾZ2K ]ﱷ`#sKWb%S6z:~gtf#fClZ/:ypR/˖IGLg .ؠ,f_x߃ڬѷ, -}RM[)[6 |n#(WwdeYI}\wvJ Te6z|UeuNEd@_O:f*Tӂxu"dqVms]vKqT5> G!$t2S,:}tt'yZДBT(P{ UhNXxv)ϊNVWP>BT(EbEXZk?UI,vhB#CUsTumV$w1: C ^y9 VR4*NzY!<8PVxq%Rn5ʬeK/\zQk*+$h_ 7HYƳU&uXHKzpz6REةt 4uZfnj2_4ȡJS嗟۟;F[*3eLP*Z.,suMғrdE»[^rY0?EV$VK:Ui5t\ij,x{1dF^_z A\\,=)GNVX֫ם/3Kg'V|\Snv%[A˦[&]_زyU+eОrhd nygv( ;% Ac{myq— 3 U˨؞u[VY7P-Êʕt,U{Ƌ6[V`^c\e lˢͼ-.V/^++\SnnqqfHVzN_ @6ud^KP"/Vfe8YE9=A(sоN{[{y(jsR&CU&JE((BT(4嫢ӕNYri+r5R4  qESϔT]9A٦'?# QN~elb)oS^)7YǓOJQMV.1&[w,pʈS Q60c;֊.j,ډJ'\!f+cכԤ|O좌+0o13άgXMyFA,](Q_<ƌM6&l&ehyY?9;{{; ,g{Д/]ƌDN7?'j |9g2 D(gzkQ,d2cAY6e~cT(Bָ3(#enU ce`5PtQF_B9_ξX=V]يA+\VRPm%#⭲0+,"Z~ʵ964{Rp9wEg_1{ǓOJє{Wģrq*^BTAST(/hAпʻbj?t}&-1%e|$}APx?|&,1e4oaR^(٘#<`&~8m]mnl+~F'$gc6?wf[h82I>6y)먗FShE9}lQ>f_!Wj2wcuezݝ9"!^(:2+)@ZlY:{RUo$svF|bl*E%dP>5c4xd j-[0lS1eWw45f?5-anQ:ʌ&RłM`\G¾WQ[9+,4Sf`/&m ;0mXwߏ -e2iq偯oc˸vC!{_Q J#(PNWQ{|]bc^dDPYk ,z8eB/QNJe-G0іٸ,;l3:V(pۇ*ǸL?{l~ԵbƹO*O[~}Gy+vqNʖ?8[qQj|SŹޗ^/ s1S+}Vm 4c}Md }P6~(@;>mu4lu6S̾8yt<~>A:qn`$3()P;~zn#"8YbNj Nrm?Vw7 E\I)TVTP.t;ṃ}!ZL{_)7x*m{ir7ƎזBӳ˓޳&N9s;|HLFjlb{QacfἰP>6fcR^^-eYiy1/*|L^9R`{+@ǥd\{_;t縔q@Ū2-Gt(sޤ6e\@̱}ʿ%rY/wPMBfD'kl@[ӥ,S0w'O )tIR6rWQcT3VrI] Ӭԛ]LaJWx7]lZAm`ut)'h6PNٚ tQZS㧬>eʡ{Z.@FO tʅrԉrF}f_ 53<6awl˹mN)剟." trNMRᶲCmڮjz4}SO7"/G%a2hb@yJpp/N9ej-cs1 .?8[n@>ac 0VoW.Fy /ʆ~j-SevKo.Ӭ"LoVy)G6i 5#)c0Fy)sKh=f$iƏr@VeϔJ/IKSNa6e `==փp~ʲ+_[^WI^?w- 2ӹvrcܹ㲘uˉBYp㲄&bl1a*ǿqO/Ǹlx_IQe03sli<Ʀ3ӫC//^ƻ)[J[cՙXnY|ϑ[ǶHyoz4Xف*>x.^(SSI<;PMdNxpӣ wv;Bw|t}c˥E, 9іG`d)7;F:HsltRXG:w![hGФmRytk6uDVM2MzMmc$3SGQSW}F$#:R{J0΂z'բAۣB-LfgԾ n2g}EF(o":|y@P>cɔ}Ko/}E|`:)cuz}*Kc_S NV|ѡ`4Tl*2L1- uP1>c?wh:.멉G c{(#qYvL8|P\FZ(QJO(cjذUS- 1/;i3g,r/㨁2ovO݅r͖O-;|")|Q =&LRe;C);}g8:0ko>@Y#u{djc\0ǮSq/ΓOyuu~smrO<;H|CPM2L&?Zl9MM&Ey*d\MrLh](ɹ$)7:6CP΢mjnY4>ʠ*r&ƿ[1Bʳ6,&ŖiVd\[QR~i;L-g2L[~\>;񹸝̐˸|,(❄`iFYwfĮ{lؖSKX2NfDt\sot5[6v *92 sVƱUB_ָLɮ {Nʠ"_,y  95&_Q *eu/[(mۖ2 g2e @ʘm"qո+(S Vʸw ٲnE#)˃P;r{|/[(̅$Qn4ZO'hFfe\>_}ǣHffeV! fSKQm(E_6Z4.}tAU]_GESQE+S̸'5GIENDB`logisim-2.7.1/doc/de/img-guide/img_guide_frame/prop-oscillate-error.png0000644000175000017500000001420111541757124025770 0ustar vincentvincentPNG  IHDR|^,PLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccRIDATxi[H حگB.{q'\}R`BTHEF=$ ,ϒW }YH'wM:TrT^4@c`ጻ&RM Rnqm .Dd".AT&RMDoUnpP|>m!I/ov3=G vO/Lw|[nE ;_R FOJQ÷ug<΍0F+Z/ 5Q$E/$WjU3?cKp~[Z, !YhA r+WE ?sYbvR'~Y@h~vDK\ _ЀbG+x\zqKDp%g^*c¯%tCwOvwRᢻ|,z;|T\>`^/* |d x,;f`V/8G*GObm%o ]EJ9|g3&j#ն^}^/[|mKoY md"Zz]6`v|%,W>."ek0}Z`1^% U⛆wBɆK2qҳ쮅s̞ |WZ 72{ cN>|xu}mΫd㍖[g7˱|XZ(y2?qIc6_zzdR,[ngi<: '}/l-HT,q %c"p{vfX>O!gS|>n熯|Z:=ꔎ%Xd~b76AyiIRa$Q<9)}7gRc?I䎄'}!g9R.'s:݄u4j:_Q JGT?YbD'" szzS?8|{tߧz}.V?,]ES3(Ʉ_}~Jodf` JNFywZ\PY>_snX=C.ԃ?N7F _~P|+$_~ݎyomE> 9|>h!~1B1{F|p0}P A5,EzԸ)ood7CƯ iHH J?GԸ9ZC|A\)F,Y= ~e?ESOM|LZHCCvN6cZ#pp6x$ns:P'cYC>Oo$K:ƪbyR nYX+668jc]6|`ǭSLQ J#*}tdD%#*}\pD|JJU9J#avU4bHOc\n|hUT g >SEC} }'t#^]?#nxzum./^_-§OKA-sÿ2F/GvYb|[Kׂ end×r#4g].,|>5zjՍ-E7K˿n_W+{bOMcM3C?omG "+A;Z>Yflp儽tUe7N['m9WTgPaxuҎ~;~;YcY}y!V~o!|I8~f*ׅJd&dNwjK$}O{/!ӯ{ׇ75ApԅGtJzNQMn(a{7`7rl'w _0vP۝8ӹ; ?H|֠ό{cO8[>߭'j6|~D\Y郙~.vU1v~-j7|[hG ~/ܞ8E@^M$_}7Mݙ ww6W`K;PEiJOJ]9 vpXعԽ Wbk~jw=tvxvi>ߕ5(rםdه7@'Y}o*wh[LoM7b?coc e|v֙ۉ,/xg3zvMl=jn4ӤlЖ>}_n|N&cN_ nIY"ɒƁK=\ >O'tWLyȳ?bE|`|T5Xß 68M<06ndRjj?36|bXE1|P6W6JHOe/I~i;ؑu}jhWwZ%@wd]87:HM ||x Go`0iVqm%tP?~;jbo_wKi/Ϲ{}X 7(Y3 n5]M,?8bO7 hP#Q|4Z:"f }?/WxNNa  b> R'g6!|nr_S>D[{kp|: |) uϗL/ю:u1rlOЁdh_Ij'r#+p+D*oD%#*Q=¿L 7ʔ'uuWKaAb=XEFr W[Q~pq'h7?~X|6^W?~ĬGN"82Iuyʕ_ն`w )w_25: VWt"p9!v, w-*^?15c"*9#TͰ.}x){'j7U">t\D^σyN)cԺ4nz)Յ;pB?s,h?'j 5fpW7Å;>U(sJ~ߖ8qYZ Z>|}/ukBFV|)Vֈ.pϷm#|8 N+n;p0&sc|?[Q-9olnX3Lqyykj ?o'dY^Z9MWw<-+3_[_fnGe咍lĸh%= vA1<m`D +>^<&-\Puñ_P_i\zQ+pZg ~?uFG֣G&^^I"Qk=} ' _ z|Hxe>_gNՅNTGjv,=˕ cӈ Ɗn َLlk> zヲ QУVm1DJցSjJNy_ N4?L9i7oRaK' 0>w'_WↄOo'ey@," ÿ]W"~/-|ĵ5_IN>?xzoߏEn_/۳?ao > M0Fdm* |bˇWAuQ_(!|l<5,_ч%aJapm+Zc|#?-Ku[oC)7hãv:|nE 8#}u8/mR,|0uN0|F:EW;߹v>(T橎v>ܗS'3]6) _I_QVs xB6pd51hÇcѳ;ɥs4𫢘CQR*d`T$ ,R!IENDB`logisim-2.7.1/doc/de/img-guide/img_guide_frame/prop-oscillate-before.png0000644000175000017500000001316011541757124026104 0ustar vincentvincentPNG  IHDR|^,PLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccRIDATxV hk:-dكبyJMI*RojΓ%RԳ0vgI*!"˳U EB_GF'(=eФj]nT"JИ,q`Y?I^-n 7Er[ĩ ߞtQ>I!0V!~f77$_s~w# OLw?erI'?%SE0_.5ȕpx0>,TE5`, *6p_X0mle>fDH?%CL9I^σY0`~_kVi)f,_( 5B? ߁f&6 e)fqð'_ 4 )O")`֧`]EeP+xOME)E[E ۠ٿ;ϥ=)E "#֝<87;`BQσW^ jI N5_H ժRg ~c~~oCok1~ gOSrPNR."TC jvˊnpBs( 'Zȥ X!v$BD8KXvk ]]p'_p_j=>*S,x%\w?{aܳݝf\r$2\.9<_ Y>\>`^/* >G`M{}Ei釂t='Um6z*TlVyFfZƇvD_vzWttIckdQjOQ(󘆏ʫ(k~R-%*P$+L@R*'$o]$)P JT?zm uY>WnK}'U~(#8RKpW5.oi'M Wlh0CnS.ZW(zrǛJ8dG6L R`P^>?b,V(Rhi]+v[F3blQ\)omdRi',Hr->{|POhmmC%=|e[#jȮ^i Gbp2_x rk-I|fO3 }`J~2' > )D< 7)WS$I2NqҊ>HWf'X$k=VCˇg7+A\WϯJ6h5ZqսfMrKo'loA= `̍DJrrK!g/W3uyuO,_ SYKtDb|BΦ|Zi _||Sv -"=H >&|teϮ _ YO$FۛKގgu(9,>A_3|]HLYN'QdX[G9念@%JH] ~4(AD;ORgJoNTonJmOhZ J]/2M3}u JNzyP-NtZPZ>_snX>wwџNJ _~G)Z2ཨ& 9 v ,P#0P,̂f-j:GMQ_WوomyN+W8-㭞~`C ?7>9{>)ѣTZ;V.FPj*)}GP9SAJ0v#1/ qi$.i>Dz"gngN  }Lw n^MNם~jTjv荦=}+4 cd)^2i1}^]};IsE&֊ 1 ٱ+M)ST?J @?]Wv4O;Nw SsW1dwwc%(ϋӂ/vc-gEY|i(BK0і3C1_agD/o0|=!( <ElKw~:._Bn-{8_J ߭W(x(hN~mI\g B_d/w-E^w\b/,a?n{$P@og&{}Y*|Cx[uҧB;)=_l\lo[A5ȵ.0fχWؙϷEuZfev]z;Ài^u xwxعYn6ǂ߸1@|$ t7|kYGAx=tM۷]~E[, ;~1್+UӶGqQ'z -ePrjX0j7q~{aAK7}W8|Z~C*$!.N6[^]?DptI1-/9_+#ZTD,tI1-a/@->@WZ,BV8|)/"ӏ]aG?D_\=/;)iNc ٽS/U[~ud_^iK6pK¾?NA~ Qg5[1xwя:ߒ>i˹~>`컀_'i.>o6TW|obǷNwaG _,TbׅJ㶄:͋x{ZUsrdj·}4(K9A'GvgU(pq}/[]6F2(|T jW0쉹 ߄qF@^fRe.K1c,ϧUz;ކ>p!X#+k on'.eu+lZ{> 7Mkԗ,זF4)6W~u9v}}N~ĞAq뛦O#~1kWuL`|w0oLwpؠ-]¯; w2?Ӗ V}LdiuM_//")hL9 [h#Jy: }5\u1m.og 56}1Xrßebj&~Rf2ij?(w}74?ʍ ~YM\dJUO(wo ~/)]xu_a CjX/U&1Qe;W.k÷/[YAܗ 9ǜd9uF[gN緮;f :3S'sᛀIr7(`%~g;/-e7~@ShEse|Sdl'!m[okncT#okA_{ OTg=Sk1p}lu5wB䂯L/+zS֩χZ~ޯhK['v80*O~ML$ ~G-HF/ J,aYVx(ˏÝd-_Nk'hk+%/&:| @W|>ȩCkK[ #FH&v\E?oYi[_in'P ~[%*P MoJ+qL ~_W xΨ ~p}#\mFɝӵ|kx%d5Vkk<߼ 4|cYw ~E,Śz߼yb}C‹*xEoZN߲'QdW?IC(7o !v|P$/|a#H ·roZF$Ɲ05ЏZ>5\܍,kt_o|@k=l z2L/h-9m˷Za$ x7W;cilƝzogkGY~@@бp;_QУV $Lk(~|;ZA_{hD)>Fs6>ՉWJ|H-YGc2aLC?R;xА7V(|vVSrdf?76TGAZˈ'_WrCWW2`: ˗Ǖ~v%8 Ҹ0 ziI{/՞'@8O\ ^O೎iYA@.#Dh^~x%qdxiÇ/W/Öܽ۳?ao > Ma FGc}`26>{aY|hl1PCRS7|mN]܊c=z\rn 5&||G%|n~/w Ku[,/"@__%|Q|T~K];>:*ٹo,&#o^H=|ISٺ|s>OGT4wO/(lʧ_Im_V~J+૩Ma51`2?g]wMhHE1N*``T$,MΜk'IENDB`logisim-2.7.1/doc/de/img-guide/img_guide_frame/prefs-tools.png0000644000175000017500000001343511541757124024171 0ustar vincentvincentPNG  IHDR$ERPLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccRXIDATxW:[rG^+[2_4-@RiI:N\$[Pκb!1fOU(<fV sx.;ʃ WH[hAYm^үL{LFyMH*.^cP>$dyB/ņ $T~':o\Pz4,^$SzҀ<'NM ̳Tf_̒Շޔ~kj_s26ZyTbyD)`;@tL"eZ>y:IP+ ӑ<.!9~M0*3PP 2 cd(9d/`9yh+= 311Hx=+"߮jLftAf9O2Um rHKP:AZ2V?98:ـnƊ yc+LE&l,mٛ d%rsdA';/eI&_cEWLLn/ڨ2ʙmM6BP.4je&8}X;@񍶢;\_^Q^+e[N7+`YY`_[(#f8 8יִXi֨M2\iV({ѵ$M%+%MX׬X@fq/c͊$%/Km5+pf #D,kP'iºnmӎY]d$bAF":Y^6whC@B?do=xgf)<*~oMAحi#%o,yoڞ2]meVT#QeuL YDahqVxgj:$"6G0Q}asw"I}#2}}xYJ!}:: +: d4:B;KU^O@_T-X3ǚU 'C"qDص ,$Xu g@Uɛt0{vA_^"$&e*dLf@0.ځǰ5rq/ڎe]4kovKtغk>YAB̏URUׁqe l pLH WiR3B!_X`hT7/A<ӵR]4dV1 q]T{<RUN&][H#5a*Yﯚ1R Ӯϑ0 /pJVsJ\zxO.t"^ qֺm`9=1]YKhq _ _T}B~ھY,4p sYu\~羂Vհui0]/}XW > +)˯s7t Yd$bȂ첮ZuR )Dȓ8}{ ˀ\SnhP:?{q4Ep j^coG9A@1ӋA,C1} yPb(_ .Yo¦e*~w w\GNR4Ir@{޷YXG tnA4H|rD#,T?F__t` Iջ+9?Lqueia},}EokT@Xd_v`TZjũ@Nێ HB ;Q3xb!3eߛl9R0  MؾSYjtTdjjoeyr !ӵI9Y,ND>.HkEgW4^ps<օZV,9U! Ce[oب *^U~ EAһ 0F p=y"[ջ~$ۂxKZՓ*^VH`{9tUEt"R~v !6 %'G3zlG1Ҹ 4󞥪-ܐȪhbsN`JFHa#I\DrT ؉j >b&zx\ܯ;)j|3ҍ[V7}Zce&0kU="k9k*u~8=$?RVuUٱCjt ;H\i Kxs2VJYV bobq>bAP r1ȃ ( k_-y6 PA!d$bAF"d$bAF"d$bAF"d$bAF"d$bAF"d$bAF"d$PeznȬLxrp $ɣ;ʖgyAⒼ!J? jpS$-;d9Jr\ 2ga5eзjes62'11 WNlE,a9KHJjU4쬷({?`}ك%!T/ha[\mm REE+KCe2K$Msk( m@զήZ/HYe٪Y=tQv]gepB{ iZY]>M-`sBxѦL4ݮR˳ZwD ˧#H47"Πvu 3@yv;dzm\J?5cd("uӴ=;FJcz*/oޭwY^k[*gei7"TZ/=6co\/=6 A 21H #D 2dתn|z_W ͕/G)C 21H Cz؀ƌUXpN3}7 B1Ϟ-ݡ1CtjdwhV\_h'F7 =:hTe&+6ѻuo|.>f tjd+ RFݭLs4r+6*INhoKlԯ3jugߤ}w0]w\8NeO(tV@+5z;h3+Zب5V9F=l2"m$lHy_Fd`eda6F9?so$& ݭmH3i7 R}p;쳋ޡ3C԰9{xdэڻ?Hg7 RO7N;cCofY]ov.Y@s]|Zcŧ=d$bAF"d$bAF"d$bAF"d$bAF"d$bAF"d$bAF"d$bAF"d$bAF"d$bAF"d$bAF"d$bAF"d$bAF"d$bAF"\]ՊܲX$ #D 21H #D 2]\/2f ku] g V ٰJYل=OϷo@vPDHG`ٰ"pr7/ l\9?dÒݿnKv(Hӑh4e],{9"09OhH%yG ugU2rD6.:FH:i &yG&$Hkl^4"j ' :wa: aE!sO~'MK$#3T2ٸJcIfA:i Hy-})Gdrgr&jZ&gaſkU<8"Gd ٸ8"kuU ;;պ.lXg{8A6:ɪD 2ȯs7u-~uyV杛s7u:#muG (Y+D<_IENDB`logisim-2.7.1/doc/de/img-guide/img_guide_frame/prefs-template.png0000644000175000017500000001274011541757124024642 0ustar vincentvincentPNG  IHDR$ERPLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccRIDATxms: t/3[e<8Vi?YyE<>erH=1VEI@&4B= ơdm([E$w_ΕN&@W+UMVGfޤ67O;v#w-={n&:u[(-q&"J_צU;,Hm p3ᗘʔ&YbM"e8B\i$?dU,-9Nfua"8bÊ_4@zIMk4E0B d$ "z*;|[|qG bGj 28Z@>wZʒL1İw_ H؇UZK<_HkFJ"Q Y=5Sa9t"i@:޴Џ"A&PYz%K(vhVHHK6efjBR[i4U na YBj% <~^d`2.^KζFI4hhme,6G\ʍAo4]zl΀z;ŠߘpMÒ-(d$VOb[Y>o2I6T+|Fd` |>=e'Ѭj2bKx*˖CiZ/%ȊimsnW,W@FpZ+y_UiUQA:tDy瓠A^uG=B#BA:"nm}{,}6pKZ~g_6 K)|=4KR7oo r-#]YMTj{T4=j8.7]o.RY*E:!ZGZ؆ {^ 9՗yxT[qD o/V nnZ4-5rW 9/\wpGv5dA> ퟩ',XeܭX*}YO~[oHrYdjr|l顨 6.Q'SREjG5I-Y&b}'9}tT+ @f:VجB$\S EY1hg\>2^D$I_OV;kW4f҅yA_e^ZBH[x-r%H JHN`˪;]_b(B[< RU3gHu i9G|݊ n5,H5<ɗ}5&X[cVA9_*qu "O͙LI[ ӱ]#G*~ QSIZ$H_ &9<=cgύYTZ(HRJ0DחsNZ ,v[#S )P^9m}杪ܯBUzj!Zg cQ>ZR})DIX3ҹߑ0M:$H;@΄|w&Y{$0,v"VfF 騵`U*j~Wi6@LdoP*Y Z3۠j@ [t#j:pgDS) k{T>Hj'BZ YG`__iiP;ӣ4$ IE/=*HTI!HG@yD=8Hfݴ$X) :F(] ֱ5Eqk}EqdB A" ۟)zc x a6+%iLdHR$^=?UH OLڅ8mo ftR$}eI糳Iа9'$+ O-`gUTr.-XJHa߈=.=,8bEoB])9'^J}d-JNH7?ƌ(8)(84)j%Y%?+}ŕ{. %KqK xQk0 8ϲ~@#}giȦ!nc HysړF=/cElK*} ]R a]f'v†][,FxMBŲz$! ?؁ʆfHDVΣ7\=R<#=R{Dv~3N&>Y UZ}xRkʙeV,&OxZ˱`b3V)V`#8;PِY:[3>R)FHY{YB3f8F6 ˙o+b/֏h_>61[A#U`_ 9DZThn'g\RC9-EKE =9 *?f7v#3#K؏)\s~j!o[? dW6R[Eb:O%}PmtG eyHchfITYH~Mh9qXFZm EM[Ւ>6wdi5QhmAΆTҒ>6j{+YA.jAtD!HG tDC8u]2My38jH|eNP?,s,'H-H5ƩV!TT1AO'RT;uh[+RL[SDx(& fTtA)&H-Hjud*&H- ƩVؖũVwO©V趓pUo_?pU_?c9"#BA:"# xAm姠%Y6L[ta8EZH`jKW ;uZUac C1P"{[ }\JWΊTN虷劶V|# t/ˋLWL] !y: a?Z K$Ms k8$} MU$N@&1u&/0OaPP)u,,m.@=v8hS!!0#I+CTؗ[rS48ӄڮv>}5Smc 5%,;a$02VUO>.[@S"^ $SNYɌg2LUqɝm7ηoJ,9p{)E0?,if&yjԪ?ҏ;܇AXZ q7~-HlL1Bj&pTߑH1CIG|; =0 flg]w"K1ɧҰI)&R4T;;dA<3ЇHH=JxbU&4S{}4!Y%~&5^.@Bz j%#Bח׃ Q՛]<ʻs;T# !HG tDP Hi Ǔ/R!Ȼ)^GtF>@|x QN_ iŎ'}jc9H>|1xw#2M}dʋQ-%A.ޱH]pk<o6 Ϋ&#pw4_JoDJd|'nS/y(ǺGoDJ䯎eÛ_f9O"x[⧉ o)r/ Mh"ߺ)N2:ȹ @x!HG tD=Ȏ donݓ5c ߜY#BA:"#BA:"#BA:"#BA:"#BA:"#BA:"#BA:"#Bs9LT@\!HG tD!HG cƽ9qՉdǢwAv,8 ٱ)%zdB<مj؜|UGvFzBA:"E@+HХ@]-  F IV HAJ"{I吃IENDB`logisim-2.7.1/doc/de/img-guide/img_guide_frame/prefs-intl.png0000644000175000017500000001431111541757124023771 0ustar vincentvincentPNG  IHDR$ERPLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccRIDATxis88.@p8,~}խۖmw&臖HrpŤ 1Q2qԏHV cx/9ʫ"9n͊UǠ6 c$V۝=N]=G`/&"h@A~ыq]VyYœٓ`j*$yݨƁGX ݫi'`p vlɇ)0f V`gN[Je=l#Y(K>FDoeZ2˕@\TA/p:hw6`grDf 25>̓H<$&م"=/Ǻl&4UFlbtI)\y6|_H[dVPEDAPY:B ,a}wOG.P>R`Di{#YgS:9ady)>G+aOx } l2ML}^$ZW<κӜj-@/UZXVM3pZ^9 eį^j81?Vj59e8T;kd}aakUTlUe0ȨHZ=yO ޽Xj(H\]RSAR"@z" Mj$# O̴/{Ux Av@e¬njݠM]zuԧxU"-czLvQW,F[GY]O9xWÓ!]S"fx$< YEs$TiEe~k Ql^S9M͛?eM;1<̣̦\E:@fXkgb#kjgG:0md6Q9i/푩d{+srP} Rvdgto=60B HQ*T]F7;e| t Myo{nlRy3V5gU @!y"D T佗UԽ-rBP m'"~M DHOD =Dy=N}RdEۃ9b@/7CYdH @mk d ޶@wy8BR;1ap>sY*7?<$N>d_|*`Kuj/gv}cYr {wӱU%Bsĕ/Gqܪoqo ugGČc,o ߙ}9wdȴ:C@m>rTHfcU~E#rzm rM'whV`9>)HG:plQ#-Zmkt4jJ9tؾ#U`KNm8HSO ju`: G )#4ӣ}l蛝@ $| Ȑ@RV K KPd ;Q7*'"@z"'"AֹpUdY;"#? ȼc䕪22Y)WMuĄSJ9T,5bwr:^FbX#sb#G .QkpĚw,ߗ,j>R3Qfz\+($;!4jV4>Z##2J'ac_&U'+,5\D)Ww58bN#G :F"n`? R.٪>Rފ>Ҽ.;7H:)x&hUQkvU:H8yOп&nY5 `#ץ@F< |陭H>.Hsu쨕@>X6}"@z"'zb5.AHOD >d#$W6R:-܅ 3 db q1:#x" =59eU! m;A_0yo*"Q|[BqKt~YLpπhvGY* X(#e'w䶺O]dO ˗մ~j!Wb&:Cr9@ڎ1rkq*XFz&VseI qfvԪA,=>dTVYĞgA{r"/X!0 ]4HOD =DHOD O~-@ OְA v>rp=NG M+w~yUA2Ƥ8pgH5I`EٞYO \:$<`k"GK<'_>$~ nLݟl犯9s;A驩IY?&kC]9'_}>nm sg1#dW﬏gɇ{5viw9 !TրF9U0wW﬏i33jS@R|yW]Ȼ~*j@)'"@'= ] ڼp3e@֐ۆ2v(>ك@VۚVcw* ]q|𯶍oFA_@}5X?O#I愿#\cjT@Ŝqu@_%ϿW\Lc+=kΈzT/zhAG0'jC#aLH<ΓyخC #>! HTe0:tP o_9= 3KZ b9eg{SEF|YC^Ý}p@$"a DHOD =D=1{נd=-{PNTLHOD =QAM&۫˽%dk,4>9'9N{Yeu ɾܴ_ -?_9 7wQWu(~e8@`Ol T.q6.} )[|Nvd $؅AMvi{,^ p3ӭLr̰I'neT3o dw;t`nwvgǂ__8d#hiRsA;aŬ3S,Y n:5t:T\g1Ħ s_q\5kv>zf Vlcj\g.\s_q\5L3DXLYHGwID@hOU[D]D(|ʵ O ׯZDZ#>4$"I2@te:ȀR UW~+Dٺ?Buob{oy*-.e-$LT""#Q֟}(3ɺfʣ`#.t.z.mѵ苩b"RrL47tCb %ߖt`Ly]~):eBJ IFe*,àVw?(!%Jd˗Vq491@V,a  г+*"S.ڨ&dJH閣~"C] \"'%R+["C'Hk]_!2` "ӻ懱]8ʕQiF 0u.&ZDr☬tSNS`Β,d<$i +&&w?/٦ڨPU%tz[VfP$&Dra"}(·|!;ڊX2mBZE  [O.Y/'2?-b;hځgɉ+VFSRZRo{C$b-˹ )t\[nB$%o r+T'2DF&2$U]@'ml{}Ide 8DF&20"VMѵ0=e!<owTRDTxA"G n궴H%w˦Cc_n)/[Zh0F \WJr#< 0h1{/x{$FZI$ ֟Ȱկb$gMS?\MDNJ8OLjA_ oSuJ ^c'z_l^T;wOOl M`ܱ[ DHmH$H{dpU *Gd0 r6KȠ!l_"%^L3u2(!sTY7@;PhM}N VV&oh?leW::& `6C7^iȂO]Dj_u8vr׫p cf\FZ׳4ADa}[u4L^j{;$V=ݾ!qWjtbEaB;^z*=!Rש{27[tuD9ߩYwSi5хԌVr3_+?&Xc]eKHב^铝^5W8#u#Ǟ1{ !{0c MD0x|D*#~-)}iigZ웳.HǑ^ 81!CxuYPY> >~ sgs5z"e~#X(jK5yEH #D׎1R V؅}#a/pJVsZxS||d' o-47"gKo^?W5;D^LHL3 ^5Djůj8=/r\Ow%Fߨmk>R]~TeYrlm+}Gxuc棣>G mD.J$ H`0: Mq("{pOlDh{JeCVR&OEB'վ)`"o)`"o)`"o)`"o)`"o)8I&8ȃ.L,]QSGp? G_yr07&DVzSSn 8f_Etԥ;LҪh!#Օx3c6;x cz2yk{O垨dd9fzHLԡ6fe6D&CL;v&[{*xDY~W g s 'AlS؇[ݨv,rSx<[ѳ<[.J91SDV xܟ}ƞisHCch1ҟ<}//$#1%H2+d^4[)_bD=&D~/ɱk$EbC<t3n2\w8D$ rO9'Dej4oqi®ؓ]{s:lɪć9Oo rUNE|HӬ{Y9TĩL/3G&3Oo RSa" @UVwn%0Fx; ЏAOL寴?1=/}RU<űg^_ 1IB* ŮzczDqA|bc猑#ŤPHd>x8 qδX#ժ©ODB$DEdDF&20Ld$`"# HDF&20Ld$`"# HDF&20Ld$`"# HDF&20Ld$`"# HDF&20Ld$`"# :B1$5Fu-#g-"Nǿ=&20-)E{ڵwoHmjhHx5R(y$B hh~=o;#wt-@CD'huY$ݿȉ`9Kdi?FVz]ZH1dc.8" v +)YC/ʡ q}X`^Kx~?G]$5Q>,Rǚ_~ DޥczHT~X2$HHnr j#@^ipEz"u9%I6Ok>)ytu!| ,r Zz ]].xz{TмƬCHs{fQы|UD\wr.Oe괳NcNqR Rb/:Fm޷Ξ43Tr!p*h"gkdӹ (ZDŽ؄+)9Ŏ's:}tK5Z,&doy?FXUpc!c$]|H$Q #'dslFL9;i*zF~5I+^F-_2Ny|^(}`"#ى-Ÿ5_d,QAD޻}  {e#:ZDf/̎l8mbm_hy6TsJxS&qEYRlQ5{jgxS$rU- (Ɵ@aU>&ޟI}ٔzUk52mYY֓Qk ?d ji$뗼N9zgԗSCiRWKSs5S`n|9͠˺5wRT] _6ZLS%p%bnKM3ڠcA?ΧapH55?b;;(/=Ҟ5胣rJlb 4axj+xm*|CUgf6:+,ڮqH55x[)hW&"=S(5UbZDcZmïtUZO^)6;JYQ\Z"BT˒,T[8U@\k>Z6 UMiP*yGJ=un 9nUt22Vtx#Gu#/=@&INW-D1XCY*N}hJyggGA'kF&O¿ԦK $}B~&:GGē9%dz'ǷlN_sHϳo(̥N[gDpe+NP Pv%cC@l $Y,%_WL:-6A&Ě4ᛦ;L_i+͟{izjxB+/V]~JTӞdwye.wl ;Hq2CIK ى@|# ɱ!U/[;ixSvxwc ~@'8b- %ӥ@&|ّu7]#ZtF V1'o)֮ԹjȷTO}@\9gϳ(N] 2C- ;L2 [߱VJV Q#nTx0@d4ߩlRA.H@ھ ]oH1L/ItB+7pV\ʈܾ7=Bf[;u63Hj-- ]sJvC%Vwv(A=Ԯ% +yޡEF@A4);;8AA O ۜP~;~5FC~~|7O3 Zx$-~2׃gy)ީ@PO2@)G^GqW*#H?.FoF>Ε`L!ȸ4wꦚ͉A=xmQ^I#;(͖=bd;M@>+U5lZ˖@W/[HbJ,$Mz>_5y[sd鬞w`#ѯ5o(#kɡeH0y<y/֪Ϲ@C7٦A~=Pw$gwUpU~BU/hҏ;)Eukki- s+RU\[* zH&P?y(sg &$ȬV# vCs}&@C/Hҏ[(?|og+B˪)UHQVVadڵQ̳rHO}t-bM>@~'$^een2WKX jrŚ0^{hm$k(HܴfCX  A:l@swE &i6 H k Cu.c\P = =~bj~AvRq0 %~XA֗#g'}qpYBlT_jciTlxP/@-ԏ=výZ]K 5dgPNAz#qI!׳굲S"zsJ=R\b=M WZVN߆Hz ܖaD2_$G.U*֙b3G~Btѯٷ.3,y 㭼V뱈} T>8a#e˾yG|@&]qGV@ծUMtPɂ`#Sri'p7`/~|zCh3W2?HuˋCo|4α|ԝ:vFNϟUAP^Y HsSVZf}>3h݈z8I!b4H>N]ܽoZ#ʌf YR H}S=r nխ`,FcGlQ@i>b}.0Kw@1\6n#i1̈jV'XGf>fG;?fz|ߑ<PfF6VtHVV6^6޷w@y[k초P*[kmHһlYo1VHuo_A| mA+vʜT#P#SZSdLNE#vyGCL Ve}UЊ r;6 3Rj$'>+ݶK1qZJ3 $&GIN;=@ Ej%$lCwYi~Սs`9P)C-i?2COΡ~}\Q6X.̈.y$&G,>s^J Q}9j4 H8Suh4S G(9[rr O'ԟv02pDQA bثE!1r0X疱}a!Z\s8l(O)yC nxdCyj#!>oH۾^-jNHcZ DSS61!IM|g[}%LRsxxN-?wvbɫwin_haoZQw"SkZUp 9\y*勽ֆ A/_PdIA6T˥cUHKF[r:׆ &BajCuXd:%@"CrY!Pa4O"lq,6՞@vYP"OG h)|,~H>XCf[ܪ!V+x9GoAGJq6k`Ys5^[)6+xk'Ov>ш S= ,,l~ d\+Pu WHvYcUk Ȓe˺qC%,R;Z 2$@RW+x ]TPnNi ]TPgnNck赶_S}nC Ȇ+x)yZtc<CE)\dC[ETdsӜmh G"Ȇre6Eї$;.i(?ˇ#ǭ9F_rg츈|MmϢ[ccd˝mGxit,yqV_rgS w]\J=R ng.apgYb,<TF_rgZc=&8,:Քv;c j]N3<ȟYg8D$ye, 2ٱ/teUkAz+{TNA5Ä1j`Q0o.>m6n.sCE׻]3nzRxrvFl#*X:D3H!= xJ-1W(<#i.;b7 Cq4@k]H<օbF m->%q̊I=rav Y ҋF 22P{^1/vj dnD 1j  vl*(9Nԟ8E07)*x'X,Y_] L`67K)*x!HR37K)*tSaܔ8Pj:;i`V)*tSϏa A0 TqnCEn P3T A)8CEn P3T A)8CEn P. $@O;l)(!OYtcF#V"H2@&x I1&.L&YN.hSsNj0[Q 1oEU\+өtɗMy4^AzTT/]mH@e?&"H*T1RP#-+JM =t+Iul0.UyK^^\Qjz]Q坝/GDͬk:.ʟC*tS ! AI>ңIAzTp "H7gM*tSp "H7gM*t7X`MP}r_ČO8 Csu $ /}4P.p [8uP=Tu:WgMPJOs=Gv:WgM8ZHTspS AR=R:uP*@VS AI*z9*t4R*> `nS A $ P*o aM,CEn P3T A)8CEn P3T A)8CEn P3T A)8CEn P3T A)8CEn P3T A)8CEn P3T A)8CEn P3T A)8CEn P3T A)8CEn P3Tp C{>33Tx 5kUmp $YgARPIǯ#JzNG&GQ\ $O^*DK r>J_ѧfd8Ǘs "ȋP je+j~]'wGO5rp $- -Y:U-kT$6T I #oOM@Ć V$iDo{ 5";m+T 6h͛*5Z*_G{}J9CrL2BBDP\S'\Ag<2E\ P!yEI}h<8CE T(,lLC V<ؖdp2A-9JO7* Ua&*ԊfUYA¨T AAj/LM >ȿG r2"K_kryQQ>Qz| 0")6n + ey$R+97LpF+[1q qhbWh + e9%%U& sT+9Yj1ݫAF ?ҧ2 $*_#yVZ uÇq%HjPHzxH<26rB[DF#n#FFkXLZّZky;2u% QAjWY7#` U P&ȼv^G VPU e4'V1S3b ^AD % uu:!Q#Wy& D(<EgLAza ]Z 7~$p UZ+H"ȡ IrxR9t<)tZ#f:K&  !w'--'RgJ#s A.操޽*vQH@N1Xr5vuTkTծrjΙk踑 u7]VHgq}j0K7|9zk#%~r*Z,i-ɫumc=A3S`vV𭱃4YsJrn ٚBƓť.CX'fאvK"q3DR?NЉB2x/ki+ɑ]O-do":*'uݍŮXh,:.踙N|Wtz# 9+I<RvRH% |_J׵NH|$dN*@ZrT5E# I"Dhcר Ze)͌hP: ~0UfG' AJrd򓢍@ji U~5s G0P |\O6'dU t'8j e 륖vյZ0^UY]u"zaVrxR9t<)ȡWb7R>ti k~~"3Qy& ?.DTwy$9~M$s2<&;GA}kwm{F%`0tHoG'U?T2O?{@S%2DP(Drw}@hQ"A" & 'f tS8SYN竻Ęl[^B发dV^ͫ'IO2q)f/x%lC%(l%ywusdW&=|?B/vmi&| zT/ud 82aJ[2)]T YÈA$(aݷXYIC $1H"bDQ g_緞,DЋܜݕs@3raKGTϿRtAZo" r`Vcd[*@WeHvꛛ,GQS,[|jց:3\<8Hb)jFP.[67|9ɐU Rk~p5bHZxQneXmMtjM~.B! txQ̟?w>NËjeZEmE(ZQL8>E4Rh~jr}{ Ը:i[xx)R܆vY$E;ro`}G>7l.sMfs剒"$#Y_t"vb1ҷ& ȩzZ54kŸv -Օ\oj wHY^cd,i-ȉy@NWNDf]w7vomn/3brƳ )jH1g+LG]Wvpͳm{/7 xԩIt 57{h?$yټelP)zbfbHFͦGUUW۴6vSh ?ˠw4KRxA:'q:U_J6p]oTmT2\#uS۴vgi4yk$,7 4 ퟥdx5NB>G&,_:-Y &U}\ fxꪊ{g1M Əbt KƆNA۾W HZO|ӤB@~/n"e> \A R,6t aQda)HV(ID $9]ˀ,Yw. rp6ߗ>W(oeA ANA u.2 _CjY+|5c({; MBRPvW sٚ\ Tic}BH?JOqVJ ӱ3:#rc1a~XvuoyS(xWDͬȯnG`=;z |c~p萷kzT8 lМeY#q"ziw#zgoTJO+ łcHecZ2~J=%D=[ԘHݷD{ -miݢ{3 u 33\ߑfjVBz' ۏZYg;kնT;#QvڴxsAtX-ov>r=WkF'1Hȣ.i٣d .i lbˀ?m M#C1H0HbD A$"ID $1H"bD A$"ID $1H"bD A$"ID $1H"bD A$"ID $1H"bD A$"ID $1H"bD A$"ID $1H"bD A$"ID $1H"bD A$"ID $1H"bD A$"ID $1H"bD A$"ID $1H"bD A$"ID $1H"bD D%5*O$@$%5?aW֤F V A@H. La%U}M&ݵRa'w*te4 ۩uaTvrLsdͮՄYOϑw-f$1H"bD A)1Iye>Z%O$!ID $1H"bD A$"ID N%dK~1N:R$ID d f ԡ<:C[[}Kw aԋiR j@:B'm֜b"0H=nw'WɖA5Nlⶺ* Rw JX@A2GP Fil>rᮽ 1")C\ UL2onQ a;  Fb."8_`\I fS0Xpk.eb uy㬛#M4۸(m^l`7^2lf ("2`Wcmr18b(~ʆSI&N &SW1r)SFAHM%κ%\GkC6N7A{aahj :%Q`p3^/BTA*f:t?6砸WӔ^##M&-&#g8HpmOkU@ƊhH#c7Y[  t 0}*TkX#MamkHT,Jy5ł̿L#/+nlrG> Nu4~fi@?:(i BqT,pjy%ŀke`יsd X•#s)Rj@zkdV7 ͆}8HpmC wb w bMsd`^ (Ql'8)5kmwKiڋĴyRmck͏t<3,ڞ~8ۼ9&㑙5M2XD AщWSc?^ $1H"bD A$"ID * CO݁.:[9 yJ:=J/6rۨ[_xP'ٴ9HLV۳Uz A C2Iס4\Ml|>n OQmxղ+$zH3g,0F}uYCGMpG6ŦM0f>ƈկk11|Z\(<(އ"Qgbq`P_#cW3t|\;0~FF#\̅b@MЎCU 516;vP_Vk,"bD A$"ID $1H"bD A$"ID $1H"bD A$"ID $1H"bD A$"ID $1H"bD A$"ID $1H"bD A$"ID $1H"bD A$"ID $1H"bD A$"ID $1H"bD A$"ID $1H"bD A$"ID $1H"bD A$"ID $1H"ANXw+ dݱH֝A$"ID $1H"bD4.T^ڲqO mnM,kГ I $ymz=A^ۀ g_g5܎(/7HsjmA QVa># uGYM;9*vYv]2uCe>-JtP7?S6Ca9&Pw҃rh8̈́[6銩ju rwe*Wzz`ktIpH)DOK ֦!1^Y ca҃rtmCXh,82?V(AJJ"?a45IENDB`logisim-2.7.1/doc/de/img-guide/img_guide_frame/opts-mouse.png0000644000175000017500000002002711541757124024022 0ustar vincentvincentPNG  IHDR'PLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccRRIDATx s<ǡWi>EO;n߼$ V$'$@TRe C1b0d,E+ 38Qp jV:^eEU쨀2,׆Gi^q[RW3Gߟ7#wVpl\d$Y]؏zk-ؕrA ZGd4F^#MJ `̒1[n-ߖlǔP(c-|hy@JϒZa Y)M;B"~DĄ#-ˌfg]ftX<ee=86>d2 j@&?e_1Gq#_r+KZT F>ޣy&AR}\L)MZ4jW͞&_ L?=kl3Bsm%"5DC~~i)) ]9R[OaZSfYcTY?2˶L+LRQl +Xӆ~?ֲ*]L`eʞNӁK@ +ʿo8Q` C[Ce)YVp~~  D(KPEql񄃌Q) C2!@  D9/O99E(C91%g9Ay~%9ȏ79ЛVf%;`W%-ԛ.L@>U:6#eLA2KnmiOI㥫zs7tj]Q2QfA,yGO?z5;TDZiY<Vƣe8f&(X]C7٦A<;3·U-ȫVizF=ܸ8jnҙ5 R4V?j滜V٢)ɴZH fU $;oLeO  9_N?{"H?[(p+gw[ rVM e^>Xc\[KE3Ҳ\'_FfR'vd߀%u֤Non`QXw/3;M\^X (.:Β{ݙz=FZu0͆3D躞զ6e7=i#_S1 +6TvQ=4# :F2GR޳`gh0Hmjp\Hq:uZ/ f[F&pyA4k/I!T`Z66[Haj^T@~̞j#iS:J#H;Dl.6q&hҡߑKTJGi1.\6ۀV'_uE>I5xA>MH۩=6VAW~j@J]uZX5.n6MtI^6+ݯ KIɡ0.](H(.$ D2!@ANQ- D]HTN":OG.H|Ua C|ҷ} n|wMBJA,[ClR$8`:TClzR [ =rhM|\0-_+Q\ڗ]5NX#$Nʬy:R^厢h`KHt[~Ln߁^%Vq[^z9cU6*"lvGɜ9&-t<\8&i. 'BDLWsѸ#ogEy\˙aCo(ւ-!n?ofQoX KY*Q)k3{<[Ӓ'00H\|7/Gp"d{SE8,{3®+(w䑤@h7 >_?YЬ[>j5W1&G(%e 7M \i,bcҞ*=υ2l$Qh:#+X&iMx|wo Qp$<ٚԴl)Jn,tGRD"$k#WpN<+i(} Ú$maR4޿6ܳ,e~g9)U-XMdd;aX ڳW@ӹd9Lten&a> =H Tޣ*wx$U([MwY#91dvx[:ެ9jz@VVIYG+̙:9 t d:Jk·2>f],Ck0ȶ`fM9+HGÏHcW @'q5i$6H꯬1fr[̶q )ƍe\iqͿ<7H0c Uh@ڕu[1s4ӪTAGmߑbY9? $ZON~y| ԆmяAHu A2u$=gdmƎBLA fro:O @-dP[GYtnvtG6R֬l.Gn~_GI'Y -Z1 [Ze)gЍ{mD ʰpMy,Aog[?Hߑb{?Ha_kABA"d B($o%=޺M:rKCEqS}=p,w| 9 ȡ܊Z4w3_Ǜ[za]_}wيڂL ^N}}H݈sUi,stS@ -HZ;[dog-H{@2 [d}=vVeETցA"b n(NɎpHY8r|jH ϵֱx 6'_lב )K $IYb<DU%<.eXGV._rn|4HBכzS,4X`#_S*=}lK#ARPdM 3lKBII841"Ѐ2gViigm*օAؒZ \mcx1 I9YJ3r *Ȋ܊0}b;R?4HYZUV:|wsAΓIqLVM0 W]ڟ (G*Uz~.U[¼H0qzg4Cv'9}@rX+` ) o@q ܩ[K0T} т<>Cn`9-}Aa9 _G6`u? 4C=Y 9X _FU7/Oy =hXv Aq(c@k=?d^ۂlXiu?Os< ,7x5"LgYy!i-Ha Hs-A ,k\|Z] {Nk0H!046^gX8Cd!@b -}=A:Zk !@ QXCgBAQ,J 6P:qp{~U'h#:K^km] ,9Y  %Y[uA7 AZϬ6 eXuA~B.\b`55O>֝s tZiR.jK!ز_O>֝s td Rzz5L랠}(mM$)˦'v.COnN[s tܕGYmm9ߵO>&V3OAn)igV3)YGukR#YS *a3x~ r AH!@  D2!@ S *b!! $@~NgS;+j8K"ߧV$Ԁ (?Z AB 3<%90Y0%_,aCi|AEk>Go9{l/Ty!VFIoJUUC7|jm|H PZو jA~ZGu#44B:'/Se#446R+&Fih+;W,OWOd||-b?jdAB!!!!HA@Sd BA"d B(D~~]q Iqn+t(`Cg—"d BA"d BA"d BA"d BA"d BA"d BA"d BA"d BA"d BA"d BA"d tƦA^.C  D\/䥃 A^:HJrDd}mdH ` ŃA6@oAydD3n A^G:ZL /R2@\E&H#h  ):*BՒ@.*yF="HK 'Y9R%}DjAFbi =2awd dy ڀ" Ճ v&!CeOUC ^9TՉ:]0&ʏHԅ A"d BA"d Зک:Gi\?R]Cp: ΀'!ȡ3Ir x:t^Q&t퐈AʽX{owVCF tLp! ;q\# u.nk5/d\p8Z: dzU:CeǴ,_a~˄6 YEOi5nv=WYJ*bs:OVҊ紸yD%w(,gzk#KR9͊;e"iiBBnq;ene/W-egiq#*ȶ82G޶4dzIK]OVw|)CMI^2O&sJ4/giǫBq0%7ez;l_1y*UGcLdv<Epu{d%ۢH mFd~~HV#AO[dbHDh \u~eMQHPSGF!ϥѣmg¿fMf Iv#ΊF$Lv'f,bSC:Se[JH*>&"OrDn ҁ%B l$dS7 |=|NrRj7:oL>Ekʶ w{n7-]7~nLT>LoqR藭(,U?um)#]@q&G|h!ȁ6HFL9Yĵ`(†HH o]ROoD׹uKBy*^c&|K\f{`\\3_do4;ѳ~ g(DVnbGu:gm6CS?ҔA01SS9rKu6q|f|1lg[+@ 6Nѿ3R @K2 Sdx(9\rs`&;A.ZgXl"L6cS!-(Ck5p.S*"OkZqon*#]@g2ȶfrJg<ّ(H';*CZ]+@&/KT9x=6UF#]@A4i';A} חXPگAChϏL12BeLԲ"e!VC4UvJGT@VGk~+UQ` BsG X5.U~PL(ȫ2MHHzJD Ko۠Eb\gAw#o17!^-i&ɻ /)./s52g R&آæ"_69>TY"P,GfIv"i->ݪ0 Ƕ~*U.@[ _pnQ2kΐB?^cu,m)ȑם@~2xDd}6eZ z< ^㝢#),s$79bv_W=( 1=g]QC:b|n2_S1C1Ԝae+nS#8:Z-i)&k-ҕQ.A"m*=v.?fB cC4yNVuڿ0'ci(d8FVies߈i e0zcJG[ :U3F< u:;RNR{du=T2W*q.d2ijVU'۪"_?E79 A ,UO }~cUpZ)oMom? s}8j t 0y*Kw R,; A$"rĺk֝Kا֝y]z] Ѯ l`6erخ-n)k<`}y?ymT w "[8X@:v+>aX&ٵ-2d|^mel+(bހ'_dE+m۬fWh]bNaJ-j0"] k2!Hl>TuO߸U]!kq8"Ldim۪4nSQNJr _W5_ e{DK`Psj\ٝ"Vzn;wKzOVzstV:ܽvAǛޭ$w=7۝=}"; 햼xCsnd;] ;щ킮D)Ѯ]=AvSȘE.V3Z-:e֪6V{i{OIDAgߑ (ZDfw=wSҬF}]~e ]~ "bD A$"ID $":Ejyj8( ꕪAN,Hu_cT%ӂ,RFDTN[`pƐYyTr4C##>9pV64ƽ@59LG! n;)Ptv>r?݆b EGn;8@Wι Z>U!ȯY:^RgJg-gemb|~~H2HW$ NHuLR~G~=վSʁ W+;k A j,}]Z'UjQ׾VXD A$"ID $]xA zy- kpW%? $c?K Af}#h(3xWdj͇rҎWf ,ҎU5kl]3ҥVj|%s\r oo+un{Vj|7ev8 en}^WF$h&Wp;[aetX @MUqDX"G 5q,D@1ҬU1}ZVߑYLFjX8sBV@]}NR?teӻuz u$1H"bD A$V/U۩KtWYqoc8_dJA1NQƛʸZ!){j;Yٛ3?%Ouc NX-W"7Ӕ',v#b E5ZJm/ARv?Nb|A7(vjIVMWi**9Aբ9_12tR<RE8NX?F1sBRfXÛ cdd'tH6Z!2^X;ziY+;aLH];_]Z$;a5""ID $1H"bD U OH9uE7HުR:]O A\݃7+Y,Gi"{̲tŮ5^0JPF 蕷1ǜW̦W`lj+acɭXy5Z ,EWn+o{wQx̉} ~\2loeGT$G.gNz\|e||'(ĎwǜL1WҎ6U$5+X`-׈U$ 2Zq;^tkHi;Aa'*kWh1s"MrѵHĔEѶfV +鱰V729~\zD'IU.ɑĎsk[JU 8QY+hH&UV$GNb d b'Nu؉s];Qu-ED $1 G8kt%A4?$"ID/\>nG ]x$̿n|Zn0OȢoX"H~ՁTw&H[("@r#v[.p̐Y(Q/[0s7Q(м/ ׍2ݧkՎ%WFre}ݒr`gtt{VXlWWH * H" oĿ#YkH-(&7jP>e~GGмZkˈA$"ID $nJpdqnmidnt|&;(OvA$"ykżNR /KҕVYn5nd?o)+X=KPy*,k,H%p/9,kW--,s,5:ՃD NEJo2Z *W#Nln;d,-:(]^ V:Jϗn4pFu[cU'}I+GǏ# тΝ {Jz+ڄh/lVKKeSߏ6r | {lZGwPsu3X'ɛx>A |HՒ+YTQ6! [4lbS?[nlwR^ռ%q/ƹ2[:9O{u3Hѳq }'ucM,&8nԾ( {t8?Z5%c7Zf:J+v_г7eDyȁ[},R(LqBwbJ,b֘E{l5"W#鍑 $twfzAT7F#oMdy J럖AV.j@/19OY#}E-[k{w.o*j}S) Z렴vl1IdꜧQ\ߑk}EYu |C-b -b $1H"bDDDtcS4dAxCD $1(9(}yȖm5*d͚]pr-Ȫ ed ʥV 쪌a |׾[|ruúX!_5{ub/YsbE/^MjBEZ:x-PP+$NLܜf^Mbm $[/~J]H#JڐuX>^{$tYus6a_mcf J%bNtUF n?FNurkً@̲,(Oا1:uEr{tjUٷH\LXJ }j;aot1P} b4+()w*cn=5 A^ e*W"Ut1An戴fa|ةygd"Lx)cvx2HSiEH(қZA& ffOEZM9(y2_kXrUf]J $1H"bDDʬA$"ID $1H"bD A$"ID $1H"bD A$"ID $1H"bD A$"ID $1H"bD A$"ID $1H"bD yIYleQ֍@\ $1H"bD A$@zf:ܺ-vFv'[ն +В+В+В+В+В o||qj9Jp\YO$:%_QH'5 uWNZ-B NނE ;Z`rvfׅ_:̆YvD̻DA:]L"8ޥqvzLe8Ӷ *Oj\蒫+В:#$A2ֆ&1e Y*„T9+e{m&B+NYҝpd}Ɩ @J3 : ^u8ɋsDjƭ"JX12LWQʨ# &vL렮-3j¶P}j4X;ј1(1E~W:( }yIofow3P|=n{ST_X^nJ# nSuFQ""vOL=^O_HGߒƓٕ莩xo"*_El(tz(BQ ȀG({nBb& rfyP; E٣P= E٣P=ދ?\U|ɒSXƕ! msj\ART|<7K*YOZnnL#n$ Q|ՓVwZU-W(MTuYo%NȮvGD,OH˭oꞿB|KMQ/C^b(2ay~cE=bpUmVziTD7*+oЏ~{7A}LO!u_g D^fZDME_ɵZ̗ Mm^, UnC=k!/oԁunnRSSEcVWj-wmrxfru$W1ۻ˽APD7N2U8>]Fµ6YrBŋupfGWzj^>R.ZtiR(z\'#Te݇y"f ^7Ej t A,ֻ":[w5dj#Y EZ~]Vnc׶=k~]`t{Yl:"3_-`5ۡN (u)ų7V=/=Rٯx6;E77L|E^ EkQ#ك"YU*swQuq;k^._BC+Ee(jWZsޠTk+mkk_;p:Pwt/\ *i]=(EkF٥ݓ%*Ej9: J^|> >(E Q((,"Y-,E*_1sWEj84~NmWv Qԧ PdPib$5 E1Nh^RxqiOxKSZ\9˼jJ%"(89i3%"PtQE|ÚaId?(fН(QEb9k$i+;h;Mc)[sMQNca-#$P"7e9JFj$9'=/)J {)R6 4sL( Kۅ#(XTـ#ֻD"@W[ ,q8a =ǴKҮ1*E|(v[Mg|t8W=i GF(ӏP0'h蚟SS77E~W".%)t|\Vg&Elkz$Eo:'Q?&&RPb;,ERǦ%wb\ItBlI"e9'r{q3  H";`gD(/Lz`$? EcB A({"|d+;~\K.G'l(WVSDQ#C=~\t#o1Ȧe N֢yz,t.A}+( >PLxHI31'!B3AQ݈'#g^|ygLEtBzxx)E;1~Y%`jDnK  (%\"3ǵ^H(N;E5,/*")8.0܁u0XO|bCQx}-1$1eG8J"Ix%eO|Y:8a(#JCGZ>"vS?48"E5869:Eq89A Xu2vY4SW>cEh(cѡ2eN'KRvGっAsr](D({Ǡ_/)xOL%㠡hP( SQ$яN>DL=0 n*rIF yq8;)jK LhhX.So8; ;:Ug (JP/E0DNGHښO{z%&ewS/Ip{%d7@6D.u %2.I)/Xy;0'OTeBQ(eBQ(eBQ"vp>*AEϵ8#%y3H }O>ӐHĈ rᑼ z _BiJb9w[#iJ|ԅQ?/0-,岦E2Qѐl4QsD9)>ƥHƃ?p!#\"F3 d$Dtxprc^Όp̈́Ą JAo~blKl&Nfi>F?<9YۦefAIB)ʜ$-8JRkL脱`k(<0"B'; XB["%YW(PPlk9ꂮ8H6݉`;[a++S:~f0;?LÜB# Q(Q(Q(1":-:-N$S>NFv$(ݝZu: Q(^C([CP/=M?_K)uwjgiq_獏ӢQ(CwV H3T( `-e]qQ>қTERdԟRg(-8Q(Q(Q(Pt6S ʏ1`0ơS-LE-gEFM4ߪYGNI?B3UL&㟕z OM{FHDHV¼tG91h&%H%:'j<͉ocE͍Ťi1,9Hk]kQ}]z{)wn_oKG}iV5[}S/f]MƆz$K]h&EuMSI5ojO(E>D'E8(H* uΪu3'Ѿ/(lfOiNhF)z^%E}7Bk:"=) C 9J~E(vtPsdx QԳE]Rz{*ц*PL "WSlQ^E`h)&Y]YAkJMmh7m͍ovMeF@$.5ChChL8(5(0`0 EPtVG0Pty8jΠcIa`Q(sQE,y-E綢"Y/mHbu˼ C6.P~khIENDB`logisim-2.7.1/doc/de/img-guide/img_guide_frame/bundles-splitter-circ.png0000644000175000017500000001320411541757124026124 0ustar vincentvincentPNG  IHDR PLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccRIDATx{wDZ{tjV9˧:cv &;@BL9*Mq?RԜSy6G1Αy;E2A |A$<QGyXVw(HψdAVCCugAA<wf叞ǼK<'vGepJ>ǁ`؟q8&jP^FXo"0q2މ o{Th0gO})IڛAq39ދ{m"_</O_ ,I krx1XD2xgOs"r"#r"csNeXPMƞ$dqKS=~X r_7|'!}>hg"቞R`< / kxF-1"c4(1#FQrڭl{TlnMkGҰf w>/"۰dy0w^*کxڭߎ'u(&ZzCpϡ0~"$}26Y6dKҮpY!kڂ6a 8'cbo.Y M1 #5 `LJUDP/ :3-bT 2d:?ٞƴz Z'/UrJ۱1^:A:D@ƙX%6}Ι/q{o62-pk36-K d])/Q }u.1'ΌA_]f܃wRs >:s.6z2\Ϙe \Ƽg@,t}|xs61n}e$Yze2cPzcgg,h;ڵ`?9mȎ/Rӓ}7E=L.4S)tqUd1GׁKn9}_ގhOfW^a*lZ>yv1Nr m"g\Ȯnc5Y?u9rR/qY6RKw1jX!Op*Y;xJT8y!2N_8} x}1լ{Z Z>҅qFqiVt4|l̢ O^r2^n7Vװu9B''lXp'ݩ^-U0FyxV{'Rrstuu|8ߧyuaWu)y>=qEWU%Ҡx}/U/N4W,ydlarfofk+xQ&MR_٬Tww+V0ANVU1\,9kedj-c^E<`u,Xç(:UGRvE֪Y**0T|NS }oV<+N1W۱ɣgekX7ر]dc\}{}br^hNTWd`<yleVyMKz옟.'ݥk^+'rnWWxLQul8`KHY91P|6_ _,B+\[jr8?bl?;>$c{U8✋Ӭ>'gƎMc;>c.];%yZYvlXǕ`|^sgB@#e+d = d,Ed,2Bt\S1PŒAs; iOHxiEj9^ї&cV nlYQP읚I~x(>lʓ'BW6PbԅDŽjڤ-;횒wHeZֶ.c>817U'W7Ow"|nstyNøh0WFUvrj;/ҨY stn¸Q quZ[{a&뇌+: +s P`Q3͗?[mywaoz٪>NK\B1:ZZV͸EEhsIm;˪qv-`oS\y,X# |ν2!vnd+? ZbfS\CO12ĜkX QUkǽΫ9;3c9&q4LjDx},is}(9_YIWSZ it$2N_ 3lj&c++M.d,vqBkJk T\Xޟ\Xޟ+Yυjf\n?x8.cZYBRq\X֟kxܯ?2܎BR\<4\XjJk!Zy{ kbeyS d Whv-``q?foXoPp n59ϐ#T=:uCsFag8u!cZ;fmR_m1>é Cs3N֌ N]{Ї//;`˖83NP\Ȍok {[&+ԅ^DR ߓ@Ri3W3d0㛜"o\ 3fbDx|͐qvqB+5|>G0&upgɱkdL 1כ&E.^F;Jk!uMY+9.ڱVrDc#i[y/=.+F~d31WǯrF~.EX+1P X; c Ua^;cj##&F* Ԅ1?rX kl~}oԄ1 7UcuЧdⸯqv#w1v4`;#`Y0 .'}3v i8>xl5]^\/UMƺ E>Kqp-8{8X*tVƪ _b{=pd5f v⌋#[o%ƣzRCp53WR7Cj`ݱUʸ󇇆겔={8މIENDB`logisim-2.7.1/doc/de/img-guide/img_guide_frame/bundles-probe.png0000644000175000017500000001351411541757124024453 0ustar vincentvincentPNG  IHDRPLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccRIDATx s8ۆESHzd6O;yZh:lٖ|Ͻ[,tGeYA*]_'OT8Y&UF)gxrAP(?Kd*KJFҰ_<_ ա*sxe!I Z-{7Nl}T4<HG)T$j`m`xE9KV]kIyއW2ӒT]N/ Hy@?WVhsr'>^3ǒG}Y< x@w8$k3Υbsm'S&2$2)(e}UܰK GV@`"IiC>$1#?y_iNMc DD>p2'=╶*8d}rSf@U[4#wGbdA?$.m;BrOŋl_iߴY1?I =8nQy{80\flꠧ]_Oe~y0+crҔ[цZ:$`#U)3#k,JR3&7Oc+O8 s~9)gdۨ˦Ho'y{ݛ^BYߔBI6?M9Qx\U:W2?`SN&eYSv]=d؟c'rF9('7sykRN45m>_f$%bYsz8rWbSZ"vGtd#FClXt4G_txslrLR7e=CΗ ^o-bEG4 Glk| ͇}tM[nRl?gM7ݑap-S<<_>(ar#wR42~,2[s=,3 'LQ4C/j/iQ<*@f'ʛ+M\fP&n)=zv m?SWCjE%a}Su"<)G^(C3bقSVK<)(OA@y SPW7_CͺŢ5-l(!C%&"߬A"9ZIyFwŨˉ'*xӡ|ʳ;WA9*+O^knt۟ODPRL5ʬfK/\zݞQK ++?7Hs.Ob,Y%42y-{+1-UZ9˖J绶rSg/lV(?:)E+0UQ~:0P/2S[d7J~PyyEFaI>lC-T>,*G,o1ُt,TTUp!ltPڲfe%kQ̳9' Ky(KLuY/ЧIxy;2Wח1V */jl4z|UcjfU`\); Lkzޙ vA1NJ.e3GFoQf=JbԯK~{]}PDX籫gR&]sEFJv o2 <iKJRƠk n hSW)]E@y rP.s#T3 T??/&e\y?*Jy.'O>*5\9ϋ u2s•?'; 5\y> &es0 v*e%)SVH3\ )cH]l:m߉]qFFV2:q.)Ԉs6K(3Ȕ 器$p֔m1 0)Ȃ-a&|^X =G^n̼gs 1#˧$23cA>EN)x煑2Kx(=&fPvv0 lڱme<͋Mvʴ(/3LekrpIo-6t̳ ʟ.%O1}=S1G_)KʏcevGj|'Ep'Ւ wR21c1>YfER*\cSs< g"g?.,hGƔ]CrAVLA@y }SԝoLArotkwyF|I-voEqeU(!5kv$KJ9UUrVݨ(]1r<]H.qR^d @Ϊ,hR.и7nU)mǡq>5({Yu-/Ҕaؑ:'(1x?o̗m6XԔ]v)P֐Mo1Gv<?kmG;9!0jj![&y\[(8~wplrSyWXCvQG7Mm5I]6 s'u43e[j[WTq5_f5M_FvK~.E5'䬺YGISۊ2 ʟ -h߂83@KΪ<)'g 2 IMA@y SP"Pփ }t̫b]. vE}Ə/^у)-|||!(Tly2:rkAC?﹥AjQe]N N8eUD }Ԗ-?H>z((e-ziPG1m4(˜*R>fC[+9mzir?3 XϤ ryQ"h3PV"`˃V))Uѫ+`50L !- ՘,Y.kA`jn;AEjLdDP{Hp~WoSTV([VA葽.\ы t-~Y6lvE/*PP~.AwbsWZ^p-ezn>hWE>~YٲZ,\m(貹/},փ?s_ŠMC-5 ʨeg$By`[t\r%0{PZYlͨDmYמF׀r8#F7'[hw$Eu(7 %J-]arajk+Q.QfaJY?\H\)ǂ}`+sBkpkE.c'W/[6e#u =&RdXc_%ALJY({9dPoKi+f/c0NS|yzX۵Ge+u04tW e4 +زSJrߥPsJIRp>rN) /zk#甒\5CB@9@a @9@cl( (OA k(@Wd@l9P(/Y,3| ܔ*A,sT;p{v,1=Ѽz;K96eXoI_"zP.0#Χ?27x'r]+Tr\ 77QGS.-EҦhz>#UO5H*vJ|G⨽5MvCqT>K.$t23(~&F .QWEM9(JDy IF/PH:asBytH'Dy JDy JcQ^~] MbU>ucJjDDZ- 41|#uTd 8A{q<0Xe-թLN53e|N dц2JZۋ{;d' \knŵx>(wllV]ʍ Z!چ+Lu,v6sTl3e *y(C-s5Jr`*w5吳TeW)4|7{h4\a̾3- y2%/ٻTF̚@/.+8ΖP2gU_S.7;ns}}m%aS_0%/{ie'(d4,lygwk(8XE=AOXoP[_f_Æ_.ȯ|!GmF^y/2eg՗yևM0jewL)QO\_f,O\Վ΁]leLΫˤj~9fErVi)\__52ce4d̾iQO\u}N) pu!cG%/*fr>WJjQܔi|HGY|>V)/F\VV2x-I~g"O2f bWNw@V2x5;3l:1yQ+uYe 4<@Y , NU&/K|^(S=|ד}3fcz!(Мo>%)2,y^yed weNR%&Q6v a|1mrilsf8dSS/ؚQ|T ̳"'PZE0%SPZ7SP<_LAr߿3Jվo{F$e{ܛr?D*8e0$__i϶gQQ۬1=6(Q8)牲UWC2RmYQgU'(_%Ia7/ S%5Qv$_"IP[뀷,,ow@IP@Ss|割U',S@J`xz̶x]i^@V|lePN~psle_9/KDm+Ͽ UߌAW);{,݊/+-4}B,# r >Ֆ`eQS n2V]# h$pyXY՗aoA |$c z[V&c r}+=)(Q)(e18DE1(y]Js_{(S`%_V{>H_cnt(QV_.He*kOF_CU gwyіUDLM]Ԟ2#KR[$V35QvQW|'Q bji/,ҠD/fҠDŸ_\[*Cg<Ż_'[, J܏cyEZϤŜV+n1S%NS̉r"I  O$ʡ,%cL8wAYY}u!euψ)c`^EsȔ0Rn e5zܔq̘/lo~nu7`X1O+LtB:zzߗR,e'Z_ָkBjtm4tD'c$_"͔D9vzK*F ?;s Qrj :P~;\e(;Z[PQ#јHhzy'ʫ9>V,;O(PB_GIv`&_H1 M2eePd%F7円8zZ}˳j1c3]~6eeD!7keoLypfo], rݗ/;04(WDZٝc HR1^eC|ٕrS!~T}|YNߕ/Q1thNY=teɳO4{EV)F%$M;Xf*t/+~.S)f [tL*X=&6̵J{­q2jm3\K1)keуZ+ܗb4gidqR8eQM(vBǼ42ʊ|Sz(ytv-<ǧЍFW tr5}ϴI>Z;ܗ!8{}+EC2M2HjT/8!bw_wK5YjqKYm%.뾔~,ݑ(4ƐƆ@h\w&VF+jR1btG\S}r#q0Jz, %Ƨ0)V wXq(S)߰*!Vvj^RR9VoE*Hp#DZ/ShvG`#JigHBYZ<(dQ֢^ RSsfՔtR,WJ1e u헵]K^i7լJ%қZ`B RVS;e939e˯,#"@*lլ^Ӎ|*%ҙ7emJ5ZPbHQ)cf+i*r2e{7e1MW(xt qd[;5PG\/8)m]e徍sP"Ґ['.2N)1 fC QPk5X*r@Y2.QR<վWd5@yԬ 2&_Ԭ:4<6/r4v*ۗ9e43R?QP}Dr~8gpg9/w#ena F|䢽eؗ_@Yie.G0g*5Qs_@˫zGOEUJl e.)+2V$ZȮ{% -6?ɷIua8/KY|No(+$[tW/p||~Y2L(e#Orߪ2]erYC:Ù|4|"Xm0JccB}D9~o% :32hJRVbmuO*Vx)&Ro+4[e.IfjSZg]ydR:G O^$ 4aHit|][5_ IENDB`logisim-2.7.1/doc/de/img-guide/img_guide_frame/bundles-create.png0000644000175000017500000001351311541757124024606 0ustar vincentvincentPNG  IHDRPLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccRIDATx s8!Ӧ|66m'!un# B漻5$1A9Q:WQ2A穈rƔ(@竄PN(e"PCV*oʊm*68#zV QZFjK_UOe_zd)pѼdKf;kuSL-HWRHħ ^7e.bJvR MLZ0>ޯ6 Fyd)k>,CDCO("g\=\)*RӝgYw^v"DYH=B|`m#62C>8$ωm;LգPSInqT|zFGڕ?3+s9M ԍk2' ;*VBviƬ=<=<47ixIY))I;^C˛r@PZKS:HPJ>ѯ# e8 Bwt KLsO9 c:X͡R ʶ'~6 7A *娠F.Ηx%.H]AY%w+1)k=vrb3Q2!:-:/2RVg_-NOQW3b]FϾ5pqTj+K~f\(ٗZʩ)vKMʁζ)1C W2rG^"nR)|.(57Q(>OO9IT||Fx˻F ЎESI]Jܗ8^_6Ԩ]vC&⤔KJ?K!,t6#)~dΆr(ˊ" : Ԝ4y-茕/Vt3P <zEX"OTŇOyq-*4{TfO~ӫTTu1Z pC }TdzrjբZUTV^5;ezSjԊgх2IWE'\k:i˾g%.n3jTʊddZ^r5O/.#&+4SZ(˅gQOZqL٧%ZA []F1je9 VPQfM{BE#w!l^ZqK0S1Զݖ簾j +<^:ԼҖ2eֶgٖeև}0je"$#]s{)V_LGHi_9L){S{UPTױgRCU&J gM2 </A+A98eyˁr5D]8htM* (A&=qMXʣPr㓔sI/+%Z.6e{<Ԋ٠/ yUxRY%ʖ1G0?jGYlrz Cξ,YȜcK6By))cÝTO*IՔ#|[aUP5H5Ϥz[<^ g"ՔË=HzШO>)"'xA@y9 ʷFtKyet+1PvS9vߔ'Eyp/0 Ƕe7/^E (蘧E``&By8Uo+xK."PٗyĔRV4Pn#S)嶯nMhH-<׾膇26ol\:z i˭6׸.IM`|=2RΕezǜTKYKM)=: eH-zZ0ZK e^%M򰘁rH勘E9*i*L"ɇ̞%|aFʫ$rN&WQN~U]0k_4x M9Oj(a8l9@C4}[ij s5V8.щ(D|~s0:0w_#%lˣ˽vSּo>dLf-*Q֣Hx^z&}3,r[2!S@A)C@b(wG/e'SP5#g3.cʞLb`ci]ʸBjtc(_n֕r(Nߘ'0m5Rm e>u)9P{v}tO\F(ɁvR|l8z aYmOarF{nr[RV7qOSƈ Ay7{Fvae[oc&5Z_F$=%&32 5rQV﫮~H)oiQc656PVϖ])7N -+㲒{8ʾ^ YqSd̞֛He25yOcgEEjMLq_)slaڙ֟oD_fYPڬp Qb2'GY'S.ڽoZQnS41Z;ٲ I;!Oԭ.y>mq8eg9lp͔oƢJ>k_|T- }iHіGazlq U7Zs9ε&Ҧj~_ܛ*>Tj(WyuV8(WhY0j~&`->e4MrP͔)3eˇ2 v ȑ2}JRF{-=~`#T}uSȕp´u؁",JyD6hwRϢpxnc!B>_V^ [S(e3r]rwcƖ25Wi˱rdeqe(G3.OV R/9.^p`T/is$\ /6V\969Og˹cOS»o~echne@M@yjqGQۗ+Q>TEYOeL0q¨Ғ2պ"AkEȟL4q%dat|,[Z{IENDB`logisim-2.7.1/doc/de/img-guide/img_guide_frame/attrlib-pin-attrib.png0000644000175000017500000001553011541757124025422 0ustar vincentvincentPNG  IHDRPLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccRIDATx{wIsii~m9gd>U7QIT."7 n TyҩE14b |NW9'ƣ GD'۲AD[yv[W`tThm 6yS!i׭ְ6 X@e=Pgہ}++ I!J`mxB9_]^.o<"Bydz߿$(*lF~HSG<^{t/m;B_+k#YW&7(0+8b+4l|e@z@.?e\(L&Bl (:Ĩ i,>JNxd4x:мMU^Q: PYf2FP0SE@ݶ FF臀$nK*sG`m璲}GA?1I3ݕ؟N#PؕJW|v[rB;/PYm 5U[ӆZ.H.ز%՛fsQY62 KDm?jnp~ծ@ ʝW+r (D-A*啤z,h?YqP.Ng{@4"j\{*7aIt՝ dUJ9) el:{ c+J9ep W"i )WNv([d\ %:«ҝ-vz+b).:Co9bâPH4[4{ܟNLZ8,}]|-WKArs2]0+> }mLS5pP`_I巄?˝ލtDP}B9wLb~7l +CYVZ-V%YDSC&ؔkѫ=TĐ:%+~ +k ׃( ᘴʲMUX('D(Ps hNXxgI'e|JA9(Q>%cQ^k=h)6P=MD4YCE8{HyFwݪhʉ' Ќp=\-a(5W|/J [zLv߆cgQl W\сegMIˎy 8}bI>r’._T,Ϳ XC6s//Yc,+DhjebT[.aJڲqiy:SvLzޙ]e Ǥdo/-ǰj藙 gxv eV!-WytgݖˤOo+P-Âte,ĕs}&[.JAYEVo42;aeUE]_~1&V22~i6t5dZQȑQӇ2cWIIi9-B(+PK,,eQ5ylwjIeR.J(X/w/:+ﱥP7/l[Q4악!}2ver+p3ț-#~ȱm9&Yo$h_0K61ƴsTr[F@~}\^aͷɾI 2Aʗ&g9c}ɿ)ػR)W+] (J ?ݶ/֋-> ?4ReJ :aU[t͖ݔ,@mr~gA1 JYKۑ1mĸ:gaa~59y셢Q>#y Rj+tͷ–ԓ :nWR=EȎ1mYb\ |L]MQe(yXWLʦ 3z<|f [la aF~RH|zX֩ªj~0VTF ꫬʼ;)lemu3h?J WWT}Wy lb:esmKMrؠISq`$;(h W`7en쇲\b2#͠F#+3;-q P$h$38I~c/bI{@n&j?qȧŶRiCm5sla>TW _;~YH^\dzY3.l o:TeO q G,jMS(+_Pbd[˚K/eh^^hyW/wtx47~J2uLCWR'cCȏ<|/[gԘ9J|xS_&QrQTE eDly1޹/SP䤬"&5Z0eB̍Lr}ܔhCKe(KMrU㭟Dz c|rv1m羚(_6 t#EK6ʭ}3(ôt_s_l39.e;(-+&il>=5[n}c}yq9le'isE9]/Փ 7D9\}<MYQ堬t(GhNHqdF?+<· .ʺ?Αe(m$ʖ*/: 㦋N/)Wt/@i.MRv7I9&h-,Obϳ7KsbǠf %)2c$r?/b)0-8f 27ﱾD>mbr*rb۸/(1u8.lCvQOՈX]EO&N2i:+i}ӡ sy_0 a[+<~=P(ߗ߬Ց~ʁPN2,VeUD٩ЛX[RU۶D*ߠ+3)ǟAݯvq V.FJLI.ދ2}1%P}ƌPex()kW7[ '?5,Mí1l FqpfgeIoFelo9kloZ1"8s{Rp0vU3} _vj`({}hhTn]YL!ҖekL<[J?>1}EE{3#^䛛)_&yg!s_Svy~_ c_%flO41P~8(s@:?[F46캐0é^ezKaWh+uMcۤcSn `6ϑ(njHO~v=紺`N==d;W8s%;o#73G9(U2]#bh[F>|'lLr?o,A# bsO3^>2Ilt#I;LW.<-(|-8EFyRfw5eJ] [;]{q%J+%oG.Dٞ`z-K/r:[~qi/p:WʓmFʛ<~;rg k/'lbr=Qņ<(SwKzU^/z9~ bqIID[>"2uj(7Rl3ɖOȖw+Rܒo<e!ەTc{Rn1eyr2q< E} NũEY;q$Qj+<&6Q&*J;$P2ԺFׂN;Їe;4t O:U14zNIENDB`logisim-2.7.1/doc/de/img-guide/img_guide_frame/attrlib-nand-select.png0000644000175000017500000001617511541757124025554 0ustar vincentvincentPNG  IHDRPLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccRIDATxyW*ǩj<5\;Z,m޹5e [:V0=df3\ΊYĔx2ֿQ(߁_/1 $TWU˺2^!wVb [,cT|<w*,w(g_Aa)se٣,Ue*;ڬw`?#جQan v$(+`!)HCFkY B=Aa=88+Ȕ糦2})K\Q UػBrY-TT-6+f&DVb[Q1MWr,& N^Hhʥ@:i. R)8_gvdBY#N-feG@kmz>T+q&Z }\H/S+PT*B!S+ʦ'|ف\b@yvR 72 yLWjϨY]_|Qcu/1/)+5vr½u!-ɽ/ܕ5R{_-ow8yGOGy]p_3}}n5[dh>EKNeʨJ20ِn9B \.QfXi,~>jB2BБTD4^M rC ]8po(ߪTCUACP K>RάrM/<}bg&1Q{lIe4DYTcҬ(7efq#ս2SP| A^uĂsJyuȔO@)(S>eʧLŏX0k¹X?d%rLqM fc(}# ~uf)%v1^i:|Ð+k^i*Z3S&[j.NHm(pߞ~>Y$egáLJcX|vOʜYEN}PiD5IB#I-#>/eIȩtJj,͹LjGií^^1keYqEmxP/>v]D#W(e&s,yIu9KաRFMY8 (egy@)g)S>eʧLTQ:^q0(g2SP| ʔOAS^.K;[)@r֝2QN~1Ƽ>:k0O}0@lUl\z[06Q&#ZS}-( sIBSFfl4f&?yY"ϊTS6Řcswg8dSSN/zܘrJ.:dG~(kXQ~>{Lv俿OmҖ!r7g˸i#A?ݯDζ̚!2o+NY\˵2;4 3lZ9QʳǪVl4}l`1{f]}Q޾R%aGR 4O(-IjldĄ']%*;mJ^J2^l\B #(?֜vYPV31Eo*{InϏ%j;}hF8ʞ FBuDY:}$kA8xe-/C3 pCbd ﵕfӓPeO;$uvw+ grLVetW(eFcCV#:6;JSQ(c:^Vt'R˦o_KoT}gK[M=l ~_޾)} e4=Dvʔ'`S#,?eȕ(uDywx-;w xJݩâ\qF)".;<'PV&GHmUcv:MqJ}Lv?yܴPj|U[ g8LZY)DGߗG}(q91}%ٲb6ڠ3xoFK̙r?[`يssk9SWГ)0L9^]<9H*ʯ,d9I6/rM=VT+?b;A@":K~Sd@ swe̯k2}N9pt:P{R{cԻV)QnRTn|팲$u]G;eu=A{__QFhVfϦ>D;c&~a #)[Ǩ/)3o(ɷ+gE+ ?1@Y.GJ·`~7ei(LOp%f&ݡu_VX5UQv}}QʑPD9eFly2b=e뛙M8ʷ5SV)}d7ebVe5t϶^2~afL䢬YvG~z9$A*>6#R}]Nx3%V-I_cSsWTYQKK/l)e\cO.uyqk̩kd\.Q,~̱?'O?sB5_hMKajXtJnQfWE:1Q^'-F\> JX(_nfX!,ZqW/>|W,(E.1tp.ʤjH'+t0CV߶7[QQPp궛Ů\߀hk<:(k&iԶ\-W9ɖ,pr 6hYc,s#~ʔSQJN9p݆OܰOZWr;8n[NA:2A}=`z@hP5emz=$[q:AX)7N{.ٲ}UrYԪcGؐ6سeZ.rxY6–'jbkCM~X SeXV\͔/[L *@ @}?w]`:o"P [|PxɺkB.\? Ý'D/$Ղcb%UDPp[r2L--emv4{·+"8I-(+H>P&;4fkl#g}Oٷ&u'2[G (췎/J><כ==w躁w2??]fnɄ(j̔oNg6ޭ"K`i+#ѵ|el۲LU3b,hgLU;(6ſR z#n㧼xIʲMyWmMR-XJ2H7J79$_)Evndy{xKYU[@%}m&-,Ж;喐1-=Ѩ籛jly+[fi#0dp]ek ֱz_÷TM.[:!9)t4}[]xI-2TMHxIvz{F+{kʣRe%"hIE1jܔ%'Ǻ[Em-G$@Ԛ2=e/wG d'6G\ݒ*ĽBI83epG~5`<+PƷ(>4!20V1Q_>(GmDP{ィ le_<(tY% !2$r(Suz/SNQ)'R| rd'Y12M2 Nu-'Ӥ>44e>˶ܡL? }y~)y8joLJ2-I_-=_̞<1.%eEncuVL96P/edםSVjlmQKXo֤Fۜ5)<ٲ:׽Xo)+#)#yNJY9r)wKYk1Z`OIYʈ&g{@8c=)k}lqe)#[FiL2v|Q:^Fd]2b|^Lٓ2$>ܯ"2^BxHRpf[>"[ޭr evyLTc{Rc2re9S>uE} NeQLYl (Vx< F6QFcDy Vh9dP2jueYO;2:x niPfٖl<IENDB`logisim-2.7.1/doc/de/img-guide/img_guide_frame/attrlib-and-replace.png0000644000175000017500000001510111541757124025516 0ustar vincentvincentPNG  IHDRPLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccR|IDATxiwۨq'vD}4O7? @HB5[b⧛M LUf_/NSKƙP.2tURefPW\rIџ'a?ܣH=zՎ%~Y32rGʄ\F\^\GjRzHzSzP`@AY8ez'0Ząp>^oKI" u?GCCȇO#M# _=Svx MYzT(C4= 7=fҔh! IAlےIQ6w)C=K4Fʯے¼Ca=$8<#HHSF/eI+jy pU-)R1OtS"l*Dm?j2?+M});a9<uq ZS.dOIsIy))/S|h;{(+wbOY9(*_km~=i_]I9kci^\H/W+Phrc@2zz c+28ˋ']дمu _I.-_zUcu1/ZS6j*E{3!{C[t/ڕzpR/˖e<ãg<.~,{_o˖u|CY`*#P&eUɎusWY;25VK^ߋڼ0AI>*wv3"WerY!\-'8Q4C^V;fy#$SMchhWO%VrfbL%?UQ3qJUE8%-btShcW|ʔA>HJ@Y',Y'L )2sP|ʔACQ^^M5@4ܦX8 & Gͳzukf.%0:C޾y:䎁|5ȇ#WT42.\<8P6۰?2|C>;7*2K ;)nI:k,$+F8Z\>/RIlإt+#5u\-.™5Mr V\{gw-`2 B?U44_@ѠAXx묨6xJ_KYaFbsU nqo$TT)DYވxkј`F\vO7F5s Oґꈥ뫀i+.!/{pycu*ƖIU(W5aF\U 4) FF}5-Bn\ KCRm>l[մ^3*d0WٲNf<~YFtjlf$>W//7e'}s#k/>lYqvQM3.^5eeUb\|륦.@L8#Vxv @*V^`2(ӨCuTf@oPf-/\!սוL :L͕2iŒ4Sʴ!ΊL)g5R|ʔA9HS:]I8%(g"(y(S>EQn59Ly+S>9(9B(nqYM>SLJOQ&f|/E't.cgFMBPKo/Ŏ W=P3f ///w!eEEy;qyYIOY M0sjHb6K$5v4)'K9pata(?ncfQL(_m: 2eB<5ecp1۔iaRFi2l<//+{; 5=l˘sA1±(+̰ 񺼬PGoLbGeԎeUo۔%Zegʓ.3L>9lpIm;7̋e}=!5bْ>bFʗ0$TIa?ebǦm*-͊yVDOǦTo3OyFY?E{V;W>uSFYI("8e砼Wꞃ2sP9SWyןLϬe쯕'hƲ SQFFl6)BGGœ0s4co=f,Sn9P*2Nrf#r9 SSQ=j$įs|H0YZ|x'qO>(%-_$wⶤ3?WB"b7X"S ga֐12ț-#17œ~/D d,u{܁ ?yϰno䇌pܒc;S>&(Aʍ}ŤlXN1# i2r9Q2eh]Fv9V"cpgaY Pf6 _fgY1omf$!?\}n< ;FYәǾ24$dzKaFL}<\2FyDՓYH0zr$ZPe2ZsDi(~bŶyl@V }X:[<^/Het.*(m cNbV/ ۔1gJd(U,޶| " [FU*~ƨ ҷn%{J>l at쇲< j*ecfGArGȷnV8 >HVHo=IbHWK@~!j (RNiԇ--|nkڿfeV"9jU:1}+ g[*(:cPu@ܑr{4vip˖!|H" ֊V4J(/LE|(=uƗQn=59[7eVckˁŜb,T1-7^U(0Ų4u_2,ZƦKm#4=RfX!#bNN*%T0'}s_NƜvAB̩~[)kEzL&"(yc~Aa*Ly1AdD_-mZ5/dA7א!m2崊}e~e-iTN2sQ%tDWW>ΒrOK” gHe+gFY*OBo}qJ/!)µZPq|(PR]+խh"еJ<,e&(vRn5a\ /L Kʨa˶E(ﯳA͖$z_:brZ9(N+\ۭ1rZuAjrΔӪ'-0ec=q^֞ûݍLWy)I~_ .xJZaQ ,GnQV%.{)%spf+9}q%` 97H]pÔGZ-kHq:j!&fr?l)@PbyE]~Ot+ Q'<;ӝ3[2U Vy9 Nb)o=\^ N/S65*fz")o~80_}ж ?cʝ;kQfU3E@hImHM05;QֿQϔ̀]ZIcϐrKL9bc=ZuL͍rVY|})ƽu?A(Feͭt6cL9d}nU1:u_.EY(S*rZ5ԡri2J@\9eʭՁrr.kBUʔk)iQ([/r3֊;K'Zm<_ʓpAʯO˷v[mD<۹/4y RlhKZ%r BP*e \󥗃k)'KV=eEj,58xW}~)[]L)oX/e}aTۧs4>V\U`2L)ox{Kr iiܡΔ`J`?I ky(0- & w u#cH7a)'UZ\L_Ńui΍kf'}"s_k<@n2-}  Ύ2r(L١m91X<-W}0ӠTCK7)K@L1n+*<꺯(_KTHM}:S>O[n4z4Iɮ[L\c;D\$H-ec(YoG,z*PROY ۽%,W<<W@'Cc(AE0ʴ}gLYEcH,$g>וrˈW3^5y_$1boHJ[֛jDF9ɺ [{ e1+B…3u_}qvs?0@hSfk?%<RP<a=Ex,ԉmRt)2֟ [ 0M2(#Gz·2\u (c3rN2R49Sn 1S9;uEYq{@bF6S]in/ YʯzGOL)ϻFzm|Lej^G5h"99X:?[N%$:)/54:e̶L$ؔ.rB ?]~)yb)c/SN(d(4*1.%e!V|7LISV;(luZԒj&3rKʴ]^^91]Ŗ́}ºnLوܒ2qsRƱL_VLn {J #_![rCʱ(|#ǎܠ==3*r< EH3Ƣ՘GW4tܟ_įRaR;&h7l/qVuo xDzD?y,ϊ)9".E) D!xA{|[WǞX^3|/?d7ģ)wCOǧA.{eC|̟0~R4_e#jՈ#4I{>쑑 xFl}@E0PQP·ZS=]i8Q[Q_YaN}"_u /%JQ)K\Ϛ$ep\U R y@[ 3;lVM!DV`[1m])cC ; +r@PNZKt\|oxE8aVʨ hMgRIYƋ=`4[ *}"AzFRFK5J'mgOR='x`r* bJ1*ehG'4+#^DSKhZ]ܻlO]>lL Oٗa˻2.Q}܈W|⳯a2_z1>@BY̾RN@UE.LdOgn[PneXi.?-~zRW*R+w5/(#I(WՖm}?hhdV?T2Tw+ŇVXQj̐L =vcSiv_zjXS(#'OZs,:!(˓2DME\(gL)_@s T`Xp2'YgE|ʔ/A%(SeʗcQ^Y BPi3OB4EҡSUx?z*Jyw}ЫT:-?ur?:A'!Q9d"ǖD9t/ʠV$V?-.BTAtZ+N>@xٳH%GXUʨ9}"Q9|B.~\܋C͔睨xR4x`˨+Ր[0-h2=  F ]e"b`|4ݖsX5^hkUdj^a˲z۲5زZZR⑮yαW΁dleLͫ˴zq\4Ŗ s݊vp2R I^qfV22_ @:Vd*c6(YBir u7*m=Cv5Ffmx r[UO 9Sb[B=v)En +XpAtݘ gk S+3 IhL c6QYRcelRƍ)kcf fQg}?զ;[f+@{z#$͘i?KF11( jx5fJVHz*%E.ub eP2f&Ö3ʢ6)C ~?ܬegʃ1.D.XlpH1{<0Ou[v-)g9C(slslwt[c䜔Cd'Z-k9u칦Qb9 zн3[rgf Å㼀*WL @;83c9\IWDZPHhu eq~+!QjkTceVԮP4O42K44p)(%)hMl IBx M? ٫WoYR7ؠNcrc%0TeyjjÌ}Gz|uB1+o!@OP3_rPVv(w|DOgRZb.չd$%E-[ʷVTyG!=rJ[fhv({BS&j9|&eWX+TpGlD2cr9:9X [$=ձg_eټ!+H悲q~g@yJ!OoEz{ e0ϱˑg3ݭH`A)*Ug?(bI)cpGa-oHFBeMGEZxޭUmP)(ay_9(FD90ݯVN9-_)_[GFPԯ_$?ez3RuʇD﫾hB9(]/Mh=")w-NTOG5aNzO*%TOe 唘S=ٚ)^ 1z"S}EzLtVOyCG־ޛm!? Wù^6DaQ6q,KmQv\WP Be_6]`z Oi־Sx)T8e)z)mqeΈS>j#){rg=QA5G!x^(uv }Ykݔ ٹ-;cύ'/+<^1t?QMVk-GCAh{MU(d#H{Ie! .Ak/h )o~(3_}2$ʩsj= Q&]3F:@@6v?5;QϨgzB6SMM;e<+nCY}w̰(;/yڵ;tWx@T~_aVGP|rj ʖmY֙SI Mʰ(Sn"^l9qP\j[hݪ1( AY}1&PǮ} c`dV ewL4 7hʺЈ(̝IV2x}hN(Ϯo|~燿w)w)`S (!жݡ7k#ծl?e_ 6Kc)^7I>ߕQ@~˶SzlsgԔ4ZOe ݖcoW>{Ҏ[ܖHL٦`>~$RfZ ?VOIyS RF`;~ع\ }U^֎o[i|&maG;X)__C sS*eZ&֣qYaÖ TPl`Rc(W-1m2֚˓OЅP\ZU!?ay_A?OR)ic);W4sewVofr_UAK0]G\{,m򕙥 ((}5{$A ESVڡKT c]L޵zgIl6ղFrx>P=F׆)f8 eFnqmdD$r,GἔׅՕGUFq\R<̩G x|`e8e[-#xn,EζOtבL #UΘABYREFB=s71OojR6r)oH G^M+w$?߀мC%sLNIόʷ_d\ƤWKPw3j|-I|n'ۿeGcs{uRVC3j̘"؏'cQ|}O}T׾Rf_ؖٸ,CpVN@y'3BWVg>~ϱmw(#WėZS8i3ۗtroAE1ʸ )i*;L`:OmO٢p%S!˥r={$=\N[6iұ;lOa-ٕs5QOg'$@!4)͖eLgʧe攔@4\VK9& bَrsml^SnUGZ@Űoe =n=#[Vq%q$\WRyH{xg ELyۉ(W85י5e-2NF9ՒF] ʝH fSKV,mK(Ki_6ur9\Uesא5JUx TY*c"IENDB`logisim-2.7.1/doc/de/img-guide/img_guide_frame/analyze-var.png0000644000175000017500000001365311541757124024147 0ustar vincentvincentPNG  IHDR'PLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccRIDATx st{fδs^G$H |(" !OuxLAoqJ&s\-]^E~X3kUT)Iw&eDy__fo*vV˶G/}P3E )`ym~sH!D"DH"@$%rgTիw캾ytb_-77md/UEf~ƈByO)CU]&N=_Pd!+?=EYPsv `)jTJf#rcY'k,7:ŭH&uÅ?ӏ?e>`[T%'{q:YhKtjyX-[݉ rc,"Q$Wk"7خi8_ùW!E27S$RUC\szwʊRGNsŢÇ}FHOG"w|(7 s7Ĕ,/"A!MUj 72:Al_ V7ZYxC&r1`aImQ,2+GV^|-8k/,`rbE/")6n WH6td&t) ID) zN$Ϯ=k"ezcՏGߍ@uHcTӠ*o:aJdsE򦏫Ym՛z-Bd/H"@$oOb/{!HU~"Eⅈ }"@$ IP:D!R""D"DH"@$ I$D"DH"@$ I$D"DH"@$ I$"*ޑΉ|w]w,fx[*v""D0~wDwAd0~wDw"r n"ϗ?mwWw;?#˚rHWvSO)xB2[D=Wxal?wyϮ?"F/'8y3̵m%1ܮ%R |]T"r;gs)șH3d8S~i "2wL~\=y1~=d ;vlOˆ֔ȴ07XO$("Fd&""#2Mr`9㯁DlD>l$D"xw$DT?MP&'rv7mwWw) w-]ݥ7"Gds5|z3kEDFbvou%@$ E>j^sl$BU&EXS?E.;wD7ױI߸#n0s_Dbnȑ璹d&"W6ȃlD3Gytd| liD$6.2}3FDd#"?bDnAD6Mɯsz$$52Ͻ9k1oɥl^ق=/[ֹMd(r7Yz:kf7[:eewmcVg&>|<rD,2[blMDD@/"Dzt[Ž5rEX[ПfS;;="t_OOD٫)M<'sKBDv&;ޏz"OtJˬDH"@$ Iz"WSa>D>"7 D&P[:DE+D6B5a`V,ҜPQ䆇Ws|s),g$VpG19Q"D6FUX ?dj$@Kv\nBnj';Bd#Txs[ptjsɚ(MlʎE'O]6Fr[ EB.PY=XC+|$G9CdT.8va="o#~MsH!pF!փ*LEVY+;Bd#T{gOq>B{Cʬ8faB"o"DH"@$ =n>ajI.JDjC!I$D!y =%1 Ddhe&G'5r l+"DDjojwPd-vDt ] D"DH"@$ I$Dַ@!I;lhcC$ I$D"DH"@$ I$D"DH"@$ I$B=6 uD,*]"DH"@$  kSlj+!cRߍU I$D"D(T;DiBdbED?GÑu.?,Dukw.R9>g( 2EXZ\"3\ي!2u`۾Nx` 2l"EE'.[ZtFqI`'{k,=n{X88[W ;.>v|xـ&Jyg'zmKas!hݶbl1T ]ɇPV1Dv^$RϥCdEV"! IG6jqm8ot4vb$D"DH"@$ I$D"DH"@$ I$D"DH"@$ I$D"DH"@$ I$D"DH"@$ I!RW#H%a"DH"HA"1 Dxhe&G)5r " &;DH"@$BCd_yӿ>#`BCC zD"DH"@$ Il nm7 UȚtuY"kҕAdM:u?J̮ &<^[AdM]:uț]'o~JaXz\D&y9c+vWO@$ɈEFbK8$+!,cў"k\# Ŷȱ]d \yV)DEiP^ FdDd(ڶ QZ'CETHeLDn Ɏ4$"Ik$[WѮJ(džڄctDV)*f:"5׶G4~T" ?s'?~'(ٲb&yjeS?[m~zxz\Ȏ%" Sev}v;K?3Ebs|iň%[Yk7wVVtԸ^k-DYdJr+{dt,} i 3;g"_.V+wz*a}| G>8*jV"GE/[o˶Շ"BYgDP;! ۱~ٌjwQi|8\,/ꩫeP;B^6Y'~Q!1HDXrW8o-FAsD̉zҪbֈTc֗79vub""hj` ?E{{d󔱁HՑ޳Ydk,Zge1{GNpL葪ChHM Yhi%n/H]ƙY2mRcge}dah͟wq6Ί-VdzX[WD~,E|GE/4,"۫a)X 4q8RNbPH6nHĘ 1ۈT w~zg{C!a.&D!,\|OWH)kG{>>_uY(IU^dwR*͌06Vg3f"u)ˏ0.*H&@$ 0iLL8p U<#٥ZIo ^+EOܜJ~"罐GId?Ussʡ{Sү^"{ݜr@d D6.LPd 5ٹz6'27ܳ/# QÊ$.[.n OUnw6l"d$7p?_罽ezbQB:e}A[ 0Dd}5\Diuk¥D r^zQ-~۵S0*Yo 2n)D6WCNWY$"oGt[oneEd;\Ͽϳx]^Sz+ZPܻ,ddSRv֓B\dcҶqfZi4n 2nEF{/_!R|~֙Sa g6Ϋvz:?*D~Cpn^]YE`r'QmoY#*rDPYDd!ퟯ_lyA4E^EIt5ȩE 2 Dܨ DNLvLH&@$R:DN%<SD4/6)LH&@$ dD2"LH&@$ dD2"LH&@$ dD2"LH&@$ dD2" +$@$ 90IO!rh ")949bÞOl̝dҧ$ͮkF EψE:tx:j1K"U],h?9s٘:cE$IF"[DxEA]Y+I[ Y2Zgn"ODhE6-D'EqSE}䬦I|hYd}-󶟵&(Xt ̄g2+Ή}yɆěKvHݯȋzH N1"`͖4xDH&@$ ӷdW^Hel2Z yTfH$@ $@ $@pxE℀#yyp dD2"LH&@<䵋t KȸB=wH7 H7 H7F+/" /Sd\!cD2"LH&@$ W8}2^p oъwҼ>suF@$"=n@$"=n@$"} HwoxPWF, dD2"LH?8}37: ?n>3nD:D:D:Cx>~C98EdD2"LH&@$ ɋ+"{$@ $@ $@}5"-j!cD2"LH&@$ r\!~p5&\!O=<8N"HD"HD" EzA4d dB*rArchEd{ SL*QBDLH&@$ dD2a">!3s9t2FD";2AdGR;XjK #ڭ~-ۗȎxȎdI9ouHgD^UϟpFAd$ .f(7Ұꨫ_{BSVIzr}fٙvjSl֪E%jV|NȐvO2k1hBƮweC=Zmk&aR""Ъ>?(/+iGrHch͋Xx:r)';HH6r"2KqopѽTLvZ-1P"5OчV+#2-HͲҚHx,H{/2 b<;n&+_:wp\ZoHH$H$A !pBuasqGBK DD"D"D"D"Q"'mUZ;- Aݽt{dj^X$% _Ud3]m /TTPj4O"ex1g J[@M$6卍а5?LJfYGq/D=0/☫&H&u^wWa'LڣeYRp`<1#S'ZWKŗ' t&RgB8"PE0oATFm,r-\79 8_5vS_!nLd=|\ 7m,Hu*yw0ܼ^M<1bOú\;E8ȅW1 3ڒvh/rmU(,s3e"U[9͸p7crQ_`:u+,~N ?:E2׼ =Iȴ6u2.smd']W_typ%"hΔNgDd21&7=SgH>Yd$ (ձ{vz-"xcXس퇄ح_,2p)`g[hu^6T΢d$:|[1Y!@VE)ik?ܒ]*s3ֱzQZD&e{#_gКlX7?-ą"ےhyxf=2ME픊̶"X q}$LC>%+tPX CH>kb#W24"#6HMkcr'~ D newrKYwƿObi{묕$/ϫH'6عӂH#f" ^mɆ}MCId H HHEzĠQ"/"/7.4+ᮿ4[j&hVw ]NcXn%r7jEێK3X=*"_T=֪*zU7U$!XnHCVhWȇcѮ"Zu]E"RFE_rJ DFLR5zD\5R_wZ/EjٖT8fdɈZSSQw틂_O/*X"E6M/h "3l7ET$߶M+4ڲG}X҈4uilo-"l3uLjã!}"%:+ +GVfy _yEXr" ʼnȴ?`d&m>?Tg25/SH~&|=Vy˶O<η.rGC?Z-rK||":5Cy(u5mkՍvU* jr.Ȧi*/&;/#uDj^dQ p=9HH$H$Rp9LO%|rIPQ" 7I"7"*4ADDDN" i~N"i~ـDEvS@#E_&.һߜYd @u[&v#m@"@"`"9<]D"Hv-"ɟmW䖵.v^uG6̈́%"7]a/AӿF[u[Df=T$3i$?C~~lẍ́Zد'1F"vwӈrĹQZ\FHdoH%0'~9A!R}~;^;DBe,`c$ZhH}Xq|r l"R Spr"mS]$-&ЛHpu12DpId ܲ҃]uhƳZٴ4GDDDDD-AS#Bxi }cH$H$H$$"> H@ID>cD"J:2D9 G.*4ADDi|C/}(2M$WH$H$H$H$H$H$H$H$H$n5D5iN:"4HpI$H$H$H$H$H$H$H$H$H$H$H$H$H$H$H$H$H$H$H$tPGdׯBB~D_!H H H H H (\:ORK"!unbI"@"@"@"@"Pnw %E5/Y9xct$2`٭m\v]Aի2 DZc 2BIdWK/f-<(~Q[,,= VDj9b{x~t/ANy$2xLoL.߉b׍>Ke"QO3O<=kU>_DЀۖWL"-sI켝rWt7'ob1 D*T8^1E}Gx }""&ɵHۂm&9o /J_r[XE Dww/9܈m]dfDip1;:W%zcWg"%{ȎLs(}QIPE|٪wb~ⲇk7ic^h~QzPIJasd|;1-DC?.ۯTL".zb{0VL"/R$DD"G6jqi<$Ҥyd$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ \^I"D%24ȡD>cD"J22D9 G!Ä&;H H H"'CH ȦP8t qh"C"@"@"@"@"@"@"] Ϣ Hz?HdUHdM:YD֤/#5KHdMWb~^D֤5s|K9YٺrLz"fPD>޺wu}$2@DjBg  @~pr,?ޏټ1? KO!.wxyw̓TD&"e>?,d$q,ڳyzHdm{付9b[~xZ #JId]A yIGR" 鱩|=2/ƾK"kN&;ڱ$IdChu"iDrqg-H\?ƸGjyvDFu|!gJԅJO1DzxjVy~ DBL [&3 5׺ɒ @"kRus9"׆D֤/#5KHdM:YD֤7Id=Ym("JH$H$}׍ D^&V"/u1 #bS+?ËzplIENDB`logisim-2.7.1/doc/de/img-guide/img_guide_frame/analyze-min.png0000644000175000017500000001354611541757124024143 0ustar vincentvincentPNG  IHDR'PLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccRIDATx s:t{fvڹWe:Zjk_MNH%3 j JqbN@ PFoN T2{Ġ Ȁ4ED(#Onnj\Fclj3egZgd "hZI gA /pICȀ{(!>>9aQ]VXg|= Cd=>gG$x hw>L7c/ 2wCgEyA`"r/!Zg>»MyYr?iRъ. m9[1rZ/2>>#;n&#_;WGLd,?$ $ kA"@"@"/B 'p\6;"]bȌI$H$H$H$H$n%rkr߽>@(5DJN[迭7 d7}d}MnvK' T*{I4PYv+/Do>_Uni:6YH< vBX$x2)5Xg뿎+&"5+pdUx| H"wxus_@n*w)U"3*ܴnTT'Ools, g)r63;a!uq|u+41g:KۅIkOQ;hSplM(s1U"U_πq OI1.`}km,n|{tƓ;ṁM|JgȇЗA&Q DvXfOndKxɀw g" '˙3zɁ]ϴY";tΟ#gUuc[sʋLZTcab'Dn*%cgΑHI=[|uH5,Hqb@/+Cpܚ%BKDjT,??%bTZ'bOEsϹLush#fԚ/¼CXEd:)bڬ#V__wXjeL͆Ո-tiJNlc?7^%"U2ZջuOY?C᪕ՃiCDHJ[s?-!,b]Yn[_帑Ȓ<Vms0"CƲ#Ldy7.k WC%;BWoK|uM-Y$,xlӖޘѭDwS^(DKvfWJ,n'D x"/{̎L6WogM2٠W[`+BKH&i_%67ˎ <3풏=Aftx =yXHXW y*b˘p SH' Nj\jZ\% ]Xf,^#.+Ad83Y#ice*RIiK16Vl _cua7HdύȶڐvD=då۱Y7c]uL\SdWOuy2ُ3"w]4)O漚@ԃzσc9HH$H$R`ğH0ID>qȡD21$DፈO" -v@"@"@" DA"IH!H H H H H H H H H H H H H H H H H H H H3B_?{o,YD^W\i$ $ $ $ $=ŚC"m=Ԅv"}W>r$響nܖ?OMoȄH9Α=Uwozk\,376lv UL_#1% L$]&ަu5nYzMW<1  I K`gG!IM1nn[^-0 IMon[^%y,D }֊F8%_i`M(d߇qg"B"@"@"@"@"@"@"p"z'%H H H`"3IxE+m'w)26RHɣ̳Զž8 vY0߸ v#DKl ;#r(ܻfT8_Ӑw(2ց Yd=9{Yx$X H H H H H H H H H@-2N;4F>ϲo`|Ki^ʼ|Xdcm7pͤҼҪ}A"IHI"mDHi~4}Io?nH7*Iʣ@"@"@"@"R}.V}wH$H$HdS- 9~gSWDfzI%/r&Id(*q{qH~`"GiE;e.fyU8#Һoy$2J"{DrHd&DL*kzIo?>ﯖnE~YǮ@"-DHi$v !֋tkmjiHD1,WA"-\DcV Sej.iATwRyORI R&De[G]8ΟlF{'ofYY8;;niGΑUZoBMHJ lICSu34Sv:Qe&+=2+-b,y{L =yQ%bED^hcNV=M`ѣ6l9|2eeZS"DrRCMie%"R `o-__+ɪ%O""w~Şc>º2Izbx䅑T$K$dTw-k&d+[R$1/_O_5jjdw4ej7V>*V|A*9:Zdْ'|c˶l[ey^î(x*=MWQTK[u܇,xcx&?q9v  RgY6;DƎ!cx$rl+V pDITC"@"@"@"@"@"@"@"@"@"@"@"@"@"@"@"@"@""?vH"%I !H H HP"}O"0*Lr$rQ0O$rb $ $ Bq&*Ou975і}Sd_WtEJn;4!H H H H H H H_d%YDT u!-w$%DĖޑȖ;ْMM*k_#-ȯStI=ٻSɨ%@"o乺>e "g}( uu7X=Y9) e+/MǰK`?v7$LD|(~SV6 a(Ǣ=jDF;G. uqS|g:jy l3%mzCPK8rJ-iO˦"Ȉ}DF MgT;"}IȎ;31D҈q'-H1ΑZ~K"[#zs,:UaU*6ᩭZeY J<QDvHީL;HdKnHdKZn!g֐Ȗ;[zG"[bKHdKll5œvs1w}D%$jA"@"E&2&gLd߽ Z"`wG6G.21XxKIENDB`logisim-2.7.1/doc/de/img-guide/img_guide_frame/analyze-expr.png0000644000175000017500000001413311541757124024327 0ustar vincentvincentPNG  IHDR'PLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccRIDATx s:H{fi^աՖV;>|!(pzW!!'! $1ނ-d"C/Qr!i‰QF8f/ΟVbWa02gg_gf,bPX} I:Cx0!^ .C潿5;v`lT'U;xk:|D0# 1v {qNx<0F EA"T# zT\d*,_F0ʣ07l}:Pqxk`2O~*s,2r"͌03,W|i3;w=\,1\)7擑![QLuVH6ؖ_Og]\bf'-xs;)ͩۿ"CcN[&u&ADzJdEH6-Ry3AYȰEf S:8Y XI(Ybj5DµO8J"Ju=i,ҚZ"7Nߞ\DŎ-H6Hg٥C~1;fa`L7HS̩~ψ [F$̲҆H&sY>^dgӻx;n&=_:wpTLd Y$~H$H$ ,DbD"D">N1nw"DĘHH$H$H$H$K4Uͱ;h5&"Hɖi+v}eLo7_yBneT(T*P<yk/D˘YĎʗd]Nt:7yx.lAH|3)5\wgQb"#js;m.~P" g/?c;LTq=0Y%o:LLVh :usxLbk*F*v\>Y"X>[+ECKO͵jp"?!s T 7cY|DTgόaܭʆ}(Ĉm~flDUӃӸ🎦kQ;͵NC(,s5D:b\: Qf#80t4f#Nχ6a.!@-`')FSYvol]rOwyP1"hjJ3#RzDͦgb$;},s/]5c~4ܭ"u4Hv {*\>kU^ϳkH`iU++$C"$\kO z` "GHE7x}aXT$.}7aXU$D"D"!9%F#GFg_DRdw'thN*N`&MWMT(I'$iCMc[]ll"Id Hdz:# u'Kf27l߼;>g3Ie╜ȯWcf" rui͉ ﰂ}x"hSڨD.W=| 'FeM2&Oh'~DF_yW3 f#1m^*sjy:լD2[+g6ƿ>[WKR-}ΞaN>"sbl`X~e~n.>Mfe1X%2-`2?_˨aiᗊ|w J5:\M|sϟ}EV\ǯ7{>氦l::$ϝ3Ⱦ=Mf?͈Nyռ>gգyQB"@"D"lj&K"NJ<&`D%27"+ADDDi~N"G ?C'cD_6 cD"D"D"D"D"D"D"D"D"D"D"D"D"D"D"D"D"D"D"D"ᇉlG.D6 egPD^W\9CԠE@"@"@"@"@"@"@"@"@"@"@"@"@"@"@"@"@"@"pf7$:fBdohAV" 05” $r o6Qo^AgQIdB EVi#}Up=g݋7ZP$ 7~;R<#{xqϙ.SxFvT+*hh&A"}UG}m󢎄,q?~r2fVT+*htwSF{A\R5Suivw44bë-?)ՑFOG/ ]ZFdJ j4 tF!7y-. -e/ԸլN;Ig"Ewj/mX=PGZm7W%V;ivW4B)3a|ZuQQT*45կTAP{GUP+@EB"@"@"@"@"@"@"@"@"@"@"@"@"@"@"@"@"@"@"@"@"@"@"@"@"@"@"@"@"@"@"@"@"@"@"@"@"@"@" LYIfUHD-w y~#Zv'{ADD}?\?:G/̟>CsP!H H H H Hv+(ëRWGdS]țC"K Uț@"K Uț@"KiVդW_7+WY7pi%$v]?fl \ZɘD*W9y,2zNE*YEγiYHD>r݊Uf+lEdŞIbcA/~ p`1;,+b41YW˞GLds"YSV^Bg il%cdL'=[#~(Dyw:ۏ vy?gx*+s0=eLEn1NؾnfңXll%#u]we&{]u%"ppS'5\3g usP03WF9}4w25PVԚIlN(2rH9 };FP-.\]#Pf,Wf6jW/\%#F$ߎ>gmȏğ |m^"oFVQT\_Zj|fg,3D-Оt4vHuT1?G`3T:#u]A;=fk2Pxxڱdyy@F%RΚ%V%N$4GN|(;Ha ףщSCƱ `'a,vE{f<#ĝFmiA9DF:XtUTl)3jǚt 1i:ilI:;DerFn lPZG"[2֑Ȗ u$%Cil`~O"Ϗ'.2|D-H$H$Cߍ D&drL„Dk@dNnц E&aׄ-!S  4IENDB`logisim-2.7.1/doc/de/img-guide/bundles-splitter-circ.png0000644000175000017500000001120211541757124023015 0ustar vincentvincentPNG  IHDRPLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccRIDATxs*MޤݮtMyy&(E8ڣw]>l+mJ+jpI}3gљR*Dz|io,A[LZ]c崹']!tջٴ2qw"4>VzW]rw:w6ۏ?blt"軸M#5uGry "᫞Hͺj+`Ud/Ki.ubV|1qwyVq9XSqȕW[Á9Xc41np[}CșW9v g( &k1qpIwCW+"RYG5$`B_F?RU?\%*] 0!|6'U=_Е@wDžzЌ~mU]fD|պ{sު]ӰןE/B+4A HKK^JH0ѭAɤڪDmvJihKh)T&U]泍#kP~VVwv)iV-تx.xaKH5t]+%@btmfR_wތz3ZitIy=Ljf|H 3U8bO4nƍ#7 \^0z_nɂ% ,Ӥdet ཬ@՝ML(KPhr/"wn-SUt6+qMn&mnbb@nJ}Zo!4NH.F;.(^;itEu+.ҜJ-h]s/g?HĦ *MHXm~T') xB˷~+/nv}!,ȼu_}attg;bǖܔ~sl'UOE,?y '$/]a;wGUEKeR:_z}C|WLwЕȁ]U~-+l|W]l'{+ )no/^a:s]͡3tW;(F~k 薬&+Tt6+qEW}Uʌ.y)}N2F_tCN{BG?bZ (nt1>[x BLf+֖t.hŦ{9UiLPS%s۪.UUU@7ż")bo5Bī(U2@?(˗S6Q.r% ,L> i&+[;q+^|E GU]wNtnn)ҭon:7Mec@7LmҤh. KYҤ*ݒnʼ͜LPSp[nɢtxƉftENz'J*a6Uwqi{*JWgITӦb2z!調Kc3rѢOVFiAEyʏG#K3OQ=!*vJƭëTtݑ_&n)n@W,u{W;ch%Y'r!n%Pf}/-jRh*ߗ30ΎZ$j"zךBn ^.=OJ*yՔ,ĩwqYK6s} 3]"m18]͕]tck*ȸUGX]R+OC[LpuX ꫊#z!V#ǖO!uvn|3 ͬΪ"нJ9>nr|.U.+i>ߚLBƔ.;w}U]-z@7@@]\K)CD@7aqαULIC%i} jy;f;LS!jtLb|/ƍ^3J<̞qUj7 U1*l<Ϡ:wg C\U VZ+Sj/'2{<[c9> 4U#J_6!xtzP ˺t[HO2k0ZGWhǎpӡ-7KX$TKW5n}ZKV]]ՇkfW2.C\U%FR]}V]*uY|7^RbµZ].C\;wY_mRE?{3$&Z'$H{?T^.1?ݒtK-YyU]?,[n+ )*UṁwW'[\U+WtdDw*'U]?Y"ӍWtt ߍWtdDw*맹|w*'[\t;[\U<% ,[nɂ[n% JU͏u\wIqV~yd6"{Ј$S~ ]dVMXŅo;]R^m<]yWM$J)vx~_.BWV U]Btp/AW0VS2757mʛ͌gUKŗlW.zOrU+_zwzW =].{)koKM`; t{YeB KG%rwSC m4B$5_);{"&'ѽߦ#ѽ*]@꬘IENDB`logisim-2.7.1/doc/de/img-guide/bundles-probe.png0000644000175000017500000001211311541757124021342 0ustar vincentvincentPNG  IHDRlu|#PLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccRIDATx{S:Sknm㸫un/_͝$$!\tB!MVhZ NY@wSНY 5VA4[ERѭ1-"lO 't$vzvn>GThĻo~?S ]H7֨8wxtikKP &ti.i>YMO׉ޡF;*28lgيuL,Jvz*y>{LIVDAβe]j6+čv~mIEU|FYÝVj2UV2ί@KqPS.m.o0 k P^`Xq-FG!z9?<߾d7貚c~qѩCk//]A8s]RNh4:EjttAt,;e)]*0hyB3?i5Н(];~uGSI׷=M@7 G-z?uJw.~77|<Ļϋsݲo{=\;u ~BO&; uګGcۉHEY1#ΪH\,"MD.8;FWF.t/I(<7-2 kUtUu`v}xI41{{;/?y^3cx8}g#I-C[tx7A5Z@NDf(m.BYLR]gU/Unn]V>躦ѼX4]G5ft,uqtyxWѬJت`\&ͬغ\VtzD.1[:W,2 oь f9,xc$x #!٣~tE\ ٮE'u5) NY57et,xd#צ3ٙyкFqѪLA &V\uʂݨ̔ MjO^CS{]]>DS\d8TLtT*.vN}T;.\fWtݙlbNҡU0VG-)]/ۇ_WBjl-ȓ)d`s펑~k6š.? 0>t!ЪjU]=i~C!^ b7[l#8ȏS%3l3_u;5= Mwnߚt=_ zc?|vS\Uw)% QwяeVBs]g82@[ͬ㏬e[ټs2e̺3SFLZU36r>R@!tFtfvǩu]2G0VXkD~Ɨ_Q;خCMWPۇSu#\DP3Ž o:P|w+p:u _xktuġ mۮ3:w5+c˾2 tSJftjƋ.Q)c(Z]}, l73f:Qz@סw5{/u5  :ڤ7ߜcUQt["}{ ȯʜXk ~iv[QUcojyCV}l|ڤ/ nϰ"ڳv'-}iZtGtDl3͇"&}iBtUmf z+?mҗCǪhS٘g dJ>mҗE7_q6Ub_BWDD0:qʭ>^_ʯ4E/,UeLIWgDﻜx~{`Ԥ P>dRK g׵c.dti\j8Blv)C &ja/G#a] Nf!Эߵc?hK0Vۧk[оq/¤ ~<-탱%(bVz6(( T$ u[%ҠB_tGkSC[ۢ39@՟SbetUm]Ռw۬;]j3]mSUy~c25|~bЭT*;B7k8άӭ?c^tNtkƦln"O83Y{5wǪ$Ѣ/SV{ٌ kvӭݯNlؒz$mWYNeq16Ar˭h+%ZL&]d_>,͌%Wq|[K]̟JԼx3q^j#s̫ѭ X#As1[BWFK]glMs .xKZU"Y `ފC5QƋq 3#{Dٜ2;"bEލMgB2 bP2O2{Bwg@wD:#5d=2 ]{t盫cvM֥[Tj~A <]~ҡl~#|!B7: 5ELf#w^{t9 ujLkO>`*#rj,tYfE*gtW.u}R]Mza%lW mYt{VwܬJZ@O׻_DllwDwiM+,7+ &PLW46Y8sgtTtM?+s5vf>0MMng)-?^_xmrf НՔnՇnG7g t->ʧ$Rt{a3fn3Ju>[@S u..:knw-#L^9RLۧI:3e@E۝ P%m5*OHآcU~& pyXtc[tM0?IEkUkzj!SCmZtA9J-MOOUmf=Fۅ|tS_m$TY[*'ݼZk3_W&6Ό~]yh]3J&n¯+MV!;e.xrvӔx_W~]ya2Н2|6 t1fjmtZS)V yXjhbDl v7qltegl7B}4{";K.ʏmf.!iQ\o>ViJA[Q&]!T,6t]2\2%vM(-DIF)3Le]D\XlۻǬ2]=~+8 t]JtSdf/6ZφB)kɆo4]z6ty?Hj.Cw^fb6x1(8RgDgD],ԻGW#6ѕq6tU;N Ht2^O^|t0mf@wkqMmue]tr~r(f}}IENDB`logisim-2.7.1/doc/de/img-guide/bundles-error.png0000644000175000017500000001236211541757124021372 0ustar vincentvincentPNG  IHDRlu|#PLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccR-IDATx O8)iaBbKZiA"رM}'vl!5[,P39ҝt,;g!9T1k5rO}d&IlRp}l" c/;t7jg* )ty}E:N%OFiek̥O=RH mpٮ?iU~tKcM./Bمʮ7".t&U0:mGJI?yk&$[kpvxs+gLk+5}\-Ӵ[^[o ],SiED~SV lWSqìȤay؅ _S`Axx褲Xb;8K.NЅU1$џNBgAWR%UN[` "̊QL9ɋNzt Ef:YХ+!7syyu.:RviNoMWV\q,)G @$*!hYVKȕ7$sP~iymoLvk+ նk(YZEQnNŒh姫t@y-ۃ*`\iӌ붻2ê =/F+'fe薗WIKx#4T~uWWjw*PQ`*[Hf ]g6Q5E+PE {Uy:Tz0 *=; (9EE*9Bsҝ螣檜 +9n({VBsVzi? THwβwB-Ŕ域66MrYRRvh^Bʐ.ʡ{{1)}1ȿ,A仨CKnOkbi}zx0"H%FJtWUt9\Ї!E| ]r0^vZ] lJVecѽzq|5:x_E3[ š²޲rYyR١G.!}~atM9ALvJ~v=ղX5#zJ -W.!61d͌ .ŭ[5bjr0]~G꡻t݆Ɨ5K͖̬͕{x[͐-yH`5z|đ2atE{xtT.f3 g,;g᪹9 WYHw'Md6v~&)r}'K;!9IM9m9k1'cgkrjH%^H7N=۟!ݐz+C>C uӑx=wE4] 7xOv/0/H0:l_U3(ۊe~/Z?jc%-$H/U33.3>7qw@Q~/ %@cW#^ÖIqzp?STӎ~9_3#R^Յ0S ]aӵk#g~v 7k<";"F aK>sUntp9ڮGP̰U}f?q*S}ekF0GE%= t=J.*OW͠ƘBqB۝txpBqAW,B #8"u,dQ{n-i/;Ģ:1hɨNMhtT7ۍo/a+r~\ӓn~W ܽJ6/k3z_tTlv-?vmwRq+77DEQmw)pٮTky2H7NMNjtd~w|H7NfGNjtlmn•7sҝt#KH7Nq;,7J˱-R ӅOjn1HjitWvf=NTkM=S.DCe -]y]W-E>k/'0[ cvC7=vy*fh ,A҄Nqv-/8oQ3՞)Bՠ>jw 渹i*Pt3&^Gtxw]y4PnZA]yQFU]b}F+T#)qcUC77/;: {kcdTE}F;@ 9RY9ߕn~U =C<{Q𶚽M uu5I{o]CGحf 4S;m7Xt@gC?>btҼd9Ǫv:ECUٳkx$O0&CvMc+kp,6g8W )Э} o%V1\+m>@7.Ci~tuA}^h꾄zP ݑ ^g'vWd(%Jz+A"|DU5};Ȣ ^m2R{s[Wt9F/ Lr)ty /J+߿1ޤ `o]Q0_t'_Uͱ*@-Y.CKffF۫bпUvxK=^Sx3z;[em8{?8o{Zo)%]y$w!F3 YuljfMn(w=B.gI c]]`7{Ϟc3 ~G>w߄߉ ^0:qyyBzK3 a!^ ]R{Hf$ЕOgGQO"$͝՛kA\'LKU>9wl~׶]Ɛ10x+LXLn/O_xpz6kM@vk3\VXNqnO q/>WaRdJ_`_s{k(!)Zn)HRmvE[HDpmƥuU]3Mz={- G7Q]ښ:]}|EU?EI:nk{[SI|U=)5 [ڸպ&~trp_ HwOF"hn"O6M7WR~|߷4џV]wǪQT)=We]WEt*t i5u˵K lwI?z͟_#+~Zґ] 4ChB3XEjMݍKKXE_݇xPÜljcxtz K=Zjxv.>Y}kT-9|Gўm<7+lw!Pq]ѧw[$VւttiAt|UYɪ3VʠvfՂhhgBuĻg U @AWEë|]_ٚ*&LWEë|]»CM 骸Hwxŭ3*WtW*eܿ| UtW*]MW}kWYnUs_FcU;EH@tk] ٮIBtZ w¡dv#,ҭҝR^Wt;g!9 Y)WtԈn7FJ]  p|&;^!ű#rVYnד2](A|^ORI-r*ɿ?5t)g+5T2rHt3YtAl|7-b4WکdtڮJn1ٚJRybei8O `Z+S!UWވ-&_A[34͞IJWJo1:jtK 5jN޶JU}M]-|uRqE"E/ݞ3+tه9vM&h}Zȭ΄#"]s '߳kGlN0%Lח+[)+;\qGxGBt^s3UkM݊ͨ*RJ7I9pZ4>[ejy$v"Cۭҝvy[9?[-E fGE.F-J9elF0==_ھgr7J֓C$ԍ93ܓҭ'>R;9J.]UA׵l~GWF8VKM;*F"GTU2N]X3Sy:l~.j ׾ߥ~w*.ҭƪp4#^őxGg ]lwt,;g%F|$rMN ?P;J6&tE(;?Sj.߿IENDB`logisim-2.7.1/doc/de/img-guide/bundles-create.png0000644000175000017500000001214011541757124021476 0ustar vincentvincentPNG  IHDRlu|#PLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccRIDATx{S8 :M2a@Hl"_-IlYz,g*YY@%nB) ,ܯuĤ5MŮ8HJ3m>G$Q‘cIQbnN<}] xGWA:Mfw<[[*%`BW'kIe9;ި>͙S)cɦmq|"88dbQrVЯϧcJ*" r;wmĦRŢ~wqkLWTm޼ei;ve0yҠ88O{+ 4 Oaծ8W^RSYtaBBSU.qm(TT!UQPybV{KQY`Ʊ쪟W rM.n*#!Лw0U^Hsg?@Ixkܜ*%s*CI^%EeLEvafuzI 4tWut\Ѕɿ+t;fFuaP\1;7?y^3v]^7GzRxQ*S, /-mP-. Ͳá5IΪF38![j3xE|Ñ*٣~tE8vD<|Ԅngާ,k.ekB) 4IY}附LnuAs^egJvSdsN`rCnUK̔莝q~p!]R{}FLLD7*}!WptBު6mXL5guT;.\G3 RgҡRl[Qt8_,dlUefL%3Rcpw{FHm5$ؾW@69`JUuˏ-f|OIv}< ߓyjUo:ml&]tzD0~󶮶|vǸ RJޅ2WYƕ8|']h̰mffy̶y!9ueʌǙ3SfL[UPƙyYj),nDW7#2@HסnteUacUo>,[PBu ]$ շoxpAu❪@۝:޹&Hסnt8ܫt9YޝÉ$PߊBǷ5ġg A}ۮ3;g ]Ce;K77]V2펧n]a4ƌG4%3ua^펦̓G@4G4>^POE5{?:^Pohzޤ,>?CtVXmmcU5+z2o '3n9Hht&kĶB- 9[h8\[]i"lхtjttzh37 8^ewW-a|Y.WcUM6 Vϊn|}ޏxێDf=y lWj~tv!3Aߍ_6i{:4G'M>VD1(ܷןH~U~'I}jv{QScyC;\>Al6^m2@qMo{n 2Ң[qD$f9W6oKW ~jUmf|wMuXm*[&C)-~55=3X|=sutM?%]=\uhL[5ht&^U*IoYUB}jn]ԫ{wC m3Ձ=\͂nn/X_KΚnOh={z y!tׇԻk'LMݲ7w""r>N^pJOy,[US g$^O׳/DI7%';7)׮C.dtG4m2`4 V >~9  Nf)mߝoY0ة;ų?>]A8ʗ'}p]*rә9dzE'1fY%:?̧۶8>mtb,gn2HoƀGD\QY~$ Q??rIt9L+ y!m膗#S|+]2"l7Bvar%Wh mԻ ƾ9|녗s2azUAamfcOtMkA4i,47mfͬ?iRw Zg]g.8tʤ>C gkYRzLgl)Iݥ뽎#?;M(-GŵSftiy[wt/W]#on|t0_#H|`eK )-֋ajZmfas3킄{lt^ ]HᢽZKT]p7Cqqt 6xWmsPhKNx~\Hw$m|zg-8?B+b0Hw#|=y5xy }nMwll+Jl˓#Vgz IENDB`logisim-2.7.1/doc/de/img-guide/attrlib-pin-attrib.png0000644000175000017500000001376411541757124022326 0ustar vincentvincentPNG  IHDRlu|#PLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccR/IDATxkSۺ!M 3 P&O%Yw%zw7NlIx麬 T4YafEU;aSV;eSV;euOjIw\lKYIs;8-"M0 7{LOJGr=|Є<wrGOaɕ3ը4wti6/D$&tiܝq?Y&]oewHPȌȞ IL%(x4$_%K]F8R~|SRIlةtWZj,\fy֬Ut?qCނ*GvoWFY&b+]LS* =e “tX#D%ݪtY0?Af$6W좿,NBeAR*GvY,ADeiqU?/>A4=QWF /;]M9+(?V|lWqzQO3Y=.{P..>WFțEE<.c)w60 k P^`25HQK3.l3WQ%F p_E =tte-j|rj|tIwFѥmQFG(AUNYE^MUS8QНBt KѽNQ*t,IM~Gn6\/ұ)ƘIW-NETÓGtu|^tCm3sv-"~vU4] qZʐ.Xʡ[19I}W@,|g)t!^H\/"uD6xG>" &]n7^Kw5.Bt\І}9Vtѭxj(]l8)fF^ vt%:kK"q"ŋ-CS7Š{ %C.vZ'ZrTRUKVUI[wDz\/Rh\t.]$S̥EV/4zlUq\&؉re=R ݹkVGԿ(7]bfu fhnBM#l$p[F"}2G3tgtEQ ]dp2{?eSV񚛲UNYM)k :ʼ]P ɼ ~*[XC\Qk|d{Tt{Ԅ~v]y:]3nE` ҭ֚5 օnE {\]odFu{kU26+/a1=Tl%.w6#{Ew'6P|-ppO|-G'YKkV ||●':ǸgN۷]a[a;¶{ۻa 38z')ޭ5΄V x2fEi5"mw6_ktaWrz+j;Z|MWC]|wAs7HftМjIA^/݋/JU,8ҍeJ^ 0) ] U7. э hj6Z.f3BA`cE:C72S~zyŻdJ F)%x?el7W~xM-=Q10_]m#tx;,hgMetqw]_=<<\ ҭ1aVKn6^V۽}.N.z,x;҃,y ѝ;[+>:f!s7DU淧6VE;ˊS.ߌ!]뫋̩]c<ԑMÅzWu ^o8cU;P7}T=ݛo胧ۤU5\yh<7m"RFk.g>oEt57 &Kh3ijl/^1^t"Gdj&c>G{`݆k͍RӼIymEZ}|f%fi!1$ k`݆k͍n"b77bg6Ab渲wn>D 5ys;t*xQt .[KːS:Vy6J^j*m5h$#uGIoPecN֡!/I+/a{ tI`Q#6~U0Xc|"xQg[.?139qۮf.k`ycUϡp;#zrXtS՛ݐ7EڡOnT gLacnoeTƒ1B7W]E_Mnk!ͷnE"DgHLWTby'C4XUt#TFhK^H0|)]S]f$i;U )+S"l{PQc~NRCm-ճ5"ƞۺC]9OnNŶI3ۉb /{qt%!99 *_`1KE#lW|4n8F 2t1ti! =T6ZݼpWAfCֻMWtJLw V]AEL]YU(Uv;|Ntr' IS<ۗ2P.jU)EMN"{j&`$_H9xSOvsWt$*wçjtS雡nXUt}9s*m_Uhb]HLOHlWd]4Si.|Ȁy(;?W,zEry5x]@, FkaEZԓOd\0"n#;IN8VeoƿNN/%4ŵ#"еw16"v#.T %V/э]yKMpӠkL]jskmԻAw<<h,2[mw34ZE@^BweĪu=K@)}tۺM++IMxO'V YPQ7Gc Gbt5G\ppOqU ʟd6ˮlWnj%i>ZCLkUYrgݿk0EǐH7 @b gO$vȫSf .\WaDwCj{S-7޻?ҙmtw;'xQnHЊ>dL/Nž~u\p3&D4(< wXJ\Nu5<$uǿ[o 6=,m׾8U.Wt8U>={^Vhphu{- fF'YVSzפktRW5Oϼ?pm,"Z9T{6?^9fXp2烩5WAW5]OW jTMj[}EqtqWY=Bw–OlpRչ.3 گl^i+/9@W~R :݋8K͇܆Np[\>Y;C;]fgi͕֜IV*tSkWUVXZ_#7]cD\2F{2*Y^i"X0:t| ln;EnY;[U("Ktw TY;Zأ [.tSeXyBnCZU=eGx> .H*t,"YQlLW4 r̎ete׬n'B=r:XmbJ:KG3Nn+BvG n_}7nwND[OM(U]Gn;> ]d6\H:/OKݛ~۾3ٮ-7OOW9ttmW>]ޥD7[m XN ?Hh37~lda;s^:/oj.Ի v;\b6;R~兮.͆I9YlwE(n4p]!Wtä+uU jrt# Pr;T]-n`jtOsۻt{2]CFL,wmsC /IENDB`logisim-2.7.1/doc/de/img-guide/attrlib-nand-select.png0000644000175000017500000001430411541757124022441 0ustar vincentvincentPNG  IHDRlu|#PLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccRIDATxkW:(_tnqߜs4Ji/+hV;dCV;dCVtfb"KOm%ndD+ 0-~J DZ˃&r},Si>rER*gAy*o;%Y=mX"&tqڿߝ~?X"]o%Ws{bDRBh,- Z§;B q?Yk&%9%N'tyq(-eEU;WrG/hd ZZV%Ut- S`/+]}4 *5ϗGNj]|Q =FW.Hh̘䤿-BATR*EvIAXc%)iY?N<<=_=R( !I'O[Wb=^E uibJE]=e+^Q\evQ_jlWt\G HxXӲz (=&ൾzm7M%&'˹ZVls}y\3=Rͮ%-TJ)νz9 2p㣋ޮp4::- -P;dCV;da X4\y*tBw*t^\uQ !K #Vݤ *tB ~:5Z;f:˷jDv,[<(r<6$ۖqq̞pjKoY ;_@(35$8]1 Q ]7 *R{wtg 7x` >K:sJwM {p3ݯWӵlUʷэQ^2].gnF'|BItOm XJ[y8/b3. _I]xltX]6K%%ѵ6Ūl-kbBwAUs۽*\-.MjP:d\^]oǻz,ݪ{UKX,H&^t "/nsFlƲf0YZx:LDf]EؼJJvMZ<(VY^e~*t57dCV;dCVOnsMjS$rlϫУY5 R\ʻyTEӝ ,А_K 0 1T_T*qHͬ՛@9KTȆ&vB]BaTe|)v][S3f>^WPegr5$$j%{)+< P GӅjU*76;A`{ųnkKxU R+W;ACC?U7]oxבeF?Cby̎n"]Ts]'ׂB TM?w&2n,Sn+*.]n8$LՌ5(n`LcE,. LEst=D]n+e|ٮ˙Qt=+4 te{bv8SᗿE#_9iA#]Tx jGW]vtsVorwC2ޖGD[{5"m]>AW-VC0ovl5=.c"b+zN5V-%拖7\~^Ut⍺3íI)wan>mܿ7]Sy?9?nN㍹>Sh.Ջ(/t(=k R5t/x]PxzºAt~{ȿ6>W%Z띡h}q9()WZVqyZ]7GA$a¦X? ]zk)sZ~%&wZˏ"Z%ex蚄죋cٽmHtLCm .%iG[u٠rί|{~@9st3~dܤͮ9K~Ptx}2Ae Ϲ=\;+ sUBKNvn߃D7p@V.]}Lfrsssi~D 癥Hꡋ}^OnJt3؍'Ȅk)xɇ[?vN7bWȔߪ᷻ 8fxxᜑ7CD8>s\.zߢ~UٯJaxw!4;ٖBnIWjwvAb]f3Pf>pݚzj誑ۡV-GEWy@6 e3~rız KNA5A7d[AM\ys4y&ou%^^p挓ʶ9܎Z[wg+CZ%FUUwUgz*6F.ɺ/|'(v'*tb vgzfKKt6;PtѫR[K`z[4D jVz?g̱1ccĿ~vZ's[t>Y~ӕ MJGUG}x̚ y"iktCR'-A?# wV;F8Ս7_,+-A6-=J:[O]hn+ hwy ] [F#R]~gJwew{@;"R+g~\Kˠy#Bo%A4LnBwU# ]uynFJI{V37ULV# ])on vI~~UYTl7UnzB7 T5@4="tPtpAӓG@o/3n=*%^sU_{ -zq<=K !q \}pצۮEDE!KڮB.^*H8j:KYC7x,r|̡.48lʝF3xTcOPŹ>b1eꞵR*醡/(Au@jO ]KM2tq" [(VWhn3kf),/]gUU㻅.ߢwTlwnSJk/kf+_}N7]Di t⋮UٜzQ/VvZvWlt ]֋lr)ve**wJlEovgs][^K@V{^B{ݽlshweߛ UG]zhX\qjܔK2oG+<_\Ezs]FӕMO'TR;Y.plU>M!\}&Rg۪7;_U#{^Lt>ͬ-eh.c+>|"*,lqzKUC$><K<{&S^j t7pc?xN I Js<ޭZ}Kt̶+ӍQ415{:|GC RKL*;id\TtXoۍxgXxPcyWΌ'&DMЕC9j}J*ؓ1R/+UUtĪ 7)AUC TQUSѕyRU(.^U3phjjݻ‚s+t--](5r|N%ԽFSLjU+хjx9ŞhCBt/B7(ԕDWq>w]JVe%'-pۼfN]tKQ8>3󲪣K%zp|ʭEy>s_斎e:gg^U[*tBwr_U;xA,n3:Eg+'9lЍu`ٓnCzUG]2cxFW*H*t,"tT8n. tetЬn+ }/9~`}xZg͖#JJnnW0~~gp>oniwۗJe( c܇{V]]߉";>]f\HZ)@O5OG$>. tm\n~ZwnR1,53 ?YҒNgFkЖJp.ӒNtK Q:EdN+Nt ZLmf؅y 7~uD:WJL.kDT̵tϼu jpt3 I_r[T ]%nί` \tv&\ IQ,WHLm!.IENDB`logisim-2.7.1/doc/de/img-guide/attrlib-and-replace.png0000644000175000017500000001335511541757124022424 0ustar vincentvincentPNG  IHDRlu|#PLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccR(IDATxkS8!@[‡vmafah0,_ɒCto$YGVELuUXUYUYӽr3֠{ZH,эIOF$A̢^{ ]{{v`l/!o*$݇: \W@< 1.娝q{`HKmwޫftO{EPFdp֧6 PY_1L4H⡢ }>SAw[5(ɻtjhſХxTΌ*Ffϯ7GJY&80Ǖخp& XQag3|I8ph%DGd8.J #KПg! 3)GF#3]ƴԷ W vצ/u_#*!晨ܛP +wu;DѼQ&xd:oM+W_y0( Dx=u!lAWG. ;li.59Fonec\gЯ&vtlۮxXyTs:lF?V&DN/3]',u->lW:~rӃ^44.}Q*(+N/G[1zK/V](S3?hC֙a9B+cޕ^"^?;.ݺ: 蒂S[Bw*tBw"t*p|U29MV(zEI*t.aƥ~*t,NM#vXC.tB ~$]OK{rtrgxXUpͧ#_*^fl]m5Kv#~z7]vw+dH,Ў]߾$wBUSn_,Rx_DGdѵ3/kzNTtW]t)\Є~ Y6tѝxUJ.x)\.[=~m'rtW/ &EܧE1['E+´ސ r٪R] 6Z%rT5KӕN.^DR"d]f{O̙Kki̵)dV XbTiK[KIW/xKhx)=Pv"S|כ)\F:3u 7pȷޛa_lazǛOG!t7â28UYeܜUfYU~i2g'wކD'#'o'#hXWF:({>{d-݁c59ϏF ^/ HHHCC/ 8нuk2ݿձV+LUFȘv/QC?[7n)n!_ =K7ֆ`B7Jdd93t5:"XliUjU)rժl*m կ7yۿծT9s"g7pMtŖ.KjBkUn-7Z(Ֆ+͵9oݔhowݒ촮6a>ڮx`gvt[dfEI_|{⨹G..əts.7ܾl]$ Ѻl UtFRת(kUy߈l7OV(Djtu%֪ޘU)t9^ENק*޹F,?9['%Z:IUK;4kbt]:kSp:)ъ艌D74AbP9Q8^\qI 0QitymLn s_pvf` Nte]YۻCMkrMMh=O=9hF=-ޅɩlשP-~:-]Af#ʍ7`֜Sc;L㻹h]*6A7}fneQl͘nњ!9WN!S}Gkjts3N! oR,t{lW4vwUn]͢{6*ZS[#]J`6˝+cDMT]Kە/ȖBe֬k& G.-wELս :7]2QϿY2D62"3rW̿ 'oh2DkNt%]pl{Wڮ2Dkrt}U3ؾ_:܌Z]ɀ<پ*H 3\[}.[ xtSӝy ,њ$s8[qn&nNE|G=z?A}Ǜ{>r?+Kį^/x;Ǝ" 6$;/֘&Өrʚ7+ ƎU=bl IצUe^WuxF޿=|B3|$N}֪ӕJ'9zz̛^`¿RFKcv>Xr {f/4Gn?ntm^)8Sߝ<]0.Vߝ>6^~BΕ#D$FoO7Y΅w=z*杛+]/=yBw"W-<Nݒo,[`A;&ZgA7k|to_EL;h=sE^>yCnwl ";] J^3UM(89sJ(Z?\ /R.~L=./w ףniu.\m &@w2#t+h(%etMxrUte*8[EU NW.8o(Tbjt_8aǞr9#ٮX ~ޘ=GX;۔.VSu5\8]YоT/ފ<yFWvޠ]Y";rN䄔XվT?t{Xu2Jr,wIIb"-Of䡫<Z{W:_[4" ZSS;gsָذLE]s"dlXEֳ a9ox^i\ذ7qvA4,[7Y ]+]ay%Z[~] 3=.t;bٛA)$ ]]_' l:P]o`tl-RgUg']䅮_WTe^n ƪEsnW8]տ@I>[T?:j&IENDB`logisim-2.7.1/doc/de/img-guide/attrlib-and-narrow.png0000644000175000017500000001446511541757124022324 0ustar vincentvincentPNG  IHDRlu|#PLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccRpIDATxiw85&iN44Sihw$WEP4ZA&E#բ 1 1kf-@(;EV\5NF$I dqI - v~x'ؓ;:Cz)e{L{+[,Rp~{rK":c.E7*O؈̹dhz>?44ƒ 'O~"q"~^,sKÇj]Kj2_  rtT12޼1efs^`, +jҐ|y>u:“vx:(J+f7WzH|s' )GA#3]vַ ~/߅44͑T8|k਋-22so"4!"ryv_/vp/t2juߴZl7Qt\GV!HXRN:5$J}2ۮm'kM۵ۘWd,n:ˣ>,=9-+f?WFk^f,NNYkn?\|.&ƕ]]ޥI,[vrňtrRBn ]rԻucHٟwQpu%e  )44}m&j}zz]kp]œΕ{e dpѭsga0]TyjptTYUYhW`twʼnWBwj_MDvd*5wLO=$jC*}Z*ٽrtgqgHSp#_2^v6mmʚ;`n}i!yӕ*n6j)t,@ۈʈ+=W`; +╯\Uz)}h +0Apeaf|Q/Itg^.>w ߆./8\]<^ +Ձ x+^֌R=ުnWvD|պ;7/1-g})⼐٢??~QxA5i- #Zr(a.UdR]cU ^vR|VBYUkͅ%Z,] Kl~ʒT&&ܪ'Bf[U[X,K|O3NWx%@f LmfTE=_oƶfPjmfR01z"ץ'%7NwO7(Bj޵Q]`Ͱ_e~*tǬ57f1ʛ&cVO^u8w~*2=(xG'2bnyf{\ N)trl?y5/t#eF4Gnѽm+2ݿ}3[u W!eĶ{H ݻз/1#^5B?R ފ'7`B7JHJf+}懗=o[˿>;[U"W+D7?v]2)r`D-T۟xF UU&DtBb Ŷ7nvdWe}3ĵ*N6oCQw\b#-3fn-efIQ_<}?ߎNKv`=lĬt}6+r]dypKa_-2^3:]jPZx%k&CktۏnӪn`(,yB](ܼID!01"v:+,iS53Qq]ƂMBw$CCv-%F 3glDlIE NY Ԙ !"\zWoJ t!FS#]"$CۥMR2d6NҐHVf)XLGx.k78C 貕+T|mMAszk"P^Ɗb@׷b[I FN59F YN.-)ts.58#^SdsOXOAZm.:^. JW~H QFNdxբ?v vjbz%DhUIt)^:}_JwJNoyxeSq:)r-ϻtauKBh.( . [. N㭓(~xDȢE)2[qt=%,JKCe۸ g `vWf Nt b;#z)$y]jy$3n_iI~UϻK;u7{9q9x35Tc|77^B7XF3-t(oFsמ7{nj'm?+}S3]c'Ѡt\ Ć|wuf l !.@K6]ːQ_n2*_=H]\ﲂ ٺ4](E/0oR2 ٺ$^FmfV2 qK![FWX8y.ҵ 5о6+ͣ6ol_UK/.͜ayIL<~U~U-tŸ VJ&hk>5]iӠ=oXD7]9[*os[* &ŘoGC7KpG3)-dD1}wI<Ջoi.[U`i o|$ϛ^?k_0_P)_Utc5D'2KG'kI3~4f°_C9)pf5|6o׈oĩwsu%]S45Od;9:|t1ZԂ =@'n0d@)S1Xx6^~i { q[3`*0= t#) DembEr(3ueuJە7I6-t<\]B҅n;Cw=5t0t=B>i3{3ȆiOMnؾ*nxҝWt!]hĉBO$ꠋ|^NOVKwM#M֊ï*В(,UwfꞮ+ܯJbknt4_?|tMV`]J4]E(;]f/g! ӷBzAeY3탲븶]F62M.ou25L,~U7,@7;g#CREfrXt2y2b*6|U|Z9t>R$-V馽m9ZUrxctoDM[7ǃNYH7qfMWxfH9o:]E0hn(&8=,;O m YmkWU^D3-#Cpi;]sZNՒYEM͖$;݆Z'.Xt{Ms0Ԓ̼P/?o㷁n 󸯗jfw+]!B_ҿCɼ޼]ϴUUE}B7;=K]fە~lwKl[mb]qLgt-1d?kRQU| w'k^m쟋܊v_^yUFBwWKP FMxMVChٗ<_l7XF#UJf nJd2^@_B7Wt堻']gt7 ]j.7x"*td)tF&QW)Oyd`{&gAM;vMnk.7̺ nl=5ɘo=\ks@-m.ْPX7u* 7]LXBK]}VKBp4px̠.Xl7]4ēk<;]?E%JH쉣x|P;xKL/mĩb ~9 .ȫR键0\2*t}e`Bo9hр{Da+odI7~)3퐮4U@xzy&#"' R𗡌OE %v&=&tj 6ZKx͗Нtwܖ]4>tGao؅r%K@Ht1f^ql̔[ֻmCF@9]]\"OvbHʟ.t]anb{:.ȺuABMjJuەi63O+]V}Uvp՞,[%i$~U:]ʲamfTb/u۵E\+-kzbͪ+e=q{V3vik=.dV͓麮,,l kU%vycf6e.ζOfH׿,>C8s"]^gcDP㽁^_'>0cU6%d"Gg~)+6Aۡ`zG㭂DWxՙ_U]p59L-#nB~oO!uu:VN7!n!݈hӚ.ŻN}˱ZkX059% 5^n? 戋c!-8)~U,t!}qFbHFBWGk3p{ׯ_%e!k^ӝ~f7u+Ua+B<^CBkU݃3o^iх_fZn٦-|~45t_ˤ+9BaaKgt5wBKK또Lb>/.T6u@LZ]L:c_6/ZZ'$eofҧ8,'nO~Um7 pkLuaӺD>f:l)]6R%vmY30l(ͳE5xEzWe{޸&$ѝҷ45#.m,+mf?Ε X!}|nn mI4ʄdhr^ڮB7T]ҍUKozA2~ $.YDHN7.ICg*eoxѥ( P,s|3.u)tekUd6GpI/&t[: ݌}!5]rjlr[2l5.n͠YRڄŏfv; t^g4˟ɾvgY]ɧ<](_f`{"{g˿h{[.s4](ۉd5NjtYoCnţM$P?lmzӕJfŅĝQ΃%ۚV|i<'3vru+[oo_7]+KhKn3$ *."{]tce/еNiVJްn*aZABJbNV~ޭz7VN tGݶ]co\Hș'8l":]Ʌ$_nCWoF7td|.$E2\&cnIENDB`logisim-2.7.1/doc/de/img-guide/analyze-var.png0000644000175000017500000001233511541757124021040 0ustar vincentvincentPNG  IHDRn%PLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccRIDATxks!%LiX|ٚT /'$R>+4\DVԌHC/~\Mk@8.ԁB@!y5c Mk8t c Mk8t c Mk8tƢP8t U268 zY*ﺱliHա;f`Q(2N]pɕ.rbCկg;0o޷),o _6%U b~*?׼(7/0~~,޾May3nQ9[,nȳjp,4.kK,\y1Gpg7WoIX|D^E"r鿲tY# 5Cm6T yn!J7:i't(wKb||M.dO!x|Fw/].Eaş}B{͚fm23 YM>ntr'm2l^bdq1GP?ci^]*>FۭQXk4#yezKe>${7f \xW9^6rbDᷘigWS]aWfM3=-EOL\KPh0-|P8}uчo)7. E䛝yt`H,If[fز}m}m, ˈ|%rp)JHG.~>^Wy,2l(=k7ﯶH9(L_-U 6 O g+yu`rPr1^Tfr1& :R7=LΓ׹f]3ZφfMmJpY= FD%r?3R$ "AASh޾kð^'˗n[PHT->PHD->PHD->(\|w ϗ?/Cwxw:#~W>| _;ɏxPH2nQ(⥃ gůďD^^O@ wuBRH帶oQ{eSKQ 7譙¥^o)QuŔ&3m>ko 9yrkBPM AvB!C afa qW_l nPP1PH($g Z PH($OnS*\^ۡ;j)쇛^QㅀB™4,X=m8 C`F,B !PH3~($nӹ+OŽB4U(Nʶ[jhŇQ\gϿW_ .QX.Žip'q0Wy"g(K<[]k+ia-@aܢhԝU?Uzi v- ] vi vM L)lXh ܮp8ll/`7篿 WvܦPlU5#5/{1giҘkoW/n?1t?#eY(&4z((,e$i+D j}YLyӿxCS8e1CwSP!W8)X=8[F?# B@!yS^*CW6ip=|U),P(f W^lVо ;-O). ^^Ĭ$b4 s#[\U=T't|ġylyZ3YwQe9b?: ;0i=캇̋3 UXc+ظU>#= BlJ"1#eSP1>ViWsV));, c17ybenmדnG#ހ[ZCе_g<˕;[ zY[P֨?D!_&:yYI`(TC򰘅_ d&{VkS6P]{\l1+(| EȞ7ƺzYyX=֫>*<4 B~-Ǘs*ǡ{7bK;%sea#aCS`2}P/PrG|\bocccveW S|˭o{6|͡1^V^tFדUb Eݽ*V]w/P\1Cb :P1r|=Cb C q.BEg[N/2>(@!y1oOPHd eA($Gz,M y?xVi,>E!p/gmU9 l6f_>n sQìb;V@ۙ4*T>=aTHnvycɀܺ;rǿٟ/VNu6;φfMQ(t8ox#?JDEbw/hq߈)ߞ2DNͫSvuj2 ^eZlESRE;77kF$g쯍3_kꐪ|q+ܾ,W/9T)fq7Hf*o0c1])\)|~Ztw:p+^6ȳCB6j]ǥ:FViB),+Uuq+TTiwۙCҦmFvLw`y.g>_~f+su=tMB<V u4)Xٵe}T(;<:0g,GPXu&nPH3ϟU.os>{ۥ}aPGg`5o_.ȳ:<:c6KsAX3,iBq83,?" )ohL}̏fB#MBWx:t.˞?/_DzP3Z2F;f@y5?NvR~PG>EUljQ+ﯞ}GyeqX]3lf\$#^]S1sc.RU 9>)*̼6"ǖBcҭp@P QfEh@)<9> *(T1*4Fa EYGG@j0ԁ T~DZ1N c_XPEV?zB~"S&OVhsX'5{poI/ ,d xRة0^3Ba kFXTX*PB ~@!AB?°‹ދ$\`c B@!{=Pe  ~v^`"4#, *z}9R2 B ~$0X8vjP: B.$\`c B@!{=P 7"}X܈A t+2.s B ~@!AB?TFWdܵL^qמ=(d B@!{00{ͩ،0]{њƻ]x꟔mFH @PH@aP($0,{lFHRT﮽\?J O. B@!{=P( h;̵MI1>4.iB@PH@ah #TkFXRTq;[p=P(d B@ah.(axsOE($04PP( ( MN*"r̵{=P(d x}n[k0Y8SWq;4PP( ( zF SazgQuP8pFܾC`dOs_(^e}AFRTgrW 3%#ҪY8o90Wָ# LlM5N GJp44 GJp44 Gr(y>8wOB0(d B\7橛DIENDB`logisim-2.7.1/doc/de/img-guide/analyze-out.png0000644000175000017500000001242511541757124021057 0ustar vincentvincentPNG  IHDRn%PLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccRPIDATx}s#:;vzpz߼@PPYg y\!"@cŀ2 R B@!yW8~uz>0?n^z̭JvمTZCTGƫ{5<ZO4TaRaq6@ƤiNr!-^X BkQTJZTho[ξh5 ɸ},Q9fD!k-ql)D年eE=BmzM^a^ǨZ0Mwt^4xИq(,gЌkcK+]٠P g{_yy—Ekjeu&(uVۼZ^P-˟'h1 >daf) p&˦Ξ3"oDyΊslPhEgVN*՟_η_>bF#F},4:BDGjyzUvd'ڿhT('5 b&:^9ZTxN\ 1Nw!` bՔe wǪWZ +fbDވ~+l#RR#vf6M, 7\{5(.ߟ꿻rmzxzL?wDʎ8^0(EeY;o>W=!v: r Y縹w= &4 {yj~UF? -AXzz9xCz 1 :hS:>ToMTPqoMTPqoMTPqoMՉqx⌭&4(?߫땢vM_S/&坣T=<oKfOEZVq* sy3ak;WRu`.nes3iF'μP֩e Æ^0_~˥eCeTZMrˆ(7ۓf ĬܝRfS~N+{Nbv[8UZh!le/E*yFf2 2aD8|] )+O(OհN?Sw]o:K#/XS(NzY'+p~J7[>XEX%jXlS ˎԞ0T4S7UT0+V5,ɀF״yy-T0M?FvA(?vXyM|ʡlS :k-֭BϵP `n)f39ѰUy#5St791oՕ5 rkh4"mSb-oR~> _+YD[-1I,63+|[>m*ϦxCm*(87tЦŽxCm*(87tЦŽxCm*(87tЦ {:,P~9G0tミC+\cЖGubv7EmyѾ%PH ($T8xR(|x;=PH< PH 0^PH gB@!yBCo($P~  PH($ B@!yPH KNϥvpUDW;Z{7^?u8;?gpʭŽ[\b;V,xE,|.Wz[?9t;R(tBI:XRAn#.ƱU(ׯU?=Ca[|(\8.p* )Z?yqG: ֟5b߷4(TB(CBSxmiO?D湎VnБPM 2 kP !^fa ծqW/ 7 P (  PH($ 90Ps yR(Zd{6.{_zv?vE 9o6\/x(L-xw(Yy*3K}Ҏt,#ѓ Y" IHUjumzǶ Z‘"(T#R~+B1FFH!mHBa_{AYvx@!y*7et~>PK+|,j[+^T5qFLLW8ʇ;q0W[}i/e(Y@a<wt;5 sBf/eySzwj q:ҖYH!)z|>PJusU5"#R>5 H@ B@!yIjΝRؔPv gIvZO).e/<4-XIVGeֱ曗'rG2Ū ;U"h,':Oʬ㻨l3s]i0 xXsOm2f>bG*b?#mKzD)eB{ɺS Za<Ɏb;{np;gCawW. S~5 #QdqBnńV^&S);Ba`}:1>75_]GFnP[&Sa#RYY;Ba`17y4M'0*M;)8M6x6l7zcu<) snaWQȗF'8n zv"[y)TC`(TΞ3>g" d[}TH^hyn*A{-חcvN,NuezSyJ!?m>b'zY 'w{bd!+N6MY+jD^S& P?5j?zͺ/96MOgzs$3qZqSO`(TcbѓC y:YlPsC C (MC;=w (@!yCuW#xF4āPYVh|OwB,4 vAv־&m~,ëq|]ǁr VZP-g[ZۄB.qNP(r<6Ӵ:PBGuoGeYT}ڷm$8ތ5PfPvz-d}kMg'=VVt#NCvC;%G8_dA, Õۀ«r(Wsc妪(T /«KjR9(L!kgnSZ!h B@!yb=_3IENDB`logisim-2.7.1/doc/de/img-guide/analyze-min.png0000644000175000017500000001221011541757124021023 0ustar vincentvincentPNG  IHDRn%PLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccRIDATx oFp"BtZߗ~G'!] vl/ЄM! B@!{=W81T/ݠAv<}K)좣X\NC[!mI* TȿfPQEm-̢(ciz #Qq/d5@[4MPTHu_BJy՟ xZ}H>g}<ͭD!: ?k#'?qbA(~+.+Y{e}5  «4  «4Bs*LNisqԮzFtCgo/+qq5w;:nێu+7_TF'(1k ftAuLrnsFV"E]C8rFP (d'Sxt/VStB!?Ba0%P 0Ë {=P(dR~ o0n B@!{=P(d B@!{=P(d B@!{nFa!hMo]~gfRxPP(d  r( )bd*;{s^zNJU>N-VB^<+<{'^"1Ojލ.ԕ Q({'rqhb5p߿~JWύXZMR>::wnLaXyGEZTH (4Pȁ4B.SHtgM0M)haL63doSaB@!{=P(d B@!{4QiKK/yQ=s&*N6o05X+fڼڢCUE@!6A5B(lʃ«ꠢq!*B_qIMy8=B@!{=L S8t IdG;9Q?(lz p` -<&iY6(l8t(x+,Y:'_#"W(j6c:6Da+PCPCs°BE!^*NTX^'+w: K_?TH )F[[vhǦ+a] f\~SZs{ P(d)E=P(d B@!{=P(d B@!{=P(dhI-Y᙭)Oh􉆏B*R_#)xoQfEu\4t #n 5觸?[c'+-^g>(OǰVhG,AF 0wmAF gaKfcFzQl/U@a;)q2?M`ţMy`/ oW`[JTàk2Tn,GQ8-IRl e!yy^ 6ϗqPiC/O]2H65t!G)#I^_فMi41(mA G'jQf((-SNtrk2PC"big]?Tɣ =9*`|d]YPQ>>Ő,$˴' &O&~R;YyګbYM4˔E~tyQG@q:[W}G@a J{ (<? ap+^t 5(d B@!{=P(d B@!{=P(d y: #(d 1 #:5B~wO¡4O {=P0w#!ݣJ7Q(gp>J{L@!{=P(d Z_gYoC7@|J|ivƗAag|ivƗAag|ivqV堰3S=$4}]d^j0]qPXNWpHsy#_zv]Z <bބFz t.\L7 r7}O(DUiumz"‹yTN.z }BAЉ+ϴzN)GrBawɰSlƛT su3zt i G{: uKQXF6lٹ}Mr Y=}x:yTy @5F6VQҌS|U IgFuס碜Da/83]9(yh(̙l34 ;K㠰34 ;K㠰3\B]*&VB@!{=PȞѓ}WwIENDB`logisim-2.7.1/doc/de/img-guide/analyze-expr.png0000644000175000017500000001261011541757124021222 0ustar vincentvincentPNG  IHDRn%PLTEƽJkcޜccsss{kkss{{{Ƅ9c)))ƽޭ֜s))ƌ޵cc1!!絭ZR޽sR!!cccRIDATxySHK*hk X||l,Svt HH@Aq    ٫I__WF[^:a2m:z_Y$~m7ĿcDt-:NA.u)΢(ef4 a9(wE QsKML(鄣,B5315/; ՟ (@-uo|žBCtQ^kWDUYOL6]VDEۋxHk%cSr.~]^W#9Ę17)ӧO'5 مr"D4/E{L-: 67?3WT8^SOwsUp9~Ƅ 1'P&)Y8vm67!p:7"N?Xpi쐉i4YjYkYK]жr*˜bKcн敥{FfaQ,FџC5©tJs4 :LAsL-& ˚6?ĶrC;G0\oL(mtf Bμt.'yeՒ&ޡ#( 6y5xVo +T#&Ʌɽ斵0GglLpP]z\QHvڕf Bǚ T",_.@)sJvGs!}jlnYo-T66+&R{\zV\F{z~M'ZkD:NVWZ(RBhU6 )@e3eu"b|جv"j_HŐpy+6ttD!'P0m*Ah aFjwΪNvKq(G"'ER$EB/p+h4m~B> Kqwm%~$ZI@ξ~O멻$YYNԕv:C8J:l\Mv#;ux|wK͍1@x6a=ac@XO@XzKFᵌa.p g\d\0M¯ݸ&f 9qt՗ ]wUci'㊜gS>Nprw&(oڡHM;+2uA޼%i6}c)_-[iynP߯_U7Pf]w9-aܮ{1 2~CC!/oC+73mPԘv-#aZ2E( 27'{Eg;Rw扪2NsN}[=K!,$n&Nl<׏[1YT:zihL[qǷ&FLi#ͽqGb7@)QYUe [6n۳^ ͕-_dy3蠟.#d͘Q|#ciu^m)iҼ7 V—a ,?I} awv\J{[]^m3cڭlrsKZvcLxn\kPҵpj:ן3Saya_So{2gnj̝HQx4ͯH{ٷtGӛvBH"yb> hz-8s(QNԸ1,㮅":] u?# a8g/‚PnzO9.Is5~ .en2Z5%0Ifa#ۺ=^&ާ3+ҐRyY뙚jğNiF^x~̧kzJ4TN#_*NkSac@XO@X- lVw"vA˾aD!Ѕe^^c|mGawCΟE]מӒ ޝꍀRϷd<'7!A(& E {!{!{!{)@Ly_B^BBBBBBBBBBBBBBBBBBBBE_~sj- yP\'Qs~Cҥ8!~+&|kě'Y&x1/'EN>K›1߄u_"NO<<(@xYz+Z# <(%ox+1 >p%fE !{!{!{!{ݚ (rⰺ7!䬅? CΰFs*Bz9׾5A U@^@^@^@^@أja~MI΄ͱ01,[ Tf*s7}]jKR7ɒ|q&C3ȉ4+# Zp=zj8ːz=XὸH&qY:5[][N\~n.U Wf$; #m-C1䱐qVqZEEeDV3a1G>ȣ glĥ؂=uTtk] DŽЬ ٞ͂F7:^cKbѾa6qY!q&6mQpK3:C#Kv.E/}B5:);_YJeIENDB`logisim-2.7.1/doc/de/icons/0000755000175000017500000000000011541757120015335 5ustar vincentvincentlogisim-2.7.1/doc/de/html/0000755000175000017500000000000011541757120015166 5ustar vincentvincentlogisim-2.7.1/doc/de/html/libs/0000755000175000017500000000000011541757122016121 5ustar vincentvincentlogisim-2.7.1/doc/de/html/libs/plexers/0000755000175000017500000000000011541757124017605 5ustar vincentvincentlogisim-2.7.1/doc/de/html/libs/plexers/selector.html0000644000175000017500000000503411541757124022315 0ustar vincentvincent Bit-Wähler

    Bit-Wähler

    Bibliothek: Auswahlschaltungen
    Eingeführt: 2.0.5
    Aussehen:

    Verhalten

    Given an input of several bits, this will divide it into several equal-sized groups (starting from the lowest-order bit) and output the group selected by the select input.

    For example, if we have an eight-bit input 01010101, and we are to have a three-bit output, then group 0 will be the lowest-order three bits 101, group 1 will be the next three bits, 010, and group 2 will be the next three bits 001. (Any bits beyond the top are filled in with 0.) The select input will be a two-bit number that selects which of these three groups to output; if the select input is 3, then 000 will be the output.

    Pins (wenn das Bauelement nach Osten zeigt)

    West edge (input, bit width matches Data Bits attribute)
    Data value from which bits should be selected for the output.
    East edge (output, bit width matches Output Bits attribute)
    A group of bits from the data value, as selected by the select input.
    South edge (input, bit width is quotient of Data Bits and Output Bits, rounded up)
    Select input: Determines which of the bit groups should be routed to the output.

    Attribute

    When the component is selected or being added, the digits '0' through '9' alter its Output Bits attribute, Alt-0 through Alt-9 alter its Data Bits attribute, and the arrow keys alter its Facing attribute.

    Ausrichtung
    Die Richtung des Bauelements (Lage des Ausgangs im Vergleich zum Eingang).
    Data Bits
    The bit width of the component's data input.
    Output Bits
    The bit width of the component's output.

    Verhalten des Schaltwerkzeugs

    Keines.

    Verhalten des Textwerkzeugs

    Keines.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/plexers/priencod.html0000644000175000017500000001036111541757124022277 0ustar vincentvincent Prioritätsenkoder

    Prioritätsenkoder

    Bibliothek: Auswahlschaltungen
    Eingeführt: 2.3.0
    Aussehen:

    Verhalten

    Das Bauelement hat eine Anzahl von Eingängen auf der westlichen Seite, der erste Eingang ist markiert mit 0 und die anderen sind fortlaufend nummeriert. Das Bauelement ermittelt alle Eingänge, die auf 1 gesetzt sind und gibt den höchsten auf diese Weise gefundenen Index weiter. Angenommen, die Eingänge 0, 2, 5 und 6 sind alle auf 1, dann gibt der Prioritätsenkoder den Wert 110 weiter. Wenn keiner der Eingänge auf 1 gesetzt ist, dann ist das Bauelement deaktiviert und der Ausgang des Prioritätsenkoders ist offen.

    Der Prioritätsenkoder ist so konstruiert, daß eine Reihe von Enkodern kaskadiert werden können, um weitere Eingänge zur Verfügung zu stellen. Insbesondere enthält das Bauelement einen Freigabeeingang und einen Freigabeausgang. Wenn der Freigabeeingang auf 0 gesetzt ist, ist das Bauelement deaktiviert und alle Ausgänge sind offen. Der Freigabeausgang ist 1, wenn das Bauelement aktiviert ist, aber keiner der Eingänge auf 1 gesetzt ist. Daher können Sie zwei Prioritätsenkoder nehmen, und den Freigabeausgang des ersten mit dem Freigabeeingang des zweiten verbinden: wenn irgendeiner der indizierten EIngänge des ersten Enkoders auf 1 gesetzt wird, dann wird der zweite Enkoder deaktiviert und dessen Ausgänge bleiben offen. Wenn aber keiner der indizierten Eingänge des ersten Enkoders auf 1 gesetzt ist, dann bleiben dessen Ausgänge offen, der zweite Enkoder wird freigeschaltet, und dieser identifiziert den Eingang höchster Priorität, der eine 1 aufweist.

    Ein weiterer Ausgang des Enkoders ist 1, wenn der Enkoder aktiviert ist, und wenn eine 1 an einem der indizierten Eingänge anliegt. Wenn mehrere Prioritätsenkoder verkettet werden, dann kann dieser Ausgang benutzt werden anzuzeigen, welcher der Enkoder getriggert wurde.

    Pins (wenn das Bauelement nach Osten zeigt)

    Westseite, variable Anzahl (Eingänge, Bitbreite 1)
    Eingangswerte, indiziert mit 0 an der oberen, westlichen Ecke der Seite.
    Ostseite, oberer Pin (Ausgang, Bitbreite entspricht dem Attribut Auswahlleitungen)
    Ausgang: der höchste Index der Eingänge, die auf 1 gesetzt sind - oder offen, wenn kein Eingang auf 1 ist, oder wenn das Bauelement über den Freigabeeingang deaktivert wurde.
    Ostseite, unterer Pin (Ausgang, Bitbreite 1)
    Gruppenauswahl: 1 wenn das Bauelement aktiviert ist, und wenn mindestens einer der indizierten Eingänge auf 1 gesetzt ist, ansonsten 0
    Südseite (Eingang, Bitbreite 1)
    Freigabeeingang: das Bauelement ist deaktiviert, wenn dieser Eingang auf 0 gesetzt ist, ansonsten ist das Bauelement aktiviert.
    Nordseite (Ausgang, Bitbreite 1)
    Freigabeausgang: 1 wenn dieses Bauelement aktiviert ist und keiner der indizierten Eingänge auf 1 gesetzt ist, anderenfalls ist dieser Ausgang 0.

    Attribute

    Wenn das Bauelement ausgewählt ist oder gerade hinzugefügt wird, dann ändern die Ziffern 1 bis 4 das Attribut Auswahlleitungen, und die Pfeiltasten ändern das Attribut Ausrichtung.

    Ausrichtung
    Die Richtung des Bauelements (Lage des Ausgangs im Vergleich zum Eingang).
    Auswahlleitungen
    Die Bitbreite des primären Ausgangs Die Anzahl der indizierten Eingänge des Prioritätsenkoders ist 2Auswahlleitungen.

    Verhalten des Schaltwerkzeugs

    Keines.

    Verhalten des Textwerkzeugs

    Keines.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/plexers/mux.html0000644000175000017500000000544311541757124021312 0ustar vincentvincent Multiplexer

    Multiplexer

    Bibliothek: Auswahlschaltungen
    Eingeführt: 2.0 Beta 11
    Aussehen:

    Verhalten

    Copies an input on the west edge onto the output on the east edge; which of the inputs to copy is specified via the current value received through the input on the south edge. I find it useful to think of a multiplexer as analogous to a railroad switch, controlled by the select input.

    (Incidentally, some authorities spell this multiplexor, but multiplexer is the predominant spelling.)

    Pins (wenn das Bauelement nach Osten zeigt)

    West edge, variable number (inputs, bit width matches Data Bits attribute)
    Data values, one of which is to be routed to the output. Each input data value is numbered, starting with 0 on the north.
    East edge (output, bit width matches Data Bits attribute)
    The output value will match the input values on the west edge whose number is the same as the value currently received through the select input on the south. If the select input contains any unspecified (i.e., floating) bits, then the output is completely floating.
    South edge (input, bit width matches Select Bits attribute)
    Select input: The value of this input determines which input on the west edge to route to the output on the east edge.

    Attribute

    When the component is selected or being added, the digits '1' through '4' alter its Select Bits attribute, Alt-0 through Alt-9 alter its Data Bits attribute, and the arrow keys alter its Facing attribute.

    Ausrichtung
    Die Richtung des Bauelements (Lage des Ausgangs im Vergleich zum Eingang).
    Auswahlleitungen
    The bit width of the component's select input on its south edge. The number of inputs to the multiplexer will be 2selectBits.
    Data Bits
    The bit width of the data being routed through the multiplexer.

    Verhalten des Schaltwerkzeugs

    Keines.

    Verhalten des Textwerkzeugs

    Keines.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/plexers/index.html0000644000175000017500000000266011541757124021606 0ustar vincentvincent Plexers Library

    Auswahlschaltungsbibliothek

    The Plexers library includes control components. Like the components of the Gates library, all are combinational, but their purpose is generally for routing values.

    Multiplexer
    Demultiplexer
    Dekoder
    Prioritätsenkoder
    Bit-Wähler

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/plexers/demux.html0000644000175000017500000000576711541757124021634 0ustar vincentvincent Demultiplexer

    Demultiplexer

    Bibliothek: Auswahlschaltungen
    Eingeführt: 2.0 Beta 11
    Aussehen:

    Verhalten

    Copies the input on the west edge onto exactly one of the outputs on the east edge; which of these outputs is specified via the current value received through the input on the south edge. I find it useful to think of a demultiplexer as analogous to a railroad switch, controlled by the select input.

    (Incidentally, some authorities spell this demultiplexor, but demultiplexer is the predominant spelling.)

    Pins (wenn das Bauelement nach Osten zeigt)

    West edge (input, bit width matches Data Bits attribute)
    The value to be routed to one of the outputs on the east edge.
    East edge, variable number (outputs, bit width matches Data Bits attribute)
    The outputs are numbered starting with 0 on the north. An output will match the west input if its number matches the value currently received through the select input on the south; otherwise, its value will be either all-zeroes or all-floating, depending on the value of the Three-State? attribute. If the select input contains any unspecified bits, then all outputs are floating.
    South edge (input, bit width matches Select Bits attribute)
    Select input: The value of this input determines to which output on the east edge to route the value received on the west edge.

    Attribute

    When the component is selected or being added, the digits '1' through '4' alter its Select Bits attribute, Alt-0 through Alt-9 alter its Data Bits attribute, and the arrow keys alter its Facing attribute.

    Ausrichtung
    The direction of the component (specifying which side has the outputs).
    Auswahlleitungen
    The bit width of the component's select input on its south edge. The number of outputs for the demultiplexer will be 2selectBits.
    Data Bits
    The bit width of the data being routed through the demultiplexer.
    Three-state?
    Specifies whether the unselected outputs should be floating (Yes) or zero (No).

    Verhalten des Schaltwerkzeugs

    Keines.

    Verhalten des Textwerkzeugs

    Keines.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/plexers/decoder.html0000644000175000017500000000441611541757124022105 0ustar vincentvincent Dekoder

    Dekoder

    Bibliothek: Auswahlschaltungen
    Eingeführt: 2.0 Beta 11
    Aussehen:

    Verhalten

    Emits 1 on exactly one output; which output is 1 depends on the current value received through the input on the south edge.

    Pins (wenn das Bauelement nach Osten zeigt)

    East edge, variable number (outputs, bit width 1)
    The outputs are numbered starting with 0 on the north. Each output will be 1 if its number matches the value currently received through the select input on the south; otherwise, its value will be either zero or floating, depending on the value of the Three-State? attribute. If the select input contains any unspecified bits, then all outputs are floating.
    South edge (input, bit width matches Select Bits attribute)
    Select input: The value of this input determines which of the outputs is 1.

    Attribute

    Wenn das Bauelement ausgewählt ist oder gerade hinzugefügt wird, dann ändern die Ziffern 1 bis 4 das Attribut Auswahlleitungen, und die Pfeiltasten ändern das Attribut Ausrichtung.

    Ausrichtung
    The direction of the component (specifying which side has the outputs).
    Auswahlleitungen
    The bit width of the component's select input on its south edge. The number of outputs for the decoder will be 2selectBits.
    Three-state?
    Specifies whether the unselected outputs should be floating (Yes) or zero (No).

    Verhalten des Schaltwerkzeugs

    Keines.

    Verhalten des Textwerkzeugs

    Keines.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/mem/0000755000175000017500000000000011541757124016701 5ustar vincentvincentlogisim-2.7.1/doc/de/html/libs/mem/shiftreg.html0000644000175000017500000001066311541757124021410 0ustar vincentvincent Schieberegister

    Schieberegister

    Bibliothek: Memory
    Eingeführt: 2.3.0
    Aussehen:

    Verhalten

    This register consists of several stages, where each clock may lead to each stage receiving the value in the previous stage, while a new value is loaded into the first stage. The component optionally also supports parallel loads and stores to all stages' values.

    The clear input resets all stages to 0 (all zeroes) asynchronously; that is, as long as the clear input is 1, all values are pinned to 0, regardless of the clock input.

    Pins

    * An asterisk marks pins that exist only when the Parallel Load attribute is enabled.

    West edge, top pin (input, bit width 1)
    Shift: When 1 or disconnected, all stages advance with the clock trigger; but if it is 0, no advance takes place. This input is ignored if the Load input is 1.
    West edge, middle pin (input, bit width matches Data Bits attribute)
    Data: When advancing the stages, the value found at this input is loaded into the first stage.
    West edge, bottom pin marked with triangle (input, bit width 1)
    Clock: At the instant that this is triggered as specified by the Trigger attribute, the component may advance the stages or load new values.
    *North edge, left pin (input, bit width 1)
    Load: When this 1, the values found on the other north-edge pins are loaded into all stages at the next clock trigger. When 0 or disconnected, no load occurs.
    *North edge, other pins (input, bit width matches Data Bits attribute)
    Data: These values are loaded into all stages when the clock is triggered while the load input is 1. The leftmost input corresponds to the youngest stage.
    South edge, left pin (input, bit width 1)
    Clear: When this is 1, all stages are asynchronously reset to 0, and all other inputs are ignored.
    *South edge, other pins (output, bit width matches Data Bits attribute)
    Output: Emits the value stored in each stage, with the youngest stage reflected on the leftmost of the pins (next to the clear input).
    East edge (output, bit width matches Data Bits attribute)
    Output: Emits the value stored in the final (oldest) stage.

    Attribute

    When the component is selected or being added, the digits '0' through '9' alter its Number of Stages attribute and Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the value stored in each stage.
    Number of Stages
    The number of stages included in the component.
    Parallel Load
    If yes, then the component includes inputs and outputs facilitating parallel access to all the stages' values.
    Trigger
    Configures how the clock input is interpreted. The value rising edge indicates that the register should update its value at the instant when the clock rises from 0 to 1. The falling edge value indicates that it should update at the instant the clock falls from 1 to 0.
    Label
    The text within the label associated with the component.
    Label Font
    The font with which to render the label.

    Verhalten des Schaltwerkzeugs

    If the Parallel Load attribute is no, or if the Data Bits attribute is more than 4, then poking the register has no effect. Otherwise, clicking the component will bring keyboard focus to the clicked stage (indicated by a red rectangle), and typing a hexadecimal digit will change the value stored in that stage.

    Verhalten des Textwerkzeugs

    Allows the label associated with the component to be edited.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/mem/rom.html0000644000175000017500000000657111541757124020375 0ustar vincentvincent ROM

    ROM

    Bibliothek: Memory
    Eingeführt: 2.1.0
    Aussehen:

    Verhalten

    The ROM component stores up to 16,777,216 values (specified in the Address Bit Width attribute), each of which can include up to to 32 bits (specified in the Data Bit Width attribute). A circuit can access the current values in ROM, but it cannot change them. The user can modify individual values interactively via the Poke Tool, or the user can modify the entire contents via the Menu Tool.

    Unlike the RAM component, the ROM component's current contents are stored as an attribute of the component. Thus, if a circuit containing a ROM component is used twice, then both ROM components will hold the same values. Also because of this behavior, the current ROM contents are stored in files created by Logisim.

    Current values are displayed in the component. Addresses displayed are listed in gray to the left of the display area. Inside, each value is listed using hexadecimal. The value at the currently selected address will be displayed in inverse text (white on black).

    Pins

    A on west edge (input, bit width matches Address Bit Width attribute)
    Selects which of the values are currently being accessed by the circuit.
    D on east edge (input/output, bit width matches Data Bit Width attribute)
    Outputs the value at the currently selected address at the D pin if sel is 1 or floating. If sel is 0, then D will be floating.
    sel on south edge (input, bit width 1)
    If you have just one ROM module, ignore this input. If you have multiple ROM modules in parallel, you can use this input to enable or disable the entire ROM module, based on whether the value is 1 or 0. In other words, when this is 0, no value is emitted on the D output.

    Attribute

    When the component is selected or being added, the digits '0' through '9' alter its Address Bit Width attribute and Alt-0 through Alt-9 alter its Data Bit Width attribute.

    Address Bit Width
    The bit width of the address bits. The number of values stored in ROM is 2addrBitWidth.
    Data Bit Width
    The bit width of each individual value in memory.
    Contents
    Stores the contents of memory.

    Verhalten des Schaltwerkzeugs

    See poking memory in the User's Guide.

    Verhalten des Textwerkzeugs

    Keines.

    Menu Tool Behavior

    See pop-up menus and files in the User's Guide.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/mem/register.html0000644000175000017500000000751411541757124021422 0ustar vincentvincent Register

    Register

    Bibliothek: Memory
    Eingeführt: 2.0 Beta 1
    Aussehen:

    Verhalten

    A register stores a single multi-bit value, which is displayed in hexadecimal within its rectangle, and is emitted on its Q output. When the clock input (indicated by a triangle on the south edge) indicates so, the value stored in the register changes to the value of the D input at that instant. Exactly when the clock input indicates for this to happen is configured via the Trigger attribute.

    The reset input resets the register's value to 0 (all zeroes) asynchronously; that is, as long as reset is 1, the value is pinned to 0, regardless of the clock input.

    Pins

    East edge, labeled Q (output, bit width matches Data Bits attribute)
    Outputs the value currently stored by the register.
    West edge, labeled D (input, bit width matches Data Bits attribute)
    Data input: At the instant that the clock value rises from 0 to 1, the register's value changes to the value of the D input at that instant.
    West edge, labeled en (input, bit width 1)
    Enable: When this is 0, clock triggers are ignored. The current value continues to appear on the output. The clock triggers are enabled when this input is 1 or undefined.
    South edge, indicated with a triangle (input, bit width 1)
    Clock input: At the instant that this input value rises from 0 to 1 (the rising edge), the register's value will be updated to the value of the D input.
    South edge, labeled 0 (input, bit width 1)
    Asynchronous reset: When 0 or undefined, this input has no effect. As long as it is 1, the register's value is pinned to 0. This occurs asynchronously - that is, without regard to the current clock input value. As long as this is 1, the other inputs have no effect.

    Attribute

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the value stored in the register.
    Trigger
    Configures how the clock input is interpreted. The value rising edge indicates that the register should update its value at the instant when the clock rises from 0 to 1. The falling edge value indicates that it should update at the instant the clock falls from 1 to 0. The high level value indicates that the register should update continuously whenever the clock input is 1. And the low level value indicates that it should update continuously when the clock input is 0.
    Label
    The text within the label associated with the register.
    Label Font
    The font with which to render the label.

    Verhalten des Schaltwerkzeugs

    Clicking the register brings keyboard focus to the register (indicated by a red rectangle), and typing hexadecimal digits will change the value stored in the register.

    Verhalten des Textwerkzeugs

    Allows the label associated with the component to be edited.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/mem/random.html0000644000175000017500000001016011541757124021045 0ustar vincentvincent Zufallsgenerator

    Zufallsgenerator

    Bibliothek: Memory
    Eingeführt: 2.3.0
    Aussehen:

    Verhalten

    This component iterates through a pseudorandom sequence of numbers, which steps forward to the following number in the sequence each time the clock is triggered while the component is enabled. Technically speaking, the algorithm used to compute the pseudorandom sequence is a linear congruential generator: Starting from a seed r0, the following number r1 is the number

    r1 = (25,214,903,917 r0 + 11) mod 248

    The next value r2 is computed from r1 using the same computation, and so forth. This sequence is of 48-bit numbers; the value seen from the component is the low-order bits as configured by its Data Bits attribute, after first throwing out the lower 12 bits of the current seed.

    Besides the clock input, the component also includes an enable input, which leads the clock input to be ignored when enable is 0, and the reset input, which resets the component's value asynchronously to the initial seed r0.

    The initial seed is user-configurable. If it is configured at 0 (which is the default), then the seed is based on the current time; when instructed to reset through the reset input, the component starts with the same seed based on the past time. It acquires a new seed only when the entire simulation is reset.

    Pins

    East edge, labeled Q (output, bit width matches Data Bits attribute)
    Outputs the value currently stored by the component.
    West edge, top pin, labeled with a triangle (input, bit width 1)
    Clock: At the instant that this is triggered as specified by the Trigger attribute, the component steps to the following number in its sequence.
    West edge, bottom pin (input, bit width 1)
    Enable: The component is enabled when this input is disconnected or 1; but if it is 0, then the clock input is ignored.
    Südseite (Eingang, Bitbreite 1)
    Reset: When this is 1, the pseudorandom sequence asynchronously resets to its initial seed.

    Attribute

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the value emitted by the component.
    Seed
    The starting value used for the pseudorandom sequence. If this is 0 (the default), then the starting value is based on the time that the current simulation began.
    Trigger
    Configures how the clock input is interpreted. The value rising edge indicates that the component should update its value at the instant when the clock rises from 0 to 1. The falling edge value indicates that it should update at the instant the clock falls from 1 to 0.
    Label
    The text within the label associated with the component.
    Label Font
    The font with which to render the label.

    Verhalten des Schaltwerkzeugs

    Keines.

    Verhalten des Textwerkzeugs

    Allows the label associated with the component to be edited.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/mem/ram.html0000644000175000017500000001467011541757124020356 0ustar vincentvincent RAM

    RAM

    Bibliothek: Memory
    Eingeführt: 2.0 Beta 1
    Aussehen:

    Verhalten

    The RAM component, easily the most complex component in Logisim's built-in libraries, stores up to 16,777,216 values (specified in the Address Bit Width attribute), each of which can include up to to 32 bits (specified in the Data Bit Width attribute). The circuit can load and store values in RAM. Also, the user can modify individual values interactively via the Poke Tool, or the user can modify the entire contents via the Menu Tool.

    Current values are displayed in the component. Addresses displayed are listed in gray to the left of the display area. Inside, each value is listed using hexadecimal. The value at the currently selected address will be displayed in inverse text (white on black).

    The RAM component supports three different interfaces, depending on the Data Interface attribute.

    One synchronous load/store port (default)

    The component includes a single port on its east side that serves for both loading and storing data. Which it performs depends on the input labeled ld: 1 (or floating) indicates to load the data at the address designated on the component's west side, and 0 indicates to store the data given on the port. To transmit data into and out of the component, you will need to use a Controlled Buffer component, as illustrated below.

    One asynchronous load/store port

    This is the same as above, except that there is no clock. The value found on the data bus is stored into memory whenever the ld input is 0. If, while the ld input is 0, the address or data changes, then an additional store occurs. This option is meant to more closely approximate the interface of many available random-access memories.

    Separate load and store ports

    Two data ports are provided - one on the west side for storing data, and another on the east side for loading data. This option removes the necessity of dealing with the Controlled Buffer and so it is easier to use.

    Pins

    A on west edge (input, bit width matches Address Bit Width attribute)
    Selects which of the values in memory is currently being accessed by the circuit.
    D on west edge (input, bit width matches Data Bit Width attribute)
    This input is present only if "separate load and store ports" is selected for the Data Interface attribute. When a store is requested (via the clock changing from 0 to 1 while sel and str are both 1 or floating), the value found at this port is stored into memory at the currently selected address.
    D on east edge (input/output or output, bit width matches Data Bit Width attribute)
    If sel and ld are 1 or floating, then the RAM component emits the value found at the currently selected address on this port. If there is a single load/store port, the value read from this port is stored whenever a store is requested.
    str on south edge (input, bit width 1)
    Store: This input is present only if "separate load and store ports" is selected for the Data Interface attribute. When it is 1 or floating, a clock pulse will result in storing the data found on the west edge into memory (provided the sel input is also 1 or floating).
    sel on south edge (input, bit width 1)
    Chip select: This input enables or disables the entire RAM module, based on whether the value is 1/floating or 0. The input is meant primarily for situations where you have multiple RAM units, only one of which would be enabled at any time.
    triangle on south edge (input, bit width 1)
    Clock input: This is absent when the Data Interface attribute's value is "One asynchronous load/store port." In other circumstances, when ld is 0, and this input rises from 0 to 1 (and sel is 1/undefined and clr is 0), then the value at the currently selected address changes to whatever value is at the D pin. As long as the clock input remains 0 or 1, though, the D value will not be stored into memory.
    ld on south edge (input, bit width 1)
    Load: Selects whether the RAM should emit (on D) the value at the current address (A). This output behavior is enabled if out is 1 or undefined; if out is 0, then no value is pushed onto D - but if there is a combined load/store port, stores will be enabled.
    clr on south edge (input, bit width 1)
    Clear: When this is 1, all values in memory are pinned to 0, no matter what the other inputs are.

    Attribute

    When the component is selected or being added, the digits '0' through '9' alter its Address Bit Width attribute and Alt-0 through Alt-9 alter its Data Bit Width attribute.

    Address Bit Width
    The bit width of the address bits. The number of values stored in RAM is 2addrBitWidth.
    Data Bit Width
    The bit width of each individual value in memory.
    Data Interface
    Configures which of the three interfaces are used for communicating data into and out of the component.

    Verhalten des Schaltwerkzeugs

    See poking memory in the User's Guide.

    Verhalten des Textwerkzeugs

    Keines.

    Menu Tool Behavior

    See pop-up menus and files in the User's Guide.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/mem/index.html0000644000175000017500000000367511541757122020707 0ustar vincentvincent Memory Library

    Speicherbibliothek

    The Memory library includes components that remember information.

    D/T/J-K/S-R Flip-Flop
    Register
    Zähler
    Schieberegister
    Zufallsgenerator
    RAM
    ROM

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/mem/flipflops.html0000644000175000017500000001743311541757122021573 0ustar vincentvincent D/T/J-K/S-R Flip-Flop

    D/T/J-K/S-R Flip-Flop

    Bibliothek: Memory
    Eingeführt: 2.0 Beta 1
    Aussehen:

    Verhalten

    Each flip-flop stores a single bit of data, which is emitted through the Q output on the east side. Normally, the value can be controlled via the inputs to the west side. In particular, the value changes when the clock input, marked by a triangle on each flip-flop, rises from 0 to 1 (or otherwise as configured); on this rising edge, the value changes according to the table below.

    D Flip-Flop T Flip-Flop J-K Flip-Flop S-R Flip-Flop
    DQ
    00
    11
    TQ
    0Q
    1Q'
    JKQ
    00 Q
    01 0
    10 1
    11 Q'
    SRQ
    00 Q
    01 0
    10 1
    11 ??

    Another way of describing the different behavior of the flip-flops is in English text.

    • D Flip-Flop: When the clock triggers, the value remembered by the flip-flop becomes the value of the D input (Data) at that instant.

    • T Flip-Flop: When the clock triggers, the value remembered by the flip-flop either toggles or remains the same depending on whether the T input (Toggle) is 1 or 0.

    • J-K Flip-Flop: When the clock triggers, the value remembered by the flip-flop toggles if the J and K inputs are both 1 and the value remains the same if both are 0; if they are different, then the value becomes 1 if the J (Jump) input is 1 and 0 if the K (Kill) input is 1.

    • S-R Flip-Flop: When the clock triggers, the value remembered by the flip-flop remains unchanged if R and S are both 0, becomes 0 if the R input (Reset) is 1, and becomes 1 if the S input (Set) is 1. The behavior in unspecified if both inputs are 1. (In Logisim, the value in the flip-flop remains unchanged.)

    By default, the clock triggers on a rising edge — that is, when the clock input changes from 0 to 1. However, the Trigger attribute allows this to change to a falling edge (when the clock input changes from 1 to 0), a high level (for the duration that the clock input is 1), or a low level (for the duration that the clock input is 0). The level-trigger options are unavailable for the T and J-K flip-flops, because a flip-flop behaves unpredictably when told to toggle for an indeterminate amount of time.

    Pins

    West edge, marked by triangle (input, bit width 1)
    Clock input: At the instant that this input value switches from 0 to 1 (the rising edge), the value will be updated according to the other inputs on the west edge. As long as this remains 0 or 1, the other inputs on the west edge have no effect.
    West edge, other labeled pin(s) (input(s), bit width 1)
    These inputs control how the flip-flop's value changes during the rising edge of the clock. Their exact behavior depends on the flip-flop; the above tables summarize their behavior.
    East edge, labeled Q, north end (output, bit width 1)
    Outputs the value currently stored by the flip-flop.
    East edge, south end (output, bit width 1)
    Outputs the complement of the value currently stored by the flip-flop.
    South edge, east end (input, bit width 1)
    Asynchronous reset: When 0 or undefined, this input has no effect. As long as it is 1, the flip-flop's value is pinned to 0. This occurs asynchronously - that is, without regard to the current clock input value. As long as this is 1, the other inputs have no effect.
    South edge, center end (input, bit width 1)
    Enable: When this is 0, clock triggers are ignored. The current bit continues to appear on the output. The clock triggers are enabled when this input is 1 or undefined.
    South edge, west end (input, bit width 1)
    Asynchronous set: When 1 or undefined, this input has no effect. When 1, the flip-flop's value is pinned to 1. This occurs asynchronously - that is, without regard to the current clock input value. As long as this input is 1, the other inputs have no effect, except for the asynchronous reset input, which has priority.

    Attribute

    Trigger
    Configures how the clock input is interpreted. The value rising edge indicates that the flip-flop should update its value at the instant when the clock rises from 0 to 1. The falling edge value indicates that it should update at the instant the clock falls from 1 to 0. The high level value indicates that the flip-flop should update continuously whenever the clock input is 1. And the low level value indicates that it should update continuously when the clock input is 0. Note that the latter two options are unavailable for T and J-K flip-flops.
    Label
    The text within the label associated with the flip-flop.
    Label Font
    The font with which to render the label.

    Verhalten des Schaltwerkzeugs

    Clicking a flip-flop using the Poke Tool toggles the bit stored in the flip-flop, unless the asynchronous set/reset inputs currently pin the flip-flop's value.

    Verhalten des Textwerkzeugs

    Allows the label associated with the component to be edited.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/mem/counter.html0000644000175000017500000001440411541757122021247 0ustar vincentvincent Zähler

    Zähler

    Bibliothek: Memory
    Eingeführt: 2.3.0
    Aussehen:

    Verhalten

    The counter holds a single value, whose value is emitted on the output Q. Each time the clock input (diagrammed with a triangle on the component's south edge) triggers according to its Trigger attribute, the value in the counter may update based on the two inputs on the component's west edge: The upper input is called load and the lower is called count, and they are interpreted as follows.

    loadcounttrigger action
    0 or z0 The counter remains unchanged.
    0 or z1 or z The counter increments.
    10 The counter loads the value found at the D input.
    11 or z The counter decrements.

    The range of counting can be configured using the Maximum Value attribute. When the counter reaches this value, the next increment wraps the counter back to 0; and if it is at 0, then a decrement will wrap the counter around back to its maximum value.

    In addition to the output Q, the component also includes a single-bit output carry. This is 1 whenever the counter is at its maximum and the load and count inputs indicate that the component should increment on the next step - or when the counter is at 0 and the load and count inputs indicate to decrement at the next step.

    The clear input resets the counter's value to 0 (all zeroes) asynchronously; that is, as long as the clr input is 1, the value is pinned to 0, regardless of the clock input.

    Pins

    East edge, labeled Q (output, bit width matches Data Bits attribute)
    Outputs the value currently stored by the counter.
    Ostseite, unterer Pin (Ausgang, Bitbreite 1)
    Carry: When load and count indicate to increment, this output is 1 whenever the counter is at its maximum. When load and count indicate to decrement, this output is 1 whenever the counter is at 0. At all other times, this output is 0.
    West edge, top pin (input, bit width 1)
    Load: When this is 1 while the count input is 0, the counter will load the value found at the data input at the next clock trigger - or, if the count input happens to be 1, the counter's value will decrement.
    West edge, middle pin labeled D (input, bit with matches Data Bits attribute)
    Data: When the clock triggers while load is 1 and count is 0, the counter's value changes to the value found at this input.
    West edge, lower pin labeled ct (input, bit width 1)
    Count: When this is 1 or unconnected, the value in the counter increments whenever the clock input is triggered - or it decrements if the load input happens to also be 1.
    South edge, indicated with a triangle (input, bit width 1)
    Clock: At the instant that this is triggered as specified by the Trigger attribute, the counter updates as indicated by the load and count inputs.
    South edge, labeled 0 (input, bit width 1)
    Clear: When 0 or undefined, this input has no effect. As long as it is 1, the counter's value is asynchronously pinned to 0. This occurs asynchronously - that is, without regard to the current clock input value. As long as this is 1, the other inputs have no effect.

    Attribute

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the value emitted by the component.
    Maximum Value
    The maximum value, at which point the counter will set its carry output.
    Action On Overflow
    The behavior when the counter attempts to increment beyond the maximum value or decrement beyond 0. Four possible actions are supported:
    Wrap around
    The next value is 0 (if incrementing - the maximum value if decrementing)
    Stay at value
    The counter's value remains at the maximum (or 0 if decrementing)
    Continue counting
    The counter continues incrementing/decrementing, keeping the number of bits as provided by the Data Bits attribute
    Load next value
    The next value is loaded from the D input.
    Trigger
    Configures how the clock input is interpreted. The value rising edge indicates that the counter should update its value at the instant when the clock rises from 0 to 1. The falling edge value indicates that it should update at the instant the clock falls from 1 to 0.
    Label
    The text within the label associated with the component.
    Label Font
    The font with which to render the label.

    Verhalten des Schaltwerkzeugs

    Clicking the counter brings keyboard focus to the component (indicated by a red rectangle), and typing hexadecimal digits will change the value stored in the counter.

    Verhalten des Textwerkzeugs

    Allows the label associated with the component to be edited.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/legacy/0000755000175000017500000000000011541757122017365 5ustar vincentvincentlogisim-2.7.1/doc/de/html/libs/legacy/register.html0000644000175000017500000000465311541757122022107 0ustar vincentvincent Logisim 1.0 8-Bit Register

    Logisim 1.0 8-Bit Register

    Bibliothek: Legacy
    Eingeführt: 2.0 Beta 12
    Aussehen:

    Verhalten

    This component exists only for backwards compatibility with Logisim 1.0X; for new circuits, the Memory library's register is recommended instead.

    The register stores a single 8-bit value, which is displayed in hexadecimal within its rectangle, and is emitted via its outputs on its east edge. (Logisim 1.0X did not support multi-bit values, so the register had to have a pin for each individual bit.) At the instant when the clock input (indicated by a triangle on the west edge) rises from 0 to 1, the value stored in the register changes to the value specified through the eight other bits on the west edge.

    Pins

    East edge, eight pins (outputs, bit width 1 each)
    Outputs the value currently stored by the register, with the lowest-order bit at the northmost pin.
    West edge, eight pins (inputs, bit width 1 each)
    At the instant that the clock value rises from 0 to 1, the register's value changes to the value of the inputs at that instant. The lowest-order bit is at the northmost pin.
    West edge, indicated with a triangle (input, bit width 1)
    Clock input: At the instant that this input value rises from 0 to 1 (the rising edge), the register's value will be updated to the values of the other inputs on the west edge.

    Attribute

    Keines.

    Verhalten des Schaltwerkzeugs

    Clicking the register brings keyboard focus to the register (indicated by a red rectangle), and typing hexadecimal digits will change the value stored in the register.

    Verhalten des Textwerkzeugs

    Keines.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/legacy/index.html0000644000175000017500000000172111541757122021363 0ustar vincentvincent Legacy Library

    Altlasten

    The Legacy library includes components that exist only for backward compatibility with versions of Logisim in the 1.0x series.

    Logisim 1.0 D/J-K Flip-Flop
    Logisim 1.0 8-Bit Register

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/legacy/flipflops.html0000644000175000017500000000771311541757122022261 0ustar vincentvincent Logisim 1.0 D/J-K Flip-Flop

    Logisim 1.0 D/J-K Flip-Flop

    Bibliothek: Legacy
    Eingeführt: 2.0 Beta 12
    Aussehen:

    Verhalten

    These components exist only for backwards compatibility with Logisim 1.0X; for new circuits, the Memory library's flip-flops are recommended instead.

    Each flip-flop stores a single bit of data, which is emitted through the Q output on the east side. Normally, the value can be controlled via the inputs to the west side. In particular, the value changes when the clock input, marked by a triangle on each flip-flop, rises from 0 to 1; on this rising edge, the value changes according to the corresponding table below.

    D Flip-Flop J-K Flip-Flop
    DQ
    00
    11
    JKQ
    00 Q
    01 0
    10 1
    11 Q'
    Another way of describing the different behavior of the flip-flops is in English text.
    • D Flip-Flop: When the clock rises from 0 to 1, the value remembered by the flip-flop becomes the value of the D input (Data) at that instant.

    • J-K Flip-Flop: When the clock rises from 0 to 1, the value remembered by the flip-flop toggles if the J and K inputs are both 1 and the value remains the same if both are 0; if they are different, then the value becomes 1 if the J (Jump) input is 1 and 0 if the K (Kill) input is 1.

    Pins

    West edge, marked by triangle (input, bit width 1)
    Clock input: At the instant that this input value switches from 0 to 1 (the rising edge), the value will be updated according to the other inputs on the west edge. As long as this remains 0 or 1, the other inputs on the west edge have no effect.
    West edge, other labeled pin(s) (input(s), bit width 1)
    These inputs control how the flip-flop's value changes during the rising edge of the clock. Their exact behavior depends on the flip-flop; the above tables summarize their behavior.
    East edge, labeled Q, north end (output, bit width 1)
    Outputs the value currently stored by the flip-flop.
    East edge, south end (output, bit width 1)
    Outputs the complement of the value currently stored by the flip-flop.

    Attribute

    Keines.

    Verhalten des Schaltwerkzeugs

    Keines.

    Verhalten des Textwerkzeugs

    Keines.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/io/0000755000175000017500000000000011541757122016530 5ustar vincentvincentlogisim-2.7.1/doc/de/html/libs/io/tty.html0000644000175000017500000000564411541757122020247 0ustar vincentvincent Terminal

    Terminal

    Bibliothek: Input/Output
    Eingeführt: 2.2.0
    Aussehen:

    Verhalten

    This component implements a very simple dumb terminal. It receives a sequence of ASCII codes and displays each printable character. When the current row becomes full, the cursor moves to the following line, possibly scrolling all current rows up if the cursor was already in the bottom row. The only supported control sequences are: backspace (ASCII 8), which deletes the last character in the final row, unless the final row is already empty; newline (ASCII 10), which moves the cursor to the beginning of the following line, scrolling if necessary; and form-feed (ASCII 12, typed as control-L), which clears the screen.

    Pins

    West edge, upper pin (input, bit width 7)
    Data - this is the ASCII value of the next character to be entered into the terminal.
    West edge, lower pin marked by triangle (input, bit width 1)
    Clock - when triggered while the write-enable pin isn't 0, the current ASCII value on the Data input is processed by the terminal.
    South edge, leftmost pin (input, bit width 1)
    Write Enable - when 1 (or floating or error), a clock edge will result in processing a new character from the data input. The clock and data inputs are ignored when Write Enable is 0.
    South edge, second pin from left (input, bit width 1)
    Clear - when 1, the terminal is cleared of all data, and all other inputs are ignored.

    Attribute

    Rows
    The number of rows displayed in the terminal.
    Columns
    The maximum number of characters displayed in each row of terminal.
    Trigger
    If the value is Rising Edge, then when the clock input changes from 0 to 1, the data input is processed (when enabled by the write-enable and clear inputs). If it is Falling Edge,, then this happens when the clock input changes from 1 to 0.
    Color
    The color with which to draw the text appearing in the terminal.
    Background
    The color with which to draw the terminal's background.

    Verhalten des Schaltwerkzeugs

    Keines.

    Verhalten des Textwerkzeugs

    Keines.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/io/led.html0000644000175000017500000000422111541757122020161 0ustar vincentvincent LED

    LED

    Bibliothek: Input/Output
    Eingeführt: 2.1.3
    Aussehen:

    Verhalten

    Displays the value of its input by coloring the LED (as specified by its Color attribute) or not depending on whether the input is 1 or 0.

    (The LED component is basically redundant with an output pin, except for a somewhat different appearance. Some users, though, thought it would be nice to include.)

    Pins

    A LED has only one pin, a 1-bit input which is used to determine whether to display the LED colored (when the input is 1) or darkened (when the input is anything else).

    Attribute

    When the component is selected or being added, the arrow keys alter its Facing attribute.

    Ausrichtung
    The location of the input pin relative to the component.
    Color
    The color to display when the input value is 1.
    Active On High?
    If yes, then the LED is colored when the input is 1. If no, it is colored when the input is 0.
    Label
    The text within the label associated with the component.
    Label Location
    The location of the label relative to the component.
    Label Font
    The font with which to render the label.
    Label Color
    The color with which to draw the label.

    Verhalten des Schaltwerkzeugs

    Keines.

    Verhalten des Textwerkzeugs

    Allows the label associated with the component to be edited.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/io/keyboard.html0000644000175000017500000000760611541757122021227 0ustar vincentvincent Tastatur

    Tastatur

    Bibliothek: Input/Output
    Eingeführt: 2.2.0
    Aussehen:

    Verhalten

    This component allows the circuit to read keys typed from the keyboard - as long as the keys are representable in the 7-bit ASCII code. After clicking the component using the poke tool, the user can type characters, which accumulate in a buffer. At all times, the ASCII value for the leftmost character in the buffer is sent out the rightmost output. When the clock input is triggered, the leftmost character disappears from the buffer and the new leftmost character is sent on the rightmost output.

    The supported characters for the buffer include all the printable ASCII characters, as well as space, newline, backspace, and control-L. In addition, the left-arrow and right-arrow keys move the cursor within the buffer, and the delete key deletes the character to the right of the cursor (if any).

    The component is asynchronous in the sense that when the buffer is empty and the user types a character, that character is sent immediately as an output, without any wait for a clock pulse.

    Pins

    West edge, marked by a triangle (input, bit width 1)
    Clock - when triggered while the read-enable pin isn't 0, the leftmost character from the buffer is deleted, and the outputs are updated to reflect the buffer's new status.
    South edge, leftmost pin (input, bit width 1)
    Read Enable - when 1 (or floating or error), a clock edge will consume the leftmost character from the buffer. The clock input is ignored when Read Enable is 0.
    South edge, second pin from left (input, bit width 1)
    Clear - when 1, the buffer is emptied and does not accept further characters.
    South edge, second pin from right (output, bit width 1)
    Available - this is 1 when the buffer contains at least one character and 0 when the buffer is empty.
    South edge, rightmost pin (output, bit width 7)
    Data - the 7-bit ASCII code for the leftmost character in the buffer, or 0 if the buffer is empty.

    Attribute

    Buffer Length
    The number of characters that the buffer can hold at once.
    Trigger
    If the value is Rising Edge, then when the clock input changes from 0 to 1, the leftmost character is consumed (when enabled by the Read Enable input). If it is Falling Edge,, then this happens when the clock input changes from 1 to 0.

    Verhalten des Schaltwerkzeugs

    Pressing the mouse button into the component gives keyboard focus to the component, and a vertical-bar cursor will be displayed.

    Each character typed will then be inserted into the buffer, as long as the buffer hasn't reached its capacity and the character is one of those that the component supports: the printable characters within the 7-bit ASCII code, as well as space, backspace, newline, and control-L. Additionally, the user may type the left-arrow and right-arrow keys to change the location of the cursor within the buffer, and the user may type the delete key to delete the buffer character (if any) just to the right of the cursor.

    Verhalten des Textwerkzeugs

    Keines.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/io/joystick.html0000644000175000017500000000473711541757122021270 0ustar vincentvincent Joystick

    Joystick

    Bibliothek: Input/Output
    Eingeführt: 2.2.0
    Aussehen:

    Verhalten

    The user can drag the red knob within the rounded-square area, and the outputs update to indicate the knob's current x- and y-coordinates. This is meant to emulate the joysticks known from the days of classical arcade games.

    Pins

    West edge, north pin (output, bit width matches Bit Width attribute)
    Indicates knob's x-coordinate, to be interpreted as an unsigned integer whose value will never be 0. Thus, a value of 1 represents the far left, and the maximum value for the bit width indicates the far right. When the knob is at rest (in the center), the value has the bit pattern 10...00.
    West edge, south pin (output, bit width matches Bit Width attribute)
    Indicates knob's y-coordinate, whose value ranges as with the x-coordinate pin. When the knob is pulled to the top, this output's value is 1, and when the knob is pulled to the bottom, the output is the maximum value for the bit width selected.

    Attribute

    When the component is selected or being added, Alt-2 through Alt-5 alter its Bit Width attribute.

    Bit Width
    The number of bits used to indicate each of the knob's coordinates.
    Color
    The knob's color as it is drawn on the screen.

    Verhalten des Schaltwerkzeugs

    Pressing the mouse button while within the joystick area moves the knob to that location and updates the outputs. Dragging the mouse continues to move the knob and update the outputs, keeping the knob within the joystick's area. Releasing the mouse button reverts the knob back to its rest position.

    Verhalten des Textwerkzeugs

    Keines.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/io/index.html0000644000175000017500000000364211541757122020532 0ustar vincentvincent Input/Output Library

    Eingabe/Ausgabe-Bibliothek

    The Input/Output library includes components that are meant to correspond to typical components found in electronics for interfacing with a user.

    Taster
    Joystick
    Tastatur
    LED
    7-Segmentanzeige
    Hexadezimale Anzeige
    LED-Matrix
    Terminal

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/io/hexdig.html0000644000175000017500000000370611541757122020674 0ustar vincentvincent Hexadezimale Anzeige

    Hexadezimale Anzeige

    Bibliothek: Input/Output
    Eingeführt: 2.2.0
    Aussehen:

    Verhalten

    Using a seven-segment display, shows the hexadecimal digit corresponding to the four-bit input. If any of the inputs are not 0/1 (either floating or error), then the display shows a dash ('-'). A separate one-bit input controls the display of the decimal point.

    Pins

    South edge, first from left (input, bit width 4)
    This input is interpreted as an unsigned four-bit number, and the corresponding hexadecimal digit is displayed. If any of the bits are floating or error, then a dash ('-') is displayed.
    South edge, second from left (input, bit width 1)
    Controls the decimal point. If this is left unconnected, the decimal point remains off.

    Attribute

    On Color
    The color with which to draw the display segments and decimal point when they are on.
    Off Color
    The color with which to draw the display segments and decimal point when they are off.
    Background
    The color with which to draw the display's background (transparent by default).

    Verhalten des Schaltwerkzeugs

    Keines.

    Verhalten des Textwerkzeugs

    Keines.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/io/dotmat.html0000644000175000017500000001034611541757122020712 0ustar vincentvincent LED-Matrix

    LED-Matrix

    Bibliothek: Input/Output
    Eingeführt: 2.2.0
    Aussehen:

    Verhalten

    Displays a small grid of pixels, whose values are determined by the current inputs. The grid can have up to 32 rows and 32 columns.

    Pins

    The interface to the component varies depending on the value of the Input Format attribute. It has three possible values.

    Columns
    The inputs are lined along the component's south edge, with one multibit input for each column of the matrix. Each input has as many bits as there are rows in the matrix, with the low-order bit corresponding to the southmost pixel in the column. A 1 indicates to light the corresponding pixel, while a 0 indicates to keep the pixel dim. If any of the bits for a column are either floating or error values, then all pixels in the column are lit.
    Rows
    The inputs are lined along the component's west edge, with one multibit input for each row of the matrix. Each input has as many bits as there are columns in the matrix, with the low-order bit corresponding to the rightmost pixel in the row. As with the Columns format, a 1 indicates to light the corresponding pixel, and a 0 indicates to keep the pixel dim. If any bits for a row are floating or error values, then all pixels in the row are lit.
    Select Rows/Columns
    There are two inputs on the component's west edge. The upper multibit input has as many bits as there are columns in the matrix, with the low-order bit corresponding to the rightmost column. The lower multibit input has as many bits as there are rows in the matrix, with the low-order bit corresponding to the bottom row. If any bits in either input are floating or error values, all pixels in the matrix are lit. Normally, though, a pixel at a particular row-column location is lit if the corresponding column bit in the upper input is 1 and the corresponding row bit in the lower input is 1. For example, for a 5x7 matrix, if the first input is 01010 and the second is 0111010, then the second and fourth columns are lit for the second, third, fourth, and sixth rows; the result appears to be a pair of exclamation points. (This input format may seem unintuitive, but LED matrixes are sold commercially with exactly this interface. Lite-On sells such components, for example.)

    Attribute

    Input Format (read-only after component is created)
    Selects how the pins correspond to pixels, as outlined above.
    Matrix Columns
    Selects how many columns are in the matrix, which may range from 1 up to 32.
    Matrix Rows
    Selects how many rows are in the matrix, which may range from 1 up to 32.
    On Color
    Selects the color of a pixel when it is lit.
    Off Color
    Selects the color of a pixel when it is dim.
    Light Persistence
    When this is other than 0, a pixel that is lit remains lit for the given number of clock ticks after the component's inputs indicate that the pixel should become dim.
    Dot Shape
    The square option means that each pixel is drawn as a 10x10 square, filling the component with no gaps between pixels. The circle option means that each pixel is drawn as a diameter-8 circle, with gaps between each circle. The circle option is more difficult to interpret, but it more closely approximates the off-the-shelf LED matrix components.

    Verhalten des Schaltwerkzeugs

    Keines.

    Verhalten des Textwerkzeugs

    Keines.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/io/button.html0000644000175000017500000000361111541757122020732 0ustar vincentvincent Taster

    Taster

    Bibliothek: Input/Output
    Eingeführt: 2.1.3
    Aussehen:

    Verhalten

    Outputs 0 normally; but when the user is pressing the the button using the Poke Tool, the output is 1.

    Pins

    A button has only one pin, a 1-bit output, which is 0 except when the user is pressing the button using the Poke Tool, when it is 1.

    Attribute

    When the component is selected or being added, the arrow keys alter its Facing attribute.

    Ausrichtung
    The location of the output pin relative to the component.
    Color
    The color with which to display the button.
    Label
    The text within the label associated with the component.
    Label Location
    The location of the label relative to the component.
    Label Font
    The font with which to render the label.
    Label Color
    The color with which to draw the label.

    Verhalten des Schaltwerkzeugs

    When the mouse button is pressed, the component's output will be 1. Upon releasing the mouse button, the output reverts back to 0.

    Verhalten des Textwerkzeugs

    Allows the label associated with the component to be edited.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/io/7seg.html0000644000175000017500000000521711541757122020270 0ustar vincentvincent 7-Segmentanzeige

    7-Segmentanzeige

    Bibliothek: Input/Output
    Eingeführt: 2.1.3
    Aussehen:

    Verhalten

    Displays the values of its eight one-bit inputs. Segments are either colored or light gray depending on the inputs. The correspondence is as follows.

    (Manufacturers vary as to how they map inputs to segments; the correspondence used here is based on Texas Instruments' TIL321.)

    Pins

    North edge, first from left (input, bit width 1)
    Controls the middle horizontal segment.
    North edge, second from left (input, bit width 1)
    Controls the upper vertical segment on the left side.
    North edge, third from left (input, bit width 1)
    Controls the upper horizontal segment.
    North edge, fourth from left (input, bit width 1)
    Controls the upper vertical segment on the right side.
    South edge, first from left (input, bit width 1)
    Controls the lower vertical segment on the left side.
    South edge, second from left (input, bit width 1)
    Controls the bottom horizontal segment.
    South edge, third from left (input, bit width 1)
    Controls the lower vertical segment on the right side.
    South edge, fourth from left (input, bit width 1)
    Controls the decimal point.

    Attribute

    On Color
    The color with which to draw the display segments and decimal point when they are on.
    Off Color
    The color with which to draw the display segments and decimal point when they are off.
    Background
    The color with which to draw the display's background (transparent by default).
    Active On High?
    If yes, then the segments light when the corresponding input is 1. If no, they light when the corresponding input is 0.

    Verhalten des Schaltwerkzeugs

    Keines.

    Verhalten des Textwerkzeugs

    Keines.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/index.html0000644000175000017500000003250711541757122020125 0ustar vincentvincent Bibliotheksreferenz

    Bibliotheksreferenz

    A Logisim library holds a set of tools that allow you to interact with a circuit via clicking and dragging the mouse in the canvas area. Most often, a tool is intended for adding components of a particular type into a circuit; but some of the most important tools, such as the Poke Tool and the Select Tool, allow you to interact with components in other ways.

    All of the tools included in Logisim's built-in libraries are documented in this reference material.

    Basisbibliothek
    Schaltwerkzeug
    Bearbeitungswerkzeug
    Auswahlwerkzeug
    Verbindungswerkzeug
    Textwerkzeug
    Menüwerkzeug
    Verteiler
    Pin
    Tunnel
    Pull Resistor
    Testpunkt
    Takt
    Bit-Erweiterung
    Label

    Gatterbibliothek
    Konstante

    Inverter
    Puffer

    AND/OR/NAND/NOR-Gatter

    XOR/XNOR/Odd Parity/Even Parity Gate
    Tristate-Puffer/Inverter

    Auswahlschaltungsbibliothek
    Multiplexer
    Demultiplexer
    Dekoder
    Prioritätsenkoder
    Bit-Wähler

    Arithmetikbibliothek
    Addierer
    Subtrahierer
    Multiplizierer
    Teiler
    Negator
    Komparator
    Bitschieber
    Bit-Addierer
    Bit-Finder

    Speicherbibliothek
    D/T/J-K/S-R Flip-Flop
    Register
    Zähler
    Schieberegister
    Zufallsgenerator
    RAM
    ROM

    Eingabe/Ausgabe-Bibliothek
    Taster
    Joystick
    Tastatur
    LED
    7-Segmentanzeige
    Hexadezimale Anzeige
    LED-Matrix
    Terminal

    Altlasten
    Logisim 1.0 D/J-K Flip-Flop
    Logisim 1.0 8-Bit Register
    logisim-2.7.1/doc/de/html/libs/gates/0000755000175000017500000000000011541757122017224 5ustar vincentvincentlogisim-2.7.1/doc/de/html/libs/gates/xor.html0000644000175000017500000001711711541757122020731 0ustar vincentvincent XOR/XNOR/Odd Parity/Even Parity Gate

    XOR/XNOR/Odd Parity/Even Parity Gate

    Bibliothek: Base
    Eingeführt: 2.0 Beta 1 for XOR/Odd/Even; 2.0 Beta 6 for XNOR
    Aussehen:
    XOR XNOR Odd
    Parity
    Even
    Parity
    Shaped:
    Rectangular:

    Verhalten

    The XOR, XNOR, Even Parity, and Odd Parity gates each compute the respective function of the inputs, and emit the result on the output.

    By default, any inputs that are left unconnected are ignored — that's if the input truly has nothing attached to it, not even a wire. In this way, you can insert a 5-input gate but only attach two inputs, and it will work as a 2-input gate; this relieves you from having to worry about configuring the number of inputs every time you create a gate. (If all inputs are unconnected, the output is the error value X.) Some users, though, prefer that Logisim insist that all inputs be connected, since this is what corresponds to real-world gates. You can enable this behavior by going to the Project > Options… menu item, selecting the Simulation tab, and selecting Error for undefined inputs for Gate Output When Undefined.

    The two-input truth table for the gates is the following.

    xyXOR XNOROddEven
    00 01 01
    01 10 10
    10 10 10
    11 01 01

    As you can see, the Odd Parity gate and the XOR gate behave identically with two inputs; similarly, the even parity gate and the XNOR gate behave identically. But if there are more than two specified inputs, the XOR gate will emit 1 only when there is exactly one 1 input, whereas the Odd Parity gate will emit 1 if there are an odd number of 1 inputs. The XNOR gate will emit 1 only when there is not exactly one 1 input, while the Even Parity gate will emit 1 if there are an even number of 1 inputs. The XOR and XNOR gates include an attribute titled Multiple-Input Behavior that allow them to be configured to use the Odd Parity and Even Parity behavior.

    If any of the inputs are the error value (e.g., if conflicting values are coming into the same wire) or floating, then the output will be the error value.

    The multi-bit versions of each gate will perform its one-bit transformation bitwise on its inputs.

    Note: Many authorities contend that the shaped XOR gate's behavior should correspond to the odd parity gate, but there is not agreement on this point. Logisim's default behavior for XOR gates is based on the IEEE 91 standard. It is also consistent with the intuitive meaning underlying the term exclusive or: A waiter asking whether you want a side dish of mashed potatoes, carrots, peas, or cole slaw will only accept one choice, not three, whatever some authorities may tell you. (I must admit, though, that I have not subjected this statement to a rigorous test.) You can configure the XOR and XNOR gates to use parity by changing its Multiple-Input Behavior attribute.

    Pins (wenn das Bauelement nach Osten zeigt)

    West edge (inputs, bit width according to Data Bits attribute)

    The inputs into the component. There will be as many of these as specified in the Number of Inputs attribute.

    Note that if you are using shaped gates, the west side of XOR and XNOR gates will be curved. Nonetheless, the input pins are in a line. Logisim will draw short stubs illustrating this; and if you overshoot a stub, it will silently assume that you did not mean to overshoot it. In "printer view", these stubs will not be drawn unless they are connected to wires.

    East edge (output, bit width according to Data Bits attribute)

    The gate's output, whose value is computed based on the current inputs as described above.

    Attribute

    When the component is selected or being added, the digits '0' through '9' alter its Number of Inputs attribute, Alt-0 through Alt-9 alter its Data Bits attribute, and the arrow keys alter its Facing attribute.

    Ausrichtung
    The direction of the component (its output relative to its inputs).
    Data Bits
    The bit width of the component's inputs and outputs.
    Gate Size
    Determines whether to draw a wider or narrower version of the component. This does not affect the number of inputs, which is specified by the Number of Inputs attribute; however, if the number of inputs exceeds 3 (for a narrow component) or 5 (for a wide component), then the gate will be drawn with "wings" to be able to accommodate the number of inputs requested.
    Number of Inputs
    Determines how many pins to have for the component on its west side.
    Label
    The text within the label associated with the gate.
    Label Font
    The font with which to render the label.
    Multiple-Input Behavior (XOR and XNOR only)
    When three or more inputs are provided, the XOR/XNOR gate's output will either be based on whether exactly one input is 1 (the default) or an odd number of inputs are 1.

    Verhalten des Schaltwerkzeugs

    Keines.

    Verhalten des Textwerkzeugs

    Allows the label associated with the gate to be edited.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/gates/not.html0000644000175000017500000000532711541757122020721 0ustar vincentvincent Inverter

    Inverter

    Bibliothek: Base
    Eingeführt: 2.0 Beta 1
    Aussehen:
    Shaped:
    Rectangular:

    Verhalten

    The NOT Gate emits the complement of whatever input it receives. The truth table for a NOT gate is the following.

    xout
    01
    10

    If the input is unspecified (i.e., floating), then the output will also be unspecified - unless the "Gate Output When Undefined" option is "Error for undefined inputs," in which case the output is an error. If the input is an error value, then the output will also be.

    A multi-bit NOT gate will perform the above transformation bitwise on its input.

    Pins (wenn das Bauelement nach Osten zeigt)

    West edge (input, bit width according to Data Bits attribute)
    The component's input.
    East edge (output, bit width according to Data Bits attribute)
    The output, whose value is the complement of the input value.

    Attribute

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute and the arrow keys alter its Facing attribute.

    Ausrichtung
    Die Richtung des Bauelements (Lage des Ausgangs im Vergleich zum Eingang).
    Data Bits
    The bit width of the component's input and output.
    Gate Size
    Determines whether to draw a larger or a smaller version of the component.
    Label
    The text within the label associated with the gate.
    Label Font
    The font with which to render the label.

    Verhalten des Schaltwerkzeugs

    Keines.

    Verhalten des Textwerkzeugs

    Allows the label associated with the gate to be edited.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/gates/index.html0000644000175000017500000000607511541757122021231 0ustar vincentvincent Gates Library

    Gatterbibliothek

    The Gates library includes a variety of simple components, all of which have a single output whose value is dictated entirely by the current inputs.

    Konstante

    Inverter
    Puffer

    AND/OR/NAND/NOR-Gatter

    XOR/XNOR/Odd Parity/Even Parity Gate
    Tristate-Puffer/Inverter

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/gates/controlled.html0000644000175000017500000000714711541757122022270 0ustar vincentvincent Tristate-Puffer/Inverter

    Tristate-Puffer/Inverter

    Bibliothek: Gates
    Eingeführt: 2.0 Beta 1
    Aussehen:

    Verhalten

    The controlled buffer and inverter, often called three-state buffers/inverters, each have a one-bit "control" input pin on the south side. The value at this control pin affects how the component behaves:

    • When the value on this pin is 1, then the component behaves just like the respective component (a buffer or a inverter (NOT gate)).
    • When the value is 0 or unknown (i.e., floating), then the component's output is also floating.
    • When the value is an error value (such as would occur when two conflicting values are being fed into the input), then the output is an error value.

    Controlled buffers can be useful when you have a wire (often called a bus) whose value should match the output of one of several components. By placing a controlled buffer between each component output and the bus, you can control whether that component's output is fed onto the bus or not.

    Pins (assuming component faces east, control line right-handed)

    West edge (input, bit width matches Data Bits attribute)
    The component input that will be used to compute the output if the control input is 1.
    Südseite (Eingang, Bitbreite 1)
    The component's control input.
    East edge (output, bit width matches Data Bits attribute)
    The component's output, which will be floating if the control input is 0 or floating, the error value if the control input is the error value, and will be computed based on the west-side input if the control input is 1.

    Attribute

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute and the arrow keys alter its Facing attribute.

    Ausrichtung
    Die Richtung des Bauelements (Lage des Ausgangs im Vergleich zum Eingang).
    Data Bits
    The bit width of the component's inputs and outputs.
    Gate Size
    (Controlled inverter only) Determines whether to draw a larger or a smaller version of the component.
    Control Line Location
    The location of the control line, imagining we are facing the output from the input: If the component faces east and is right-handed, the control line is to the south; but if it is left-handed, the control line is to the north.
    Label
    The text within the label associated with the gate.
    Label Font
    The font with which to render the label.

    Verhalten des Schaltwerkzeugs

    Keines.

    Verhalten des Textwerkzeugs

    Allows the label associated with the gate to be edited.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/gates/constant.html0000644000175000017500000000352511541757122021750 0ustar vincentvincent Konstante

    Konstante

    Bibliothek: Gates
    Eingeführt: 2.0 Beta 1
    Aussehen:

    Verhalten

    Emits the value specified in its Value attribute.

    Pins

    There is only one pin, an output whose bit width matches the Data Bits attribute. The location of this pin is specified in the Facing attribute. The component constantly outputs on this pin whatever value specified in the Value attribute.

    Attribute

    When the component is selected or being added, the hexademical digits '0' through '9' and 'a' through 'f' alter its Value attribute, Alt-0 through Alt-9 alter its Data Bits attribute, and the arrow keys alter its Facing attribute.

    Ausrichtung
    The direction in which the pin is located relative to where the value is drawn.
    Data Bits
    The bit width of the component's inputs and outputs.
    Value
    The value, written in hexademical, that is emitted by the component. The number of bits used to specify the value cannot exceed the component's bit width.

    Verhalten des Schaltwerkzeugs

    Keines.

    Verhalten des Textwerkzeugs

    Keines.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/gates/buffer.html0000644000175000017500000000534111541757122021366 0ustar vincentvincent Puffer

    Puffer

    Bibliothek: Base
    Eingeführt: 2.0 Beta 1
    Aussehen:

    Verhalten

    The buffer simply passes through to its right output whatever input it receives on the left side. The truth table for a one-bit buffer is the following.

    xout
    00
    11

    If the input is unspecified (i.e., floating), then the output will also be unspecified - unless the "Gate Output When Undefined" option is "Error for undefined inputs," in which case the output is an error. If the input is an error value, then the output will also be.

    Buffers are the most useless of the gate components provided in Logisim; its presence in the Gates library is just as much a matter of completeness (a component for each possible one-input truth table) as it is a matter of providing useful functionality. Still, it can be occasionally useful to ensure that values propagate in only one direction along a wire.

    Pins (wenn das Bauelement nach Osten zeigt)

    West edge (input, bit width according to Data Bits attribute)
    The input into the component.
    East edge (output, bit width according to Data Bits attribute)
    The output, which always matches the input into the left side.

    Attribute

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute and the arrow keys alter its Facing attribute.

    Ausrichtung
    Die Richtung des Bauelements (Lage des Ausgangs im Vergleich zum Eingang).
    Data Bits
    The bit width of the component's inputs and outputs.
    Label
    The text within the label associated with the gate.
    Label Font
    The font with which to render the label.

    Verhalten des Schaltwerkzeugs

    Keines.

    Verhalten des Textwerkzeugs

    Allows the label associated with the gate to be edited.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/gates/basic.html0000644000175000017500000001756611541757122021212 0ustar vincentvincent AND/OR/NAND/NOR-Gatter

    AND/OR/NAND/NOR-Gatter

    Bibliothek: Base
    Eingeführt: 2.0 Beta 1
    Aussehen:
    AND OR NAND NOR
    Shaped:
    Rectangular:
    DIN 40700:

    Verhalten

    The AND, OR, NAND, and NOT gates each compute the respective function of the inputs, and emit the result on the output.

    By default, any inputs that are left unconnected are ignored — that's if the input truly has nothing attached to it, not even a wire. In this way, you can insert a 5-input gate but only attach two inputs, and it will work as a 2-input gate; this relieves you from having to worry about configuring the number of inputs every time you create a gate. (If all inputs are unconnected, the output is the error value X.) Some users, though, prefer that Logisim insist that all inputs be connected, since this is what corresponds to real-world gates. You can enable this behavior by going to the Project > Options… menu item, selecting the Simulation tab, and selecting Error for undefined inputs for Gate Output When Undefined.

    The two-input truth table for the gates is the following. (The letter X represents the error value, and the letter Z represents the floating value.)

    AND
    01X/Z
    0000
    101X
    X/Z0XX
       
    OR
    01X/Z
    001X
    1111
    X/ZX1X
    NAND
    01X/Z
    0111
    110X
    X/Z1XX
       
    NOR
    01X/Z
    010X
    1000
    X/ZX0X

    In short, these components work as expected as long as all inputs are either 0 or 1. If an input is neither 0 nor 1 (it is floating or it is the error value) then the component treats it as both 0 and 1: If the output would be the same both ways (as when an AND gate has one input that is definitely 0 and a questionable second input), that will be the output value; but if the output changes depending on whether it is 0 or 1, the output is the error value.

    The multi-bit versions of each gate will perform its one-bit transformation bitwise on its inputs.

    Pins (wenn das Bauelement nach Osten zeigt)

    West edge (inputs, bit width according to Data Bits attribute)

    The inputs into the component. There will be as many of these as specified in the Number of Inputs attribute.

    Note that if you are using shaped gates, the west side of OR and NOR gates will be curved. Nonetheless, the input pins are in a line. Logisim will draw short stubs illustrating this; and if you overshoot a stub, it will silently assume that you did not mean to overshoot it. In "printer view", these stubs will not be drawn unless they are connected to wires.

    East edge (output, bit width according to Data Bits attribute)

    The gate's output, whose value is computed based on the current inputs as described above.

    Attribute

    When the component is selected or being added, the digits '0' through '9' alter its Number of Inputs attribute, Alt-0 through Alt-9 alter its Data Bits attribute, and the arrow keys alter its Facing attribute.

    Ausrichtung
    The direction of the component (its output relative to its inputs).
    Data Bits
    The bit width of the component's inputs and outputs.
    Gate Size
    Determines whether to draw a wider or narrower version of the component. This does not affect the number of inputs, which is specified by the Number of Inputs attribute. However, if shaped gates are selected, then the gate will be drawn with wings to accommodate additional inputs beyond what the shape naturally accommodates.
    Number of Inputs
    Determines how many pins to have for the component on its west side.
    Label
    The text within the label associated with the gate.
    Label Font
    The font with which to render the label.
    Negate x
    If yes, the input is negated before it is fed into the gate. The inputs are counted top-down if the facing is east or west, and they are counted left-to-right if the facing is north or south.

    Verhalten des Schaltwerkzeugs

    Keines.

    Verhalten des Textwerkzeugs

    Allows the label associated with the gate to be edited.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/base/0000755000175000017500000000000011541757122017033 5ustar vincentvincentlogisim-2.7.1/doc/de/html/libs/base/wiring.html0000644000175000017500000000705111541757122021223 0ustar vincentvincent Verbindungswerkzeug

    Verbindungswerkzeug

    Bibliothek: Base
    Eingeführt: 2.0 Beta 1

    Verhalten

    The wiring tool is the tool for creating wire segments that carry values from one endpoint to another. The bit width of these values can be anything; exactly which bit width is automatically inferred from the components to which the wires are ultimately attached. If it is not attached to any components, the wire will be drawn gray to indicate that its bit width is unknown; if the components at the locations that the wire helps to connect disagree on the bit width, then the wire will be drawn orange to indicate the conflict, and the wire will in fact refuse to carry any values at all until the user resolves the conflict.

    A single drag of the mouse can create multiple wire segments. The precise process is a little confusing in its description; but it works quite intuitively in practice: If you request a particular wire segment using the Wiring Tool, that segment will be split apart wherever it hits a pin for an existing component, or wherever it hits the endpoint of an existing wire segment. Also, if an endpoint of any of the new wire segments hit somewhere in the middle of an existing wire, then that wire will be split into multiple segments itself.

    For some components that draw short stubs to which wires can connect (such as an OR gate or a controlled buffer), Logisim will silently correct attempts to create wires that slightly overshoot the stub's end.

    You can also shorten an existing wire segment using the Wiring Tool, using a drag that starts or ends at a terminus of the segment, and that overlaps the existing segment.

    All wires in Logisim are either horizontal or vertical.

    Wires are also non-directional; that is, they carry values from either endpoint to the other. Indeed, a wire can carry values in both directions simultaneously; the center wire in the below example is doing this.

    Attribute

    The wiring tool does not itself have attributes, but the wires that it creates do.

    Direction
    Indicates whether the wire is horizontal or vertical. The value of this attribute cannot be changed.
    Length
    Indicates how many pixels long the wire is. The value of this attribute cannot be changed.

    Verhalten des Schaltwerkzeugs

    When you click an existing wire segment using the Poke Tool, Logisim displays the current value traveling through that wire. The behavior is particularly useful for multi-bit wires, whose black color provide no visual feedback about what value the wire is carrying.

    For multi-bit values, you can configure exactly how the value is displayed (in binary, decimal, or hexadecimal, for example) using the Layout pane of the Logisim Preferences dialog box.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/base/tunnel.html0000644000175000017500000000554511541757122021237 0ustar vincentvincent Tunnel

    Tunnel

    Bibliothek: Base
    Eingeführt: 2.5.0
    Aussehen:

    Verhalten

    A tunnel acts like a wire in that it binds points together, but unlike a wire the connection is not explicitly drawn. This is helpful when you need to connect points far apart in the circuit and a network of wires would make the circuit much more ugly. The below illustration illustrates how this works.

    Here, all three tunnels have the same label, a, and so the three points to which the tunnels point are connected. (If one of the tunnels were labeled something else, like b, then it would be part of a different set of tunnels.) The controlled buffer at top emits a floating output since its lower input is 0. This normally leads the wire coming from the controlled buffer to be blue; but here it is dark green because the floating output combines through the tunnel with the 0 from the pin at bottom. If the control input into the buffer changes to 1, then the controlled buffer would feed 1 into the tunnel, which would combine with 0 from the pin at bottom to result in an error value; thus, we would then see red wires feeding through all three tunnels.

    Pins

    A tunnel has only one pin, whose bit width matches the tunnel's Data Bits attribute. This pin is neither an input nor an output — the matching tunnels are simply connected transparently.

    Attribute

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute and the arrow keys alter its Facing attribute.

    Ausrichtung
    The direction toward which the tunnel points.
    Data Bits
    The number of bits for the tunnel.
    Label
    The text within the label associated with the tunnel. This tunnel is connected to all other tunnels with exactly the same label.
    Label Font
    The font with which to render the label.

    Verhalten des Schaltwerkzeugs

    Keines.

    Verhalten des Textwerkzeugs

    Allows the label associated with the tunnel to be edited.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/base/text.html0000644000175000017500000000504011541757122020704 0ustar vincentvincent Textwerkzeug

    Textwerkzeug

    Bibliothek: Base
    Eingeführt: 2.0 Beta 1

    Verhalten

    The text tool allows you to create and edit labels associated with components. Which components support labels are indicated in the 'Text Tool Behavior' section of their documentation. As of the current release, the following components in the built-in libraries support labels.

    Basisbibliothek Pin
    Clock
    Label
    Probe
    Speicherbibliothek D/T/JK/SR Flip-Flop
    Register
    Counter
    Shift Register
    Random
    Eingabe/Ausgabe-Bibliothek Button
    LED

    For components that can take a label but have none assigned to it currently, you can click anywhere within the component to add a label. If there is already a label, you need to click within the label. If you click at a point where there is not currently a label to be edited, Logisim will initiate the addition of a new Label component.

    In the current version of Logisim, text editing features are still fairly primitive. Selections of a region of text within a label is impossible. There is no way to insert a line break into a label.

    Attribute

    The attributes for the tool are the same as for the label component. These attributes have no effect when editing the label on an existing component, but they are imparted to any labels created using the text tool.

    Clicking on a component supporting the Text Tool will display that component's attributes.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/base/splitter.html0000644000175000017500000000710411541757122021571 0ustar vincentvincent Verteiler

    Verteiler

    Bibliothek: Base
    Eingeführt: 2.0 Beta 1
    Aussehen:

    Verhalten

    The splitter creates a correspondence between a multi-bit value and several separate subsets of those bits. Despite its name, it can either split a multi-bit value into component parts, or it can combine component parts into a multi-bit value - or indeed it can do both at once. A more complete description of splitters is found in the `Splitters' section of the User's Guide.

    Logisim treats splitters specially when propagating values within a circuit: Whereas all other components have a computed delay for purposes of simulating their behavior, values propagate through splitters (as well as wires) instantaneously.

    Note: The term splitter is a non-standard term, which is unique to Logisim as far as I know. I am unaware of any standard term for such a concept; the only term I have heard used is bus ripper, but this term is unnecessarily violent for my tastes.

    Pins

    To distinguish the several connecting points for a splitter, we refer to the single connecting point one side as its combined end, and we refer to the multiple connecting points on the other side as its split ends.

    Combined end (input/output bit width matches Bit Width In attribute)
    A value holding all of the bits traveling through the splitter.
    Split ends (input/output, bit width computed based on Bit x attributes)
    The number of split ends is specified in the Fan Out attribute, and each split end has an index that is at least 0 and less than the Fan Out attribute. For each split end, all bits for which Bit x refers to its index travels through that split end; the order of these bits is the same as their order within the combined end.

    Attribute

    When the component is selected or being added, the digits '0' through '9' alter its Fan Out attribute, Alt-0 through Alt-9 alter both the Fan Out and Bit Width In attributes, and the arrow keys alter its Facing attribute.

    Ausrichtung
    The location of the split ends relative to the combined end.
    Fan Out
    The number of split ends.
    Bit Width In
    The bit width of the combined end.
    Bit x
    The index of the split end to which bit x of the combined end corresponds. The split ends are indexed starting from 0 at the top (for a splitter facing east or west) or from 0 at the left/west (for a splitter facing north or south). A bit can be specified to correspond to none of the split ends. There is no way for a bit to correspond to multiple split ends.

    Verhalten des Schaltwerkzeugs

    Keines.

    Verhalten des Textwerkzeugs

    Keines.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/base/select.html0000644000175000017500000001045011541757122021200 0ustar vincentvincent Auswahlwerkzeug

    Auswahlwerkzeug

    Bibliothek: Base
    Eingeführt: 2.0 Beta 1

    Verhalten

    Allows individual components to be placed into the current selection. There are a number of actions possible with this tool.

    • Pressing the mouse button while it is within a currently selected component begins a drag moving all components of the selection.

      By default, Logisim will compute a way to add new wires so that no existing connections are lost during the move. (Sometimes it will delete or shorten existing wires.) If you're performing a move where you do not want these changes to be made, you can press the shift key during the move. If you want to disable this behavior entirely, go to Project > Options, select the Canvas tab, and uncheck the Keep Connections When Moving box; in this case, the connections are computed only when the shift key is down.

      Dragging a selection can lead to unexpected behavior from wires: If you drag a selection including some wires on top of some other wires, all wires are merged, and the merged wires are placed into the selection. As a result, if you drag the selection a second time, the wires previously at the location will not be left behind. This behavior is necessary to keep with the expected behavior of wires in Logisim. And it does not normally constitute a major problem: Logisim will draw the full selection in the midst of dropping, and you should not drop it until you are sure it is in the correct location.

    • Otherwise, clicking the mouse within a component drops all components from the current selection and selects instead the component(s) containing the clicked location.

    • Shift-clicking the mouse within a component toggles that component's presence within the selection. If multiple components include the same location, all components' presence will be toggled. None of this will happen, though, if shift-clicking is mapped to another tool instead (via the project options window's Mouse tab).

    • Dragging the mouse starting at a location not contained within any components drops all components from the current selection and initiates a rectangular selection. All component(s) contained by the rectangle will be placed into the selection.

    • Shift-dragging the mouse starting at a location not contained within any components initiates a rectangular selection. The presence in the selection of all component(s) contained by the rectangle will be toggled. This will not happen, though, if shift-clicking is mapped to another tool instead.

    After selecting the desired items in the selection, you can of course cut/copy/paste/delete all the items via the Edit menu.

    Logisim's behavior when pasting the clipboard into a circuit is somewhat peculiar: It will not immediately place the components into the circuit; instead, the selection will be a collection of "ghosts," which will be dropped into the circuit as soon as they are either dragged to another location or removed from the selection. (This peculiar behavior is necessary because pasting will otherwise merge the wires of the selection into the current circuit at once, and the wires there previously will be dragged with the pasted clipboard if the user wants to move the pasted components somewhere else.)

    Attribute

    Keines. Selecting a component, though, will display its attributes. With multiple components selected, attributes shared by all are shown, blank if they have different values and otherwise with the value they all have in common. (Wires are ignored if there are any non-wires in the selection.) Changes to the attribute value affect all selected components.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/base/pull.html0000644000175000017500000000417011541757122020677 0ustar vincentvincent Pull Resistor

    Pull Resistor

    Bibliothek: Base
    Eingeführt: 2.5.0
    Aussehen:
    Shaped:
    Rectangular:

    Verhalten

    When connected to a point, this component has an effect only when the value at that point is the floating value (Z). In this case, the resistor pulls the wire to which it is connected toward the value indicated in its Pull Direction attribute.

    If it is connected to a multiple-bit value, then each bit in the value that is floating is pulled in the direction specified, while the bits that are not floating are left unchanged.

    Pins

    The resistor has just one pin, which is an output and has a bit width that is derived from whichever component it is connected.

    Attribute

    When the component is selected or being added, the arrow keys alter its Facing attribute.

    Ausrichtung
    The direction in which the component's pin lies from component's center.
    Pull Direction
    Specifies the value to which a floating value should be pulled. This could be 0, 1, or the error value.

    Verhalten des Schaltwerkzeugs

    Keines.

    Verhalten des Textwerkzeugs

    Keines.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/base/probe.html0000644000175000017500000000465111541757122021036 0ustar vincentvincent Testpunkt

    Testpunkt

    Bibliothek: Base
    Eingeführt: 2.0.3
    Aussehen:

    Verhalten

    A probe is an element that simply displays the value at a given point in a circuit. It does not itself interact with other components.

    In most respects, the probe component duplicates the functionality found in a Pin component configured as an output pin. The primary difference is that if the circuit is used as a subcircuit component, then an output pin will be a part of that interface, whereas a probe is not. They also are different in that the probe does not have a Data Bits attribute to be configured: The bit width is inferred from whatever value it happens to see on its input. Graphically, they are similar but have slightly different borders: A pin has a thick, black border, whereas a probe has a thin, gray border.

    Pins

    A probe component has only one pin, which will acts as an input to the probe. The width that this pin accepts is adaptive: The probe will adapt to inputs of any width.

    Attribute

    When the component is selected or being added, the arrow keys alter its Facing attribute.

    Ausrichtung
    The side of the component where its input pin should be.
    Label
    The text within the label associated with the component.
    Label Location
    The location of the label relative to the component.
    Label Font
    The font with which to render the label.
    Radix
    The base (for example, binary, decimal, or hexadecimal) in which a value is displayed.

    Verhalten des Schaltwerkzeugs

    Keines.

    Verhalten des Textwerkzeugs

    Allows the label associated with the component to be edited.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/base/poke.html0000644000175000017500000000425611541757122020666 0ustar vincentvincent Schaltwerkzeug

    Schaltwerkzeug

    Bibliothek: Base
    Eingeführt: 2.0 Beta 1

    Verhalten

    The Poke Tool is for manipulating the current values associated with components. The precise behavior of the Poke Tool varies depending on which component is clicked; this behavior is documented in the `Poke Tool Behavior' section of each individual component. The following components all have support for the Poke Tool.

    Basisbibliothek Pin
    Clock
    Speicherbibliothek D/T/J-K/S-R Flip-Flop
    Register
    Counter
    Shift Register
    RAM
    ROM
    Eingabe/Ausgabe-Bibliothek Button
    Joystick
    Keyboard
    Altlasten Logisim 1.0 D/J-K Flip-Flop
    Logisim 1.0 8-Bit Register

    Also, clicking a wire segment using the Poke tool displays the value currently carried by the wire, as described on the Wiring Tool's page.

    Attribute

    Keines. Clicking on a component supporting the Poke Tool, though, will display that component's attributes.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/base/pin.html0000644000175000017500000001160711541757122020514 0ustar vincentvincent Pin

    Pin

    Bibliothek: Base
    Eingeführt: 2.0 Beta 1
    Aussehen:

    Verhalten

    A pin is an output or an input to a circuit, depending on the value of its Output? attribute. In drawing a pin, Logisim represents output pins using a circle or rounded rectangle, and input pins are represented using squares or rectangles. In either case, the individual bits of the value being sent or received is displayed within the component (except within printer view, when the component only says how many bits wide the pin is).

    A pin is a convenient component for interacting with a circuit, and beginning Logisim users need not use them in any other way. But a user building a circuit using several subcircuits (as described in the `Subcircuits' section of the User's Guide) will use pins also to specify the interface between a circuit and a subcircuit. In particular, a circuit layout's pin components define the pins that appear on the subcircuit component when the layout is used within another circuit. In such a circuit, the values sent and received to those locations on the subcircuit component are tied to the pins within the subcircuit layout.

    Pins

    A pin component has only one pin, which will be an input to the component if the pin is an output pin, and it will be an output to the component if the pin is an input pin. In either case, its bit width matches the Data Bits attribute, and its location is specified by the Facing attribute.

    Attribute

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute, the arrow keys alter its Facing attribute, and Alt with an arrow key alters its Label Location attribute.

    Ausrichtung
    The side of the component where its input/output pin should be.
    Output?
    Specifies whether the component is an output pin or an input pin. (Note that if the pin component is an input pin, then the pin that acts as its interface within the circuit will be an output, and vice versa.)
    Data Bits
    The number of bits for the value that the pin handles.
    Three-state?
    For an input pin, this configures whether the user can instruct the pin to emit unspecified (i.e., floating) values. The attribute deals with the user interface only; it does not have any effect on how the pin behaves when the circuit layout is used as a subcircuit. For an output pin, the attribute has no effect.
    Pull Behavior
    For an input pin, the attribute specifies how floating values should be treated when received as an input, perhaps from a circuit using the layout as a subcircuit. With "unchanged," the floating values are sent into the layout as floating values; with "pull up," they are converted into 1 values before being sent into the circuit layout; and with "pull down," they are converted into 0 values before being sent into the circuit layout.
    Label
    The text within the label associated with the component.
    Label Location
    The location of the label relative to the component.
    Label Font
    The font with which to render the label.

    Verhalten des Schaltwerkzeugs

    Clicking an output pin has no effect, although the pin's attributes will be displayed.

    Clicking an input pin will toggle the bit that is clicked. If it is a three-state pin, then the corresponding bit will rotate between the three states.

    If, however, the user is viewing the state of a subcircuit as described in the `Debugging Subcircuits' of the User's Guide, then the pin's value is pinned to whatever value the subcircuit is receiving from the containing circuit. The user cannot change the value without breaking this link between the subcircuit's state and the containing circuit's state, and Logisim will prompt the user to verify that breaking this link is actually desired.

    Verhalten des Textwerkzeugs

    Allows the label associated with the component to be edited.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/base/menu.html0000644000175000017500000000413711541757122020672 0ustar vincentvincent Menüwerkzeug

    Menüwerkzeug

    Bibliothek: Base
    Eingeführt: 2.0 Beta 1

    Verhalten

    The menu tool permits the user to pull up a pop-up menu for components that already exist. By default, right-clicking or control-clicking a component will bring up this pop-up menu; however, the Mouse tab of the project options allows a user to configure the mouse buttons to work differently.

    The pop-up menu for most components has two items.

    • Delete: Removes the component from the circuit.
    • Show Attributes: Places the component's attributes into the window's attribute table, so that the attribute values can be viewed and changed.

    For some components, however, the menu has additional items. Subcircuits (that is, instances of using one circuit as a "black box" within another) are one example of this: In addition to the above two items, the pop-up menu includes another item.

    • View XXX: Changes the circuit layout being viewed and edited to be the subcircuit's layout instead. The values seen in the layout will be part of the same hierarchy as those of the supercircuit. (See the `Debugging subcircuits' section of the User's Guide.)

    Other components may extend the pop-up menu also. In the built-in libraries of the current version of Logisim, the only such components are RAM and ROM.

    Attribute

    Keines.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/base/label.html0000644000175000017500000000540111541757122021000 0ustar vincentvincent Label

    Label

    Bibliothek: Base
    Eingeführt: 2.0 Beta 1
    Aussehen:

    Verhalten

    This is a simple text label that can be placed anywhere in the circuit. It does not interact with values traveling through the circuit in any way, except inasmuch as it will be visible when the circuit is drawn.

    In contrast to all other components in the current built-in libraries, label components can be placed anywhere on the canvas; they do not snap to the grid.

    Pins

    Keines.

    Attribute

    Text
    The text appearing in the label. This value can be edited in the attribute table or, using the text tool, on the canvas.
    Font
    The font to use when drawing the label.
    Horizontal Alignment
    The horizontal positioning technique for the text relative to the label's official location (where the mouse was clicked in creating the label). "Left" means that the text should be drawn so that its left edge is at the location; "right" means that the text should be drawn so that its right edge is at the location; and "center" means that the text should be drawn so that its center (horizontally) is at the location.
    Vertical Alignment

    The vertical positioning technique for the text relative to the label's official location (where the mouse was clicked in creating the label). "Base" means that the baseline should intersect the location; "Top" means that the text's top should intersect the location; "Bottom" means that the text's bottom should intersect the location; and "Center" means that the text should be centered (vertically) at the location.

    The text's top and bottom is computed based on the font's standard ascent and descent values; thus, even if the actual text contains no tall letters (such as b) or descending letters (such as g), it is assumed to contain such letters for the purposes of vertical positioning.

    Verhalten des Schaltwerkzeugs

    Keines.

    Verhalten des Textwerkzeugs

    Allows the text appearing within the label to be edited.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/base/index.html0000644000175000017500000000637311541757122021041 0ustar vincentvincent Base Library

    Basisbibliothek

    The Base library includes general-purpose tools, as well as components whose behavior in a circuit is distinguished from other components (that is, they are treated unusually by Logisim's propagation engine).

    Schaltwerkzeug
    Bearbeitungswerkzeug
    Auswahlwerkzeug
    Verbindungswerkzeug
    Textwerkzeug
    Menüwerkzeug
    Verteiler
    Pin
    Testpunkt
    Tunnel
    Pull Resistor
    Takt
    Bit-Erweiterung
    Label

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/base/extender.html0000644000175000017500000000520611541757122021542 0ustar vincentvincent Bit-Erweiterung

    Bit-Erweiterung

    Bibliothek: Base
    Eingeführt: 2.5.0
    Aussehen:

    Verhalten

    The bit extender transforms a value into a value of another bit width. If it's being transformed into a smaller bit width, it is simply truncated to keep the lowest-order bits. If it's being transformed into a large bit width, the lowest-order bits are the same, and you have a choice about what the additional high-order bits will be: They can all be 0, all be 1, all match the input's sign bit (its highest-order bit), or the component can have an additional one-bit input that determines the identity of these other bits.

    Pins

    West edge (input, bit width from Bit Width In attribute)

    The multi-bit input whose value is to be transformed.

    East edge (output, bit width from Bit Width Out attribute)

    The computed output.

    North edge (input, bit width 1)

    Specifies what the additional bits in the output should be. This pin is available only when the Extension Type attribute is Input.

    Attribute

    When the component is selected or being added, the digits 0 through 9 alter the Bit Width In attribute and Alt-0 through Alt-9 alter its Bit Width Out attribute.

    Bit Width In
    The input's bit width.
    Bit Width Out
    The output's bit width.
    Extension Type
    Assuming the output bit width exceeds the input bit width, this attribute configures what the additional output bits should be. If Zero or One, the additional bits are 0 or 1 accordingly. If Sign, the additional bits are taken to match the highest-order bit in the input. And if Input, the component has a second input on its north side whose one-bit value is used for the additional bits.

    Verhalten des Schaltwerkzeugs

    Keines.

    Verhalten des Textwerkzeugs

    Keines.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/base/edit.html0000644000175000017500000001720311541757122020651 0ustar vincentvincent Bearbeitungswerkzeug

    Bearbeitungswerkzeug

    Bibliothek: Base
    Eingeführt: 2.3.0

    Verhalten

    The Edit tool allows the user to rearrange existing components and to add wires. Exactly what the tool does depends on where the user presses the mouse on the canvas.

    • When the mouse is over a wiring point for an existing component, or if it is atop a current wire, the Edit Tool will display a small green circle around the mouse's location. Pressing the button there initiates the addition of a new wire. But if the user doesn't drag the mouse far enough to initiate a wire before releasing the button, the press is treated as a mouse click, and so the wire is simply added into the current selection.

      The bit width of an added wire is inferred from the components to which it is connected. If it is not attached to any components, the wire will be drawn gray to indicate that its bit width is unknown; if the components at the locations that the wire helps to connect disagree on the bit width, then the wire will be drawn orange to indicate the conflict, and the wire will in fact refuse to carry any values at all until the user resolves the conflict.

      All wires in Logisim are either horizontal or vertical, never diagonal.

      Wires are non-directional; that is, they carry values from either endpoint to the other. Indeed, a wire can carry values in both directions simultaneously: In the below example, a bit flows from the upper input at left through the center wire, then it circles back through the center wire, and then it circles forward again through the center wire before reaching the output at lower right.

      A single drag of the mouse can create multiple wire segments. The precise process is a little confusing in its description; but it works quite intuitively in practice: If you request a particular wire segment using the Wiring Tool, that segment will be split apart wherever it hits a pin for an existing component, or wherever it hits the endpoint of an existing wire segment. Also, if an endpoint of any of the new wire segments hit somewhere in the middle of an existing wire, then that wire will be split into multiple segments itself.

      You can also shorten or delete an existing wire segment by initiating a drag at the terminus of the segment and then drawing backwards across the segment. During the drag, the shortening is indicated by drawing a white line over of the portion of the wire that will be removed.

      Some components draw short stubs to which wires can connect, such as the OR gate and controlled buffer. Logisim will silently correct attempts to create wires that slightly overshoot the stub's end.

    • If, however, the user presses the Alt key at a point in the middle of the wire, then the green circle will disappear. A mouse press selects the wire, and a mouse drag moves it.

    • Pressing the mouse button while it is within a currently selected component begins a drag moving all elements of the selection.

      By default, Logisim will compute a way to add new wires so that no existing connections are lost during the move. (Sometimes it will delete or shorten existing wires.) If you're performing a move where you do not want these changes to be made, you can press the shift key during the move. If you want to disable this behavior entirely, go to Project > Options, select the Canvas tab, and uncheck the Keep Connections When Moving box; in this case, the connections are computed only when the shift key is down.

      Dragging a selection can lead to unexpected behavior from wires: If you drag a selection including some wires on top of some other wires, all wires are merged, and the merged wires are placed into the selection. As a result, if you drag the selection a second time, the wires previously at the location will not be left behind. This behavior is necessary to keep with the intuitive behavior of wires in Logisim, where wires never overlap. And it does not normally constitute a major problem: Logisim will draw the full selection in the midst of dropping, and you should not drop it until you are sure it is in the correct location.

    • Pressing the mouse within an unselected component (but not at one of the component's wiring points) drops all components from the current selection and selects instead the component(s) containing the clicked location.

    • Shift-clicking the mouse within a component toggles that component's presence within the selection. If multiple components include the same location, all components' presence will be toggled.

    • Dragging the mouse starting at a location not contained within any components drops all components from the current selection and initiates a rectangular selection. All component(s) contained by the rectangle will be placed into the selection.

    • Shift-dragging the mouse starting at a location not contained within any components initiates a rectangular selection. The presence in the selection of all component(s) contained by the rectangle will be toggled.

    • However, if the Alt key is pressed at a location not contained within any components, this initiates the addition of a new wire. A small green circle is drawn in such a circumstance to indicate this.

    After selecting the desired items in the selection, you can of course cut/copy/paste/delete/duplicate all the items via the Edit menu.

    Some keys have an effect with the Edit Tool.

    • The arrow keys change the Facing attribute for all components in the selection that have such an attribute.

    • The Delete and Backspace keys will delete everything in the selection from the circuit.

    • The Insert and MenuKey-D keys will create a duplicate of the currently selected components.

    Logisim's behavior when duplicating a selection or pasting the clipboard into a circuit is somewhat peculiar: It will not immediately place the components into the circuit; instead, the selection will be a collection of "ghosts," which will be dropped into the circuit as soon as they are either dragged to another location or removed from the selection. (This peculiar behavior is necessary because pasting will otherwise merge the wires of the selection into the current circuit at once, and the wires there previously will be dragged with the pasted clipboard if the user wants to move the pasted components somewhere else.)

    Attribute

    Keines. Selecting a component, though, will display its attributes. With multiple components selected, attributes shared by all are shown, blank if they have different values and otherwise with the value they all have in common. (Wires are ignored if there are any non-wires in the selection.) Changes to the attribute value affect all selected components.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/base/clock.html0000644000175000017500000000522511541757122021020 0ustar vincentvincent Takt

    Takt

    Bibliothek: Base
    Eingeführt: 2.0 Beta 13
    Aussehen:

    Verhalten

    The clock toggles its output value on a regular schedule as long as ticks are enabled via the Simulate menu. (Ticks are disabled by default.) A "tick" is Logisim's unit of time; the speed at which ticks occur can be selected from the Simulate menu's Tick Frequency submenu.

    The clock's cycle can be configured using its High Duration and Low Duration attributes.

    Note that Logisim's simulation of clocks is quite unrealistic: In real circuits, multiple clocks will drift from one another and will never move in lockstep. But in Logisim, all clocks experience ticks at the same rate.

    Pins

    A clock has only one pin, an output with a bit width of 1, whose value will represent the current value of the clock. The location of this pin is specified in the Facing attribute. The clock's value will toggle on its schedule whenever ticks are enabled, and it will toggle whenever it is clicked using the Poke Tool.

    Attribute

    When the component is selected or being added, the arrow keys alter its Facing attribute.

    Ausrichtung
    The side of the component where its output pin should be.
    High Duration
    The length of time within each cycle that the clock's output should be 1.
    Low Duration
    The length of time within each cycle that the clock's output should be 0.
    Label
    The text within the label associated with the clock component.
    Label Location
    The location of the label relative to the component.
    Label Font
    The font with which to render the label.

    Verhalten des Schaltwerkzeugs

    Clicking a clock component will toggle its current output value immediately.

    Verhalten des Textwerkzeugs

    Allows the label associated with the component to be edited.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/arith/0000755000175000017500000000000011541757122017230 5ustar vincentvincentlogisim-2.7.1/doc/de/html/libs/arith/subtractor.html0000644000175000017500000000640511541757122022313 0ustar vincentvincent Subtrahierer

    Subtrahierer

    Bibliothek: Arithmetic
    Eingeführt: 2.0 Beta 11
    Aussehen:

    Verhalten

    This component subtracts values coming in via the west inputs (the upper minus the lower) and outputs the difference on the east output. The component is designed so that it can be cascaded with other subtractors to provide subtract more bits than is possible with a single subtractor: The borrow-in input provides a one-bit value to be borrowed out of the difference (if the borrow-in input is specified), and a borrow-out output indicates whether the component needs to borrow an upper-order bit to complete the subtraction without underflow (assuming unsigned subtraction).

    Internally, the subtractor simply performs a bitwise NOT on the subtrahend, and add this to the minuend along with the NOT of the borrow-in input. (The minuend is the first operand (upper input) to the subtraction, and the subtrahend is the second (lower input). I happen to like the antiquated terms.)

    If either of the operands contains some floating bits or some error bits, then the component will perform a partial subtraction. That is, it will compute as many low-order bits as possible. But above the floating or error bit, the result will have floating or error bits.

    Pins

    West edge, north end (input, bit width matches Data Bits attribute)
    The minuend of the subtraction; that is, the number from which to subtract.
    West edge, south end (input, bit width matches Data Bits attribute)
    The subtrahend of the subtraction; that is, the number to subtract from the minuend.
    North edge, labeled b in (input, bit width 1)
    If 1, then 1 is borrowed out of the difference. If the value is unknown (i.e., floating), then it is assumed to be 0.
    East edge (output, bit width matches Data Bits attribute)
    The lower dataBits bits of the difference of the two values coming in the west edge, minus the bin bit.
    South edge, labeled b out (output, bit width 1)
    The borrow bit computed for the difference. If the values subtracted as unsigned values yield a negative value, then this bit will be 1; otherwise, it will be 0.

    Attribute

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the values to be subtracted and of the result.

    Verhalten des Schaltwerkzeugs

    Keines.

    Verhalten des Textwerkzeugs

    Keines.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/arith/shifter.html0000644000175000017500000000724111541757122021566 0ustar vincentvincent Bitschieber

    Bitschieber

    Bibliothek: Arithmetic
    Eingeführt: 2.3.0
    Aussehen:

    Verhalten

    This component includes two inputs, data and dist, and it has one output, which is the result of shifting data by dist places. Both data and output have the same number of bits in them. The component supports the following shift types:

    • Logical Left: All bits in data are shifted up dist places, with the bottom dist places filled with 0's. For example, 11001011 logically shifted left twice is 00101100. (The top two ones are lost.)
    • Logical Right: All bits in data are shifted down dist places, with the upper dist places filled with 0's. For example, 11001011 logically shifted right twice is 00110010. (The bottom two ones are lost.)
    • Arithmetic Right: All bits in data are shifted down dist places, with the upper dist places filled with repetitions of whatever the uppermost bit in data. For example, 11001011 arithmetically shifted right twice is 11110010.
    • Roll Left: All bits in data are shifted up dist places, with the top dist places wrapped around into the bottom. For example, 11001011 rolled left twice is 00101111.
    • Roll Right: All bits in data are shifted down dist places, with the bottom dist places wrapped around into the top. For example, 11001011 rolled right twice is 11110010.

    Note that if dist contains any floating or error inputs, then the output is composed entirely of error values, since there is no way to guess how far to shift the input.

    Pins

    West edge, north end (input, bit width matches the Data Bits attribute)
    The value to be shifted.
    West edge, south end (input, bit width is computed as below)
    The number of bits by which to shift the data input. This input should have as many bits as is the minimum number to indicate any shift distance from 0 up to one less than Data Bits; that is, it should be the ceiling of the base-2 logarithm of Data Bits. For example, if Data Bits were 8, this input would require 3 bits; but if it were 9, it would require 4 bits.
    East edge (output, bit width matches the Data Bits attribute)
    The result of shifting the input value by the input distance.

    Attribute

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the data input and of the output.
    Shift Type
    One of the five possible shift types as outlined above (Logical Left, Logical Right, Arithmetic Right, Roll Left, Roll Right).

    Verhalten des Schaltwerkzeugs

    Keines.

    Verhalten des Textwerkzeugs

    Keines.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/arith/negator.html0000644000175000017500000000350411541757122021557 0ustar vincentvincent Negator

    Negator

    Bibliothek: Arithmetic
    Eingeführt: 2.0 Beta 22
    Aussehen:

    Verhalten

    Computes the two's-complement negation of the input. This negation is performed by maintaining all the lower-order bits up to the lowest-order 1, and complementing all bits above that.

    If the value to be negated happens to be the least negative value, then its negation (which cannot be represented in two's-complement form), is still the least negative value.

    Pins

    West edge (input, bit width matches Data Bits attribute)
    The value to negate.
    East edge, labeled -x (output, bit width matches Data Bits attribute)
    The negation of the input. If the input happens to be the least negative value representable in dataBits bits, however, then the output matches the input.

    Attribute

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the component's input and output.

    Verhalten des Schaltwerkzeugs

    Keines.

    Verhalten des Textwerkzeugs

    Keines.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/arith/multiplier.html0000644000175000017500000000562111541757122022310 0ustar vincentvincent Multiplizierer

    Multiplizierer

    Bibliothek: Arithmetic
    Eingeführt: 2.0 Beta 20
    Aussehen:

    Verhalten

    This component multiplies two values coming in via the west inputs and outputs the product on the east output. The component is designed so that it can be cascaded with other multipliers to multiply a multiplicand with more bits than is possible with a single multiplier: The carry-in input provides a multi-bit value to be added into the product (if it is specified), and a carry-out output provides the upper half of the product result, which can be fed into another multiplier.

    If the multiplicand, the multiplier, or the carry-in input contain some floating bits or some error bits, then the component will perform a partial multiplication. That is, it will compute as many low-order bits as possible. But above the floating or error bit, the result will have floating or error bits. Note that if the carry-in input is completely floating, then it will be assumed to be all-zeroes.

    Pins

    West edge, north end (input, bit width matches Data Bits attribute)
    The multiplicand (that is, the first of the two numbers to multiply).
    West edge, south end (input, bit width matches Data Bits attribute)
    The multiplier (that is, the second of the two numbers to multiply).
    North edge, labeled c in (input, bit width matches Data Bits attribute)
    A carry value to add into the product. If all bits of the value are unknown (i.e., floating), then they are assumed to be 0.
    East edge (output, bit width matches Data Bits attribute)
    The lower dataBits bits of the product of the two values coming in the west edge, plus the cin value.
    South edge, labeled c out (output, bit width matches Data Bits attribute)
    The upper dataBits bits of the product.

    Attribute

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the values to be multiplied and of the result.

    Verhalten des Schaltwerkzeugs

    Keines.

    Verhalten des Textwerkzeugs

    Keines.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/arith/index.html0000644000175000017500000000421411541757122021226 0ustar vincentvincent Arithmetic Library

    Arithmetikbibliothek

    The Arithmetic library includes combinational components that perform arithmetic operations on unsigned and two's-complement values.

    Addierer
    Subtrahierer
    Multiplizierer
    Teiler
    Negator
    Komparator
    Bitschieber
    Bit-Addierer
    Bit-Finder

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/arith/divider.html0000644000175000017500000000634111541757122021550 0ustar vincentvincent Teiler

    Teiler

    Bibliothek: Arithmetic
    Eingeführt: 2.0 Beta 22
    Aussehen:

    Verhalten

    This component divides two values coming in via the west inputs and outputs the quotient on the east output. The component is designed so that it can be cascaded with other dividers to provide support a dividend with more bits than is possible with a single divider: The upper input provides the upper dataBits bits of the dividend (if it is specified at all), and the rem bits provide the remainder, which can be fed as the upper input into another divider.

    If the divisor is 0, then no division is performed (i.e., the divisor is assumed to be 1).

    The divider essentially performs unsigned division. That is, the remainder will always be between 0 and divisor-1. The quotient will always be an integer so that

    quotient * divisor + remainder = dividend .
    If, however, the quotient does not fit into dataBits bits, then only the lower dataBits bits will be reported. The component does not provide any method for accessing the upper dataBits bits.

    If either of the operands contains some floating bits or some error bits, then the component's outputs will be either entirely floating or entirely error values.

    Pins

    West edge, north end (input, bit width matches Data Bits attribute)
    The lower dataBits bits of the dividend (that is, the first operand for the division).
    West edge, south end (input, bit width matches Data Bits attribute)
    The divisor (that is, the second operand for the division)
    North edge, labeled upper (input, bit width matches Data Bits attribute)
    The upper dataBits bits of the dividend (that is, the first operand for the division).
    East edge (output, bit width matches Data Bits attribute)
    The lower dataBits bits of the quotient, as specified above.
    South edge, labeled rem (output, bit width matches Data Bits attribute)
    The remainder of the division. This value will always be between 0 and divisor-1.

    Attribute

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the values to be divided and of the result.

    Verhalten des Schaltwerkzeugs

    Keines.

    Verhalten des Textwerkzeugs

    Keines.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/arith/comparator.html0000644000175000017500000000462711541757122022276 0ustar vincentvincent Komparator

    Komparator

    Bibliothek: Arithmetic
    Eingeführt: 2.0 Beta 22
    Aussehen:

    Verhalten

    Compares two values, either as unsigned values or as two's-complement values, depending on the Numeric Type attribute. Normally, one of the outputs will be 1, and the other two outputs will be 0.

    The comparison is performed starting at the most significant bits in each number and descending downward in parallel until a location is found where the two values disagree. If, however, an error value or a floating value is encountered during this descent, then all outputs will match that error or floating value.

    Pins

    West edge, north end (input, bit width matches Data Bits attribute)
    The first of the two values to be compared.
    West edge, south end (input, bit width matches Data Bits attribute)
    The second of the two values to be compared.
    East edge, labeled > (output, bit width 1)
    1 if the first input is greater than the second input, 0 if the first input is less than or equal the second input.
    East edge, labeled = (output, bit width 1)
    1 if the first input equals the second input, 0 if the first input is not equal the second input.
    East edge, labeled < (output, bit width 1)
    1 if the first input is less than the second input, 0 if the first input is greater than or equal the second input.

    Attribute

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the component's inputs and outputs.

    Verhalten des Schaltwerkzeugs

    Keines.

    Verhalten des Textwerkzeugs

    Keines.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/arith/bitfinder.html0000644000175000017500000000751711541757122022076 0ustar vincentvincent Bit-Finder

    Bit-Finder

    Bibliothek: Arithmetic
    Eingeführt: 2.6.1
    Aussehen:

    Verhalten

    The component takes a multi-bit input and determines the the index of a bit, where the index is computed by counting from 0 as the lowest-order bit. Exactly which index it computes depends on the Type attribute, as illustrated by the examples in the below table for the 8-bit sample input 11010100.

    TypeOutput for 11010100
    Lowest-order 12
    Highest-order 17
    Lowest-order 00
    Highest-order 05

    For the lowest-order 1, the output is 2 because if you index the bits starting from 0 for the lowest-order bit, the first 1 you will find is at index 2. (The bits at indices 0 and 1 are both 0.) For the highest-order 1, the output is 7 because the topmost 1 bit is at index 7 (again counting from the lowest-order bit as 0).

    The component's output on the south edge indicates whether the desired bit was found at all. In the above examples involving the input 11010100, the south output is 1 in all cases. But if the input were 00000000 and the component is to find the lowest-order 1, then the south output would be 0 — and the output on the west edge would be 0 as well.

    If while searching for the desired value, a value that is neither 0 or 1 is found (the bit could be floating or an error value), then both outputs will consist entirely of error bits. Note that this occurs only if the problematic bit is encountered before finding the desired bit: For the input x1010100, the output would still be 2 if the lowest-order 1 is desired; but we would get error values if the component's type indicates to search for the highest-order 1 or the highest-order 0, since there is an erroneous bit in a higher-order bit than either the highest-order 0 or the highest-order 1.

    Pins

    West edge (input, bit width matches Data Bits attribute)
    The multibit input that is to be searched for the desired bit.
    East edge (output, bit width computed as described below)
    The index of the desired bit, counting from 0 for the lowest-order bit. The bit width is the minimum number of bits to store the maximum possible index, which is one less than the value of the Data Bits attribute.
    South edge (output, bit width 1)
    1 if the desired bit is found, 0 if all input bits are the inverse of the desired bit, and the error value if a non-0, non-1 value is found before the desired bit.

    Attribute

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the input.
    Type
    Indicates which bit to search for — the lowest-order 0, the highest-order 0, the lowest-order 1, or the highest-order 1.

    Verhalten des Schaltwerkzeugs

    Keines.

    Verhalten des Textwerkzeugs

    Keines.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/arith/bitadder.html0000644000175000017500000000521711541757122021701 0ustar vincentvincent Bit-Addierer

    Bit-Addierer

    Bibliothek: Arithmetic
    Eingeführt: 2.6.0
    Aussehen:

    Verhalten

    The component determines how many 1 bits are in its input(s) and emits the total number of 1 bits on its output. For example, given the 8-bit input 10011101, the output would be 5, since there are five 1-bits in the input (the first, the last, and a string of three bits in the middle).

    If any of the input bits are floating or error values, then the output will contain error bits in the output corresponding to the range of possible outputs depending on whether those floating/error values are counted as zeroes or ones. For instance, if the 14-bit input is 111x10110x1101, then the output must be at least 9 (if the x's are interpreted as zeroes) and at most 11 (if they are interpreted as ones). Thus, the output will be 10EE: The upper two bits will be 1 and 0 since all integers between 9 and 11 have 1 and 0 as their top two bits, but the lower two bits are EE since integers between 9 and 11 vary within these bits.

    Pins

    West edge (inputs, bit width matches Data Bits attribute)
    The inputs whose 1 bits are to be counted. The number of inputs is based on the Number of Inputs attribute.
    East edge (output, bit width computed as described below)
    The number of input bits which are 1. The bit width of the output is the minimum number of bits to store the maximum possible value (which would be the product of the Data Bits attribute and the Number of Inputs attribute).

    Attribute

    When the component is selected or being added, the digits '0' through '9' alter its Number of Inputs attribute and Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the input(s).
    Number of Inputs
    The number of input values.

    Verhalten des Schaltwerkzeugs

    Keines.

    Verhalten des Textwerkzeugs

    Keines.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/libs/arith/adder.html0000644000175000017500000000524411541757122021202 0ustar vincentvincent Addierer

    Addierer

    Bibliothek: Arithmetic
    Eingeführt: 2.0 Beta 11
    Aussehen:

    Verhalten

    This component adds two values coming in via the west inputs and outputs the sum on the east output. The component is designed so that it can be cascaded with other adders to provide add more bits than is possible with a single adder: The carry-in input provides a one-bit value to be added into the sum also (if it is specified), and a carry-out output provides a one-bit overflow value that can be fed to another adder.

    If either of the addends contains some floating bits or some error bits, then the component will perform a partial addition. That is, it will compute as many low-order bits as possible. But above the floating or error bit, the result will have floating or error bits.

    Pins

    West edge, north end (input, bit width matches Data Bits attribute)
    One of the two values to add.
    West edge, south end (input, bit width matches Data Bits attribute)
    The other of the two values to add.
    North edge, labeled c in (input, bit width 1)
    A carry value to add into the sum. If the value is unknown (i.e., floating), then it is assumed to be 0.
    East edge (output, bit width matches Data Bits attribute)
    The lower dataBits bits of the sum of the two values coming in the west edge, plus the cin bit.
    South edge, labeled c out (output, bit width 1)
    The carry bit computed for the sum. If the values added together as unsigned values yield a result that fits into dataBits bits, then this bit will be 0; otherwise, it will be 1.

    Attribute

    When the component is selected or being added, Alt-0 through Alt-9 alter its Data Bits attribute.

    Data Bits
    The bit width of the values to be added and of the result.

    Verhalten des Schaltwerkzeugs

    Keines.

    Verhalten des Textwerkzeugs

    Keines.

    Zurück zur Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/index.html0000644000175000017500000000067511541757120017173 0ustar vincentvincent Willkommen zu Logisim!

    Willkommen zu Logisim!

    Die Abschnitte des Hilfesystems von Logisim enthalten:

    Leitfaden für Logisim-Anwender
    Bibliotheksreferenz

    logisim-2.7.1/doc/de/html/guide/0000755000175000017500000000000011541757120016263 5ustar vincentvincentlogisim-2.7.1/doc/de/html/guide/verify/0000755000175000017500000000000011541757122017571 5ustar vincentvincentlogisim-2.7.1/doc/de/html/guide/verify/sub.html0000644000175000017500000000643211541757122021255 0ustar vincentvincent Bibliotheken austauschen

    Bibliotheken austauschen

    Now suppose we have two Logisim circuits that are supposed to do the same thing. As an instructor, you might have had students complete an assignment: You have one file containing your solution, but you have several student files containing their work. Maybe the assignment was to build a two-bit adder.

    I'll imagine that we have two files, named adder-master.circ and adder-query.circ. Each file contains a circuit named 2-bit adder (it's important that the circuit to test be named exactly the same), whose appearance is the following.

    adder-master.circ adder-query.circ

    As you can see, the master circuit uses Logisim's built-in adder, while the query circuit uses two subcircuits representing a half adder and a full adder (which themselves are built up of simple gates). For the purpose of our example, the query circuit has a stupid error: The carry from the half adder is not connected into the full adder.

    We build our testing circuit into a different file. There, we load adder-master.circ as a Logisim Library (Project > Load Library > Logisim Library…), and we insert its 2-bit adder as a subcircuit. We could execute this circuit directly to get the desired output for a perfect solution.

    java -jar logisim-filename.jar adder-test.circ -tty table

    But we want to execute the circuit using adder-query.circ rather than adder-master.circ as the loaded library. The naive approach would be to open Logisim and load that library instead; or you might simply remove the adder-master.circ file and rename adder-query.circ to be named adder-master.circ instead. But Logisim includes a handy -sub option that temporarily replace one file by another during that session — without making any changes on disk.

    java -jar logisim-filename.jar adder-test.circ -tty table -sub adder-master.circ adder-query.circ

    The output you would see from this is shown below; it is of course different from what we saw in the previous section since now it is executing using the erroneous adder-query.circ.

    00      00      0E0
    01      00      0E1
    10      00      EE0
    11      00      EE1
    00      01      0E1
    01      01      0E0
    10      01      EE1
    11      01      EE0
    00      10      EE0
    01      10      EE1
    10      10      1E0
    11      10      1E1
    00      11      EE1
    01      11      EE0
    10      11      1E1
    11      11      1E0

    Next: Other verification options.

    logisim-2.7.1/doc/de/html/guide/verify/other.html0000644000175000017500000001037311541757122021604 0ustar vincentvincent Andere Prüfungseinstellungen

    Andere Prüfungseinstellungen

    There are a some additional options related to command-line execution.

    The -load command-line parameter

    A more complex circuit might include a RAM component that needs to be loaded with a program in order for the circuit to have anything to do. You can specify a memory image file at the command line, which will be loaded into any RAM component in the circuit before simulation begins. (This does not work when loading the GUI - it is only for command-line execution.)

    java -jar logisim-filename.jar cpu.circ -tty table -load mem-image.txt

    The order of the parameters is not important (except the table parameter must be immediately after -tty, and the memory image's filename must be immediately after -load). The memory image file should be in Logisim's memory image format.

    Logisim searches for RAM recursively, so this will still work if RAM is nested within a subcircuit. There is no way, though, to distinguish different RAM components: Logisim will attempt to load the same file into every RAM that it can find.

    Options for the -tty parameter

    In our examples thus far, we've always used -tty table to indicate that a table of output values should be displayed. You can customize the behavior in other ways by listing one or more options, separated by commas. For instance, you might write -tty table,halt,speed, and the program will perform all three behaviors listed below. (The order in which they are listed does not matter.)

    halt

    After the simulation ends, a one-line message is displayed explaining why the simulation ended. Error conditions - such as a detected oscillation - are displayed in any case.

    speed

    If you use speed in conjunction with -tty, then after completing the simulation Logisim will display a summary of how quickly the circuit was simulated, such as:

    714 Hz (509 ticks in 712 milliseconds)

    Note that displaying information during the simulation makes the simulation go much slower. As just one comparison, the same circuit and image ran at 714 Hz above with just the speed option but 490 Hz with the table option as well.

    stats

    Shows a tab-delimited table containing statistics about components used by the top-level main circuit in the project. The table includes four columns:

    • Unique: The number of times that component appears in the circuit's hierarchy, where each subcircuit within the hierarchy is counted only once.
    • Recursive: The number of times that component appears in the circuit's hierarchy, where we count each subcircuit as many times as it appears in the hierarchy.
    • Component: The name of the component.
    • Library: The name of the library from which the component came.

    The distinction between Unique and Recursive is explained further under Project menu section. If the file uses circuits from a loaded Logisim library, those components are considered to be black boxes: The contents of the library's circuits are not included in the unique and recursive counts.

    (This feature can be useful for instructors who assign students to build projects using a subset of Logisim's libraries.)

    table

    (as already discussed)

    tty

    Any TTY components send their output to the display (standard output), and any information typed at the keyboard is sent to all Keyboard components in the circuit. These components are included even if they are nested deeply in the subcircuit hierarchy.

    Next: Testing multiple files.

    logisim-2.7.1/doc/de/html/guide/verify/multi.html0000644000175000017500000000601211541757122021610 0ustar vincentvincent Testen mehrerer Dateien

    Testen mehrerer Dateien

    In the classroom example, you will have many files that you wish to test for their equivalence, and you won't want to read the output for each of the student's solutions.

    Building comparison into the circuit

    One approach is to build a test circuit that does the comparison directly. Here, we create an additional circuit within the testing file that contains our solution circuit. In our overall testing circuit, we include both the subcircuit from adder-master.circ and the subcircuit from the solution circuit located directly into the nested circuit. We wire it so that there is just one output, which is 1 as long as the two subcircuits agree.

    Now we can simply run Logisim substituting each query file. For any correct solution, the only output will be 1.

    Using redirection and shell scripts

    If you're quite comfortable with the command line, you can build your own shell script to accomplish this. Here, we'll use redirection (the > operator) to save the output of each circuit into a file. For instance, we might issue the following two commands to collect the output of the master circuit and the query circuit.

    java -jar logisim-filename.jar adder-test.circ -tty table > output-master.txt
    java -jar logisim-filename.jar adder-test.circ -tty table -sub adder-master.circ adder-query.circ > output-query.txt

    Now we've created two different files. We can then compare the two output files using a program built for that purpose. Under Linux or MacOS X, you might want to use the cmp or diff command-line utilities. Under Windows, you might want to use WinMerge.

    To process several query files, you would like want to build a simple program such as a shell script to iterate through each and comparing the output. Here is how I would do it under Linux's bash:

    RUN_TEST="java -jar logisim-filename.jar adder-test.circ -tty table"
    ${RUN_TEST} > output-master.txt
    for QUERY_FILE in adder-query*.circ
    do
      if ${RUN_TEST} -sub adder-master.circ ${QUERY_FILE} | cmp -s output-master.txt
      then
        echo "${QUERY_FILE} OK"
      else
        echo "${QUERY_FILE} different"
      fi
    done

    Weiter: Leitfaden für Benutzer von Logisim.

    logisim-2.7.1/doc/de/html/guide/verify/index.html0000644000175000017500000000546211541757122021575 0ustar vincentvincent Benutzung der Kommandozeile

    Benutzung der Kommandozeile

    Subsections:
    Substituting libraries
    Other verification options
    Testing multiple files

    Logisim includes basic support for executing circuits from the command-line. This is intended both to help with scripted verification of circuit designs and to help instructors perform automated testing of students' solutions.

    We'll start by seeing how to execute a circuit from the command line. For our example, we'll suppose we've built the below circuit in a file named adder-test.circ. It uses a two-bit adder as a subcircuit and iterates using a counter through all 16 possible inputs to it.

    After this circuit has been built, we then execute Logisim from the command line, providing the filename of the project and the -tty option with the table parameter.

    java -jar logisim-filename.jar adder-test.circ -tty table

    Without bringing up any windows, Logisim loads the circuit and begins to execute it, ticking any clocks as fast as it can while completing the propagation between each tick. After each propagation is completed, Logisim loads the current values of the output pins; if any have changed from the previous propagation, then all values are displayed in tab-delimited format. If there is an output pin labeled with the special word halt, its output is not displayed — but once the pin's value reaches 1 after a propagation is completed, Logisim ends the simulation.

    For our example, Logisim displays the table below. Because we have two output pins corresponding to the two inputs a and b into the two-bit adder, these outputs are included as the first two columns of the output. And there is another output pin corresponding to the two-bit adder's output, so it is the third column. The columns are ordered left-to-right according to the top-down ordering within the circuit.

    00      00      000
    01      00      001
    10      00      010
    11      00      011
    00      01      001
    01      01      010
    10      01      011
    11      01      100
    00      10      010
    01      10      011
    10      10      100
    11      10      101
    00      11      011
    01      11      100
    10      11      101
    11      11      110
    

    Next: Substituting libraries.

    logisim-2.7.1/doc/de/html/guide/tutorial/0000755000175000017500000000000011541757122020130 5ustar vincentvincentlogisim-2.7.1/doc/de/html/guide/tutorial/tutor-wires.html0000644000175000017500000000560111541757122023324 0ustar vincentvincent Einführung: Leitungen hinzufügen

    Weiter: Schritt 3: Text hinzufügen

    Schritt 2: Leitungen hinzufügen

    Nachdem Sie alle Bauelemente auf der Arbeitsfläche abgelegt haben, ist es an der Zeit, Leitungen anzuschließen. Wählen Sie das Bearbeitungswerkzeug () aus. Wenn sich der Mauszeiger über dem Anschlußpunkt eines Bauelements befindet, wird ein kleiner grüner Kreis um diesen Punkt gezeichnet. Drücken Sie dann die Maustaste und ziehen Sie die Leitung soweit Sie möchten.

    Logisim ist zeimlich intelligent beim Hinzufügen von Leitungen: Immer wenn eine Leitung auf einer anderen Leitung endet, werden die beiden Leitungen verbunden. Sie können eine bestehende Leitung verlängern oder verkürzen, indem Sie deren Endpunkte mit dem Bearbeitungswerkzeug verschieben.

    Leitungen in Logisim verlaufen immer horizontal oder vertikal. Um den oberen Eingang an den Inverter und die zwei AND-Gatter anzuschließen, wurden drei verschiedene Leitungen gezogen.

    Logisim schließt Leitungen automatisch an Gatter an, und verbindet Leitungen automatisch untereinander. Dabei wird automatisch der Punkt an einer T-Kreuzung gezeichnet, um anzuzeigen, daß die Leitungen verbunden sind.

    Wenn Sie neue Leitungen zeichnen, werden Ihnen auch blaue und graue Leitungen begegnen. In Logisim zeigt Blau an, daß der Wert eines Punktes "unbekannt" ist, und graue Leitungen sind überhaupt noch nicht irgendwo angeschlossen. Da Sie aber noch mit dem Aufbau der Schaltung zu tun haben, muß Sie dies nicht stören. Aber wenn Sie Sie mit dem Zeichnen fertig sind, dann sollten keine Leitungen mehr blau oder grau sein. (Die nicht-angeschlossenen Eingänge des OR-Gatters sind hier immer noch blau, aber das ist in Ordnung.)

    Wenn Sie immer noch blaue oder graue Leitungen sehen, wenn Sie eigentlich alles angeschlossen haben, dann stimmt irgendetwas noch nicht. Es ist immer wichtig, daß Sie die Leitungen an den richtigen Stellen anschließen. Logisim zeichnet kleine Punkte an den Stellen der Bauelemente, an denen Drähte angeschlossen werden sollten. Während Sie mit dem Zeichnen der Schaltung vorankommen, werden Sie sehen, wie immer mehr dieser Punkte von blau zu hellgrün oder dunkelgrün wechseln.

    Sobald Sie alle Leitungen angeschlossen haben, werden auch alle Leitungen selbst hellgrün oder dunkelgrün sein.

    Weiter: Schritt 3: Text hinzufügen

    logisim-2.7.1/doc/de/html/guide/tutorial/tutor-text.html0000644000175000017500000000252011541757122023154 0ustar vincentvincent Einführung: Text hinzufügen

    Weitert: Schritt 4: Testen der Schaltung

    Schritt 3: Text hinzufügen

    Das Hinzufügen von Text ist für das Funktionieren einer Schaltung nicht notwendig. Wenn Sie aber Ihre Schaltungen an jemanden weitergeben möchten (z.B. an einen Lehrer), dann können Beschriftungen bei der Erklärung helfen, wie einzelne Teile der Schaltung funktionieren.

    Wählen Sie das Textwerkzeug () aus. Jetzt können Sie einen der Eingänge anklicken, und diesen durch Eintippen mit einer Beschriftung versehen. (Es ist besser, direkt den Eingangspin anzuklicken und mit einer Beschriftung zu versehen, als den Text frei zu platzieren, weil die Beschriftung gegebenenfalls mit dem Pin verschoben wird.) Dasselbe können Sie auch mit dem Ausgangspin machen. Oder Sie können einfach auf einen beliebigen Platz der Arbeitsfläche klicken, und den Text dort eintippen.

    Weitert: Schritt 4: Testen der Schaltung

    logisim-2.7.1/doc/de/html/guide/tutorial/tutor-test.html0000644000175000017500000000560711541757122023160 0ustar vincentvincent Einführung: Testen der Schaltung

    Weiter: Leitfaden für Benutzer von Logisim

    Schritt 4: Testen der Schaltung

    Der letzte Schritt ist das Testen der Schaltung, um zu sehen, ob diese wirklich wie geplant funktioniert. Zu diesem Zeitpunkt simuliert Logisim bereits das Verhalten der Schaltung. Lassen Sie uns noch einmal ansehen, wo wir gerade waren.

    Beachten Sie, daß beide Eingänge auf 0 gesetzt sind, und auch am Ausgang haben wir eine 0. Dies zeigt uns, daß unsere Schaltung schon eine 0 ausrechnet, wenn beide Eingänge auf 0 gesetzt sind.

    Jetzt probieren wir eine andere Eingangskombination. Wählen Sie das Schaltwerkzeug () aus, und schalten Sie die Eingänge um, indem Sie diese anklicken. Jedes Mal, wenn Sie einen Eingang anklicken, wird sich dessen Wert ändern. Wir können also zum Beispiel den unteren Eingang anklicken.

    Sobald Sie den Wert am Eingang ändern, wird Logisim Ihnen anzeigen, welche Werte auf den einzelnen Leitungen geführt werden. Eine hellgrüne Leitung zeigt eine 1 an, eine dunkelgrüne (fast schwarze) Leitung eine 0. Sie können auch sehen, daß sich der Wert am Ausgang der Schaltung auf 1 geändert hat.

    Bisher haben wir somit die ersten zwei Zeilen der Wahrheitstabelle getestet, und die Ausgangswerte (0 und 1) entsprechen unseren Erwartungen.

    Durch Schalten der Eingänge durch die verschiedenen Kombinationen können wir auch die restlichen zwei Zeilen überprüfen. Wenn alles stimmt, sind wir fertig: Die Schaltung funktioniert!



    Um unsere Arbeit zu archivieren, können Sie die Schaltung speichern oder ausdrucken. Die entsprechenden Funktionen finden Sie im Dateimenü, das auch einen Punkt zum Beenden von Logisim enthält. Aber warum sollten wir jetzt aufhören?

    Nachdem Sie jetzt die Einführung abgeschlossen haben, können Sie weiter mit Logisim experimentieren und eigene Schaltungen aufbauen. Wenn Sie Schaltungen mit komplexeren Funktionen aufbauen wollen, dann sollten Sie auch den Rest des Hilfesystems durchblättern, um zu sehen, welche Möglichkeiten Ihnen Logisim bietet. Logisim ist ein leistungsfähiges Programm, mit dem Sie riesige Schaltungen aufbauen und testen können. Diese Schritt-für-Schritt-Einführung kann nur die Oberfläche ankratzen.

    Weiter: Leitfaden für Benutzer von Logisim

    logisim-2.7.1/doc/de/html/guide/tutorial/tutor-orient.html0000644000175000017500000000276611541757122023504 0ustar vincentvincent Einführung: Finden Sie sich zurecht

    Weiter: Schritt 1: Gatter hinzufügen

    Schritt 0: Finden Sie sich zurecht

    Wenn Sie Logisim starten, werden Sie ein Fenster wie das folgende sehen. Auf einem anderen Computersystem kann das Fenster etwas anders aussehen.

    Das Programmfenster von Logisim ist in drei Bereiche gegliedert: das Übersichtsfenster, die Attribut-Tabelle und die Arbeitsfläche. Über diesen drei Bereichen befindet sich die Menüleiste und die Werkzeugleiste.

    In dieser Einführung werden wir noch nicht auf das Übersichtsfenster und auch nciht auf die Attribut-Tabelle eingehen. Bis auf Weiteres können Sie diese beiden Bereiche einfach ignorieren. Und die Menüleiste sollte eigentlich selbsterklärend sein.

    Somit bleiben und hier die Werkzeugleiste und die Arbeitsfläche. Der Arbeitsbereich ist die Fläche, auf der Sie Ihre Schaltung zeichnen werden, und die Werkzeugleiste enthält alle Werkzeuge, die Sie hierfür benötigen.

    Weiter: Schritt 1: Gatter hinzufügen

    logisim-2.7.1/doc/de/html/guide/tutorial/tutor-gates.html0000644000175000017500000000765411541757122023310 0ustar vincentvincent Einführung: Gatter hinzufügen

    Weiter: Schritt 2: Leitungen hinzufügen

    Schritt 1: Gatter hinzufügen

    Erinnern Sie sich daran, daß wir die folgende Schaltung in Logisim aufbauen wollen.

    Zunächst sollten wir die Gatter platzieren, um ein Gerüst zu erhalten. Später werden wir die Gatter mit Leitungen verbinden. Zunächst werden wir die zwei AND-Gatter hinzufügen. Klicken Sie auf das AND-Werkzeug auf der Werkzeugleiste (, das vorletzte Werkzeug). Dann klicken Sie auf die Arbeitsfläche, dort, wo Sie das erste AND-Gatter platzieren möchten. Lassen Sie genügend Platz auf der linken Seite. Danach klicken Sie nochmals auf das AND-Werkezug und setzen Sie das zweite AND-Gatter unter das erste.

    Sehen Sie die fünf Punkte auf der linken Seite des AND-Gatters? Dies sind die Anschlußpunkte, an denen Sie Leitungen befestigen können. Diesmal werden wir nur zwei dieser Punkte für unsere XOR-Schaltung benötigen, aber für andere Schaltungen werden Sie vielleicht mehr Eingänge benötigen.

    Jetzt fügen wir die weiteren Gatter hinzu. Zunächst klicken Sie auf das OR-Werkzeug (), und platzieren das OR-Gatter in der Schaltung. Und dann setzen Sie die zwei Inverter vor den AND-Gattern mit dem Inverter-Werkzeug ().

    Hier wurde ein kleiner Abstand zwischen den Anschlüssen der Inverter und der AND-Gatter gelassen. Sie können die Anschlüsse aber auch gleich direkt aneinander setzen und ersparen sich damit das spätere Verdrahten dieser Anschlüsse.

    Jetzt fügen wir die beiden Eingänge x und y hinzu. Wählen Sie das Eingangs-Werkzeug () aus, und platzieren Sie die Pins. Mit dem Ausgangs-Werkzeug () sollten Sie ebenfalls einen Ausgang neben dem Ausgang des OR-Gatters platzieren. (Auch hier wurde wieder ein kleiner Abstand zwischen dem OR-Gatter und dem Ausgangsanschluß gelassen, aber Sie könnten diese auchn direkt aneinander setzen.)

    Wenn Sie nachträglich etwas verschieben wollen, dann wählen Sie das zu verschiebende Bauelement mit Hilfe des Bearbeitungs_Werkzeugs () aus, und ziehen Sie es dann mit der Maus dorthin, wo Sie es gerne haben möchten. Mit dem Kommando "Löschen" aus dem Menü "Bearbeiten" bzw. mit der Entf-Taste können Sie das Bauelement auch gleich aus der Schaltung entfernen.

    Sie werden bemerkt haben, daß Logisim nach dem Einfügen eines neuen Bauelements automatisch zum Bearbeitungswerkzeug zurück wechselt. Auf diese Weise können Sie das erstellte Bauelement sofort verschieben und es (wie wir gleich sehen werden) verdrahten. Wenn Sie ein soeben platziertes Bauelement kopieren wollen, so können Sie mit dem Tastaturkommando Strg-D die aktuelle Auswahl duplizieren (Einige Computer benutzen andere Tastenkombinationen für Menübefehle, auf einem Mac zum Beispiel die Kommando-Taste. Diese würden Sie hier zusammen mit der Taste D benutzen.)

    Weiter: Schritt 2: Leitungen hinzufügen

    logisim-2.7.1/doc/de/html/guide/tutorial/index.html0000644000175000017500000000361011541757122022125 0ustar vincentvincent Einführung für Anfänger

    Einführung für Anfänger

    Weiter: Schritt 0: Finden Sie sich zurecht

    Willkommen zu Logisim!

    Logisim erlaubt es Ihnen, digitale Schaltungen zu entwerfen und zu simulieren. Es ist, als ein pädagogisches Werkzeug gedacht, um Ihnen zu zeigen, wie Schaltungen funktionieren.

    Um den Umgang mit Logisim zu lernen, lassen Sie uns eine XOR-Schaltung aufbauen - eine Schaltung mit zwei EIngängen (die wir x und y nennen wollen), und die eine 0 ausgibt, wenn beide Eingänge denselben Wert aufweisen, und eine 1, wenn dies nicht der Fall ist. Die folgende Wahrheitstabelle zeigt die Funktion.

    Wir können diese Schaltung zunächst auf dem Papier entwerfen.
    Aber nur weil es jetzt auf dem Papier steht bedeutet dies noch nicht, daß die Schaltung auch richtig ist. Um unseren Entwurf zu überprüfen, werden wir die Schaltung in Logisim zeichnen und testen. Als Bonus erhalten wir ein Schaltungsdiagramm, das vielleicht besser aussieht, als unsere Skizze von Hand.

    Schritt 0: Finden Sie sich zurecht
    Schritt 1: Gatter hinzufügen
    Schritt 2: Leitungen hinzufügen
    Schritt 3: Text hinzufügen
    Schritt 4: Testen der Schaltung

    Viel Spaß beim Schaltungsaufbau!

    Weiter: Schritt 0: Finden Sie sich zurecht

    logisim-2.7.1/doc/de/html/guide/subcirc/0000755000175000017500000000000011541757122017717 5ustar vincentvincentlogisim-2.7.1/doc/de/html/guide/subcirc/using.html0000644000175000017500000000742611541757122021743 0ustar vincentvincent Verwendung von Teilschaltungen

    Verwendung von Teilschaltungen

    Now suppose we want to build a 4-to-1 multiplexer using instances of our 2-to-1 multiplexer. Of course, we would first create a new circuit, which we'll call "4:1 MUX." To add 2-to-1 multiplexers into our circuit, we click the 2:1 MUX circuit once in the explorer pane to select it as a tool, and then we can add copies of it, represented as boxes, by clicking within the canvas.

    If you were to double-click the 2:1 MUX circuit in the explorer pane, then the window would switch to editing the 2:1 MUX circuit instead.

    After building up the circuit, we end up with the following.

    Our circuit for a 4-to-1 multiplexer uses three copies of the 2-to-1 multiplexer, each drawn as a box with pins along the side. The pins on this box correspond to the input and output pins in the 2:1 MUX circuit. The two pins on the west side of the box correspond to the two pins that face east in the 2:1 MUX circuit; the pin on the box's east side corresponds to the 2:1 MUX's west-facing pin (which happens to be an output pin); and the pin on the box's south side corresponds to the 2:1 MUX's north-facing pin. The order of the two pins on the box's west side correspond to the same top-down ordering from the subcircuit's design. (If there were several pins on the box's north or south side, they would correspond to the same left-right order in the subcircuit.)

    If the pins in the subcircuit's layout have labels associated with them, then Logisim will display that label in a tip (that is, a temporary text box) when the user hovers the mouse over the corresponding location of the subcircuit component. (If you find these tips irritating, you can disable them via the Preferences window's Layout tab.)

    Several other components will display these tips, too: For some of the pins of a built-in flip-flop, for example, hovering over it explains what that pin does.

    Incidentally, every pin to a circuit must be either an input or an output. Many manufactured chips have pins that behave as an input in some situations and as an output in others; you cannot construct such chips within Logisim (at least, in the current version).

    Logisim will maintain different state information for all subcircuits appearing in a circuit. For example, if a circuit contains a flip-flop, and that circuit is used as a subcircuit several times, then each subcircuit's flip-flop will have its own value when simulating the larger circuit.

    Now that we have the 4-to-1 multiplexer defined, we can now use it in other circuits. Logisim has no limits on how deeply circuits can be nested - though it will object to nesting circuits within themselves!

    Note: There's nothing wrong with editing a circuit that is being used as a subcircuit; in fact, this is quite common. Be aware, though, that any changes to a circuit's pins (adding, deleting, or moving them) will rearrange them also in the containing circuit. Thus, if you change any pins in a circuit, you will also need to edit any circuits using it as a subcircuit.

    Next: Editing subcircuit appearance.

    logisim-2.7.1/doc/de/html/guide/subcirc/library.html0000644000175000017500000000332111541757122022250 0ustar vincentvincent Bibliotheken von Logisim

    Bibliotheken von Logisim

    Every Logisim project is automatically a library that can be loaded into other Logisim projects: Just save it into a file and then load the library within another project. All of the circuits defined in the first project will then be available as subcircuits for the second. This feature allows you to reuse common components across projects and to share favorite components with your friends (or students).

    Each project has a designated "main circuit," which can be changed to refer to the current circuit via the Set As Main Circuit option in the Project menu. The only significance of this is that the main circuit is the one that is displayed when you first open the project. The default name of the circuit in a newly created file ("main") has no significance at all, and you can feel free to delete or rename that circuit.

    With a loaded Logisim library, you are allowed to view circuits and manipulate their states, but Logisim will prevent you from altering the circuits' design and other data stored within the file.

    If you want to alter a circuit in a loaded Logisim library, then you need to open it separately within Logisim. As soon as you save it, the other project should automatically load the modified version immediately; but if it does not, you can right-click the library folder in the explorer pane and select Reload Library.

    Weiter: Leitfaden für Benutzer von Logisim.

    logisim-2.7.1/doc/de/html/guide/subcirc/index.html0000644000175000017500000000245411541757122021721 0ustar vincentvincent Teilschaltungen

    Teilschaltungen

    As you build circuits that are more and more sophisticated, you will want to build smaller circuits that you can use multiple times as a module nested within larger circuits. In Logisim, such a smaller circuit that is used in a larger circuit is called a subcircuit.

    If you're familiar with computer programming, you're familiar with the subprogram concept, whether it's called a subroutine, function, method, or procedure in your favored language. The subcircuit concept is analogous to this, and it serves the same purpose: To break a large job into bite-sized pieces, to save the effort of defining the same concept multiple times, and to facilitate debugging.

    Creating circuits
    Using subcircuits
    Editing subcircuit appearance
    Debugging subcircuits
    Logisim libraries

    Next: Creating circuits.

    logisim-2.7.1/doc/de/html/guide/subcirc/debug.html0000644000175000017500000000407511541757122021701 0ustar vincentvincent Fehlersuche in Teilschaltungen

    Fehlersuche in Teilschaltungen

    As you test larger circuits, you will likely find bugs. To nail down what's going wrong, exploring what's going on in the subcircuits while running the overall circuit can help. You can view the state of the subcircuit in two ways: First, you can bring up the subcircuit's popup menu by right-clicking or control-clicking it, choosing the View option.

    Or if you have the Poke tool selected, you can click the circuit, and a magnifying glass will appear over its center; double-clicking where the magnifying glass appears will also enter the subcircuit's state.

    Notice that the pins' values in the subcircuit match the values being sent to them in its containing circuit.

    While in the subcircuit, you are allowed to alter the circuit. If the changes affect any of the subcircuit's outputs, they are propagated into the containing circuit. One exception: The subcircuit inputs are determined based on the values coming into the circuit from the supercircuit, so it doesn't make sense to toggle those values. If you attempt to poke a subcircuit's input, a dialog will pop up asking, The pin is tied to the supercircuit state. Create a new circuit state? Clicking No will cancel the toggle request, while clicking Yes will create a copy of the viewed state, divorced from the outer circuit, with the input pin toggled.

    Once you have completed viewing and/or editing, you can return to the parent circuit either by double-clicking the parent circuit in the explorer pane, or via the Go Out To State submenu of the Simulate menu.

    Next: Logisim libraries.

    logisim-2.7.1/doc/de/html/guide/subcirc/creating.html0000644000175000017500000000243211541757122022402 0ustar vincentvincent Erstellen von Schaltungen

    Erstellen von Schaltungen

    Every Logisim project is actually a library of circuits. In its simplest form, each project has only one circuit (called "main" by default), but it is easy to add more: Select Add Circuit... from the Project menu, and type any name you like for the new circuit you want to create.

    Suppose we want to build a 2-to-1 multiplexer named "2:1 MUX." After adding the circuit, Logisim will look like this.

    In the explorer pane, you can now see that the project now contains two circuits, "main", and "2:1 MUX." Logisim draws a magnifying glass over the icon of the circuit currently being viewed; the current circuit name also appears in the window's title bar.

    After editing the circuit to appear like a 2:1 multiplexer, we might end up with the following circuit.

    Next: Using subcircuits.

    logisim-2.7.1/doc/de/html/guide/subcirc/appear.html0000644000175000017500000001667211541757122022071 0ustar vincentvincent Aussehen von Teilschaltungen bearbeiten

    Aussehen von Teilschaltungen bearbeiten

    Default appearance

    By default, when a subcircuit is placed within a larger circuit, it is drawn as a rectangle with a notch indicating the north end of the subcircuit's layout. Pins will be placed on the rectangle's border based on their facing: Pins that face east in the layout (and typically appear on the west side of the layout) will be placed on the rectangle's west side, according to their top-down ordering in the layout. Pins that face south in the layout (typically toward the north side of the layout) will be placed on the rectangle's north side, according to the left-to-right ordering in the layout.

    The default rectangle can optionally include some letters that will appear in the middle of the rectangle. To specify this, select the selection tool () and click the background of the circuit's layout. This will show the circuit attributes in the attribute table, including the Label, Label Facing, and Label Font attributes. The value of the Label attribute will be drawn in the rectangle's center; the Label Facing attribute customizes which direction the text is drawn, and of course the Label Font attribute customizes the font used.

    Customized appearance

    The default appearance is very usable, and indeed Logisim existed for many years with no other option. If, however, you prefer that the subcircuit be drawn differently, you can select Edit Circuit Appearance from the Project menu, and Logisim's interface will switch from its regular layout-editing interface to an interface for drawing the circuit's appearance. Below, we are editing the 2:1 multiplexer's appearance so that it is drawn with the usual trapezoid rather than a rectangle. (You can see the project toolbar just below the regular toolbar. This can be enabled through the Project menu, and it allows quick switching between editing the layout and appearance.)

    With the appearance for the 2:1 multiplexer drawn as above, the layout for the 4:1 multiplexer would then appear as the following.

    The appearance editor is like a traditional drawing program, but there are a few special symbols for indicating how the drawing works when placed into a circuit's layout. These special symbols cannot be removed.

    • The green circle with a line coming out of it, which we'll call the anchor. There is exactly one anchor in each subcircuit appearance. Each component in a circuit has a single point identifying its location; a user sees this when creating a new component: The mouse click identifies just a single location, and the component is placed relative to that (usually with the primary output at the mouse's location) The anchor identifies the mouse's location relative to the overall drawing when the subcircuit is created.

      The anchor also identifies the appearance's facing, as indicated by the direction the anchor's line points from its circle. When placing the subcircuit into a layout, the user can change the subcircuit's facing; the anchor's facing indicates in which direction the appearance is oriented. In our example, the anchor is facing east, and each instance of the subcircuit in the 4:1 multiplexer is also facing east, so they are all drawn in the same orientation as the 2:1 multiplexer's appearance.

    • The blue circles and squares with dots in them are the subcircuit's ports. There are exactly as many ports as there are input and output pins in the circuit. Ports corresponding to inputs are drawn as squares, while ports corresponding to outputs are drawn as circles. Each port indicates how a wire connecting into the circuit will correspond to an input or output pin within the layout.

      When you select a port, Logisim will indicate the corresponding pin by popping up a miniature diagram of the layout in the window's bottom right corner, with the corresponding pin(s) drawn in blue. This does not happen when all ports are selected.

    The toolbar contains tools for adding additional shapes, as listed below with descriptions of how the shift and alt key modifies the tool behavior. In addition, clicking or dragging the mouse with the control key pressed regularly snaps the mouse position to the nearest grid point.

    Select, move, copy, and paste shapes.
    Add or edit text.
    Create a line segment. Shift-drag keeps the line's angle at a multiple of 45°.
    Create a quadratic Bezier curve. For the first drag, where you specify the curve's endpoints, shift-drag keeps the endpoints at an angle that is a multiple of 45°. Then you click to indicate the control point's location; shift-click ensures the curve is symmetric, while alt-click draws the curve through the control point.
    Create a sequence of connected lines, whose vertices are indicated by a succession of clicks. Shift-clicking ensures that the angle between the previous vertex and the current one is a multiple of 45°. Double-click or press the Enter key to complete the shape.
    Create a rectangle through dragging from one corner to the opposite corner. Shift-drag to create a square, and alt-drag to create the rectangle starting from the center.
    Create a rectangle with rounded corners through dragging from one corner to the opposite corner. Shift-drag to create a square, and alt-drag to create the rectangle starting from the center.
    Create an oval through dragging from one corner of its bounding box to the opposite corner. Shift-drag to create a circle, and alt-drag to create the oval starting from the center.
    Create an arbitrary polygon, whose vertices are indicated by a succession of clicks. Shift-clicking ensures that the vertex is at a 45° angle from the previous one. Double-click, press the Enter key, or click the starting vertex to complete the shape.

    Next: Debugging subcircuits.

    logisim-2.7.1/doc/de/html/guide/prop/0000755000175000017500000000000011541757122017245 5ustar vincentvincentlogisim-2.7.1/doc/de/html/guide/prop/shortcome.html0000644000175000017500000000422011541757122022134 0ustar vincentvincent Schwachstellen

    Schwachstellen

    Logisim's propagation algorithm is more than sophisticated enough for almost all educational purposes; but it is not sophisticated enough for industrial circuit design. In order from most damning to least damning, the shortcomings of Logisim's propagation technique include:

    • Except for the issue of gate delays, Logisim does not particularly concern itself with timing issues. It is very idealized, so that a pair of NOR gates in an S-R latch configuration will toggle in lockstep infinitely, rather than the circuit eventually settle into a stable state.

    • Logisim cannot simulate subcircuits whose pins sometimes behave as inputs and sometimes behave as outputs. Components built using Java can have such pins, though: Within the built-in libraries, the Memory library's RAM circuit contains a D pin that can act both as an input and as an output.

    • Logisim cuts off its simulation after a fixed number of iterations assuming that there is an oscillation error. Conceivably, a large circuit that does not oscillate could lead to trouble.

    • Logisim does nothing with respect to discriminating between voltage levels: A bit can be only on, off, unspecified, or error.

    • There are additional shortcomings, too, that I have omitted because they are so obscure that if you were aware of them, it would be obvious that Logisim comes nowhere close to that level. As an extreme example, I have a friend who works for a major chip manufacturer, and his job is to worry about "bubbles" in chips' nanometer-wide wires growing and leading to random disconnection.

    • Even beyond this, I am not a circuit design specialist; thus, there may well be errors in the propagation technique of which I am not aware. I welcome corrections from experts.

    Weiter: Leitfaden für Benutzer von Logisim.

    logisim-2.7.1/doc/de/html/guide/prop/oscillate.html0000644000175000017500000000441511541757122022116 0ustar vincentvincent Fehler durch Oszillationen

    Fehler durch Oszillationen

    The propagation algorithm, which normally works silently without any problems, will become very visible when you create a circuit that oscillates.

    This circuit is currently in a stable condition. But if you change the input to 1, the circuit will effectively enter an infinite loop. After a while, Logisim will simply give up and show an "Oscillation apparent" message telling you that it believes that the circuit is oscillating.

    It will display the values it has at the time it gives up. These values will look wrong - in this screen shot, the AND gate is emitting 1 although one of its inputs is 0, but it could be that the NOT gate has a 1 input and a 1 output.

    Logisim helpfully circles in red each location that seems to be involved in the oscillation. If an involved point lies within a subcircuit, Logisim will draw that subcircuit's outline in red.

    When Logisim detects oscillation, it shuts down all further simulation. You can re-enable simulation using the Simulate menu's Simulation Enabled option.

    Logisim detects oscillation using a fairly simple technique: If the circuit simulation seems to many iterations, then it will simply give up and report oscillation. (The points it identifies as being involved are those that were touched in the last 25% of the iterations.) Thus, it could erroneously report oscillation, particularly if you are working with an exceptionally large circuit; but it would be one that is larger than any I have built using Logisim. In any case, if you are confident that the reporting is in error, you can configure the number of iterations completed before oscillation occurs via the Project Options window's Simulation tab.

    Next: Shortcomings.

    logisim-2.7.1/doc/de/html/guide/prop/index.html0000644000175000017500000000152111541757122021241 0ustar vincentvincent Weiterleitung von Werten

    Weiterleitung von Werten

    Logisim's algorithm for simulating the propagation of values through circuits is not something that you normally need to worry about. Suffice it to say that the algorithm is sophisticated enough to account for gate delays, but not realistic enough to account for more difficult phenomena like varying voltages or race conditions.

    Do you still want to know more?

    Gate delays
    Oscillation errors
    Shortcomings

    Next: Gate delays.

    logisim-2.7.1/doc/de/html/guide/prop/delays.html0000644000175000017500000000455011541757122021420 0ustar vincentvincent Gatterlaufzeiten

    Gatterlaufzeiten

    As an example of the level of sophistication of Logisim's algorithm, consider the following circuit.

    This "obviously" always outputs 0. But NOT gates don't react instantaneously to their inputs in reality, and neither do they in Logisim. As a result, when this circuit's input changes from 0 to 1, the AND gate will briefly see two 1 inputs, and it will emit a 1 briefly. You won't see it on the screen. But the effect is observable when we use the AND gate's output as an input into the clock of a D flip-flop.

    Poking the 0 input to become 1 leads to an instantaneous 1 going into the D flip-flop, and thus the flip-flop's value will toggle every time the circuit input goes from 0 to 1.

    Every component has a delay associated with it. More sophisticated components built into Logisim tend to have larger delays, but these delays are somewhat arbitrary and may not reflect reality.

    From a technical point of view, it is relatively easy to deal with this level of sophistication in a single circuit. Dealing with gate delays well across subcircuits, though, is a bit more complex; Logisim does attempt to address this correctly by placing all primitive component's propagation values into a single schedule regardless of the subcircuit in which the component lies.

    (Via the Project Options window's Simulation tab, you can configure Logisim to add a random, occasional delay to a component's propagation. This is intended to simulate the unevenness of real circuits. In particular, an R-S latch built using two NOR gates will oscillate without this randomness, as both gates will process their inputs in lockstep. This randomness is disabled by default.)

    Note that I'm stopping short of saying that Logisim always addresses gate delays well. But at least it tries.

    Next: Oscillation errors.

    logisim-2.7.1/doc/de/html/guide/prefs/0000755000175000017500000000000011541757122017404 5ustar vincentvincentlogisim-2.7.1/doc/de/html/guide/prefs/window.html0000644000175000017500000000353011541757122021602 0ustar vincentvincent Die Registerkarte "Fenster"

    Die Registerkarte "Fenster"

    This tab includes preferences affecting the appearance of the main window used for Logisim.

    • Show tick rate: If checked, then when ticks are enabled, Logisim displays a measurement of the rate at which it has been able to complete ticks. The tick rate is measured by averaging over the previous 1,000 ticks. (Disabling ticks or changing the maximum tick rate will clear its history.)

      This actual tick rate may be much less than the selected tick rate, because Logisim cannot simulate larger circuits at a very fast rate. For example, Logisim's maximum speed for a reasonably large circuit might be 16 Hz; you can select a faster tick rate, but the actual speed will not exceed 16 Hz.

    • Show project toolbar: When checked, a small toolbar is available above the explorer pane. This toolbar allows the user easy access to adding, renaming, reordering, and removing circuits from a project, and it supports switching between editing a circuit's layout and its appearance.

    • Toolbar location: This drop-down menu configures the location of the toolbar within the overall window. The toolbar may be placed on any of the window's four borders, described as north, south, east, and west. It may also be hidden, or it can be placed "down the middle" - that is, to the left of the canvas but to the right of the explorer pane and attribute table.

    Next: The Layout tab.

    logisim-2.7.1/doc/de/html/guide/prefs/tools.html0000644000175000017500000000277611541757122021446 0ustar vincentvincent Die Registerkarte "Werkzeug"

    Die Registerkarte "Werkzeug"

    This tab includes options affecting how the built-in tools behave.

    • After Adding Component: By default, after adding each individual component, Logisim switches back to the Edit Tool to allow you to move components around and to add wires. This option allows you to configure this behavior so that Logisim stays at the same tool for adding more of the same component, until you yourself opt to choose the Edit Tool. (This was Logisim's default behavior prior to Logisim 2.3.0. While more intuitive, this behavior required moving the mouse more to switch between tools.)

    • Show Ghosts While Adding: When checked, and when a tool for adding a new component is selected, a light-gray outline of a component to be added is drawn as the mouse moves across the canvas. For example, if you select the AND gate tool and move the mouse into the window (without pressing the mouse's button), a gray outline of an AND gate will display where the AND gate will appear when the mouse is clicked. Unselecting the check box will disable this behavior.

    Next: The International tab.

    logisim-2.7.1/doc/de/html/guide/prefs/template.html0000644000175000017500000000313011541757120022100 0ustar vincentvincent Die Registerkarte "Vorlage"

    Die Registerkarte "Vorlage"

    A template is a Logisim file that is used as a starting point whenever Logisim creates a new project. Also, if you have an existing Logisim file with a strangely configured environment, you can "reset" the environment using the Revert All To Template button in the window for editing Project Options.

    Although templates are useful in other situations also, they are particularly suited for classroom use, where an instructor might want to distribute a template for students to start from. This is particularly likely if the class uses Logisim heavily, including many of the more advanced features, in which case the simple default configuration may prove too simple. Templates can also be useful in the classroom setting when the instructor opens a file submitted by a student who has configured the environment significantly.

    By default, the "Plain template" option will be selected, using the default template shipped with Logisim. If you want a bare-bones configuration, you might choose "Empty template." But if you want to designate another file to use as the template, select a template via the Select... button, and then choose the "Custom template" option.

    Next: The International tab.

    logisim-2.7.1/doc/de/html/guide/prefs/layout.html0000644000175000017500000000700211541757120021604 0ustar vincentvincent Die Registerkarte "Layouteditor"

    Die Registerkarte "Layouteditor"

    This tab includes preferences affecting the behavior of the circuit layout editor.

    • Printer view: Specifies whether to display the circuit on the screen in the same way it is displayed through the printer. Normally this is off, and Logisim displays the on-screen circuit with indications of the current circuit state, and it displays some hints about component interface (most notably, it draws legs on OR gates to indicate where they would connect). The printer view, though, omits indications of state, and it omits such interface hints.

    • Show attribute halo: Specifies whether to draw the pale teal oval around the component or tool whose attributes are currently displayed in the attribute table.

    • Show component tips: Specifies whether to display the "tool tips" that will temporarily appear when the mouse hovers over components supporting them. For example, if you hover over a subcircuit component's pin, it will display the label of the corresponding pin within the subcircuit. Hovering over one of the ends of a splitter will tell you the bits to which that end corresponds. In addition, all components in the Plexers, Arithmetic, and Memory libraries will provide information about their inputs and outputs via tips.

    • Keep connections while moving: Indicates whether Logisim should add new wires when components are moved to preserve their connections. By default this is on — though it can be turned off temporarily by pressing the shift key while moving the components. If this box is unchecked, then the default will be not to add wires during a move — though you can turn it on temporarily by pressing the shift key during the move.

    • Show Ghosts while adding: When checked, and when a tool for adding a new component is selected, a light-gray outline of a component to be added is drawn as the mouse moves across the canvas. For example, if you select the AND gate tool and move the mouse into the window (without pressing the mouse's button), a gray outline of an AND gate will display where the AND gate will appear when the mouse is clicked.

    • After adding component: By default, after adding each individual component, Logisim switches back to the Edit Tool to allow you to move components around and to add wires. The drop-down box allows you to change this behavior so that Logisim stays at the same tool for adding more of the same component, until you yourself opt to choose the Edit Tool. (This was Logisim's default behavior prior to Logisim 2.3.0. While more intuitive, this behavior requires more mouse movement to switch between tools.)

    • First radix when wire poked: Configures how values are displayed when a wire is clicked using the Poke Tool. Clicking a wire displays temporarily the value, staying until the user clicks elsewhere in the circuit.

    • Second radix when wire poked: Configures the second part of how wire values are displayed.

    Next: The Experimental tab.

    logisim-2.7.1/doc/de/html/guide/prefs/intl.html0000644000175000017500000000713211541757120021241 0ustar vincentvincent Die Registerkarte "Internationalisierung"

    Die Registerkarte "Internationalisierung"

    This tab allows configuration of Logisim according to regional preferences.

    • Gate shape: Logisim supports three standards for drawing gates: shaped gates, rectangular gates, and DIN 40700 gates. The following table illustrates the distinction.

      Shaped Rectangular DIN 40700
      AND
      OR

      Because the shaped style tends to be more popular in the U.S., while the rectangular style tends to be more popular in Europe, some people refer to these styles according to these regions; but the region-neutral terms shaped and rectangular are preferred. The DIN 40700 standard was a standard for drafting digital and analog electronic components adopted by DIN, a German standards organization. DIN adopted the rectangular standard for digital components in 1976, but some engineers continue to use the older style; they appear to be increasingly rare.

      Logisim does not follow any standard exactly; it steers a middle ground to allow switching between them. In particular, the shaped gates are more square than the dimensions defined by the relevant IEEE standard. And, although XOR and XNOR gates really ought to be the same width as OR and NOR gates with the rectangular style, they are not because of difficulties compressing the shaped-XOR gate.

    • Language: Change between languages. The current version is supplied with English, Spanish, Russian, and German translations.

      • The German translation was introduced with Logisim 2.6.1 and remains current. It is by Uwe Zimmermann, a faculty member at Uppsala University in Sweden.
      • The Russian translation was introduced with Logisim 2.4.0 and remains current. It is by Ilia Lilov, from Russia.
      • The Spanish translation was complete as of Logisim 2.1.0, but subsequent Logisim versions have added new options that remain untranslated. It was contributed by Pablo Leal Ramos, from Spain.

      Translations of Logisim into other languages are welcome! If you are interested, contact me, Carl Burch. This will not be a commitment: I will be happy to hear of your interest, and I will tell you whether I know of somebody who is working on it already, prepare a version for you to work with, and send you instructions. The translation process does not require an understanding of Java.

    • Replace accented characters: Some platforms have poor support for characters (such as ñ or ö) that do not appear in the 7-bit ASCII character set. When this is checked, Logisim will replace all instances of the characters with the appropriate equivalent 7-bit ASCII characters. The checkbox is disabled when the current language does not have any equivalents available (as with English).

    Next: The Window tab.

    logisim-2.7.1/doc/de/html/guide/prefs/index.html0000644000175000017500000000244711541757120021406 0ustar vincentvincent Application Preferences

    Application Preferences

    Logisim supports two categories of configuration options: application preferences and project options. The application preferences address preferences that span all open projects, whereas project options are specific to that one project. This section discusses application preferences; project options are described in another section.

    You can view and edit application preferences via the Preferences... option from the File menu (or, under Mac OS, the Logisim menu), a window will appear with several tabs. We will discuss these tabs separately, and then we will see how preferences can be configured from the command line.

    The Template tab
    The International tab
    The Window tab
    The Layout tab
    The Experimental tab
    The command line

    Next: The Template tab.

    logisim-2.7.1/doc/de/html/guide/prefs/exp.html0000644000175000017500000000175111541757120021070 0ustar vincentvincent Die Registerkarte "Experimentell"

    Die Registerkarte "Experimentell"

    These preferences enable features that are considered experimental, inserted to garner user feedback.

    • Graphics acceleration: One Logisim user observed that adding -Dsun.java2d.d3d=True to the command line seemed to improve Logisim's graphics performance by telling it to use hardware graphics acceleration. This drop-down box attempts to configure Logisim to set this up; reports about whether this drop-down box has any effect on performance would be welcome. It won't have any effect until Logisim is restarted.

    Next: Command line options.

    logisim-2.7.1/doc/de/html/guide/prefs/cmdline.html0000644000175000017500000000537211541757120021712 0ustar vincentvincent Command-line options

    Command-line options

    You can configure many of Logisim's application preferences via command line options. This can be particularly useful in a laboratory of single-student computers where you want Logisim to start up the same for students every time, regardless of how previous students may have configured the program.

    The overall command-line syntax is as follows.

    java -jar jarFileName [options] [filenames]
    

    The optional additional files named on the command line will be opened as separate windows within Logisim.

    The following example starts Logisim in its basic configuration.

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

    Supported options include the following.

    -plain
    -empty
    -template templateFile

    Configures the template for Logisim to use.

    -gates [shaped|rectangular]

    Configures which type of gate to use.

    -locale localeIdentifier

    Configures which translation to use. As of this writing, the supported locales include:

    deGerman
    enEnglish
    esSpanish
    ruRussian
    -accents [yes|no]

    This is only relevant for languages that use characters outside the 7-bit ASCII character set; this would include languages using accented characters, and it would not include English. If no, characters outside the 7-bit ASCII character set are replaced with equivalents appropriate to the language; this would be useful for Java/OS combinations where such characters are not supported well.

    -clearprops

    Clear all application preferences at startup, so Logisim will act as if it were being executed on the host system for the first time.

    -nosplash

    Hides the initial Logisim splash screen.

    -help

    Displays a summary of the command line options.

    -version

    Displays the Logisim version number.

    Weiter: Leitfaden für Benutzer von Logisim.

    logisim-2.7.1/doc/de/html/guide/opts/0000755000175000017500000000000011541757120017250 5ustar vincentvincentlogisim-2.7.1/doc/de/html/guide/opts/toolbar.html0000644000175000017500000000275311541757120021607 0ustar vincentvincent Die Registerkarte "Werkzeugleiste"

    Die Registerkarte "Werkzeugleiste"

    The Toolbar tab allows you to configure what tools appear in the toolbar.

    The left side is an explorer listing all the tools available, and the list on the right side displays the current contents of the toolbar. (Three dashes "---" indicate a separator, which is drawn as a gray line.) Between the explorer and the list are five buttons and a combo box:

    • Add Tool adds the currently selected tool in the explorer at left to the end of the toolbar.

    • Add Separator adds a separator to the end of the toolbar.

    • Move Up moves the currently selected item of the toolbar up/left one spot.

    • Move Down moves the currently selected item of the toolbar down/right one spot.

    • Remove removes the currently selected item from the toolbar.

    The attributes associated with the tools are not displayed in this window; instead, you can view and edit them within the main drawing window.

    Next: The Mouse tab.

    logisim-2.7.1/doc/de/html/guide/opts/simulate.html0000644000175000017500000000562511541757120021771 0ustar vincentvincent Die Registerkarte "Simulation"

    Die Registerkarte "Simulation"

    The Simulation tab allows configuration of the algorithm used for simulating circuits. These parameters apply to all circuits being simulated in the same window, even for circuits that exist in other libraries loaded within the project.

    • The Iterations Until Oscillation drop-down menu specifies how long to simulate a circuit before deciding that it is oscillating. The number represents the number of clicks of the internal hidden clock (a simple gate takes just one click). The default of 1,000 is good enough for almost all purposes, even for large circuits. But you may want to increase the number of iterations if you are working with a circuit where Logisim reports false oscillations. This is unlikely to be a problem in practice, but one such a circumstance is a circuit that incorporates many of the below latch circuits with random noise enabled. You may want to decrease the number of iterations if you are working with a circuit that is prone to oscillating and you are using an unusually slow processor.

    • The Gate Output When Undefined drop-down menu configures how the built-in logic gates behave when some inputs are unconnected or are floating. By default, Logisim ignores such inputs, allowing a gate to work over fewer inputs than it was designed for. However, in real life, a gate will behave unpredictably in such a situation, and so this drop-down menu allows one to change the gates so that they treat such disconnected inputs as errors.

    • The Add Noise To Component Delays checkbox allows you to enable or disable the random noise that is added to the delays of components. The internal simulation uses a hidden clock for its simulation, and to provide a somewhat realistic simulation, each component (excluding wires and splitters) has a delay between when it receives an input and when it emits an output. If this option is enabled, Logisim will occassionally (about once every 16 component reactions) make a component take one click longer than normal. This randomness is added specifically for handling latch circuit (as below): Without the random noise, the circuit oscillates, since the two gates will work in lockstep; but with random noise added, one gate will eventually outrun the other.

      I recommend keeping this option off, as this technique does introduce rare errors with normal circuits.

    Next: The Toolbar tab.

    logisim-2.7.1/doc/de/html/guide/opts/mouse.html0000644000175000017500000000443011541757120021267 0ustar vincentvincent Die Registerkarte "Maus"

    Die Registerkarte "Maus"

    By default, when you click the mouse in Logisim's drawing area, the currently selected tool will be used. If you right-click or control-click, it will display a pop-up menu for the current component below the mouse.

    Logisim allows you to modify this behavior, relieving you of the need to go to the toolbar and/or the explorer all the time. (This may also be handy if you are left-handed.) Each combination of a mouse button and a modifier key (any subset of shift, control, and alt) can be mapped to a different tool. The Mouse tab allows you to configure these mappings.

    • On the left side is an explorer where you can choose the tool you want to map.

    • On the right top side is a rectangle in which you can click using the mouse combination you want to click. For example, if you want to create new wires by shift-dragging, then you would first select the Wiring Tool in the Explorer (under the Base library); and then you would shift-click where it says "Click Using Combination To Map Wiring Tool." If that combination is already being used, then the mapping would be replaced with the new tool.

    • Below this area is a list of current mappings. Note that any combinations that aren't listed simply use the currently selected tool.

    • Below is the Remove button, where you can delete the mapping that is currently selected in the table above the button. In the future, then, that mouse combination would map to whatever tool is currently selected in the toolbar or the explorer pane.

    • Below this is a list of attributes for the tool currently selected in the list of mappings. Each mouse-mapped tool has its own set of attributes, different from the attributes used in the explorer pane and in the toolbar. You can edit those attribute values here.

    Weiter: Leitfaden für Benutzer von Logisim.

    logisim-2.7.1/doc/de/html/guide/opts/index.html0000644000175000017500000000261111541757120021245 0ustar vincentvincent Project Options

    Project Options

    Logisim supports two categories of configuration options: application preferences and project options. The application preferences address preferences that span all open projects, whereas project options are specific to that one project. This section discusses project options; application preferences are described in another section.

    You can view and edit project options via the Options... option from the Project menu. It brings up the Options window, which has four tabs.

    Hier werden wir diese Registerkarten im Einzelnen beschreiben.

    The Simulation tab
    The Toolbar tab
    The Mouse tab

    At the bottom of the window is the Revert All To Template button. When clicked, all the options and tool attributes change to the settings in the current template (as selected under the application preferences).

    Next: The Simulation tab.

    logisim-2.7.1/doc/de/html/guide/opts/canvas.html0000644000175000017500000000633011541757120021413 0ustar vincentvincent Die Registerkarte "Arbeitsfläche"

    Die Registerkarte "Arbeitsfläche"

    The Canvas tab allows configuration of the circuit drawing area's appearance.

    There are eight options.

    • The Printer View check box specifies whether to display the circuit on the screen in the same way it is displayed through the printer. Normally this is off, and Logisim displays the on-screen circuit with indications of the current circuit state, and it displays some hints about component interface (most particularly, it draws legs on OR gates to indicate where they would connect). The printer view, though, omits indications of state, and it omits such interface hints.

    • The Show Grid check box specifies whether to draw dots in the background indicating the grid size.

    • The Show Attribute Halo check box specifies whether to draw the pale teal oval around the component or tool whose attributes are currently displayed in the attribute table.

    • The Show Component Tips check box specifies whether to display the "tool tips" that will temporarily appear when the mouse hovers components supporting them. For example, if you hover over a subcircuit component's pin, it will display the label of the corresponding pin within the subcircuit - or it will display the subcircuit's name it has no label. Hovering over one of the ends of a splitter will tell you the bits to which that end corresponds. In addition, all components in the Plexers, Arithmetic, and Memory libraries will provide information about their inputs and outputs via tips.

    • The Keep Connections When Moving check box indicates whether Logisim should add new wires when components are moved to preserve their connections. By default this is on — though it can be turned off temporarily by pressing the shift key while moving the components. If this option is unchecked, then the default will be not to add wires during a move — though you can turn it on temporarily by pressing the shift key during the move.

    • The Zoom Factor drop-down menu allows you to "blow up" or "condense" the image by a ratio. Zooming into a circuit is useful for live classroom demonstrations where the screen resolution is too small to view the circuit from the back of the classroom; zooming out can be useful for a orienting yourself to very large circuit.

    • The First Radix When Wire Poked drop-down menu configures how values are displayed when a wire is clicked using the Poke Tool. Clicking temporarily displays the value until the user clicks elsewhere in the circuit.

    • The Second Radix When Wire Poked drop-down menu configures the second part of the value display.

    Next: The Simulation tab.

    logisim-2.7.1/doc/de/html/guide/menu/0000755000175000017500000000000011541757120017227 5ustar vincentvincentlogisim-2.7.1/doc/de/html/guide/menu/winhelp.html0000644000175000017500000000322111541757120021561 0ustar vincentvincent Die Fenster- und Hilfe-Menüs

    The Window menu

    Minimize

    Minimizes (iconifies) the current window.

    Maximize (Zoom on MacOS)

    Resizes the current window to its preferred size.

    Combinational Analysis

    Shows the current Combinational Analysis window, without changing any of its contents.

    individual window titles

    Brings the respective window to the front.

    The Help menu

    Tutorial

    Opens the help system to the "Beginner's Tutorial" section of the Guide to Being a Logisim User.

    User's Guide

    Opens the help system to the Guide to Being a Logisim User.

    Bibliotheksreferenz

    Opens the help system to the Library Reference.

    About...

    Displays a window containing the version number, mixed among the splash screen graphics. (On MacOS, this menu item is under the Logisim menu.)

    Weiter: Leitfaden für Benutzer von Logisim.

    logisim-2.7.1/doc/de/html/guide/menu/simulate.html0000644000175000017500000000620011541757120021736 0ustar vincentvincent Das Simulationsmenü

    Das Simulationsmenü

    Simulation Enabled

    If checked, circuits viewed will be "live:" That is, the values propagating through the circuit will be updated with each poke or change to the circuit.

    The menu option will be automatically unchecked if circuit oscillation is detected.

    Reset Simulation

    Clears everything about the current circuit's state, so that it is as if you have just opened the file again. If you are viewing a subcircuit's state, the entire hierarchy is cleared.

    Step Simulation

    Advances the simulation one step forward. For example, a signal may end up entering a gate during one step, but the gate won't show a different signal until the next simulation step. To help identify which points in the overall circuit have changed, any points whose values change are indicated with a blue circle; if a subcircuit contains any points that have changed in it (or its subcircuits, recursively), then it will be drawn with a blue outline.

    Go Out To State

    When you delve into a subcircuit's state via its pop-up menu, the Go Out To State submenu lists the circuits above the currently viewed circuit's state. Selecting one displays the corresponding circuit.

    Go In To State

    If you have delved into a subcircuit's state and then moved back out, this submenu lists the subcircuits below the current circuit. Selecting one of the circuits displays the corresponding circuit.

    Tick Once

    Steps one tick forward into the simulation. This can be useful when you want to step the clocks manually, particularly when the clock is not in the same circuit that you are currently viewing.

    Ticks Enabled

    Starts automatically ticking the clock. This will have an effect only if the circuit contains any clock devices (in the Base library). The option is disabled by default.

    Tick Frequency

    Allows you to select how often ticks occur. For example, 8 Hz means that ticks will occur eight times a second. A tick is the base unit of measurement for the speed of clocks.

    Note that the clock cycle speed will be slower than the tick speed: The fastest possible clock will have a one-tick up cycle and a one-tick down cycle; such a clock would have up/down cycle rate of 4 Hz if the ticks occur at 8 Hz.

    Logging...

    Enters the logging module, which facilitates automatically noting and saving values in a circuit as a simulation progresses.

    Next: The Window and Help menus.

    logisim-2.7.1/doc/de/html/guide/menu/project.html0000644000175000017500000001217311541757120021567 0ustar vincentvincent Das Projektmenü

    Das Projektmenü

    Add Circuit...

    Adds a new circuit into the current project. Logisim will insist that you name the new circuit. The name must not match any existing circuits in the project.

    Load Library

    Loads a library into the project. You can load three types of libraries, as explained elsewhere in the User's Guide.

    Unload Libraries...

    Unloads current libraries from the project. Logisim will not permit you to unload any libraries currently being used, including libraries containing components appearing in any project circuits, as well as those with tools that appear in the toolbar or that are mapped to the mouse.

    Move Circuit Up

    Moves the currently displayed circuit one step up the list of circuits within the project, as displayed in the explorer pane.

    Move Circuit Down

    Moves the currently displayed circuit one step down the list of circuits within the project, as displayed in the explorer pane.

    Set As Main Circuit

    Sets the currently displayed circuit to be the project's main circuit. (This menu item will be grayed out if the current circuit is already the project's main circuit.) The only significance of the main circuit is that it is the circuit that first appears when a project file is opened.

    Edit Circuit Layout

    Switches to allow you to edit how the layout of components that determines how the circuit works. This is what the program does when it starts, and you will edit circuit layouts most often using Logisim, so this menu item is normally disabled.

    Edit Circuit Appearance

    Switches to allow you to edit how the circuit will be represented when it is used as a subcircuit within another circuit. By default, the circuit is represented as a rectangle with a gray notch on its north end, but this menu option allows you to draw a different appearance for the subcircuit.

    Revert To Default Appearance

    If you've edited the circuit's appearance, this menu item reverts the appearance back to the default rectangle-with-notch appearance. The menu item is enabled only when editing the circuit's appearance.

    Remove Circuit

    Removes the currently displayed circuit from the project. Logisim will prevent you from removing circuits that are used as subcircuits, and it will prevent you from removing the final circuit in a project.

    Analyze Circuit

    Computes a truth table and Boolean expressions corresponding to the current circuit, displaying them in the Combinational Analysis window. The analysis process will only be valid for combinational circuits. A full description of the analysis process is described in the Combinational Analysis section.

    Get Circuit Statistics

    Shows a dialog containing statistics about components used by the currently viewed circuit. The dialog includes a table with five columns:

    • Component: The name of the component.
    • Library: The name of the library from which the component came.
    • Simple: The number of times that component appears directly within the viewed circuit.
    • Unique: The number of times that component appears in the circuit's hierarchy, where each subcircuit within the hierarchy is counted only once.
    • Recursive: The number of times that component appears in the circuit's hierarchy, where we count each subcircuit as many times as it appears in the hierarchy.

    The distinction between Unique and Recursive is easiest to explain by considering the 4:1 multiplexer built using three 2:1 multiplexers as in the Using subcircuits section. The 2:1 multiplexer contains two AND gates (and the 4:1 circuit includes none), so the Unique count of AND gates would be 2; but if you were to build the 4:1 multiplexer using this diagram, you would actually need 2 AND gates for each of the three 2:1 multiplexers, so the Recursive count is 6.

    If you are using circuits from a loaded Logisim library, those components are considered to be black boxes: The contents of the library's circuits are not included in the unique and recursive counts.

    Options...

    Opens the Project Options window.

    Next: The Simulate menu.

    logisim-2.7.1/doc/de/html/guide/menu/index.html0000644000175000017500000000174211541757120021230 0ustar vincentvincent Menu Reference

    Menu Reference

    This section explains the six menus that accompany every major Logisim window.

    The File menu
    The Edit menu
    The Project menu
    The Simulate menu
    The Window and Help menus
    Many menu items relate specifically to a currently opened project. But some Logisim windows (particularly the Combinational Analysis window and the Application Preferences window) are not associated with projects. For these windows, the project-specific menu items will be disabled.

    Next: The File menu.

    logisim-2.7.1/doc/de/html/guide/menu/file.html0000644000175000017500000001131211541757120021032 0ustar vincentvincent Das Dateimenü

    Das Dateimenü

    Neu

    Öffnet ein neues Projekt in einem neuen Fenster. Das neue Projekt ist zunächst eine Kopie der gerade ausgewählten Vorlage.

    Öffnen...

    Öffnet eine existierende Datei als Projekt in einem neuen Fenster.

    Zuletzt geöffnet

    Öffnet ein kürzlich bearbeitetes Projekt in einem neuen Fenster, ohne, daß der Benutzer durch einen Dateidialog navigieren muß.

    Schließen

    Schließt alle Fenster des aktuell angezeigten Projekts.

    Speichern

    Speichert das aktuell angezeigte Projekt, und überschreibt dabei eine eventuell vorhandene Datei.

    Speichern unter...

    Speichert das aktuell angezeigte Projekt, und fragt den Benutzer nach einem neuen Dateinamen.

    Bild exportieren...

    Erzeugt eine Bilddatei, die die Schaltung darstellt. Der zugehörige Konfigurationsdialog ist weiter unten beschrieben.

    Drucken...

    Sendet die Schaltung an einen Drucker. Der zugehörige Konfigurationsdialog ist weiter unten beschrieben.

    Voreinstellungen...

    Öffnet den Dialog der programmbezogenen Einstellungen. (Auf Mac OS-Systemen wird dies im Logisim-Menü angezeigt.)

    Beenden

    Schließt alle derzeit geöffneten Projekte und beendet Logisim. (Auf Mac OS-Systemen wird dies als Beenden im Logisim-Menü angezeigt.)

    Export konfigurieren

    Wenn Sie den Punkt "Bild exportieren..." aufrufen, öffnet Logisim ein Dialogfenster mit vier Optionen.

    • Schaltungen: Eine Liste, aus der Sie eine oder mehrere Schaltungen auswählen können, deren Bild exportiert werden soll. (Leere Schaltungen erscheinen nicht in dieser Liste.)
    • Bildformat: Hier können Sie zwischen PNG-, GIF- und JPEG-Dateien wählen. Das empfohlene Format sind PNG-Dateien: Das GIF-Dateiformat ist schon ziemlich betagt, und das JPEG-Format führt zu Komprimierungs-Artefakten, weil JPEG-Dateien eigentlich für fotografische Abbildungen entwickelt wurden.
    • Skalierung: Sie können das Bild mit diesem Schieberegler skalieren, bevor es gespeichert wird.
    • Druckeransicht: Wählt aus, ob die "Druckeransicht" beim Export verwendet werden soll.

    Nach dem Anklicken der Schaltfläche OK wird Logisim einen Dateidialog anzeigen. Wenn Sie eine einzelne Schaltung ausgewählt haben, dann wählen Sie hier aus, in welcher Datei Das Bild gespeichert werden soll. Wenn Sie mehrere Schaltungen ausgewählt haben, dann wählen Sie nur das Verzeichnis aus, in das die Bilddateien gespeichert werden sollen. Logisim wird die einzelnen Bilddateien nach den Namen der Schaltungen benennen (zum Beispiel main.png).

    Drucken konfigurieren

    Wenn Sie den Punkt "Drucken..." aufrufen, öffnet Logisim ein Dialogfenster zur Konfiguration des Ausdrucks.

    • Schaltungen: Eine Liste, aus der Sie eine oder mehrere Schaltungen auswählen können, deren Bild gedruckt werden soll. (Leere Schaltungen erscheinen nicht in dieser Liste.) Logisim druckt eine Schaltung pro Druckseite. Wenn die Schaltung zu groß für die Seite ist, wird das Bild passend verkleinert werden.
    • Titel: Der Text, der zentriert oben auf jeder einzelnen Seite erscheinen soll. Die folgenden Substitutionen werden im Text vorgenommen.
      %nName der Schaltung auf der Seite
      %pSeitennummer
      %PGesamtseitenzahl
      %%Ein einzelnes Prozentzeichen ('%')
    • Drehen zum Anpassen: Wenn angekreuzt wird Logisim das Druckbild um 90 Grad drehen, wenn dies eine bessere Ausnutzung der Druckseite erlaubt.
    • Druckeransicht: Wählt aus, ob die "Druckeransicht" beim Drucken verwendet werden soll.

    Nach dem Anklicken der Schaltfläche OK wird Logisim den Standard-Dialog zum Einrichten der Seite vor dem Druck der Schaltungen anzeigen.

    Weiter: Das Bearbeitungsmenü.

    logisim-2.7.1/doc/de/html/guide/menu/edit.html0000644000175000017500000001343411541757120021047 0ustar vincentvincent Das Bearbeitungsmenü

    Das Bearbeitungsmenü

    XX zurücknehmen

    Nimmt die zuletzt vorgenommenen Änderungen zurück, die sich darauf beziehen, wie die Schaltung gespeichert werden würde. Beachten Sie, daß dies keine Änderungen am Zustand der Schaltung einschließt (wie mit dem Schaltwerkzeug durchgeführte Änderungen).

    Ausschneiden

    Entfernt die aktuell ausgewählten Elemente der Schaltung und platziert diese in der Zwischenablage von Logisim.

    Hinweis: Diese Zwischenablage von Logisim wird unabhängig von der Zwischenablage von Windows verwaltet, was bedeutet, daß das Ausschneiden/Kopieren/Einfügen nicht zwischen Logisim und anderen Programmen funktioniert, noch nicht einmal zwischen verschiedenen Instanzen von Logisim. Wenn aber verschiedene Projekte in ein und demselben Logisim-Prozess geöffnet sind, dann sollte das Ausschneiden/Kopieren/Einfügen zwischen diesen Projekten möglich sein.

    Kopieren

    Kopiert die aktuell ausgewählten Elemente der Schaltung in die Zwischenablage von Logisim. (Beachten Sie die Hinweise unter dem Punkt Ausschneiden.)

    Einfügen

    Übernimmt den Inhalt der Zwischenablage von Logisim als aktuelle Auswahl in die Schaltung. (Beachten Sie die Hinweise unter dem Punkt Ausschneiden.)

    Die eingefügten Elemente werden nicht unmittelbar eingefügt, vielmehr erscheinen Sie als hellgraue Auswahl. Die Elemente werden erst dann in die Schaltung ``eingefügt'', wenn Sie die Auswahl verschieben oder ändern, so daß die Elemente sich nicht mehr innerhalb der Auswahl befinden.

    Der Grund für dieses Verhalten liegt in einer anderen Eigenschaft von Logisim: Logisim muß alle Verbindungsleitungen unmittelbar zusammenführen, sobald diese in eine Schaltung eingefügt werden, und dies ändert die bereits in der Schaltung befindlichen Leitungen. Aber wenn Sie Leitungen aus der Zwischenablage einfügen, möchten Sie diese eventuell an einer anderen Stelle einfügen, und das unmittelbare Zusammenführen könnte Ihren Vorstellungen widersprechen.

    Löschen

    Entfernt alle Elemente der aktuellen Auswahl, ohne diese in die Zwischenablage zu übernehmen.

    Duplizieren

    Erstellt eine Kopie aller Elemente in der aktuellen Auswahl. Der Effekt ist derselbe, wie das Ausführen von Kopieren und Einfügen, abgesehen davon, daß hier die Zwischenablage nicht verändert wird.

    Alles auswählen

    Wählt alle Elemente der aktuellen Schaltung aus.

    Auswahl anheben

    Diese Funktion ist nur bei der Bearbeitung des Aussehens einer Schaltung verfügbar, und erlaubt das Anheben der ausgewählten Objekte, so daß diese über anderen, überlappenden Objekten gezeichnet werden. Wenn das ausgewählte Objekt durch mehrere andere Objekte verdeckt ist, so wird es mit jedem Aufruf dieser Funktion nur um eine Ebene angehoben. Verwenden Sie die Funktion mehrmals, bis das Objekt so dargestellt wird, wie Sie es wünschen.

    (Festzustellen, ob zwei beliebige Objekte überlappen, ist schwierig. Logisim benutzt einen Algorithmus zur zufälligen Auswahl mehrerer Punkte in jedem der beiden Objekte, um dann zu überprüfen, ob der Punkt sich auch in dem anderen Objekt befindet. Wenn die Überlappung nur klein ist, weniger als 5% von beiden Objekten, kann diese Methode versagen.)

    Auswahl absenken

    Diese Funktion ist nur bei der Bearbeitung des Aussehens einer Schaltung verfügbar, und erlaubt das Absenken der ausgewählten Objekte, so daß diese unter anderen, überlappenden Objekten gezeichnet werden. Wenn das ausgewählte Objekt durch mehrere andere Objekte überschneidet, so wird es mit jedem Aufruf dieser Funktion nur um eine Ebene abgesenkt. Verwenden Sie die Funktion mehrmals, bis das Objekt so dargestellt wird, wie Sie es wünschen.

    Nach oben

    Diese Funktion ist nur bei der Bearbeitung des Aussehens einer Schaltung verfügbar, und erlaubt das Anheben der ausgewählten Objekte, so daß diese über allen anderen, überlappenden Objekten gezeichnet werden. (Ankerpunkte und Pins sind Ausnahmen — diese sind immer ganz oben.)

    Nach unten

    Diese Funktion ist nur bei der Bearbeitung des Aussehens einer Schaltung verfügbar, und erlaubt das Absenken der ausgewählten Objekte, so daß diese unter allen anderen, überlappenden Objekten gezeichnet werden.

    Knoten hinzufügen

    Diese Funktion ist nur bei der Bearbeitung des Aussehens einer Schaltung verfügbar, und wenn ein Punkt auf einer Linie, einem Linienzug oder Vieleck ausgewählt ist. Dann fügt diese Funktion einen neuen Knotenpunkt zu dieser Struktur hinzu. Vor dem Hinzufügen wird der Punkt als Rhombus gezeichnet.

    Knoten entfernen

    Diese Funktion ist nur bei der Bearbeitung des Aussehens einer Schaltung verfügbar, und wenn ein Punkt auf einer Linie, einem Linienzug oder Vieleck ausgewählt ist. Dann löscht diese Funktion den aktuell markierten Knotenpunkt. Vor dem Entfernen wird der ausgewählte Knotenpunkt als Rhombus in einem Quadrat angezeigt. Logisim läßt es nicht zu, einen Knotenpunkt aus einem Vieleck mit nur drei Punkten oder einem Linienzug mit nur zwei Punkten zu entfernen.

    Weiter: Das Projektmenü.

    logisim-2.7.1/doc/de/html/guide/mem/0000755000175000017500000000000011541757120017041 5ustar vincentvincentlogisim-2.7.1/doc/de/html/guide/mem/poke.html0000644000175000017500000000351311541757120020667 0ustar vincentvincent Speicherinhalte bearbeiten

    Speicherinhalte bearbeiten

    Sie können Speicherinhalte mit dem Schaltwerkzeug bearbeiten, dies ist aber durch den vorhandenen Platz eingeschränkt: abgesehen von den einfachsten Änderungen, werden Sie wohl auf den eingebauten Hex-Editor zurückgreifen.

    Nichtsdestoweniger bietet das Schaltwerkzeug zwei Möglichkeiten zum Zugriff auf den Speicher: Sie können die angezeigte Adresse auswählen, und Sie können einzelne Werte ändern.

    Um die dargestellte Adresse zu ändern, klicken Sie außerhalb des Anzeigerechtecks. Logisim wird dann ein rotes Rechteck um die oberste Adresse zeichnen.

    • Durch Eintippen hexadezimaler Ziffern können Sie diese Adresse entsprechend ändern.

    • Drücken der Eingabetaste wird eine Zeile weiter rollen.

    • Drücken der Rückschritttaste wird eine Zeile nach oben rollen.

    • Die Leertaste blättert eine Seite weiter (vier Zeilen).

    Um einen bestimmten Wert zu ändern, klicken Sie auf diesen Wert innerhalb des Anzeigerechtecks. Logisim wird dann einen roten Rahmen um diesen Wert zeichnen.

    • Der dargestellte Wert läßt sich dann durch Eintippen hexadezimaler Ziffern abändern.

    • Das Betätigen der Eingabetaste wird Sie zum nächsten Wert unter der aktuellen Position bringen (eine Zeile weiter).

    • Die Rückschritttaste wählt den vorangehende Wert zur Bearbeitung aus.

    • Die Leertaste geht zur folgenden Speicheradresse.

    Weiter: Kontextmenüs und Dateien.

    logisim-2.7.1/doc/de/html/guide/mem/menu.html0000644000175000017500000000456511541757120020705 0ustar vincentvincent Kontextmenüs und Dateien

    Kontextmenüs und Dateien

    Abgesehen von den üblichen Punkten enthält das Kontextmenü für Speicherbauelemente vier weitere Optionen:

    • Inhalt bearbeiten...: Öffnet den Hex-Editor um den Speicherinhalt zu bearbeiten.
    • Inhalt löschen: Setzt alle Werte im Speicher auf 0.
    • Speicherabbild laden...: Setzt alle Werte des Speichers auf die Werte aus einer Datei. Das Dateiformat ist weiter unten beschrieben.
    • Speicherabbild speichern...: Speichert alle Daten aus dem Speicher in dem unten beschriebenen Dateiformat.

    Das Dateiformat für Speicherabbilder wurde bewußt einfach gehalten. Dies erlaubt es Ihnen, eigene Programme, wie z.B. einen Assembler, zu schreiben, das Speicherabbilder erzeugt. Als ein Beispiel für das Dateiformat können wir den Fall eines Speichers mit 256 Byte betrachten, dessen fünf erste Speicherstellen auf 2, 3, 0, 20 und -1 gesetzt sind, während alle folgenden Speicherstellen Nullen enthalten. Ein entsprechendes Speicherabbild sieht dann wie folgt aus:

    v2.0 raw
    02
    03
    00
    14
    ff
    

    Die erste Zeile identifiziert das benutzte Dateiformat (zur Zeit gibt es nur ein unterstütztes Dateiformat). Die folgenden Einträge bilden eine Liste der hexadezimalen Werte, die beginnend mit der Adresse 0 in den Speicher geschrieben werden. Mehrere Werte dürfen in einer Zeile stehen. Wenn der Speicher mehr Speicherstellen hat, als Werte in der Datei vorhanden sind, füllt Logisim die verbleibenden Positionen mit Nullen.

    Das Dateiformat unterstützt eine Lauflängenkodierung: anstatt sechzehn Mal nacheinander den Wert 00 zu schreiben, können Sie dies mit 16*00 abkürzen. Beachten Sie, daß die Anzahl der Wiederholungen im Dezimalformat (mit der Basis 10) dargestellt wird. Beim Speichern von Dateien verwendet Logisim diese Lauflängenkodierung ab einer viermaligen Wiederholung desselben Wertes.

    Mit dem '#'-Zeichen können Sie Kommentare in die Dateien einbetten: Alle Zeichen, die in einer Zeile auf eine solche Raute folgen, werden von Logisim ignoriert.

    Weiter: Hex-Editor.

    logisim-2.7.1/doc/de/html/guide/mem/index.html0000644000175000017500000000212411541757120021035 0ustar vincentvincent Speicherbauelemente

    Speicherbauelemente

    Die RAM- und ROM-Bauelemente sind zwei sehr nützliche Bestandteile der eingebauten Bibliotheken von Logisim. Aufgrund der Menge an Daten, die in diesen gespeichert werden kann, sind es aber auch zwei der komplexesten Bauelemente.

    Eine Beschreibung, wie diese Bauelemente in einer Schaltung verwendet werden können, finden Sie auf den Seiten RAM und ROM der Bibliotheksreferenz. Dieser Abschnitt des Leitfadens erläutert die Verwendung der Schnittstelle zur Anzeige und Bearbeitung von Speicherinhalten.

    Speicherinhalte bearbeiten
    Kontextmenüs und Dateien
    Der Hex-Editor von Logisim

    Weiter: Speicherinhalte bearbeiten.

    logisim-2.7.1/doc/de/html/guide/mem/hex.html0000644000175000017500000000330211541757120020511 0ustar vincentvincent Hex-Editor

    Hex-Editor

    Logisim enthält einen eingebauten Hex-Editor zur Anzeige und Bearbeitung von Speicherinhalten. Dieser wird über den Punkt "Inhalt bearbeiten..." aus dem Kontextmenü der Speicher-Bauelemente aktiviert. Für ROM-Bauelemente, deren Speicherinhalt ein Teil der Attributwerte sind, kann der Hex-Editor auch über einen Klick auf diesen Attributwert gestartet werden.

    Die kursiven hexadezimalen Zahlen auf der linken Seite geben die Speicheradresse an. Die restlichen Zahlen geben die Inhalte der jeweils auf diese Adresse folgenden Speicherzellen an. Je nach Breite des Fensters werden vier, acht oder sechzehn Werte pro Zeile angezeigt. Um das Abzählen zu erleichtern, ist nach jeweils vier Werten eine größere Lücke.

    Mit Hilfe des Rollbalkens und mit der Tastatur (Pfeiltasten, Pos1, Ende, Bild hoch und Bild runter) können Sie durch den Speicher navigieren. Durch Eintippen von hexadezimalen Werten läßt sich der aktuelle Wert ändern.

    Sie können auch einen Bereich von Werten durch Ziehen mit der Maus oder durch Gedrückhalten der Umschalttaste beim Klicken mit der Maus bzw. beim Navigieren mit der Tastatur auswählen. Über das Menü "Bearbeiten" lassen sich Werte kopieren und einfügen. Die dabei benutzte Zwischenablage läßt sich auch mit anderen Programmen austauschen.

    Weiter: Leitfaden für Benutzer von Logisim.

    logisim-2.7.1/doc/de/html/guide/log/0000755000175000017500000000000011541757120017044 5ustar vincentvincentlogisim-2.7.1/doc/de/html/guide/log/table.html0000644000175000017500000000207211541757120021022 0ustar vincentvincent Die Registerkarte "Tabelle"

    Die Registerkarte "Tabelle"

    Die Registerkarte "Tabelle" zeigt graphisch das aktuelle Protokoll.

    Die Tabelle enthält eine Spalte für jede Komponente in der Auswahl. Jede Zeile in der Tabelle zeigt eine Momentaufnahme der Simulation nachdem die Weiterleitung aller Signale abgeschlossen ist. Doppelte Zeilen werden nicht ins Protokoll aufgenommen. Beachten Sie auch, daß nur die 400 neuesten Zeilen angezeigt werden. Einige Zeilen können auch leere Einträge enthalten, wenn die entsprechende Komponente zu dem jeweiligen Zeitpunkt noch nicht in die Auswahl aufgenommen wurde.

    Die angezeigte Tabelle kann nicht geändert werden, sie dient ausschließlich der Anzeige.

    Weiter: Die Registerkarte "Datei".

    logisim-2.7.1/doc/de/html/guide/log/selection.html0000644000175000017500000000477511541757120021734 0ustar vincentvincent Die Registerkarte "Auswahl"

    Die Registerkarte "Auswahl"

    Auf der Registerkarte "Auswahl" können Sie festlegen, welche Werte in das Protokoll aufgenommen werden sollen. Das unten abgebildete Fenster entspricht der folgenden Schaltung.



    Die Registerkarte ist in drei vertikale Bereiche aufgeteilt. Der linke Bereich ist eine Liste aller Bauelemente in der Schaltung, deren Werte geloggt werden können. Von der eingebauten Bibliothek unterstützen die folgenden Bauelemente das Loggen von Werten:

    Basisbibliohtek: Pin-, Testpunkt- und Takt-Bauelemente
    Ein/Ausgabebibliothek: Taster- und LED-Bauelemente
    Speicherbibliothek: alle Bauelemente, abgesehen vom ROM
    Die Namen von Bauelementen mit Beschriftungen entsprechen dem Text der Beschriftung, anderenfalls gibt der Name den Typ und die Position des Bauelements in der Schaltung an. Auch alle Teilschaltungen werden in der Liste auftauchen. Diese können zwar nicht selbst geloggt werden, aber unterstützte Bauelemente in den Teilschaltungen. Beachten Sie, daß das RAM-Bauelement eine Angabe benötigt, der Inhalt welcher Speicheradresse(n) geloggt werden soll. Unterstützt wird nur das Loggen der ersten 256 Adressen.

    Der rechte Bereich zeigt die ausgewählten Bauelemente. Es wird auch angezeigt, zu welcher Basis Mehrbit-Werte der Bauelemente geloggt werden. Die Angabe der Basis hat keinen Einfluß auf Einzelbit-Werte.

    Die Schaltflächen in der Mitte erlauben die Manipulation der ausgewählten Elemente.

    • Hinzufügen fügt die aktuell auf der linken Seite ausgewählte Elemente zur Auswahl hinzu.
    • Basis ändern wechselt für die ausgewählten Elemente zyklisch zwischen den Basen 2 (binär), 10 (dezimal) und 16 (hexadezimal).
    • Nach oben bewegt die aktuell ausgewählte Komponente einen Platz nach oben.
    • Nach unten bewegt die aktuell ausgewählte Komponente einen Platz nach unten.
    • Entfernen entfernt die aktuell ausgewählte Komponente aus der Auswahl.

    Weiter: Die Registerkarte "Tabelle".

    logisim-2.7.1/doc/de/html/guide/log/index.html0000644000175000017500000000447211541757120021050 0ustar vincentvincent Ablaufverfolgung

    Ablaufverfolgung

    Beim Testen einer größeren Schaltung und zur Dokumentation des Verhaltens einer Schaltung, gibt es die Möglichkeit, das Verhalten der Schaltung zu protokollieren. Dies geschieht durch das Log-Modul von Logisim, das es Ihnen erlaubt, die Bauelemente auszuwählen, deren Werte protokolliert werden sollen. Darüber hinaus können Sie auswählen, in welche Datei diese Daten geschrieben werden sollen.

    Wichtig: Das Log-Modul befindet sich in einer Alpha-Testphase: es kann Fehler enthalten und wird sich vermutlich in zukünftigen Versionen erheblich verändern. Während Fehlerberichte und Vorschläge zu Logisim immer willkommen sind, so gilt dies insbesondere vür diese relativ neue Funktion. Wenn Sie keine Kommentare einschicken, wird sich vermutlich nicht viel ändern.

    Sie erreichen das Log-Modul über den Punkt "Loggen..." aus dem Simulationsmenü. Dies wird ein Fenster mit drei Registerkarten öffnen.

    Hier werden wir diese Registerkarten im Einzelnen beschreiben.
    Die Registerkarte "Auswahl"
    Die Registerkarte "Tabelle"
    Die Registerkarte "Datei"

    Jedes Projekt besitzt nur ein einzelnes Log-Fenster. Wenn Sie zu einer anderen Schaltung desselben Projekts wechseln, wird auch das Log-Fenster automatisch zum Protokollieren der anderen Schaltung wechseln. Dies passiert jedoch nicht, wenn Sie in derselben Simulation auf- oder absteigen, dann wird sich das Log-Modul nicht verändern.

    Beachten Sie, daß das Loggen automatisch gestoppt wird, wenn das Log-Fenster zur Protokollierung einer anderen Simulation umschaltet. Wenn Sie danach zur vorigen Simulation zurückkommen, dann werden zwar die entsprechenden Werte für diese Simulation wieder hergestellt, aber Sie müssen die eigentliche Protokollierung manuell wieder starten..

    Weiter: Die Registerkarte "Auswahl" .

    logisim-2.7.1/doc/de/html/guide/log/file.html0000644000175000017500000000504011541757120020650 0ustar vincentvincent Die Registerkarte "Datei"

    Die Registerkarte "Datei"

    Die Registerkarte "Datei" erlaubt es, die Datei anzugeben, die das Protokoll aufnehmen soll.

    Oben wird angezeigt, ob die Ablaufverfolgung aktiviert ist, und eine Schaltfläche um das Loggen zu aktivieren und zu deaktivieren. (Beachten Sie, daß vor der Aktivierung eine Datei ausgewählt sein muß.) Die Schaltfläche erlaubt es, das Loggen zeitweise anzuhalten und fortzusetzen. Wenn Sie im Projektfenster auf eine andere Simulation wechseln, wird das Loggen automatisch angehalten. Wenn Sie danach wieder zur ursprünglichen Simulation zurückschalten, dann müssen Sie das Loggen über diese Schaltfläche manuell wieder starten.

    In der Mitte wird angezeigt, in welche Datei protokolliert wird. Um diese zu ändern, benutzen Sie die Schaltfläche "Auswählen...". Nach der Auswahl einer Datei startet das Loggen automatisch. Wenn die ausgewählte Datei bereits existiert, wird Logisim fragen, ob Sie die Datei überschreiben, oder das neue Protokoll am Ende der Datei anhängen möchten.

    Unten können Sie auswählen, ob eine Kopfzeile in die Datei geschrieben werden soll, die angibt, welche Elemente sich in der Auswahl befinden. Wenn Kopfzeilen abgespeichert werden, dann wird jeweils eine neue Kopfzeile geschrieben, wenn sich die Auswahl ändert.

    Dateiformat

    Einträge werden in einem durch Tabulatoren abgegrenzten Format geschrieben, das dem Inhalt der Registerkarte "Tabelle" ähnelt. (Ein Unterschied ist, daß eine Kopfzeile den vollständigen Pfad zu Bauelementen angeben würde, die sich in Teilschaltungen befinden.) Das Format ist absichtlich sehr einfach gehalten, damit Sie die Daten leicht in ein anderes Programm zur Auswertung übernehmen können, wie z.B. ein Python/Perl-Skript oder eine Tabellenkalkulation.

    Damit ein anderes Programm gleichzeitig auf die Daten zugreifen kann, während die Simulation in Logisim läuft, werden die Daten alle 500 ms weggeschrieben. Beachten Sie auch, daß Logisim die Datei zwischenzeitlich schließen und später wieder öffnen kann, insbesondere dann, wenn mehrere Sekunden vergehen, bevor neue Daten hinzugefügt werden.

    Weiter: Leitfaden für Benutzer von Logisim.

    logisim-2.7.1/doc/de/html/guide/jar/0000755000175000017500000000000011541757120017037 5ustar vincentvincentlogisim-2.7.1/doc/de/html/guide/jar/simpctr.html0000644000175000017500000001700711541757120021413 0ustar vincentvincent Einfacher Gray-Kode-Zähler

    Einfacher Gray-Kode-Zähler

    Häufig benötigt man Bauelemente, die nicht rein-kombinatorisch sind - mit anderen Worten, Bauelemente, die einen internen Speicher besitzen. Es gibt hier aber eine Kleinigkeit bei der Erstellung dieser Bauelemente zu beachten: diese Bauelemente können ihren Zustand nicht direkt selber speichern, denn ein und dasselbe Bauelement kann mehrfach in einer Schaltung auftauchen. Zwar kann es nicht direkt mehrmals in einer Schaltung auftauchen, aber es kann mehrmals vorhanden sein, wenn es in einer Unterschaltung benutzt wird, die ihrerseits mehrmals verwendet wird.

    Die Lösung ist es, hier eine neue Klasse zu erstellen, die den aktuellen Zustand des Objekts repräsentiert, und Instanzen hiervon mit den Bauelementen über den Zustand der Mutterschaltung zu verknüpfen. In diesem Beispiel werden wir einen flankengetriggerten 4-Bit-Gray-Kode-Zähler konstruieren. Hierzu definieren wir eine Klasse CounterData, die den Zustand des Zählers repräsentiert, zusätzlich zur InstanceFactory Unterklasse, die wir gerade betrachtet haben. Das Objekt CounterData merkt sich sowohl den aktuellen Wert des Zählers, als auch den letzten Zustand des Takteingangs (um steigende Flanken zu erkennen).

    CounterData

    package com.cburch.gray;
    
    import com.cburch.logisim.data.BitWidth;
    import com.cburch.logisim.data.Value;
    import com.cburch.logisim.instance.InstanceData;
    import com.cburch.logisim.instance.InstanceState;
    
    /** Repräsentiert den aktuellen Zustand des Zählers. */
    class CounterData implements InstanceData, Cloneable {
        /** Fragt den Zustand ab, der mit diesem Zähler im aktuellen Zustand der Schaltung verknüpft ist,
         * wenn notwendig wird dieser Zustand erstellt.
         */
        public static CounterData get(InstanceState state, BitWidth width) {
            CounterData ret = (CounterData) state.getData();
            if(ret == null) {
                // Wenn es noch nicht existiert, werden wir es mit unseren Vorgabewerten
                // initialisieren und im aktuellen Zustand der Schaltung einfügen, so daß
                // in weiteren Aufrufen abgefragt werden kann.
                ret = new CounterData(null, Value.createKnown(width, 0));
                state.setData(ret);
            } else if(!ret.value.getBitWidth().equals(width)) {
                ret.value = ret.value.extendWidth(width.getWidth(), Value.FALSE);
            }
            return ret;
        }
    
        /** Der zuletzt gesehene Zustand des Takteingangs */
        private Value lastClock;
        
        /** Der aktuelle Wert, den der Zähler ausgibt. */
        private Value value;
    
        /** Erstelle einen Zustand mit den gegebenen Werten. */
        public CounterData(Value lastClock, Value value) {
            this.lastClock = lastClock;
            this.value = value;
        }
    
        /** Liefert eine Kopie des Objekts zurück. */
        public Object clone() {
            // Wir können benutzen, was super.clone() zurückliefert: die einzigen Instanzenvariablen sind
            // Value-Objekte, die unveränderlich sind, daher ist es unwesentlich, daß Kopie und
            // Original auf dieselben Value-Objekte verweisen. Hätten wir veränderliche Instanzen-
            // variables, dann müßten wir diese natürlich klonen.
            try { return super.clone(); }
            catch(CloneNotSupportedException e) { return null; }
        }
        
        /** Aktualisiert das vorige Taktsignal und liefert true zurück, wenn getriggert. */
        public boolean updateClock(Value value) {
            Value old = lastClock;
            lastClock = value;
            return old == Value.FALSE && value == Value.TRUE;
        }
        
        /** Liefert den aktuellen Wert des Zählers zurück. */
        public Value getValue() {
            return value;
        }
        
        /** Aktualisiert den aktuellen Wert des Zählers. */
        public void setValue(Value value) {
            this.value = value;
        }
    }
    

    SimpleCounter

    package com.cburch.gray;
    
    import com.cburch.logisim.data.BitWidth;
    import com.cburch.logisim.data.Bounds;
    import com.cburch.logisim.data.Direction;
    import com.cburch.logisim.instance.InstanceFactory;
    import com.cburch.logisim.instance.InstancePainter;
    import com.cburch.logisim.instance.InstanceState;
    import com.cburch.logisim.instance.Port;
    import com.cburch.logisim.util.GraphicsUtil;
    import com.cburch.logisim.util.StringUtil;
    
    /** Erzeugt einen einfachen Zähler, der einen vierstelligen Gray-Kode durchläuft. Dieses
     * Beispiel zeigt, wie ein Bauelement den eigenen internen Zustand verwalten kann. Der
     * gesamte auf den Zustand bezogene Kode findet sich in der Klasse CounterData. */
    class SimpleGrayCounter extends InstanceFactory {
        private static final BitWidth BIT_WIDTH = BitWidth.create(4);
        
        // Beachten Sie bitte wieder, daß wir keine Instanzenvariablen haben, die sich auf den Zustand
        // einer individuellen Instanz beziehen. Wir können dies hier nicht unterbringen, weil nur ein einziges 
        // Objekt SimpleGrayCounter erzeugt werden wird, dessen Aufgabe es ist, alle
        // Instanzen in allen Schaltungen zu verwalten.
        
        public SimpleGrayCounter() {
            super("Gray Counter (Simple)");
            setOffsetBounds(Bounds.create(-30, -15, 30, 30));
            setPorts(new Port[] {
                    new Port(-30, 0, Port.INPUT, 1),
                    new Port(  0, 0, Port.OUTPUT, BIT_WIDTH.getWidth()),
            });
        }
    
        public void propagate(InstanceState state) {
            // Hier besorgen wir uns den Zustand dieses Bauelements durch eine
            // Hilfsmethode. Der Zusatnd befindet sich in einem CounterData-Objekt, wo auch
            // die Hilfsmethode definiert wurde. Die Hilfsmethode wird ein 
            // CounterData-Objekt erzeugen, falls dieses noch nicht existiert.
            CounterData cur = CounterData.get(state, BIT_WIDTH);
    
            boolean trigger = cur.updateClock(state.getPort(0));
            if(trigger) cur.setValue(GrayIncrementer.nextGray(cur.getValue()));
            state.setPort(1, cur.getValue(), 9);
            
            // (Sie könnten versucht sein, den Wert des Zählers über 
            // state.getPort(1) zu ermitteln. DIes wäre aber falsch, denn ein anderes Bauelement
            // könnte einen Wert an denselben Punkt zwingen, was
            // den tatsächlichen Wert korrumpieren würde. Wir müssen den aktuellen Wert wirklich in 
            // der Instanz speichern.)
        }
    
        public void paintInstance(InstancePainter painter) {
            painter.drawBounds();
            painter.drawClock(0, Direction.EAST); // zeichne ein Dreieck an Port 0
            painter.drawPort(1); // Zeichne Port 1 als einfachen Punkt
            
            // Zeige den aktuellen Wert zentriert im Rechteck an.
            // Wenn jedoch der Kontext besagt, daß der Wert nicht angezeigt werden soll, (z.B. beim Drucken)
            // dann überspringe dies.
            if(painter.getShowState()) {
                CounterData state = CounterData.get(painter, BIT_WIDTH);
                Bounds bds = painter.getBounds();
                GraphicsUtil.drawCenteredText(painter.getGraphics(),
                        StringUtil.toHexString(BIT_WIDTH.getWidth(), state.getValue().toIntValue()),
                        bds.getX() + bds.getWidth() / 2,
                        bds.getY() + bds.getHeight() / 2);
            }
        }
    }
    

    Weiter: Gray-Kode-Zähler.

    logisim-2.7.1/doc/de/html/guide/jar/library.html0000644000175000017500000000430011541757120021366 0ustar vincentvincent Bibliotheksklasse

    Bibliotheksklasse

    Der Startpunkt einer JAR-Bibliothek ist eine Klasse, die die Library-Klasse erweitert. Die Hauptaufgabe ist es, die Werkzeuge aufzulisten, die durch die Bibliothek zur Verfügung gestellt werden. Meistens wird es sich um Werkzeuge handeln, die verschiedene Bauelemente zu einer Schaltung hinzufügen, d.h. Instanzen der AddTool-Klasse, die mit verschiedenen Komponentenfabriken zusammenarbeiten.

    Components

    package com.cburch.gray;
    
    import java.util.Arrays;
    import java.util.List;
    
    import com.cburch.logisim.tools.AddTool;
    import com.cburch.logisim.tools.Library;
    
    /** Die Bauteilebibliothek, die für den Anwender zugänglich ist. */
    public class Components extends Library {
        /** Die Liste aller Werkzeuge in der Bibliothek. Technisch
         * enthalten Bibliotheken Werkzeuge, was ein etwas allgemeinerer Begriff als
         * Bauelemente ist. In der Praxis werden Sie aber wohl am häufigsten
         * AddTools zum Einfügen neuer Bauelemente in die Schaltung erstellen wollen.
         */
        private List<AddTool> tools;
        
        /** Erstellt eine Instanz dieser Bibliothek. Über diesen Konstruktor 
         * greift Logisim zuerst zu, wenn eine JAR-Datei geladen wird: Es sucht nach
         * einer Konstruktormethode ohne Argumente für die vom Benutzer angegebene Klasse.
         */
        public Components() {
            tools = Arrays.asList(new AddTool[] {
                    new AddTool(new GrayIncrementer()),
                    new AddTool(new SimpleGrayCounter()),
                    new AddTool(new GrayCounter()),
            });
        }
        
        /** Gibt den Namen der Bibliothek zurück, der dem Benutzer angezeigt wird. */ 
        public String getDisplayName() {
            return "Gray Tools";
        }
        
        /** Gibt eine Liste aller Werkzeuge der Bibliothek zurück. */
        public List<AddTool> getTools() {
            return tools;
        }
    }
    

    Weiter: Einfacher Gray-Kode-Zähler.

    logisim-2.7.1/doc/de/html/guide/jar/index.html0000644000175000017500000001150411541757120021035 0ustar vincentvincent JAR-Bibliotheken

    JAR-Bibliotheken

    Verwendung von JAR-Bibliotheken

    Logisim kennt zwei Arten von Bauelementen: solche, die in Logisim als Kombination anderer Bauelemente konstruiert wurden, und die in Java programmierten Grundbauelemente. Schaltungen in Logisim sind einfacher zu entwerfen, aber diese unterstützen keine anspruchsvollen Interaktionen mit dem Anwender. Außerdem sind sie als Bauelement verhältnismäßig ineffizient.

    Logisim enthält eine ziemlich umfangreiche Bibliothek von eingebauten Java-Bauelementen, es lassen sich aber auch Bibliotheken laden, die von Ihnen selbst oder anderen erstellt worden sind. Wenn Sie eine Bibliothek heruntergeladen haben, können Sie diese in Ihr aktuelles Projekt importieren, indem Sie im Übersichtsfenster Ihr Projekt anklicken (die oberste Zeile) und dort den Punkt "Bibliothek laden &gt; JAR-Bibliothek" auswählen. Diesen Punkt erreichen Sie auch über "Projekt &gt; Bibliothek laden" aus dem Hauptmenü. Dann wird Logisim Sie auffordern, die entsprechende JAR-Datei auszuwählen. (In einigen Fällen werden Sie aufgefordert, den Namen der Startklasse in der Bibliothek anzugeben. Diese Angabe sollten Sie vom Programmierer bekommen haben. Meistens aber wird der Entwickler die JAR-Bibliothek bereits so konfiguriert haben, daß dies nicht nötig ist (indem eine manifest-Datei im JAR-Archiv angelegt wurde, dessenLibrary-Class-Attribut den Namen der Hauptklasse angibt).)

    Erstellen von JAR-Bibliotheken

    Der Rest dieses Abschnitts widmet sich einer Serie gut dokumentierter Beispiele, die aufzeigen, wie Sie eigene Logisim-Bibliotheken entwickeln können. Um erfolgreich eigene Bibliotheken zu entwickeln, sollten Sie sich in der Java-Programmierung auskennen. Die Dokumentation, die über diese Beispiele hinausgeht ist etwas dürftig.

    Ein JAR-Archiv mit den folgenden Beispielen können Sie von der Homepage von Logisim herunterladen, Sie finden die Datei im Abschnitt "Links". Diese JAR-Datei enthält auch den Quellkode zu den folgenden Beispielen.

    Gray-Kode-Inkrementierer

    Zeigt die wesentlichen Teile eines Bauelements an einem einfachen Beispiel. Dieses Bauelement nimmt einen Mehrbit-Wert an einem Eingang entgegen und berechnet den darauf folgenden Gray-Kode.

    Bibliotheksklasse

    Zeigt, wie eine Bibliothek definiert wird. Dieses ist der Einstiegspunkt für jede JAR-Datei - die Klasse, deren Name der Anwender angibt, wenn er die JAR-Datei lädt.

    Einfacher Gray-Kode-Zähler

    Zeigt, wie ein Bauelement mit einem internen Zustand aufgebaut ist, am Beispiel eines 8-Bit-Zählers mit Gray-Kode-Ausgabe.

    Gray-Kode-Zähler

    Veranschaulicht ein komplettes und ziemlich anspruchsvolles Bauelement mit Interaktion mit dem Benutzer. Es wird ein Gray-Kode-Zähler mit variabler Bitbreite implementiert, dessen Bitbreite konfiguriert werden kann. Außerdem kann der Benutzer den aktuellen Wert mit dem Schaltwerkzeug und durch Eingabe eines Wertes verändern.

    Richtlinien
    Allgemeine Informationen für die Entwicklung externer Bibliotheken

    Lizenz

    Der Kode in diesem Beispiel einer JAR-Bibliothek ist unter der MIT-Lizenz veröffentlicht, einer großzügigeren Lizenz als die GPL, welche für den Rest von Logisim gilt.

    Copyright (c) 2009, Carl Burch.

    Hiermit wird die Erlaubnis erteilt, kostenlos, für jede Person, eine Kopie dieser Software und der zugehörigen Dokumentationen (die "Software") zu erhalten, die Software uneingeschränkt zu benutzen, einschließlich und ohne Einschränkung der Rechte zur Verwendung, dem Kopieren, Ändern, Zusammenführen, Veröffentlichen, Verbreiten, Lizenzieren und / oder Verkaufen von Kopien der Software, sowie Personen, denen die Software geliefert wird, dies unter den folgenden Bedingungen zu gestatten:

    Der obige Urheberrechtsvermerk und diese Genehmigung soll in alle Kopien oder Teile der Software aufgenommen werden.

    DIE SOFTWARE WIRD WIE BESEHEN AUSGELIEFERT, OHNE GARANTIE JEGLICHER ART, EINSCHLIESSLICH, ABER NICHT BESCHRÄNKT AUF DIE GARANTIE DER EIGNUNG FÜR EINEN BESTIMMTEN ZWECK UND NICHTVERLETZUNG DER RECHTE DRITTER. IN KEINEM FALL SIND DIE AUTOREN ODER URHEBERRECHTSINHABER VERANTWORTLICH FÜR ANSPRÜCHE, SCHÄDEN ODER ANDERE HAFTUNGEN, ALS FOLGE VON ODER IM ZUSAMMENHANG MIT DER SOFTWARE, DEREN BENUTZUNG ODER IN ANDEREM BEZUG ZUR SOFTWARE.

    Weiter: Gray-Kode-Inkrementierer.

    logisim-2.7.1/doc/de/html/guide/jar/incr.html0000644000175000017500000002352511541757120020667 0ustar vincentvincent Gray-Kode-Inkrementierer

    Gray-Kode-Inkrementierer

    Jedes Bauelement in ein einer Bibliothek wird durch die Erstellung einer Unterklasse von InstanceFactory aus dem com.cburch.logisim.instance Paket definiert. Diese Unterklasse enthält den gesamten, benötigten Kode.

    (An dieser Stelle beschreiben wir die API der aktuellen Version von Logisim. Es gibt Bibliotheken, die für frühere Versionen von Logisim entwickelt wurden, wo Bauelemente durch die Definition von zwei Klassen erstellt wurden: eine Erweiterung von Component und eine Erweiterung von ComponentFactory. Die Version 2.3.0 führte die sehr viel einfachere InstanceFactory-API ein, die andere Methode ist seitdem veraltet.)

    Drei Pakete von Logisim definieren die meisten Klassen, die für die Erstellung von Bauelementbibliotheken benötigt werden.

    com.cburch.logisim.instance

    Enthält Klassen, die speziellen Bezug zur Erstellung von Bauelementen haben, darunter die Klassen InstanceFactory, InstanceState, InstancePainter und Instance.

    com.cburch.logisim.data

    Enthält Klassen zu Datenelementen, die mit den Bauelementen verknüpft sind, wie die Klasse Bounds für begrenzende Rechtecke oder die Klasse Value für die Werte, die auf einer Leitung existieren können.

    com.cburch.logisim.tools

    Enthält Klassen zur Definition von Bibliotheken.

    Über Gray-Kodes

    Bevor wir weitergehen, soll an dieser Stelle kurz auf die Gray-Kodes eingegangen werden, auf denen die Beispiele aufbauen. Es ist nicht unbedingt wichtig zu verstehen, wie diese Beispiele im Detail funktionieren. Daher können Sie auch den folgenden Kode überspringen - natürlich auch dann, wenn Sie sich bereits mit Gray-Kodes auskennen.

    Der Gray-Kode (benannt nach Frank Gray) ist eine Methode eine Gruppe von n-Bits zu durchlaufen, wobei sich immer nur ein Bit pro Schritt ändert. Als Beispiel können Sie den folgenden 4-bit Gray-Kode betrachten.

    0000
    0001
    0011
    0010
           0110
    0111
    0101
    0100
           1100
    1101
    1111
    1110
           1010
    1011
    1001
    1000

    In jeder Zeile ist jeweils das Bit unterstrichen, das sich im nächsten Schritt ändern wird. Zum Beispiel folgt auf 0000 der Wert 0001, in dem das letzte Bit umgeschaltet wurde, daher ist das letzte Bit unterstrichen.

    Keines der eingebauten Bauelemente in Logisim arbeitet mit Gray-Kodes. Aber manchmal sind Gray-Kodes für Elektroniker von Bedeutung. Ein solches Beispiel findet sich längs der Achsen von Karnaughdiagrammen.

    GrayIncrementer

    Dies ist ein minimales Beispiel zur Veranschaulichung der wesentlichen Bestandteile der Definition eines Bauelements. Dieses Bauelement ist ein Inkrementierer, das einen Wert von einem Mehrbit-Eingang nimmt und den nächsten Gray-Kode der Sequenz berechnet.

    package com.cburch.gray;
    
    import com.cburch.logisim.data.Attribute;
    import com.cburch.logisim.data.BitWidth;
    import com.cburch.logisim.data.Bounds;
    import com.cburch.logisim.data.Value;
    import com.cburch.logisim.instance.InstanceFactory;
    import com.cburch.logisim.instance.InstancePainter;
    import com.cburch.logisim.instance.InstanceState;
    import com.cburch.logisim.instance.Port;
    import com.cburch.logisim.instance.StdAttr;
    
    /** Dieses Bauelement nimmt einen Mehrbit-Wert und berechnet den darauf folgenden Wert aus
     * im Gray-Kode. Zum Beispiel folgt auf 0100 der Wert 1100. */
    class GrayIncrementer extends InstanceFactory {
        /* Beachten Sie, daß es keine Instanyvariablen gibt. Es wird nur eine Instanz dieser
         * Klasse erzeugt, die alle Instanzen des Bauelements verwaltet. Alle
         * Informationen die mit individuellen Instanzen zusammenhängen, sollten durch 
         * Attribute behandelt werden. Für den GrayIncrementer besitzt jede Instanz eine Bitbreite
         * mit der gearbeitet wird, daher gibt es ein entsprechendes Attribut. */
    
        / ** Der Konstruktor konfiguriert die Fabrik. */
        GrayIncrementer() {
            super("Gray Code Incrementer");
            
            /* Auf diese Weise können die Attribute des GrayIncrementers initialisiert werden. Hier
             * haben wir nur ein Attribut - die Bitbreite - deren Vorgabe
             * 4 ist. Die Klasse StdAttr definiert zahlreiche gebräuchliche 
             * Attribute, einschließlcih der Bitbreite. wenn möglich
             * empfiehlt es sich, die Attribute aus StdAttr zu verwenden: Ein Anwender kann dann mehrere
             * Bauelemente (selbst aus verschiedenen Bibliotheken) mit gemeinsamen Attributen auswählen,
             * und dann diese dann gleichzeitig verändern. */
            setAttributes(new Attribute[] { StdAttr.WIDTH },
                    new Object[] { BitWidth.create(4) });
            
            /* Die "offset bounds" bezeichnen die Lage des umgrenzenden Rechtecks
             * relativ zur Position der Maus. Hier wird unser Bauelement 
             * 30x30 groß, und wir verankern es an dessen primären Ausgang
             * (wie für Logisim typisch), der sich in der Mitte der
             * östlichen Kante befindet. Daher befindet sich die obere linke Ecke des umgrenzenden Rechtecks 30 Punkte
             * westlich und 15 Punkte nördlich der Mausposition. */
            setOffsetBounds(Bounds.create(-30, -15, 30, 30));
            
            /* Die Ports sind die Positionen, an denen Leitungen an dem Bauteil
             * angeschlossen werden können. Jedes Port-Objekt besagt, wo dieser Port relativ zum Ankerpunkt des
             * Bauelements befindet, ob es sich um einen
             * Eingang/Ausgang/Beides handelt, und schließlich die erwartete Bitbreite des Ports.
             * Die Bitbreite kann eine Konstante (wie 1) oder ein Attribut (wie in diesem Beispiel) sein.
             */
            setPorts(new Port[] {
                    new Port(-30, 0, Port.INPUT, StdAttr.WIDTH),
                    new Port(0, 0, Port.OUTPUT, StdAttr.WIDTH),
                });
        }
    
        /** Berechnet den aktuellen Ausgabewert des Bauelements. Diese Methode wird jedes Mal aufgerufen,
         * wenn einer der Eingänge seinen Wert ändert. Sie kann auch unter anderen Umständen
         * aufgerufen werden, auch wenn es keinen Grund gibt, eine Änderung zu
         * erwarten. */
        public void propagate(InstanceState state) {
            // Zunächst wird der Wert vom Eingang eingelesen. Beachten Sie, daß beim Aufruf
            // von setPorts der Eingang am Index 0 des Parameterfeldes 
            // definiert wurde, daher benutzen wir hier 0 als Parameter.
            Value in = state.getPort(0);
            
            // Jetzt wir der Ausgangswert berechnet. Dies wurde in eine Hilfsmethode ausgelagert,
            // weil die anderen Bauelemente dieser Bibliothek dieselben Routinen benötigen.
            Value out = nextGray(in);
            
            // Schließlich wird dieser Wert an den Ausgang weitergegeben. Der erste Parameter
            // ist 1, weil der Ausgang in unserer Liste der Ports am Index 1 definiert worden ist
            // (siehe setPorts weiter oben). Der zweite Parameter ist hier der
            // Wert, der an den Ausgang gesendet werden soll. Und der letzte Parameter ist die Verzögerung
            //  - die Anzahl der Schritte, die bis zur Aktualisierung des Ausgangs vergehen sollen,
            // nach der Änderung am Eingang.
            state.setPort(1, out, out.getWidth() + 1);
        }
    
        /** Bezeichnet, wie eine einzelne Instanz auf der Arbeitsfläche dargestellt wird. */
        public void paintInstance(InstancePainter painter) {
            / /  InstancePainter enthält mehrere bequeme Methoden
            // zum Zeichnen, die wir hier benutzen. Häufig würden Sie
            // dessen Objekt Graphics (painter.getGraphics) aufrufen, so daß Sie direkt
            // aus der Arbeitsfläche zeichnen können.
            painter.drawRectangle(painter.getBounds(), "G+1");
            painter.drawPorts();
        }
        
        /** Berechnet den nächsten Gray-Wert nach prev aus der Folge. Diese statische
         * Methode dreht nur einige Bits um, es hat nicht viel mit Logisim
         * zu tun, abgesehen von der Manipulation der Objekte Value und BitWidth */
        static Value nextGray(Value prev) {
            BitWidth bits = prev.getBitWidth();
            if(!prev.isFullyDefined()) return Value.createError(bits);
            int x = prev.toIntValue();
            int ct = (x >> 16) ^ x; // compute parity of x
            ct = (ct >> 8) ^ ct;
            ct = (ct >> 4) ^ ct;
            ct = (ct >> 2) ^ ct;
            ct = (ct >> 1) ^ ct;
            if((ct & 1) == 0) { // if parity is even, flip 1's bit
                x = x ^ 1;
            } else { // ansonsten kippe das Bit gerade oberhalb der letzten 1
                int y = x ^ (x & (x - 1)); // berechne die letzte 1
                y = (y << 1) & bits.getMask();
                x = (y == 0 ? 0 : x ^ y);
            }
            return Value.createKnown(bits, x);
        }
    }
    

    Dieses Beispiel alleine ist nicht genug, um ein funktionierendes JAR-Archiv zu erstellen. Sie müssen darüberhinaus eine Bibliotheksklasse erstellen, wie auf der nächsten Seite näher erklärt wird.

    Weiter: Bibliotheksklasse.

    logisim-2.7.1/doc/de/html/guide/jar/guide.html0000644000175000017500000000373111541757120021026 0ustar vincentvincent Richtlinien

    Richtlinien

    Lernen Sie mehr

    Über die Reihe dieser Beispiele hinaus, so bietet der Quellkode von Logisim eine Vielzahl weiterer Beispiele, auch wenn diese nicht immer denselben Grad an Lesbarkeit und gutem Design aufweisen.

    Um die Übertragbarkeit auf künftige Versionen sicherzustellen, sollten Sie sich soweit möglich an die Klassen in den ...instance, ...data und ...tools-Paketen halten. Natürlich dürfen Sie auch die APIs anderer Pakete benutzen, diese sind aber anfälliger für Änderungen in künftigen Versionen von Logisim.

    Der Autor ist grundsätzlich bereit, gelegentliche Bitten um Hilfe zu beantworten. Und Fehlerberichte und Verbesserungsvorschläge sind natürlich jederzeit willkommen.

    Verbreitung

    Von Ihnen erstellte JAR-Archive dürfen Sie ohne jede Einschränkung weitergeben. Die Regelungen der GPL gelten aber, soweit Teile Ihrer Arbeit aus dem Quellkode von Logisim abgeleitet sind, der unter der GPL veröffentlicht wurde. Eine Ableitung aus den Beispielen in diesem Abschnitt des Leitfadens unterliegt nicht diesen Einschränkungen, da diese unter der MIT-Lizenz veröffentlicht worden sind.

    Wenn Sie Ihre Bibliothek anderen Anwendern von Logisim zugänglich machen möchten, so ist der Autor immer dazu bereit, einen Link auf eine Webseite oder auch das JAR-Archiv selbst auf der Homepage von Logisim bereitszustellen. Wenn Sie der Meinung sind, Ihre Bibliothek sollte ein Teil der normalen Ausgabe von Logisim werden, dann freut sich der Autor über Ihre VorschIäge, und wird gerne Ihren Beitrag zu Ausgaben von Logisim anerkennen, die Ihre Arbeit enthalten.

    Weiter: Leitfaden für Benutzer von Logisim.

    logisim-2.7.1/doc/de/html/guide/jar/counter.html0000644000175000017500000002050111541757120021402 0ustar vincentvincent Gray-Kode-Zähler

    Gray-Kode-Zähler

    Wir setzen diese Einführung in die Bibliotheken von Logisim jetzt mit einem recht anspruchsvollen Gray-Kode-Zähler fort. Bei diesem läßt sich der Wert mit dem Schaltwerkzeug ändern, und es läßt sich eine Beschriftung auf dem Bauelement anbringen. Das Beispiel zeigt auch, wie das Symbol für das Werkzeug im Übersichtsfenster bearbeitet werden kann.

    GrayCounter

    package com.cburch.gray;
    
    import java.net.URL;
    
    import javax.swing.ImageIcon;
    
    import com.cburch.logisim.data.Attribute;
    import com.cburch.logisim.data.BitWidth;
    import com.cburch.logisim.data.Bounds;
    import com.cburch.logisim.data.Direction;
    import com.cburch.logisim.instance.Instance;
    import com.cburch.logisim.instance.InstanceFactory;
    import com.cburch.logisim.instance.InstancePainter;
    import com.cburch.logisim.instance.InstanceState;
    import com.cburch.logisim.instance.Port;
    import com.cburch.logisim.instance.StdAttr;
    import com.cburch.logisim.util.GraphicsUtil;
    import com.cburch.logisim.util.StringUtil;
    
    /** Erzeugt einen Zähler, der Gray-Kodes durchläuft. Hier werden
     * mehrere weitere Funktionen gezeigt, die über die Klasse SimpleGrayCounter hinausgehen. */
    class GrayCounter extends InstanceFactory {
        public GrayCounter() {
            super("Gray Counter");
            setOffsetBounds(Bounds.create(-30, -15, 30, 30));
            setPorts(new Port[] {
                    new Port(-30, 0, Port.INPUT, 1),
                    new Port(  0, 0, Port.OUTPUT, StdAttr.WIDTH),
            });
            
            // Der Zähler hat Attribute für Bitbreite, Beschriftung und Zeichensatz der Beschriftung. Die letzteren beiden
            // Attribute erlauben es uns, dem Bauelement eine Beschriftung zu geben (auch wenn
            // wir außerdem noch configureNewInstance benötigen, um die Position der Beschriftung
            // anzugeben).
            setAttributes(
                    new Attribute[] { StdAttr.WIDTH, StdAttr.LABEL, StdAttr.LABEL_FONT },
                    new Object[] { BitWidth.create(4), "", StdAttr.DEFAULT_LABEL_FONT });
            
            // Der folgende Methodenaufruf schafft die Voraussetzungen dafür, daß der Zustand
            // der Instanz mit demSchaltwerkzeug gändert werden kann.
            setInstancePoker(CounterPoker.class);
            
            // Die zwei nächsten Zeilen sorgen dafür, daß
            // das Bauelement mit einem individuellen Symbol dargestellt wird. Hierbei sollte es sich um ein 
            // 16x16 Punkte großes Bild handeln.
            URL url = getClass().getClassLoader().getResource("com/cburch/gray/counter.gif");
            if(url != null) setIcon(new ImageIcon(url));
        }
        
        /** Die Methode configureNewInstance wird jedes Mal aufgerufen, wenn eine neue Instanz 
         * erstellt wird. In der Überklasse macht diese Methode nichts, weil die neue
         * Instanz schon per Voreinstellung gründlich konfiguriert wird. Aber
         * manchmal müssen spezielle Operationen für jede Instanz durchgeführt werden, und
         * dann würden Sie diese Methode überschreiben. In diesem Beispiel soll die Position der Beschriftung
         * festgelegt werden. */
        protected void configureNewInstance(Instance instance) {
            Bounds bds = instance.getBounds();
            instance.setTextField(StdAttr.LABEL, StdAttr.LABEL_FONT,
                    bds.getX() + bds.getWidth() / 2, bds.getY() - 3,
                    GraphicsUtil.H_CENTER, GraphicsUtil.V_BASELINE);
        }
    
        public void propagate(InstanceState state) {
            // Dieser Abschnitt ist genauso wie beim SimpleGrayCounter, abgesehen davon, daß wir das 
            // StdAttr.WIDTH Attribut benutzen, um die zu verwendende Bitbreite zu bestimmen.
            BitWidth width = state.getAttributeValue(StdAttr.WIDTH);
            CounterData cur = CounterData.get(state, width);
            boolean trigger = cur.updateClock(state.getPort(0));
            if(trigger) cur.setValue(GrayIncrementer.nextGray(cur.getValue()));
            state.setPort(1, cur.getValue(), 9);
        }
    
        public void paintInstance(InstancePainter painter) {
            // Im Prinzip genauso, wie bei dem SimpleGrayCounter, abgesehen vom
            // Aufruf von painter.drawLabel um die Beschriftung zu zeichnen.
            painter.drawBounds();
            painter.drawClock(0, Direction.EAST);
            painter.drawPort(1);
            painter.drawLabel();
            
            if(painter.getShowState()) {
                BitWidth width = painter.getAttributeValue(StdAttr.WIDTH);
                CounterData state = CounterData.get(painter, width);
                Bounds bds = painter.getBounds();
                GraphicsUtil.drawCenteredText(painter.getGraphics(),
                        StringUtil.toHexString(width.getWidth(), state.getValue().toIntValue()),
                        bds.getX() + bds.getWidth() / 2,
                        bds.getY() + bds.getHeight() / 2);
            }
        }
    }
    

    CounterPoker

    package com.cburch.gray;
    
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.event.KeyEvent;
    import java.awt.event.MouseEvent;
    
    import com.cburch.logisim.data.BitWidth;
    import com.cburch.logisim.data.Bounds;
    import com.cburch.logisim.data.Value;
    import com.cburch.logisim.instance.InstancePainter;
    import com.cburch.logisim.instance.InstancePoker;
    import com.cburch.logisim.instance.InstanceState;
    import com.cburch.logisim.instance.StdAttr;
    
    /** Wenn der Anwender den Zähler mit dem Schaltwerkzeug anklickt, wird ein CounterPoker-Objekt
     * erzeugt, daß die Benutzerereignisse behandelt. Beachten Sie, daß
     * CounterPoker eine spezifische Klasse von GrayCounter ist, und daß es eine
     * Unterklasse von InstancePoker aus dem  com.cburch.logisim.instance-Paket sein muß. */
    public class CounterPoker extends InstancePoker {
        public CounterPoker() { }
    
        /** Legt fest, ob die Position des Mausklicks eine Bearbeitung 
         * zur Folge haben soll. 
         */
        public boolean init(InstanceState state, MouseEvent e) {
            return state.getInstance().getBounds().contains(e.getX(), e.getY());
                // Ein Mausklick irgendwo im Hauptrechteck löst eine Bearbeitung aus. Der Anwender hat vielleicht auf die Beschriftung geklickt,
                // dies läge aber außerhalb der Begrenzung.
        }
    
        / ** Zeichnet einen Indikator dafür, daß der Eingabebereich ausgewählt wurde. Jetzt zeichnen wir
         * ein rotes Rechteck um den Wert. */
        public void paint(InstancePainter painter) {
            Bounds bds = painter.getBounds();
            BitWidth width = painter.getAttributeValue(StdAttr.WIDTH);
            int len = (width.getWidth() + 3) / 4;
    
            Graphics g = painter.getGraphics();
            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);
        }
    
        /** Bearbeitet einen Tastendruck, indem es diesen einfach an das Ende des aktuellen Wertes stellt. */
        public void keyTyped(InstanceState state, KeyEvent e) {
            // wandelt um in eine hexadezimale Ziffer, wenn es keine gültige Ziffer ist, wird abgebrochen.
            int val = Character.digit(e.getKeyChar(), 16);
            BitWidth width = state.getAttributeValue(StdAttr.WIDTH);
            if(val < 0 || (val & width.getMask()) != val) return;
    
            // berechne den nächsten Wert
            CounterData cur = CounterData.get(state, width);
            int newVal = (cur.getValue().toIntValue() * 16 + val) & width.getMask();
            Value newValue = Value.createKnown(width, newVal);
            cur.setValue(newValue);
            state.fireInvalidated();
            
            // Sie könnten versucht sein, den Wert jetzt direkt über
            // state.setPort auszugeben. Aber die Schaltung könnte gerade an einer Stelle beschäftigt sein
            // und der direkte Zugriff auf setPort könnte hier
            // störend eingreifen. Die Benutzung von fireInvalidated benachrichtigt die Aktualisierungsroutine
            // den Wert des Zählers bei nächster Gelegenheit weiterzuleiten.
        }
    }
    

    Weiter: Richtlinien.

    logisim-2.7.1/doc/de/html/guide/index.html0000644000175000017500000000514411541757120020264 0ustar vincentvincent Der Leitfaden für Logisim-Anwender

    Der Leitfaden für Logisim-Anwender

    Logisim ist ein Unterrichtswerkzeug zur Entwicklung und Simulation digitaler Schaltungen. Mit seiner übersichtlichen Benutzerschnittstelle und der laufenden Simulation der Schaltung, während Sie diese aufbauen, ist das Programm in der Lage, die Grundbegriffe digitaler Schaltungen zu vermitteln. Mit der Möglichkeit, größere Schaltungen aus kleineren Teilschaltungen heraus zu konstruieren, und ganze Kabelbündel mit einem einzigen Mausbewegung zu verlegen, kann (und wird) Logisim dazu benutzt, ganze Mikroprozessoren im Unterricht zu simulieren.

    Logisim wird von Studenten an Hochschulen und Universitäten in der ganzen Welt für eine Vielzahl von Aufgaben verwendet, zum Beispiel:

    • Als ein Modul allgemeinbildenden Informatikschulungen
    • Als Unterrischtsblock für Informatikstudenten im zweiten Studienjahr
    • In ganzsemestrigen Vorlesungen zur Computerarchitektur

    Der Leitfaden für Logisim-Anwender, den Sie gerade lesen, ist die offizielle Referenz zu den Programmfunktionen von Logisim. Der erste Teil besteht aus einer Reihe von Abschnitten, die den Aufbau von Logisim erklären. Dese Abschnitte sind so geschrieben, daß Sie diese an einem Stück lesen können, um sich mit den wichtigsten Merkmalen von Logisim vertraut zu machen.

    Einführung für Anfänger
    Bibliotheken und Attribute
    Teilschaltungen
    Leitungsbündel
    Kombinatorische Analyse

    Die übrigen Abschnitte sind eine bunte Mischung von Referenzmaterial und Erklärungen aus den Tiefen von Logisim.

    Menüreferenz
    Speicherbauelemente
    Ablaufverfolgung
    Benutzung der Kommandozeile
    Programmbezogene Einstellungen
    Projektbezogene Einstellungen
    Weiterleitung von Werten
    JAR-Bibliotheken
    Über das Programm
    logisim-2.7.1/doc/de/html/guide/bundles/0000755000175000017500000000000011541757120017717 5ustar vincentvincentlogisim-2.7.1/doc/de/html/guide/bundles/splitting.html0000644000175000017500000000677411541757120022640 0ustar vincentvincent Verteiler

    Verteiler

    Wenn Sie mit Mehrbit-Werten arbeiten, werden Sie häufig den Wunsch haben, einzelne Bits in verschiedene Richtungen weiterzuleiten. Das Verteiler-Werkzeug () aus der Basisbibliothek von Logisim steht Ihnen hierfür zur Verfügung.

    Wenn wir einmal annehmen, Sie möchten eine Schaltung aufbauen, die die bitweise AND-Verknüpfung der beiden Nibbles (die oberen vier Bit und die unteren vier Bit) eines acht-Bit Einganges berechnen soll. Wir haben es dann mit einem acht-Bit-Wert zu tun, der vom Eingangspin geliefert wird, und wir müssen diesen Wert in zwei vier-Bit-Werte aufspalten. In der folgenden Schaltung benutzen wir einen Verteiler, um dies zu erreichen: der acht-Bit-Wert wird an den Verteiler geleitet (der einer Vogelkralle ähnelt). Dieser teilt den acht-Bit-Wert in zwei vier-Bit-Werte auf, die dann an ein AND-Gatter weitergeleitet werden, um das Ergebnis zu berechnen.

    In diesem Beispiel teilt der Verteiler einen ankommenden Wert in mehrere herausgehende Werte auf. Aber Verteiler können auch dazu verwendet werden, mehrere Werte zu einem Wert zusammenzufügen. In der Tat haben diese Verteiler keine feste Richtung: zu einem Zeitpunkt können Werte in der einen Richtung durchgeschickt werden, und zu einem anderen Zeitpunkt in der anderen. Werte können sogar in beiden Richtungen gleichzeitig transportiert werden, wie in dem nächsten Beispiel. Dort läuft der Wert zunächst in östlicher Richtung durch die zwei Verteiler, wird dann in die umgekehrte Richtung umgelenkt, läuft in westlicher Richtung zurück durch die Verteiler, bevor es noch einmal umgedreht wird, und nach einem weiteren Transport in östlicher Richtung durch die Verteiler den Ausgang erreicht.

    Der Schlüssel zum Verständnis von Verteilern liegt in deren Attributen. Im Folgenden bezeichnet ein aufgespaltenes Ende eine von mehreren Leitungenauf der einen Seite, während der Ausdruck zusammengeführtes Ende die einzelne Leitung der anderen Seite bezeichnet.

    • Das Attribut Ausrichtung bezeichnet, wie die aufgespaltenen Enden im Verhältnis zum zusammengeführten Ende liegen.
    • Das Attribut Ausfächerung gibt an, wieviele aufgespaltene Enden vorhanden sind.
    • Das Attribut Bitbreite gibt die Bitbreite des zusammengeführten Endes an.
    • Das Attribut Bit x bezieht sich auf das Bit x des zusammengeführten Endes. Wenn mehrere Bits demselben aufgespaltenen Ende zugeordnet werden, dann entspricht deren relative Reihenfolge der Reihenfolge dieser Bits im zusammengeführten Ende. Verteiler in Logisim können kein Bit des zusammengeführten Endes auf mehrere aufgespaltene Enden gleichzeitig weiterleiten.

    Beachten Sie, daß jede Änderung der Ausfächerung oder der Bitbreite alle Bit x-Attribute so zurücksetzen wird, daß diese Bits so gleichmäßig wie möglich auf die aufgespaltenen Enden verteilt werden.

    Weiter: Farben der Leitungen.

    logisim-2.7.1/doc/de/html/guide/bundles/index.html0000644000175000017500000000146411541757120021721 0ustar vincentvincent Leitungsbündel

    Leitungsbündel

    In einfacheren Schaltungen in Logisim werden Leitungen häufig nur einzelne Bits transportieren. Aber Logisim erlaubt es Ihnen auch Leitungsbündel zu erstellen, die mehrere Bits auf einmal übertragen. Die Anzahl der Bits, die gleichzeitig auf einem solchen Bündel transportiert werden, ist dessen Bitbreite.

    Erstellen von Leitungsbündeln
    Verteiler
    Farben der Leitungen

    Weiter: Erstellen von Leitungsbündeln.

    logisim-2.7.1/doc/de/html/guide/bundles/creating.html0000644000175000017500000000506711541757120022411 0ustar vincentvincent Erstellen von Leitungsbündeln

    Erstellen von Leitungsbündeln

    Jedem Eingang und jedem Ausgang eines jeden Bauelements ist eine bestimmte Bitbreite zugeordnet. Häufig handelt es sich um eine Breite von einem Bit, die sich auch nicht ändern läßt. Aber viele der eingebauten Bauelemente in Logisim besitzen eine einstellbare Bitbreite an ihren Ein- und Ausgängen.

    In der folgenden Bildschirmkopie wird eine Testschaltung gezeigt, die die bitweise AND-Verknüpfung zweier drei Bit breiter Eingangswerte durchführt. Sehen Sie, wie das drei Bit breite Ausgangssignal die bitweise Verknüpfung der zwei Eingangssignale darstellt. In diesem Beispiel wurden alle Bauelemente über das Datenbits-Attribut auf eine Breite von drei Bit konfiguriert. Dies sehen Sie in der Bildschirmkopie an dem Wert 3 für das Datenbits-Feld.

    Alle Bauelemente von Logisim legen die Bitbreite ihrer Ein- und Ausgänge fest. Die Bitbreite einer Leitung dagegen ist undefiniert. Erst wenn die Leitung an ein Bauelement angeschlossen wird, paßt sich diese an dessen Bitbreite an. Wenn eine Leitung an zwei Komponenten mit unterschiedlicher Bitbreite angeschlossen wird, meldet Logisim dies mit der Fehlermeldung "Breiten nicht kompatibel" und die betroffene Leitung wird in Orange dargestellt. In dem folgenden Bild wurde die Bitbreite des Ausgangs-Pins auf 1 gesetzt, und Logisim beklagt sich entsprechend.

    Leitungen, die inkompatible Anschlüsse verbinden (und daher in Orange dargestellt werden), führen keine Werte.

    Im Fall von Einzelbit-Leitungen sehen Sie auf einen Blick, welchen Wert die Leitung gerade führt, denn Logisim färbt diese Leitungen hellgrün oder dunkelgrün, abhängig vom aktuellen Wert auf der Leitung. Für Mehrbit-Leitungen werden keine Werte auf diese Weise dargestellt: diese Leitungen sind immer schwarz. Sie können eine solche Leitung aber mit dem Schaltwerkzeug () anklicken.

    Diese Testfunktion ist besonders hilfreich bei der Verwendung von Mehrbit-Leitungen.

    Weiter: Verteiler.

    logisim-2.7.1/doc/de/html/guide/bundles/colors.html0000644000175000017500000000511611541757120022111 0ustar vincentvincent Farben der Leitungen

    Farben der Leitungen

    Jetzt sind wir in der Lage, die gesamte Farbpalette zusammenzufassen, die Logisim für Leitungen verwendet. In der folgenden kleinen Schaltung sehen Sie alle diese Farben auf einen Blick.

    • Grau: Die Bitbreite der Leitung ist unbekannt. Dies kommt daher, weil diese Leitung noch nicht an den Ein- oder Ausgang irgendeines Bauelements angeschlossen ist. (Alle Ein- und Ausgänge haben eine definierte Bitbreite.)

    • Blau: Die Leitung trägt einen Einzelbit-Wert, aber derzeit ist der Zustand der Leitung nicht festgelegt. Hier nennen wir dies ein potenzialfreies Bit; manchmal wird es auch als ein hochohmiger Wert bezeichnet. In diesem Beispiel treibt ein threestate-Ausgang die Leitung, daher kann es einen potenzialfreien Wert ausgeben.

    • Dunkelgrün: Die Leitung führt ein einzelnes 0-Bit.

    • Hellgrün: Die Leitung führt ein einzelnes 1-Bit.

    • Schwarz: Die Leitung führt ein mehrere Bit breites Wort. Einige oder alle einzelnen Bits können nicht angegeben werden.

    • Rot: Die Leitung führt ein fehlerhaftes Signal. Dies kann passieren, wenn ein Gatter den richtigen Ausgangswert nicht berechnen kann, zum Beispiel weil dessen Eingänge nicht definiert sind. Es kann auch dadurch verursacht werden, daß zwei Bauelemente versuchen, verschiedene Werte gleichzeitig über dieselbe Leitung zu senden. Dies ist in der obigen Schaltung der Fall, in der ein Eingangspin eine 0 auf die Leitung gibt, während ein anderer Eingangspin eine 1 auf dieselbe Leitung geben will, und es damit zum Konflikt kommt. Leitungen mit einer Breite von mehreren Bits werden rot dargestellt, wenn auch nur ein einzelnes Bit einen fehlerhaften Wert aufweist.

    • Orange: Die an die Leitung angeschlossenen Bauelemente besitzen unterschiedliche Bitbreiten. Eine orange Leitung ist tatsächlich außer Funktion: es werden keine Werte zwischen den Bauelementen ausgetauscht. Im Beispiel wurde ein zwei-Bit-Bauelement an ein ein-Bit-Bauelement angeschlossen.

    Weiter: Leitfaden für Benutzer von Logisim.

    logisim-2.7.1/doc/de/html/guide/attrlib/0000755000175000017500000000000011541757120017724 5ustar vincentvincentlogisim-2.7.1/doc/de/html/guide/attrlib/tool.html0000644000175000017500000000563511541757120021600 0ustar vincentvincent Werkzeugattribute

    Werkzeugattribute

    Auch jedes Werkzeug zum Hinzufügen von Bauelementen zu einer Schaltung hat einen Satz von Attributen, die an die mit dem Werkzeug erstellten Bauelement weitergegeben werden. Diese Attribute der Bauelemente lassen sich später ändern, ohne die Werkzeugattribute zu beeinflussen. Wenn Sie ein Werkzeug auswählen, wird Logisim die Attribute dieses Werkzeugs in der Attribut-Tabelle anzeigen.

    Nehmen wir an, Sie möchten zum Beispiel kleinere AND-Gatter erstellen. Zunächst wird das AND-Werkzeug immer große AND-Gatter erstellen. Wenn Sie aber das Attribut zur Gattergröße direkt ändern (bevor Sie das AND-Gatter in der Schaltung platzieren), dann ändern Sie das Attribut des Werkzeugs. Jedes weitere AND-Gatter, das Sie danach mit dem Werkzeug einfügen, wird die kleinere Größe aufweisen.

    Jetzt können Sie die beiden existierenden AND-Gatter löschen, und stattdessen zwei neue AND-Gatter an deren Stelle einfügen. Diesmal handelt es sich um kleine Gatter. (Wenn Sie gleichzeitig noch die Anzahl der Eingänge auf 3 reduzieren, dann entfallen die vertikalen Erweiterungsstriche an den Gattern. Sie müßten dann aber auch die Schaltung neu verdrahten, weil die bisherigen Leitungen die Eingänge des Gatters nicht mehr treffen würden.)

    Bei einigen Werkzeugen, spiegelt das Werkzeug-Symbol einige der Attribute wieder. Ein solches Beispiel ist das Pin-Werkzeug, dessen Symbol in die gleiche Richtung zeigt, wie dies durch das Ausrichtungs-Attribut vorgegeben ist.

    Die Werkzeuge auf der Werkzeugleiste haben einen separaten Satz von Attributen zu den gleichen Werkzeugen aus dem Übersichtsfenster. Daher wird das AND-Werkzeug aus der Gatter-Bibliothek auch weiterhin breite Gatter erstellen, wenn Sie jetzt das Attribut zur Gattergröße für das AND-Werkzeug der Werkzeugleiste geändert haben.

    Tatsächlich sind die Werkzeuge für Eingangs- und Ausgangs-Pins der Werkzeugleiste Instanzen des Pin-Werkzeugs aus der Basis-Bibliothek, haben aber andere Sätze von Attributen. Das Symbol des Pin-Werkzeugs wird als Kreis oder Quadrat dargestellt, abhängig vom Werkzeug-Attribut "Ausgang?".

    Logisim bietet einen bequemen Tastaturbefehl zur Änderung des Ausrichtungs-Attributs, das bestimmt, in welche Richtung ein Bauelement zeigt. Wenn Sie eine der Pfeiltasten betätigen, nachdem Sie das entsprechende Werkzeug ausgewählt haben, ändert sich direkt die Ausrichtung des Bauelements.

    Weiter: Leitfaden für Benutzer von Logisim.

    logisim-2.7.1/doc/de/html/guide/attrlib/index.html0000644000175000017500000000145111541757120021722 0ustar vincentvincent Bibliotheken und Attribute

    Bibliotheken und Attribute

    In diesem Abschnitt wird Ihnen gezeigt, wie Sie mit den zwei Hauptregionen des Programmfensters von Logisim arbeiten können: dem Übersichtsfenster und der Attribut-Tabelle.

    Das Übersichtsfenster
    Die Attribut-Tabelle
    Werkzeug- und Bauelementattribute

    Weiter: Das Übersichtsfenster.

    logisim-2.7.1/doc/de/html/guide/attrlib/explore.html0000644000175000017500000001070011541757120022266 0ustar vincentvincent Das Übersichtsfenster

    Das Übersichtsfenster

    Logisim verwaltet seine Werkzeuge in Bibliotheken. Diese werden als Verzeichnisse im Übersichtsfenster angezeigt. Um auf die Bauelemente einer Bibliothek zuzugreifen, brauchen Sie lediglich auf das entsprechende Verzeichnis doppelzuklicken. Hier sehen Sie die geöffnete Gatter-Bibliothek mit dem ausgewählten NAND-Gatter. Logisim ist jetzt dazu bereit NAND-Gatter zur Schaltung hinzuzufügen.

    Wenn Sie sich jetzt die Auswahl in der Gatter-Bibliothek ansehen, so werden Sie bemerken, daß wir eigentlich gar keine XOR-Schaltung hätten entwickeln müssen: ein solches Gatter ist bereits Bestandteil von Logisim.

    Wenn Sie ein neues Projekt anlegen, so enthält dieses automatisch bereits die folgenden Bibliotheken:

    • Basis: Werkzeuge, die fester Bestandteil von Logisim sind.
    • Gatter: Bauelemente, die einfache logische Funktionen durchführen.
    • Auswahlschaltungen: komplexere kombinatorische Bauelemente, wie Multiplexer und Dekoder.
    • Arithmetik: Bauelemente, die arithmetische Funktionen ausführen.
    • Speicher: Bauelemente, die Daten speichern können, wie Flip-Flops, Register und RAM.
    • Eingabe/Ausgabe: Bauelemente zur Interaktion mit dem Anwender.

    Über das Untermenü "Bibliothek laden" aus dem Projektmenü können Sie weitere Bibliotheken hinzufügen. Logisim besitzt drei Gruppen von Bibliotheken.

    • Eingebaute Bibliotheken sind Bibliotheken, die fester Bestandteil von Logisim sind. Diese sind in der Bibliotheksreferenz dokumentiert.

    • Logisim-Bibliotheken sind in Logisim entwickelte Projekte, die als Logisim-Projekte gespeichert wurden. Sie können eine Reihe von Schaltungen in einem einzelnen Projekt aufbauen (wie im Abschnitt Teilschaltungen dieses Leitfadens beschrieben), und diese dann später als Bibliothek für andere Projekte benutzen.

    • JAR-Bibliotheken sind Bibliotheken, die in Java erstellt werden, aber nicht fester Bestandteil von Logisim sind. Sie können fertige JAR-Bibliotheken von anderen Autoren herunterladen, oder Ihre eigenen erstellen, wie im Abschnitt JAR-Bibliotheken dieses Leitfadens beschrieben. Die Entwicklung einer JAR-Bibliothek ist aufwendiger, als die Erstellung einer Logisim-Bibliothek, aber die damit erstellten Bauelemente sind flexibler und erlauben sowohl die Vergabe von Attributen, als auch die Interaktion mit dem Anwender. Die eingebauten Bibliotheken (mit Ausnahme der Basis-Bibliothek) sind mit demselben API entwickelt worden, das auch die JAR-Bibliotheken benutzen können. Hieran können Sie den Umfang der Funktionen erkennen, die mit JAR-Bibliotheken verwirklicht werden können.

      Einige JAR-Bibliotheken enthalten keinen Hinweis darauf, welche Java-Klasse der Bibliothek gestartet werden soll. Wenn Sie eine solche JAR-Bibliothek laden, wird Logisim Sie zur Eingabe des Namens der entsprechenden Klasse auffrodern. Der Name dieser Klasse sollte Ihnen vom Ersteller der JAR-Bibliothek mitgeteilt werden.

    Um eine Bibliothek wieder zu entfernen, wählen Sie den Punkt "Bibliotheken entfernen..." aus dem Projektmenü. Logisim erlaubt es Ihnen nicht, Bibliotheken zu entfernen, deren Bauelemente in einer Schaltung verwendet werden, die auf der Werkzeugleiste angezeigt wird, oder einer Maustaste zugeordnet ist.

    Streng genommen enthält eine Bibliothek übrigens Werkzeuge, keine Bauelemente. So finden Sie in der Basis-Bibliothek das Schaltwerkzeug (), das Bearbeitungswerkzeug () und andere Werkzeuge, die keinen direkten Bezug zu einem spezifischen Bauelement aufweisen. Die meisten Bibliotheken enthalten aber Werkzeuge zum Hinzufügen individueller Bauelemente. Alle eingebauten Bibliotheken mit Ausnahme der Basis-Bibliothek sind auf diese Weise aufgebaut.

    Weiter: Die Attribut-Tabelle.

    logisim-2.7.1/doc/de/html/guide/attrlib/attr.html0000644000175000017500000000512511541757120021567 0ustar vincentvincent Die Attribut-Tabelle

    Die Attribut-Tabelle

    Viele Bauelemente besitzen Attribute, die das Verhalten und Aussehen des Bauelements steuern. Die Attribut-Tabelle dient der Anzeige und Bearbeitung der Werte dieser Attribute.

    Um auszuwählen, für welches Bauelement die Attribiute angezeigt oder bearbeitet werden sollen, klicken Sie das Bauelemente mit dem Bearbeitungswerkzeug an (). (Sie können das Bauelemente auch mit der rechten Maustaste (Control-Klick bei Mac OS X) anklicken, und den Punkt "Attribute anzeigen" aus dem Kontextmenü auswählen. Auch, wenn Sie das Bauelement mit dem Schaltwerkzeug () oder dem Textwerkzeug () bearbeiten, werden Ihnen die Attribute dieses Bauelements angezeigt.

    Die folgende Bildschirmkopie zeigt Ihnen, wie es aussieht, wenn Sie den oberen Eingang unserer XOR-Schaltung anklicken, und dann die Attribut-Tabelle bis zum Beschriftungsfeld durchblättern.

    Um ein Attribut zu ändern, klicken Sie auf dessen Wert. Das Aussehen der Schnittstelle zur Bearbeitung des Attributs hängt von der Art des jeweiligen Attributs ab: für das Attributfeld der Schriftart einer Beschriftung erscheint ein Dialogfenster zur Auswahl der Schriftart, für ein Beschriftungsfeld gibt es ein Textfeld und für wieder andere Felder erhalten Sie ein Ausklappmenü mit mehreren Auswahlmöglichkeiten (z.B. für die Ausrichtung der Beschriftung).

    Jede Art von Bauelement hat einen anderen Satz von Attributen. Ein Beschreibung, was diese im Einzelnen bedeuten, finden Sie in der Bauelementereferenz der Dokumentation.

    Wenn mehrere Bauelemente ausgewählt sind, werden in der Tabelle nur die Attribute angezeigt, die diese Bauelemente gemeinsam haben. Mit ausgewählte Leitungen spielen hierbei keine Rolle. Wenn die ausgewählten Bauelemente unterschiedliche Werte für ein Attribut aufweisen, dann wird der Wert dieses Attributs als leer angezeigt. Änderungen eines solchen gemeinsamen Attributs wirken sich unmittelbar auf alle ausgewählten Bauelemente aus.

    Weiter: Werkzeugattribute.

    logisim-2.7.1/doc/de/html/guide/analyze/0000755000175000017500000000000011541757120017726 5ustar vincentvincentlogisim-2.7.1/doc/de/html/guide/analyze/table.html0000644000175000017500000000712611541757120021711 0ustar vincentvincent Bearbeiten der Wahrheitstabelle

    Bearbeiten der Wahrheitstabelle

    Wenn Sie das Kombinatorikfenster öffnen, werden Sie sehen, daß es fünf Registerkarten enthält.

    Diese Seite wird die ersten drei Registerkarten beschreiben: Eingänge, Ausgänge und Tabelle. Die nächste Seite des Leitfadens beschreibt die letzten zwei Registerkarten: Ausdruck und Kleinstmöglich.

    Die Registerkarten Eingänge und Ausgänge

    Die Registerkarte der Eingänge erlaubt es Ihnen, sich die Liste der Eingänge anzusehen, und diese zu bearbeiten. Um neue Eingänge hinzuzufügen, tragen Sie den gewünschten Namen im Eingabefeld unten im Fensterbereich ein, und klicken dann auf Hinzufügen. Wenn Sie einen bereits definierten Eingang umbenennen möchten, so markieren Sie diesen in der Liste im oberen Bereich, dann tragen Sie den neuen Namen in das Eingabefeld ein, und klicken auf Umbenennen.

    Um einen Eingang zu entfernen, wählen Sie diesen in der Liste aus, und klicken auf Entfernen. Sie können auch die Reihenfolge der Eingänge in der Tabelle ändern (was sich auf die Reihenfolge der Spalten in der Wahrheitstabelle und auf die erzeugte Schaltung auswirken wird), indem Sie die Schaltflächen "Nach oben" und "Nach unten" benutzen, nachdem Sie einen Eingang in der Liste markiert haben.

    Alle Aktionen wirken sich unmittelbar auf die Wahrheitstabelle aus.

    Die Registerkarte der Ausgänge verwenden Sie auf genau dieselbe Weise, nur bezieht sich diese natürlich auf die Ausgänge.

    Die Registerkarte "Tabelle"

    Das einzige Element auf der Registerkarte der Wahrheitstabelle ist die aktuelle Wahrheitstabelle. Diese wird auf gängige Art dargestellt, mit den Spalten, die die Eingänge repräsentieren, auf der linken Seite und den Ausgängen auf der rechten Seite.

    Sie können die einzelnen Werte in den Ausgangsspalten durch Anklicken mit der Maus ändern. Die angeklickten Positionen rotieren durch die Werte 0, 1 und x (für einen beliebigen Zustand, "don't care"). Wie wir auf der nächsten Seite sehen werden, so geben beliebige Zustände eine gewisse Flexibilität bei der Berechnung der kleinstmöglichen Ausdrücke.

    Sie können auch mit der Tastatur durch die Wahrheitstabelle navigieren. Und Sie können Werte über die Zwischenablage kopieren und einfügen. Die Zwischenablage kann mit jedem anderen Programm ausgetauscht werden, das durch Tabulatoren getrennten Text unterstützt (wie z.B. eine Tabellenkalkulation).

    Wenn die Wahrheitstabelle aus der Analyse einer existierenden Schaltung stammt, dann werden Sie eventuell rosa Felder mit "!!" in einigen Feldern der Ausgangsspalten vorfinden. Diese entsprechen Fehlern, die bei der Berechnung der Ausgangswerte der entsprechenden Zeile aufgetreten sind - entweder, weil die Schaltung offenbar oszillierte, oder weil der Ausgang einen fehlerhaften Wert aufgewiesen hat (was im Schaltbild durch eine rote Leitung angezeigt wird). Wenn Sie den Mauszeiger über das entsprechende Feld schieben, wird Ihnen in einem Hinweis angezeigt, um was für einen Fehler es sich tatsächlich gehandelt hat. Wenn Sie ein solches, fehlerbehaftetes Feld einmal angeklickt haben, kommen Sie automatisch in die 0-1-x-Folge, und es gibt keinen Weg mehr zurück.

    Weiter: Erstellen von Ausdrücken .

    logisim-2.7.1/doc/de/html/guide/analyze/open.html0000644000175000017500000001215511541757120021561 0ustar vincentvincent Starten der Kombinatorik

    Starten der Kombinatorik

    Die Hauptfunktionen des Kombinatorikmoduls sind über ein einziges Dialogfenster zu erreichen. In diesem Fenster lassen sich Wahrheitstabellen und boolesche Ausdrücke bearbeiten. Dieses Fenster läßt sich auf zweierlei Weise öffnen.

    Über das Fenstermenü

    Wählen Sie den Punkt Kombinatorik und das Fenster des Kombinatorikmoduls wird geöffnet. Wenn Sie das Fenster zum ersten Mal aufrufen, wird es keinerlei Schaltungsdetails enthalten.

    Unabhängig davon, wieviele Logisim-Projekte Sie gleichzeitig geöffnet haben, so wird es nur ein gemeinsames Kombinatorikfenster geben. Es gibt keine Möglichkeit, gleichzeitig mit mehreren Kombinatorikfenstern zu arbeiten.

    Über das Projektmenü

    Aus dem Bearbeitungsfenster einer Schaltung heraus, können Sie Logisim dazu veranlassen, diese Schaltung zu analisieren, indem Sie die Funktion "Schaltung analysieren" aus dem Projektmenü aufrufen. Bevor Logisim das entsprechende Fenster öffnet, wird das Programm die booleschen Ausdrücke und die Wahrheitstabelle der dargestellten Schaltung berechnen. Diese werden Ihnen dann im Dialogfenster angezeigt.

    Damiut diese Analyse erfolgreich durchgeführt werden kann, muß jeder Eingang der Schaltung an einen Eingangspin und jeder Ausgang an einen Ausgangspin angeschlossen sein. Logisim ist nur in der Lage, Schaltungen mit bis zu jeweils acht Ein- und Ausgängen zu analysieren. Diese Pins müssen Einzelbitanschlüsse sein. Anderenfalls wird Ihnen eine entsprechende Fehlermeldung angezeigt werden, und das Kombinatorikfenster wird nicht geöffnet.

    Bei der Erstellung der booleschen Ausdrücke zur Funktion einer Schaltung, wird Logisim zunächst von der exakten Abfolge der Gatter in der Schaltung ausgehen. Aber wenn die Schaltung komplexere Bauelemente (z.B. Multiplexer) enthält, oder wenn die Schaltung mehr als 100 Ebenen aufweist (was ziemlich unwahrscheinlich sein dürfte), dann wird Ihnen in einem entsprechenden Fenster angezeigt, daß Logisim nicht in der Lage war, die booleschen Ausdrücke herzuleiten. Stattdessen wird Logisim dann neue Ausdrücke aus der Wahrheitstabelle ableiten, die durch ein konsequentes Durchtesten aller möglichen Eingangskombinationen erstellt wird.

    Nach erfolgter Analyse der Funktion der Schaltung, existiert keine weitere Verbindung zwischen der ursprünglichen Schaltung und dem Kombinatorikfenster mehr. Das bedeutet insbesondere, daß spätere Änderungen an der Schaltung nicht im Kombinatorikfenster berücksichtigt werden, und daß Änderungen an der Wahrheitstabelle oder der booleschen Ausdrücke im Kombinatorikfenster keinerlei Einfluß auf die ursprüngliche Schaltung haben. Natürlich steht es Ihnen jederzeit frei, die Schaltung erneut analysieren zu lassen. Und wie wir später sehen werden, so können Sie die bestehende Schaltung durch eine neue Schaltung ersetzen lassen, die auf den aktuellen Werten des Kombinatorikfensters basiert.

    Begrenzungen

    Logisim wird nicht versuchen, die genaue Funktion einer sequentielle Schaltung zu analysieren: wenn Sie dennoch eine solche Schaltung anaIysieren lassen, so wird das Programm zwar eine Wahrheitstabelle und die zugehörigen booleschen Ausdrücke erstellen, aber diese werden das wirkliche Verhalten der Schaltung nicht korrekt wiedergeben. (Es läßt sich beweisen, daß eine Analyse einer sequentiellen Schaltung nicht möglich ist, da dies einer Lösung des Halteproblems gleichkommt. Natürlich würden Sie erwarten, daß Logisim zumindest versuchen würde, z.B. nach Flip-Flops oder rückgeführten Leitungen zu suchen - aber das amcht das Programm nicht.) Daher sollten Sie die kombinatorische Analyse nicht unkritisch benutzen: Nur wenn Sie sicher sind, daß Ihre Schaltung wirklich kombinatorisch ist, sollten Sie diese Funktion benutzen!

    Logisim wird Änderungen an Ihrer Schaltung vornehmen, die Sie vielleicht nicht erwarten würden: die kombinatorische Analyse erfordert, daß jeder Ein- und Ausgang einen eindeutigen Namen besitzt, der den Regeln für Bezeichner unter Java genügt. (Grob gesagt muß jedes Zeichen entweder ein Buchstabe oder eine Ziffer sein, und das erste Zeichen muß ein Buchstabe sein. Keine Leerzeichen sind erlaubt!) Das Programm versucht zunächst, bereits vorhandene Bezeichnungen zu verwenden. Wenn keine Bezeichnung existiert, wird eine intern vorgegebene Liste mit Bezeichnungen verwendet. Wenn eine existierende Bezeichnung nicht den Anforderungen an einen Java-Bezeichner genügt, wird Logisim versuchen, soweit möglich, aus der vorhandenen Bezeichnung einen gültigen Namen zu erzeugen.

    Übrigens hängt die Reihenfolge der Eingänge in der Wahrheitstabelle von der Position der Eingänge in der Schaltung ab, von links nach rechts und von oben nach untern. (Dasselbe gilt auch für die Reihenfolge der Ausgänge.)

    Weiter: Bearbeiten der Wahrheitstabelle .

    logisim-2.7.1/doc/de/html/guide/analyze/index.html0000644000175000017500000000330611541757120021725 0ustar vincentvincent Kombinatorik

    Kombinatorik

    Alle digitalen Schaltungen fallen in eine von zwei Kategorien: in kombinatorische Netzwerke, in denen alle Ausgänge direkte logische Verknüpfungen der Eingänge sind, und in sequentielle Netzwerke, in denen einige Ausgänge auf früheren Zuständen der Eingänge basieren können (in einer zeitlichen Sequenz).

    Schaltungen der kombinatorischen Kategorie sind die einfacheren Fälle. In der Praxis kennt man drei Hauptmethoden, das Verhalten kombinatorischer Netzwerke zu beschreiben.

    • Logische Schaltungen
    • Boolesche Ausdrücke, die eine algebraische Darstellung der Funktion der Schaltung erlauben
    • Wahrheitstabellen, die alle möglichen Kombinationen der Eingänge und deren Auswirkungen auf die Ausgänge auflisten
    Das Kombinatorikmodul von Logisim erlaubt es Ihnen, in allen Richtugnen zwischen diesen drei Darstellungen zu wechseln. Dies Funktion ist besonders hilfreich bei der Erstellung und für das Verständnis von Schaltungen mit einer Handvoll von Einzelbiteingängen und -ausgängen.

    Starten der Kombinatorik
    Bearbeiten der Wahrheitstabelle
    Erstellen von Ausdrücken
    Erstellen einer Schaltung

    Weiter: Starten der Kombinatorik.

    logisim-2.7.1/doc/de/html/guide/analyze/gen.html0000644000175000017500000000417211541757120021371 0ustar vincentvincent Erstellen einer Schaltung

    Erstellen einer Schaltung

    Die Schaltfläche "Schaltung aufbauen" läßt Logisim eine Schaltung entwerfen, deren Gatter den aktuellen Ausdrücken der einzelnen Ausgänge entsprechen. Die Ein- und Ausgänge der Schaltung werden in derselben Reihenfolge erstellt und dargestellt, mit der diese in den Registerkarten für Ein- und Ausgänge festgelegt worden sind. Generell wird eine atraktive Schaltung aufgebaut werden, und tatsächlich ist eine Funktion des Kombinatorik-Moduls von Logisim, schlecht gezeichnete Schaltungsdiagramme zu verschönern. Aber, wie immer bei einer automatischen Formatierung, wird die aufgebaute Schaltung nicht die gleichen strukturellen Details aufweisen, wie eine von Menschenhand gezeichnete.

    Wenn Sie auf die Schaltfläche zum Aufbau der Schaltung klicken, wird Ihnen ein Dialogfenster präsentiert. In diesem geben Sie an, in welchem Projekt und mit welchem Namen die Schaltung aufgebaut werden soll. Wenn Sie den Namen einer bereits existierenden Schaltung angeben, wird diese überschrieben (nachdem Sie in einem weiteren Fenster bestätigt haben, daß dies wirklich passieren soll).

    Der Dialog zum Aufbau der Schaltung bietet Ihnen zwei Wahlmöglichkeiten. Der Punkt "Nur Gatter mit zwei Eingängen" legt fest, daß ausschließlich Gatter mit zwei Eingängen verwendet werden sollen. (Inverter sind natürlich nicht an diese Regel gebunden.) Der Punkt "nur NAND-Gatter" legt fest, daß ausschließlich NAND-Gatter zur Verwirklichung der booleschen Ausdrücke verwendet werden sollen. Beide Punkte lassen sich kombinieren, so daß ausschließlich NAND-Gatter mit zwei Eingängen verwendet werden.

    Logisim kann keine Schaltung ausschließlich aus NAND-Gattern aufbauen, die XOR-Terme enthält. Dieser Punkt ist daher deaktiviert, wenn die logischen Ausdrücke XOR-Verknüpfungen enthalten.

    Weiter: Leitfaden für Benutzer von Logisim.

    logisim-2.7.1/doc/de/html/guide/analyze/expr.html0000644000175000017500000001246111541757120021576 0ustar vincentvincent Erstellen von Ausdrücken

    Erstellen von Ausdrücken

    Für jede Ausgangsvariable enthält das Fenster zur kombinatorischen Analyse zwei Strukturen - die entsprechende Spalte in der Wahrheitstabelle und ein boolescher Ausdruck - die angeben, wie jede Ausgabe mit den Eingängen zusammenhängt. Sie können die Wahrheitstabelle oder den booleschen Ausdruck bearbeiten, die jeweils andere Struktur wird automatisch entsprechend aktualisiert

    Wie wir auf der nächsten Seite sehen werden, sind die booleschen Ausdrücke besonders wichtig, denn die kombinatorische Analyse von Logisim geht von diesen aus, wenn die Schaltung automatisch konstruiert werden soll.

    Sie können sich die Ausdrücke mit Hilfe der letzten beiden letzten Registerkarten "Ausdruck" und "Kleinstmöglich" ansehen und bearbeiten.

    Die Registerkarte "Ausdruck"

    Die Registerkarte "Ausdruck" erlaubt es Ihnen, die booleschen Ausdrücke jeder einzelnen Ausgangsvariable anzusehen und zu bearbeiten. Im Auswahlfeld oben auf der Registerkarte "Ausgang" wählen Sie den gewünschten Ausgang.

    Direkt unter dieser Auswahl wird Ihnen dann der Ausdruck in der gängigen Schreibweise dargestellt, wo eine OR-Verknüpfung (ODER) als Addition und eine AND-Verknüpfung (UND) als Multiplikation geschrieben wird. Eine Negation wird durch einen Strich oberhalb des entsprechenden Teilausdruckes angezeigt.

    Das Textfeld darunter stellt denselben Ausdruck in einer ASCII-Form dar. Hier wird eine Negation durch eine vorangestellte Tilde ('~') dargestellt.

    Sie können den Ausdruck im Textfeld bearbeiten. Die Bearbeitung schließen Sie ab, indem Sie die Eingabetaste betätigen oder auf die entsprechende Schaltfläche klicken. Damit wird dann auch automatisch die Wahrheitstabelle entsprechend aktualisiert. Die Schaltfläche "Löschen" entfernt den Ausdruck aus dem Textfeld, und die Schaltfläche "Zurücknehmen" macht die letzten Änderungen Rückgängig und stellt den vorhergehenden Zustand wieder her.

    Beachten Sie, daß Ihre Änderungen am booleschen Ausdruck verloren gehen, wenn Sie die Wahrheitstabelle bearbeiten.

    Zusätzlich zu Multiplikation und Addition für AND und OR darf der von Ihnen eingegebene Ausdruck die unter C/Java üblichen, logischen Operatoren, als auch die entsprechenden Wörter selbst verwendet werden.

    höchste Priorität~ ! NOT
    (kein Zeichen) & && AND
    ^ XOR
    niedrigste Priorität+ | || OR
    Die folgenden Beispiele sind allesamt gültige Darstellungen desselben Ausdrucks. Sie dürfen die Ausdrücke auch mischen.
    ~a (b + c)
    !a && (b || c)
    NOT a AND (b OR c)
    Im allgemeinen spielen Klammern innerhalb einer Folge von AND-Verknpfungen (oder OR oder XOR) keine Rolle. (Bei der Erstellung einer entsprechenden Schaltung wird Logisim derartige Klammern ignorieren.)

    Die Registerkarte "Kleinstmöglich"

    Die letzte Registerkarte stellt einen minimalen Produktsummenausdruck für jeweils eine Spalte der Wahrheitstabelle dar. Mit dem Auswahlfeld oben auf der Seite bestimmen Sie, für welchen Ausgang dieser minimale Ausdruck dargestellt werden soll.

    Für den Fall von vier oder weniger Eingängen wird auch ein Karnaughdiagramm für die ausgewählte Variable dargestellt. Durch Klicken in das Karnaughdiagramm können Sie die einzelnen Einträge der zugehörigen Wahrheitstabelle ändern. Im Karnaughdiagramm werden die Produktterme des kleinstmöglichen Ausdrucks als halbdurchsichtige Rechtecke mit abgerundeten Ecken dargestellt.

    Darunter wird der kleinstmögliche Ausdruck selbst angezeigt. Die Formatierung entspricht derjenigen auf der Registerkarte "Ausdruck". Für mehr als vier Eingänge wird das Karnaughdiagramm nicht angezeigt, der zugehörige, kleinstmögliche Ausdruck wird aber trotzdem berechnet. (Logisim verwendet den Quine-McCluskey-Algorithmus für die Berechnung des kleinstmöglichen Ausdrucks. Das Ergebnis entspricht dem eines Karnaughdiagrammes, kann aber für eine beliebige Anzahl von Eingängen berechnet werden.)

    Mittels der Schaltfläche "Als Ausdruck festlegen" übernehmen Sie den dargestellten, kleinstmöglichen Ausdruck als Ausdruck für den gewählten Ausgang. Normalerweise wird dies nicht notwendig sein, weil Bearbeitungen der Wahrheitstabelle automatisch zu einem kleinstmöglichen Ausdruck der entsprechenden Spalte führen. Wenn Sie aber einen Ausdruck im über die Registerkarte "Ausdruck" bearbeitet haben, so können Sie diesen in eine kleinstmögliche Form bringen lassen.

    Weiter: Das Erstellen einer Schaltung.

    logisim-2.7.1/doc/de/html/guide/about/0000755000175000017500000000000011541757120017375 5ustar vincentvincentlogisim-2.7.1/doc/de/html/guide/about/index.html0000644000175000017500000001260211541757120021373 0ustar vincentvincent Über das Programm

    Über das Programm

    Logisim ist Software mit offenem Quellkode. Der vollständige Quellkode ist im Unterverzeichnis src des JAR-Archives enthalten.

    Bitte teilen Sie dem Programmautoren mit, wenn Sie Logisim brauchbar finden und benutzen. Insbesondere, wenn Sie Logisim für Schulungs- und Ausbildungszwecke einsetzen. Diese Information kann dem Autoren helfen, weitere Unterstützung für die Arbeit an Logisim zu bekommen.

    Der Autor begrüßt alle Emails über Logisim, einschließlich Berichte über Fehler, Vorschläge und Verbesserungen. Wenn Sie sich per Email an den Autoren wenden, dann vergessen Sie bitte nicht, daß dieser hart an dem Programm gearbeitet hat, ohne irgendeine Bezahlung von Ihnen bekommen zu haben. Wenn Sie das Recht für eine Beschwerde wünschen, dann empfehlen wir Ihnen, das Geld für eine Lizenz eines konkurrierenden Programmes auszugeben. (Uns sind derzeit keine kommerziellen Programme bekannt, die an den Funktionsumfang von Logisim herankommen.) Auf jeden Fall aber ist der Programmautor daran interessiert, das Programm weiter zu verbessern, und Ihre Vorschläge dazu sind sehr willkommen.

    Copyright-Hinweis

    Copyright (c) 2005, Carl Burch.

    Logisim ist kostenlose Software. Sie können das Programm in Übereinstimmung mit der GNU General Public License weiterverbreiten und/oder modifizieren. Es gilt die Version 2 der Lizenz, oder (wie Sie wünschen) eine beliebige, neuere Version.

    Logisim wird mit der Hoffnung herausgegeben, daß es nützlich ist, aber es kommt OHNE JEDE GARANTIE; dies schließt auch die Abwesenheit einer Garantie für MARKTREIFE oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK mit ein. Bitte sehen Sie sich die GNU General Public License für weitere Einzelheiten an.

    Danksagungen

    Der Quellkode zu Logisim ist im Wesentlichen das Werk des Autoren. Der Autor möchte an dieser Stelle seinen Arbeitgebern danken, die seine Arbeit als Professor, inklusive der Programmierung finanzieren: die Entwicklung wurde an der Saint John's University (Collegeville, Minnesota, USA) in den Jahren 2000-2004 angefangen und seit 2004 bis zum jetzigen Zeitpunkt am Hendrix College (Conway, Arkansas, USA) weitergeführt. Der Autor ist beiden Hochschulen zu Dank verpflichtet, daß ihm die Zeit und Ressourcen für dieses Projekt zur Verfügung gestellt worden sind. Wenn nur alle Hochschulen und Universitäten sich ähnlich um die Förderung von exzellentem Unterricht kümmern würden, wie diese beiden Schulen!

    Einige weitere Menschen, die besonders hilfreich gewesen sind:

    • Ilia Lilov, Pablo Leal Ramos und Uwe Zimmermann, die zu den Übersetzungen von Logisim beigetragen haben. Weitere Informationen zu den Übersetzungen finden Sie im Abschnitt zur Internationaliserung.
    • Die CS61C-Klasse der University of California, Berkeley aus dem Frühjahr 2005, die die Beta-Versionen von Logisim 2.0 über sich ergehen lassen mußten. Diese Studenten mußten mit vielen Fehlern leben, und der Autor ist sehr dankbar für die Geduld und die Anregungen der Studenten!
    • Die CSCI 150-Klassen am College of Saint Benedict und an der Saint John's University vom Frühjahr 2001, die die elementarsten Versionen von Logisim benutzt haben, als es gerade entwickelt wurde.

    Mehrere Teile von Logisim stammen aus Softwarepaketen, die von anderen Autoren entwickelt worden sind. Von diesen werden einige als Teil von Logisim verbreitet.

    die Java API von Sun (natürlicherweise)
    das JavaHelp-Projekt von Sun
    Stellt das eingebaute Hilfesystem aus dem Hilfemenü zur Verfügung.
    MRJAdapter von Steve Roy
    Zur Integration auf der Macintosh OS X-Plattform.
    launch4j von Grzegorz Kowalt
    Erlaubt die Verbreitung von Logisim als ausführbare Datei unter Windows.
    GIFEncoder von Adam Doppelt
    Speichert Bilder als GIF-Dateien. Dies wiederum ist auf C-Kode von Sverre H. Huseby aufgebaut.
    ColorPicker von Jeremy Wood
    Stellt den Farbauswahldialog zur Verfügung, der bei der Konfigurationen von Farben erscheint (zum Beispiel beim LED-Bauelement).
    JFontChooser von Christos Bohoris
    Stellt den Schriftartendialog zur Verfügung, der bei der Auswahl der Schriftart erscheint (zum Beispiel beim Schriftartenattribut der Beschriftung vieler Bauelemente).
    TableSorter, zugeschrieben Philip Milne, Brendon McLean, Dan van Enckevort, Parwinder Sekhon und ouroborus@ouroborus.org
    Erlaubt es, die Tabelle im Dialogfenster zur Schaltungsstatistik durch Klicken der Spaltenüberschriften zu sortieren.

    Und schließlich möchte der Autor allen Anwendern danken, die sich bei ihm gemeldet haben - sei es mit Fehlerberichten, mit Voraschlägen, oder mit der Mitteilung, daß sie Logisim im Unterricht einsetzen. Da der Autor nicht die ausdrückliche Einverständniserklärung besitzt, verbleiben diese Personen an dieser Stelle anonym, aber trotzdem: Danke!

    logisim-2.7.1/doc/de/html/guide/about/gpl_de.html0000644000175000017500000005564411541757120021533 0ustar vincentvincent Über das Programm

    Deutsche Übersetzung der GNU General Public License

    Erstellt im Auftrag der S.u.S.E. GmbH [suse@suse.de]
    von Katja Lachmann Übersetzungen [na194@fim.uni-erlangen.de],
    überarbeitet von Peter Gerwinski [peter.gerwinski@uni-essen.de] (31. Oktober 1996)

    Diese Übersetzung wird mit der Absicht angeboten, das Verständnis der GNU General Public License (GNU-GPL) zu erleichtern. Es handelt sich jedoch nicht um eine offizielle oder im rechtlichen Sinne anerkannte Übersetzung.

    Die Free Software Foundation (FSF) ist nicht der Herausgeber dieser Übersetzung, und sie hat diese Übersetzung auch nicht als rechtskräftigen Ersatz für die Original-GNU-GPL anerkannt. Da die Übersetzung nicht sorgfältig von Anwälten überprüft wurde, können die Übersetzer nicht garantieren, daß die Übersetzung die rechtlichen Aussagen der GNU-GPL exakt wiedergibt. Wenn Sie sichergehen wollen, daß von Ihnen geplante Aktivitäten im Sinne der GNU-GPL gestattet sind, halten Sie sich bitte an die englischsprachige Originalversion.

    Die Free Software Foundation möchte Sie darum bitten, diese Übersetzung nicht als offizielle Lizenzbedingungen für von Ihnen geschriebene Programme zu verwenden. Bitte benutzen Sie hierfür stattdessen die von der Free Software Foundation herausgegebene englischsprachige Originalversion.

    This is a translation of the GNU General Public License into German. This translation is distributed in the hope that it will facilitate understanding, but it is not an official or legally approved translation.

    The Free Software Foundation is not the publisher of this translation and has not approved it as a legal substitute for the authentic GNU General Public License. The translation has not been reviewed carefully by lawyers, and therefore the translator cannot be sure that it exactly represents the legal meaning of the GNU General Public License. If you wish to be sure whether your planned activities are permitted by the GNU General Public License, please refer to the authentic English version.

    The Free Software Foundation strongly urges you not to use this translation as the official distribution terms for your programs; instead, please use the authentic English version published by the Free Software Foundation.


    GNU General Public License

    Deutsche Übersetzung der Version 2, Juni 1991

    Copyright (C) 1989, 1991 Free Software Foundation, Inc.
    675 Mass Ave, Cambridge, MA 02139, USA

    Jeder hat das Recht, diese Lizenzurkunde zu vervielfältigen und unveränderte Kopien zu verbreiten; Änderungen sind jedoch nicht gestattet.

    Diese Übersetzung ist kein rechtskräftiger Ersatz für die englischsprachige Originalversion!

    Vorwort

    Die meisten Softwarelizenzen sind daraufhin entworfen worden, Ihnen die Freiheit zu nehmen, die Software weiterzugeben und zu verändern. Im Gegensatz dazu soll Ihnen die GNU General Public License, die allgemeine öffentliche GNU-Lizenz, ebendiese Freiheit garantieren. Sie soll sicherstellen, daß die Software für alle Benutzer frei ist. Diese Lizenz gilt für den Großteil der von der Free Software Foundation herausgegebenen Software und für alle anderen Programme, deren Autoren ihr Werk dieser Lizenz unterstellt haben. Auch Sie können diese Möglichkeit der Lizenzierung für Ihre Programme anwenden. (Ein anderer Teil der Software der Free Software Foundation unterliegt stattdessen der GNU Library General Public License, der allgemeinen öffentlichen GNU-Lizenz für Bibliotheken.)

    Die Bezeichnung "freie" Software bezieht sich auf Freiheit, nicht auf den Preis. Unsere Lizenzen sollen Ihnen die Freiheit garantieren, Kopien freier Software zu verbreiten (und etwas für diesen Service zu berechnen, wenn Sie möchten), die Möglichkeit, die Software im Quelltext zu erhalten oder den Quelltext auf Wunsch zu bekommen. Die Lizenzen sollen garantieren, daß Sie die Software ändern oder Teile davon in neuen freien Programmen verwenden dürfen - und daß Sie wissen, daß Sie dies alles tun dürfen.

    Um Ihre Rechte zu schützen, müssen wir Einschränkungen machen, die es jedem verbieten, Ihnen diese Rechte zu verweigern oder Sie aufzufordern, auf diese Rechte zu verzichten. Aus diesen Einschränkungen folgen bestimmte Verantwortlichkeiten für Sie, wenn Sie Kopien der Software verbreiten oder sie verändern.

    Beispielsweise müssen Sie den Empfängern alle Rechte gewähren, die Sie selbst haben, wenn Sie - kostenlos oder gegen Bezahlung - Kopien eines solchen Programms verbreiten. Sie müssen sicherstellen, daß auch sie den Quelltext erhalten bzw. erhalten können. Und Sie müssen ihnen diese Bedingungen zeigen, damit sie ihre Rechte kennen.

    Wir schützen Ihre Rechte in zwei Schritten: (1) Wir stellen die Software unter ein Urheberrecht (Copyright), und (2) wir bieten Ihnen diese Lizenz an, die Ihnen das Recht gibt, die Software zu vervielfältigen, zu verbreiten und/oder zu verändern.

    Um die Autoren und uns zu schützen, wollen wir darüberhinaus sicherstellen, daß jeder erfährt, daß für diese freie Software keinerlei Garantie besteht. Wenn die Software von jemand anderem modifiziert und weitergegeben wird, möchten wir, daß die Empfänger wissen, daß sie nicht das Original erhalten haben, damit von anderen verursachte Probleme nicht den Ruf des ursprünglichen Autors schädigen.

    Schließlich und endlich ist jedes freie Programm permanent durch Software-Patente bedroht. Wir möchten die Gefahr ausschließen, daß Distributoren eines freien Programms individuell Patente lizensieren - mit dem Ergebnis, daß das Programm proprietär würde. Um dies zu verhindern, haben wir klargestellt, daß jedes Patent entweder für freie Benutzung durch jedermann lizenziert werden muß oder überhaupt nicht lizenziert werden darf.

    Es folgen die genauen Bedingungen für die Vervielfältigung, Verbreitung und Bearbeitung:

    Bedingungen für die Vervielfältigung, Verbreitung und Bearbeitung

    Paragraph 0. Diese Lizenz gilt für jedes Programm und jedes andere Werk, in dem ein entsprechender Vermerk des Copyright-Inhabers darauf hinweist, daß das Werk unter den Bestimmungen dieser General Public License verbreitet werden darf. Im folgenden wird jedes derartige Programm oder Werk als "das Programm" bezeichnet; die Formulierung "auf dem Programm basierendes Werk" bezeichnet das Programm sowie jegliche Bearbeitung des Programms im urheberrechtlichen Sinne, also ein Werk, welches das Programm, auch auszugsweise, sei es unverändert oder verändert und/oder in eine andere Sprache übersetzt, enthält. (Im folgenden wird die Übersetzung ohne Einschränkung als "Bearbeitung" eingestuft.) Jeder Lizenznehmer wird im folgenden als "Sie" angesprochen.

    Andere Handlungen als Vervielfältigung, Verbreitung und Bearbeitung werden von dieser Lizenz nicht berührt; sie fallen nicht in ihren Anwendungsbereich. Der Vorgang der Ausführung des Programms wird nicht eingeschränkt, und die Ausgaben des Programms unterliegen dieser Lizenz nur, wenn der Inhalt ein auf dem Programm basierendes Werk darstellt (unabhängig davon, daß die Ausgabe durch die Ausführung des Programmes erfolgte). Ob dies zutrifft, hängt von den Funktionen des Programms ab.

    Paragraph 1. Sie dürfen auf beliebigen Medien unveränderte Kopien des Quelltextes des Programms, wie sie ihn erhalten haben, anfertigen und verbreiten. Voraussetzung hierfür ist, daß Sie mit jeder Kopie einen entsprechenden Copyright-Vermerk sowie einen Haftungsausschluß veröffentlichen, alle Vermerke, die sich auf diese Lizenz und das Fehlen einer Garantie beziehen, unverändert lassen und desweiteren allen anderen Empfängern des Programms zusammen mit dem Programm eine Kopie dieser Lizenz zukommen lassen.

    Sie dürfen für den eigentlichen Kopiervorgang eine Gebühr verlangen. Wenn Sie es wünschen, dürfen Sie auch gegen Entgelt eine Garantie für das Programm anbieten.

    Paragraph 2. Sie dürfen Ihre Kopie(n) des Programms oder eines Teils davon verändern, wodurch ein auf dem Programm basierendes Werk entsteht; Sie dürfen derartige Bearbeitungen unter den Bestimmungen von Paragraph 1 vervielfältigen und verbreiten, vorausgesetzt, daß zusätzlich alle folgenden Bedingungen erfüllt werden:

    (a)

    Sie müssen die veränderten Dateien mit einem auffälligen Vermerk versehen, der auf die von Ihnen vorgenommene Modifizierung und das Datum jeder Änderung hinweist.

    (b)

    Sie müssen dafür sorgen, daß jede von Ihnen verbreitete oder veröffentlichte Arbeit, die ganz oder teilweise von dem Programm oder Teilen davon abgeleitet ist, Dritten gegenüber als Ganzes unter den Bedingungen dieser Lizenz ohne Lizenzgebühren zur Verfügung gestellt wird.

    (c)

    Wenn das veränderte Programm normalerweise bei der Ausführung interaktiv Kommandos einliest, müssen Sie dafür sorgen, daß es, wenn es auf dem üblichsten Wege für solche interaktive Nutzung gestartet wird, eine Meldung ausgibt oder ausdruckt, die einen geeigneten Copyright-Vermerk enthält sowie einen Hinweis, daß es keine Gewährleistung gibt (oder anderenfalls, daß Sie Garantie leisten), und daß die Benutzer das Programm unter diesen Bedingungen weiter verbreiten dürfen. Auch muß der Benutzer darauf hingewiesen werden, wie er eine Kopie dieser Lizenz ansehen kann. (Ausnahme: Wenn das Programm selbst interaktiv arbeitet, aber normalerweise keine derartige Meldung ausgibt, muß Ihr auf dem Programm basierendes Werk auch keine solche Meldung ausgeben).

    Diese Anforderungen betreffen das veränderte Werk als Ganzes. Wenn identifizierbare Abschnitte des Werkes nicht von dem Programm abgeleitet sind und vernünftigerweise selbst als unabhängige und eigenständige Werke betrachtet werden können, dann erstrecken sich diese Lizenz und ihre Bedingungen nicht auf diese Abschnitte, wenn sie als eigenständige Werke verbreitet werden. Wenn Sie jedoch dieselben Abschnitte als Teil eines Ganzen verbreiten, das ein auf dem Programm basierendes Werk darstellt, dann muß die Verbreitung des Ganzen nach den Bedingungen dieser Lizenz erfolgen, deren Bedingungen für weitere Lizenznehmer somit auf die Gesamtheit ausgedehnt werden - und damit auf jeden einzelnen Teil, unabhängig vom jeweiligen Autor.

    Somit ist es nicht die Absicht dieses Abschnittes, Rechte für Werke in Anspruch zu nehmen oder zu beschneiden, die komplett von Ihnen geschrieben wurden; vielmehr ist es die Absicht, die Rechte zur Kontrolle der Verbreitung von Werken, die auf dem Programm basieren oder unter seiner auszugsweisen Verwendung zusammengestellt worden sind, auszuüben.

    Ferner bringt ein einfaches Zusammenstellen eines anderen Werkes, das nicht auf dem Programm basiert, zusammen mit dem Programm oder einem auf dem Programm basierenden Werk auf ein- und demselben Speicher- oder Vertriebsmedium das andere Werk nicht in den Anwendungsbereich dieser Lizenz.

    Paragraph 3. Sie dürfen das Programm (oder ein darauf basierendes Werk gemäß Paragraph 2) als Objectcode oder in ausführbarer Form unter den Bedingungen von Paragraph 1 und 2 vervielfältigen und verbreiten - vorausgesetzt, daß Sie außerdem eine der folgenden Leistungen erbringen:

    (a)

    Liefern Sie das Programm zusammen mit dem vollständigen zugehörigen maschinenlesbaren Quelltext auf einem für den Datenaustausch üblichen Medium aus, wobei die Verteilung unter den Bedingungen der Paragraphen 1 und 2 erfolgen muß. Oder:

    (b)

    Liefern Sie das Programm zusammen mit einem mindestens drei Jahre lang gültigen schriftlichen Angebot aus, jedem Dritten eine vollständige maschinenlesbare Kopie des Quelltextes zur Verfügung zu stellen - zu nicht höheren Kosten als denen, die durch den physikalischen Kopiervorgang anfallen -, wobei der Quelltext unter den Bedingungen der Paragraphen 1 und 2 auf einem für den Datenaustausch üblichen Medium weitergegeben wird. Oder:

    (c)

    Liefern Sie das Programm zusammen mit dem schriftlichen Angebot der Zurverfügungstellung des Quelltextes aus, das Sie selbst erhalten haben. (Diese Alternative ist nur für nicht-kommerzielle Verbreitung zulässig und nur, wenn Sie das Programm als Objectcode oder in ausführbarer Form mit einem entsprechenden Angebot gemäß Absatz b erhalten haben.)

    Unter dem Quelltext eines Werkes wird diejenige Form des Werkes verstanden, die für Bearbeitungen vorzugsweise verwendet wird. Für ein ausführbares Programm bedeutet "der komplette Quelltext": Der Quelltext aller im Programm enthaltenen Module einschließlich aller zugehörigen Modulschnittstellen-Definitionsdateien sowie der zur Compilation und Installation verwendeten Skripte. Als besondere Ausnahme jedoch braucht der verteilte Quelltext nichts von dem zu enthalten, was üblicherweise (entweder als Quelltext oder in binärer Form) zusammen mit den Hauptkomponenten des Betriebssystems (Kernel, Compiler usw.) geliefert wird, unter dem das Programm läuft - es sei denn, diese Komponente selbst gehört zum ausführbaren Programm.

    Wenn die Verbreitung eines ausführbaren Programms oder des Objectcodes dadurch erfolgt, daß der Kopierzugriff auf eine dafür vorgesehene Stelle gewährt wird, so gilt die Gewährung eines gleichwertigen Zugriffs auf den Quelltext als Verbreitung des Quelltextes, auch wenn Dritte nicht dazu gezwungen sind, den Quelltext zusammen mit dem Objectcode zu kopieren.

    Paragraph 4. Sie dürfen das Programm nicht vervielfältigen, verändern, weiter lizenzieren oder verbreiten, sofern es nicht durch diese Lizenz ausdrücklich gestattet ist. Jeder anderweitige Versuch der Vervielfältigung, Modifizierung, Weiterlizenzierung und Verbreitung ist nichtig und beendet automatisch Ihre Rechte unter dieser Lizenz. Jedoch werden die Lizenzen Dritter, die von Ihnen Kopien oder Rechte unter dieser Lizenz erhalten haben, nicht beendet, solange diese die Lizenz voll anerkennen und befolgen.

    Paragraph 5. Sie sind nicht verpflichtet, diese Lizenz anzunehmen, da Sie sie nicht unterzeichnet haben. Jedoch gibt Ihnen nichts anderes die Erlaubnis, das Programm oder von ihm abgeleitete Werke zu verändern oder zu verbreiten. Diese Handlungen sind gesetzlich verboten, wenn Sie diese Lizenz nicht anerkennen. Indem Sie das Programm (oder ein darauf basierendes Werk) verändern oder verbreiten, erklären Sie Ihr Einverständnis mit dieser Lizenz und mit allen ihren Bedingungen bezüglich der Vervielfältigung, Verbreitung und Veränderung des Programms oder eines darauf basierenden Werkes.

    Paragraph 6. Jedesmal, wenn Sie das Programm (oder ein auf dem Programm basierendes Werk) weitergeben, erhält der Empfänger automatisch vom ursprünglichen Lizenzgeber die Lizenz, das Programm entsprechend den hier festgelegten Bestimmungen zu vervielfältigen, zu verbreiten und zu verändern. Sie dürfen keine weiteren Einschränkungen der Durchsetzung der hierin zugestandenen Rechte des Empfängers vornehmen. Sie sind nicht dafür verantwortlich, die Einhaltung dieser Lizenz durch Dritte durchzusetzen.

    Paragraph 7. Sollten Ihnen infolge eines Gerichtsurteils, des Vorwurfs einer Patentverletzung oder aus einem anderen Grunde (nicht auf Patentfragen begrenzt) Bedingungen (durch Gerichtsbeschluß, Vergleich oder anderweitig) auferlegt werden, die den Bedingungen dieser Lizenz widersprechen, so befreien Sie diese Umstände nicht von den Bestimmungen dieser Lizenz. Wenn es Ihnen nicht möglich ist, das Programm unter gleichzeitiger Beachtung der Bedingungen in dieser Lizenz und Ihrer anderweitigen Verpflichtungen zu verbreiten, dann dürfen Sie als Folge das Programm überhaupt nicht verbreiten. Wenn zum Beispiel ein Patent nicht die gebührenfreie Weiterverbreitung des Programms durch diejenigen erlaubt, die das Programm direkt oder indirekt von Ihnen erhalten haben, dann besteht der einzige Weg, sowohl das Patentrecht als auch diese Lizenz zu befolgen, darin, ganz auf die Verbreitung des Programms zu verzichten.

    Sollte sich ein Teil dieses Paragraphen als ungültig oder unter bestimmten Umständen nicht durchsetzbar erweisen, so soll dieser Paragraph seinem Sinne nach angewandt werden; im übrigen soll dieser Paragraph als Ganzes gelten.

    Zweck dieses Paragraphen ist nicht, Sie dazu zu bringen, irgendwelche Patente oder andere Eigentumsansprüche zu verletzen oder die Gültigkeit solcher Ansprüche zu bestreiten; dieser Paragraph hat einzig den Zweck, die Integrität des Verbreitungssystems der freien Software zu schützen, das durch die Praxis öffentlicher Lizenzen verwirklicht wird. Viele Leute haben großzügige Beiträge zu dem großen Angebot der mit diesem System verbreiteten Software im Vertrauen auf die konsistente Anwendung dieses Systems geleistet; es liegt am Autor/Geber, zu entscheiden, ob er die Software mittels irgendeines anderen Systems verbreiten will; ein Lizenznehmer hat auf diese Entscheidung keinen Einfluß.

    Dieser Paragraph ist dazu gedacht, deutlich klarzustellen, was als Konsequenz aus dem Rest dieser Lizenz betrachtet wird.

    Paragraph 8. Wenn die Verbreitung und/oder die Benutzung des Programms in bestimmten Staaten entweder durch Patente oder durch urheberrechtlich geschützte Schnittstellen eingeschränkt ist, kann der Urheberrechtsinhaber, der das Programm unter diese Lizenz gestellt hat, eine explizite geographische Begrenzung der Verbreitung angeben, in der diese Staaten ausgeschlossen werden, so daß die Verbreitung nur innerhalb und zwischen den Staaten erlaubt ist, die nicht ausgeschlossen sind. In einem solchen Fall beinhaltet diese Lizenz die Beschränkung, als wäre sie in diesem Text niedergeschrieben.

    Paragraph 9. Die Free Software Foundation kann von Zeit zu Zeit überarbeitete und/oder neue Versionen der General Public License veröffentlichen. Solche neuen Versionen werden vom Grundprinzip her der gegenwärtigen entsprechen, können aber im Detail abweichen, um neuen Problemen und Anforderungen gerecht zu werden.

    Jede Version dieser Lizenz hat eine eindeutige Versionsnummer. Wenn in einem Programm angegeben wird, daß es dieser Lizenz in einer bestimmten Versionsnummer oder "jeder späteren Version" ("any later version") unterliegt, so haben Sie die Wahl, entweder den Bestimmungen der genannten Version zu folgen oder denen jeder beliebigen späteren Version, die von der Free Software Foundation veröffentlicht wurde. Wenn das Programm keine Versionsnummer angibt, können Sie eine beliebige Version wählen, die je von der Free Software Foundation veröffentlicht wurde.

    Paragraph 10. Wenn Sie den Wunsch haben, Teile des Programms in anderen freien Programmen zu verwenden, deren Bedingungen für die Verbreitung anders sind, schreiben Sie an den Autor, um ihn um die Erlaubnis zu bitten. Für Software, die unter dem Copyright der Free Software Foundation steht, schreiben Sie an die Free Software Foundation; wir machen zu diesem Zweck gelegentlich Ausnahmen. Unsere Entscheidung wird von den beiden Zielen geleitet werden, zum einen den freien Status aller von unserer freien Software abgeleiteten Werke zu erhalten und zum anderen das gemeinschaftliche Nutzen und Wiederverwenden von Software im allgemeinen zu fördern.

    Keine Gewährleistung

    Paragraph 11. Da das Programm ohne jegliche Kosten lizenziert wird, besteht keinerlei Gewährleistung für das Programm, soweit dies gesetzlich zulässig ist. Sofern nicht anderweitig schriftlich bestätigt, stellen die Copyright-Inhaber und/oder Dritte das Programm so zur Verfügung, "wie es ist", ohne irgendeine Gewährleistung, weder ausdrücklich noch implizit, einschließlich - aber nicht begrenzt auf - Marktreife oder Verwendbarkeit für einen bestimmten Zweck. Das volle Risiko bezüglich Qualität und Leistungsfähigkeit des Programms liegt bei Ihnen. Sollte sich das Programm als fehlerhaft herausstellen, liegen die Kosten für notwendigen Service, Reparatur oder Korrektur bei Ihnen.

    Paragraph 12. In keinem Fall, außer wenn durch geltendes Recht gefordert oder schriftlich zugesichert, ist irgendein Copyright-Inhaber oder irgendein Dritter, der das Programm wie oben erlaubt modifiziert oder verbreitet hat, Ihnen gegenüber für irgendwelche Schäden haftbar, einschließlich jeglicher allgemeiner oder spezieller Schäden, Schäden durch Seiteneffekte (Nebenwirkungen) oder Folgeschäden, die aus der Benutzung des Programms oder der Unbenutzbarkeit des Programms folgen (einschließlich - aber nicht beschränkt auf - Datenverluste, fehlerhafte Verarbeitung von Daten, Verluste, die von Ihnen oder anderen getragen werden müssen, oder dem Unvermögen des Programms, mit irgendeinem anderen Programm zusammenzuarbeiten), selbst wenn ein Copyright-Inhaber oder Dritter über die Möglichkeit solcher Schäden unterrichtet worden war.

    Ende der Bedingungen

    logisim-2.7.1/doc/de/html/guide/about/gpl.html0000644000175000017500000003640011541757120021050 0ustar vincentvincent Über das Programm
    		    GNU GENERAL PUBLIC LICENSE
    		       Version 2, June 1991
    
     Copyright (C) 1989, 1991 Free Software Foundation, Inc.
                           51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
     Everyone is permitted to copy and distribute verbatim copies
     of this license document, but changing it is not allowed.
    
    			    Preamble
    
      The licenses for most software are designed to take away your
    freedom to share and change it.  By contrast, the GNU General Public
    License is intended to guarantee your freedom to share and change free
    software--to make sure the software is free for all its users.  This
    General Public License applies to most of the Free Software
    Foundation's software and to any other program whose authors commit to
    using it.  (Some other Free Software Foundation software is covered by
    the GNU Library General Public License instead.)  You can apply it to
    your programs, too.
    
      When we speak of free software, we are referring to freedom, not
    price.  Our General Public Licenses are designed to make sure that you
    have the freedom to distribute copies of free software (and charge for
    this service if you wish), that you receive source code or can get it
    if you want it, that you can change the software or use pieces of it
    in new free programs; and that you know you can do these things.
    
      To protect your rights, we need to make restrictions that forbid
    anyone to deny you these rights or to ask you to surrender the rights.
    These restrictions translate to certain responsibilities for you if you
    distribute copies of the software, or if you modify it.
    
      For example, if you distribute copies of such a program, whether
    gratis or for a fee, you must give the recipients all the rights that
    you have.  You must make sure that they, too, receive or can get the
    source code.  And you must show them these terms so they know their
    rights.
    
      We protect your rights with two steps: (1) copyright the software, and
    (2) offer you this license which gives you legal permission to copy,
    distribute and/or modify the software.
    
      Also, for each author's protection and ours, we want to make certain
    that everyone understands that there is no warranty for this free
    software.  If the software is modified by someone else and passed on, we
    want its recipients to know that what they have is not the original, so
    that any problems introduced by others will not reflect on the original
    authors' reputations.
    
      Finally, any free program is threatened constantly by software
    patents.  We wish to avoid the danger that redistributors of a free
    program will individually obtain patent licenses, in effect making the
    program proprietary.  To prevent this, we have made it clear that any
    patent must be licensed for everyone's free use or not licensed at all.
    
      The precise terms and conditions for copying, distribution and
    modification follow.
    
    		    GNU GENERAL PUBLIC LICENSE
       TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
    
      0. This License applies to any program or other work which contains
    a notice placed by the copyright holder saying it may be distributed
    under the terms of this General Public License.  The "Program", below,
    refers to any such program or work, and a "work based on the Program"
    means either the Program or any derivative work under copyright law:
    that is to say, a work containing the Program or a portion of it,
    either verbatim or with modifications and/or translated into another
    language.  (Hereinafter, translation is included without limitation in
    the term "modification".)  Each licensee is addressed as "you".
    
    Activities other than copying, distribution and modification are not
    covered by this License; they are outside its scope.  The act of
    running the Program is not restricted, and the output from the Program
    is covered only if its contents constitute a work based on the
    Program (independent of having been made by running the Program).
    Whether that is true depends on what the Program does.
    
      1. You may copy and distribute verbatim copies of the Program's
    source code as you receive it, in any medium, provided that you
    conspicuously and appropriately publish on each copy an appropriate
    copyright notice and disclaimer of warranty; keep intact all the
    notices that refer to this License and to the absence of any warranty;
    and give any other recipients of the Program a copy of this License
    along with the Program.
    
    You may charge a fee for the physical act of transferring a copy, and
    you may at your option offer warranty protection in exchange for a fee.
    
      2. You may modify your copy or copies of the Program or any portion
    of it, thus forming a work based on the Program, and copy and
    distribute such modifications or work under the terms of Section 1
    above, provided that you also meet all of these conditions:
    
        a) You must cause the modified files to carry prominent notices
        stating that you changed the files and the date of any change.
    
        b) You must cause any work that you distribute or publish, that in
        whole or in part contains or is derived from the Program or any
        part thereof, to be licensed as a whole at no charge to all third
        parties under the terms of this License.
    
        c) If the modified program normally reads commands interactively
        when run, you must cause it, when started running for such
        interactive use in the most ordinary way, to print or display an
        announcement including an appropriate copyright notice and a
        notice that there is no warranty (or else, saying that you provide
        a warranty) and that users may redistribute the program under
        these conditions, and telling the user how to view a copy of this
        License.  (Exception: if the Program itself is interactive but
        does not normally print such an announcement, your work based on
        the Program is not required to print an announcement.)
    
    These requirements apply to the modified work as a whole.  If
    identifiable sections of that work are not derived from the Program,
    and can be reasonably considered independent and separate works in
    themselves, then this License, and its terms, do not apply to those
    sections when you distribute them as separate works.  But when you
    distribute the same sections as part of a whole which is a work based
    on the Program, the distribution of the whole must be on the terms of
    this License, whose permissions for other licensees extend to the
    entire whole, and thus to each and every part regardless of who wrote it.
    
    Thus, it is not the intent of this section to claim rights or contest
    your rights to work written entirely by you; rather, the intent is to
    exercise the right to control the distribution of derivative or
    collective works based on the Program.
    
    In addition, mere aggregation of another work not based on the Program
    with the Program (or with a work based on the Program) on a volume of
    a storage or distribution medium does not bring the other work under
    the scope of this License.
    
      3. You may copy and distribute the Program (or a work based on it,
    under Section 2) in object code or executable form under the terms of
    Sections 1 and 2 above provided that you also do one of the following:
    
        a) Accompany it with the complete corresponding machine-readable
        source code, which must be distributed under the terms of Sections
        1 and 2 above on a medium customarily used for software interchange; or,
    
        b) Accompany it with a written offer, valid for at least three
        years, to give any third party, for a charge no more than your
        cost of physically performing source distribution, a complete
        machine-readable copy of the corresponding source code, to be
        distributed under the terms of Sections 1 and 2 above on a medium
        customarily used for software interchange; or,
    
        c) Accompany it with the information you received as to the offer
        to distribute corresponding source code.  (This alternative is
        allowed only for noncommercial distribution and only if you
        received the program in object code or executable form with such
        an offer, in accord with Subsection b above.)
    
    The source code for a work means the preferred form of the work for
    making modifications to it.  For an executable work, complete source
    code means all the source code for all modules it contains, plus any
    associated interface definition files, plus the scripts used to
    control compilation and installation of the executable.  However, as a
    special exception, the source code distributed need not include
    anything that is normally distributed (in either source or binary
    form) with the major components (compiler, kernel, and so on) of the
    operating system on which the executable runs, unless that component
    itself accompanies the executable.
    
    If distribution of executable or object code is made by offering
    access to copy from a designated place, then offering equivalent
    access to copy the source code from the same place counts as
    distribution of the source code, even though third parties are not
    compelled to copy the source along with the object code.
    
      4. You may not copy, modify, sublicense, or distribute the Program
    except as expressly provided under this License.  Any attempt
    otherwise to copy, modify, sublicense or distribute the Program is
    void, and will automatically terminate your rights under this License.
    However, parties who have received copies, or rights, from you under
    this License will not have their licenses terminated so long as such
    parties remain in full compliance.
    
      5. You are not required to accept this License, since you have not
    signed it.  However, nothing else grants you permission to modify or
    distribute the Program or its derivative works.  These actions are
    prohibited by law if you do not accept this License.  Therefore, by
    modifying or distributing the Program (or any work based on the
    Program), you indicate your acceptance of this License to do so, and
    all its terms and conditions for copying, distributing or modifying
    the Program or works based on it.
    
      6. Each time you redistribute the Program (or any work based on the
    Program), the recipient automatically receives a license from the
    original licensor to copy, distribute or modify the Program subject to
    these terms and conditions.  You may not impose any further
    restrictions on the recipients' exercise of the rights granted herein.
    You are not responsible for enforcing compliance by third parties to
    this License.
    
      7. If, as a consequence of a court judgment or allegation of patent
    infringement or for any other reason (not limited to patent issues),
    conditions are imposed on you (whether by court order, agreement or
    otherwise) that contradict the conditions of this License, they do not
    excuse you from the conditions of this License.  If you cannot
    distribute so as to satisfy simultaneously your obligations under this
    License and any other pertinent obligations, then as a consequence you
    may not distribute the Program at all.  For example, if a patent
    license would not permit royalty-free redistribution of the Program by
    all those who receive copies directly or indirectly through you, then
    the only way you could satisfy both it and this License would be to
    refrain entirely from distribution of the Program.
    
    If any portion of this section is held invalid or unenforceable under
    any particular circumstance, the balance of the section is intended to
    apply and the section as a whole is intended to apply in other
    circumstances.
    
    It is not the purpose of this section to induce you to infringe any
    patents or other property right claims or to contest validity of any
    such claims; this section has the sole purpose of protecting the
    integrity of the free software distribution system, which is
    implemented by public license practices.  Many people have made
    generous contributions to the wide range of software distributed
    through that system in reliance on consistent application of that
    system; it is up to the author/donor to decide if he or she is willing
    to distribute software through any other system and a licensee cannot
    impose that choice.
    
    This section is intended to make thoroughly clear what is believed to
    be a consequence of the rest of this License.
    
      8. If the distribution and/or use of the Program is restricted in
    certain countries either by patents or by copyrighted interfaces, the
    original copyright holder who places the Program under this License
    may add an explicit geographical distribution limitation excluding
    those countries, so that distribution is permitted only in or among
    countries not thus excluded.  In such case, this License incorporates
    the limitation as if written in the body of this License.
    
      9. The Free Software Foundation may publish revised and/or new versions
    of the General Public License from time to time.  Such new versions will
    be similar in spirit to the present version, but may differ in detail to
    address new problems or concerns.
    
    Each version is given a distinguishing version number.  If the Program
    specifies a version number of this License which applies to it and "any
    later version", you have the option of following the terms and conditions
    either of that version or of any later version published by the Free
    Software Foundation.  If the Program does not specify a version number of
    this License, you may choose any version ever published by the Free Software
    Foundation.
    
      10. If you wish to incorporate parts of the Program into other free
    programs whose distribution conditions are different, write to the author
    to ask for permission.  For software which is copyrighted by the Free
    Software Foundation, write to the Free Software Foundation; we sometimes
    make exceptions for this.  Our decision will be guided by the two goals
    of preserving the free status of all derivatives of our free software and
    of promoting the sharing and reuse of software generally.
    
    			    NO WARRANTY
    
      11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
    FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
    OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
    PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
    OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
    MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
    TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
    PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
    REPAIR OR CORRECTION.
    
      12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
    WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
    REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
    INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
    OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
    TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
    YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
    PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
    POSSIBILITY OF SUCH DAMAGES.
    
    		     END OF TERMS AND CONDITIONS
    
    logisim-2.7.1/doc/de/html/contents.html0000644000175000017500000001643611541757120017723 0ustar vincentvincent

    Logisim Referenzen

    Leitfaden für Logisim-Anwender

  • Weiterleitung von Werten
  • JAR-Bibliotheken
  • Über das Programm
  • Bibliotheksreferenz

    logisim-2.7.1/doc/de/contents.xml0000644000175000017500000002303011541757152016604 0ustar vincentvincent logisim-2.7.1/COPYING.TXT0000644000175000017500000004313311541757214014606 0ustar vincentvincent GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. logisim-2.7.1/META-INF/0000755000175000017500000000000011541757222014230 5ustar vincentvincentlogisim-2.7.1/META-INF/MANIFEST.MF0000644000175000017500000000015411541757222015662 0ustar vincentvincentManifest-Version: 1.0 Created-By: 1.6.0_11 (Sun Microsystems Inc.) Main-Class: com.cburch.logisim.Main

    Назад к Справке по библиотеке