Skip to content

Instantly share code, notes, and snippets.

@josyb
Last active August 31, 2015 14:09
Show Gist options
  • Save josyb/3d8eb3a2fe56e2e4e478 to your computer and use it in GitHub Desktop.
Save josyb/3d8eb3a2fe56e2e4e478 to your computer and use it in GitHub Desktop.
MyHDL Structured Types in action.
-- File: aos.vhd
-- Generated by MyHDL 1.0dev
-- Date: Mon Aug 31 15:57:52 2015
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
use std.textio.all;
use work.pck_myhdl_10.all;
entity aos is
port(
Clk : in std_logic;
Reset : in std_logic;
A0 : in unsigned(1 downto 0);
A1 : in unsigned(1 downto 0);
CI : in unsigned(1 downto 0);
D : in unsigned(7 downto 0);
Wr : in std_logic;
WrCI : in std_logic;
Q : out unsigned(23 downto 0)
);
end entity aos;
-- a small example to test the StructType experimental implementation
architecture MyHDL of aos is
type a3_rgbpix is array (0 to 3 - 1) of rgbpix;
type a3_a3_rgbpix is array (0 to 3 - 1) of a3_rgbpix;
type rgbpix is record
r : unsigned(7 downto 0);
b : unsigned(7 downto 0);
g : unsigned(7 downto 0);
end record;
signal lg : unsigned(7 downto 0);
signal lb : unsigned(7 downto 0);
signal plane : a3_a3_rgbpix;
signal pixel : rgbpix;
begin
aos_aoifill : process(Clk, Reset) is
begin
if (Reset = '1') then
Q <= to_unsigned(0, 24);
lg <= to_unsigned(0, 8);
lb <= to_unsigned(0, 8);
elsif rising_edge(Clk) then
if ((0 = CI) and bool(WrCI)) then
lb <= D;
end if;
if ((1 = CI) and bool(WrCI)) then
lg <= D;
end if;
if ((2 = CI) and bool(WrCI)) then
pixel.b <= lb;
pixel.g <= lg;
pixel.r(4 - 1 downto 0) := D(8 - 1 downto 4);
pixel.r(8 - 1 downto 4) := D(4 - 1 downto 0);
end if;
for k in 0 to 3 - 1 loop
for j in 0 to 3 - 1 loop
if ((k = signed(resize(A1, 3))) and (j = signed(resize(A0, 3))) and bool(Wr)) then
plane(k)(j) <= pixel;
end if;
end loop;
end loop;
Q(8 - 1 downto 0) <= plane(to_integer(A1))(to_integer(A0)).b;
Q(16 - 1 downto 8) <= plane(to_integer(A1))(to_integer(A0)).g;
Q(24 - 1 downto 16) <= plane(to_integer(A1))(to_integer(A0)).r;
end if;
end process aos_aoifill;
end architecture MyHDL;
'''
Created on 28 August 2015
@author: Josy
'''
from __future__ import print_function
import random
import myhdl
import hdlutils
class rgbpix( myhdl.StructType ):
''' an struct/record with conversion routines '''
def __init__( self, WIDTH_PIXEL = 10, values = None ):
self._WIDTH_PIXEL = WIDTH_PIXEL
if values is None:
self.b = myhdl.Signal( myhdl.intbv( 0 )[self._WIDTH_PIXEL:] )
self.g = myhdl.Signal( myhdl.intbv( 0 )[self._WIDTH_PIXEL:] )
self.r = myhdl.Signal( myhdl.intbv( 0 )[self._WIDTH_PIXEL:] )
else:
self.b = myhdl.Signal( myhdl.intbv( values[0] )[self._WIDTH_PIXEL:] )
self.g = myhdl.Signal( myhdl.intbv( values[1] )[self._WIDTH_PIXEL:] )
self.r = myhdl.Signal( myhdl.intbv( values[2] )[self._WIDTH_PIXEL:] )
def torecord( self, v ):
''' we 'reformat' a vector into an interface/record '''
trWIDTH_PIXEL = self._WIDTH_PIXEL
@myhdl.always_comb
def torecord():
lv = v
self.b.next = lv[( 0 + 1 ) * trWIDTH_PIXEL : 0 * trWIDTH_PIXEL]
self.g.next = lv[( 1 + 1 ) * trWIDTH_PIXEL : 1 * trWIDTH_PIXEL]
self.r.next = lv[( 2 + 1 ) * trWIDTH_PIXEL : 2 * trWIDTH_PIXEL]
return torecord
def tointbv( self, y ):
''' build a flattened vector from the record's elements in ascending order'''
tiWIDTH_PIXEL = self._WIDTH_PIXEL
@myhdl.always_comb
def tointbv():
y.next[( 0 + 1 ) * tiWIDTH_PIXEL : 0 * tiWIDTH_PIXEL ] = self.b
y.next[( 1 + 1 ) * tiWIDTH_PIXEL : 1 * tiWIDTH_PIXEL ] = self.g
y.next[( 2 + 1 ) * tiWIDTH_PIXEL : 2 * tiWIDTH_PIXEL ] = self.r
return tointbv
def tonatural( self ):
return ( ( ( self.r << self._WIDTH_PIXEL ) + self.g ) << self._WIDTH_PIXEL ) + self.b
def flatten(self):
return myhdl.ConcatSignal( self.r, self.g, self.b)
def aos( Clk, Reset, A0, A1, CI, D , Wr , WrCI, Q ):
''' a small example to test the StructType experimental implementation '''
lb,lg = [myhdl.Signal( myhdl.intbv(0)[8:]) for _ in range(2)]
pixel = rgbpix(8)
plane = myhdl.Array( ( 3, 3 ), rgbpix( 8 ) )
# qpixel = rgbpix(8)
@myhdl.always_seq( Clk.posedge, reset = Reset )
def aoifill():
if 0 == CI and WrCI:
lb.next = D
if 1 == CI and WrCI:
lg.next = D
if 2 == CI and WrCI:
pixel.b.next = lb
pixel.g.next = lg
pixel.r.next[4:] = D[:4] # this works
pixel.r.next[:4] = D[4:]
for k in range( 3 ):
for j in range( 3 ):
if k == A1 and j == A0 and Wr:
plane[k][j].next = pixel # this works
# plane[k][j].b.next = pixel.b
# plane[k][j].g.next = pixel.g
# plane[k][j].r.next[4:] = pixel.r[:4] # this doesn't work
# plane[k][j].r.next[:4] = pixel.r[4:] # this doesn't work
# always reading
# Q.next = (plane[A1][A0].r << 16) + (plane[A1][A0].g << 8) + plane[A1][A0].b
# qpixel.next = plane[A1][A0]
Q.next[ 8: ] = plane[A1][A0].b
Q.next[16: 8] = plane[A1][A0].g
Q.next[24:16] = plane[A1][A0].r
return aoifill
def tb_aos():
TB_WIDTH_D = 8
Clk = myhdl.Signal( bool( 0 ) )
Reset = myhdl.ResetSignal( 0, active = 1, async = True )
A0, A1 , CI = [myhdl.Signal( myhdl.intbv( 0 , min = 0, max = 3 ) ) for _ in range( 3 )]
D = myhdl.Signal( myhdl.intbv( 0 )[TB_WIDTH_D:] )
Wr = myhdl.Signal( bool( 0 ) )
WrCI = myhdl.Signal( bool( 0 ) )
Q = myhdl.Signal( myhdl.intbv( 0 )[TB_WIDTH_D * 3:] )
dut = aos( Clk, Reset, A0, A1, CI, D, Wr, WrCI, Q )
td = [[[ ( k * 3 + j ) * 3 + i + 1 for i in range( 3 )] for j in range( 3 )] for k in range( 3 ) ]
# tally
ClkCount = myhdl.Signal( myhdl.intbv( 0 )[32:] )
tCK = 20
@myhdl.instance
def clkgen():
yield hdlutils.genClk( Clk, tCK, ClkCount )
@myhdl.instance
def resetgen():
yield hdlutils.genReset( Clk, tCK, Reset )
@myhdl.instance
def stimulusin():
yield hdlutils.delayclks( Clk, tCK, 5 )
for k in range( 3 ):
A1.next = k
for j in range( 3 ):
A0.next = j
for i in range( 3 ):
CI.next = i
D.next = td[k][j][i]
yield hdlutils.pulsesig( Clk, tCK, WrCI, 1, 1 )
yield hdlutils.delayclks( Clk, tCK, 1 )
yield hdlutils.pulsesig( Clk, tCK, Wr, 1, 1 )
yield hdlutils.delayclks( Clk, tCK, 1 )
for k in range( 3 ):
A1.next = k
for j in range( 3 ):
A0.next = j
yield hdlutils.delayclks( Clk, tCK, 3 )
yield hdlutils.delayclks( Clk, tCK, 5 )
raise myhdl.StopSimulation
return dut, clkgen, resetgen, stimulusin
def convert():
WIDTH_D = 8
Clk = myhdl.Signal( bool( 0 ) )
Reset = myhdl.ResetSignal( 0, active = 1, async = True )
A0, A1 , CI = [myhdl.Signal( myhdl.intbv( 0 , min = 0, max = 3 ) ) for _ in range( 3 )]
D = myhdl.Signal( myhdl.intbv( 0 )[WIDTH_D:] )
B = myhdl.Signal( bool( 0 ) )
Wr = myhdl.Signal( bool( 0 ) )
WrCI = myhdl.Signal( bool( 0 ) )
Q = myhdl.Signal( myhdl.intbv( 0 )[WIDTH_D * 3:] )
myhdl.toVHDL( aos, Clk, Reset, A0, A1, CI, D, Wr, WrCI, Q )
if __name__ == '__main__':
hdlutils.simulate( 10000, tb_aos )
convert()
$date
Mon Aug 31 15:57:52 2015
$end
$version
MyHDL 1.0dev
$end
$timescale
1ns
$end
$scope module tb_aos $end
$var reg 1 ! Reset $end
$var reg 24 " Q $end
$var reg 2 # CI $end
$var reg 8 $ D $end
$var reg 1 % Clk $end
$var reg 2 & A1 $end
$var reg 2 ' A0 $end
$var reg 1 ( Wr $end
$var reg 32 ) ClkCount $end
$var reg 1 * WrCI $end
$scope module dut $end
$var reg 1 ! Reset $end
$var reg 8 + lg $end
$var reg 2 # CI $end
$var reg 2 & A1 $end
$var reg 8 , lb $end
$var reg 8 $ D $end
$var reg 1 % Clk $end
$var reg 24 " Q $end
$var reg 2 ' A0 $end
$var reg 1 ( Wr $end
$var reg 1 * WrCI $end
$scope module plane $end
$scope module plane(0)(0) $end
$var reg 8 - plane(0)(0).b $end
$var reg 8 . plane(0)(0).r $end
$var reg 8 / plane(0)(0).g $end
$upscope $end
$scope module plane(0)(1) $end
$var reg 8 0 plane(0)(1).b $end
$var reg 8 1 plane(0)(1).r $end
$var reg 8 2 plane(0)(1).g $end
$upscope $end
$scope module plane(0)(2) $end
$var reg 8 3 plane(0)(2).b $end
$var reg 8 4 plane(0)(2).r $end
$var reg 8 5 plane(0)(2).g $end
$upscope $end
$scope module plane(1)(0) $end
$var reg 8 6 plane(1)(0).b $end
$var reg 8 7 plane(1)(0).r $end
$var reg 8 8 plane(1)(0).g $end
$upscope $end
$scope module plane(1)(1) $end
$var reg 8 9 plane(1)(1).b $end
$var reg 8 : plane(1)(1).r $end
$var reg 8 ; plane(1)(1).g $end
$upscope $end
$scope module plane(1)(2) $end
$var reg 8 < plane(1)(2).b $end
$var reg 8 = plane(1)(2).r $end
$var reg 8 > plane(1)(2).g $end
$upscope $end
$scope module plane(2)(0) $end
$var reg 8 ? plane(2)(0).b $end
$var reg 8 @ plane(2)(0).r $end
$var reg 8 A plane(2)(0).g $end
$upscope $end
$scope module plane(2)(1) $end
$var reg 8 B plane(2)(1).b $end
$var reg 8 C plane(2)(1).r $end
$var reg 8 D plane(2)(1).g $end
$upscope $end
$scope module plane(2)(2) $end
$var reg 8 E plane(2)(2).b $end
$var reg 8 F plane(2)(2).r $end
$var reg 8 G plane(2)(2).g $end
$upscope $end
$upscope $end
$scope module pixel $end
$var reg 8 H pixel.r $end
$var reg 8 I pixel.b $end
$var reg 8 J pixel.g $end
$upscope $end
$upscope $end
$upscope $end
$enddefinitions $end
$dumpvars
0!
b000000000000000000000000 "
b00 #
b00000000 $
0%
b00 &
b00 '
0(
b00000000000000000000000000000000 )
0*
b00000000 +
b00000000 ,
b00000000 -
b00000000 .
b00000000 /
b00000000 0
b00000000 1
b00000000 2
b00000000 3
b00000000 4
b00000000 5
b00000000 6
b00000000 7
b00000000 8
b00000000 9
b00000000 :
b00000000 ;
b00000000 <
b00000000 =
b00000000 >
b00000000 ?
b00000000 @
b00000000 A
b00000000 B
b00000000 C
b00000000 D
b00000000 E
b00000000 F
b00000000 G
b00000000 H
b00000000 I
b00000000 J
$end
1!
1%
#10
0%
b00000000000000000000000000000001 )
#20
1%
#30
0%
b00000000000000000000000000000010 )
#40
1%
#50
0%
b00000000000000000000000000000011 )
#60
1%
#70
0%
b00000000000000000000000000000100 )
0!
#80
1%
#85
b00000001 $
1*
#90
0%
b00000000000000000000000000000101 )
#100
1%
b00000001 ,
#105
0*
#110
0%
b00000000000000000000000000000110 )
#120
1%
#125
b01 #
b00000010 $
1*
#130
0%
b00000000000000000000000000000111 )
#140
1%
b00000010 +
#145
0*
#150
0%
b00000000000000000000000000001000 )
#160
1%
#165
b10 #
b00000011 $
1*
#170
0%
b00000000000000000000000000001001 )
#180
1%
b00000001 I
b00000010 J
b00110000 H
#185
0*
#190
0%
b00000000000000000000000000001010 )
#200
1%
#205
1(
#210
0%
b00000000000000000000000000001011 )
#220
1%
b00000001 -
b00110000 .
b00000010 /
#225
0(
#230
0%
b00000000000000000000000000001100 )
#240
1%
b001100000000001000000001 "
#245
b01 '
b00 #
b00000100 $
1*
#250
0%
b00000000000000000000000000001101 )
#260
1%
b00000100 ,
b000000000000000000000000 "
#265
0*
#270
0%
b00000000000000000000000000001110 )
#280
1%
#285
b01 #
b00000101 $
1*
#290
0%
b00000000000000000000000000001111 )
#300
1%
b00000101 +
#305
0*
#310
0%
b00000000000000000000000000010000 )
#320
1%
#325
b10 #
b00000110 $
1*
#330
0%
b00000000000000000000000000010001 )
#340
1%
b00000100 I
b00000101 J
b01100000 H
#345
0*
#350
0%
b00000000000000000000000000010010 )
#360
1%
#365
1(
#370
0%
b00000000000000000000000000010011 )
#380
1%
b00000100 0
b01100000 1
b00000101 2
#385
0(
#390
0%
b00000000000000000000000000010100 )
#400
1%
b011000000000010100000100 "
#405
b10 '
b00 #
b00000111 $
1*
#410
0%
b00000000000000000000000000010101 )
#420
1%
b00000111 ,
b000000000000000000000000 "
#425
0*
#430
0%
b00000000000000000000000000010110 )
#440
1%
#445
b01 #
b00001000 $
1*
#450
0%
b00000000000000000000000000010111 )
#460
1%
b00001000 +
#465
0*
#470
0%
b00000000000000000000000000011000 )
#480
1%
#485
b10 #
b00001001 $
1*
#490
0%
b00000000000000000000000000011001 )
#500
1%
b00000111 I
b00001000 J
b10010000 H
#505
0*
#510
0%
b00000000000000000000000000011010 )
#520
1%
#525
1(
#530
0%
b00000000000000000000000000011011 )
#540
1%
b00000111 3
b10010000 4
b00001000 5
#545
0(
#550
0%
b00000000000000000000000000011100 )
#560
1%
b100100000000100000000111 "
#565
b01 &
b00 '
b00 #
b00001010 $
1*
#570
0%
b00000000000000000000000000011101 )
#580
1%
b00001010 ,
b000000000000000000000000 "
#585
0*
#590
0%
b00000000000000000000000000011110 )
#600
1%
#605
b01 #
b00001011 $
1*
#610
0%
b00000000000000000000000000011111 )
#620
1%
b00001011 +
#625
0*
#630
0%
b00000000000000000000000000100000 )
#640
1%
#645
b10 #
b00001100 $
1*
#650
0%
b00000000000000000000000000100001 )
#660
1%
b00001010 I
b00001011 J
b11000000 H
#665
0*
#670
0%
b00000000000000000000000000100010 )
#680
1%
#685
1(
#690
0%
b00000000000000000000000000100011 )
#700
1%
b00001010 6
b11000000 7
b00001011 8
#705
0(
#710
0%
b00000000000000000000000000100100 )
#720
1%
b110000000000101100001010 "
#725
b01 '
b00 #
b00001101 $
1*
#730
0%
b00000000000000000000000000100101 )
#740
1%
b00001101 ,
b000000000000000000000000 "
#745
0*
#750
0%
b00000000000000000000000000100110 )
#760
1%
#765
b01 #
b00001110 $
1*
#770
0%
b00000000000000000000000000100111 )
#780
1%
b00001110 +
#785
0*
#790
0%
b00000000000000000000000000101000 )
#800
1%
#805
b10 #
b00001111 $
1*
#810
0%
b00000000000000000000000000101001 )
#820
1%
b00001101 I
b00001110 J
b11110000 H
#825
0*
#830
0%
b00000000000000000000000000101010 )
#840
1%
#845
1(
#850
0%
b00000000000000000000000000101011 )
#860
1%
b00001101 9
b11110000 :
b00001110 ;
#865
0(
#870
0%
b00000000000000000000000000101100 )
#880
1%
b111100000000111000001101 "
#885
b10 '
b00 #
b00010000 $
1*
#890
0%
b00000000000000000000000000101101 )
#900
1%
b00010000 ,
b000000000000000000000000 "
#905
0*
#910
0%
b00000000000000000000000000101110 )
#920
1%
#925
b01 #
b00010001 $
1*
#930
0%
b00000000000000000000000000101111 )
#940
1%
b00010001 +
#945
0*
#950
0%
b00000000000000000000000000110000 )
#960
1%
#965
b10 #
b00010010 $
1*
#970
0%
b00000000000000000000000000110001 )
#980
1%
b00010000 I
b00010001 J
b00100001 H
#985
0*
#990
0%
b00000000000000000000000000110010 )
#1000
1%
#1005
1(
#1010
0%
b00000000000000000000000000110011 )
#1020
1%
b00010000 <
b00100001 =
b00010001 >
#1025
0(
#1030
0%
b00000000000000000000000000110100 )
#1040
1%
b001000010001000100010000 "
#1045
b10 &
b00 '
b00 #
b00010011 $
1*
#1050
0%
b00000000000000000000000000110101 )
#1060
1%
b00010011 ,
b000000000000000000000000 "
#1065
0*
#1070
0%
b00000000000000000000000000110110 )
#1080
1%
#1085
b01 #
b00010100 $
1*
#1090
0%
b00000000000000000000000000110111 )
#1100
1%
b00010100 +
#1105
0*
#1110
0%
b00000000000000000000000000111000 )
#1120
1%
#1125
b10 #
b00010101 $
1*
#1130
0%
b00000000000000000000000000111001 )
#1140
1%
b00010011 I
b00010100 J
b01010001 H
#1145
0*
#1150
0%
b00000000000000000000000000111010 )
#1160
1%
#1165
1(
#1170
0%
b00000000000000000000000000111011 )
#1180
1%
b00010011 ?
b01010001 @
b00010100 A
#1185
0(
#1190
0%
b00000000000000000000000000111100 )
#1200
1%
b010100010001010000010011 "
#1205
b01 '
b00 #
b00010110 $
1*
#1210
0%
b00000000000000000000000000111101 )
#1220
1%
b00010110 ,
b000000000000000000000000 "
#1225
0*
#1230
0%
b00000000000000000000000000111110 )
#1240
1%
#1245
b01 #
b00010111 $
1*
#1250
0%
b00000000000000000000000000111111 )
#1260
1%
b00010111 +
#1265
0*
#1270
0%
b00000000000000000000000001000000 )
#1280
1%
#1285
b10 #
b00011000 $
1*
#1290
0%
b00000000000000000000000001000001 )
#1300
1%
b00010110 I
b00010111 J
b10000001 H
#1305
0*
#1310
0%
b00000000000000000000000001000010 )
#1320
1%
#1325
1(
#1330
0%
b00000000000000000000000001000011 )
#1340
1%
b00010110 B
b10000001 C
b00010111 D
#1345
0(
#1350
0%
b00000000000000000000000001000100 )
#1360
1%
b100000010001011100010110 "
#1365
b10 '
b00 #
b00011001 $
1*
#1370
0%
b00000000000000000000000001000101 )
#1380
1%
b00011001 ,
b000000000000000000000000 "
#1385
0*
#1390
0%
b00000000000000000000000001000110 )
#1400
1%
#1405
b01 #
b00011010 $
1*
#1410
0%
b00000000000000000000000001000111 )
#1420
1%
b00011010 +
#1425
0*
#1430
0%
b00000000000000000000000001001000 )
#1440
1%
#1445
b10 #
b00011011 $
1*
#1450
0%
b00000000000000000000000001001001 )
#1460
1%
b00011001 I
b00011010 J
b10110001 H
#1465
0*
#1470
0%
b00000000000000000000000001001010 )
#1480
1%
#1485
1(
#1490
0%
b00000000000000000000000001001011 )
#1500
1%
b00011001 E
b10110001 F
b00011010 G
#1505
0(
#1510
0%
b00000000000000000000000001001100 )
#1520
1%
b101100010001101000011001 "
#1525
b00 &
b00 '
#1530
0%
b00000000000000000000000001001101 )
#1540
1%
b001100000000001000000001 "
#1550
0%
b00000000000000000000000001001110 )
#1560
1%
#1570
0%
b00000000000000000000000001001111 )
#1580
1%
#1585
b01 '
#1590
0%
b00000000000000000000000001010000 )
#1600
1%
b011000000000010100000100 "
#1610
0%
b00000000000000000000000001010001 )
#1620
1%
#1630
0%
b00000000000000000000000001010010 )
#1640
1%
#1645
b10 '
#1650
0%
b00000000000000000000000001010011 )
#1660
1%
b100100000000100000000111 "
#1670
0%
b00000000000000000000000001010100 )
#1680
1%
#1690
0%
b00000000000000000000000001010101 )
#1700
1%
#1705
b01 &
b00 '
#1710
0%
b00000000000000000000000001010110 )
#1720
1%
b110000000000101100001010 "
#1730
0%
b00000000000000000000000001010111 )
#1740
1%
#1750
0%
b00000000000000000000000001011000 )
#1760
1%
#1765
b01 '
#1770
0%
b00000000000000000000000001011001 )
#1780
1%
b111100000000111000001101 "
#1790
0%
b00000000000000000000000001011010 )
#1800
1%
#1810
0%
b00000000000000000000000001011011 )
#1820
1%
#1825
b10 '
#1830
0%
b00000000000000000000000001011100 )
#1840
1%
b001000010001000100010000 "
#1850
0%
b00000000000000000000000001011101 )
#1860
1%
#1870
0%
b00000000000000000000000001011110 )
#1880
1%
#1885
b10 &
b00 '
#1890
0%
b00000000000000000000000001011111 )
#1900
1%
b010100010001010000010011 "
#1910
0%
b00000000000000000000000001100000 )
#1920
1%
#1930
0%
b00000000000000000000000001100001 )
#1940
1%
#1945
b01 '
#1950
0%
b00000000000000000000000001100010 )
#1960
1%
b100000010001011100010110 "
#1970
0%
b00000000000000000000000001100011 )
#1980
1%
#1990
0%
b00000000000000000000000001100100 )
#2000
1%
#2005
b10 '
#2010
0%
b00000000000000000000000001100101 )
#2020
1%
b101100010001101000011001 "
#2030
0%
b00000000000000000000000001100110 )
#2040
1%
#2050
0%
b00000000000000000000000001100111 )
#2060
1%
#2065
#2070
0%
b00000000000000000000000001101000 )
#2080
1%
#2090
0%
b00000000000000000000000001101001 )
#2100
1%
#2110
0%
b00000000000000000000000001101010 )
#2120
1%
#2130
0%
b00000000000000000000000001101011 )
#2140
1%
#2150
0%
b00000000000000000000000001101100 )
#2160
1%
#2165
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment