--- nand.py-
+++ nand.py
@@ -143,6 +143,84 @@
 		self.nand_b.out.conn = self.nand_o.inp_b
 		self.nand_o.out.conn = Pin(self, 'out')
 
+class AND_N(Obj):
+	def __init__(self, parent, n, name='and_n', latency=10):
+		Obj.__init__(self, parent, name)
+		self.n = n
+		AND(self, 'and_', latency)
+		if n == 2:
+			Pin(self, 'inp_0').conn = self.and_.inp_a
+			Pin(self, 'inp_1').conn = self.and_.inp_b
+
+		elif n == 3:
+			AND_N(self, 2, 'and_n', latency)
+			new_pin_conn(self, self.and_n, 0)
+			self.and_n.out.conn = self.and_.inp_a
+			Pin(self, 'inp_2').conn = self.and_.inp_b
+
+		else: # n >= 4
+			nb = n / 2
+			na = n - nb
+
+			AND_N(self, na, 'and_na', latency)
+			new_pin_conn(self, self.and_na, 0)
+			self.and_na.out.conn = self.and_.inp_a
+
+			AND_N(self, nb, 'and_nb', latency)
+			new_pin_conn(self, self.and_nb, na)
+			self.and_nb.out.conn = self.and_.inp_b
+
+		sef.and_.out.conn = Pin(self, 'out')
+
+class OR_N(Obj):
+	def __init__(self, parent, n, name='or_n', latency=10):
+		Obj.__init__(self, parent, name)
+		self.n = n
+		OR(self, 'or_', latency)
+		if n == 2:
+			Pin(self, 'inp_0').conn = self.or_.inp_a
+			Pin(self, 'inp_1').conn = self.or_.inp_b
+
+		elif n == 3:
+			OR_N(self, 2, 'or_n', latency)
+			new_pin_conn(self, self.or_n, 0)
+			self.or_n.out.conn = self.or_.inp_a
+			Pin(self, 'inp_2').conn = self.or_.inp_b
+
+		else: # n >= 4
+			nb = n / 2
+			na = n - nb
+
+			OR_N(self, na, 'or_na', latency)
+			new_pin_conn(self, self.or_na, 0)
+			self.or_na.out.conn = self.or_.inp_a
+
+			OR_N(self, nb, 'or_nb', latency)
+			new_pin_conn(self, self.or_nb, na)
+			self.or_nb.out.conn = self.or_.inp_b
+
+		sef.or_.out.conn = Pin(self, 'out')
+
+class NAND_N(Obj):
+	def __init__(self, parent, n, name='nand_n', latency=10):
+		Obj.__init__(self, parent, name)
+		self.n = n
+		AND_N(self, 'and_n', latency)
+		new_pin_conn(self, self.and_n, 0)
+		NOT(self, 'not_', latency)
+		self.and_n.out.conn = self.not_.inp
+		self.not_.out.conn = Pin(self, 'out')
+
+class NOR_N(Obj):
+	def __init__(self, parent, n, name='nor_n', latency=10):
+		Obj.__init__(self, parent, name)
+		self.n = n
+		OR_N(self, 'or_n', latency)
+		new_pin_conn(self, self.or_n, 0)
+		NOT(self, 'not_', latency)
+		self.or_n.out.conn = self.not_.inp
+		self.not_.out.conn = Pin(self, 'out')
+
 class RSFF(Obj):
 	def __init__(self, parent, name='rsff', latency=10):
 		Obj.__init__(self, parent, name)
@@ -238,6 +316,14 @@
 			dbgout( 'cmd_exec "{}"'.format(s) )
 			exec s
 
+def new_pin_conn(obj, in_obj, sta_i):
+	for i in range(in_obj.n):
+		pin = getattr( in_obj, name_inp(i) )
+		Pin( obj, name_inp( sta_i + i ) ).conn = pin
+
+def name_inp(i):
+	return 'inp_{}'.format(i)
+
 def str_v(v):
 	return { True: 'H', False: 'L', None: 'Hi-Z' }.get(v, '?')