-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathnetlist.py
More file actions
125 lines (107 loc) · 3.91 KB
/
netlist.py
File metadata and controls
125 lines (107 loc) · 3.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
class netlist_element():
def __init__(self,typeof):
self.typeof = typeof
self.parent = False
def __str__(self):
return(self.typeof)
class subcircuit(netlist_element):
def __init__(self, name, nets, instances):
self.name = name;
self.labels = {}
self.power_nets = []
self.ground_nets = []
self.internal_nets = []
# dictionarry of net names,
# key is net name, value is net object
# marke these nets also as io
self.nets = {} #= nets;
for n in nets:
self.nets[n] = net(n, self)
self.nets[n].is_io = True
self.instances = instances;
for i in self.instances:
# register subcircuit as parrent
i.parent = self
# add all internal nets
for n in i.pins:
if n not in self.nets:
self.nets[n] = net(n, self)
netlist_element.__init__(self,'subcircuit')
def __str__(self):
insts = {}
for i in self.instances:
insts[i.name] = i.reference
return(self.typeof + " " + self.name + "(" + str(self.nets) + "):" + str(insts))
def map_instances(self, mapping_function):
for i in range(len(self.instances)):
self.instances[i] = mapping_function(self.instances[i])
def map_nets(self, mapping_function):
for n in self.nets:
self.nets[n] = mapping_function(self.nets[n])
def __repr__(self):
return self.name
class instance(netlist_element):
def __init__(self, name, pins, reference, parameters):
self.name = name;
self.pins = pins;
self.reference = reference;
self.parameters = parameters;
netlist_element.__init__(self,'instance')
def __str__(self):
return(self.typeof + " " + self.name + "@" + self.reference + str(self.parameters))
class net(netlist_element):
def __init__(self, name, parent):
self.name = name
self.nettype = 'standard'
self.nodes = set()
self.labels = {}
self.is_vdd = False
self.is_gnd = False
self.is_internal = False
self.is_io = False
self.parent = parent
def connect(self, pin):
self.nodes.add(pin)
def __repr__(self):
return (self.parent.__repr__() + "." + self.name)
class pin(netlist_element):
def __init__(self, name, parent):
self.name = name
self.parent = parent
self.net = False
self.direction = False
def connect(self,net):
if not self.net:
# get the net object from the subcircuit
self.net = self.parent.parent.nets[net]
self.net.connect(self)
def __repr__(self):
return (self.parent.__repr__() + "." + self.name)
class mosfet(instance):
def __init__(self,instance):
self.name = instance.name
self.parent = instance.parent
self.parameters = instance.parameters
self.reference = instance.reference
self.drain = pin('d',self)
self.gate = pin('g',self)
self.source = pin('s',self)
self.bulk = pin('b',self)
self.labels = {}
def connect(self, drain, gate, source, bulk):
self.drain.connect(drain)
self.gate.connect(gate)
self.source.connect(source)
self.bulk.connect(bulk)
def __str__(self):
return(self.typeof + ":" + self.reference + '[' + self.drain.net.name + ', '+ self.gate.net.name + ', '+ self.source.net.name + ', '+ self.bulk.net.name + ']')
def __repr__(self):
return(self.parent.__repr__() + "." + self.name)
class nmos(mosfet):
def __init__(self,instance):
netlist_element.__init__(self,'nmos')
mosfet.__init__(self, instance)
class pmos(mosfet):
def __init__(self,instance):
netlist_element.__init__(self,'pmos')
mosfet.__init__(self, instance)