Skip to content

Commit

Permalink
Merge pull request #92 from HSU-ANT/mh/element-equality
Browse files Browse the repository at this point in the history
Implement equality for `Element`
  • Loading branch information
martinholters committed Jan 24, 2023
2 parents 5264b87 + 8f992d1 commit 6fda63a
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 14 deletions.
7 changes: 6 additions & 1 deletion src/ACME.jl
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Copyright 2015, 2016, 2017, 2018, 2019, 2020, 2021 Martin Holters
# Copyright 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2023 Martin Holters
# See accompanying license file.

module ACME
Expand Down Expand Up @@ -97,6 +97,11 @@ struct Element
end
end

Base.:(==)(e1::Element, e2::Element) =
all(f -> (getfield(e1, f) == getfield(e2, f))::Bool, fieldnames(Element))
Base.hash(e::Element, h::UInt) =
foldl((h, f) -> hash(getfield(e, f), h)::UInt, fieldnames(Element); init=h)

for (n,m) in Dict(:nb => :mv, :nx => :mx, :nq => :mq, :nu => :mu)
@eval ($n)(e::Element) = size(e.$m, 2)
end
Expand Down
18 changes: 6 additions & 12 deletions src/circuit.jl
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Copyright 2015, 2016, 2017, 2018, 2019, 2020, 2021 Martin Holters
# Copyright 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2023 Martin Holters
# See accompanying license file.

export Circuit, add!, connect!, disconnect!, @circuit, composite_element
Expand Down Expand Up @@ -53,9 +53,8 @@ function incidence(c::Circuit)
j = sizehint!(Int[], 2nb(c))
v = sizehint!(Int[], 2nb(c))
for (row, pins) in enumerate(c.nets), (elemname, pinname) in pins
elem = c.elements[elemname]
offset = branch_offset(c, elem)
bps = elem.pins[pinname]
offset = branch_offset(c, elemname)
bps = c.elements[elemname].pins[pinname]
for (branch, polarity) in bps
push!(i, row)
push!(j, offset + branch)
Expand Down Expand Up @@ -93,11 +92,6 @@ Adds the element `elem` to the circuit `c`, creating and returning a new, unique
reference designator, leaving its pins unconnected.
"""
function add!(c::Circuit, elem::Element)
for (k, v) in c.elements
if v == elem
return k
end
end
designator = gensym()
add!(c, designator, elem)
return designator
Expand Down Expand Up @@ -135,10 +129,10 @@ function Base.delete!(c::Circuit, designator::Symbol)
delete!(c.elements, designator)
end

function branch_offset(c::Circuit, elem::Element)
function branch_offset(c::Circuit, designator::Symbol)
offset = 0
for el in elements(c)
el == elem && return offset
for (des, el) in c.elements
des === designator && return offset
offset += nb(el)
end
throw(ArgumentError("Element not found in circuit"))
Expand Down
12 changes: 11 additions & 1 deletion test/runtests.jl
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Copyright 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022 Martin Holters
# Copyright 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Martin Holters
# See accompanying license file.

include("checklic.jl")
Expand Down Expand Up @@ -40,6 +40,16 @@ end
@test !ACME.setlhs!(solver, zeros(3,3))
end

@testset "Element equality" begin
@test resistor(1e3) == resistor(1e3)
@test hash(resistor(1e3)) == hash(resistor(1e3))
@test resistor(1e3) != resistor(2.2e3)
@test resistor(1) != voltagesource(1)
@test bjt(:npn) == bjt(:npn)
@test hash(bjt(:npn)) == hash(bjt(:npn))
@test bjt(:npn) != bjt(:pnp)
end

@testset "simple circuits" begin
@testset "empty circuit" begin
circ = @circuit begin end
Expand Down

0 comments on commit 6fda63a

Please sign in to comment.