=begin
入力オプションは "a1 b1 a2 b2 a3 b3 a4 b4 a5 b5 c s"。 ex. "X Y X c1 Y c1 c1 c1 c2 c3 c4 c5"
配線は手抜き
# NAND の SVG のオリジナルは
https://j...content-available-to-author-only...a.org/wiki/NAND%E3%82%B2%E3%83%BC%E3%83%88
https://j...content-available-to-author-only...a.org/wiki/NAND%E3%82%B2%E3%83%BC%E3%83%88#/media/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:NAND_ANSI_Labelled.svg
=end
ab = gets .chomp .split
exit if ab.size != 12
Logic = Struct .new ( :a , :b , :q , :stg , :x , :y , :no )
logics = [ ]
lHash = { 'x' => 0 ,'y' => 1 , 'c1' => 2 ,'c2' => 3 ,'c3' => 4 ,'c4' => 5 ,'c5' => 6 }
lName = % W{ X Y c1 c2 c3 c4 c5 }
lName2 = % W{ C S }
5 .times { | n|
logics << Logic.new ( lHash[ ab[ 2 * n] .downcase ] ,lHash[ ab[ 2 * n+ 1 ] .downcase ] ,false , false , - 1 ,- 1 , n )
}
logics[ lHash[ ab[ 10 ] .downcase ] - 2 ] .q = 0
logics[ lHash[ ab[ 11 ] .downcase ] - 2 ] .q = 1
# ステージ調査
begin
lg = [ ]
logics.each { | s|
lg[ 2 * s.no ] = true if s.a < = 1
lg[ 2 * s.no + 1 ] = true if s.b < = 1
}
4 .times { | st|
sq = [ ]
5 .times { | i|
next if logics[ i] .stg
next unless lg[ 2 * i] && lg[ 2 * i+ 1 ]
logics[ i] .stg = st
sq << "c#{i+1}"
}
sq.each { | q|
ab.each_with_index { | s,i|
lg[ i] = true if s == q
}
}
}
end
# 座標決定
begin
max_stg = [ ]
logics.each { | s| max_stg[ s.stg ] = ( max_stg[ s.stg ] || 0 ) + 1 }
max_stg.size .times { | j|
si = 0
logics.each_with_index { | s,i|
next unless j == s.stg
s.x = s.stg * 120 * 2 + 20
s.y = si * 100 + 20
si + = 1
}
}
( max_stg.max - 1 ) .times { | n|
max_stg.each_with_index { | s,i|
next unless s == n + 1
logics.each { | x|
next unless x.stg == i
x.y + = 50 * ( s- n)
}
}
}
end
# SVG出力
print <<_EOT_
<svg xmlns:xlink="http://w...content-available-to-author-only...3.org/1999/xlink" xmlns="http://w...content-available-to-author-only...3.org/2000/svg" id="nand_logic"
width="#{120*8}"
height="#{50*8}"
>
<defs>
<g id="nand">
<path style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
d="M 40,5 L 40,6.4285714 L 40,43.571429 L 40,45 L 41.428571,45 L 60.47619,45 C 71.744098,45 80.47619,35.999955 80.47619,25 C 80.47619,14.000045 71.744099,5.0000002 60.47619,5 C 60.47619,5 60.47619,5 41.428571,5 L 40,5 z M 42.857143,7.8571429 C 50.834264,7.8571429 55.918368,7.8571429 58.095238,7.8571429 C 59.285714,7.8571429 59.880952,7.8571429 60.178571,7.8571429 C 60.327381,7.8571429 60.409227,7.8571429 60.446429,7.8571429 C 60.465029,7.8571429 60.471543,7.8571429 60.47619,7.8571429 C 70.236853,7.857143 77.142857,15.497098 77.142857,25 C 77.142857,34.502902 69.760662,42.142857 60,42.142857 L 42.857143,42.142857 L 42.857143,7.8571429 z" />
<g style="fill:none;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1">
<path d="M 41,15 L 15,15" />
<path d="M 41,35 L 15,35" />
<path d="M 88.11111,25 C 101.62222,25 105,25 105,25" />
<path d="M 88,25 A 4,4 0 1 1 80,25 A 4,4 0 1 1 88,25 z" />
</g>
</g>
</defs>
<style type="text/css">
.wire1{ stroke:black; stroke-width:2; stroke-opacity:1; fill:none }
.wire2{ stroke:blue; stroke-width:2; stroke-opacity:1; fill:none }
</style>
_EOT_
logics.each { | s|
puts % Q{ \t< use xlink:href="#nand" x="#{s.x}" y="#{s.y}" /> }
}
puts % Q{ < g font- weight="400" font- size="17px" > }
logics.each { | s|
puts % Q{ \t< text text- anchor="end" x="#{s.x+38}" y="#{s.y+10}" > a#{s.no+1}</text>}
puts % Q{ \t< text text- anchor="end" x="#{s.x+38}" y="#{s.y+32}" > b#{s.no+1}</text>}
puts % Q{ \t< text x="#{s.x+90}" y="#{s.y+21}" > c#{s.no+1}</text>}
}
puts " </g>"
puts % Q{ < g font- weight="bolder" font- size="20px" > }
logics.each { | s|
puts % Q{ \t< text text- anchor="end" x="#{s.x+12}" y="#{s.y+22}" > #{lName[s.a]}</text>} if s.a < 2
puts % Q{ \t< text text- anchor="end" x="#{s.x+12}" y="#{s.y+42}" > #{lName[s.b]}</text>} if s.b < 2
if s.q
puts % Q{ \t< path class ="wire1" d="M #{s.x+105},#{s.y+25} l 20,0" /> }
puts % Q{ \t< text x="#{s.x+112+20}" y="#{s.y+32}" > #{lName2[s.q]}</text>}
else
sno = s.no + 2
corner = s.no * 10
logics.each { | s2|
if s2.a == sno
puts % Q{ \t< path class ="wire2" d="M #{s.x+105},#{s.y+25} l #{50+corner},0 l 0,#{s2.y+15-s.y-25} L #{s2.x+15},#{s2.y+15}" /> }
end
if s2.b == sno
puts % Q{ \t< path class ="wire2" d="M #{s.x+105},#{s.y+25} l #{50+corner},0 l 0,#{s2.y+35-s.y-25} L #{s2.x+15},#{s2.y+35}" /> }
end
}
end
}
print <<_EOT_
</g>
</svg>
_EOT_
PWJlZ2luCgoJ5YWl5Yqb44Kq44OX44K344On44Oz44GvICAiYTEgYjEgYTIgYjIgYTMgYjMgYTQgYjQgYTUgYjUgYyBzIuOAgiBleC4gIlggWSBYIGMxIFkgYzEgYzEgYzEgYzIgYzMgYzQgYzUiCgoJ6YWN57ea44Gv5omL5oqc44GNCgojIE5BTkQg44GuIFNWRyDjga7jgqrjg6rjgrjjg4rjg6vjga8KaHR0cHM6Ly9qLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5hLm9yZy93aWtpL05BTkQlRTMlODIlQjIlRTMlODMlQkMlRTMlODMlODgKaHR0cHM6Ly9qLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5hLm9yZy93aWtpL05BTkQlRTMlODIlQjIlRTMlODMlQkMlRTMlODMlODgjL21lZGlhLyVFMyU4MyU5NSVFMyU4MiVBMSVFMyU4MiVBNCVFMyU4MyVBQjpOQU5EX0FOU0lfTGFiZWxsZWQuc3ZnCgo9ZW5kCgoJYWIgPSBnZXRzLmNob21wLnNwbGl0CglleGl0CWlmIGFiLnNpemUgIT0gMTIKCglMb2dpYyA9IFN0cnVjdC5uZXcoIDphLCA6YiwgOnEsIDpzdGcsIDp4LCA6eSwgOm5vICkKCWxvZ2ljcyA9IFtdCgoKCWxIYXNoID0geyAneCc9PjAsJ3knPT4xLCAnYzEnPT4yLCdjMic9PjMsJ2MzJz0+NCwnYzQnPT41LCdjNSc9PjYgfQoJbE5hbWUgPSAlV3sgWCBZIGMxIGMyIGMzIGM0IGM1IH0KCWxOYW1lMiA9ICVXeyBDIFMgfQoJNS50aW1lc3t8bnwKCQlsb2dpY3MgPDwgTG9naWMubmV3KCBsSGFzaFsgYWJbMipuXS5kb3duY2FzZSBdLGxIYXNoWyBhYlsyKm4rMV0uZG93bmNhc2UgXSxmYWxzZSwgZmFsc2UsIC0xLC0xLCBuICkKCX0KCWxvZ2ljc1sgbEhhc2hbIGFiWzEwXS5kb3duY2FzZSBdLTIgXS5xID0gMAoJbG9naWNzWyBsSGFzaFsgYWJbMTFdLmRvd25jYXNlIF0tMiBdLnEgPSAxCgojIOOCueODhuODvOOCuOiqv+afuwoJYmVnaW4KCQlsZyA9IFtdCgkJbG9naWNzLmVhY2h7fHN8CgkJCWxnWzIqcy5ub10gICA9IHRydWUJaWYgcy5hIDw9IDEKCQkJbGdbMipzLm5vKzFdID0gdHJ1ZQlpZiBzLmIgPD0gMQoJCX0KCQk0LnRpbWVze3xzdHwKCQkJc3EgPSBbXQoJCQk1LnRpbWVze3xpfAoJCQkJbmV4dAlpZiBsb2dpY3NbaV0uc3RnCgkJCQluZXh0CXVubGVzcyBsZ1syKmldICYmIGxnWzIqaSsxXQoJCQkJbG9naWNzW2ldLnN0ZyA9IHN0CgkJCQlzcSA8PCAiYyN7aSsxfSIKCQkJfQoJCQlzcS5lYWNoe3xxfAoJCQkJYWIuZWFjaF93aXRoX2luZGV4e3xzLGl8CgkJCQkJbGdbaV0gPSB0cnVlCWlmIHMgPT0gcQoJCQkJfQoJCQl9CgkJfQoJZW5kCgojIOW6p+aomeaxuuWumgoJYmVnaW4KCQltYXhfc3RnID0gW10KCQlsb2dpY3MuZWFjaHt8c3wgbWF4X3N0Z1tzLnN0Z10gPSAobWF4X3N0Z1tzLnN0Z10gfHwgMCkgKyAxIH0KCQltYXhfc3RnLnNpemUudGltZXN7fGp8CgkJCXNpID0gMAoJCQlsb2dpY3MuZWFjaF93aXRoX2luZGV4e3xzLGl8CgkJCQluZXh0CXVubGVzcyBqID09IHMuc3RnCgkJCQlzLnggPSBzLnN0ZyAqIDEyMCAqIDIgKyAyMCAKCQkJCXMueSA9IHNpICogMTAwICsgMjAKCQkJCXNpICs9IDEKCQkJfQoJCX0KCQkobWF4X3N0Zy5tYXgtMSkudGltZXN7fG58CgkJCW1heF9zdGcuZWFjaF93aXRoX2luZGV4e3xzLGl8CgkJCQluZXh0CXVubGVzcyBzID09IG4gKyAxCgkJCQlsb2dpY3MuZWFjaHt8eHwKCQkJCQluZXh0CXVubGVzcyB4LnN0ZyA9PSBpCgkJCQkJeC55ICs9IDUwICogKHMtbikKCQkJCX0KCQkJfQoJCX0KCWVuZAoKIyBTVkflh7rlipsKCQlwcmludCA8PF9FT1RfCjxzdmcgeG1sbnM6eGxpbms9Imh0dHA6Ly93Li4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi4zLm9yZy8xOTk5L3hsaW5rIiB4bWxucz0iaHR0cDovL3cuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLjMub3JnLzIwMDAvc3ZnIiBpZD0ibmFuZF9sb2dpYyIKICAgd2lkdGg9IiN7MTIwKjh9IgogICBoZWlnaHQ9IiN7NTAqOH0iCj4KPGRlZnM+Cgk8ZyBpZD0ibmFuZCI+CgkJPHBhdGggc3R5bGU9ImZvbnQtc2l6ZTptZWRpdW07Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDt0ZXh0LWluZGVudDowO3RleHQtYWxpZ246c3RhcnQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7bGluZS1oZWlnaHQ6bm9ybWFsO2xldHRlci1zcGFjaW5nOm5vcm1hbDt3b3JkLXNwYWNpbmc6bm9ybWFsO3RleHQtdHJhbnNmb3JtOm5vbmU7ZGlyZWN0aW9uOmx0cjtibG9jay1wcm9ncmVzc2lvbjp0Yjt3cml0aW5nLW1vZGU6bHItdGI7dGV4dC1hbmNob3I6c3RhcnQ7ZmlsbDpibGFjaztmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MzttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpCaXRzdHJlYW0gVmVyYSBTYW5zIgoJCQlkPSJNIDQwLDUgTCA0MCw2LjQyODU3MTQgTCA0MCw0My41NzE0MjkgTCA0MCw0NSBMIDQxLjQyODU3MSw0NSBMIDYwLjQ3NjE5LDQ1IEMgNzEuNzQ0MDk4LDQ1IDgwLjQ3NjE5LDM1Ljk5OTk1NSA4MC40NzYxOSwyNSBDIDgwLjQ3NjE5LDE0LjAwMDA0NSA3MS43NDQwOTksNS4wMDAwMDAyIDYwLjQ3NjE5LDUgQyA2MC40NzYxOSw1IDYwLjQ3NjE5LDUgNDEuNDI4NTcxLDUgTCA0MCw1IHogTSA0Mi44NTcxNDMsNy44NTcxNDI5IEMgNTAuODM0MjY0LDcuODU3MTQyOSA1NS45MTgzNjgsNy44NTcxNDI5IDU4LjA5NTIzOCw3Ljg1NzE0MjkgQyA1OS4yODU3MTQsNy44NTcxNDI5IDU5Ljg4MDk1Miw3Ljg1NzE0MjkgNjAuMTc4NTcxLDcuODU3MTQyOSBDIDYwLjMyNzM4MSw3Ljg1NzE0MjkgNjAuNDA5MjI3LDcuODU3MTQyOSA2MC40NDY0MjksNy44NTcxNDI5IEMgNjAuNDY1MDI5LDcuODU3MTQyOSA2MC40NzE1NDMsNy44NTcxNDI5IDYwLjQ3NjE5LDcuODU3MTQyOSBDIDcwLjIzNjg1Myw3Ljg1NzE0MyA3Ny4xNDI4NTcsMTUuNDk3MDk4IDc3LjE0Mjg1NywyNSBDIDc3LjE0Mjg1NywzNC41MDI5MDIgNjkuNzYwNjYyLDQyLjE0Mjg1NyA2MCw0Mi4xNDI4NTcgTCA0Mi44NTcxNDMsNDIuMTQyODU3IEwgNDIuODU3MTQzLDcuODU3MTQyOSB6IiAvPgoJCTxnIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOmJsYWNrO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiPgoJCQk8cGF0aCBkPSJNIDQxLDE1IEwgMTUsMTUiIC8+CgkJCTxwYXRoIGQ9Ik0gNDEsMzUgTCAxNSwzNSIgLz4KCQkJPHBhdGggZD0iTSA4OC4xMTExMSwyNSBDIDEwMS42MjIyMiwyNSAxMDUsMjUgMTA1LDI1IiAvPgoJCQk8cGF0aCBkPSJNIDg4LDI1IEEgNCw0IDAgMSAxIDgwLDI1IEEgNCw0IDAgMSAxIDg4LDI1IHoiIC8+CgkJPC9nPgoJPC9nPgo8L2RlZnM+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkud2lyZTF7IHN0cm9rZTpibGFjazsgc3Ryb2tlLXdpZHRoOjI7IHN0cm9rZS1vcGFjaXR5OjE7IGZpbGw6bm9uZSB9Cgkud2lyZTJ7IHN0cm9rZTpibHVlOyAgc3Ryb2tlLXdpZHRoOjI7IHN0cm9rZS1vcGFjaXR5OjE7IGZpbGw6bm9uZSB9Cjwvc3R5bGU+CgpfRU9UXwoKCQlsb2dpY3MuZWFjaHt8c3wKCQkJcHV0cyAlUXtcdDx1c2UgeGxpbms6aHJlZj0iI25hbmQiIHg9IiN7cy54fSIgeT0iI3tzLnl9IiAvPn0KCQl9CgkJcHV0cyAlUXsgIDxnIGZvbnQtd2VpZ2h0PSI0MDAiIGZvbnQtc2l6ZT0iMTdweCIgPn0KCQlsb2dpY3MuZWFjaHt8c3wKCQkJcHV0cyAlUXtcdDx0ZXh0IHRleHQtYW5jaG9yPSJlbmQiIHg9IiN7cy54KzM4fSIgeT0iI3tzLnkrMTB9Ij5hI3tzLm5vKzF9PC90ZXh0Pn0KCQkJcHV0cyAlUXtcdDx0ZXh0IHRleHQtYW5jaG9yPSJlbmQiIHg9IiN7cy54KzM4fSIgeT0iI3tzLnkrMzJ9Ij5iI3tzLm5vKzF9PC90ZXh0Pn0KCQkJcHV0cyAlUXtcdDx0ZXh0IHg9IiN7cy54KzkwfSIgeT0iI3tzLnkrMjF9Ij5jI3tzLm5vKzF9PC90ZXh0Pn0KCQl9CgkJcHV0cyAiICA8L2c+IgoKCQlwdXRzICVReyAgPGcgZm9udC13ZWlnaHQ9ImJvbGRlciIgZm9udC1zaXplPSIyMHB4IiA+fQoJCWxvZ2ljcy5lYWNoe3xzfAoJCQlwdXRzICVRe1x0PHRleHQgdGV4dC1hbmNob3I9ImVuZCIgeD0iI3tzLngrMTJ9IiB5PSIje3MueSsyMn0iPiN7bE5hbWVbcy5hXX08L3RleHQ+fQlpZiBzLmEgPCAyCgkJCXB1dHMgJVF7XHQ8dGV4dCB0ZXh0LWFuY2hvcj0iZW5kIiB4PSIje3MueCsxMn0iIHk9IiN7cy55KzQyfSI+I3tsTmFtZVtzLmJdfTwvdGV4dD59CWlmIHMuYiA8IDIKCQkJaWYgcy5xCgkJCQlwdXRzICVRe1x0PHBhdGggY2xhc3M9IndpcmUxIiBkPSJNICN7cy54KzEwNX0sI3tzLnkrMjV9IGwgMjAsMCIgLz59CgkJCQlwdXRzICVRe1x0PHRleHQgeD0iI3tzLngrMTEyKzIwfSIgeT0iI3tzLnkrMzJ9Ij4je2xOYW1lMltzLnFdfTwvdGV4dD59CgkJCWVsc2UKCQkJCXNubyA9IHMubm8gKyAyCgkJCQljb3JuZXIgPSBzLm5vICogMTAKCQkJCWxvZ2ljcy5lYWNoe3xzMnwKCQkJCQlpZiBzMi5hID09IHNubwoJCQkJCQlwdXRzICVRe1x0PHBhdGggY2xhc3M9IndpcmUyIiBkPSJNICN7cy54KzEwNX0sI3tzLnkrMjV9IGwgI3s1MCtjb3JuZXJ9LDAgbCAwLCN7czIueSsxNS1zLnktMjV9IEwgI3tzMi54KzE1fSwje3MyLnkrMTV9IiAvPn0KCQkJCQllbmQKCQkJCQlpZiBzMi5iID09IHNubwoJCQkJCQlwdXRzICVRe1x0PHBhdGggY2xhc3M9IndpcmUyIiBkPSJNICN7cy54KzEwNX0sI3tzLnkrMjV9IGwgI3s1MCtjb3JuZXJ9LDAgbCAwLCN7czIueSszNS1zLnktMjV9IEwgI3tzMi54KzE1fSwje3MyLnkrMzV9IiAvPn0KCQkJCQllbmQKCQkJCX0KCQkJZW5kCgkJfQoJCXByaW50IDw8X0VPVF8KICA8L2c+Cjwvc3ZnPgpfRU9UXwo=
stdout
<svg xmlns:xlink="http://w...content-available-to-author-only...3.org/1999/xlink" xmlns="http://w...content-available-to-author-only...3.org/2000/svg" id="nand_logic"
width="960"
height="400"
>
<defs>
<g id="nand">
<path style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
d="M 40,5 L 40,6.4285714 L 40,43.571429 L 40,45 L 41.428571,45 L 60.47619,45 C 71.744098,45 80.47619,35.999955 80.47619,25 C 80.47619,14.000045 71.744099,5.0000002 60.47619,5 C 60.47619,5 60.47619,5 41.428571,5 L 40,5 z M 42.857143,7.8571429 C 50.834264,7.8571429 55.918368,7.8571429 58.095238,7.8571429 C 59.285714,7.8571429 59.880952,7.8571429 60.178571,7.8571429 C 60.327381,7.8571429 60.409227,7.8571429 60.446429,7.8571429 C 60.465029,7.8571429 60.471543,7.8571429 60.47619,7.8571429 C 70.236853,7.857143 77.142857,15.497098 77.142857,25 C 77.142857,34.502902 69.760662,42.142857 60,42.142857 L 42.857143,42.142857 L 42.857143,7.8571429 z" />
<g style="fill:none;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1">
<path d="M 41,15 L 15,15" />
<path d="M 41,35 L 15,35" />
<path d="M 88.11111,25 C 101.62222,25 105,25 105,25" />
<path d="M 88,25 A 4,4 0 1 1 80,25 A 4,4 0 1 1 88,25 z" />
</g>
</g>
</defs>
<style type="text/css">
.wire1{ stroke:black; stroke-width:2; stroke-opacity:1; fill:none }
.wire2{ stroke:blue; stroke-width:2; stroke-opacity:1; fill:none }
</style>
<use xlink:href="#nand" x="20" y="70" />
<use xlink:href="#nand" x="260" y="20" />
<use xlink:href="#nand" x="260" y="120" />
<use xlink:href="#nand" x="260" y="220" />
<use xlink:href="#nand" x="500" y="70" />
<g font-weight="400" font-size="17px" >
<text text-anchor="end" x="58" y="80">a1</text>
<text text-anchor="end" x="58" y="102">b1</text>
<text x="110" y="91">c1</text>
<text text-anchor="end" x="298" y="30">a2</text>
<text text-anchor="end" x="298" y="52">b2</text>
<text x="350" y="41">c2</text>
<text text-anchor="end" x="298" y="130">a3</text>
<text text-anchor="end" x="298" y="152">b3</text>
<text x="350" y="141">c3</text>
<text text-anchor="end" x="298" y="230">a4</text>
<text text-anchor="end" x="298" y="252">b4</text>
<text x="350" y="241">c4</text>
<text text-anchor="end" x="538" y="80">a5</text>
<text text-anchor="end" x="538" y="102">b5</text>
<text x="590" y="91">c5</text>
</g>
<g font-weight="bolder" font-size="20px" >
<text text-anchor="end" x="32" y="92">X</text>
<text text-anchor="end" x="32" y="112">Y</text>
<path class="wire2" d="M 125,95 l 50,0 l 0,-40 L 275,55" />
<path class="wire2" d="M 125,95 l 50,0 l 0,60 L 275,155" />
<path class="wire2" d="M 125,95 l 50,0 l 0,140 L 275,235" />
<path class="wire2" d="M 125,95 l 50,0 l 0,160 L 275,255" />
<text text-anchor="end" x="272" y="42">X</text>
<path class="wire2" d="M 365,45 l 60,0 l 0,40 L 515,85" />
<text text-anchor="end" x="272" y="142">Y</text>
<path class="wire2" d="M 365,145 l 70,0 l 0,-40 L 515,105" />
<path class="wire1" d="M 365,245 l 20,0" />
<text x="392" y="252">C</text>
<path class="wire1" d="M 605,95 l 20,0" />
<text x="632" y="102">S</text>
</g>
</svg>