The-OpenROAD-Project / OpenROAD

OpenROAD's unified application implementing an RTL-to-GDS Flow. Documentation at https://openroad.readthedocs.io/en/latest/
https://theopenroadproject.org/
BSD 3-Clause "New" or "Revised" License
1.53k stars 534 forks source link

Create an IP Checker Utility #4872

Open rovinski opened 6 months ago

rovinski commented 6 months ago

Description

Originally posted by @rovinski in https://github.com/The-OpenROAD-Project/OpenROAD/issues/4871#issuecomment-2026137319

Currently, it is very possible to import an IP block which is poorly designed and will cause downstream issues in OpenROAD, which becomes difficult to root-cause. A checker utility which checks against a list of common problems can go a long way in identifying problems early.

Suggested Solution

List of common problems to check (far from an exhaustive list):

Additional Context

No response

QuantamHD commented 6 months ago

Huge +1 from me.

maliberty commented 6 months ago

Thanks for writing this up. A new comer doesn't have to implement every check in order to contribute. Ticking any box is helpful.

rovinski commented 6 months ago

Indeed, I just wanted to list everything I could think of.

ghost commented 2 months ago

Hi everyone, I am currently working on this subtask: Each signal pin must obey one of the following:

Here is what I have gathered during my research:

Despite the progress, I still have some critical questions that I need your expertise to clarify:

@maliberty, @rovinski, @QuantamHD I appreciate your assistance in this matter. Any recommendations will greatly help me proceed with my task.

maliberty commented 2 months ago

@rovinski in order to talk about access points we would have to run pin_access. This can only happen after macro placement at the earliest. How are you intending for this checker to be used?

Perhaps it would be easier to check if the spacing between pins' centers are integral multiples of the track pitch. Sufficiently wide pins could be allowed to be exceptions.

titan73 commented 2 months ago

+1 We had to develop such a tool. Some checks are listed here and some others are for compatibility with proprietary tools. And importantly, to check coherency between views (pins most of the time) between .lib, .lef, behavioural models, .cdl, ... We have a internal standard for IP package structure but I don't know if there is an open standard for that though.

rovinski commented 1 month ago

Sorry for late reply.

Ideally pin rules could be checked in isolation without having to have the macro placed yet. It would, however, require tracks and NDRs to be created already (NDRs mainly to avoid false positives).

If the macro has to be placed in order to run pin access, maybe is it possible to place it in a virtual block which then gets deleted after pin access runs?

maliberty commented 1 month ago

If you are just checking that the pins could be placed on the track grid then you don't need to use pin access and can just look at the pin spacing and shapes.

rovinski commented 1 month ago

That is one part, yes. But another part would be to check that the pins aren't blocked by obstructions. There could be a separate routine that does that, but it may or may not be easier to run pin acceess.

maliberty commented 1 month ago

Pins are never blocked by obstructions - pin shapes have priority over obstructions. From LEF:

Normally, obstructions block routing, except for when a pin port overlaps an obstruction (a port geometry overrules an obstruction).
rovinski commented 1 month ago

I mean something really dumb like this:

image

Also assuming that metals on top and bottom are blocked.

I've seen this happen in blocks that weren't extracted correctly.