← Back to team overview

kicad-developers team mailing list archive

Re: PNS refactoring

 

Personally I agree with your assessment, and I like the looks of some of what
you're doing, though I only had a chance to give it a quick glance. Perhaps you
could get in touch directly with Tom Włostowski? This is pretty much 'his' code
for the time being.

On Mon, Mar 07, 2016 at 10:59:10PM +1300, Chris Gagneraud wrote:
> Hi there,
> 
> I stumbled across the FOSDEM 2015 presentation recently, and was
> really impressed by the work done on the router. Near the last slides,
> something caught my attention:
>  - Written in C++ / Boost (optional, unordered)
>  - Separate data model.
>  - No UI library dependencies.
>  - Can be integrated into other F/OSS EDA tools
>    without much hassle.
> 
> It all sounded so great to me that I decided to have a roll and see
> how I could use PNS within my own projects.
> 
> To my surprises, dependecies were a bit heavier than expected:
>  - Boost (OK)
>  - Geom/math kernel (OK)
>  - Wx widgets (not too good)
>  - pcbnew/kicad (ouch!)
> 
> I knew there was a dependency on boost, I was not surprised to see a
> dependency on a tailored made math and geometry library, the wxWidget
> dependency didn't surprise me (knowing it is the toolkit used by
> KiCad), what worried me was the dependency on pcbnew itself.
> 
> The problem was quite simple to spot, yet not easy to fix:
>  - PNS_ROUTER is a god object, it knows everything, and everyone
>    relies on it.
>  - PNS_ROUTER is full of Wx and KiCad stuff
>  - The whole PNS core (NODE, INDEX, ITEM, ALGORITHM) depend on
>    PNS_ROUTER
>  - As a consequence the whole PNS core depends on Wx and KiCad.
>  - And anyway, part of PNS core directly depends on KiCad and
>    WxWidgets (like the "God forgive me doing this..." and the
>    diff-pair hacks. ;))
> 
> To fix this, I used a step by step refactoring approach (hence the
> hight amount of commits):
>  - Remove non-real dependencies on Wx and KiCad (unnecesary includes
>    files, unnecessary forward declarations)
>  - Move all KiCad dependend responsabilities from PNS_ALGORITHM,
>    PNS_NODE, PNS_INDEX, PNS_ITEM to PNS_ROUTER, This is about making
>    the core relying solely on the router to handle KiCad specific
>    stuff.
>  - Split PNS' router into a pure interface PNS_ROUTER_INTERFACE and
>    it's KiCad's implementation: PNS_ROUTER.
>  - Stuff PNS_ROUTER_INTERFACE with the strict minimum functions needed
>    to get the PNS core building (Node, Index, Algorithm, ...).
>  - Stuff PNS_ROUTER with everything else (PNS_ROUTER being now
>    unreachable from PNS core).
> 
> At that point the PNS core objects use a pointer to a
> PNS_ROUTER_INTERFACE and doesn't contains (almost) any KiCad
> dependencies (some exceptions were made for stuff I didn't fully
> understand at that time).
> 
> From there, the game could start:
>  - Do refactoring by grouping PNS_ROUTER_INTERFACE functions in
>  logical group, by either creating a new class to handle each group,
>  or modify existing ones. Examples include:
>    - PNS_CLEARANCE_RESOLVER (nee PNS_CLEARANCE_FUNC)
>    - PNS_NET_RESOLVER (Deal only with paired nets for now)
>    - PNS_DEBUG_DECORATOR (used solely by placers)
>  - Make ALGORITHM objects relies on world instead of router. The
>    router is still there, but now it actively assign the solvers to
>    the world NODE, and the algorithm access these solvers through the
>    world instead of through the router. Same story goes with SETTINGS.
>  - Commit, hack, rebase, hack, amend, hack, repeat forever until
>    brain's cooked up.
>  - Once the PNS_ROUTER_INTERFACE is empty, removes any reference to it
>    from PNS core.
> 
> At that point PNS_ROUTER looks more like a controller than a god
> object, and no PNS core objects depends on it. Cherry on the cake, all
> KiCad dependencies are gone, and only wxString, translation macro
> (underscore-brackets) and wxTimer.
> 
> And that's where I stopped, I think I've already made big enough
> modifications before i can keep going. I need to discuss this further
> with you guys, to see if you are interested in this kind of work, to
> organise a code review, get a feeling, ...
> 
> You can see that as an Hackaton session, I did all this in 4 days
> (part time, sorry!).
> 
> I broke a few things in the process, but I do think that they should
> be easy to fix (especially through code review, as my commits are
> organised in logical chunks).
> 
> I think the PNS router is an awesome framework, I like it's approach:
>  - Spatial indexing of the PCB features (with layer and joint
>    awareness)
>  - Clever branch/merge of indexes.
>  - Algorithm to handle PCB modifications
>  - Separate data model
>  - No UI dependencies
> 
> But my feeling is there's still need for refactoring. For example:
> 
> On the inner side:
>  - Completely get rid of wxDeps (string, translation and timers)
>  - Make ALGO straight forward to use: setWorld(), configure(),
> execute(), getResult()
>  - Properly fix coupling of KiCad/PNS via and layer(set). (my solution
>    look more like a gross hack for now).
>  - Remove PLACER dependency from items (why pns_meander.cpp needs
>    pns_meander_placer_base.h?)
>  - Remove NODE dependency from some items (line, meander, via)
>  - Remove NODE dependency from SETTINGS
>  - Remove NODE dependency from OPTIMISER and TOPOLOGY (I think it's
>    doable by making them rely on a PNS_INDEX interface, provided by
>    NODE with a proxy/facade design pattern.)
>  - Only router and algorithm should have access to NODE
>  - ITEM, TOPOLOGY and OPTIMISER should relies only on INDEX (INDEX is
>    the spacial specialist, NODE is the branch/merge specialist)
> 
> On the outer side:
>  - Split the remaining code of the PNS_ROUTER into an implementation
>    independent controller (the real PNS routing public interface) and
>    it's KiCad implementation/usage.
> 
> 
> 
> 
> That's it! I hope you will welcome my ideas, and I'm looking forward
> to hear your feedback (positive or negative). I am definitely willing
> to re-work my patches until it is acceptable to the PNS maintainers.
> 
> I have 26 commits, they are available on GitHub at
> https://github.com/chgans/kicad/.
> 
> What would be the next step to get this RFC going on?
> For convenience, I could open a pull request against GitHuib official
> mirror. I know you guys use bazar, but at this point I just want my
> hacks^W work to be commented on, a GitHub pull request could allow
> that. Or I could send all the patch on the mailing list as they do
> with other open source projects, I don't mind that either.
> 
> Best regards,
> Chris
> 
> _______________________________________________
> Mailing list: https://launchpad.net/~kicad-developers
> Post to     : kicad-developers@xxxxxxxxxxxxxxxxxxx
> Unsubscribe : https://launchpad.net/~kicad-developers
> More help   : https://help.launchpad.net/ListHelp

-- 
Chris


Follow ups

References