The ISP's router intelligently splits downstream traffic so that IP packets alternately go to the various lines in weighted round-robin fashion. When the three modems pick up the inbound packets there's nothing to be done, they're just put into the firewall in the normal way, and they may end up in TCP inbound queues because of slight out-of-order delivery. When I say 'intelligently' the ISP's router gets line speed change notification messages from BTW so the router knows what the speeds of the lines are as they are rate-limited by the BRAS. The router can therefore deliver more bytes to the faster line, correctly loading each one according to its speed capabilities, the lines don't have to run at the same speed. If a line goes down, then it is taken out of the round-robin, which gives high reliability. The lines are tested every few seconds to make sure traffic is getting delivered, by using PPP LCP pings (not ICMP pings).
A similar arrangement applies to upstream, my Firebrick 2500 router splits outgoing packets and places them in outbound queues going to the three modems again in weighted round-robin fashion. Unfortunately, I have to tell the FB 2500 what the capacities of the various upstream pipes are. This is obtained by querying upstream sync rate of individual modems, and the values obtained are multiplied by a kludge factor to allow for overheads and manually entered into an XML database which holds the FB config. Again, the different lines do not have to have the same upstream speed capabilities, the upstream traffic is split so that the right fractions go to the different lines.
In case you were wondering, the modems don't have IP addresses, but the FB2500 router does (it is seen by the Internet after having merged the inbound packet streams) have one (only) for its WAN side. (And a LAN-facing IP address too.)