1 /*
2  * CConnection.hh
3  *
4  * Copyright 2014-2018 D. Mitch Bailey  cvc at shuharisystem dot com
5  *
6  * This file is part of cvc.
7  *
8  * cvc is free software: you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation, either version 3 of the License, or
11  * (at your option) any later version.
12  *
13  * cvc is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with cvc.  If not, see <http://www.gnu.org/licenses/>.
20  *
21  * You can download cvc from https://github.com/d-m-bailey/cvc.git
22  */
23 
24 #ifndef CCONNECTION_HH_
25 #define CCONNECTION_HH_
26 
27 #include "Cvc.hh"
28 
29 #include "CVirtualNet.hh"
30 #include "CPower.hh"
31 #include "CDevice.hh"
32 
33 class CConnection {
34 public:
35 	netId_t sourceId = UNKNOWN_NET;
36 	netId_t gateId = UNKNOWN_NET;
37 	netId_t drainId = UNKNOWN_NET;
38 	netId_t bulkId = UNKNOWN_NET;
39 	CVirtualNet masterSourceNet;
40 	CVirtualNet masterDrainNet;
41 	CVirtualNet masterGateNet;
42 	CVirtualNet masterBulkNet;
43 	voltage_t sourceVoltage = UNKNOWN_VOLTAGE;
44 	voltage_t drainVoltage = UNKNOWN_VOLTAGE;
45 	voltage_t gateVoltage = UNKNOWN_VOLTAGE;
46 	voltage_t bulkVoltage = UNKNOWN_VOLTAGE;
47 	CDevice * device_p = NULL;
48 	deviceId_t deviceId = UNKNOWN_DEVICE;
49 	CPower * sourcePower_p = NULL;
50 	CPower * gatePower_p = NULL;
51 	CPower * drainPower_p = NULL;
52 	resistance_t resistance = INFINITE_RESISTANCE;
53 
IsUnknownSourceVoltage()54 	inline bool IsUnknownSourceVoltage() { return ( sourceVoltage == UNKNOWN_VOLTAGE && ! (sourcePower_p && sourcePower_p->type[HIZ_BIT]) ); }
IsUnknownGateVoltage()55 	inline bool IsUnknownGateVoltage() { return ( gateVoltage == UNKNOWN_VOLTAGE && ! (gatePower_p && gatePower_p->type[HIZ_BIT]) ); }
IsUnknownDrainVoltage()56 	inline bool IsUnknownDrainVoltage() { return ( drainVoltage == UNKNOWN_VOLTAGE && ! (drainPower_p && drainPower_p->type[HIZ_BIT]) ); }
57 	float EstimatedMosDiodeCurrent(voltage_t theSourceVoltage, CConnection & theConnections);
58 	float EstimatedCurrent(voltage_t theSourceVoltage, voltage_t theDrainVoltage, resistance_t theSourceResistance, resistance_t theDrainResistance);
59 //	inline bool IsUnknownBulkVoltage() { return ( bulkVoltage == UNKNOWN_VOLTAGE && ! (bulkPower_p && bulkPower_p->type[HIZ_BIT]) ); }
60 
61 };
62 
63 void AddConnectedDevices(netId_t theNetId, list<deviceId_t>& myPmosToCheck,	list<deviceId_t>& myNmosToCheck,
64 		list<deviceId_t>& myResistorToCheck, CDeviceIdVector& theFirstDevice_v, CDeviceIdVector& theNextDevice_v, vector<modelType_t>& theDeviceType_v );
65 
66 class CFullConnection {
67 public:
68 	netId_t originalSourceId = UNKNOWN_NET;
69 	netId_t originalGateId = UNKNOWN_NET;
70 	netId_t originalDrainId = UNKNOWN_NET;
71 	netId_t originalBulkId = UNKNOWN_NET;
72 	netId_t sourceId = UNKNOWN_NET;
73 	netId_t gateId = UNKNOWN_NET;
74 	netId_t drainId = UNKNOWN_NET;
75 	netId_t bulkId = UNKNOWN_NET;
76 	CVirtualNet masterMinSourceNet;
77 	CVirtualNet masterMinDrainNet;
78 	CVirtualNet masterMinGateNet;
79 	CVirtualNet masterMinBulkNet;
80 	voltage_t minSourceVoltage = UNKNOWN_VOLTAGE;
81 	voltage_t minDrainVoltage = UNKNOWN_VOLTAGE;
82 	voltage_t minGateVoltage = UNKNOWN_VOLTAGE;
83 	voltage_t minBulkVoltage = UNKNOWN_VOLTAGE;
84 	CPower * minSourcePower_p = NULL;
85 	CPower * minDrainPower_p = NULL;
86 	CPower * minGatePower_p = NULL;
87 	CPower * minBulkPower_p = NULL;
88 	CVirtualNet masterMaxSourceNet;
89 	CVirtualNet masterMaxDrainNet;
90 	CVirtualNet masterMaxGateNet;
91 	CVirtualNet masterMaxBulkNet;
92 	voltage_t maxSourceVoltage = UNKNOWN_VOLTAGE;
93 	voltage_t maxDrainVoltage = UNKNOWN_VOLTAGE;
94 	voltage_t maxGateVoltage = UNKNOWN_VOLTAGE;
95 	voltage_t maxBulkVoltage = UNKNOWN_VOLTAGE;
96 	CPower * maxSourcePower_p = NULL;
97 	CPower * maxDrainPower_p = NULL;
98 	CPower * maxGatePower_p = NULL;
99 	CPower * maxBulkPower_p = NULL;
100 	CVirtualNet masterSimSourceNet;
101 	CVirtualNet masterSimDrainNet;
102 	CVirtualNet masterSimGateNet;
103 	CVirtualNet masterSimBulkNet;
104 	voltage_t simSourceVoltage = UNKNOWN_VOLTAGE;
105 	voltage_t simDrainVoltage = UNKNOWN_VOLTAGE;
106 	voltage_t simGateVoltage = UNKNOWN_VOLTAGE;
107 	voltage_t simBulkVoltage = UNKNOWN_VOLTAGE;
108 	CPower * simSourcePower_p = NULL;
109 	CPower * simDrainPower_p = NULL;
110 	CPower * simGatePower_p = NULL;
111 	CPower * simBulkPower_p = NULL;
112 
113 	voltage_t minSourceLeakVoltage = UNKNOWN_VOLTAGE;
114 	voltage_t minDrainLeakVoltage = UNKNOWN_VOLTAGE;
115 	voltage_t minGateLeakVoltage = UNKNOWN_VOLTAGE;
116 	voltage_t minBulkLeakVoltage = UNKNOWN_VOLTAGE;
117 	voltage_t maxSourceLeakVoltage = UNKNOWN_VOLTAGE;
118 	voltage_t maxDrainLeakVoltage = UNKNOWN_VOLTAGE;
119 	voltage_t maxGateLeakVoltage = UNKNOWN_VOLTAGE;
120 	voltage_t maxBulkLeakVoltage = UNKNOWN_VOLTAGE;
121 
122 	bool validMinSource = true;
123 	bool validMinDrain = true;
124 	bool validMinGate = true;
125 	bool validMinBulk = true;
126 	bool validSimSource = true;
127 	bool validSimDrain = true;
128 	bool validSimGate = true;
129 	bool validSimBulk = true;
130 	bool validMaxSource = true;
131 	bool validMaxDrain = true;
132 	bool validMaxGate = true;
133 	bool validMaxBulk = true;
134 	bool validMinSourceLeak = true;
135 	bool validMinDrainLeak = true;
136 	bool validMinGateLeak = true;
137 	bool validMinBulkLeak = true;
138 	bool validMaxSourceLeak = true;
139 	bool validMaxDrainLeak = true;
140 	bool validMaxGateLeak = true;
141 	bool validMaxBulkLeak = true;
142 
143 	CDevice * device_p = NULL;
144 	deviceId_t deviceId = UNKNOWN_DEVICE;
145 	resistance_t resistance = INFINITE_RESISTANCE;
146 
147 	float EstimatedCurrent();
148 	float EstimatedCurrent(bool theVthFlag);
149 	float EstimatedMinimumCurrent();
150 	bool CheckTerminalMinMaxVoltages(int theCheckTerminals, bool theCheckHiZFlag = true);
151 	bool CheckTerminalMinMaxLeakVoltages(int theCheckTerminals);
152 	bool CheckTerminalMinVoltages(int theCheckTerminals);
153 	bool CheckTerminalMaxVoltages(int theCheckTerminals);
154 	bool CheckTerminalSimVoltages(int theCheckTerminals);
155 	void SetUnknownVoltageToSim();
156 	void SetUnknownVoltage();
157 	void SetMinMaxLeakVoltagesAndFlags(CCvcDb * theCvcDb);
158 	bool IsPossibleHiZ(CCvcDb * theCvcDb);
159 	bool IsTransferGate(deviceId_t theNmos, deviceId_t thePmos, CCvcDb * theCvcDb);
160 	bool IsPumpCapacitor();
161 
162 };
163 #endif /* CCONNECTION_HH_ */
164