Package com.cburch.logisim.std.memory

Source Code of com.cburch.logisim.std.memory.RomAttributes

/* Copyright (c) 2010, 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<Attribute<?>> ATTRIBUTES = Arrays.asList(new Attribute<?>[] {
            Mem.ADDR_ATTR, Mem.DATA_ATTR, Rom.CONTENTS_ATTR
        });

    private static WeakHashMap<MemContents,RomContentsListener> listenerRegistry
        = new WeakHashMap<MemContents,RomContentsListener>();
    private static WeakHashMap<MemContents,HexFrame> windowRegistry
        = new WeakHashMap<MemContents,HexFrame>();

    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<Attribute<?>> getAttributes() {
        return ATTRIBUTES;
    }

    @Override
    @SuppressWarnings("unchecked")
    public <V> V getValue(Attribute<V> 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 <V> void setValue(Attribute<V> 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);
    }
}
TOP

Related Classes of com.cburch.logisim.std.memory.RomAttributes

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.