Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
P
panloader
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
1
Issues
1
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Incidents
Environments
Packages & Registries
Packages & Registries
Container Registry
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Panfrost
panloader
Commits
46303864
Commit
46303864
authored
Jul 05, 2018
by
Lyude Paul
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
wip: almost working full clause encoding
parent
28b33fa0
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
69 additions
and
17 deletions
+69
-17
tools/bifrost-assemble.py
tools/bifrost-assemble.py
+69
-17
No files found.
tools/bifrost-assemble.py
View file @
46303864
...
...
@@ -956,18 +956,19 @@ class ImmediateSlot:
return
ConstantSrc
(
token
.
read_type
==
ImmediateToken
.
ReadType
.
HIGH64
)
def
encode_contents
(
self
):
return
sum
(
Bits
(
length
=
t
.
bitlen
,
uint
=
t
.
value
)
for
t
in
self
.
contents
)
return
sum
(
Bits
(
length
=
t
.
bitlen
,
uint
=
t
.
value
)
for
t
in
reversed
(
self
.
contents
))
def
encode_const_field
(
self
):
return
bitstring
.
pack
(
'uint:1=0, uint:3, bits:4'
,
self
.
IDX_MAP
[
self
.
idx
],
self
.
encode_contents
()[
60
:
64
])
encoded
=
BitArray
(
8
)
encoded
[
1
:
4
]
=
self
.
IDX_MAP
[
self
.
idx
]
encoded
[
4
:
8
]
=
self
.
encode_contents
()[
60
:
64
]
return
encoded
def
__repr__
(
self
):
return
"<ImmediateSlot #%d at 0x%x; contents=%s>"
%
(
self
.
idx
,
id
(
self
),
self
.
contents
)
class
Uniform
:
def
__init__
(
self
,
idx
):
self
.
idx
=
idx
...
...
@@ -1110,6 +1111,24 @@ class Clause:
MAX_CONSTS_ALLOWED
=
5
# FIXME: maybe make this 6 later?
QUADWORD_FORMATS
=
{
# (instructions, constants): pos
(
1
,
0
):
0x0
,
(
2
,
0
):
0x1
,
(
4
,
0
):
0x2
,
(
3
,
1
):
0x3
,
(
5
,
1
):
0x4
,
(
4
,
2
):
0x5
,
(
7
,
0
):
0x6
,
(
6
,
1
):
0x7
,
(
5
,
3
):
0x8
,
(
8
,
1
):
0x9
,
(
7
,
2
):
0xa
,
(
6
,
3
):
0xb
,
(
8
,
3
):
0xc
,
(
7
,
4
):
0xd
}
def
_header_flag
(
func
):
old_func
=
func
def
func
(
self
,
value
):
...
...
@@ -1426,6 +1445,11 @@ class Clause:
# immediate zero slot.
if
inst
.
has_pending_immediates
():
pending
=
inst
.
reg_file
.
const_port
# FIXME: it looks like the compiler makes some interesting
# decisions regarding where it puts dummy clauses, for some
# reason consts 8/9 are swapped with consts 10/11 when the
# last instruction is the one reusing the same constant twice
# (and thus only requiring that half the slot be filled)
if
all
(
t
.
value
==
0
for
t
in
pending
):
inst
.
resolve_immediates
(
self
,
ImmediateZeroSlot
)
elif
pending
.
bitlen
==
64
:
...
...
@@ -1451,6 +1475,7 @@ class Clause:
first_inst
.
reg_file
.
add_reg_write
(
write
.
idx
,
stage
)
del
self
.
__pending_writes
# Resolve any pending state in our instructions
for
inst
in
self
.
instructions
:
inst
.
reg_file
.
assign_reg_ports
()
...
...
@@ -1468,10 +1493,8 @@ class Clause:
inst
.
resolve_immediates
(
self
,
slot
)
self
.
immediate_slots
.
append
(
slot
)
# TODO: Make sure we return whether or not the last format we used
# contained an inline immediate
@
staticmethod
def
_next_immediate_to_encode
(
cls
,
immediates
):
def
_next_immediate_to_encode
(
immediates
):
if
immediates
:
return
immediates
.
pop
(
0
)
else
:
...
...
@@ -1524,7 +1547,6 @@ class Clause:
# Format 3
quadword
=
BitArray
(
128
)
i3
=
instructions
.
pop
(
0
)
if
instructions
else
None
used_fmt_3_2
=
False
if
not
i3
:
# Format 3.1
...
...
@@ -1538,9 +1560,8 @@ class Clause:
quadword
[
15
:
45
]
=
i2
[
3
:
33
]
quadword
[
60
:
120
]
=
next_immediate
[
0
:
60
]
quadword
[
120
:
128
]
=
tag
elif
instructions
:
elif
len
(
instructions
)
==
1
:
# Format 3.2
used_fmt_3_2
=
True
next_immediate
=
self
.
_next_immediate_to_encode
(
immediates
)
tag
=
0b10
...
...
@@ -1552,7 +1573,9 @@ class Clause:
quadword
[
125
:
128
]
=
i2
[
0
:
3
]
else
:
# Format 3.3
if
immediates
:
if
instructions
:
tag
=
0b00000001
elif
immediates
:
tag
=
0b00000101
else
:
tag
=
0b01000101
...
...
@@ -1565,14 +1588,14 @@ class Clause:
encoded
.
append
(
quadword
)
if
not
instructions
:
return
encoded
,
packed_immediate
return
encoded
# Format 4
quadword
=
BitArray
(
128
)
i4
=
instructions
.
pop
(
0
)
i5
=
instructions
.
pop
(
0
)
if
instructions
else
None
if
used_fmt_3_2
:
if
not
i5
:
# Format 4.1
if
immediates
:
tag
=
0b00010
...
...
@@ -1657,11 +1680,40 @@ class Clause:
return
encoded
def
encode
(
self
):
encoded
=
BitString
()
immediates
=
[
s
.
encode_contents
()
for
s
in
self
.
immediate_slots
]
# TODO: FINISH IT.
return
self
.
_encode_quadwords
(
immediates
)
encoded
=
BitStream
()
instructions
=
self
.
_encode_quadwords
(
immediates
)
encoded
.
append
(
instructions
)
# We may have managed to pack one of the constants into the previous
# quadword
if
len
(
immediates
)
<
len
(
self
.
immediate_slots
):
immediate_count
=
1
else
:
immediate_count
=
0
instruction_count
=
len
(
self
.
instructions
)
while
immediates
:
quadword
=
BitArray
(
128
)
if
len
(
immediates
)
>
2
:
# More constants follow
tag
=
0b0011
else
:
tag
=
0b0111
quadword
[
60
:
120
]
=
immediates
.
pop
(
0
)[
0
:
60
]
if
immediates
:
quadword
[
0
:
60
]
=
immediates
.
pop
(
0
)[
0
:
60
]
quadword
[
120
:
124
]
=
tag
quadword
[
124
:
128
]
=
self
.
QUADWORD_FORMATS
[
instruction_count
,
immediate_count
]
encoded
.
append
(
quadword
)
immediate_count
+=
2
return
encoded
def
dump
(
self
):
print
(
'Clause #%d'
%
self
.
idx
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment