It is well known that a functional approach to programming helps thinking in a top-down fashion. Idioms made available by first-class functions (e.g. mapping and folding) help you write down the general ideas first, and worry about the details later. Paul Graham has nice examples of that in On Lisp IIRC.
In fact, it seems that being able to think in a top-down fashion is not specifically tied to functional programming, but perhaps more generally to the level of expressiveness that your language provides.
For example, I find that the very existence of a REPL helps a lot: you can test a function on manually-provided data, that would normally be constructed by a lower-level, yet-to-be-written function. You can pre-define stuff to do nothing but print "I'm here", just to check if the bigger thing works.
In Lisp, with half-defined generic functions, you can even have your program half-working, some details remaining to be sorted out later. So obviously, Lisp being as expressive as it is, is of great help in thinking top-down.
Even in Lisp, however, some things need to be defined before they can be used. So I recently discovered, to my greatest astonishment, that even if my thought process is top-down 99% of the time, my /code/ is *always* written down in a bottom-up fashion. Occasionally, I might have one of those quasi-hysterical crisis in which I would spend hours re-organizing my code until the I get the overall expression of the program as close as possible to the ultimate upside-down pyramid of dependencies. And then, we I need to immerse myself again into something I wrote a long time ago, I usually read my files backwards... or not!
So I was wondering, how's your code organized? How's your thought process organized? Top-down? Bottom-up? Both?