~arcachofo/simulide/1.1.0

« back to all changes in this revision

Viewing changes to src/gui/circuitwidget/components/logic/bus.cpp

  • Committer: arcachofo
  • Date: 2021-01-01 14:23:42 UTC
  • Revision ID: arcachofo@simulide.com-20210101142342-ozfljnll44g5lbl3
Initial Commit 0.5.15-RC3

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/***************************************************************************
 
2
 *   Copyright (C) 2018 by santiago González                               *
 
3
 *   santigoro@gmail.com                                                   *
 
4
 *                                                                         *
 
5
 *   This program is free software; you can redistribute it and/or modify  *
 
6
 *   it under the terms of the GNU General Public License as published by  *
 
7
 *   the Free Software Foundation; either version 3 of the License, or     *
 
8
 *   (at your option) any later version.                                   *
 
9
 *                                                                         *
 
10
 *   This program is distributed in the hope that it will be useful,       *
 
11
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 
12
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 
13
 *   GNU General Public License for more details.                          *
 
14
 *                                                                         *
 
15
 *   You should have received a copy of the GNU General Public License     *
 
16
 *   along with this program; if not, see <http://www.gnu.org/licenses/>.  *
 
17
 *                                                                         *
 
18
 ***************************************************************************/
 
19
 
 
20
#include "connector.h"
 
21
#include "simulator.h"
 
22
#include "circuit.h"
 
23
#include "bus.h"
 
24
 
 
25
static const char* Bus_properties[] = {
 
26
    QT_TRANSLATE_NOOP("App::Property","Num Bits"),
 
27
    QT_TRANSLATE_NOOP("App::Property","Start Bit")
 
28
};
 
29
 
 
30
Component* Bus::construct( QObject* parent, QString type, QString id )
 
31
{
 
32
    return new Bus( parent, type, id );
 
33
}
 
34
 
 
35
LibraryItem* Bus::libraryItem()
 
36
{
 
37
    return new LibraryItem(
 
38
        tr( "Bus" ),
 
39
        tr( "Logic/Other Logic" ),
 
40
        "outbus.png",
 
41
        "Bus",
 
42
        Bus::construct );
 
43
}
 
44
 
 
45
Bus::Bus( QObject* parent, QString type, QString id )
 
46
   : Component( parent, type, id )
 
47
   , eBus( id )
 
48
{
 
49
    Q_UNUSED( Bus_properties );
 
50
 
 
51
    m_busPin1 = new Pin( 270, QPoint( 0, 0 ), m_id+"-busPinI", 1, this );
 
52
    m_busPin1->setLength( 1 );
 
53
    m_busPin1->setFlag( QGraphicsItem::ItemStacksBehindParent, false );
 
54
 
 
55
 
 
56
    setNumLines( 8 );                           // Create Input Pins
 
57
 
 
58
    m_busPin0 = new Pin( 90, QPoint( 0, 0 ), m_id+"-ePin0", 1, this );
 
59
    m_busPin0->setLength( 1 );
 
60
    m_busPin0->setFlag( QGraphicsItem::ItemStacksBehindParent, false );
 
61
 
 
62
    m_busPin1->setIsBus( true );
 
63
    m_busPin0->setIsBus( true );
 
64
    m_pin[0]  = m_busPin0;
 
65
    m_ePin[0] = m_busPin0;
 
66
 
 
67
    //m_pin[ m_numLines+1 ] = m_busPin1;
 
68
}
 
69
Bus::~Bus(){
 
70
}
 
71
 
 
72
void Bus::setNumLines( int lines )
 
73
{
 
74
    if( lines == m_numLines ) return;
 
75
    if( lines < 1 ) return;
 
76
 
 
77
    for( int i=1; i<=m_numLines; i++ )
 
78
    {
 
79
        if( m_pin[i]->isConnected() ) m_pin[i]->connector()->remove();
 
80
        if( m_pin[i]->scene() ) Circuit::self()->removeItem( m_pin[i] );
 
81
        delete m_pin[i];
 
82
    }
 
83
    m_numLines = lines;
 
84
 
 
85
    m_pin.resize( lines+2 );
 
86
    m_ePin.resize( lines+2 );
 
87
    
 
88
    for( int i=1; i<=lines; i++ )
 
89
    {
 
90
        QString pinId = m_id+"-ePin"+QString::number(i);
 
91
        Pin* pin = new Pin( 180, QPoint(-8, -8*lines+i*8 ), pinId, i, this );
 
92
 
 
93
        pin->setFontSize( 4 );
 
94
        pin->setLabelColor( QColor( 0, 0, 0 ) );
 
95
        pin->setLabelText( " "+QString::number( m_startBit+i-1 ) );
 
96
        m_pin[i]  = pin;
 
97
        m_ePin[i] = pin;
 
98
    }
 
99
    m_busPin1->setPos( QPoint( 0 ,-lines*8+8 ) );
 
100
    m_busPin1->isMoved();
 
101
    m_busPin1->setLabelPos();
 
102
    m_pin[ lines+1 ]  = m_busPin1;
 
103
    m_ePin[ lines+1 ] = m_busPin1;
 
104
 
 
105
    m_height = lines-1;
 
106
    m_area = QRect( -3,-m_height*8-2, 5, m_height*8+4 );
 
107
    Circuit::self()->update();
 
108
}
 
109
 
 
110
void Bus::setStartBit( int bit )
 
111
{
 
112
    eBus::setStartBit( bit );
 
113
 
 
114
    for( int i=1; i<=m_numLines; i++ )
 
115
    {
 
116
        m_pin[i]->setLabelText( " "+QString::number( m_startBit+i-1 ) );
 
117
    }
 
118
}
 
119
 
 
120
void Bus::initialize()
 
121
{
 
122
    if( !m_busPin0->isConnected() && !m_busPin1->isConnected() ) return;
 
123
    
 
124
    //qDebug() << "\nBus::initialize()"<< m_id << m_numLines;
 
125
 
 
126
    eNode* busEnode = m_busPin0->getEnode();
 
127
    if( !busEnode ) busEnode = m_busPin1->getEnode();
 
128
    //if( !busEnode ) return;
 
129
 
 
130
    for( int i=1; i<=m_numLines; i++ )
 
131
    {
 
132
        if( !m_pin[i]->isConnected() ) continue;
 
133
        //eNode* enode = m_pin[i]->getEnode();
 
134
        //if( !enode )
 
135
        eNode* enode = new eNode( m_id+"eNode"+QString::number( i ) );
 
136
        Pin* pin = m_pin[i];
 
137
        pin->registerPinsW( enode );
 
138
 
 
139
        if( busEnode )
 
140
        {
 
141
            QList<ePin*> epins = enode->getEpins();
 
142
            //qDebug() << "Registering pins line"<< i << epins;
 
143
            busEnode->addBusPinList( epins, m_startBit+i-1 );
 
144
            //for( ePin* epin : epins )epin->setEnode( 0l );
 
145
        }
 
146
    }
 
147
}
 
148
 
 
149
void Bus::inStateChanged( int msg )
 
150
{
 
151
    //qDebug() << "Bus::inStateChanged()"<< m_id << m_numLines;
 
152
 
 
153
    if( m_busPin0->isConnected() || m_busPin1->isConnected() )
 
154
    {
 
155
        eNode* enode = new eNode( m_id+"busNode" );
 
156
        enode->setIsBus( true );
 
157
        registerPins( enode );
 
158
        return;
 
159
    }
 
160
    if( msg == 3 ) // Called by m_busPin When disconnected
 
161
    {
 
162
        //qDebug() << "Bus::inStateChanged()" << m_numLines;
 
163
 
 
164
        for( int i=1; i<=m_numLines; i++ )
 
165
        {
 
166
            if( !m_pin[i]->isConnected() ) continue;
 
167
 
 
168
            eNode* enode = new eNode( m_id+"eNode"+QString::number( i ) );
 
169
            Pin* pin = m_pin[i];
 
170
            pin->registerPinsW( enode );
 
171
        }
 
172
    }
 
173
}
 
174
 
 
175
void Bus::registerPins( eNode* enode )
 
176
{
 
177
    if( !enode->isBus() ) return;
 
178
 
 
179
    if( m_busPin0->isConnected() ) m_busPin0->registerPinsW( enode );
 
180
    if( m_busPin1->isConnected() ) m_busPin1->registerPinsW( enode );
 
181
}
 
182
 
 
183
void Bus::paint( QPainter *p, const QStyleOptionGraphicsItem *option, QWidget *widget )
 
184
{
 
185
    Component::paint( p, option, widget );
 
186
 
 
187
    QPen pen = p->pen();
 
188
    pen.setWidth(3);
 
189
    p->setPen(pen);
 
190
 
 
191
    p->drawRect( QRect( 0, -m_height*8, 0, m_height*8 ) );
 
192
              //QRect( -2, -m_height*8-4, 2, m_height*8+8 );
 
193
}
 
194
 
 
195
#include "moc_bus.cpp"