I'm interested in using call graphs/control flow in a hierarchical way to understand programs better. The problem is there seems to be two extremes - high level diagrams done manually and low level call graphs generated by tools. A manual drawing with boxes and arrows is often used when describing a program at the highest level. While it works, one question is how to move to the next level of detail? Someone has to do that manually as well. These diagrams aren't connected to the source and can get out of date. The structure is going to change slowly at the highest level and so keeping up-to-date manually isn't that much trouble. More detailed levels, though, can change more frequently and keeping them up-to-date is more work. At the other extreme, tools to generate callgraphs give all the functions. They can filter by time, number of calls or call stack depth, but those doesn't necessarily correlate to what's important conceptually. I'm wondering if there's any work on anything between these two extremes? Both in generating it and visualizing it. (Searching online for 'hierarchical call graph' gives research on automated and machine learning approaches to discovering a hierarchy - interesting as research, but not what I'm after here. I would prefer something manual like adding program annotations or creating filtering terms - something that can be automated as part of a build or CI process.)