[util] allow separate "pass" parameters for FIFOs
Signed-off-by: Timothy Chen <timothytim@google.com>
diff --git a/util/tlgen/elaborate.py b/util/tlgen/elaborate.py
index 6b2b935..4edae1b 100644
--- a/util/tlgen/elaborate.py
+++ b/util/tlgen/elaborate.py
@@ -87,9 +87,11 @@
# By default, assume connecting to SOCKET_1N upstream and bypass all FIFOs
# If upstream requires pipelining, it will be added through process pipeline
new_node.hdepth = 0
- new_node.hpass = 2**len(node.us) - 1
+ new_node.hreq_pass = 2**len(node.us) - 1
+ new_node.hrsp_pass = 2**len(node.us) - 1
new_node.ddepth = 0
- new_node.dpass = 1
+ new_node.dreq_pass = 1
+ new_node.drsp_pass = 1
xbar.insert_node(new_node, node)
process_node(new_node, xbar)
@@ -104,9 +106,11 @@
# By default, assume connecting to SOCKET_M1 downstream and bypass all FIFOs
# If upstream requires pipelining, it will be added through process pipeline
new_node.hdepth = 0
- new_node.hpass = 1
+ new_node.hreq_pass = 1
+ new_node.hrsp_pass = 1
new_node.ddepth = 0
- new_node.dpass = 2**len(node.ds) - 1
+ new_node.dreq_pass = 2**len(node.ds) - 1
+ new_node.drsp_pass = 2**len(node.ds) - 1
xbar.insert_node(new_node, node)
# (for loop) Repeat the algorithm with SOCKET_1N's other side node
@@ -130,16 +134,18 @@
log.info("Processing pipeline for host {}".format(host.name))
+ fifo_pass = host.req_fifo_pass or host.rsp_fifo_pass
+
# FIFO present with no passthrough option
# FIFO present with passthrough option
# FIFO not present and full passthrough
full_fifo = False
fifo_passthru = False
full_passthru = True
- if host.pipeline is True and host.pipeline_byp is False:
+ if host.pipeline is True and fifo_pass is False:
full_fifo = True
- elif host.pipeline is True and host.pipeline_byp is True:
+ elif host.pipeline is True and fifo_pass is True:
fifo_passthru = True
elif host.pipeline is False:
@@ -150,39 +156,49 @@
if dnode.node_type == NodeType.ASYNC_FIFO:
continue
+ req_pass = 1 if host.req_fifo_pass else 0
+ rsp_pass = 1 if host.rsp_fifo_pass else 0
if dnode.node_type == NodeType.SOCKET_1N:
if full_fifo:
- dnode.hpass = 0
+ dnode.hreq_pass = 0
+ dnode.hrsp_pass = 0
dnode.hdepth = 2
elif fifo_passthru:
- dnode.hpass = 0
+ dnode.hreq_pass = req_pass
+ dnode.hrsp_pass = rsp_pass
dnode.hdepth = 2
elif full_passthru:
- dnode.hpass = 1
+ dnode.hreq_pass = 1
+ dnode.hrsp_pass = 1
dnode.hdepth = 0
log.info(
- "Finished processing socket1n {}, pass={}, depth={}".format(
- dnode.name, dnode.hpass, dnode.hdepth))
+ "Finished processing socket1n {}, req pass={}, rsp pass={}, depth={}".format(
+ dnode.name, dnode.hreq_pass, dnode.hrsp_pass, dnode.hdepth))
elif dnode.node_type == NodeType.SOCKET_M1:
idx = dnode.us.index(host.ds[0])
+
+ # first clear out entry
+ dnode.hreq_pass = dnode.hreq_pass & ~(1 << idx)
+ dnode.hreq_pass = dnode.hreq_pass & ~(1 << idx)
if full_fifo:
log.info("fifo present no bypass")
- dnode.hpass = dnode.hpass & ~(1 << idx)
dnode.hdepth = dnode.hdepth | (2 << idx * 4)
elif fifo_passthru:
log.info("fifo present with bypass")
- dnode.hpass = dnode.hpass | (1 << idx)
+ dnode.hreq_pass = dnode.hreq_pass | (req_pass << idx)
+ dnode.hreq_pass = dnode.hrsp_pass | (rsp_pass << idx)
dnode.hdepth = dnode.hdepth | (2 << idx * 4)
elif full_passthru:
log.info("fifo not present")
- dnode.hpass = dnode.hpass | (1 << idx)
+ dnode.hreq_pass = dnode.hreq_pass | (1 << idx)
+ dnode.hreq_pass = dnode.hrsp_pass | (1 << idx)
dnode.hdepth = dnode.hdepth & ~(0xF << idx * 4)
log.info(
- "Finished processing socketm1 {}, pass={}, depth={}".format(
- dnode.name, dnode.hpass, dnode.hdepth))
+ "Finished processing socketm1 {}, req pass={}, rsp pass={}, depth={}".format(
+ dnode.name, dnode.hreq_pass, dnode.hrsp_pass, dnode.hdepth))
for device in xbar.devices:
# go upstream and set DReq/RspPass at the first instance.
@@ -198,14 +214,14 @@
# FIFO present with no passthrough option
# FIFO present with passthrough option
# FIFO not present and full passthrough
-
+ fifo_pass = device.req_fifo_pass or device.rsp_fifo_pass
full_fifo = False
fifo_passthru = False
full_passthru = True
- if device.pipeline is True and device.pipeline_byp is False:
+ if device.pipeline is True and fifo_pass is False:
full_fifo = True
- elif device.pipeline is True and device.pipeline_byp is True:
+ elif device.pipeline is True and fifo_pass is True:
fifo_passthru = True
elif device.pipeline is False:
@@ -216,37 +232,46 @@
if unode.node_type == NodeType.ASYNC_FIFO:
continue
+ req_pass = 1 if device.req_fifo_pass else 0
+ rsp_pass = 1 if device.rsp_fifo_pass else 0
if unode.node_type == NodeType.SOCKET_1N:
idx = unode.ds.index(device.us[0])
+ # first clear out entry
+ unode.dreq_pass = unode.dreq_pass & ~(1 << idx)
+ unode.drsp_pass = unode.drsp_pass & ~(1 << idx)
if full_fifo:
- unode.dpass = unode.dpass & ~(1 << idx)
unode.ddepth = unode.ddepth | (2 << idx * 4)
elif fifo_passthru:
- unode.dpass = unode.dpass | (1 << idx)
+ unode.dreq_pass = unode.dreq_pass | (req_pass << idx)
+ unode.drsp_pass = unode.drsp_pass | (rsp_pass << idx)
unode.ddepth = unode.ddepth | (2 << idx * 4)
elif full_passthru:
- unode.dpass = unode.dpass | (1 << idx)
+ unode.dreq_pass = unode.dreq_pass | (1 << idx)
+ unode.drsp_pass = unode.drsp_pass | (1 << idx)
unode.ddepth = unode.ddepth & ~(0xF << idx * 4)
- log.info("Finished processing socket1n {}, pass={:x}, depth={:x}".
- format(unode.name, unode.dpass, unode.ddepth))
+ log.info("Finished processing socket1n {}, req pass={:x}, req pass={:x} depth={:x}".
+ format(unode.name, unode.dreq_pass, unode.drsp_pass, unode.ddepth))
elif unode.node_type == NodeType.SOCKET_M1:
if full_fifo:
log.info("Fifo present with no passthrough")
- unode.dpass = 0
+ unode.dreq_pass = 0
+ unode.drsp_pass = 0
unode.ddepth = 2
elif fifo_passthru:
log.info("Fifo present with passthrough")
- unode.dpass = 0
+ unode.dreq_pass = req_pass
+ unode.drsp_pass = rsp_pass
unode.ddepth = 2
elif full_passthru:
log.info("No Fifo")
- unode.dpass = 1
+ unode.dreq_pass = 1
+ unode.drsp_pass = 1
unode.ddepth = 0
- log.info("Finished processing socketm1 {}, pass={:x}, depth={:x}".
- format(unode.name, unode.dpass, unode.ddepth))
+ log.info("Finished processing socketm1 {}, req pass={:x}, rsp pass={:x}, depth={:x}".
+ format(unode.name, unode.dreq_pass, unode.drsp_pass, unode.ddepth))
return xbar