/*

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.
*/
#ifndef LOGICUNIT_H
#define LOGICUNIT_H

#include <QGraphicsPixmapItem>
#include <QList>
#include <QDebug>
#include <QtGui>





QT_BEGIN_NAMESPACE
class QPixmap;
class QGraphicsItem;
class QGraphicsScene;
class QTextEdit;
class QGraphicsSceneMouseEvent;
class QMenu;
class QGraphicsSceneContextMenuEvent;
class QPainter;
class QStyleOptionGraphicsItem;
class QWidget;
class QPolygonF;
QT_END_NAMESPACE

class Wire;


//we need to know odin to connect to it
#include "odininterface.h"


class LogicUnit : public QGraphicsPolygonItem
{
public:
    enum { Type = UserType + 15 };
    enum UnitType { LogicGate, Input, Output, Latch,
                    Clock, And, Or, Nand, Nor, Not,
                    Xor,Xnor, MUX, ADDER_FUNC, CARRY_FUNC,MINUS, MEMORY, MULTIPLY, ADD, Module};

    LogicUnit(QString name, UnitType unitType, QMenu *contextMenu,
        QGraphicsItem *parent = 0, QGraphicsScene *scene = 0);

    void removeConnection(Wire *wire);
    void removeConnections();
    UnitType unitType() const
        { return myUnitType; }
    QPolygonF polygon() const
        { return myPolygon; }
    void addConnection(Wire *wire);
    QPixmap* image() const;
    int type() const
        { return Type;}
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
    QString getName();
    QList<Wire *> getOutCons();
    QHash<QString, Wire *> getOutConsHash();
    QList<Wire *> getAllCons();
    void setLayer(int layer);
    int getLayer();
    void updateWires();
    void setName(QString name);
    int getOutValue(int pinNumber);
    int setOutValue(int pinNumber, int value, int cycle);
    void setOdinRef(nnode_t* odinNode);
    nnode_t* getOdinRef();
    bool hasOdinReference();
    QList<LogicUnit*> getParents();
    QList<LogicUnit*> getChildren();
    bool isHighlighted();
    void setHighlighted(bool value);
    void setCurrentCycle(int cycle);
    bool isShown();
    void setShown(bool value);
    void addPartner(LogicUnit* partner);
    bool hasModule;
    LogicUnit* getModule();
    int getMaxOutNumber();
    int getMaxNumber();
    void showActivity();
protected:
    void contextMenuEvent(QGraphicsSceneContextMenuEvent *event);
    QVariant itemChange(GraphicsItemChange change, const QVariant &value);

private:
    UnitType myUnitType;
    QPolygonF myPolygon;
    QPolygonF fullPolygon;
    QMenu *myContextMenu;
    QList<Wire *> wires;
    QString myName;
    int myIncount;
    int myLayer;
    QList< QList<int> > myOutVal;
    //a nodes partner is its module
    //a modules partner are the containing nodes
    QList<LogicUnit *> moduleViewPartners;
    nnode_t *myOdinNode;
    bool hasOdinNode;
    bool highlighted;
    bool shown;
    int myCurrentCycle;

    //module specific vars
    QList<LogicUnit*> outNodes;
};

#endif
