/**CFile**************************************************************** FileName [mvc.h] PackageName [MVSIS 2.0: Multi-valued logic synthesis system.] Synopsis [Data structure for MV cube/cover manipulation.] Author [MVSIS Group] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - February 1, 2003.] Revision [$Id: mvc.h,v 1.10 2003/05/02 23:23:59 wjiang Exp $] ***********************************************************************/ #ifndef ABC__misc__mvc__mvc_h #define ABC__misc__mvc__mvc_h //////////////////////////////////////////////////////////////////////// /// INCLUDES /// //////////////////////////////////////////////////////////////////////// #include #include "misc/extra/extra.h" ABC_NAMESPACE_HEADER_START //////////////////////////////////////////////////////////////////////// /// PARAMETERS /// //////////////////////////////////////////////////////////////////////// // this is the only part of Mvc package, which should be modified // when compiling the package for other platforms // these parameters can be computed but setting them manually makes it faster #define BITS_PER_WORD 32 // sizeof(Mvc_CubeWord_t) * 8 #define BITS_PER_WORD_MINUS 31 // the same minus 1 #define BITS_PER_WORD_LOG 5 // log2(sizeof(Mvc_CubeWord_t) * 8) #define BITS_DISJOINT ((Mvc_CubeWord_t)0x55555555) // the mask of the type "01010101" #define BITS_FULL ((Mvc_CubeWord_t)0xffffffff) // the mask of the type "11111111" // uncomment this macro to switch to standard memory management //#define USE_SYSTEM_MEMORY_MANAGEMENT //////////////////////////////////////////////////////////////////////// /// STRUCTURE DEFINITIONS /// //////////////////////////////////////////////////////////////////////// // cube/list/cover/data typedef unsigned int Mvc_CubeWord_t; typedef struct MvcCubeStruct Mvc_Cube_t; typedef struct MvcListStruct Mvc_List_t; typedef struct MvcCoverStruct Mvc_Cover_t; typedef struct MvcDataStruct Mvc_Data_t; typedef struct MvcManagerStruct Mvc_Manager_t; // the cube data structure struct MvcCubeStruct { Mvc_Cube_t * pNext; // the next cube in the linked list unsigned iLast : 24; // the index of the last word unsigned nUnused : 6; // the number of unused bits in the last word unsigned fPrime : 1; // marks the prime cube unsigned fEssen : 1; // marks the essential cube unsigned nOnes; // the number of 1's in the bit data Mvc_CubeWord_t pData[1]; // the first Mvc_CubeWord_t filled with bit data }; // the single-linked list of cubes in the cover struct MvcListStruct { Mvc_Cube_t * pHead; // the first cube in the list Mvc_Cube_t * pTail; // the last cube in the list int nItems; // the number of cubes in the list }; // the cover data structure struct MvcCoverStruct { int nWords; // the number of machine words int nUnused; // the number of unused bits in the last word int nBits; // the number of used data bits in the cube Mvc_List_t lCubes; // the single-linked list of cubes Mvc_Cube_t ** pCubes; // the array of cubes (for sorting) int nCubesAlloc; // the size of allocated storage int * pLits; // the counter of lit occurrances in cubes Mvc_Cube_t * pMask; // the multipurpose mask Mvc_Manager_t * pMem; // the memory manager }; // data structure to store information about MV variables struct MvcDataStruct { Mvc_Manager_t * pMan; // the memory manager // Vm_VarMap_t * pVm; // the MV variable data int nBinVars; // the number of binary variables Mvc_Cube_t * pMaskBin; // the mask to select the binary bits only Mvc_Cube_t ** ppMasks; // the mask to select each MV variable Mvc_Cube_t * ppTemp[3]; // the temporary cubes }; // the manager of covers and cubes (as of today, only managing memory) struct MvcManagerStruct { Extra_MmFixed_t * pManC; // the manager for covers Extra_MmFixed_t * pMan1; // the manager for 1-word cubes Extra_MmFixed_t * pMan2; // the manager for 2-word cubes Extra_MmFixed_t * pMan4; // the manager for 3-word cubes }; //////////////////////////////////////////////////////////////////////// /// MACRO DEFINITIONS /// //////////////////////////////////////////////////////////////////////// // reading data from the header of the cube #define Mvc_CubeReadNext(Cube) ((Cube)->pNext) #define Mvc_CubeReadNextP(Cube) (&(Cube)->pNext) #define Mvc_CubeReadLast(Cube) ((Cube)->iLast) #define Mvc_CubeReadSize(Cube) ((Cube)->nOnes) // setting data to the header of the cube #define Mvc_CubeSetNext(Cube,Next) ((Cube)->pNext = (Next)) #define Mvc_CubeSetLast(Cube,Last) ((Cube)->iLast = (Last)) #define Mvc_CubeSetSize(Cube,Size) ((Cube)->nOnes = (Size)) // checking the number of words #define Mvc_Cube1Words(Cube) ((Cube)->iLast == 0) #define Mvc_Cube2Words(Cube) ((Cube)->iLast == 1) #define Mvc_CubeNWords(Cube) ((Cube)->iLast > 1) // getting one data bit #define Mvc_CubeWhichWord(Bit) ((Bit) >> BITS_PER_WORD_LOG) #define Mvc_CubeWhichBit(Bit) ((Bit) & BITS_PER_WORD_MINUS) // accessing individual bits #define Mvc_CubeBitValue(Cube, Bit) (((Cube)->pData[Mvc_CubeWhichWord(Bit)] & (((Mvc_CubeWord_t)1)<<(Mvc_CubeWhichBit(Bit)))) > 0) #define Mvc_CubeBitInsert(Cube, Bit) ((Cube)->pData[Mvc_CubeWhichWord(Bit)] |= (((Mvc_CubeWord_t)1)<<(Mvc_CubeWhichBit(Bit)))) #define Mvc_CubeBitRemove(Cube, Bit) ((Cube)->pData[Mvc_CubeWhichWord(Bit)] &= ~(((Mvc_CubeWord_t)1)<<(Mvc_CubeWhichBit(Bit)))) // accessing values of the binary variables #define Mvc_CubeVarValue(Cube, Var) (((Cube)->pData[Mvc_CubeWhichWord(2*(Var))] >> (Mvc_CubeWhichBit(2*(Var)))) & ((Mvc_CubeWord_t)3)) // various macros // cleaning the data bits of the cube #define Mvc_Cube1BitClean( Cube )\ ((Cube)->pData[0] = 0) #define Mvc_Cube2BitClean( Cube )\ (((Cube)->pData[0] = 0),\ ((Cube)->pData[1] = 0)) #define Mvc_CubeNBitClean( Cube )\ {\ int _i_;\ for( _i_ = (Cube)->iLast; _i_ >= 0; _i_--)\ (Cube)->pData[_i_] = 0;\ } // cleaning the unused part of the lat word #define Mvc_CubeBitCleanUnused( Cube )\ ((Cube)->pData[(Cube)->iLast] &= (BITS_FULL >> (Cube)->nUnused)) // filling the used data bits with 1's #define Mvc_Cube1BitFill( Cube )\ (Cube)->pData[0] = (BITS_FULL >> (Cube)->nUnused); #define Mvc_Cube2BitFill( Cube )\ (((Cube)->pData[0] = BITS_FULL),\ ((Cube)->pData[1] = (BITS_FULL >> (Cube)->nUnused))) #define Mvc_CubeNBitFill( Cube )\ {\ int _i_;\ (Cube)->pData[(Cube)->iLast] = (BITS_FULL >> (Cube)->nUnused);\ for( _i_ = (Cube)->iLast - 1; _i_ >= 0; _i_-- )\ (Cube)->pData[_i_] = BITS_FULL;\ } // complementing the data bits #define Mvc_Cube1BitNot( Cube )\ ((Cube)->pData[0] ^= (BITS_FULL >> (Cube)->nUnused)) #define Mvc_Cube2BitNot( Cube )\ (((Cube)->pData[0] ^= BITS_FULL),\ ((Cube)->pData[1] ^= (BITS_FULL >> (Cube)->nUnused))) #define Mvc_CubeNBitNot( Cube )\ {\ int _i_;\ (Cube)->pData[(Cube)->iLast] ^= (BITS_FULL >> (Cube)->nUnused);\ for( _i_ = (Cube)->iLast - 1; _i_ >= 0; _i_-- )\ (Cube)->pData[_i_] ^= BITS_FULL;\ } #define Mvc_Cube1BitCopy( Cube1, Cube2 )\ (((Cube1)->pData[0]) = ((Cube2)->pData[0])) #define Mvc_Cube2BitCopy( Cube1, Cube2 )\ ((((Cube1)->pData[0]) = ((Cube2)->pData[0])),\ (((Cube1)->pData[1])= ((Cube2)->pData[1]))) #define Mvc_CubeNBitCopy( Cube1, Cube2 )\ {\ int _i_;\ for (_i_ = (Cube1)->iLast; _i_ >= 0; _i_--)\ ((Cube1)->pData[_i_]) = ((Cube2)->pData[_i_]);\ } #define Mvc_Cube1BitOr( CubeR, Cube1, Cube2 )\ (((CubeR)->pData[0]) = ((Cube1)->pData[0] | (Cube2)->pData[0])) #define Mvc_Cube2BitOr( CubeR, Cube1, Cube2 )\ ((((CubeR)->pData[0]) = ((Cube1)->pData[0] | (Cube2)->pData[0])),\ (((CubeR)->pData[1]) = ((Cube1)->pData[1] | (Cube2)->pData[1]))) #define Mvc_CubeNBitOr( CubeR, Cube1, Cube2 )\ {\ int _i_;\ for (_i_ = (Cube1)->iLast; _i_ >= 0; _i_--)\ (((CubeR)->pData[_i_]) = ((Cube1)->pData[_i_] | (Cube2)->pData[_i_]));\ } #define Mvc_Cube1BitExor( CubeR, Cube1, Cube2 )\ (((CubeR)->pData[0]) = ((Cube1)->pData[0] ^ (Cube2)->pData[0])) #define Mvc_Cube2BitExor( CubeR, Cube1, Cube2 )\ ((((CubeR)->pData[0]) = ((Cube1)->pData[0] ^ (Cube2)->pData[0])),\ (((CubeR)->pData[1]) = ((Cube1)->pData[1] ^ (Cube2)->pData[1]))) #define Mvc_CubeNBitExor( CubeR, Cube1, Cube2 )\ {\ int _i_;\ for (_i_ = (Cube1)->iLast; _i_ >= 0; _i_--)\ (((CubeR)->pData[_i_]) = ((Cube1)->pData[_i_] ^ (Cube2)->pData[_i_]));\ } #define Mvc_Cube1BitAnd( CubeR, Cube1, Cube2 )\ (((CubeR)->pData[0]) = ((Cube1)->pData[0] & (Cube2)->pData[0])) #define Mvc_Cube2BitAnd( CubeR, Cube1, Cube2 )\ ((((CubeR)->pData[0]) = ((Cube1)->pData[0] & (Cube2)->pData[0])),\ (((CubeR)->pData[1]) = ((Cube1)->pData[1] & (Cube2)->pData[1]))) #define Mvc_CubeNBitAnd( CubeR, Cube1, Cube2 )\ {\ int _i_;\ for (_i_ = (Cube1)->iLast; _i_ >= 0; _i_--)\ (((CubeR)->pData[_i_]) = ((Cube1)->pData[_i_] & (Cube2)->pData[_i_]));\ } #define Mvc_Cube1BitSharp( CubeR, Cube1, Cube2 )\ (((CubeR)->pData[0]) = ((Cube1)->pData[0] & ~((Cube2)->pData[0]))) #define Mvc_Cube2BitSharp( CubeR, Cube1, Cube2 )\ ((((CubeR)->pData[0]) = ((Cube1)->pData[0] & ~((Cube2)->pData[0]))),\ (((CubeR)->pData[1]) = ((Cube1)->pData[1] & ~((Cube2)->pData[1])))) #define Mvc_CubeNBitSharp( CubeR, Cube1, Cube2 )\ {\ int _i_;\ for (_i_ = (Cube1)->iLast; _i_ >= 0; _i_--)\ (((CubeR)->pData[_i_]) = ((Cube1)->pData[_i_] & ~(Cube2)->pData[_i_]));\ } #define Mvc_Cube1BitEmpty( Res, Cube )\ (Res = ((Cube)->pData[0] == 0)) #define Mvc_Cube2BitEmpty( Res, Cube )\ (Res = ((Cube)->pData[0] == 0 && (Cube)->pData[1] == 0)) #define Mvc_CubeNBitEmpty( Res, Cube )\ {\ int _i_; Res = 1;\ for (_i_ = (Cube)->iLast; _i_ >= 0; _i_--)\ if ( (Cube)->pData[_i_] )\ { Res = 0; break; }\ } #define Mvc_Cu
/****************************************************************************
**
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
**
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** This file is part of a Qt Solutions component.
**
** You may use this file under the terms of the BSD license as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
**   * Redistributions of source code must retain the above copyright
**     notice, this list of conditions and the following disclaimer.
**   * Redistributions in binary form must reproduce the above copyright
**     notice, this list of conditions and the following disclaimer in
**     the documentation and/or other materials provided with the
**     distribution.
**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
**     the names of its contributors may be used to endorse or promote
**     products derived from this software without specific prior written
**     permission.
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
****************************************************************************/

#include <QApplication>
#include <QScrollArea>
#include <QGridLayout>
#include <QLabel>
#include <QIcon>
#include <QMap>
#include "qtpropertymanager.h"
#include "qteditorfactory.h"
#include "qttreepropertybrowser.h"
#include "qtbuttonpropertybrowser.h"
#include "qtgroupboxpropertybrowser.h"

int main(int argc, char **argv)
{
    QApplication app(argc, argv);

    QWidget *w = new QWidget();

    QtBoolPropertyManager *boolManager = new QtBoolPropertyManager(w);
    QtIntPropertyManager *intManager = new QtIntPropertyManager(w);
    QtStringPropertyManager *stringManager = new QtStringPropertyManager(w);
    QtSizePropertyManager *sizeManager = new QtSizePropertyManager(w);
    QtRectPropertyManager *rectManager = new QtRectPropertyManager(w);
    QtSizePolicyPropertyManager *sizePolicyManager = new QtSizePolicyPropertyManager(w);
    QtEnumPropertyManager *enumManager = new QtEnumPropertyManager(w);
    QtGroupPropertyManager *groupManager = new QtGroupPropertyManager(w);

    QtProperty *item0 = groupManager->addProperty("QObject");

    QtProperty *item1 = stringManager->addProperty("objectName");
    item0->addSubProperty(item1);

    QtProperty *item2 = boolManager->addProperty("enabled");
    item0->addSubProperty(item2);

    QtProperty *item3 = rectManager->addProperty("geometry");
    item0->addSubProperty(item3);

    QtProperty *item4 = sizePolicyManager->addProperty("sizePolicy");
    item0->addSubProperty(item4);

    QtProperty *item5 = sizeManager->addProperty("sizeIncrement");
    item0->addSubProperty(item5);

    QtProperty *item7 = boolManager->addProperty("mouseTracking");
    item0->addSubProperty(item7);

    QtProperty *item8 = enumManager->addProperty("direction");
    QStringList enumNames;
    enumNames << "Up" << "Right" << "Down" << "Left";
    enumManager->setEnumNames(item8, enumNames);
    QMap<int, QIcon> enumIcons;
    enumIcons[0] = QIcon(":/demo/images/up.png");
    enumIcons[1] = QIcon(":/demo/images/right.png");
    enumIcons[2] = QIcon(":/demo/images/down.png");
    enumIcons[3] = QIcon(":/demo/images/left.png");
    enumManager->setEnumIcons(item8, enumIcons);
    item0->addSubProperty(item8);

    QtProperty *item9 = intManager->addProperty("value");
    intManager->setRange(item9, -100, 100);
    item0->addSubProperty(item9);

    QtCheckBoxFactory *checkBoxFactory = new QtCheckBoxFactory(w);
    QtSpinBoxFactory *spinBoxFactory = new QtSpinBoxFactory(w);
    QtSliderFactory *sliderFactory = new QtSliderFactory(w);
    QtScrollBarFactory *scrollBarFactory = new QtScrollBarFactory(w);
    QtLineEditFactory *lineEditFactory = new QtLineEditFactory(w);
    QtEnumEditorFactory *comboBoxFactory = new QtEnumEditorFactory(w);

    QtAbstractPropertyBrowser *editor1 = new QtTreePropertyBrowser();
    editor1->setFactoryForManager(boolManager, checkBoxFactory);
    editor1->setFactoryForManager(intManager, spinBoxFactory);
    editor1->setFactoryForManager(stringManager, lineEditFactory);
    editor1->setFactoryForManager(sizeManager->subIntPropertyManager(), spinBoxFactory);
    editor1->setFactoryForManager(rectManager->subIntPropertyManager(), spinBoxFactory);
    editor1->setFactoryForManager(sizePolicyManager->subIntPropertyManager(), spinBoxFactory);
    editor1->setFactoryForManager(sizePolicyManager->subEnumPropertyManager(), comboBoxFactory);
    editor1->setFactoryForManager(enumManager, comboBoxFactory);

    editor1->addProperty(item0);

    QtAbstractPropertyBrowser *editor2 = new QtTreePropertyBrowser();
    editor2->addProperty(item0);

    QtAbstractPropertyBrowser *editor3 = new QtGroupBoxPropertyBrowser();
    editor3->setFactoryForManager(boolManager, checkBoxFactory);
    editor3->setFactoryForManager(intManager, spinBoxFactory);
    editor3->setFactoryForManager(stringManager, lineEditFactory);
    editor3->setFactoryForManager(sizeManager->subIntPropertyManager(), spinBoxFactory);
    editor3->setFactoryForManager(rectManager->subIntPropertyManager(), spinBoxFactory);
    editor3->setFactoryForManager(sizePolicyManager->subIntPropertyManager(), spinBoxFactory);
    editor3->setFactoryForManager(sizePolicyManager->subEnumPropertyManager(), comboBoxFactory);
    editor3->setFactoryForManager(enumManager, comboBoxFactory);

    editor3->addProperty(item0);

    QScrollArea *scroll3 = new QScrollArea();
    scroll3->setWidgetResizable(true);
    scroll3->setWidget(editor3);

    QtAbstractPropertyBrowser *editor4 = new QtGroupBoxPropertyBrowser();
    editor4->setFactoryForManager(boolManager, checkBoxFactory);
    editor4->setFactoryForManager(intManager, scrollBarFactory);
    editor4->setFactoryForManager(stringManager, lineEditFactory);
    editor4->setFactoryForManager(sizeManager->subIntPropertyManager(), spinBoxFactory);
    editor4->setFactoryForManager(rectManager->subIntPropertyManager(), spinBoxFactory);
    editor4->setFactoryForManager(sizePolicyManager->subIntPropertyManager(), sliderFactory);
    editor4->setFactoryForManager(sizePolicyManager->subEnumPropertyManager(), comboBoxFactory);
    editor4->setFactoryForManager(enumManager, comboBoxFactory);

    editor4->addProperty(item0);

    QScrollArea *scroll4 = new QScrollArea();
    scroll4->setWidgetResizable(true);
    scroll4->setWidget(editor4);

    QtAbstractPropertyBrowser *editor5 = new QtButtonPropertyBrowser();
    editor5->setFactoryForManager(boolManager, checkBoxFactory);
    editor5->setFactoryForManager(intManager, scrollBarFactory);
    editor5->setFactoryForManager(stringManager, lineEditFactory);
    editor5->setFactoryForManager(sizeManager->subIntPropertyManager(), spinBoxFactory);
    editor5->setFactoryForManager(rectManager->subIntPropertyManager(), spinBoxFactory);
    editor5->setFactoryForManager(sizePolicyManager->subIntPropertyManager(), sliderFactory);
    editor5->setFactoryForManager(sizePolicyManager->subEnumPropertyManager(), comboBoxFactory);
    editor5->setFactoryForManager(enumManager, comboBoxFactory);

    editor5->addProperty(item0);

    QScrollArea *scroll5 = new QScrollArea();
    scroll5->setWidgetResizable(true);
    scroll5->setWidget(editor5);

    QGridLayout *layout = new QGridLayout(w);
    QLabel *label1 = new QLabel("Editable Tree Property Browser");
    QLabel *label2 = new QLabel("Read Only Tree Property Browser, editor factories are not set");
    QLabel *label3 = new QLabel("Group Box Property Browser");
    QLabel *label4 = new QLabel("Group Box Property Browser with different editor factories");
    QLabel *label5 = new QLabel("Button Property Browser");
    label1->setWordWrap(true);
    label2->setWordWrap(true);
    label3->setWordWrap(true);
    label4->setWordWrap(true);
    label5->setWordWrap(true);
    label1->setFrameShadow(QFrame::Sunken);
    label2->setFrameShadow(QFrame::Sunken);
    label3->setFrameShadow(QFrame::Sunken);
    label4->setFrameShadow(QFrame::Sunken);
    label5->setFrameShadow(QFrame::Sunken);
    label1->setFrameShape(QFrame::Panel);
    label2->setFrameShape(QFrame::Panel);
    label3->setFrameShape(QFrame::Panel);
    label4->setFrameShape(QFrame::Panel);
    label5->setFrameShape(QFrame::Panel);
    label1->setAlignment(Qt::AlignCenter);
    label2->setAlignment(Qt::AlignCenter);
    label3->setAlignment(Qt::AlignCenter);
    label4->setAlignment(Qt::AlignCenter);
    label5->setAlignment(Qt::AlignCenter);

    layout->addWidget(label1, 0, 0);
    layout->addWidget(label2, 0, 1);
    layout->addWidget(label3, 0, 2);
    layout->addWidget(label4, 0, 3);
    layout->addWidget(label5, 0, 4);
    layout->addWidget(editor1, 1, 0);
    layout->addWidget(editor2, 1, 1);
    layout->addWidget(scroll3, 1, 2);
    layout->addWidget(scroll4, 1, 3);
    layout->addWidget(scroll5, 1, 4);
    w->show();

    int ret = app.exec();
    delete w;
    return ret;
}