Skip to content

Commit

Permalink
Merge pull request f4pga#916 from litghost/fix_fragile_change_detectors
Browse files Browse the repository at this point in the history
Fixes fragile doctests that were depending on hash table order.
  • Loading branch information
litghost committed Aug 2, 2019
2 parents 8a41f2e + f10b133 commit 26a84ad
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 44 deletions.
14 changes: 14 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,24 @@ add_conda_package(
PROVIDES yosys
PACKAGE_SPEC "yosys 0.8_1161_g8d943b4c 20190531_112316"
)
add_conda_package(
NAME libusb
NO_EXE
PACKAGE_SPEC "libusb 1.0.20"
)
add_conda_package(
NAME openocd
PROVIDES openocd
)

# Force a specific version of libusb, libusb 1.0.22 is broken.
get_target_property_required(USE_CONDA env USE_CONDA)
if(${USE_CONDA})
get_target_property_required(LIBUSB_TARGET env LIBUSB_TARGET)
get_target_property_required(OPENOCD_TARGET env OPENOCD_TARGET)
add_dependencies(${OPENOCD_TARGET} ${LIBUSB_TARGET})
endif()

add_conda_package(
NAME vtr
PROVIDES vpr genfasm
Expand Down
12 changes: 6 additions & 6 deletions ice40/icestorm.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -50,13 +50,14 @@ function(icestorm_setup)
)

get_target_property_required(PKG-CONFIG env PKG-CONFIG)
get_target_property_required(PKG-CONFIG_TARGET env PKG-CONFIG_TARGET)
get_target_property(PKG-CONFIG_TARGET env PKG-CONFIG_TARGET)
get_target_property(LIBUSB_TARGET env LIBUSB_TARGET)

add_thirdparty_package(
NAME icestorm
PROVIDES iceprog icebox_hlc2asc icebox_vlog icepack icetime icebox
BUILD_INSTALL_COMMAND "make -C ${ICESTORM_SRC} ${ICESTORM_PREFIX} PKG_CONFIG=${PKG-CONFIG} install"
DEPENDS ${LIBFTDI_TARGET} ${PKG-CONFIG_TARGET}
PROVIDES iceprog icebox_hlc2asc icebox_vlog icepack icetime
BUILD_INSTALL_COMMAND "make -C ${ICESTORM_SRC} clean && make -C ${ICESTORM_SRC} ${ICESTORM_PREFIX} PKG_CONFIG=${PKG-CONFIG} install"
DEPENDS ${LIBFTDI_TARGET} ${PKG-CONFIG} ${PKG-CONFIG_TARGET} ${LIBUSB_TARGET}
)

get_target_property_required(ICEBOX_VLOG env ICEBOX_VLOG)
Expand All @@ -69,8 +70,7 @@ function(icestorm_setup)
get_target_property(ICETIME_TARGET env ICETIME_TARGET)
get_target_property(ICEBOX_HLC2ASC_TARGET env ICEBOX_HLC2ASC_TARGET)

get_target_property_required(ICEBOX env ICEBOX)
get_filename_component(ICEBOX_PATH ${ICEBOX} DIRECTORY)
get_filename_component(ICEBOX_PATH ${ICEBOX_VLOG} DIRECTORY)
set(ICEBOX_SHARE ${ICEBOX_PATH}/../share/icebox CACHE PATH "")

set(PYPATH_ARG "PYTHONPATH=\${ICEBOX_PATH}:${PYUTILS_PATH}")
Expand Down
86 changes: 48 additions & 38 deletions utils/lib/rr_graph/graph.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ class PinClassDirection(enum.Enum):
import io
import re

from collections import namedtuple
from collections import namedtuple, OrderedDict
from types import MappingProxyType

import lxml.etree as ET
Expand Down Expand Up @@ -1232,30 +1232,36 @@ def __init__(self, id, type, name, timing=None, sizing=None):
def to_xml(self, parent_node):
sw_node = ET.Element(
"switch",
attrib={
"id": str(self._id),
"name": self._name,
"type": self._type.value,
}
attrib=OrderedDict(
(
("id", str(self._id)),
("name", self._name),
("type", self._type.value),
)
)
)
ET.SubElement(
sw_node,
"timing",
attrib={
"R": str(self._timing.R),
"Cin": str(self._timing.Cin),
"Cout": str(self._timing.Cout),
"Cinternal": "0",
"Tdel": str(self._timing.Tdel),
}
attrib=OrderedDict(
(
("R", str(self._timing.R)),
("Cin", str(self._timing.Cin)),
("Cout", str(self._timing.Cout)),
("Cinternal", "0"),
("Tdel", str(self._timing.Tdel)),
)
)
)
ET.SubElement(
sw_node,
"sizing",
attrib={
"mux_trans_size": str(self._sizing.mux_trans_size),
"buf_size": str(self._sizing.buf_size),
}
attrib=OrderedDict(
(
("mux_trans_size", str(self._sizing.mux_trans_size)),
("buf_size", str(self._sizing.buf_size)),
)
),
)
if parent_node is not None:
parent_node.append(sw_node)
Expand Down Expand Up @@ -1287,8 +1293,8 @@ def from_xml(cls, switch_xml):
Switch(id=0, name='buffer', type=<SwitchType.MUX: 'mux'>, timing=SwitchTiming(R=551.0, Cin=7.70000012e-16, Cout=4.00000001e-15, Tdel=4.00000001e-15), sizing=SwitchSizing(mux_trans_size=2.63073993, buf_size=27.6459007))
>>> print(ET.tostring(sw.to_xml(None), pretty_print=True).decode('utf-8').strip())
<switch id="0" name="buffer" type="mux">
<timing Cin="7.70000012e-16" Cinternal="0" Cout="4.00000001e-15" R="551.0" Tdel="4.00000001e-15"/>
<sizing buf_size="27.6459007" mux_trans_size="2.63073993"/>
<timing R="551.0" Cin="7.70000012e-16" Cout="4.00000001e-15" Cinternal="0" Tdel="4.00000001e-15"/>
<sizing mux_trans_size="2.63073993" buf_size="27.6459007"/>
</switch>
""" # noqa: E501
assert_type(switch_xml, ET._Element)
Expand Down Expand Up @@ -1876,7 +1882,7 @@ def set_metadata(node, key, value, offset=None):
':-('
>>> e1.set_metadata("test", "123")
>>> print(ET.tostring(e1, pretty_print=True).decode().strip())
<edge sink_node="1" src_node="0" switch_id="0" id="4">
<edge src_node="0" sink_node="1" switch_id="0" id="4">
<metadata>
<meta name="test">123</meta>
</metadata>
Expand All @@ -1892,7 +1898,7 @@ def set_metadata(node, key, value, offset=None):
Traceback (most recent call last):
...
ValueError: No metadata not_found on
<edge sink_node="1" src_node="0" switch_id="0" id="4">
<edge src_node="0" sink_node="1" switch_id="0" id="4">
<metadata>
<meta name="test">234</meta>
</metadata>
Expand All @@ -1905,9 +1911,9 @@ def set_metadata(node, key, value, offset=None):
':-('
>>> n1.set_metadata("test", "123")
>>> print(ET.tostring(n1, pretty_print=True).decode().strip())
<node capacity="1" id="0" type="SOURCE">
<loc ptc="0" xhigh="0" xlow="0" yhigh="0" ylow="0"/>
<timing C="0" R="0"/>
<node id="0" type="SOURCE" capacity="1">
<loc xlow="0" ylow="0" xhigh="0" yhigh="0" ptc="0"/>
<timing R="0" C="0"/>
<metadata>
<meta name="test">123</meta>
</metadata>
Expand Down Expand Up @@ -2299,11 +2305,13 @@ def create_node(
ntype = RoutingNodeType[ntype]

# <node>
attrib = {
'id': str(self._next_id(RoutingNode)),
'type': ntype.value,
'capacity': str(capacity),
}
attrib = OrderedDict(
(
('id', str(self._next_id(RoutingNode))),
('type', ntype.value),
('capacity', str(capacity)),
)
)
if ntype.track:
assert direction is not None
attrib['direction'] = direction.value
Expand Down Expand Up @@ -2384,16 +2392,16 @@ def create_edge_with_ids(
Traceback (most recent call last):
...
TypeError: RoutingNodeType.SOURCE -> RoutingNodeType.CHANX not valid, Only SOURCE -> OPIN is valid
0 X000Y000[00].SRC--> b'<node capacity="1" id="0" type="SOURCE"><loc ptc="0" xhigh="0" xlow="0" yhigh="0" ylow="0"/><timing C="0" R="0"/></node>'
0 X000Y000[00].SRC--> b'<node id="0" type="SOURCE" capacity="1"><loc xlow="0" ylow="0" xhigh="0" yhigh="0" ptc="0"/><timing R="0" C="0"/></node>'
->
2 X000Y000<-00->X000Y010 b'<node capacity="1" direction="BI_DIR" id="2" type="CHANX"><loc ptc="0" xhigh="0" xlow="0" yhigh="10" ylow="0"/><timing C="1" R="1"/><segment segment_id="0"/></node>'
2 X000Y000<-00->X000Y010 b'<node id="2" type="CHANX" capacity="1" direction="BI_DIR"><loc xlow="0" ylow="0" xhigh="0" yhigh="10" ptc="0"/><timing R="1" C="1"/><segment segment_id="0"/></node>'
>>> r.create_edge_with_ids(1, 4, sw)
Traceback (most recent call last):
...
TypeError: RoutingNodeType.OPIN -> RoutingNodeType.SINK not valid, Only OPIN -> IPIN, CHANX, CHANY (IE A sink) is valid
1 X000Y000[00].R-PIN> b'<node capacity="1" id="1" type="OPIN"><loc ptc="0" side="RIGHT" xhigh="0" xlow="0" yhigh="0" ylow="0"/><timing C="0" R="0"/></node>'
1 X000Y000[00].R-PIN> b'<node id="1" type="OPIN" capacity="1"><loc xlow="0" ylow="0" xhigh="0" yhigh="0" ptc="0" side="RIGHT"/><timing R="0" C="0"/></node>'
->
4 X000Y010[00].SINK-< b'<node capacity="1" id="4" type="SINK"><loc ptc="0" xhigh="0" xlow="0" yhigh="10" ylow="10"/><timing C="0" R="0"/></node>'
4 X000Y010[00].SINK-< b'<node id="4" type="SINK" capacity="1"><loc xlow="0" ylow="10" xhigh="0" yhigh="10" ptc="0"/><timing R="0" C="0"/></node>'
""" # noqa: E501

id2node = self.id2element[RoutingNode]
Expand Down Expand Up @@ -2470,11 +2478,13 @@ def _create_edge_with_ids(
assert_type(switch, Switch)

edge = RoutingEdge(
attrib={
'src_node': str(src_node_id),
'sink_node': str(sink_node_id),
'switch_id': str(switch.id)
}
attrib=OrderedDict(
(
('src_node',
str(src_node_id)), ('sink_node', str(sink_node_id)),
('switch_id', str(switch.id))
)
)
)

for offset, values in metadata.items():
Expand Down

0 comments on commit 26a84ad

Please sign in to comment.