--- nand.py-
+++ nand.py
@@ -340,6 +340,7 @@
 		self.jkff.nQ.conn = Pin(self, 'nQ')
 
 class COUNTER(Obj):
+	# CLK, out_x
 	def __init__(self, parent, bit_n, name='counter', latency=10):
 		Obj.__init__(self, parent, name)
 		self.n = bit_n
@@ -351,6 +352,7 @@
 			clk = tff.nQ
 			
 class DECODER(Obj):
+	# en, inp_x, out_x
 	def __init__(self, parent, bit_n, name='decoder', latency=10):
 		Obj.__init__(self, parent, name)
 		self.n = bit_n
@@ -388,60 +390,70 @@
 			new_pin_conn(self, self.dec_d, 0, n1, 'out', direc='from_in_obj')
 			new_pin_conn(self, self.dec_u, n1, n1, 'out', direc='from_in_obj')
 
+class PinSet(Obj):
+	# p_x
+	def __init__(self, parent, n, dlst=(), name='pin_set'):
+		Obj.__init__(self, parent, name)
+		self.n = n
+		new_pin_n(n, self, 'p', 0, dlst)
+
+class ANDSet(Obj):
+	# inp_x, sel_x, out_x
+	def __init__(self, parent, n, name='and_set', latency=10):
+		Obj.__init__(self, parent, name)
+		self.n = n
+		for i in range(n):
+			and_i = AND( self, name_i('and', i), latency )
+			Pin( self, name_i('inp', i) ).conn = and_i.inp_a
+			Pin( self, name_i('sel', i) ).conn = and_i.inp_b
+			and_i.out.conn = Pin( self, name_i('out', i) )
+
+class SELECTOR(Obj):
+	# en, A_x, D_x, out
+	def __init__(self, parent, bit_n, name='selector', latency=10):
+		Obj.__init__(self, parent, name)
+		self.n = bit_n
+		new_pin_n(bit_n, self, 'A', 0, 'L')
+		DECODER(self, bit_n, 'deco', latency)
+		conn2_n( bit_n, (self, 'A', 0), (self.deco, 'inp', 0) )
+		Pin(self, 'en', 'L').conn = self.deco.en
+
+		dn = 1 << bit_n
+		new_pin_n(dn, self, 'D', 0, 'L')
+		ANDSet(self, dn, 'and_set', latency)
+		conn2_n( dn, (self, 'D', 0), (self.and_set, 'inp', 0) )
+		conn2_n( dn, (self.deco, 'out', 0), (self.and_set, 'sel', 0) )
+
+		OR_N(self, dn, 'or_n', latency)
+		conn2_n( dn, (self.and_set, 'out', 0), (self.or_n, 'inp', 0) )
+		self.or_n.out.conn = Pin(self, 'out', 'L')
+
 class ROM_D1(Obj):
+	# en, A_x, D_0
 	def __init__(self, parent, abit_n, dlst=(), name='rom_d1', latency=10):
 		Obj.__init__(self, parent, name)
 		self.dbgout(dlst)
 		self.n = abit_n
-		for i in range(abit_n):
-			Pin( self, name_i('A', i), 'L' )
-		n1 = abit_n - 1
-		msb = getattr( self, name_i('A', n1) )
-		msb.conn = DECODER(self, 1, 'deco', latency).inp_0
-
-		if abit_n == 1:
-			dlst_v = lambda i: dlst[i] if i < len(dlst) else -1
-			dlst_b = lambda i: bool( dlst_v(i) & 1 )
-			Pin(self, 'p0', dlst_b(0) ).conn = AND(self, 'and_d', latency).inp_a
-			Pin(self, 'p1', dlst_b(1) ).conn = AND(self, 'and_u', latency).inp_a
-		
-			en_d = self.and_d.inp_b
-			en_u = self.and_u.inp_b
-			out_d = self.and_d.out
-			out_u = self.and_u.out
-		else:
-			half = 1 << n1
-			ROM_D1(self, n1, dlst[ :half ], 'rom_d', latency)
-			ROM_D1(self, n1, dlst[ half: ], 'rom_u', latency)
-			Joint_N(self, n1, 'jt_n')
-			self.jt_n.new_pin_conn(self.rom_d, 'A')
-			self.jt_n.new_pin_conn(self.rom_u, 'A')
-			self.jt_n.new_pin_conn(self, 'A', n1, direc='from_targ')
-
-			en_d = self.rom_d.en
-			en_u = self.rom_u.en
-			out_d = self.rom_d.D_0
-			out_u = self.rom_u.D_0
-
-		self.deco.out_0.conn = en_d
-		self.deco.out_1.conn = en_u
-
-		OR(self, 'or_', latency).out.conn = AND(self, 'and_out', latency).inp_a
-		out_d.conn = self.or_.inp_a
-		out_u.conn = self.or_.inp_b
-
-		Pin(self, 'en', 'L').conn = Joint(self, 'jt').new_pin()
-		self.jt.new_pin().conn = self.deco.en
-		self.jt.new_pin().conn = self.and_out.inp_b
-		self.and_out.out.conn = Pin(self, 'D_0', 'L')
+		dn = 1 << abit_n
+
+		SELECTOR(self, abit_n, 'select', latency)
+
+		Pin(self, 'en', 'L').conn = self.select.en
+		new_pin_n(abit_n, self, 'A', 0, 'L')
+		conn2_n( abit_n, (self, 'A', 0), (self.select, 'A', 0) )
+		self.select.out.conn = Pin(self, 'D_0', 'L')
+
+		# as late as possible, for data enque
+		PinSet(self, dn, dlst, 'pin_set')
+		conn2_n( dn, (self.pin_set, 'p', 0), (self.select, 'D', 0) )
 
 class ROM(Obj):
+	# en, A_x, D_x
 	def __init__(self, parent, dbit_n, abit_n, dlst=(), name='rom', latency=10):
 		Obj.__init__(self, parent, name)
 		self.n = dbit_n
 		Pin(self, 'en', 'L').conn = Joint(self, 'jt_en').new_pin()
-		for i in range(abit_n):
-			Pin( self, name_i('A', i), 'L' )
+		new_pin_n(abit_n, self, 'A', 0, 'L')
 		Joint_N(self, abit_n, 'jt_n_A').new_pin_conn(self, 'A', abit_n, 'from_targ')
 
 		for i in range(dbit_n):
@@ -452,6 +464,7 @@
 			rom_b.D_0.conn = Pin( self, name_i('D', i), 'L' )
 
 class CLK(Obj):
+	# en, out
 	def __init__(self, parent, hz=1.0, name='clk', pos=(0,0), lamp_name=None):
 		Obj.__init__(self, parent, name, None, pos)
 		latency = tm_from_fsec( 1.0 / ( 2 * hz ) )
@@ -471,6 +484,7 @@
 			self.jt_out.new_pin().conn = Lamp(self, lamp_name).inp
 
 class Lamp(Obj):
+	# inp
 	def __init__(self, parent, name='lamp', latency=None, pos=(0,0), show_inf={}):
 		Obj.__init__(self, parent, name, latency, pos)
 		self.show_inf = show_inf
@@ -502,6 +516,7 @@
 		sys.stdout.flush()
 
 class Lamp_N(Obj):
+	# inp_x
 	def __init__(self, parent, n, name='lamp_n', latency=None, pos=(0,0), slide=('y',1)):
 		Obj.__init__(self, parent, name, latency, pos)
 		self.n = n
@@ -513,9 +528,10 @@
 
 	def conn_targ(self, targ, targ_pin_name, n=-1):
 		n = self.n if n < 0 else n
-		conn_n( n, targ, 0, targ_pin_name, self, 0, 'inp' )
+		conn2_n( n, (targ, targ_pin_name, 0), (self, 'inp', 0) )
 
 class Lamp_7seg(Obj):
+	# inp_x
 	def __init__(self, parent, name='lamp_7seg', latency=None, pos=(0,0)):
 		Obj.__init__(self, parent, name, None, pos)
 		lst = [
@@ -533,9 +549,10 @@
 			Pin( self, name_i('inp', i), 'L' ).conn = lamp.inp
 
 	def conn_targ(self, targ, targ_pin_name):
-		conn_n( 7, targ, 0, targ_pin_name, self, 0, 'inp' )
+		conn2_n( 7, (targ, targ_pin_name, 0), (self, 'inp', 0) )
 
 class DECODER_7seg(Obj):
+	# en, inp_x, out_x
 	def __init__(self, parent, name='dec_7seg', latency=10):
 		Obj.__init__(self, parent, name)
 		dlst = [
@@ -544,15 +561,13 @@
 		]
 		ROM(self, 7, 4, dlst, 'rom', latency)
 		Pin(self, 'en', 'L').conn = self.rom.en
-		for i in range(4):
-			Pin( self, name_i('inp', i), 'L' )
-		conn_n(4, self, 0, 'inp', self.rom, 0, 'A')
-		for i in range(7):
-			Pin( self, name_i('out', i), 'L' )
-		conn_n(7, self.rom, 0, 'D', self, 0, 'out')
+		new_pin_n(4, self, 'inp', 0, 'L')
+		conn2_n( 4, (self, 'inp', 0), (self.rom, 'A', 0) )
+		new_pin_n(7, self, 'out', 0, 'L')
+		conn2_n( 7, (self.rom, 'D', 0), (self, 'out', 0) )
 
 	def conn_targ(self, targ, targ_pin_name):
-		conn_n( 7, self, 0, 'out', targ, 0, targ_pin_name )
+		conn2_n( 7, (self, 'out', 0), (targ, targ_pin_name, 0) )
 
 class Sched:
 	def __init__(self):
@@ -620,10 +635,13 @@
 def new_pin_conn(obj, in_obj, sta_i, n=-1, name='inp', direc='to_in_obj'):
 	if n < 0:
 		n = in_obj.n
-	for i in range(n):
-		Pin( obj, name_i( name, sta_i + i ) )
+	new_pin_n(n, obj, name, sta_i)
 	direc_rev = (direc != 'to_in_obj')
-	conn_n(n, obj, sta_i, name, in_obj, 0, name, direc_rev)
+	conn2_n(n, (obj, name, sta_i), (in_obj, name, 0), direc_rev)
+
+def conn2_n( n, (from_obj, from_name, from_sta_i), (to_obj, to_name, to_sta_i), direc_rev=False ):
+	# replaced args, only ...
+	conn_n(n, from_obj, from_sta_i, from_name, to_obj, to_sta_i, to_name, direc_rev)
 
 def conn_n(n, from_obj, from_sta_i, from_name, to_obj, to_sta_i, to_name, direc_rev=False):
 	for i in range(n):
@@ -634,6 +652,16 @@
 				to_pin.conn = from_pin
 			else:
 				from_pin.conn = to_pin
+
+def new_pin_n(n, targ, name, name_sta_i=0, dlst=None):
+	for i in range(n):
+		Pin( targ, name_i(name, name_sta_i + i), get_dlst_val(i, dlst) )
+
+def get_dlst_val(i, dlst):
+	t = type(dlst)
+	if t not in [ tuple, list ]:
+		return dlst # same v
+	return dlst[i] if i < len(dlst) else -1
 
 def name_i(name, i):
 	return '{}_{}'.format(name, i)