コード例 #1
0
void Demultiplexer::initPins(unsigned newAddressSize) {
	unsigned oldAddressSize = m_aLogic.size();
	unsigned long long oldXLogicCount = m_xLogic.size();
	unsigned long long newXLogicCount = 1 << newAddressSize;

	if (newXLogicCount == oldXLogicCount)
		return;

	QStringList pins;

	for (unsigned i = 0; i < newAddressSize; ++i)
		pins += "A" + QString::number(i);

	for (unsigned i = newAddressSize; i < (newXLogicCount + (newXLogicCount % 2)) / 2; ++i)
		pins += "";

	pins += "X";

	for (unsigned i = (newXLogicCount + (newXLogicCount % 2)) / 2 + 1; i < newXLogicCount; ++i)
		pins += "";

	for (int i = newXLogicCount - 1; i >= 0; --i)
		pins += "X" + QString::number(i);

	initDIPSymbol(pins, 64);
	initDIP(pins);

	setup1pinElement(m_input, ecNodeWithID("X")->pin());

	if (newXLogicCount > oldXLogicCount) {
		m_xLogic.resize(newXLogicCount);
		for (unsigned i = oldXLogicCount; i < newXLogicCount; ++i) {
			setup1pinElement(m_xLogic[i], ecNodeWithID("X" + QString::number(i))->pin());
		}

		m_aLogic.resize(newAddressSize);
		for (unsigned i = oldAddressSize; i < newAddressSize; ++i) {
			setup1pinElement(m_aLogic[i], ecNodeWithID("A" + QString::number(i))->pin());
			m_aLogic[i].setCallback(this, (CallbackPtr)(&Demultiplexer::inStateChanged));
		}
	} else {
		for (unsigned i = newXLogicCount; i < oldXLogicCount; ++i) {
			QString id = "X" + QString::number(i);
			removeDisplayText(id);
			removeElement(&m_xLogic[i], false);
			removeNode(id);
		}

		m_xLogic.resize(newXLogicCount);

		for (unsigned i = newAddressSize; i < oldAddressSize; ++i) {
			QString id = "A" + QString::number(i);
			removeDisplayText(id);
			removeElement(&m_aLogic[i], false);
			removeNode(id);
		}

		m_aLogic.resize(newAddressSize);
	}
}
コード例 #2
0
void BinaryCounter::initPins( unsigned numBits )
{
	if ( m_numBits == numBits )
		return;
	
	QStringList pins;
	pins << "en" << ">" << "u/d" << "r";

	{
	int np = abs(4-int(numBits));
	for ( int i = 0; i < np; i++ )
		pins << " ";
	}
	
	for ( int i = numBits-1; i >= 0; i-- )
		pins << QChar('A'+i);
	
	initDIPSymbol( pins, 64 );
	initDIP(pins);
	
	if ( m_numBits < numBits )
	{
		for ( unsigned i = m_numBits; i < numBits; i++ )
			m_pLogicOut[i] = createLogicOut( ecNodeWithID( QChar('A'+i) ), false );
	}
	else
	{
		for ( unsigned i = numBits; i < m_numBits; i++ )
		{
			QString id = QChar('A'+i);
			removeElement( m_pLogicOut[i], false );
			removeDisplayText(id);
			removeNode(id);
		}
	}
	
	m_numBits = numBits;
	m_maxValue = (1<<m_numBits)-1;
	
	if (!m_bDoneLogicIn)
	{
		enLogic = createLogicIn( ecNodeWithID("en") );
		inLogic = createLogicIn( ecNodeWithID(">") );
		rLogic = createLogicIn( ecNodeWithID("r") );
		udLogic = createLogicIn( ecNodeWithID("u/d") );
	
		enLogic->setCallback( this, (CallbackPtr)(&BinaryCounter::enStateChanged) );
		inLogic->setCallback( this, (CallbackPtr)(&BinaryCounter::inStateChanged) );
		rLogic->setCallback( this, (CallbackPtr)(&BinaryCounter::rStateChanged) );
		udLogic->setCallback( this, (CallbackPtr)(&BinaryCounter::udStateChanged) );
		
		m_bDoneLogicIn = true;
	}
	
	outputValue();
}
コード例 #3
0
ファイル: ecmosfet.cpp プロジェクト: ktechlab/ktechlab-0.3
void ECMOSFET::dataChanged()
{
	bool haveBodyPin = dataBool( "bodyPin" );
	if ( haveBodyPin != m_bHaveBodyPin )
	{
		m_bHaveBodyPin = haveBodyPin;
		if ( m_bHaveBodyPin )
		{
			// Creating a body pin
			ECNode * NodeB = createPin( 16, 0, 180, "b" );
			removeElement( m_pMOSFET, false );
			m_pMOSFET = createMOSFET( ecNodeWithID( "d" ), ecNodeWithID( "g" ), ecNodeWithID( "s" ), NodeB, m_MOSFET_type );
		}
		else
		{
			// Removing a body pin
			removeNode( "b" );
			removeElement( m_pMOSFET, false );
			m_pMOSFET = createMOSFET( ecNodeWithID( "d" ), ecNodeWithID( "g" ), ecNodeWithID( "s" ), ecNodeWithID( "s" ), m_MOSFET_type );
		}
	}
	
#if 0
	MOSFETSettings s;
	s.I_S = dataDouble( "I_S" );
	s.N_F = dataDouble( "N_F" );
	s.N_R = dataDouble( "N_R" );
	s.B_F = dataDouble( "B_F" );
	s.B_R = dataDouble( "B_R" );
	
	m_pMOSFET->setMOSFETSettings( s );
#endif
}
コード例 #4
0
MatrixDisplayDriver::MatrixDisplayDriver(ICNDocument *icnDocument, bool newItem, const char *id)
        : DIPComponent(icnDocument, newItem, id ? id : "Matrix Display Driver") {
    m_name = i18n("Matrix Display Driver");

    m_Col = 4;

// FIXME: functionality not implemented! =(
    createProperty("diode-configuration", Variant::Type::Select);
    property("diode-configuration")->setCaption(i18n("Configuration"));
    QStringMap allowed;
    allowed["Row Cathode"] = i18n("Row Cathode");
    allowed["Column Cathode"] = i18n("Column Cathode");
    property("diode-configuration")->setAllowed(allowed);
    property("diode-configuration")->setValue("Row Cathode");
    property("diode-configuration")->setAdvanced(true);

    QStringList pins = QStringList::split(',', "D0,D1,D2,D3,D4,D5,D6,D7,,,,,,C4,C3,C2,C1,C0,,R0,R1,R2,R3,R4,R5,R6", true);
    initDIPSymbol(pins, 64);
    initDIP(pins);

    m_pValueLogic.resize(8);
    for(unsigned i = 0; i < 8; ++i)
        setup1pinElement(m_pValueLogic[i], ecNodeWithID("D" + QString::number(i))->pin());

    m_pRowLogic.resize(7);
    for(unsigned i = 0; i < 7; ++i) {
        setup1pinElement(m_pRowLogic[i], ecNodeWithID("R" + QString::number(i))->pin());
        m_pRowLogic[i].setOutputLowConductance(1.0);
        m_pRowLogic[i].setOutputHighVoltage(5.0);
    }

    m_pColLogic.resize(5);
    for(unsigned i = 0; i < 5; ++i) {
        setup1pinElement(m_pColLogic[i], ecNodeWithID("C" + QString::number(i))->pin());
        m_pColLogic[i].setOutputHighVoltage(5.0);
    }
}
コード例 #5
0
ファイル: ram.cpp プロジェクト: ktechlab/ktechlab-0.3
void RAM::initPins()
{
	int oldWordSize = m_dataIn.size();
	int oldAddressSize = m_address.size();
	
	int newWordSize = dataInt("wordSize");
	int newAddressSize = dataInt("addressSize");
	
	if ( newAddressSize == oldAddressSize &&
			newWordSize == oldWordSize )
		return;
	
	QStringList leftPins; // Pins on left of IC
	leftPins << "CS" << "OE" << "WE";
	for ( int i = 0; i < newAddressSize; ++i )
		leftPins << QString("A%1").arg( QString::number(i) );
	
	QStringList rightPins; // Pins on right of IC
	for ( unsigned i = newWordSize; i > 0; --i )
		rightPins << QString("DI%1").arg( QString::number(i-1) );
	for ( unsigned i = newWordSize; i > 0; --i )
		rightPins << QString("DO%1").arg( QString::number(i-1) );
	
	// Make pin lists of consistent sizes
	for ( unsigned i = leftPins.size(); i < rightPins.size(); ++i )
		leftPins.append("");
	for ( unsigned i = rightPins.size(); i < leftPins.size(); ++i )
		rightPins.prepend("");
	
	QStringList pins = leftPins + rightPins;
	
	initDIPSymbol( pins, 72 );
	initDIP(pins);
	
	ECNode *node;
	
	if (!m_pCS)
	{
		node =  ecNodeWithID("CS");
		m_pCS = createLogicIn(node);
		m_pCS->setCallback( this, (CallbackPtr)(&RAM::inStateChanged) );
	}
	
	if (!m_pOE)
	{
		node =  ecNodeWithID("OE");
		m_pOE = createLogicIn(node);
		m_pOE->setCallback( this, (CallbackPtr)(&RAM::inStateChanged) );
	}
	
	if (!m_pWE)
	{
		node =  ecNodeWithID("WE");
		m_pWE = createLogicIn(node);
		m_pWE->setCallback( this, (CallbackPtr)(&RAM::inStateChanged) );
	}
	
	if ( newWordSize > oldWordSize )
	{
		m_dataIn.resize(newWordSize);
		m_dataOut.resize(newWordSize);
		
		for ( int i = oldWordSize; i < newWordSize; ++i )
		{
			node = ecNodeWithID( QString("DI%1").arg( QString::number(i) ) );
			m_dataIn.insert( i, createLogicIn(node) );
			m_dataIn[i]->setCallback( this, (CallbackPtr)(&RAM::inStateChanged) ); 
			
			node = ecNodeWithID( QString("DO%1").arg( QString::number(i) ) );
			m_dataOut.insert( i, createLogicOut(node, false) );
		}
	}
	else if ( newWordSize < oldWordSize )
	{
		for ( int i = newWordSize; i < oldWordSize; ++i )
		{
			QString id = QString("DO%1").arg( QString::number(i) );
			removeDisplayText(id);
			removeElement( m_dataIn[i], false );
			removeNode(id);
			
			id = QString("DI%1").arg( QString::number(i) );
			removeDisplayText(id);
			removeElement( m_dataOut[i], false );
			removeNode(id);
		}
		
		m_dataIn.resize(newWordSize);
		m_dataOut.resize(newWordSize);
	}
	
	if ( newAddressSize > oldAddressSize )
	{
		m_address.resize(newAddressSize);
		
		for ( int i = oldAddressSize; i < newAddressSize; ++i )
		{
			node = ecNodeWithID( QString("A%1").arg( QString::number(i) ) );
			m_address.insert( i, createLogicIn(node) );
			m_address[i]->setCallback( this, (CallbackPtr)(&RAM::inStateChanged) );
		}
	}
	else if ( newAddressSize < oldAddressSize )
	{
		for ( int i = newAddressSize; i < oldAddressSize; ++i )
		{
			QString id = QString("A%1").arg( QString::number(i) );
			removeDisplayText(id);
			removeElement( m_address[i], false );
			removeNode(id);
		}
		
		m_address.resize(newAddressSize);
	}
}
コード例 #6
0
ファイル: eckeypad.cpp プロジェクト: Munrek/ktechlab
void ECKeyPad::initPins(unsigned numCols) {
    if (numCols < 3)
        numCols = 3;
    else if (numCols > 9)
        numCols = 9;

    if (numCols == m_numCols)
        return;

    int w = sideLength(numCols);
    int h = sideLength(4);

    setSize(-int(w / 16)*8, -int(h / 16)*8, w, h, true);

    if (numCols > m_numCols) {
        // Adding columns
        for (unsigned i = 0; i < 4; i++) {
            for (unsigned j = m_numCols; j < numCols; j++)
                addButton(buttonID(i, j), QRect(0, 0, 20, 20), text[i][j]);
        }

        ECNode *cols[9];

        for (unsigned j = m_numCols; j < numCols; j++)
            cols[j] = createPin(0, 64, 270, "col_" + QString::number(j));

        for (unsigned i = 0; i < 4; i++) {
            Pin *row = &ecNodeWithID("row_" + QString::number(i))->pin();

            for (unsigned j = m_numCols; j < numCols; j++)
                m_switch[i][j] = new Switch(this, cols[j]->pin(), *row, Switch::Open);
        }
    } else {
        // Remove columns
        for (unsigned i = 0; i < 4; i++) {
            for (unsigned j = numCols; j < m_numCols; j++)
                removeWidget(buttonID(i, j));
        }

        for (unsigned j = numCols; j < m_numCols; j++)
            removeNode("col_" + QString::number(j));

        for (unsigned i = 0; i < 4; i++) {
            for (unsigned j = m_numCols; j < numCols; j++)
                delete m_switch[i][j];
        }
    }

    //BEGIN Update Positions
    m_numCols = numCols;

    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < int(m_numCols); j++) {
            widgetWithID(buttonID(i, j))->setOriginalRect(
                QRect(offsetX() + 6 + 24*j, offsetY() + 6 + 24*i, 20, 20));
        }
    }

    for (int i = 0; i < 4; i++)
        m_nodeMap["row_" + QString::number(i)].x = width() + offsetX();

    for (int j = 0; j < int(m_numCols); j++)
        m_nodeMap["col_" + QString::number(j)].x = 24 * j + offsetX() + 16;

    updateAttachedPositioning();
    //END Update Positions
}
コード例 #7
0
ファイル: multiplexer.cpp プロジェクト: Munrek/ktechlab
void Multiplexer::initPins(unsigned newAddressSize) {
	unsigned oldAddressSize = m_aLogic.size();
	unsigned long long oldXLogicCount = m_xLogic.size();
	unsigned long long newXLogicCount = 1 << newAddressSize;

	if (newXLogicCount == oldXLogicCount) return;

	QStringList pins;

	const int length = newAddressSize + newXLogicCount;

	for (unsigned i = 0; i < newAddressSize; ++i)
		pins += "A" + QString::number(i);

	for (unsigned i = 0; i < newXLogicCount; ++i)
		pins += "X" + QString::number(i);

// WTF??
	for (int i = 0; i < (length - (length % 2)) / 2; ++i)
		pins += "";

	pins += "X";

// WTF???
	for (int i = 0; i < ((length + (length % 2)) / 2) - 1; ++i)
		pins += "";

	initDIPSymbol(pins, 64);
	initDIP(pins);

	setup1pinElement(m_output, ecNodeWithID("X")->pin());

	if (newXLogicCount > oldXLogicCount) {
		m_xLogic.resize(newXLogicCount);

		for (unsigned i = oldXLogicCount; i < newXLogicCount; ++i) {
			setup1pinElement(m_xLogic[i], ecNodeWithID("X" + QString::number(i))->pin());
			m_xLogic[i].setCallback(this, (CallbackPtr)(&Multiplexer::inStateChanged));
		}

		m_aLogic.resize(newAddressSize);

		for (unsigned i = oldAddressSize; i < newAddressSize; ++i) {
			setup1pinElement(m_aLogic[i], ecNodeWithID("A" + QString::number(i))->pin());
			m_aLogic[i].setCallback(this, (CallbackPtr)(&Multiplexer::inStateChanged));
		}
	} else {
		for (unsigned i = newXLogicCount; i < oldXLogicCount; ++i) {
			QString id = "X" + QString::number(i);
			removeDisplayText(id);
			removeElement(&(m_xLogic[i]), false);
			removeNode(id);
		}

		m_xLogic.resize(newXLogicCount);

		for (unsigned i = newAddressSize; i < oldAddressSize; ++i) {
			QString id = "A" + QString::number(i);
			removeDisplayText(id);
			removeElement(&(m_aLogic[i]), false);
			removeNode(id);
		}

		m_aLogic.resize(newAddressSize);
	}
}